💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
# 日志管理 ## 功能需求 | 功能 | 说明 | | ---------- | ------------------------------------------------------------ | | 管理员日志 | 记录管理员在管控系统操作的日志,**超级管理员可查看所有日志**,分组管理员**只能查看所在分组和下级分组的日志** | | 筛选查看 | 1、操作模块:按操作模块筛选。超级管理员列出所有可管理的模块,分组管理员只列出被赋予权限的模块查询日期:点击;2、查询日期弹出日期弹窗如下,自选日期默认是7天内(同课堂管理系统的日期查询);3、搜索:可按操作者、账号、ip地址搜索,点击输入框右侧的放大镜图标或Enter键,列出搜索目标 | | 日志列表 | 1、默认列出最近7天的日志,由时间近及远向下排列;2、操作者:登录管控系统执行该操作的管理员名称;3、账号:登录管控系统执行该操作的管理员账号;4、ip地址:执行该操作的ip地址;5、操作模块:该操作属于哪个模块;6、操作:详情请看下方;7、操作时间:执行该操作时的时间; | ## 模块操作 <table width="100%"> <tr> <th width="15%">模块</th> <th width="85%">操作</th> </tr> <tr> <th>登录</th> <td>1、登录XXX成功(XXX=管理员账号,如登录superadmin)-账号密码正确;<br>2、登录XXX失败(XXX=管理员账号,如登录superadmin)-密码错误</td> </tr> <tr> <th>用户管理</th> <td> <h3>用户管理</h3> <ul> <li>~~新建用户XXX(XXX=用户账号,如新建用户clxx1)~~</li> <li>修改用户XXX名称为YYY(XXX=用户账号,YYY=修改后的名称,如修改用户clxx1名称为昌乐小学2)</li> <li>重置用户XXX密码(XXX=用户账号,如重置用户clxx1密码)</li> <li>删除用户XXX(XXX=用户账号,如删除用户clxx1)</li> <li>用户XXX从A迁移至B(XXX=用户账号,A=原分组,B=目标分组,如用户clxx1从天河区项目迁移至昌乐小学)</li> </ul> <h3>修改分组</h3> <ul> <li>修改分组名称为XXX(XXX=修改后的名称,如修改分组名称为天河区项目组)</li> </ul> <h3>创建下级分组</h3> <ul> <li>~~创建分组XXX(XXX=分组名称,如创建分组天河区项目组)~~</li> </ul> <h3>应用策略</h3> <ul> <li>XXX分组添加YYY(XXX=分组名称,YYY=应用名称,如昌乐小学分组添加天河粤教云)</li> <li>XXX分组移除用YYY(XXX=分组名称,YYY=应用名称,如昌乐小学分组移除天河粤教云)</li> <li>编辑XXX为YYY(XXX=应用名称,YYY=应用可见性和强制性,如编辑天河粤教云为管控内外可见、必装..)</li> </ul> <h3>网络策略</h3> <ul> <li>~~XXX分组添加白名单YYY(XXX=分组名称,YYY=网址,如昌乐小学添加白名单yuanfudao.com)~~</li> <li>XXX分组移除白名单YYY(XXX=分组名称,YYY=网址,如昌乐小学移除白名单yuanfudao.com)</li> </ul> <h3>设备策略</h3> <ul> <li>修改XXX分组的可用时间段(XXX=分组名称,如修改昌乐小学分组的可用时间段)</li> <li>设置XXX分组YYY定时关机(XXX=分组名称,YYY=时间,如设置昌乐小学分组22:00定时关机)</li> <li>设置XXX分组YYY蓝牙/SD卡/移动数据/通话功能/短信功能(XXX=分组名称,YYY=开启or关闭,如设置昌乐小学分组开启蓝牙)</li> </ul> </td> </tr> <tr> <th>权限管理</th> <td> <ul> <li>~~新建管理员XXX(XXX=管理员账号,如新建用户GZadmin)~~</li> <li>修改管理员XXX名称为YYY(XXX=管理员账号,YYY=修改后的名称,如 修改管理员GZadmin名称为广州项目管理员)</li> <li>重置管理员XXX密码(XXX=用户账号,如 重置管理员GZadmin密码)</li> <li>删除管理员XXX(XXX=用户账号,如 删除管理员GZadmin)</li> <li>去掉/增加管理员XXX的YYY权限(XXX=管理员账号,YYY=权限设置里的权限,如增加管理员GZadmin的违规处理权限)</li> </ul> </td> </tr> <tr> <th>应用管理</th> <td> <ul> <li>删除XXX(XXX=应用名称,如 删除猿题库)</li> <li>~~添加应用分类XXX(XXX=应用分类名称,如 添加应用分类浏览器)~~</li> <li>编辑、删除应用分类同上</li> </ul> </td> </tr> <tr> <th>设备管理</th> <td> <ul> <li>操作XXX关机(XXX=设备号,操作WM00000986关机)</li> 重启、退出管控、登录管控、恢复出厂设置同上 <li>操作XXX蓝牙YY(XXX=设备号,YY=动作;操作WM00000986蓝牙开启、操作WM00000986蓝牙关闭、操作WM00000986蓝牙随设备策略)</li> SD卡、移动数据、通话功能、短信功能、USB传输模式、USB传输模式同上 </ul> </td> </tr> <tr> <th>网址白名单</th> <td> <ul> <li>添加网址白名单XXX(XXX=白名单名称,添加网址白名单未名课堂)</li> <li>编辑、删除网址白名单 同上</li> </ul> </td> </tr> <tr> <th>系统管理</th> <td> <ul> <li>修改管控系统登录密码</li> </ul> </td> </tr> <tr> <th>违规管理</th> <td> <ul> <li>把违规设备(设备号)(违规处理),如 把违规设备WM00000986恢复出厂设置</li> </ul> </td> </tr> </table> ## 代码分析 ### 模块常量定义 ``` /** 管理员操作日志模块 */ const ADMIN_OP_USER_MODULE = 1; // 用户管理模块 const ADMIN_OP_AUTH_MODULE = 2; // 权限管理模块 const ADMIN_OP_APP_MODULE = 3; // 应用管理模块 const ADMIN_OP_DEVICE_MODULE = 4; // 设备管理模块 const ADMIN_OP_WHITELIST_MODULE = 5;// 白名单管理模块 const ADMIN_OP_SYS_MODULE = 6; // 系统管理模块 const ADMIN_OP_BAN_MODULE = 7; // 违规管理模块 const ADMIN_OP_LOGIN_MODULE = 8; // 登录模块 ``` ### 服务类 D:\wamp\www\safe.xo\safemanage\protected\service\MongoLogService.php ``` <?php class MongoLogService extends AbstractService { public static function factory($className = __CLASS__) { return parent::factory($className); } public function save($collection, $args) { /** @var EMongoClient $mongodb */ $mongodb = Yii::app()->mongodb; $contentRecord = $mongodb->selectCollection($collection); return $contentRecord->insert($args); } // Mongo 保存日志 public function saveOperatorLog($module, $content) { // 操作者,账号,IP地址,操作模块,操作,操作时间 $this->save(WK::ADMIN_OP_LOG, array( 'module' => (int)$module, 'content' => $content, 'operatorID' => (int)Yii::app()->admin->id, 'operatorLogin' => Yii::app()->admin->fdLogin, 'operatorName' => Yii::app()->admin->fdName, 'ip' => BrowserUtils::getClientIP(), 'date' => new MongoDate(time()), 'groupID' => (int)Yii::app()->admin->fdAccountGroupID, 'groupLevel' => $this->_getGroupLevelArr(Yii::app()->admin->fdAccountGroupID) )); } protected function _getGroupLevelArr($groupID) { $data = array(); $groups = AccountService::factory()->getAllGroupAncestors($groupID, true); foreach ($groups as $group) { $temp = array(); $temp['id'] = (int)$group['id']; $temp['lvl'] = (int)$group['level']; $temp['pid'] = (int)$group['parentID']; $data[] = $temp; } return $data; } // 获取管理员日志 public function getOperatorLogs($args) { $criteria = array(); if (is_numeric($args['module'])) { $criteria['module'] = (int)$args['module']; } if ($args['begin'] && $args['end']) { $criteria['date'] = array( '$gte' => new MongoDate($args['begin'] / 1000 + 8 * 60 * 60), '$lte' => new MongoDate($args['end'] / 1000 + 8 * 60 * 60), ); } if ($args['operatorID']) { $criteria['operatorID'] = (int)$args['operatorID']; } if ($args['keyword']) { $regex = new MongoRegex("/" . $args['keyword'] . "/"); $criteria['$or'] = array( array('ip' => $regex), array('operatorName' => $regex), array('operatorLogin' => $regex), ); } $obj = WAdminOpLog::model()->find($criteria); if (is_numeric($args['offset'])) { $obj->skip((int)$args['offset']); } if (is_numeric($args['limit'])) { $obj->limit((int)$args['limit']); } $obj->sort(array('_id' => -1)); return $obj; } <!-- 设备事件日志 --> public function saveDeviceLog($number, $content) { // 设备号,账号,所属分组,操作详情,操作时间 $this->save('w_device_event_log', array( 'number' => $number, 'content' => $content, 'account' => '', 'group' => '', 'groupID' => 1, 'date' => new MongoDate(time()) )); } <!-- 应用使用日志 --> public function saveAppLog() { // 应用名称,设备号,账号,所属分组,启动时间,使用时长 ... } } ```