EDUSOHO踩坑笔记之六:edusoho架构及模块分析
EDUSOHO踩坑笔记之六:edusoho架构及模块分析
从目录结构、入口文件、配置、控制器、服务层、模型、模块组成等几个角度,进行架构的描述。本文档是以8.0的版本为基准的说明,与其他版本会有些区别。
一、目录结构
入口:{$HOME}\web
控制器:{$HOME}\src\AppBundle\Controller\模块名Controller.php
模型:{$HOME}\src\Biz\Controller\模块名\Dao\Impl\表面DaoImpl.php
视图:{$HOME}\app\Resources\views\视图文件夹路径\名称.html.twig
路由文件:{$HOME}\api\config\routing.php
二、入口文件
{$HOME}\web\app.php
$kernel = new AppKernel('prod', false);
$kernel->loadClassCache();
$request = Request::createFromGlobals();
$kernel->setRequest($request);
$response = $kernel->handle($request);
$response->send();
$kernel->terminate($request, $response);
三、配置
//路由
{$HOME}\src\AppBundle\Resources\config\routing.yml
{$HOME}\src\AppBundle\Resources\config\routing_admin.yml
homepage:path: /defaults: { _controller: AppBundle:Default:index }
...
order_calculate_price:path: /order/price/calculatedefaults: { _controller: AppBundle:Order/Order:price, limit: '' }
admin_discovery_column_category_tree:path: /discovery_column/category/treedefaults: { _controller: AppBundle:Admin/DiscoveryColumn:categoryTree }
四、控制器
{HOME}\src\AppBundle
以 http://edu.test/user/4 为例:
$app->get(_u('/user/{id}'), 'res.User:get');
{$HOME}\src\AppBundle\Controller\UserController.php
protected function tryGetUser($id)
{$user = $this->getUserService()->getUser($id);if (empty($user)) {throw $this->createNotFoundException();}return $user;
}
五、服务层
以 http://edu.test/user/4/about 为例:
{HOME}\src\Biz\User\Service\UserService.php
{$HOME}\src\AppBundle\Controller\UserController.php
public function aboutAction(Request $request, $id)
{$user = $this->tryGetUser($id);return $this->_aboutAction($user);
}protected function _aboutAction($user)
{$userProfile = $this->getUserService()->getUserProfile($user['id']);//不存在 getUserProfile() 方法时,则调用 get 方法,表为 user_profilereturn $this->render('user/about.html.twig', array('user' => $user,'userProfile' => $userProfile,'type' => 'about',));
}
{$HOME}\src\Biz\User\Service\Impl\UserServiceImpl.php
<?phpnamespace Biz\User\Service\Impl;use Biz\BaseService;
use Biz\User\Dao\UserDao;
...class UserServiceImpl extends BaseService implements UserService{public function getUser($id, $lock = false){$user = $this->getUserDao()->get($id, array('lock' => $lock));return !$user ? null : UserSerialize::unserialize($user);}...public function getUserProfile($id){return $this->getProfileDao()->get($id);}
}
{$HOME}\vendor\codeages\biz-framework\src\Dao\DaoProxy.php
<?phpnamespace Codeages\Biz\Framework\Dao;use Codeages\Biz\Framework\Dao\Annotation\MetadataReader;class DaoProxy
{/*** 代理 get 开头的方法调用** @param string $method 被调用的 Dao 方法名* @param array $arguments 调用参数* @return array|null*/protected function get($method, $arguments){$lastArgument = end($arguments);reset($arguments);// lock模式下,因为需要借助mysql的锁,不走cacheif (is_array($lastArgument) && isset($lastArgument['lock']) && true === $lastArgument['lock']) {$row = $this->callRealDao($method, $arguments);$this->unserialize($row);return $row;}if ($this->arrayStorage) {$key = $this->getCacheKey($this->dao, $method, $arguments);if (!empty($this->arrayStorage[$key])) {return $this->arrayStorage[$key];}}$strategy = $this->buildCacheStrategy();if ($strategy) {$cache = $strategy->beforeQuery($this->dao, $method, $arguments);// 命中 cache, 直接返回 cache 数据if (false !== $cache) {return $cache;}}$row = $this->callRealDao($method, $arguments);$this->unserialize($row);// 将结果缓存至 ArrayStorage$this->arrayStorage && ($this->arrayStorage[$this->getCacheKey($this->dao, $method, $arguments)] = $row);if ($strategy) {$strategy->afterQuery($this->dao, $method, $arguments, $row);}return $row;}
}
六、模型
{$HOME}\src\Biz\User\Dao\Impl\UserDaoImpl.php
<?phpnamespace Biz\User\Dao\Impl;use Biz\User\Dao\UserDao;
use Codeages\Biz\Framework\Dao\AdvancedDaoImpl;class UserDaoImpl extends AdvancedDaoImpl implements UserDao{protected $table = 'user';...
}
{$HOME}\vendor\codeages\biz-framework\src\Dao\GeneralDaoImpl.php
<?phpnamespace Codeages\Biz\Framework\Dao;use Codeages\Biz\Framework\Context\Biz;abstract class GeneralDaoImpl implements GeneralDaoInterface{...public function get($id, array $options = array()){$lock = isset($options['lock']) && true === $options['lock'];$sql = "SELECT * FROM {$this->table()} WHERE id = ?".($lock ? ' FOR UPDATE' : '');return $this->db()->fetchAssoc($sql, array($id)) ?: null;}...
}
七、模块分析
教师端
在教课程 /my/teaching/course_sets
教学课表 /my/teaching/live/calendar
在教班级 /my/teaching/classrooms
学员问题 /my/teaching/threads/question
学员话题 /my/teaching/threads/discussion
试卷批阅 /my/testpaper/check
作业批阅 /my/homework/check
教学资料库 /material/lib/browse
学生端
我的课程 /my/courses/learning
我的班级 /my/classrooms
我的问答 /my/questions
我的话题 /my/discussions
我的笔记 /my/notebooks
我的作业 /my/homework/finished/list
我的考试 /my/testpaper/list
我的小组 /my/group
管理员
用户 /admin/user
课程 /admin/course_set/normal/index
运营 /admin/article
交易 /admin/order/manage
教育云 /admin/setting/my/cloud/overview
微营销 /admin/login/marketing
分销 /admin/login/distributor
移动端 /admin/wechat_app
系统 /admin/setting/site
EDUSOHO踩坑笔记之六:edusoho架构及模块分析相关推荐
- EDUSOHO踩坑笔记之五:edusoho的后台目录结构
EDUSOHO踩坑笔记之五:edusoho的后台目录结构 EDUSOHO从架构上讲把前后台整合在一起,做到了代码的最大限度的复用,这从体系架构设计上来说,没有瑕疵可以挑剔.但从安全管理上来说,这就是仁 ...
- EDUSOHO踩坑笔记之四十二:资讯
EDUSOHO踩坑笔记之四十二:资讯 获取资讯列表信息 GET /articles/{id} 权限 老API,需要认证 参数 字段 是否必填 描述 sort string 否 排序,'created' ...
- EDUSOHO踩坑笔记之三十三:班级
EDUSOHO踩坑笔记之三十三:班级 班级 班级 获取班级信息 获取班级列表 班级成员 获取班级计划 加入班级 营销平台加入班级 班级 班级 获取班级信息 GET /classrooms/{class ...
- iphone se 一代 不完美越狱 14.6 视频壁纸教程(踩坑笔记)
iphone se 一代 不完美越狱 14.6 加 视频壁纸教程-踩坑笔记 越狱流程 1.爱思助手制作启动u盘 坑点: 2.越狱好后 视频壁纸软件 1.源 2.软件安装 越狱流程 1.爱思助手制作启动 ...
- Linux内核踩坑笔记
systemtap embedded C踩坑笔记戳这: https://blog.csdn.net/qq_41961459/article/details/103093912 task_struct的 ...
- 阿里云部署Tiny Tiny RSS踩坑笔记
阿里云部署Tiny Tiny RSS踩坑笔记 前言 入坑了RSS,之前的配置是阿里云部署RSSHub,配合Inoreader进行文章阅读,详情见RSS入坑指南.阿里云部署RSSHub踩坑笔记.在202 ...
- 「Java」基于Mirai的qq机器人开发踩坑笔记(其一)
目录 0. 前置操作 I. 安装MCL II. MCL自动登录配置 III. 安装IDEA插件 1. 新建Mirai项目 2. 编写主类 3. 添加外部依赖 4. IDEA运行 5. 插件打包 6. ...
- 「Java」基于Mirai的qq机器人开发踩坑笔记(其二)
目录 0. 配置机器人 1. onLoad方法 2. onEnable方法 3. 消息属性 4. 消息监听 I. 好友消息 II. 群聊消息 III. 无差别消息 5. 发送消息 I. 文本消息 II ...
- 昆仑通态触摸屏1003故障码,踩坑笔记
昆仑通态触摸屏1003故障码,踩坑笔记 第一次使用这个昆仑通态触摸屏,使用modbusRTU与金田变频器做通讯. 触摸屏在线后报1003通讯错误代码,现象是控制指令正常,但是读取不正常.读取变频器状态 ...
最新文章
- python第二十九课——文件读写(复制文件)
- 我的问道游戏主题皮肤
- Hacker News 12 月招聘趋势:React 已霸榜 19 个月
- Python技术分享:教你如何爆破隔壁WiFi密码
- mysql 免安装初始化_mysql免安装版配置步骤详解分享
- Spark精华问答 | 为什么要学Spark?
- 引用 java的一些基本概念
- mac上配置java jdk环境
- 计算机二级vfp程序语言,2012年计算机二级VFP语言基础学习教程
- cryptojs vue 使用_vue 中引入cryptoJS
- Ps图片文字处理与python多张图片合成
- confluence 无法保存页面 排错记录
- Vue中:error ‘XXXXX‘ is not defined no-undef解决办法
- 计算机应用说课稿,中职计算机说课稿
- 常见的SQL注入类型
- 手把手教你TSYS建站
- 无法找到模块“vue-awesome-swiper/dist/ssr”的声明文件
- 安卓java.lang.IllegalStateException: The specified child already has a parent.解决方案
- 关于B2C电子商务顾客忠诚度影响因素的问卷调查
- 多组差异分析的可视化,这样做最省心!
热门文章
- RGB通道和YCBCR通道相互转换——MATLAB实现
- 五、IPSec开源项目strongSwan
- 第二节 图搜索与问题求解1
- 毫米波安检“上位”,人类的安全防护又多了一种可能
- 【Vscode】预览md文件
- 长得类似铁甲小宝的机器人_这是一部专属于90后的动画片,铁甲小宝里的12个机器人你还记得?...
- flot中文说明文档 简版
- 单基因gsea_单基因TCGA联合GEO干湿结合在胃癌中再发4分+
- Python如何在main中调用函数内的函数
- poj2411Mondriaan's Dream题解