first commot

This commit is contained in:
2026-01-26 09:29:36 +08:00
commit dbb40c38c4
189 changed files with 20198 additions and 0 deletions
+10
View File
@@ -0,0 +1,10 @@
use app\service\JwtService;
// 生成 Token
$token = JwtService::generateToken($userInfo);
// 验证 Token
$result = JwtService::verifyToken($token);
// 从 Header 获取用户
$user = JwtService::getUserFromHeader($authHeader);
+338
View File
@@ -0,0 +1,338 @@
# 操作日志使用说明
## 1. 数据库表创建
执行以下 SQL 创建操作日志表:
```sql
-- 操作日志表
CREATE TABLE IF NOT EXISTS `mete_operation_log` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`user_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '用户ID',
`user_account` varchar(50) NOT NULL DEFAULT '' COMMENT '用户账号',
`user_name` varchar(50) NOT NULL DEFAULT '' COMMENT '用户姓名',
`module` varchar(50) NOT NULL DEFAULT '' COMMENT '操作模块(如:用户管理、文件管理等)',
`action` varchar(50) NOT NULL DEFAULT '' COMMENT '操作动作(如:添加、编辑、删除、查询等)',
`method` varchar(10) NOT NULL DEFAULT '' COMMENT '请求方法(GET、POST、PUT、DELETE等)',
`url` varchar(255) NOT NULL DEFAULT '' COMMENT '请求URL',
`ip` varchar(50) NOT NULL DEFAULT '' COMMENT '操作IP地址',
`user_agent` varchar(500) NOT NULL DEFAULT '' COMMENT '用户代理(浏览器信息)',
`request_data` text COMMENT '请求参数(JSON格式)',
`response_data` text COMMENT '响应数据(JSON格式)',
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '操作状态:1-成功,0-失败',
`error_message` text COMMENT '错误信息(失败时记录)',
`execution_time` decimal(10,3) NOT NULL DEFAULT '0.000' COMMENT '执行时间(秒)',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`delete_time` datetime DEFAULT NULL COMMENT '删除时间(软删除)',
PRIMARY KEY (`id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_module` (`module`),
KEY `idx_action` (`action`),
KEY `idx_create_time` (`create_time`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='操作日志表';
```
## 2. 在控制器中记录操作日志
### 方法1:使用 BaseController 的便捷方法(推荐)
所有继承 `BaseController` 的控制器都可以使用 `$this->logOperation()` 方法:
```php
class YourController extends BaseController
{
public function yourAction()
{
$startTime = microtime(true);
try {
// 你的业务逻辑
$result = $this->doSomething();
$executionTime = microtime(true) - $startTime;
// 记录成功日志
$this->logOperation(
'模块名称', // 如:用户管理、文件管理等
'操作动作', // 如:添加、编辑、删除、查询等
Request::param(), // 请求参数(可选,默认自动获取)
['id' => $result], // 响应数据
1, // 状态:1-成功
'', // 错误信息(成功时为空)
$executionTime // 执行时间(可选)
);
return json(['code' => 200, 'msg' => '操作成功']);
} catch (\Exception $e) {
$executionTime = microtime(true) - $startTime;
// 记录失败日志
$this->logOperation(
'模块名称',
'操作动作',
Request::param(),
[],
0, // 状态:0-失败
$e->getMessage(), // 错误信息
$executionTime
);
return json(['code' => 500, 'msg' => $e->getMessage()]);
}
}
}
```
### 方法2:直接使用 OperationLogHelper
```php
use app\admin\common\OperationLogHelper;
use think\facade\Request;
class YourController extends BaseController
{
public function yourAction()
{
$startTime = microtime(true);
try {
// 你的业务逻辑
$result = $this->doSomething();
$executionTime = microtime(true) - $startTime;
// 记录成功日志
OperationLogHelper::log(
'模块名称',
'操作动作',
Request::param(),
['result' => 'success'],
1,
'',
$executionTime
);
return json(['code' => 200, 'msg' => '操作成功']);
} catch (\Exception $e) {
$executionTime = microtime(true) - $startTime;
OperationLogHelper::log(
'模块名称',
'操作动作',
Request::param(),
[],
0,
$e->getMessage(),
$executionTime
);
return json(['code' => 500, 'msg' => $e->getMessage()]);
}
}
}
```
## 3. 使用示例
### 示例1:用户管理 - 添加用户
```php
public function addUser()
{
$startTime = microtime(true);
try {
$data = Request::param();
// ... 添加用户的业务逻辑
$userId = AdminUser::insertGetId($data);
$executionTime = microtime(true) - $startTime;
// 记录日志
$this->logOperation(
'用户管理',
'添加用户',
$data,
['id' => $userId],
1,
'',
$executionTime
);
return json(['code' => 200, 'msg' => '添加成功']);
} catch (\Exception $e) {
$executionTime = microtime(true) - $startTime;
$this->logOperation(
'用户管理',
'添加用户',
Request::param(),
[],
0,
$e->getMessage(),
$executionTime
);
return json(['code' => 500, 'msg' => $e->getMessage()]);
}
}
```
### 示例2:文件管理 - 创建文件分组
```php
public function createFileCate()
{
$startTime = microtime(true);
try {
$data = Request::param();
$data['create_time'] = date('Y-m-d H:i:s');
$id = FilesCategory::insertGetId($data);
$executionTime = microtime(true) - $startTime;
// 记录日志
$this->logOperation(
'文件管理',
'创建文件分组',
$data,
['id' => $id],
1,
'',
$executionTime
);
return json([
'code' => 200,
'msg' => '新建文件分组成功',
'data' => ['id' => $id]
]);
} catch (\Exception $e) {
$executionTime = microtime(true) - $startTime;
$this->logOperation(
'文件管理',
'创建文件分组',
Request::param(),
[],
0,
$e->getMessage(),
$executionTime
);
return json([
'code' => 500,
'msg' => '新建文件分组失败: ' . $e->getMessage()
]);
}
}
```
### 示例3:文件管理 - 删除文件
```php
public function deleteFile($id)
{
$startTime = microtime(true);
try {
// ... 删除文件的业务逻辑
Files::where('id', $id)->delete();
$executionTime = microtime(true) - $startTime;
$this->logOperation(
'文件管理',
'删除文件',
['id' => $id],
['result' => 'success'],
1,
'',
$executionTime
);
return json(['code' => 200, 'msg' => '删除成功']);
} catch (\Exception $e) {
$executionTime = microtime(true) - $startTime;
$this->logOperation(
'文件管理',
'删除文件',
['id' => $id],
[],
0,
$e->getMessage(),
$executionTime
);
return json(['code' => 500, 'msg' => $e->getMessage()]);
}
}
```
## 4. 模块和操作命名规范
### 模块名称建议:
- 用户管理
- 角色管理
- 文件管理
- 文章管理
- 菜单管理
- 系统设置
- Banner管理
- 单页管理
- 等等...
### 操作动作建议:
- 添加 / 创建
- 编辑 / 更新
- 删除
- 查询 / 查看
- 登录
- 登出
- 上传
- 下载
- 导出
- 导入
- 重命名
- 移动
- 修改密码
- 等等...
## 5. 注意事项
1. **敏感信息过滤**:工具类会自动过滤密码、token 等敏感信息
2. **性能影响**:操作日志记录是异步的,不会影响主业务流程
3. **错误处理**:即使日志记录失败,也不会影响业务逻辑的执行
4. **执行时间**:建议使用 `microtime(true)` 来精确计算执行时间
5. **按需记录**:只在需要记录的操作中添加日志代码,避免过度记录
## 6. 前端查看
操作日志可以在后台管理系统的"系统管理 -> 操作日志"页面查看,支持:
- 关键词搜索
- 模块筛选
- 操作动作筛选
- 状态筛选
- 时间范围筛选
- 查看详情
- 删除和批量删除
## 7. 总结
**使用方式**
-**推荐使用** `$this->logOperation()` 方法(BaseController 提供)
-**或者使用** `OperationLogHelper::log()` 静态方法
**使用场景**
- 重要的增删改操作
- 需要审计的操作
- 需要追踪问题的操作
**不需要记录**
- 简单的查询操作
- 频繁的操作(如心跳检测)
- 不重要的操作
+211
View File
@@ -0,0 +1,211 @@
# 操作日志使用说明(简化版)
## 快速开始
### 最简单的使用方式
```php
// 记录成功日志
$this->logSuccess('文件管理', '创建文件分组', ['id' => $id]);
// 记录失败日志
$this->logFail('文件管理', '创建文件分组', $e->getMessage());
```
就这么简单!只需要两行代码。
## 完整示例
### 示例1:创建文件分组
```php
public function createFileCate()
{
try {
$data = Request::param();
$data['create_time'] = date('Y-m-d H:i:s');
$id = FilesCategory::insertGetId($data);
// 记录成功日志
$this->logSuccess('文件管理', '创建文件分组', ['id' => $id]);
return json([
'code' => 200,
'msg' => '新建文件分组成功',
'data' => ['id' => $id]
]);
} catch (\Exception $e) {
// 记录失败日志
$this->logFail('文件管理', '创建文件分组', $e->getMessage());
return json([
'code' => 500,
'msg' => '新建文件分组失败: ' . $e->getMessage()
]);
}
}
```
### 示例2:删除文件
```php
public function deleteFile($id)
{
try {
Files::where('id', $id)->delete();
// 记录成功日志
$this->logSuccess('文件管理', '删除文件', ['id' => $id]);
return json(['code' => 200, 'msg' => '删除成功']);
} catch (\Exception $e) {
// 记录失败日志
$this->logFail('文件管理', '删除文件', $e->getMessage());
return json(['code' => 500, 'msg' => $e->getMessage()]);
}
}
```
### 示例3:添加用户
```php
public function addUser()
{
try {
$data = Request::param();
$userId = AdminUser::insertGetId($data);
// 记录成功日志
$this->logSuccess('用户管理', '添加用户', ['id' => $userId]);
return json(['code' => 200, 'msg' => '添加成功']);
} catch (\Exception $e) {
// 记录失败日志
$this->logFail('用户管理', '添加用户', $e->getMessage());
return json(['code' => 500, 'msg' => $e->getMessage()]);
}
}
```
## 方法说明
### BaseController 提供的方法
所有继承 `BaseController` 的控制器都可以使用以下方法:
#### 1. `logSuccess()` - 记录成功日志
```php
$this->logSuccess(string $module, string $action, array $responseData = [])
```
**参数:**
- `$module`: 模块名称(如:文件管理、用户管理等)
- `$action`: 操作名称(如:创建文件分组、删除文件等)
- `$responseData`: 响应数据(可选,如:`['id' => 123]`
**示例:**
```php
$this->logSuccess('文件管理', '创建文件分组', ['id' => $id]);
```
#### 2. `logFail()` - 记录失败日志
```php
$this->logFail(string $module, string $action, string $errorMessage)
```
**参数:**
- `$module`: 模块名称
- `$action`: 操作名称
- `$errorMessage`: 错误信息
**示例:**
```php
$this->logFail('文件管理', '创建文件分组', $e->getMessage());
```
#### 3. `logOperation()` - 完整版(需要更多控制时使用)
```php
$this->logOperation(
string $module,
string $action,
array $requestData = [],
array $responseData = [],
int $status = 1,
string $errorMessage = ''
)
```
## 直接使用 OperationLogger 类
如果不继承 BaseController,可以直接使用:
```php
use app\admin\common\OperationLogger;
// 记录成功
OperationLogger::success('文件管理', '创建文件分组', ['id' => $id]);
// 记录失败
OperationLogger::fail('文件管理', '创建文件分组', $e->getMessage());
// 完整版
OperationLogger::record(
'文件管理',
'创建文件分组',
Request::param(), // 请求数据(可选)
['id' => $id], // 响应数据(可选)
1, // 状态:1-成功,0-失败
'' // 错误信息(可选)
);
```
## 模块和操作命名建议
### 模块名称:
- 文件管理
- 用户管理
- 角色管理
- 文章管理
- 菜单管理
- Banner管理
- 单页管理
- 系统设置
### 操作名称:
- 创建文件分组
- 重命名文件分组
- 删除文件分组
- 上传文件
- 删除文件
- 移动文件
- 添加用户
- 编辑用户
- 删除用户
- 修改密码
- 等等...
## 注意事项
1. **自动获取**:请求数据会自动获取,无需手动传递
2. **敏感信息过滤**:密码、token 等敏感信息会自动过滤
3. **错误处理**:日志记录失败不会影响主业务流程
4. **按需记录**:只在需要记录的操作中添加日志代码
## 总结
**推荐使用方式:**
```php
// 成功时
$this->logSuccess('模块名称', '操作名称', ['响应数据']);
// 失败时
$this->logFail('模块名称', '操作名称', '错误信息');
```
就这么简单!