剩余语音测评分数调整一致
This commit is contained in:
parent
304b5faeeb
commit
c01d45b200
|
|
@ -601,7 +601,7 @@ export default {
|
||||||
},
|
},
|
||||||
// 表单校验
|
// 表单校验
|
||||||
rules: {
|
rules: {
|
||||||
userName: [
|
nickName: [
|
||||||
{ required: true, message: "罪犯姓名不能为空", trigger: "blur" },
|
{ required: true, message: "罪犯姓名不能为空", trigger: "blur" },
|
||||||
{ min: 2, max: 20, message: '罪犯姓名长度必须介于 2 和 20 之间', trigger: 'blur' }
|
{ min: 2, max: 20, message: '罪犯姓名长度必须介于 2 和 20 之间', trigger: 'blur' }
|
||||||
],
|
],
|
||||||
|
|
@ -1243,6 +1243,17 @@ export default {
|
||||||
},
|
},
|
||||||
/** 提交按钮(新增/编辑学员) */
|
/** 提交按钮(新增/编辑学员) */
|
||||||
submitForm() {
|
submitForm() {
|
||||||
|
// ✅ 自动生成userName(学员不需要登录账号,但后端必填)
|
||||||
|
// 优先使用信息编号,没有则用昵称
|
||||||
|
if (!this.form.userName) {
|
||||||
|
this.form.userName = this.form.manualUserId || this.form.userId || this.form.nickName || `user_${Date.now()}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ✅ 自动设置registerType为student(数据库必填字段)
|
||||||
|
if (!this.form.registerType) {
|
||||||
|
this.form.registerType = 'student';
|
||||||
|
}
|
||||||
|
|
||||||
this.$refs["form"].validate(valid => {
|
this.$refs["form"].validate(valid => {
|
||||||
if (!valid) {
|
if (!valid) {
|
||||||
return;
|
return;
|
||||||
|
|
|
||||||
|
|
@ -302,18 +302,21 @@ export default {
|
||||||
nickName: { label: '用户姓名', visible: true },
|
nickName: { label: '用户姓名', visible: true },
|
||||||
deptName: { label: '部门', visible: true },
|
deptName: { label: '部门', visible: true },
|
||||||
phonenumber: { label: '手机号码', visible: false },
|
phonenumber: { label: '手机号码', visible: false },
|
||||||
registerType: { label: '注册类型', visible: true },
|
email: { label: '邮箱', visible: false },
|
||||||
status: { label: '状态', visible: true },
|
status: { label: '状态', visible: true },
|
||||||
createTime: { label: '创建时间', visible: true }
|
createTime: { label: '创建时间', visible: true }
|
||||||
},
|
},
|
||||||
// 表单校验
|
// 表单校验
|
||||||
rules: {
|
rules: {
|
||||||
userName: [
|
userName: [
|
||||||
{ required: true, message: "登录名称不能为空", trigger: "blur" },
|
{ required: true, message: "用户账号不能为空", trigger: ["blur", "change"] },
|
||||||
{ min: 2, max: 20, message: '登录名称长度必须介于 2 和 20 之间', trigger: 'blur' }
|
{ min: 2, max: 20, message: '用户账号长度必须介于 2 和 20 之间', trigger: 'blur' }
|
||||||
],
|
],
|
||||||
nickName: [
|
nickName: [
|
||||||
{ required: true, message: "用户姓名不能为空", trigger: "blur" }
|
{ required: true, message: "用户昵称不能为空", trigger: "blur" }
|
||||||
|
],
|
||||||
|
deptId: [
|
||||||
|
{ required: true, message: "归属部门不能为空", trigger: "blur" }
|
||||||
],
|
],
|
||||||
password: [
|
password: [
|
||||||
{ required: true, message: "用户密码不能为空", trigger: "blur" },
|
{ required: true, message: "用户密码不能为空", trigger: "blur" },
|
||||||
|
|
|
||||||
215
log/1-AI指南.md
215
log/1-AI指南.md
|
|
@ -1,215 +0,0 @@
|
||||||
# AI工作指南
|
|
||||||
|
|
||||||
## 项目结构
|
|
||||||
|
|
||||||
### 1. 后端 + 管理后台
|
|
||||||
- **路径**: `Study-Vue-redis/`
|
|
||||||
- **技术栈**: Spring Boot + MyBatis + Vue.js
|
|
||||||
- **说明**: 包含后端API服务和管理后台前端
|
|
||||||
|
|
||||||
### 2. APP项目
|
|
||||||
- **路径**: `fronted_uniapp/`
|
|
||||||
- **技术栈**: uni-app (Vue.js)
|
|
||||||
- **说明**: 移动端应用,可打包为Android/iOS
|
|
||||||
|
|
||||||
### 3. 数据库
|
|
||||||
- **导入脚本**: `log/数据库/dump-study-202512070856.sql`
|
|
||||||
- **数据库名**: `study`
|
|
||||||
- **默认账号**: `root` / `root`
|
|
||||||
|
|
||||||
### 4. 开发环境
|
|
||||||
- **本地开发**: Windows环境,运行正常
|
|
||||||
- **部署环境**: Linux服务器,存在环境差异问题
|
|
||||||
- **注意**: 部署前需要测试环境兼容性
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 工作原则
|
|
||||||
|
|
||||||
### 原则1:主动获取信息
|
|
||||||
**优先使用工具获取信息,减少询问**
|
|
||||||
|
|
||||||
✅ **应该做的:**
|
|
||||||
- 使用`grep_search`查找代码
|
|
||||||
- 使用`read_file`读取配置文件
|
|
||||||
- 使用`run_command`检查端口占用、进程状态
|
|
||||||
- 查询数据库获取数据状态(配置文件中有账号密码)
|
|
||||||
- 查看日志文件分析问题
|
|
||||||
|
|
||||||
❌ **不应该做的:**
|
|
||||||
- 直接询问"端口是多少"(应该用命令查询)
|
|
||||||
- 询问"数据库密码是什么"(应该读取配置文件)
|
|
||||||
- 询问"这个文件在哪里"(应该用find_by_name搜索)
|
|
||||||
|
|
||||||
**例外情况:**
|
|
||||||
- 报错信息(需要用户提供控制台输出)
|
|
||||||
- 运行结果(需要用户反馈测试结果)
|
|
||||||
- 业务需求(需要用户明确需求细节)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 原则2:确认需求再执行
|
|
||||||
**信息不完整时,先确认再行动**
|
|
||||||
|
|
||||||
✅ **检查清单:**
|
|
||||||
- [ ] 用户需求是否明确?有无歧义?
|
|
||||||
- [ ] 是否需要补充信息才能执行?
|
|
||||||
- [ ] 能否通过工具自行获取缺失信息?
|
|
||||||
- [ ] 执行前是否理解了预期结果?
|
|
||||||
|
|
||||||
**示例:**
|
|
||||||
- 用户说"修复这个bug" → 先确认具体是哪个bug,复现步骤是什么
|
|
||||||
- 用户说"部署到服务器" → 先确认服务器地址、环境、部署方式
|
|
||||||
- 用户说"优化性能" → 先确认性能瓶颈在哪里,优化目标是什么
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 原则3:简洁文档
|
|
||||||
**只在需要时写文档,内容精简实用**
|
|
||||||
|
|
||||||
✅ **文档要求:**
|
|
||||||
- 用户明确要求时才写文档
|
|
||||||
- 用户会指定文档路径
|
|
||||||
- 只写必要内容,不要冗余
|
|
||||||
- 重点突出,步骤清晰
|
|
||||||
- 使用Markdown格式
|
|
||||||
|
|
||||||
❌ **避免:**
|
|
||||||
- 自动生成大量README
|
|
||||||
- 过度详细的注释
|
|
||||||
- 重复的说明文档
|
|
||||||
- 长篇大论的总结
|
|
||||||
|
|
||||||
**例外情况:**
|
|
||||||
- SQL脚本(需要记录修改)
|
|
||||||
- 部署步骤(需要明确指引)
|
|
||||||
- 配置文件(需要说明参数)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 原则4:理解功能逻辑
|
|
||||||
**充分理解现有功能后再修改**
|
|
||||||
|
|
||||||
✅ **功能理解流程:**
|
|
||||||
1. 使用`grep_search`和`code_search`查找相关代码
|
|
||||||
2. 阅读核心逻辑,理解业务流程
|
|
||||||
3. 用简洁语言总结功能逻辑
|
|
||||||
4. 提供实际应用场景示例
|
|
||||||
5. 确认理解正确后再进行修改
|
|
||||||
|
|
||||||
**示例:**
|
|
||||||
- 用户说"优化学习记录功能"
|
|
||||||
- → 先查找StudyLearningRecord相关代码
|
|
||||||
- → 理解当前如何记录学习进度
|
|
||||||
- → 总结:每次上报时更新learning_record和learning_detail
|
|
||||||
- → 场景:学生观看视频时每10秒上报一次进度
|
|
||||||
- → 确认理解无误后,再讨论优化方案
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 常见操作
|
|
||||||
|
|
||||||
### 编译后端
|
|
||||||
```bash
|
|
||||||
cd Study-Vue-redis
|
|
||||||
mvn clean package -DskipTests
|
|
||||||
```
|
|
||||||
|
|
||||||
### 启动后端
|
|
||||||
```bash
|
|
||||||
java -jar ry-study-admin/target/ry-study-admin.jar
|
|
||||||
```
|
|
||||||
|
|
||||||
### 查询数据库
|
|
||||||
```bash
|
|
||||||
mysql -u root -proot study -e "你的SQL语句"
|
|
||||||
```
|
|
||||||
|
|
||||||
### 查看端口占用
|
|
||||||
```powershell
|
|
||||||
netstat -ano | findstr :端口号
|
|
||||||
```
|
|
||||||
|
|
||||||
### 停止Java进程
|
|
||||||
```powershell
|
|
||||||
taskkill /F /IM java.exe
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 工作流程
|
|
||||||
|
|
||||||
### 1. 接收需求
|
|
||||||
- 阅读用户请求
|
|
||||||
- 识别关键信息
|
|
||||||
- 判断是否需要补充
|
|
||||||
|
|
||||||
### 2. 信息收集
|
|
||||||
- 优先使用工具获取
|
|
||||||
- 必要时向用户确认
|
|
||||||
- 确保信息完整
|
|
||||||
|
|
||||||
### 3. 分析问题
|
|
||||||
- 定位问题根源
|
|
||||||
- 查看相关代码
|
|
||||||
- 理解业务逻辑
|
|
||||||
|
|
||||||
### 4. 实施修改
|
|
||||||
- 最小化修改范围
|
|
||||||
- 保持代码风格一致
|
|
||||||
- 添加必要注释
|
|
||||||
|
|
||||||
### 5. 验证结果
|
|
||||||
- 编译测试
|
|
||||||
- 提供验证步骤
|
|
||||||
- 记录修改内容
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 经验总结
|
|
||||||
|
|
||||||
### BUG修复经验
|
|
||||||
|
|
||||||
#### 多视频时长问题(2025-12-12)
|
|
||||||
**问题**: 多个视频课件共用一个总时长字段
|
|
||||||
**方案**: 动态更新courseware.duration,每个课件独立存储
|
|
||||||
**教训**: 数据设计要考虑一对多关系
|
|
||||||
|
|
||||||
#### 防快进检测(2025-12-12)
|
|
||||||
**问题**: 用户拖动到末尾就能完成
|
|
||||||
**方案**: 添加累计观看时长检测(>=80%)
|
|
||||||
**教训**: 前端数据可被篡改,后端必须验证
|
|
||||||
|
|
||||||
#### 观看时长共用(2025-12-12)
|
|
||||||
**问题**: Mapper XML缺少coursewareId过滤
|
|
||||||
**方案**: 添加WHERE条件
|
|
||||||
**教训**: SQL查询必须明确过滤条件
|
|
||||||
|
|
||||||
#### 异常数据清理(2025-12-12)
|
|
||||||
**问题**: duration<=0的脏数据影响统计
|
|
||||||
**方案**: 清理异常数据,代码中过滤
|
|
||||||
**教训**: 数据验证要在代码和数据库两层进行
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 注意事项
|
|
||||||
|
|
||||||
1. **修改前先备份** - 重要文件修改前先备份
|
|
||||||
2. **测试后再部署** - 本地测试通过再部署到服务器
|
|
||||||
3. **保持代码风格** - 遵循项目现有代码规范
|
|
||||||
4. **避免过度设计** - 简单问题简单解决
|
|
||||||
5. **记录关键修改** - 重要修改需要记录在log目录
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 遇到问题时
|
|
||||||
|
|
||||||
1. 先查看日志文件
|
|
||||||
2. 使用grep搜索相关代码
|
|
||||||
3. 查询数据库验证数据
|
|
||||||
4. 尝试用命令诊断
|
|
||||||
5. 最后才询问用户
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
*最后更新: 2025-12-12*
|
|
||||||
395
log/AI指南/1-AI指南.md
Normal file
395
log/AI指南/1-AI指南.md
Normal file
|
|
@ -0,0 +1,395 @@
|
||||||
|
# AI工作指南
|
||||||
|
|
||||||
|
## 🚀 快速引用
|
||||||
|
|
||||||
|
**使用方法**:在对话中使用编号快速调用对应原则
|
||||||
|
|
||||||
|
| 编号 | 原则 | 用法示例 |
|
||||||
|
|------|------|---------|
|
||||||
|
| **1** | 主动获取信息 | `1-查询数据库配置` |
|
||||||
|
| **2** | 确认需求再执行 | `2-修复登录bug` |
|
||||||
|
| **3** | 简洁文档 | `3-生成部署文档` |
|
||||||
|
| **4** | 理解功能逻辑 | `4-学习记录功能` |
|
||||||
|
| **5** | 记录配置信息 | `5-Redis配置` |
|
||||||
|
|
||||||
|
**示例**:
|
||||||
|
- 输入 `1-端口占用` → AI会主动使用命令查询端口,而不是询问你
|
||||||
|
- 输入 `2-部署到服务器` → AI会先确认服务器地址、环境等信息
|
||||||
|
- 输入 `4-视频进度功能` → AI会先查找代码、理解逻辑、总结应用场景
|
||||||
|
- 输入 `5-新增OSS配置` → AI会自动记录到配置清单文件
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 项目结构
|
||||||
|
|
||||||
|
### 1. 后端 + 管理后台
|
||||||
|
- **路径**: `Study-Vue-redis/`
|
||||||
|
- **技术栈**: Spring Boot + MyBatis + Vue.js
|
||||||
|
- **说明**: 包含后端API服务和管理后台前端
|
||||||
|
|
||||||
|
### 2. APP项目
|
||||||
|
- **路径**: `fronted_uniapp/`
|
||||||
|
- **技术栈**: uni-app (Vue.js)
|
||||||
|
- **说明**: 移动端应用,可打包为Android/iOS
|
||||||
|
|
||||||
|
### 3. 数据库
|
||||||
|
- **导入脚本**: `log/数据库/dump-study-202512070856.sql`
|
||||||
|
- **数据库名**: `study`
|
||||||
|
- **默认账号**: `root` / `root`
|
||||||
|
|
||||||
|
### 4. 开发环境
|
||||||
|
- **本地开发**: Windows环境,运行正常
|
||||||
|
- **部署环境**: Linux服务器,存在环境差异问题
|
||||||
|
- **注意**: 部署前需要测试环境兼容性
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 工作原则
|
||||||
|
|
||||||
|
### 原则1:主动获取信息
|
||||||
|
**优先使用工具获取信息,减少询问**
|
||||||
|
|
||||||
|
✅ **应该做的:**
|
||||||
|
- 使用`grep_search`查找代码
|
||||||
|
- 使用`read_file`读取配置文件
|
||||||
|
- 使用`run_command`检查端口占用、进程状态
|
||||||
|
- 查询数据库获取数据状态(配置文件中有账号密码)
|
||||||
|
- 查看日志文件分析问题
|
||||||
|
|
||||||
|
❌ **不应该做的:**
|
||||||
|
- 直接询问"端口是多少"(应该用命令查询)
|
||||||
|
- 询问"数据库密码是什么"(应该读取配置文件)
|
||||||
|
- 询问"这个文件在哪里"(应该用find_by_name搜索)
|
||||||
|
|
||||||
|
**例外情况:**
|
||||||
|
- 报错信息(需要用户提供控制台输出)
|
||||||
|
- 运行结果(需要用户反馈测试结果)
|
||||||
|
- 业务需求(需要用户明确需求细节)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 原则2:确认需求再执行
|
||||||
|
**信息不完整时,先确认再行动**
|
||||||
|
|
||||||
|
✅ **检查清单:**
|
||||||
|
- [ ] 用户需求是否明确?有无歧义?
|
||||||
|
- [ ] 是否需要补充信息才能执行?
|
||||||
|
- [ ] 能否通过工具自行获取缺失信息?
|
||||||
|
- [ ] 执行前是否理解了预期结果?
|
||||||
|
|
||||||
|
**示例:**
|
||||||
|
- 用户说"修复这个bug" → 先确认具体是哪个bug,复现步骤是什么
|
||||||
|
- 用户说"部署到服务器" → 先确认服务器地址、环境、部署方式
|
||||||
|
- 用户说"优化性能" → 先确认性能瓶颈在哪里,优化目标是什么
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 原则3:简洁文档
|
||||||
|
**只在需要时写文档,内容精简实用**
|
||||||
|
|
||||||
|
✅ **文档要求:**
|
||||||
|
- 用户明确要求时才写文档
|
||||||
|
- 用户会指定文档路径
|
||||||
|
- 只写必要内容,不要冗余
|
||||||
|
- 重点突出,步骤清晰
|
||||||
|
- 使用Markdown格式
|
||||||
|
|
||||||
|
❌ **避免:**
|
||||||
|
- 自动生成大量README
|
||||||
|
- 过度详细的注释
|
||||||
|
- 重复的说明文档
|
||||||
|
- 长篇大论的总结
|
||||||
|
|
||||||
|
**例外情况:**
|
||||||
|
- SQL脚本(需要记录修改)
|
||||||
|
- 部署步骤(需要明确指引)
|
||||||
|
- 配置文件(需要说明参数)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 原则4:理解功能逻辑
|
||||||
|
**充分理解现有功能后再修改**
|
||||||
|
|
||||||
|
✅ **功能理解流程:**
|
||||||
|
1. 使用`grep_search`和`code_search`查找相关代码
|
||||||
|
2. 阅读核心逻辑,理解业务流程
|
||||||
|
3. 用简洁语言总结功能逻辑
|
||||||
|
4. 提供实际应用场景示例
|
||||||
|
5. 确认理解正确后再进行修改
|
||||||
|
|
||||||
|
**示例:**
|
||||||
|
- 用户说"优化学习记录功能"
|
||||||
|
- → 先查找StudyLearningRecord相关代码
|
||||||
|
- → 理解当前如何记录学习进度
|
||||||
|
- → 总结:每次上报时更新learning_record和learning_detail
|
||||||
|
- → 场景:学生观看视频时每10秒上报一次进度
|
||||||
|
- → 确认理解无误后,再讨论优化方案
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 原则5:记录配置信息
|
||||||
|
**遇到配置信息时,自动记录到配置清单文件**
|
||||||
|
|
||||||
|
✅ **需要记录的信息类型:**
|
||||||
|
- 外部API接口地址和密钥
|
||||||
|
- 数据库连接信息(地址、端口、账号)
|
||||||
|
- 本地服务端口和访问地址
|
||||||
|
- 重要文件路径和位置
|
||||||
|
- 第三方服务配置
|
||||||
|
- 环境变量设置
|
||||||
|
|
||||||
|
📝 **记录位置:**
|
||||||
|
- 文件路径:`log/项目配置清单.md`
|
||||||
|
- 每次遇到新的配置信息时自动追加
|
||||||
|
- 记录时间和用途说明
|
||||||
|
|
||||||
|
**示例:**
|
||||||
|
- 发现使用了OSS存储 → 记录OSS的endpoint、bucket等信息
|
||||||
|
- 配置了Redis → 记录Redis的host、port、密码
|
||||||
|
- 调用百度API → 记录API Key和Secret
|
||||||
|
- 部署到服务器 → 记录服务器IP、部署路径
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 常见操作
|
||||||
|
|
||||||
|
### 编译后端
|
||||||
|
```bash
|
||||||
|
cd Study-Vue-redis
|
||||||
|
mvn clean package -DskipTests
|
||||||
|
```
|
||||||
|
|
||||||
|
### 启动后端
|
||||||
|
```bash
|
||||||
|
java -jar ry-study-admin/target/ry-study-admin.jar
|
||||||
|
```
|
||||||
|
|
||||||
|
### 查询数据库
|
||||||
|
```bash
|
||||||
|
mysql -u root -proot study -e "你的SQL语句"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 查看端口占用
|
||||||
|
```powershell
|
||||||
|
netstat -ano | findstr :端口号
|
||||||
|
```
|
||||||
|
|
||||||
|
### 停止Java进程
|
||||||
|
```powershell
|
||||||
|
taskkill /F /IM java.exe
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 工作流程
|
||||||
|
|
||||||
|
### 1. 接收需求
|
||||||
|
- 阅读用户请求
|
||||||
|
- 识别关键信息
|
||||||
|
- 判断是否需要补充
|
||||||
|
|
||||||
|
### 2. 信息收集
|
||||||
|
- 优先使用工具获取
|
||||||
|
- 必要时向用户确认
|
||||||
|
- 确保信息完整
|
||||||
|
|
||||||
|
### 3. 分析问题
|
||||||
|
- 定位问题根源
|
||||||
|
- 查看相关代码
|
||||||
|
- 理解业务逻辑
|
||||||
|
|
||||||
|
### 4. 实施修改
|
||||||
|
- 最小化修改范围
|
||||||
|
- 保持代码风格一致
|
||||||
|
- 添加必要注释
|
||||||
|
|
||||||
|
### 5. 验证结果
|
||||||
|
- 编译测试
|
||||||
|
- 提供验证步骤
|
||||||
|
- 记录修改内容
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 经验总结
|
||||||
|
|
||||||
|
### BUG修复经验
|
||||||
|
|
||||||
|
#### 多视频时长问题(2025-12-12)
|
||||||
|
**问题**: 多个视频课件共用一个总时长字段
|
||||||
|
**方案**: 动态更新courseware.duration,每个课件独立存储
|
||||||
|
**教训**: 数据设计要考虑一对多关系
|
||||||
|
|
||||||
|
#### 防快进检测(2025-12-12)
|
||||||
|
**问题**: 用户拖动到末尾就能完成
|
||||||
|
**方案**: 添加累计观看时长检测(>=80%)
|
||||||
|
**教训**: 前端数据可被篡改,后端必须验证
|
||||||
|
|
||||||
|
#### 观看时长共用(2025-12-12)
|
||||||
|
**问题**: Mapper XML缺少coursewareId过滤
|
||||||
|
**方案**: 添加WHERE条件
|
||||||
|
**教训**: SQL查询必须明确过滤条件
|
||||||
|
|
||||||
|
#### 异常数据清理(2025-12-12)
|
||||||
|
**问题**: duration<=0的脏数据影响统计
|
||||||
|
**方案**: 清理异常数据,代码中过滤
|
||||||
|
**教训**: 数据验证要在代码和数据库两层进行
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 注意事项
|
||||||
|
|
||||||
|
1. **修改前先备份** - 重要文件修改前先备份
|
||||||
|
2. **测试后再部署** - 本地测试通过再部署到服务器
|
||||||
|
3. **保持代码风格** - 遵循项目现有代码规范
|
||||||
|
4. **避免过度设计** - 简单问题简单解决
|
||||||
|
5. **记录关键修改** - 重要修改需要记录在log目录
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 遇到问题时
|
||||||
|
|
||||||
|
1. 先查看日志文件
|
||||||
|
2. 使用grep搜索相关代码
|
||||||
|
3. 查询数据库验证数据
|
||||||
|
4. 尝试用命令诊断
|
||||||
|
5. 最后才询问用户
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📞 快速引用详细说明
|
||||||
|
|
||||||
|
### 使用格式
|
||||||
|
```
|
||||||
|
编号-你的请求内容
|
||||||
|
```
|
||||||
|
|
||||||
|
### 各编号的详细说明
|
||||||
|
|
||||||
|
#### **1-主动获取信息**
|
||||||
|
当你说 `1-xxx` 时,AI会:
|
||||||
|
- ✅ 优先使用工具自行查找信息
|
||||||
|
- ✅ 查看配置文件获取参数
|
||||||
|
- ✅ 执行命令查询状态
|
||||||
|
- ✅ 搜索代码定位问题
|
||||||
|
- ❌ 不会直接询问你已有的信息
|
||||||
|
|
||||||
|
**适用场景**:
|
||||||
|
- `1-查看当前运行的端口` → 执行 `netstat -ano` 命令
|
||||||
|
- `1-数据库连接信息` → 读取 `application-druid.yml`
|
||||||
|
- `1-查找登录接口` → 使用 `grep_search` 搜索代码
|
||||||
|
- `1-Redis配置` → 读取 `application.yml` 的Redis部分
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### **2-确认需求再执行**
|
||||||
|
当你说 `2-xxx` 时,AI会:
|
||||||
|
- ✅ 分析需求是否明确
|
||||||
|
- ✅ 检查是否有歧义
|
||||||
|
- ✅ 列出需要补充的信息
|
||||||
|
- ✅ 确认后再开始执行
|
||||||
|
|
||||||
|
**适用场景**:
|
||||||
|
- `2-修复登录bug` → 会先问:具体是什么bug?复现步骤?报错信息?
|
||||||
|
- `2-部署到服务器` → 会先问:服务器地址?部署路径?环境信息?
|
||||||
|
- `2-优化性能` → 会先问:哪里性能差?瓶颈在哪?目标是什么?
|
||||||
|
- `2-添加新功能` → 会先问:功能的具体需求?业务场景?
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### **3-简洁文档**
|
||||||
|
当你说 `3-xxx` 时,AI会:
|
||||||
|
- ✅ 只写必要内容
|
||||||
|
- ✅ 重点突出,步骤清晰
|
||||||
|
- ✅ 使用Markdown格式
|
||||||
|
- ❌ 不会写冗余内容
|
||||||
|
|
||||||
|
**适用场景**:
|
||||||
|
- `3-生成部署文档` → 只写部署步骤,不写原理
|
||||||
|
- `3-API使用说明` → 只写接口参数和返回值
|
||||||
|
- `3-配置说明` → 只写关键配置项
|
||||||
|
- `3-修复记录` → 只写问题、方案、结果
|
||||||
|
|
||||||
|
**特殊说明**:
|
||||||
|
- 如果不加 `3-`,默认不会主动生成文档
|
||||||
|
- 你可以指定文档路径:`3-生成部署文档到log/部署.md`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### **4-理解功能逻辑**
|
||||||
|
当你说 `4-xxx` 时,AI会:
|
||||||
|
- ✅ 搜索相关代码
|
||||||
|
- ✅ 阅读核心逻辑
|
||||||
|
- ✅ 用简洁语言总结功能
|
||||||
|
- ✅ 提供实际应用场景
|
||||||
|
- ✅ 确认理解正确后再修改
|
||||||
|
|
||||||
|
**适用场景**:
|
||||||
|
- `4-学习记录功能` → 会分析代码,总结逻辑,给出应用场景
|
||||||
|
- `4-视频进度计算` → 会说明如何计算、何时更新、防快进逻辑
|
||||||
|
- `4-用户认证流程` → 会说明登录、Token、权限验证的完整流程
|
||||||
|
- `4-文件上传机制` → 会说明上传路径、大小限制、存储方式
|
||||||
|
|
||||||
|
**输出格式**:
|
||||||
|
```
|
||||||
|
功能逻辑总结:
|
||||||
|
1. 触发条件:xxx
|
||||||
|
2. 核心流程:xxx
|
||||||
|
3. 数据处理:xxx
|
||||||
|
4. 返回结果:xxx
|
||||||
|
|
||||||
|
应用场景示例:
|
||||||
|
当用户xxx时,系统会xxx
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### **5-记录配置信息**
|
||||||
|
当你说 `5-xxx` 时,AI会:
|
||||||
|
- ✅ 识别配置信息
|
||||||
|
- ✅ 自动记录到 `log/项目配置清单.md`
|
||||||
|
- ✅ 添加时间和用途说明
|
||||||
|
- ✅ 提醒你查看更新
|
||||||
|
|
||||||
|
**适用场景**:
|
||||||
|
- `5-新增OSS配置` → 记录endpoint、bucket、accessKey等
|
||||||
|
- `5-Redis密码改了` → 更新配置清单中的Redis配置
|
||||||
|
- `5-添加百度API` → 记录API Key、Secret、接口地址
|
||||||
|
- `5-服务器部署信息` → 记录服务器IP、路径、账号
|
||||||
|
|
||||||
|
**记录位置**:
|
||||||
|
- 文件:`log/项目配置清单.md`
|
||||||
|
- 格式:按分类自动追加到对应章节
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 组合使用
|
||||||
|
|
||||||
|
你可以组合使用多个编号:
|
||||||
|
|
||||||
|
**示例1**:`1,4-视频进度功能`
|
||||||
|
- 先用工具查找代码(原则1)
|
||||||
|
- 再理解功能逻辑(原则4)
|
||||||
|
|
||||||
|
**示例2**:`2,3-部署到生产环境`
|
||||||
|
- 先确认服务器信息(原则2)
|
||||||
|
- 再生成简洁的部署文档(原则3)
|
||||||
|
|
||||||
|
**示例3**:`1,5-查看Redis配置`
|
||||||
|
- 先读取配置文件(原则1)
|
||||||
|
- 再记录到配置清单(原则5)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 快速对照表
|
||||||
|
|
||||||
|
| 你想要什么 | 使用编号 | AI会做什么 |
|
||||||
|
|-----------|---------|-----------|
|
||||||
|
| 查询信息 | `1-xxx` | 主动用工具查找 |
|
||||||
|
| 避免误解 | `2-xxx` | 先确认需求 |
|
||||||
|
| 生成文档 | `3-xxx` | 写简洁文档 |
|
||||||
|
| 理解代码 | `4-xxx` | 分析逻辑+场景 |
|
||||||
|
| 记录配置 | `5-xxx` | 自动记录到文件 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
*最后更新: 2025-12-12*
|
||||||
289
log/AI指南/项目配置清单.md
Normal file
289
log/AI指南/项目配置清单.md
Normal file
|
|
@ -0,0 +1,289 @@
|
||||||
|
# 项目配置清单
|
||||||
|
|
||||||
|
> 记录项目中的所有配置信息,包括外部接口、数据库、服务地址等
|
||||||
|
> 最后更新: 2025-12-12
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📊 数据库配置
|
||||||
|
|
||||||
|
### MySQL数据库
|
||||||
|
- **数据库名**: `study`
|
||||||
|
- **JDBC URL**: `jdbc:mysql://127.0.0.1:3306/study?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true`
|
||||||
|
- **地址**: `127.0.0.1`
|
||||||
|
- **端口**: `3306`
|
||||||
|
- **账号**: `root`
|
||||||
|
- **密码**: `root`
|
||||||
|
- **字符集**: `utf8mb4` + `utf8`
|
||||||
|
- **时区**: GMT+8 (Asia/Shanghai)
|
||||||
|
- **驱动**: `com.mysql.cj.jdbc.Driver`
|
||||||
|
- **用途**: 主数据库,存储所有业务数据
|
||||||
|
|
||||||
|
### 连接池配置 (Druid)
|
||||||
|
- **类型**: Alibaba Druid
|
||||||
|
- **初始连接数**: 5
|
||||||
|
- **最小空闲数**: 10
|
||||||
|
- **最大活动连接数**: 20
|
||||||
|
- **获取连接超时**: 60秒
|
||||||
|
- **连接超时**: 30秒
|
||||||
|
- **网络超时**: 60秒
|
||||||
|
- **监控地址**: `http://localhost:30091/druid/`
|
||||||
|
- **监控账号**: `ddnai_admin` / `Ddnai@2025#Druid`
|
||||||
|
- **慢SQL阈值**: 1000ms
|
||||||
|
|
||||||
|
### 数据库脚本位置
|
||||||
|
- **初始化脚本**: `log/数据库/dump-study-202512070856.sql`
|
||||||
|
- **备份脚本**: `log/mysql_study_20251129153033 (1).sql`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🌐 后端服务
|
||||||
|
|
||||||
|
### Spring Boot 应用
|
||||||
|
- **项目名称**: 国语教育平台
|
||||||
|
- **版本**: 1.0.0
|
||||||
|
- **项目路径**: `Study-Vue-redis/`
|
||||||
|
- **主程序**: `ry-study-admin/target/ry-study-admin.jar`
|
||||||
|
- **服务端口**: `30091`
|
||||||
|
- **访问路径**: `/`
|
||||||
|
- **API前缀**: `/dev-api` (Swagger)
|
||||||
|
- **启动命令**: `java -jar ry-study-admin/target/ry-study-admin.jar`
|
||||||
|
- **配置文件**:
|
||||||
|
- 主配置: `ry-study-admin/src/main/resources/application.yml`
|
||||||
|
- 数据源: `ry-study-admin/src/main/resources/application-druid.yml`
|
||||||
|
|
||||||
|
### Tomcat配置
|
||||||
|
- **URI编码**: UTF-8
|
||||||
|
- **最大线程数**: 800
|
||||||
|
- **最小线程数**: 100
|
||||||
|
- **连接队列数**: 1000
|
||||||
|
- **POST最大大小**: 2GB
|
||||||
|
|
||||||
|
### 管理后台
|
||||||
|
- **技术栈**: Vue.js
|
||||||
|
- **位置**: `Study-Vue-redis/ry-study-ui/`
|
||||||
|
|
||||||
|
### 日志配置
|
||||||
|
- **com.ddnai**: DEBUG级别
|
||||||
|
- **org.springframework**: WARN级别
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📱 前端应用
|
||||||
|
|
||||||
|
### uni-app 移动端
|
||||||
|
- **项目路径**: `fronted_uniapp/`
|
||||||
|
- **技术栈**: uni-app (Vue.js)
|
||||||
|
- **打包平台**: Android / iOS / H5
|
||||||
|
- **开发工具**: HBuilderX
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔧 本地服务
|
||||||
|
|
||||||
|
### Redis缓存
|
||||||
|
- **地址**: `127.0.0.1`
|
||||||
|
- **端口**: `6379`
|
||||||
|
- **数据库索引**: `0`
|
||||||
|
- **密码**: 无密码(本地开发)
|
||||||
|
- **连接超时**: 10秒
|
||||||
|
- **连接池配置**:
|
||||||
|
- 最小空闲连接: 0
|
||||||
|
- 最大空闲连接: 8
|
||||||
|
- 最大活动连接: 8
|
||||||
|
- 最大等待时间: 无限制
|
||||||
|
- **用途**: 缓存、Session存储
|
||||||
|
|
||||||
|
### Whisper 语音识别服务器
|
||||||
|
- **服务文件**: `log/whisper_server.py`
|
||||||
|
- **端口**: `5000` (需确认)
|
||||||
|
- **用途**: 离线语音识别和评测
|
||||||
|
- **模型**: Whisper AI
|
||||||
|
- **功能**:
|
||||||
|
- 语音识别
|
||||||
|
- 语音评测(去除标点符号)
|
||||||
|
- 简体中文转换
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔐 安全配置
|
||||||
|
|
||||||
|
### Token认证
|
||||||
|
- **Header名称**: `Authorization`
|
||||||
|
- **令牌密钥**: `YWFhMzlhOGEtYTdjYi00NTUzLWFhMDct`
|
||||||
|
- **有效期**: 30分钟
|
||||||
|
- **⚠️ 注意**: 生产环境必须修改为随机32位字符串
|
||||||
|
|
||||||
|
### 用户密码策略
|
||||||
|
- **最大错误次数**: 5次
|
||||||
|
- **锁定时间**: 10分钟
|
||||||
|
|
||||||
|
### XSS防护
|
||||||
|
- **过滤开关**: 已启用
|
||||||
|
- **排除链接**: `/system/notice`
|
||||||
|
- **匹配链接**: `/system/*`, `/monitor/*`, `/tool/*`
|
||||||
|
|
||||||
|
### 防盗链
|
||||||
|
- **开关**: 已禁用
|
||||||
|
- **允许域名**: `localhost`, `127.0.0.1`, `ddnai.com`, `www.ddnai.com`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📁 文件上传配置
|
||||||
|
|
||||||
|
### 上传路径
|
||||||
|
- **Windows路径**: `D:\wwwroot\study_web\web\profile`
|
||||||
|
- **实际存储**: `profile/upload/yyyy/MM/dd/文件名`
|
||||||
|
- **数据库路径格式**: `/profile/upload/2025/11/18/xxx.mp4`
|
||||||
|
|
||||||
|
### 文件大小限制
|
||||||
|
- **单个文件**: 2GB
|
||||||
|
- **总请求大小**: 2GB
|
||||||
|
|
||||||
|
### 支持的文件类型
|
||||||
|
- 视频文件(MP4等)
|
||||||
|
- 音频文件(MP3、WAV等)
|
||||||
|
- 图片文件
|
||||||
|
- PDF文档
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🗂️ 重要文件路径
|
||||||
|
|
||||||
|
### 日志和文档
|
||||||
|
- **工作日志**: `log/`
|
||||||
|
- **AI指南**: `log/1-AI指南.md`
|
||||||
|
- **配置清单**: `log/项目配置清单.md` (本文件)
|
||||||
|
- **SQL脚本**: `log/*.sql`
|
||||||
|
|
||||||
|
### 代码目录
|
||||||
|
- **后端代码**: `Study-Vue-redis/ry-study-system/src/main/java/com/ddnai/`
|
||||||
|
- **Mapper XML**: `Study-Vue-redis/ry-study-system/src/main/resources/mapper/`
|
||||||
|
- **前端页面**: `fronted_uniapp/pages/`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔌 外部API接口
|
||||||
|
|
||||||
|
### 待补充
|
||||||
|
> 当发现使用外部API时,在此记录
|
||||||
|
|
||||||
|
```
|
||||||
|
格式示例:
|
||||||
|
### API名称
|
||||||
|
- **接口地址**: https://api.example.com
|
||||||
|
- **API Key**: your-api-key
|
||||||
|
- **用途**: 功能描述
|
||||||
|
- **文档**: 接口文档地址
|
||||||
|
- **添加时间**: 2025-12-12
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🚀 部署环境
|
||||||
|
|
||||||
|
### 本地开发环境
|
||||||
|
- **操作系统**: Windows
|
||||||
|
- **Java版本**: (待确认)
|
||||||
|
- **Maven版本**: (待确认)
|
||||||
|
- **Node.js版本**: (待确认)
|
||||||
|
- **MySQL版本**: (待确认)
|
||||||
|
|
||||||
|
### 生产服务器
|
||||||
|
- **操作系统**: Linux
|
||||||
|
- **服务器IP**: (待补充)
|
||||||
|
- **部署路径**: (待补充)
|
||||||
|
- **注意事项**: 本地运行正常,服务器存在环境差异
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⚙️ 环境变量
|
||||||
|
|
||||||
|
### 待补充
|
||||||
|
> 当配置环境变量时,在此记录
|
||||||
|
|
||||||
|
```
|
||||||
|
格式示例:
|
||||||
|
### 变量名称
|
||||||
|
- **变量名**: ENV_NAME
|
||||||
|
- **值**: value
|
||||||
|
- **用途**: 用途说明
|
||||||
|
- **设置位置**: .env / application.yml / 系统环境变量
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📝 配置文件位置
|
||||||
|
|
||||||
|
### 后端配置
|
||||||
|
- `Study-Vue-redis/ry-study-admin/src/main/resources/application.yml`
|
||||||
|
- `Study-Vue-redis/ry-study-admin/src/main/resources/application-druid.yml`
|
||||||
|
|
||||||
|
### 前端配置
|
||||||
|
- `fronted_uniapp/manifest.json`
|
||||||
|
- `fronted_uniapp/pages.json`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔐 第三方服务
|
||||||
|
|
||||||
|
### 待补充
|
||||||
|
> 当接入第三方服务时,在此记录
|
||||||
|
|
||||||
|
```
|
||||||
|
格式示例:
|
||||||
|
### 服务名称
|
||||||
|
- **服务商**: 阿里云/腾讯云等
|
||||||
|
- **服务类型**: OSS/SMS/邮件等
|
||||||
|
- **配置信息**: endpoint、accessKey等
|
||||||
|
- **用途**: 功能描述
|
||||||
|
- **文档**: 服务文档地址
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🛠️ 框架配置
|
||||||
|
|
||||||
|
### MyBatis配置
|
||||||
|
- **类型别名包**: `com.ddnai.**.domain`
|
||||||
|
- **Mapper扫描**: `classpath*:mapper/**/*Mapper.xml`
|
||||||
|
- **配置文件**: `classpath:mybatis/mybatis-config.xml`
|
||||||
|
|
||||||
|
### PageHelper分页
|
||||||
|
- **方言**: MySQL
|
||||||
|
- **支持方法参数**: true
|
||||||
|
|
||||||
|
### Swagger文档
|
||||||
|
- **开关**: 已启用(⚠️ 生产环境必须关闭)
|
||||||
|
- **访问地址**: `http://localhost:30091/dev-api/swagger-ui.html`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📋 端口占用情况
|
||||||
|
|
||||||
|
| 端口 | 服务名称 | 用途 | 访问地址 |
|
||||||
|
|------|---------|------|---------|
|
||||||
|
| 3306 | MySQL | 数据库 | `localhost:3306` |
|
||||||
|
| 6379 | Redis | 缓存服务 | `localhost:6379` |
|
||||||
|
| 30091 | Spring Boot | 后端API | `http://localhost:30091` |
|
||||||
|
| 30091 | Druid监控 | 数据库监控 | `http://localhost:30091/druid/` |
|
||||||
|
| 5000 | Whisper Server | 语音识别 | `http://localhost:5000` (待确认) |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 💡 使用说明
|
||||||
|
|
||||||
|
### 如何添加新配置
|
||||||
|
1. 在对应的分类下添加信息
|
||||||
|
2. 使用统一的Markdown格式
|
||||||
|
3. 注明添加时间和用途
|
||||||
|
4. 敏感信息可以使用环境变量替代
|
||||||
|
|
||||||
|
### 注意事项
|
||||||
|
- ⚠️ 不要将真实的密钥和密码提交到Git仓库
|
||||||
|
- ⚠️ 生产环境配置要单独管理
|
||||||
|
- ⚠️ 定期更新此文档,保持信息准确
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
*本文件会在开发过程中持续更新*
|
||||||
94
log/删除用户-userId大于200.sql
Normal file
94
log/删除用户-userId大于200.sql
Normal file
|
|
@ -0,0 +1,94 @@
|
||||||
|
-- 1️⃣ 先查看要删除的用户(确认范围)
|
||||||
|
SELECT user_id, user_name, nick_name, register_type, create_time
|
||||||
|
FROM sys_user
|
||||||
|
WHERE user_id > 200 AND del_flag = '0'
|
||||||
|
ORDER BY user_id;
|
||||||
|
|
||||||
|
-- 2️⃣ 查看影响范围(统计)
|
||||||
|
SELECT
|
||||||
|
'用户数' AS 项目,
|
||||||
|
COUNT(*) AS 数量
|
||||||
|
FROM sys_user
|
||||||
|
WHERE user_id > 200 AND del_flag = '0'
|
||||||
|
UNION ALL
|
||||||
|
SELECT
|
||||||
|
'学习记录数',
|
||||||
|
COUNT(*)
|
||||||
|
FROM learning_record
|
||||||
|
WHERE student_id > 200
|
||||||
|
UNION ALL
|
||||||
|
SELECT
|
||||||
|
'学习详情数',
|
||||||
|
COUNT(*)
|
||||||
|
FROM learning_detail
|
||||||
|
WHERE student_id > 200
|
||||||
|
UNION ALL
|
||||||
|
SELECT
|
||||||
|
'考试成绩数',
|
||||||
|
COUNT(*)
|
||||||
|
FROM score
|
||||||
|
WHERE student_id > 200
|
||||||
|
UNION ALL
|
||||||
|
SELECT
|
||||||
|
'班级关联数',
|
||||||
|
COUNT(*)
|
||||||
|
FROM student_class
|
||||||
|
WHERE student_id > 200;
|
||||||
|
|
||||||
|
-- ============================================================
|
||||||
|
-- ⚠️ 确认无误后,执行以下删除操作
|
||||||
|
-- ============================================================
|
||||||
|
|
||||||
|
-- 3️⃣ 删除关联数据(按顺序)
|
||||||
|
|
||||||
|
-- 删除学习详情
|
||||||
|
DELETE FROM learning_detail
|
||||||
|
WHERE student_id > 200;
|
||||||
|
|
||||||
|
-- 删除学习记录
|
||||||
|
DELETE FROM learning_record
|
||||||
|
WHERE student_id > 200;
|
||||||
|
|
||||||
|
-- 删除考试成绩
|
||||||
|
DELETE FROM score
|
||||||
|
WHERE student_id > 200;
|
||||||
|
|
||||||
|
-- 删除班级关联
|
||||||
|
DELETE FROM student_class
|
||||||
|
WHERE student_id > 200;
|
||||||
|
|
||||||
|
-- 删除用户角色关联
|
||||||
|
DELETE FROM sys_user_role
|
||||||
|
WHERE user_id > 200;
|
||||||
|
|
||||||
|
-- 删除课程分配(如果用户是学生)
|
||||||
|
DELETE FROM course_assignment
|
||||||
|
WHERE student_id > 200;
|
||||||
|
|
||||||
|
-- 4️⃣ 最后删除用户表记录
|
||||||
|
DELETE FROM sys_user
|
||||||
|
WHERE user_id > 200 AND del_flag = '0';
|
||||||
|
|
||||||
|
-- 5️⃣ 验证删除结果
|
||||||
|
SELECT
|
||||||
|
'剩余用户数' AS 验证项,
|
||||||
|
COUNT(*) AS 数量
|
||||||
|
FROM sys_user
|
||||||
|
WHERE del_flag = '0';
|
||||||
|
|
||||||
|
-- ============================================================
|
||||||
|
-- 💡 如果想使用逻辑删除(推荐,可恢复),使用以下语句代替
|
||||||
|
-- ============================================================
|
||||||
|
|
||||||
|
/*
|
||||||
|
-- 逻辑删除用户(设置 del_flag = '2')
|
||||||
|
UPDATE sys_user
|
||||||
|
SET del_flag = '2',
|
||||||
|
update_time = NOW()
|
||||||
|
WHERE user_id > 200 AND del_flag = '0';
|
||||||
|
|
||||||
|
-- 验证逻辑删除
|
||||||
|
SELECT user_id, user_name, nick_name, del_flag
|
||||||
|
FROM sys_user
|
||||||
|
WHERE user_id > 200;
|
||||||
|
*/
|
||||||
|
|
@ -1,117 +0,0 @@
|
||||||
-- ====================================
|
|
||||||
-- 清理孤儿用户数据脚本
|
|
||||||
-- 功能:删除那些引用了不存在的用户ID的数据
|
|
||||||
-- 使用场景:当删除sys_user后,清理关联表中的残留数据
|
|
||||||
-- ====================================
|
|
||||||
|
|
||||||
-- 1. 查看孤儿数据统计(执行清理前先查看)
|
|
||||||
-- ====================================
|
|
||||||
|
|
||||||
-- 1.1 查看班级学生关联表中的孤儿数据
|
|
||||||
SELECT '班级学生关联表(study_student_class)孤儿数据' AS 检查项, COUNT(*) AS 孤儿数据条数
|
|
||||||
FROM study_student_class ssc
|
|
||||||
WHERE NOT EXISTS (
|
|
||||||
SELECT 1 FROM sys_user u WHERE u.user_id = ssc.user_id
|
|
||||||
);
|
|
||||||
|
|
||||||
-- 1.2 查看学习记录表中的孤儿数据
|
|
||||||
SELECT '学习记录表(study_learning_record)孤儿数据' AS 检查项, COUNT(*) AS 孤儿数据条数
|
|
||||||
FROM study_learning_record slr
|
|
||||||
WHERE NOT EXISTS (
|
|
||||||
SELECT 1 FROM sys_user u WHERE u.user_id = slr.student_id
|
|
||||||
);
|
|
||||||
|
|
||||||
-- 1.3 查看学习明细表中的孤儿数据
|
|
||||||
SELECT '学习明细表(study_learning_detail)孤儿数据' AS 检查项, COUNT(*) AS 孤儿数据条数
|
|
||||||
FROM study_learning_detail sld
|
|
||||||
WHERE NOT EXISTS (
|
|
||||||
SELECT 1 FROM sys_user u WHERE u.user_id = sld.student_id
|
|
||||||
);
|
|
||||||
|
|
||||||
-- 1.4 查看语音评测表中的孤儿数据
|
|
||||||
SELECT '语音评测表(study_voice_score)孤儿数据' AS 检查项, COUNT(*) AS 孤儿数据条数
|
|
||||||
FROM study_voice_score svs
|
|
||||||
WHERE svs.student_id IS NOT NULL
|
|
||||||
AND NOT EXISTS (
|
|
||||||
SELECT 1 FROM sys_user u WHERE u.user_id = svs.student_id
|
|
||||||
);
|
|
||||||
|
|
||||||
-- ====================================
|
|
||||||
-- 2. 执行清理(请先执行上面的查询确认后再执行清理)
|
|
||||||
-- ====================================
|
|
||||||
|
|
||||||
-- 2.1 清理班级学生关联表
|
|
||||||
DELETE FROM study_student_class
|
|
||||||
WHERE NOT EXISTS (
|
|
||||||
SELECT 1 FROM sys_user u WHERE u.user_id = study_student_class.user_id
|
|
||||||
);
|
|
||||||
|
|
||||||
-- 2.2 清理学习记录表
|
|
||||||
DELETE FROM study_learning_record
|
|
||||||
WHERE NOT EXISTS (
|
|
||||||
SELECT 1 FROM sys_user u WHERE u.user_id = study_learning_record.student_id
|
|
||||||
);
|
|
||||||
|
|
||||||
-- 2.3 清理学习明细表
|
|
||||||
DELETE FROM study_learning_detail
|
|
||||||
WHERE NOT EXISTS (
|
|
||||||
SELECT 1 FROM sys_user u WHERE u.user_id = study_learning_detail.student_id
|
|
||||||
);
|
|
||||||
|
|
||||||
-- 2.4 清理语音评测表
|
|
||||||
DELETE FROM study_voice_score
|
|
||||||
WHERE student_id IS NOT NULL
|
|
||||||
AND NOT EXISTS (
|
|
||||||
SELECT 1 FROM sys_user u WHERE u.user_id = study_voice_score.student_id
|
|
||||||
);
|
|
||||||
|
|
||||||
-- ====================================
|
|
||||||
-- 3. 验证清理结果
|
|
||||||
-- ====================================
|
|
||||||
|
|
||||||
-- 3.1 再次统计孤儿数据(应该为0)
|
|
||||||
SELECT '班级学生关联表' AS 表名, COUNT(*) AS 剩余孤儿数据
|
|
||||||
FROM study_student_class ssc
|
|
||||||
WHERE NOT EXISTS (SELECT 1 FROM sys_user u WHERE u.user_id = ssc.user_id)
|
|
||||||
UNION ALL
|
|
||||||
SELECT '学习记录表', COUNT(*)
|
|
||||||
FROM study_learning_record slr
|
|
||||||
WHERE NOT EXISTS (SELECT 1 FROM sys_user u WHERE u.user_id = slr.student_id)
|
|
||||||
UNION ALL
|
|
||||||
SELECT '学习明细表', COUNT(*)
|
|
||||||
FROM study_learning_detail sld
|
|
||||||
WHERE NOT EXISTS (SELECT 1 FROM sys_user u WHERE u.user_id = sld.student_id)
|
|
||||||
UNION ALL
|
|
||||||
SELECT '语音评测表', COUNT(*)
|
|
||||||
FROM study_voice_score svs
|
|
||||||
WHERE svs.student_id IS NOT NULL
|
|
||||||
AND NOT EXISTS (SELECT 1 FROM sys_user u WHERE u.user_id = svs.student_id);
|
|
||||||
|
|
||||||
-- 3.2 查看当前有效用户统计
|
|
||||||
SELECT
|
|
||||||
'总用户数' AS 统计项,
|
|
||||||
COUNT(*) AS 数量
|
|
||||||
FROM sys_user
|
|
||||||
WHERE user_id != 1 -- 排除管理员
|
|
||||||
UNION ALL
|
|
||||||
SELECT
|
|
||||||
'学生数(按userName数字开头)',
|
|
||||||
COUNT(*)
|
|
||||||
FROM sys_user
|
|
||||||
WHERE user_name REGEXP '^[0-9]' AND user_id != 1
|
|
||||||
UNION ALL
|
|
||||||
SELECT
|
|
||||||
'班级关联学生数',
|
|
||||||
COUNT(DISTINCT user_id)
|
|
||||||
FROM study_student_class;
|
|
||||||
|
|
||||||
-- ====================================
|
|
||||||
-- 使用说明:
|
|
||||||
-- 1. 先执行第1部分,查看有多少孤儿数据
|
|
||||||
-- 2. 确认无误后,执行第2部分进行清理
|
|
||||||
-- 3. 最后执行第3部分,验证清理结果
|
|
||||||
--
|
|
||||||
-- 注意事项:
|
|
||||||
-- - 本脚本会永久删除数据,执行前请备份数据库!
|
|
||||||
-- - 建议在测试环境先验证
|
|
||||||
-- ====================================
|
|
||||||
|
|
@ -1,35 +0,0 @@
|
||||||
-- 批量修复学员remark字段
|
|
||||||
-- 给所有userName以数字开头的用户添加学员标识
|
|
||||||
|
|
||||||
-- 1. 查看哪些用户会被修复
|
|
||||||
SELECT
|
|
||||||
user_id,
|
|
||||||
user_name,
|
|
||||||
nick_name,
|
|
||||||
user_type,
|
|
||||||
remark
|
|
||||||
FROM sys_user
|
|
||||||
WHERE user_name REGEXP '^[0-9]' -- userName以数字开头
|
|
||||||
AND user_id != 1 -- 排除管理员
|
|
||||||
AND (remark IS NULL OR remark NOT LIKE '%注册类型:student%');
|
|
||||||
|
|
||||||
-- 2. 执行修复(请先执行上面的查询确认无误后再执行)
|
|
||||||
UPDATE sys_user
|
|
||||||
SET remark = CONCAT(IFNULL(remark, ''), '注册类型:student')
|
|
||||||
WHERE user_name REGEXP '^[0-9]' -- userName以数字开头
|
|
||||||
AND user_id != 1 -- 排除管理员
|
|
||||||
AND (remark IS NULL OR remark NOT LIKE '%注册类型:student%');
|
|
||||||
|
|
||||||
-- 3. 验证修复结果
|
|
||||||
SELECT
|
|
||||||
user_id,
|
|
||||||
user_name,
|
|
||||||
nick_name,
|
|
||||||
remark
|
|
||||||
FROM sys_user
|
|
||||||
WHERE user_name REGEXP '^[0-9]'
|
|
||||||
AND user_id != 1;
|
|
||||||
|
|
||||||
-- 说明:
|
|
||||||
-- 本脚本会给所有userName以数字开头的用户添加"注册类型:student"标识
|
|
||||||
-- 例如:110, 111, 116 等用户名会被识别为学员
|
|
||||||
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue
Block a user