Parcourir la source

你的提交信息

西格玛许 il y a 1 jour
Parent
commit
3744823f46

+ 0 - 32
AGENTS.md

@@ -1,32 +0,0 @@
-# project overview
-
-this is project overview.
-
-- Language:
-- Build tool:
-- Framework:
-- Testing Framework:
-
-Description of the architecture
-
-project structure describe here
-
-The project uses `.env` for configuration.
-
-List your backing services, such as database, message queue, external services, etc.
-
-- Main database:
-- Table Naming: Singular, prefer `account` instead of `accounts`
-
-The project uses Maven to build and run the project, and some tasks as following:
-
-- Build: `just build`
-- Run: `just start`
-
-For other tasks, the project uses [just](https://github.com/casey/just) as the task runner,
-and the available recipes are as below:
-
-- `just build`: build the project
-
-
-- `8080`: web server listen port, and main page is http://localhost:8080

+ 0 - 126
DEBUG_GUIDE.md

@@ -1,126 +0,0 @@
-# 商户端角色管理菜单树加载问题 - Debug 指南
-
-## 问题现象
-商户端访问"角色管理-新增"时,菜单权限树一直显示"加载中,请稍候",无法正常加载菜单数据。
-
-## 根本原因
-**数据库 `sys_menu` 表缺少 `platform_id` 字段**,导致后端查询时 SQL 报错或返回空结果。
-
-## 技术分析
-
-### 1. 接口调用链
-```
-前端: sj-merchant-web/src/views/system/role/index.vue
-  → handleAdd() 方法
-  → getMenuTreeselect() 
-  → API: GET /system/menu/treeselect
-
-后端: SysMenuController.treeselect()
-  → SysMenuServiceImpl.selectMenuList()
-  → 查询条件包含: .eq(SysMenu::getPlatformId, platformId)
-```
-
-### 2. 平台识别机制
-- 前端配置: `.env.development` 中 `VITE_APP_PLATFORM_CODE="SHANGHUDUAN"`
-- 请求头: `PLATFORM_CODE: SHANGHUDUAN`
-- 后端解析: `PlatformUtils.getId()` → 返回 1(商户端)
-- 平台枚举:
-  - `ADMIN(0, "PINGTAIDUAN", "平台端")`
-  - `MERCHANT(1, "SHANGHUDUAN", "商户端")`
-
-### 3. 问题代码位置
-**SysMenuServiceImpl.java:82-87**
-```java
-int platformId = menu.getPlatformId()==null? PlatformUtils.getId() : menu.getPlatformId();
-menuList = baseMapper.selectVoList(
-    wrapper.eq(SysMenu::getPlatformId, platformId) // ← 这里强制过滤 platform_id
-```
-
-**SysMenu.java:104-105**
-```java
-// 平台ID
-private Integer platformId;  // ← 实体类有字段
-```
-
-**ry_vue_5.X.sql:235-257**
-```sql
-create table sys_menu (
-    menu_id           bigint(20)      not null,
-    menu_name         varchar(50)     not null,
-    -- ... 其他字段
-    remark            varchar(500)    default '',
-    -- ❌ 缺少 platform_id 字段
-    primary key (menu_id)
-);
-```
-
-## 解决方案
-
-### 步骤 1: 执行数据库修复脚本
-```bash
-# 在 MySQL 中执行
-mysql -u root -p your_database < script/sql/add_platform_id_to_menu.sql
-```
-
-### 步骤 2: 为现有菜单分配平台
-根据业务需求,决定哪些菜单属于哪个平台:
-
-```sql
--- 查看当前所有菜单
-SELECT menu_id, menu_name, parent_id FROM sys_menu ORDER BY menu_id;
-
--- 方案 A: 所有菜单都设为平台端(管理端和商户端共享)
-UPDATE sys_menu SET platform_id = 0;
-
--- 方案 B: 区分平台(根据实际业务调整)
--- 平台端菜单(租户管理、系统监控等)
-UPDATE sys_menu SET platform_id = 0 WHERE menu_id IN (6, 2, 109, 113);
-
--- 商户端菜单(用户管理、角色管理等)
-UPDATE sys_menu SET platform_id = 1 WHERE menu_id IN (1, 100, 101, 102, 103, 104, 105);
-```
-
-### 步骤 3: 验证修复
-1. 重启后端服务
-2. 清除浏览器缓存
-3. 商户端登录 → 系统管理 → 角色管理 → 新增
-4. 检查菜单树是否正常加载
-
-## Debug 断点位置
-
-如需进一步调试,可在以下位置打断点:
-
-1. **控制器层**
-   - `SysMenuController.java:87` - 查看返回的菜单列表
-
-2. **服务层**
-   - `SysMenuServiceImpl.java:83` - 查看 SQL 查询条件
-   - `SysMenuServiceImpl.java:87` - 查看 platformId 值
-
-3. **平台工具类**
-   - `PlatformUtils.java:8` - 查看请求头中的 PLATFORM_CODE
-   - `Platform.java:38` - 查看平台 ID 转换逻辑
-
-## 常见问题
-
-### Q1: 执行脚本后仍然加载不出来?
-检查后端日志,查看是否有 SQL 异常或权限问题。
-
-### Q2: 如何确认 platform_id 字段已添加?
-```sql
-DESC sys_menu;
--- 或
-SHOW COLUMNS FROM sys_menu LIKE 'platform_id';
-```
-
-### Q3: 商户端应该看到哪些菜单?
-根据业务设计,通常商户端只能看到 `platform_id = 1` 的菜单。如果需要共享某些菜单,可以考虑:
-- 复制菜单数据,分别设置不同的 platform_id
-- 或修改后端逻辑,支持 `platform_id IN (0, 1)` 的查询
-
-## 相关文件
-- 前端接口定义: `sj-merchant-web/src/api/system/menu/index.ts`
-- 前端页面: `sj-merchant-web/src/views/system/role/index.vue`
-- 后端控制器: `ruoyi-system/src/main/java/org/dromara/system/controller/system/SysMenuController.java`
-- 后端服务: `ruoyi-system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java`
-- 平台工具: `yp-common-platform/src/main/java/org/dromara/common/platform/`

+ 0 - 122
PROBLEM_SUMMARY.md

@@ -1,122 +0,0 @@
-# 商户端角色管理菜单树加载问题 - 完整分析报告
-
-## 问题现象
-商户端访问"系统管理 → 角色管理 → 新增"时,菜单权限树一直显示"加载中,请稍候",无法加载菜单数据。
-而平台端相同功能正常。
-
-## 问题根源
-
-### 核心原因
-**商户端用户的角色分配的菜单,其 `platform_id` 不是 1(商户端),导致查询时被过滤掉。**
-
-### 技术分析
-
-1. **查询逻辑**(`SysMenuServiceImpl.selectMenuList`):
-   ```java
-   // 第一步:权限过滤(非超管用户)
-   if (!LoginHelper.isSuperAdmin(userId)) {
-       wrapper.inSql(SysMenu::getMenuId, baseMapper.buildMenuByUserSql(userId));
-   }
-   
-   // 第二步:平台过滤
-   int platformId = PlatformUtils.getId(); // 商户端返回 1
-   wrapper.eq(SysMenu::getPlatformId, platformId);
-   ```
-
-2. **问题链路**:
-   ```
-   商户端用户登录
-   → 请求头携带 PLATFORM_CODE: "SHANGHUDUAN"
-   → PlatformUtils.getId() 返回 1
-   → 查询条件:
-      - 用户角色分配的菜单(通过 sys_role_menu)
-      - AND platform_id = 1
-   → 但角色分配的菜单都是 platform_id = 0 或 NULL
-   → 结果为空
-   ```
-
-3. **数据验证结果**:
-   - 数据库中 `platform_id = 0` 有 134 条菜单(平台端)
-   - 数据库中 `platform_id = 1` 有 6 条菜单(商户端)
-   - 商户端用户角色分配的菜单:`platform_id = NULL` 或 `0`,没有 `platform_id = 1` 的
-
-## 解决方案
-
-### 方案 1:为商户端角色重新分配菜单(推荐)
-
-```sql
--- 1. 确认商户端用户ID和角色ID
-SET @merchant_user_id = 2038434195944886273;
-
-SELECT sur.role_id, sr.role_name
-FROM sys_user_role sur
-LEFT JOIN sys_role sr ON sur.role_id = sr.role_id
-WHERE sur.user_id = @merchant_user_id;
-
--- 2. 删除旧的菜单权限
-SET @merchant_role_id = 100; -- 替换为实际的角色ID
-DELETE FROM sys_role_menu WHERE role_id = @merchant_role_id;
-
--- 3. 为角色分配所有 platform_id=1 的菜单
-INSERT INTO sys_role_menu (role_id, menu_id)
-SELECT @merchant_role_id, menu_id
-FROM sys_menu
-WHERE platform_id = 1;
-```
-
-### 方案 2:将现有菜单改为商户端可用
-
-如果商户端需要的菜单功能和平台端一致,可以将这些菜单的 `platform_id` 改为 1:
-
-```sql
--- 将系统管理相关菜单设为商户端
-UPDATE sys_menu SET platform_id = 1 
-WHERE menu_id IN (
-    1,    -- 系统管理
-    100,  -- 用户管理
-    101,  -- 角色管理
-    102,  -- 菜单管理
-    103,  -- 部门管理
-    -- ... 其他需要的菜单ID
-);
-```
-
-### 方案 3:同时支持多平台(修改代码)
-
-如果希望某些菜单在两个平台都可见,需要修改查询逻辑,支持 `platform_id IN (0, 1)` 或引入菜单平台关联表。
-
-## 验证步骤
-
-1. **执行修复SQL**
-2. **验证数据**:
-   ```sql
-   -- 查看角色菜单的平台分布
-   SELECT sm.platform_id, COUNT(*) as count
-   FROM sys_role_menu srm
-   LEFT JOIN sys_menu sm ON srm.menu_id = sm.menu_id
-   WHERE srm.role_id = @merchant_role_id
-   GROUP BY sm.platform_id;
-   
-   -- 应该显示 platform_id = 1 有数据
-   ```
-
-3. **重启后端服务**
-4. **清除浏览器缓存**
-5. **商户端登录测试**:系统管理 → 角色管理 → 新增
-
-## 相关文件
-
-- 前端页面:`sj-merchant-web/src/views/system/role/index.vue`
-- 前端API:`sj-merchant-web/src/api/system/menu/index.ts`
-- 后端控制器:`ruoyi-system/.../SysMenuController.java:84-89`
-- 后端服务:`ruoyi-system/.../SysMenuServiceImpl.java:73-93`
-- 平台工具:`yp-common-platform/.../PlatformUtils.java`
-- 修复脚本:`script/sql/fix_merchant_role_permission.sql`
-
-## 总结
-
-问题不在于代码逻辑或 `platform_id` 字段缺失,而是**数据配置问题**:
-- 商户端用户的角色分配的菜单权限(`sys_role_menu`)指向的菜单,其 `platform_id` 不是商户端的值(1)
-- 查询时先通过角色过滤,再通过平台过滤,两个条件的交集为空
-
-修复方式:确保商户端角色分配的菜单,其 `platform_id = 1`。

+ 0 - 189
README.md

@@ -1,189 +0,0 @@
-<img src="https://foruda.gitee.com/images/1679673773341074847/178e8451_1766278.png" width="50%" height="50%">
-<div style="height: 10px; clear: both;"></div>
-
-- - -
-## 平台简介
-
-[![码云Gitee](https://gitee.com/dromara/RuoYi-Vue-Plus/badge/star.svg?theme=blue)](https://gitee.com/dromara/RuoYi-Vue-Plus)
-[![GitHub](https://img.shields.io/github/stars/dromara/RuoYi-Vue-Plus.svg?style=social&label=Stars)](https://github.com/dromara/RuoYi-Vue-Plus)
-[![Star](https://gitcode.com/dromara/RuoYi-Vue-Plus/star/badge.svg)](https://gitcode.com/dromara/RuoYi-Vue-Plus)
-[![License](https://img.shields.io/badge/License-MIT-blue.svg)](https://gitee.com/dromara/RuoYi-Vue-Plus/blob/5.X/LICENSE)
-<br>
-[![RuoYi-Vue-Plus](https://img.shields.io/badge/RuoYi_Vue_Plus-5.5.3-success.svg)](https://gitee.com/dromara/RuoYi-Vue-Plus)
-[![Spring Boot](https://img.shields.io/badge/Spring%20Boot-3.5-blue.svg)]()
-[![JDK-17](https://img.shields.io/badge/JDK-17-green.svg)]()
-[![JDK-21](https://img.shields.io/badge/JDK-21-green.svg)]()
-
-> Dromara RuoYi-Vue-Plus 是重写 RuoYi-Vue 针对 `分布式集群与多租户` 场景全方位升级(不兼容原框架)
-
-> 项目代码、文档 均开源免费可商用 遵循开源协议在项目中保留开源协议文件即可<br>
-活到老写到老 为兴趣而开源 为学习而开源 为让大家真正可以学到技术而开源
-
-> 系统演示: [传送门](https://plus-doc.dromara.org/#/common/demo_system)
-
-> 官方前端项目地址: [gitee](https://gitee.com/JavaLionLi/plus-ui) - [github](https://github.com/JavaLionLi/plus-ui) - [gitcode](https://gitcode.com/dromara/plus-ui)<br>
-> 成员前端项目地址: 基于vben5 [ruoyi-plus-vben5](https://gitee.com/dapppp/ruoyi-plus-vben5)<br>
-> 成员前端项目地址: 基于soybean [ruoyi-plus-soybean](https://gitee.com/xlsea/ruoyi-plus-soybean)<br>
-> 成员项目地址: 删除多租户与工作流 [RuoYi-Vue-Plus-Single](https://gitee.com/ColorDreams/RuoYi-Vue-Plus-Single)<br>
-
-> 文档地址: [plus-doc](https://plus-doc.dromara.org) 国内加速: [plus-doc.top](https://plus-doc.top)
-
-## 赞助商
-
-MaxKey 业界领先单点登录产品 - https://gitee.com/dromara/MaxKey <br>
-CCFlow 驰聘低代码-流程-表单 - https://gitee.com/opencc/RuoYi-JFlow <br>
-数舵科技 软件定制开发APP小程序等 - https://www.shuduokeji.com/ <br>
-引迈信息 软件开发平台 - https://www.jnpfsoft.com/index.html?from=plus-doc <br>
-Mall4J 高质量Java商城系统 - https://www.mall4j.com/cn/?statId=11 <br>
-aizuda flowlong 工作流 - https://gitee.com/aizuda/flowlong <br>
-Ruoyi-Plus-Uniapp - https://ruoyi.plus <br>
-Topiam IAM/IDaaS身份管理平台 - https://www.topiam.cn/ <br>
-
-[如何成为赞助商 加群联系作者详谈 每日PV2500-3000 IP1700-2500](https://plus-doc.dromara.org/#/common/add_group)
-
-# 本框架与RuoYi的功能差异
-
-| 功能          | 本框架                                                                                                               | RuoYi                                                                              |
-|-------------|-------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------|
-| 前端项目        | 采用 Vue3 + TS + ElementPlus 重写                                                                                     | 基于Vue2/Vue3 + JS                                                                   | 
-| 后端项目结构      | 采用插件化 + 扩展包形式 结构解耦 易于扩展                                                                                           | 模块相互注入耦合严重难以扩展                                                                     | 
-| 后端代码风格      | 严格遵守Alibaba规范与项目统一配置的代码格式化                                                                                        | 代码书写与常规结构不同阅读障碍大                                                                   |
-| Web容器       | 采用 Undertow 基于 XNIO 的高性能容器                                                                                        | 采用 Tomcat                                                                          |
-| 权限认证        | 采用 Sa-Token、Jwt 静态使用功能齐全 低耦合 高扩展                                                                                  | Spring Security 配置繁琐扩展性极差                                                          |
-| 权限注解        | 采用 Sa-Token 支持注解 登录校验、角色校验、权限校验、二级认证校验、HttpBasic校验、忽略校验<br/>角色与权限校验支持多种条件 如 `AND` `OR` 或 `权限 OR 角色` 等复杂表达式        | 只支持是否存在匹配                                                                          |
-| 三方鉴权        | 采用 JustAuth 第三方登录组件 支持微信、钉钉等数十种三方认证                                                                               | 无                                                                                  |
-| 关系数据库支持     | 原生支持 MySQL、Oracle、PostgreSQL、SQLServer<br/>可同时使用异构切换(支持其他 mybatis-plus 支持的所有数据库 只需要增加jdbc依赖即可使用 达梦金仓等均有成功案例)      | 支持 Mysql、Oracle 不支持同时使用、不支持异构切换                                                    |
-| 缓存数据库       | 支持 Redis 5-7 支持大部分新功能特性 如 分布式限流、分布式队列                                                                             | Redis 简单 get set 支持                                                                |
-| Redis客户端    | 采用 Redisson Redis官方推荐 基于Netty的客户端工具<br/>支持Redis 90%以上的命令 底层优化规避很多不正确的用法 例如: keys被转换为scan<br/>支持单机、哨兵、单主集群、多主集群等模式 | Lettuce + RedisTemplate 支持模式少 工具使用繁琐<br/>连接池采用 common-pool Bug多经常性出问题              |
-| 缓存注解        | 采用 Spring-Cache 注解 对其扩展了实现支持了更多功能<br/>例如 过期时间 最大空闲时间 组最大长度等 只需一个注解即可完成数据自动缓存                                      | 需手动编写Redis代码逻辑                                                                     |
-| ORM框架       | 采用 Mybatis-Plus 基于对象几乎不用写SQL全java操作 功能强大插件众多<br/>例如多租户插件 分页插件 乐观锁插件等等                                             | 采用 Mybatis 基于XML需要手写SQL                                                            |
-| SQL监控       | 采用 p6spy 可输出完整SQL与执行时间监控                                                                                          | log输出 需手动拼接sql与参数无法快速查看调试问题                                                        |
-| 数据分页        | 采用 Mybatis-Plus 分页插件<br/>框架对其进行了扩展 对象化分页对象 支持多种方式传参 支持前端多排序 复杂排序                                                  | 采用 PageHelper 仅支持单查询分页 参数只能从param传 只能单排序 功能扩展性差 体验不好                               |
-| 数据权限        | 采用 Mybatis-Plus 插件 自行分析拼接SQL 无感式过滤<br/>只需为Mapper设置好注解条件 支持多种自定义 不限于部门角色                                           | 采用 注解+aop 实现 基于部门角色 生成的sql兼容性差 不支持其他业务扩展<br/>生成sql后需手动拼接到具体业务sql上 对于多个Mapper查询不起作用 |
-| 数据脱敏        | 采用 注解 + jackson 序列化期间脱敏 支持不同模块不同的脱敏条件<br/>支持多种策略 如身份证、手机号、地址、邮箱、银行卡等 可自行扩展                                        | 无                                                                                  |
-| 数据加解密       | 采用 注解 + mybatis 拦截器 对存取数据期间自动加解密<br/>支持多种策略 如BASE64、AES、RSA、SM2、SM4等                                              | 无                                                                                  |
-| 接口传输加密      | 采用 动态 AES + RSA 加密请求 body 每一次请求秘钥都不同大幅度降低可破解性                                                                     | 无                                                                                  |
-| 数据翻译        | 采用 注解 + jackson 序列化期间动态修改数据 数据进行翻译<br/>支持多种模式: `映射翻译` `直接翻译` `其他扩展条件翻译` 接口化两步即可完成自定义扩展 内置多种翻译实现                   | 无                                                                                  |
-| 多数据源框架      | 采用 dynamic-datasource 支持市面大部分数据库<br/>通过yml配置即可动态管理异构不同种类的数据库 也可通过前端页面添加数据源<br/>支持spel表达式从请求头参数等条件切换数据源            | 基于 druid 手动编写代码配置数据源 配置繁琐 支持性差                                                     |
-| 多数据源事务      | 采用 dynamic-datasource 支持多数据源不同种类的数据库事务回滚                                                                          | 不支持                                                                                |
-| 数据库连接池      | 采用 HikariCP Spring官方内置连接池 配置简单 以性能与稳定性闻名天下                                                                        | 采用 druid bug众多 社区维护差 活跃度低 配置众多繁琐性能一般                                               |
-| 数据库主键       | 采用 雪花ID 基于时间戳的 有序增长 唯一ID 再也不用为分库分表 数据合并主键冲突重复而发愁                                                                  | 采用 数据库自增ID 支持数据量有限 不支持多数据源主键唯一                                                     |
-| WebSocket协议 | 基于 Spring 封装的 WebSocket 协议 扩展了Token鉴权与分布式会话同步 不再只是基于单机的废物                                                         | 无                                                                                  |
-| SSE推送       | 采用 Spring SSE 实现 扩展了Token鉴权与分布式会话同步                                                                               | 无                                                                                  |
-| 序列化         | 采用 Jackson Spring官方内置序列化 靠谱!!!                                                                                    | 采用 fastjson bugjson 远近闻名                                                           | 
-| 分布式幂等       | 参考美团GTIS防重系统简化实现(细节可看文档)                                                                                          | 手动编写注解基于aop实现                                                                      |
-| 分布式锁        | 采用 Lock4j 底层基于 Redisson                                                                                           | 无                                                                                  |
-| 分布式任务调度     | 采用 SnailJob 天生支持分布式 统一的管理中心 支持多种数据库 支持分片重试DAG任务流等                                                                 | 采用 Quartz 基于数据库锁性能差 集群需要做很多配置与改造                                                   | 
-| 文件存储        | 采用 Minio 分布式文件存储 天生支持多机、多硬盘、多分片、多副本存储<br/>支持权限管理 安全可靠 文件可加密存储                                                     | 采用 本机文件存储 文件裸漏 易丢失泄漏 不支持集群有单点效应                                                    |
-| 云存储         | 采用 AWS S3 协议客户端 支持 七牛、阿里、腾讯 等一切支持S3协议的厂家                                                                          | 不支持                                                                                |
-| 短信          | 采用 sms4j 短信融合包 支持数十种短信厂家 只需在yml配置好厂家密钥即可使用 可多厂家共用                                                                 | 不支持                                                                                |
-| 邮件          | 采用 mail-api 通用协议支持大部分邮件厂商                                                                                         | 不支持                                                                                |
-| 接口文档        | 采用 SpringDoc、javadoc 无注解零入侵基于java注释<br/>只需把注释写好 无需再写一大堆的文档注解了                                                     | 采用 Springfox 已停止维护 需要编写大量的注解来支持文档生成                                                | 
-| 校验框架        | 采用 Validation 支持注解与工具类校验 注解支持国际化                                                                                  | 仅支持注解 且注解不支持国际化                                                                    |
-| Excel框架     | 采用 FastExcel(原Alibaba EasyExcel) 基于插件化<br/>框架对其增加了很多功能 例如 自动合并相同内容 自动排列布局 字典翻译等                                   | 基于 POI 手写实现 功能有限 复杂 扩展性差                                                           |
-| 工作流支持       | 支持各种复杂审批 转办 委派 加减签 会签 或签 票签 等功能                                                                                   | 无                                                                                  |
-| 工具类框架       | 采用 Hutool、Lombok 上百种工具覆盖90%的使用需求 基于注解自动生成 get set 等简化框架大量代码                                                       | 手写工具稳定性差易出问题 工具数量有限 代码臃肿需自己手写 get set 等                                            | 
-| 监控框架        | 采用 SpringBoot-Admin 基于SpringBoot官方 actuator 探针机制<br/>实时监控服务状态 框架还为其扩展了在线日志查看监控                                    | 无                                                                                  | 
-| 链路追踪        | 采用 Apache SkyWalking 还在为请求不知道去哪了 到哪出了问题而烦恼吗<br/>用了它即可实时查看请求经过的每一处每一个节点                                            | 无                                                                                  |
-| 代码生成器       | 只需设计好表结构 一键生成所有crud代码与页面<br/>降低80%的开发量 把精力都投入到业务设计上<br/>框架为其适配MP、SpringDoc规范化代码 同时支持动态多数据源代码生成                    | 代码生成原生结构 只支持单数据源生成                                                                 |
-| 部署方式        | 支持 Docker 编排 一键搭建所有环境 让开发人员从此不再为搭建环境而烦恼                                                                           | 原生jar部署 其他环境需手动下载安装 自行搭建                                                           | 
-| 项目路径修改      | 提供详细的修改方案文档 并为其做了一些改动 非常简单即可修改成自己想要的                                                                              | 需要做很多改造 文档说明有限                                                                     |
-| 国际化         | 基于请求头动态返回不同语种的文本内容 开发难度低 有对应的工具类 支持大部分注解内容国际化                                                                     | 只提供基础功能 其他需自行编写扩展                                                                  |
-| 代码单例测试      | 提供单例测试 使用方式编写方法与maven多环境单测插件                                                                                      | 只提供基础功能 其他需自行编写扩展                                                                  |
-| Demo案例      | 提供框架功能的实际使用案例 单独一个模块提供了很多很全                                                                                       | 无                                                                                  |
-
-
-## 本框架与RuoYi的业务差异
-
-| 业务     | 功能说明                                                                 | 本框架 | RuoYi            |
-|--------|----------------------------------------------------------------------|-----|------------------|
-| 租户管理   | 系统内租户的管理 如:租户套餐、过期时间、用户数量、企业信息等                                      | 支持  | 无                |
-| 租户套餐管理 | 系统内租户所能使用的套餐管理 如:套餐内所包含的菜单等                                          | 支持  | 无                |
-| 客户端管理  | 系统内对接的所有客户端管理 如: pc端、小程序端等<br>支持动态授权登录方式 如: 短信登录、密码登录等 支持动态控制token时效 | 支持  | 无                |
-| 用户管理   | 用户的管理配置 如:新增用户、分配用户所属部门、角色、岗位等                                       | 支持  | 支持               |
-| 部门管理   | 配置系统组织机构(公司、部门、小组) 树结构展现支持数据权限                                       | 支持  | 支持               |
-| 岗位管理   | 配置系统用户所属担任职务                                                         | 支持  | 支持               |
-| 菜单管理   | 配置系统菜单、操作权限、按钮权限标识等                                                  | 支持  | 支持               |
-| 角色管理   | 角色菜单权限分配、设置角色按机构进行数据范围权限划分                                           | 支持  | 支持               |
-| 字典管理   | 对系统中经常使用的一些较为固定的数据进行维护                                               | 支持  | 支持               |
-| 参数管理   | 对系统动态配置常用参数                                                          | 支持  | 支持               |
-| 通知公告   | 系统通知公告信息发布维护                                                         | 支持  | 支持               |
-| 操作日志   | 系统正常操作日志记录和查询 系统异常信息日志记录和查询                                          | 支持  | 支持               |
-| 登录日志   | 系统登录日志记录查询包含登录异常                                                     | 支持  | 支持               |
-| 文件管理   | 系统文件展示、上传、下载、删除等管理                                                   | 支持  | 无                |
-| 文件配置管理 | 系统文件上传、下载所需要的配置信息动态添加、修改、删除等管理                                       | 支持  | 无                |
-| 在线用户管理 | 已登录系统的在线用户信息监控与强制踢出操作                                                | 支持  | 支持               |
-| 定时任务   | 运行报表、任务管理(添加、修改、删除)、日志管理、执行器管理等                                      | 支持  | 仅支持任务与日志管理       |
-| 代码生成   | 多数据源前后端代码的生成(java、html、xml、sql)支持CRUD下载                              | 支持  | 仅支持单数据源          |
-| 系统接口   | 根据业务代码自动生成相关的api接口文档                                                 | 支持  | 支持               |
-| 服务监控   | 监视集群系统CPU、内存、磁盘、堆栈、在线日志、Spring相关配置等                                  | 支持  | 仅支持单机CPU、内存、磁盘监控 |
-| 缓存监控   | 对系统的缓存信息查询,命令统计等。                                                    | 支持  | 支持               |
-| 使用案例   | 系统的一些功能案例                                                            | 支持  | 不支持              |
-
-## 参考文档
-
-使用框架前请仔细阅读文档重点注意事项
-<br>
->[初始化项目 必看](https://plus-doc.dromara.org/#/ruoyi-vue-plus/quickstart/init)
->>[https://plus-doc.dromara.org/#/ruoyi-vue-plus/quickstart/init](https://plus-doc.dromara.org/#/ruoyi-vue-plus/quickstart/init)
->
->[专栏与视频 入门必看](https://plus-doc.dromara.org/#/common/column)
->>[https://plus-doc.dromara.org/#/common/column](https://plus-doc.dromara.org/#/common/column)
->
->[部署项目 必看](https://plus-doc.dromara.org/#/ruoyi-vue-plus/quickstart/deploy)
->>[https://plus-doc.dromara.org/#/ruoyi-vue-plus/quickstart/deploy](https://plus-doc.dromara.org/#/ruoyi-vue-plus/quickstart/deploy)
->
->[如何加群](https://plus-doc.dromara.org/#/common/add_group)
->>[https://plus-doc.dromara.org/#/common/add_group](https://plus-doc.dromara.org/#/common/add_group)
->
->[参考文档 Wiki](https://plus-doc.dromara.org)
->>[https://plus-doc.dromara.org](https://plus-doc.dromara.org)
-
-## 软件架构图
-
-![Plus部署架构图](https://foruda.gitee.com/images/1678981882624240692/ae2a3f3e_1766278.png "Plus部署架构图.png")
-
-## 如何参与贡献
-
-[参与贡献的方式 https://plus-doc.dromara.org/#/common/contribution](https://plus-doc.dromara.org/#/common/contribution)
-
-## 捐献作者
-作者为兼职做开源,平时还需要工作,如果帮到了您可以请作者吃个盒饭  
-<img src="https://foruda.gitee.com/images/1678975784848381069/d8661ed9_1766278.png" width="300px" height="450px" />
-<img src="https://foruda.gitee.com/images/1678975801230205215/6f96229d_1766278.png" width="300px" height="450px" />
-
-## 演示图例
-
-|                                                                                            |                                                                                            |
-|--------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------|
-| ![输入图片说明](https://foruda.gitee.com/images/1680077524361362822/270bb429_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680077619939771291/989bf9b6_1766278.png "屏幕截图") |
-| ![输入图片说明](https://foruda.gitee.com/images/1680077681751513929/1c27c5bd_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680077721559267315/74d63e23_1766278.png "屏幕截图") |
-| ![输入图片说明](https://foruda.gitee.com/images/1680077765638904515/1b75d4a6_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680078026375951297/eded7a4b_1766278.png "屏幕截图") |
-| ![输入图片说明](https://foruda.gitee.com/images/1680078237104531207/0eb1b6a7_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680078254306078709/5931e22f_1766278.png "屏幕截图") |
-| ![输入图片说明](https://foruda.gitee.com/images/1680078287971528493/0b9af60a_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680078308138770249/8d3b6696_1766278.png "屏幕截图") |
-| ![输入图片说明](https://foruda.gitee.com/images/1680078352553634393/db5ef880_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680078378238393374/601e4357_1766278.png "屏幕截图") |
-| ![输入图片说明](https://foruda.gitee.com/images/1680078414983206024/2aae27c1_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680078446738419874/ecce7d59_1766278.png "屏幕截图") |
-| ![输入图片说明](https://foruda.gitee.com/images/1680078475971341775/149e8634_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680078491666717143/3fadece7_1766278.png "屏幕截图") |
-| ![输入图片说明](https://foruda.gitee.com/images/1680078558863188826/fb8ced2a_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680078574561685461/ae68a0b2_1766278.png "屏幕截图") |
-| ![输入图片说明](https://foruda.gitee.com/images/1680078594932772013/9d8bfec6_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680078626493093532/fcfe4ff6_1766278.png "屏幕截图") |
-| ![输入图片说明](https://foruda.gitee.com/images/1680078643608812515/0295bd4f_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680078685196286463/d7612c81_1766278.png "屏幕截图") |
-| ![输入图片说明](https://foruda.gitee.com/images/1680078703877318597/56fce0bc_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680078716586545643/b6dbd68f_1766278.png "屏幕截图") |
-| ![输入图片说明](https://foruda.gitee.com/images/1680078734103217688/eb1e6aa6_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680078759131415480/73c525d8_1766278.png "屏幕截图") |
-| ![输入图片说明](https://foruda.gitee.com/images/1680078779416197879/75e3ed02_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680078802329118061/77e10915_1766278.png "屏幕截图") |
-| ![输入图片说明](https://foruda.gitee.com/images/1680078893627848351/34a1c342_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680078928175016986/f126ec4a_1766278.png "屏幕截图") |
-| ![输入图片说明](https://foruda.gitee.com/images/1680078941718318363/b68a0f72_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680078963175518631/3bb769a1_1766278.png "屏幕截图") |
-| ![输入图片说明](https://foruda.gitee.com/images/1735829153637063344/3c21fd4c_1419627.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1735829181303499815/4522cefa_1419627.png "屏幕截图") |
-| ![输入图片说明](https://foruda.gitee.com/images/1735829377205259767/76a705d7_1419627.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1722959592856812900/e2d0d342_1419627.png "屏幕截图") |
-| ![输入图片说明](https://foruda.gitee.com/images/1680079274333484664/4dfdc7c0_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680079290467458224/d6715fcf_1766278.png "屏幕截图") |
-
-
-
-
-
-
-
-
-
-
-
-

+ 0 - 246
TREESELECT_EXECUTION_FLOW.md

@@ -1,246 +0,0 @@
-# /system/menu/treeselect 接口执行流程详解
-
-## 完整执行顺序
-
-### 1. 控制器层 - SysMenuController.treeselect()
-**位置**: `SysMenuController.java:84-89`
-
-```java
-@SaCheckPermission("system:menu:query")  // ← 步骤1: 权限校验
-@GetMapping("/treeselect")
-public R<List<Tree<Long>>> treeselect(SysMenuBo menu) {
-    // 步骤2: 查询菜单列表
-    List<SysMenuVo> menus = menuService.selectMenuList(menu, LoginHelper.getUserId());
-    
-    // 步骤3: 构建树形结构
-    return R.ok(menuService.buildMenuTreeSelect(menus));
-}
-```
-
-**执行步骤**:
-1. **权限校验**: `@SaCheckPermission("system:menu:query")` - 检查用户是否有 `system:menu:query` 权限
-2. **获取用户ID**: `LoginHelper.getUserId()` - 从当前登录上下文获取用户ID
-3. **调用服务层**: `menuService.selectMenuList(menu, userId)`
-4. **构建树结构**: `menuService.buildMenuTreeSelect(menus)`
-5. **返回结果**: 包装成 `R<List<Tree<Long>>>` 返回
-
----
-
-### 2. 服务层 - SysMenuServiceImpl.selectMenuList()
-**位置**: `SysMenuServiceImpl.java:73-93`
-
-```java
-public List<SysMenuVo> selectMenuList(SysMenuBo menu, Long userId) {
-    List<SysMenuVo> menuList;
-    LambdaQueryWrapper<SysMenu> wrapper = new LambdaQueryWrapper<>();
-    
-    // ========== 步骤A: 权限过滤 ==========
-    if (!LoginHelper.isSuperAdmin(userId)) {
-        // 非超管用户,需要通过角色过滤菜单
-        wrapper.inSql(SysMenu::getMenuId, baseMapper.buildMenuByUserSql(userId));
-    }
-    
-    // ========== 步骤B: 平台过滤 ==========
-    int platformId = menu.getPlatformId()==null? PlatformUtils.getId() : menu.getPlatformId();
-    
-    // ========== 步骤C: 构建查询条件并执行 ==========
-    menuList = baseMapper.selectVoList(
-        wrapper.like(StringUtils.isNotBlank(menu.getMenuName()), SysMenu::getMenuName, menu.getMenuName())
-            .eq(StringUtils.isNotBlank(menu.getVisible()), SysMenu::getVisible, menu.getVisible())
-            .eq(StringUtils.isNotBlank(menu.getStatus()), SysMenu::getStatus, menu.getStatus())
-            .eq(SysMenu::getPlatformId, platformId)  // ← 关键:平台过滤
-            .eq(StringUtils.isNotBlank(menu.getMenuType()), SysMenu::getMenuType, menu.getMenuType())
-            .eq(ObjectUtil.isNotNull(menu.getParentId()), SysMenu::getParentId, menu.getParentId())
-            .orderByAsc(SysMenu::getParentId)
-            .orderByAsc(SysMenu::getOrderNum)
-    );
-    
-    return menuList;
-}
-```
-
-**详细执行流程**:
-
-#### 步骤A: 权限过滤(非超管用户)
-```java
-if (!LoginHelper.isSuperAdmin(userId)) {
-    wrapper.inSql(SysMenu::getMenuId, baseMapper.buildMenuByUserSql(userId));
-}
-```
-
-**生成的SQL子查询** (`buildMenuByUserSql`):
-```sql
-SELECT menu_id 
-FROM sys_role_menu 
-WHERE role_id IN (
-    SELECT sur.role_id 
-    FROM sys_user_role sur
-    LEFT JOIN sys_role sr ON sr.role_id = sur.role_id
-    WHERE sur.user_id = ? 
-      AND sr.status = '0'
-)
-```
-
-**作用**: 获取该用户所有角色分配的菜单ID列表
-
-#### 步骤B: 平台过滤
-```java
-int platformId = PlatformUtils.getId();
-```
-
-**执行流程**:
-1. `PlatformUtils.getId()` 调用
-2. 从请求头获取 `PLATFORM_CODE`
-3. 根据 `PLATFORM_CODE` 转换为平台ID:
-   - `"PINGTAIDUAN"` → 0 (平台端)
-   - `"SHANGHUDUAN"` → 1 (商户端)
-
-#### 步骤C: 最终SQL查询
-
-**商户端用户的完整SQL**:
-```sql
-SELECT * 
-FROM sys_menu
-WHERE menu_id IN (
-    -- 用户角色分配的菜单ID列表
-    SELECT menu_id FROM sys_role_menu WHERE role_id IN (...)
-)
-AND platform_id = 1  -- 商户端
-ORDER BY parent_id, order_num
-```
-
-**关键点**: 这是一个 **AND 条件**,必须同时满足:
-- 菜单ID在用户角色分配的列表中
-- 菜单的 platform_id = 1
-
----
-
-### 3. 数据层 - SysMenuMapper
-**位置**: `SysMenuMapper.java`
-
-使用 MyBatis-Plus 的 `LambdaQueryWrapper` 自动生成SQL并执行。
-
----
-
-### 4. 树结构构建 - buildMenuTreeSelect()
-**位置**: `SysMenuServiceImpl.java:250-265`
-
-```java
-public List<Tree<Long>> buildMenuTreeSelect(List<SysMenuVo> menus) {
-    if (CollUtil.isEmpty(menus)) {
-        return CollUtil.newArrayList();  // ← 如果查询结果为空,返回空列表
-    }
-    return TreeBuildUtils.build(menus, (menu, tree) -> {
-        tree.setId(menu.getMenuId())
-            .setParentId(menu.getParentId())
-            .setName(menu.getMenuName())
-            .setWeight(menu.getOrderNum());
-        // ... 设置其他属性
-    });
-}
-```
-
----
-
-## 为什么商户端查不到数据?
-
-### 问题定位
-
-根据执行流程,商户端查询的SQL实际上是:
-
-```sql
-SELECT * 
-FROM sys_menu
-WHERE menu_id IN (
-    -- 步骤1: 获取用户角色分配的菜单
-    SELECT menu_id FROM sys_role_menu 
-    WHERE role_id IN (
-        SELECT role_id FROM sys_user_role WHERE user_id = 2038434195944886273
-    )
-)
-AND platform_id = 1  -- 步骤2: 过滤商户端菜单
-```
-
-### 问题原因
-
-**两个条件的交集为空**:
-
-1. **步骤1结果**: 用户角色分配的菜单(假设有 100 条)
-   - 这些菜单的 `platform_id` 可能是 0、NULL 或其他值
-
-2. **步骤2过滤**: `platform_id = 1`
-   - 只保留商户端菜单
-
-3. **交集**: 如果步骤1的100条菜单中,没有一条的 `platform_id = 1`
-   - 最终结果为空
-
-### 验证方法
-
-执行以下SQL验证:
-
-```sql
--- 查看用户角色分配的菜单的平台分布
-SELECT sm.platform_id, COUNT(*) as count
-FROM sys_user_role sur
-LEFT JOIN sys_role_menu srm ON sur.role_id = srm.role_id
-LEFT JOIN sys_menu sm ON srm.menu_id = sm.menu_id
-WHERE sur.user_id = 2038434195944886273
-GROUP BY sm.platform_id;
-```
-
-**如果结果显示**:
-- `platform_id = 0`: 100 条
-- `platform_id = 1`: 0 条
-
-**说明**: 用户角色分配的菜单都是平台端的,没有商户端的,所以查询结果为空。
-
----
-
-## 解决方案
-
-### 方案1: 修改菜单数据(推荐)
-
-将用户角色需要的菜单改为 `platform_id = 1`:
-
-```sql
-UPDATE sys_menu SET platform_id = 1 
-WHERE menu_id IN (
-    SELECT menu_id FROM sys_role_menu 
-    WHERE role_id IN (
-        SELECT role_id FROM sys_user_role 
-        WHERE user_id = 2038434195944886273
-    )
-);
-```
-
-### 方案2: 重新分配角色菜单
-
-删除旧的菜单权限,分配新的 `platform_id = 1` 的菜单:
-
-```sql
--- 1. 获取角色ID
-SELECT role_id FROM sys_user_role WHERE user_id = 2038434195944886273;
-
--- 2. 删除旧权限
-DELETE FROM sys_role_menu WHERE role_id = ?;
-
--- 3. 分配新权限
-INSERT INTO sys_role_menu (role_id, menu_id)
-SELECT ?, menu_id FROM sys_menu WHERE platform_id = 1;
-```
-
----
-
-## 调试建议
-
-在以下位置添加日志:
-
-1. **SysMenuServiceImpl.java:82** - 查看 `platformId` 的值
-2. **SysMenuServiceImpl.java:92** - 查看 `menuList.size()`
-3. **PlatformUtils.java:8** - 查看请求头中的 `PLATFORM_CODE`
-
-```java
-log.info("查询菜单 - userId={}, platformId={}, isSuperAdmin={}", 
-    userId, platformId, LoginHelper.isSuperAdmin(userId));
-log.info("查询结果 - menuList.size()={}", menuList.size());
-```

+ 0 - 38
_schema_out.txt

@@ -1,38 +0,0 @@
-=== main_post_candidate_review NOT FOUND ===
-=== main_student_education ===
-`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
-`student_id` bigint NOT NULL COMMENT '学员ID (关联 main_student.id)',
-`school` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '学校名称',
-`education` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '学历',
-`start_time` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '开始时间 (如 2022.9)',
-`end_time` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '结束时间 (如 2026.7)',
-`major` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '专业',
-`campus_experience` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '在校经历描述',
-`tenant_id` bigint NULL DEFAULT 0 COMMENT '租户ID',
-`create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
-`create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
-`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
-`update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
-`update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
-`del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '删除标志',
-INDEX `idx_student_id`(`student_id` ASC) USING BTREE
-=== main_student_experience ===
-`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
-`student_id` bigint NOT NULL COMMENT '学员ID (关联 main_student.id)',
-`company` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '公司名称',
-`industry` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '所属行业',
-`start_time` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '开始时间',
-`end_time` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '结束时间',
-`is_internship` tinyint(1) NULL DEFAULT 0 COMMENT '是否实习 (0否 1是)',
-`job_title` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '职位名称',
-`department` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '所属部门',
-`work_content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '工作内容描述',
-`tenant_id` bigint NULL DEFAULT 0 COMMENT '租户ID',
-`create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
-`create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
-`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
-`update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
-`update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
-`del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '删除标志',
-INDEX `idx_student_id`(`student_id` ASC) USING BTREE
-=== main_back_interview NOT FOUND ===

+ 697 - 0
kaoshixing.txt

@@ -0,0 +1,697 @@
+1.api接口说明
+
+考试星api接口采用jwt规范。Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519)。JWT调用示例代码
+
+
+2.api参数配置
+
+appId : 客户唯一标识符,由考试星提供,例如:14343。
+appKey : 用于加密jwt,由考试星提供,例如:xf5ha3h67h4Ger34wh35p345h4。
+获取方式:【管理员后台:系统设置->更多设置->开发者信息管理】
+
+
+3.api统一接口地址
+
+地址: https://api.kaoshixing.com/api/company/data/:appId/?jwt=:jwtInfo
+**jwtInfo:**jwt_info是用户根据jwt规范,用app_key将过期时间、action_id加密,生成的加密字符串
+
+
+4.生成加密jwtInfo(java示例)
+
+
+
+(1).安装依赖
+
+<dependency>
+  <groupId>io.jsonwebtoken</groupId>
+  <artifactId>jjwt</artifactId>
+  <version>0.7.0</version>
+
+
+(2).生成加密字符串
+
+生成jwtInfo加密字符串
+
+  import io.jsonwebtoken.Jwts;
+  String appKey = “xf5ha3h67h4Ger34wh35p345h4”
+  String jwtInfo = Jwts.builder()
+           .claim("exp", System. currentTimeMillis() + 1000*10)
+              .claim("action_id", "201")
+            .signWith(SignatureAlgorithm.HS256,app_key.getBytes("UTF-8")).compact();
+
+
+(3).加密参数解释
+
+appKey:加密的私钥,由考试星提供。
+exp:过期时间。
+action_id:表示请求的数据类型(注意是下划线)。
+
+5.action_id参数解释
+
+
+
+不同的action_id代表不同的请求行为,目前开放的请求行为如下:
+
+请求行为编码	行为解释
+601	考试信息列表
+602	考生分数列表
+603	试卷试题列表
+604	考生答案列表
+605	在线学习内容表
+606	在线学习时长
+609	学员列表
+702	获取考试和考试结果
+
+
+
+
+
+6.当前开放的请求接口
+
+
+
+(1)考试信息列表接口:
+
+
+
+请求地址:https://api.kaoshixing.com/api/company/data/:appId/?jwt=:jwtInfo
+
+
+
+请求方法:post
+
+
+
+请求参数:
+
+参数编号	参数名称	参数值示例	参数描述
+1	page	3	页码,每页10个
+2	examStartTime	2021-12-27 00:00:00	String类型,筛选出考试开始时间大于等于examStartTime的考试,非必传项
+3	examEndTime	2021-12-27 00:00:00	String类型,筛选出考试结束时间小于等于examEndTime的考试,非必传项
+4	createTime	2021-12-27 00:00:00	 String类型,筛选出考试创建时间大于等于createTime的考试,非必传项
+5	examIds	1179422,1171758	String类型,筛选出考试id为examIds的几场考试,非必传项
+
+
+返回结果:
+
+参数名称	参数描述	类型	备注
+examInfold	考试ID	String,下同	
+examName	考试名称		
+examTotalScore	考试总分		
+passMark	及格分		
+examTime	答题时长		
+examStartTime	考试开始时间		
+examEndTime	考试结束时间		
+examineeNums	应考人数		
+maxScore	最高分		
+avgScore	平均分		
+minScore	最低分		
+testNums	试题数		
+userExamedCount	已考人数		
+userCommitCount	已交卷人数		
+examLink	考试链接	
+examCreatTime    	创建考试时间		
+examClass	考试分类		
+createUserId	创建人账号		
+createUserName	创建人姓名		
+
+
+
+
+
+
+(2)考生分数列表接口:
+
+
+
+请求地址:https://api.kaoshixing.com/api/company/data/:appId/?jwt=:jwtInfo
+
+
+
+请求方法:post
+
+
+
+请求参数:
+
+
+
+
+
+返回结果:
+
+参数名称	参数描述	参数类型	备注
+userId	考生账号	String	
+userName	考生姓名	String	
+depName	部门名称	String	
+position	职位	String	
+ansTime	答题时长	String	
+startTime	开始时间	String	
+commitTime	交卷时间	String	
+score	成绩	String	
+rank	排名	String	
+isPass	是否通过	String	
+result	考试情况	String,取值枚举:
+及格,不及格,漏考	
+isForce	是否强制交卷	Integer,取值枚举
+0--否
+2--是(切屏防作弊 )
+3--是(x秒无操作自动交卷 )
+4--是(闯关失败 )
+6--是(管理员强制交卷)
+7--是(人脸识别失败次数超限)
+- 未参与学员
+
+note	备注	String	
+field1	自定义字段1	String	
+field2	自定义字段2	String	
+field3	自定义字段3	String	
+field4	自定义字段4	String	
+field5	自定义字段5	String	
+
+
+(3)试卷试题列表接口:
+
+
+
+请求地址:https://api.kaoshixing.com/api/company/data/:appId/?jwt=:jwtInfo
+
+
+
+请求方法:post
+
+
+
+请求参数:
+
+
+
+返回结果:
+
+
+
+
+
+(4)考生答案列表接口:
+
+
+
+请求地址:https://api.kaoshixing.com/api/company/data/:appId/?jwt=:jwtInfo
+
+
+
+请求方法:post
+
+
+
+请求参数:
+
+参数名称	参数描述	类型	备注
+examInfoId	考试id	int	119511
+
+
+返回结果:
+
+参数名称	参数描述	类型	备注
+userId	账号	String	
+ansAndScore	考生答案和得分	JsonString	
+
+
+(5)在线学习内容列表接口:
+
+
+
+请求地址:https://api.kaoshixing.com/api/company/data/:appId/?jwt=:jwtInfo
+
+
+
+请求方法:post
+
+
+
+请求参数:
+
+
+
+
+
+返回结果:
+
+参数名称   	参数描述	类型	备注
+courseID	课程ID	string	
+courseName	课程名称	string	
+courseCreateTime	课程创建时间	string	
+courseUpdateTime	课程最后一次修改时间	string	
+courseTime	学习课程所需最短时间	int	单位秒
+courseStuNum	应参与该课程的人数	int	
+courseClassify	课程分类	string	
+createUserId	创建人账号	string	
+createUserName	创建人姓名	string	
+
+
+(6)在线学习时长列表接口:
+
+
+
+请求地址:https://api.kaoshixing.com/api/company/data/:appId/?jwt=:jwtInfo
+
+
+
+请求方法:post
+
+
+
+请求参数:
+
+
+
+返回结果:
+
+参数名称	参数描述	类型	备注
+userId	账号	String	
+studyTime	学习时长	String	
+finishStatus	完成进度	String	
+courseTime	学习课程所需最短时间	int	单位 秒
+
+
+(7)获取考生可见考试和考试结果整合列表
+
+请求地址:https://api.kaoshixing.com/api/company/data/:appId/?jwt=:jwtInfo
+
+请求方法:post
+
+请求参数:
+
+参数编号	参数名称	参数值示例	参数描述
+1	user_id	123456	学员账号
+2	page	2	页码,每页500个
+
+
+返回结果:
+
+参数名称	参数描述	类型	备注
+examInfoId	考试id	int	
+examStyleName	考试类型	String	
+examName	考试名称	String	
+examStartTime	考试开始时间	String	
+examEndTime	考试结束时间	String	
+examTimeRestrict	是否限制每题时长	String	
+examTime	考试时长(分钟)	int	
+examResultsId	考试结果id	int	
+results	分数	double	
+isPass	是否通过	int	
+examLink	考试链接	String	
+inquireLink	查询结果链接	String	
+practiceMode	是否联系模式	int	
+status	考试状态	String	
+examing:答题中、checked:已批改可查看、
+
+checking:批改中不可查看、new:未作答、
+
+notReleased:暂不公布不可查看
+
+
+
+(8)获取学员列表
+
+请求地址:https://api.kaoshixing.com/api/company/data/:appId/?jwt=:jwtInfo
+
+请求方法:post
+
+请求参数:
+
+参数名称	参数值示例	参数描述
+page	1	页面id
+
+
+返回结果
+
+参数名称	参数描述	类型	备注
+page	页码	int	每页20条
+userId	用户账号	string	
+surname	姓名	string	
+departmentName	部门,从根目录往下,例如“部门分类/部门”	string	
+userPoint	积分	int	
+lastLoginTime	最近登录时间	string	
+isBindWechatDesc	是否绑定微信	string	
+1代表已绑定,0代表未绑定
+
+userLableNames	学员标签,标签间以逗号隔开	string	仅在学员标签功能开启时生效,功能关闭时返回null
+status	状态	string	
+0正常,1禁用,2临时账号
+
+permission	权限	int	
+0代表考试星;1代表会否;2代表全部都有;3代表全部没有
+
+creater	创建人	int	创建账号的用户id
+createTime	创建时间	string	
+phone	手机	string	未设置时返回null
+email	证件号	string	未设置时返回null
+position	职位	string	未设置时返回null
+identityCard	证件号	string	未设置时返回null
+notice	备注	string	未设置时返回null
+field1	字段1	string	未设置时返回null
+field2	字段2	string	未设置时返回null
+field3	字段3	string	未设置时返回null
+field4	字段4	string	未设置时返回null
+field5	字段5	string	未设置时返回null
+identityImg	证件照url	string	未设置时返回null
+
+
+
+
+1.api接口说明
+
+api接口采用jwt规范。Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT调用示例代码
+
+
+2.api参数配置
+
+appId : 客户唯一标识符,由考试星提供,例如:14343。
+appKey : 用于加密/解密jwt,由考试星提供,例如:xf5ha3h67h4Ger34wh35p345h4。
+获取方式:【管理员后台:系统设置->更多设置->开发者信息管理】
+
+
+3.考试星提供api统一接口地址
+
+地址: https://api.kaoshixing.com/api/company/data/:appId?jwt=:jwtInfo
+请求方式:post
+jwtInfo:jwt_info是根据jwt规范,用appKey将过期时间、action_id加密,生成的加密字符串
+
+
+4.客户提供api统一接口地址
+
+地址(仅作示例):https://www.example.com/api/company/data/:appId?jwt=:jwtInfo
+请求方式:post
+jwtInfo:jwt_info是根据jwt规范,用appKey将过期时间、action_id加密,生成的加密字符串
+
+5.生成加密jwtInfo和解密(java示例)
+
+
+
+(1).安装依赖
+
+<dependency>
+  <groupId>io.jsonwebtoken</groupId>
+  <artifactId>jjwt</artifactId>
+  <version>0.7.0</version>
+</dependency>
+
+
+
+(2).生成加密字符串
+
+  import io.jsonwebtoken.Jwts;
+  String appKey = “xf5ha3h67h4Ger34wh35p345h4”
+  String jwtInfo = Jwts.builder()
+           .claim("exp", System. currentTimeMillis() + 1000*10)
+              .claim("action_id", "201")
+            .signWith(SignatureAlgorithm.HS256,appKey.getBytes("UTF-8")).compact();
+
+
+
+(3).加密参数解释
+
+appKey:加密的私钥,由考试星提供。
+exp:过期时间。
+action_id:请求行为类型。
+
+
+(4).解密方法示例
+
+import io.jsonwebtoken.Claims;
+import io.jsonwebtoken.ExpiredJwtException;
+import io.jsonwebtoken.Jwts;
+
+public Boolean decodeJwt(String jwtInfo, String appKey) {
+        try {
+            Claims claims;
+            claims = Jwts.parser().setSigningKey(appKey.getBytes("UTF-8")).parseClaimsJws(jwtInfo).getBody();
+            String actionId = null == claims.get("action_id") || "".equals(claims.get("action_id")) ? ""
+                        : claims.get("action_id").toString();
+            
+            /**
+            *   处理action_id
+            */
+            
+        } catch (ExpiredJwtException e) {
+            LOGGER.info("decodeJwt解密失败!");
+            return false;
+        } catch (Exception e) {
+            LOGGER.info("decodeJwt解密失败!");
+            return false;
+        }
+     return true;
+}
+
+6.action_id参数解释
+
+
+
+action_id调用方请求行为类型10000客户查询考生考试结果信息10001考试星回传考生考试结果信息。
+
+
+
+7.查询考生考试结果信息
+
+
+
+action_id = 10000
+
+请求地址:https://api.kaoshixing.com/api/company/data/:appId?jwt=:jwtInfo
+
+请求方式:POST
+
+
+
+请求参数:
+
+参数名称	是否必填	类型	参数描述
+userId	是	String	考生唯一标识
+examId	否	int	考试id
+commitTimeStart	否	String	起始交卷时间
+commitTimeEnd	否	String	最晚交卷时间
+page	是	int	页数,每页5条数据
+
+
+参数示例:
+
+{
+	"userId":"zhangsan",
+	"examId":47167,
+	"commitTimeStart":"2021-06-01 08:00:00",
+	"commitTimeEnd":"2021-06-30 20:00:00",
+	"page":1
+}
+
+
+正常返回:
+
+{
+    "success":true,
+    "code":10000,
+    "desc":"成功",
+    "englishDesc":"Success",
+    "bizContent":{
+        "total":2,
+        "current":1,
+        "rowCount":5,
+        "rows":[
+            {
+                "userId":"zhangsan",
+                "examId":47167,
+                "examName":"期末考试",
+                "examStartTime":"2021-06-02 14:18:00",
+                "examEndTime":"2021-06-30 14:18:00",
+                "examTime":60,
+                "startTime":"2021-06-03 11:44:37",
+                "commitTime":"2021-06-03 11:44:44",
+                "score":"0.0",
+                "isPass":0,
+                "times":2,
+                "examResultsId":40561249,
+                "examStyleName":"考试分类",
+                "examStyleId":20046
+            },
+            {
+                "userId":"zhangsan",
+                "examId":47167,
+                "examName":"期末考试",
+                "examStartTime":"2021-06-02 14:18:00",
+                "examEndTime":"2021-06-30 14:18:00",
+                "examTime":60,
+                "startTime":"2021-06-02 14:19:17",
+                "commitTime":null,
+                "score":"0.0",
+                "isPass":0,
+                "times":1,
+                "examResultsId":40561220,
+                "examStyleName":"考试分类",
+                "examStyleId":20046
+            }
+        ]
+    }
+}
+
+
+参数说明:
+
+参数	类型	参数描述
+userId
+
+String	客户内部考生id
+examId
+
+int	考试id
+examName
+
+String	考试名称
+examStartTime
+
+String	考试开始时间
+examEndTime
+
+String	考试结束时间
+examTime
+
+int	考试时长(分钟)
+startTime
+
+String	考生开考时间
+commitTime
+
+String	考生交卷时间
+score
+
+double	考试分数
+isPass
+
+int	是否及格(1及格,0不及格)
+times
+
+int	考试次数
+examResultsId
+
+int	考试结果id
+examStyleName
+
+String	考试分类名称
+examStyleId
+
+int	考试分类id
+
+
+错误返回:
+
+{
+    "success":false,
+    "code":31014,
+    "desc":"用户不存在",
+    "englishDesc":"user not existed",
+    "bizContent":null
+}
+
+8.同步考生的考试结果(客户提供)
+
+
+
+action_id = 10001
+
+
+
+时序图:
+
+
+
+
+
+请求地址(仅作示例):https://www.example.com/api/company/data/:appId?jwt=:jwtInfo
+
+请求方式:POST
+
+
+
+请求参数:
+
+
+
+参数编号	参数名称	类型	参数描述
+1	jwt	String	包含action_id的加密字符串
+2	params	JSONObject	包含考生的考试信息
+
+
+参数示例:
+
+{
+    "jwt":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjo1LCJleHAiOjE0OTc5NTMxODguNjg0MTIxLCJhY3Rpb25faWQiOiIyMDEifQ.I3j56t_tVMX1GgH62dy-rIktqFRienFZTJ7VKgc6lPs",
+    "params":{
+        "commitTime":"2018-10-30 20:00:00",
+        "examEndTime":"2018-10-31 18:00:00",
+        "examId":15960,
+        "examName":"测试考试",
+        "examStartTime":"2018-10-30 18:00:00",
+        "examTime":60,
+        "isPass":1,
+        "score":100,
+        "startTime":"2018-10-30 19:00:00",
+        "times":1,
+        "userId":"779821sfsf"
+    }
+}
+
+
+
+参数说明:
+
+参数	类型	说明
+userId	String	客户内部考生id
+examId	int	考试id
+examName	String	考试名称
+examStartTime	String	考试开始时间
+examEndTime	String	考试结束时间
+examTime	int	考试时长(分钟)
+startTime	String	考生开考时间
+commitTime	String	考生交卷时间
+score	double	考试分数
+isPass	int	是否及格
+times	int	考试次数
+examResultsId	int	考试结果id
+examStyleName	String	考试分类名
+examStyleId	int	考试分类id
+userName	String	考生姓名
+field1	String	自定义属性1
+field2	String	自定义属性2
+field3	String	自定义属性3
+field4	String	自定义属性4
+field5	String	自定义属性5
+identityCard
+
+String	证件号
+phone
+
+String	手机号
+email	String	邮箱
+position
+
+String	职位
+
+
+返回数据:
+
+{
+    "success":true,
+    "code":10000,
+    "desc":"成功",
+    "bizContent":null
+}
+
+
+
+
+
+
+
+
+
+
+

BIN
report_debug_output.docx


+ 71 - 0
script/sql/add_order_display_fields.sql

@@ -0,0 +1,71 @@
+-- 订单管理展示字段补充
+-- 为 main_order 表添加前端展示所需的字段
+-- 注意:phone、userAvatar、productName、productImg 应通过关联查询获取,不应冗余存储
+
+-- 1. 添加客户单号字段
+ALTER TABLE `main_order` ADD COLUMN `customer_sn` varchar(100) DEFAULT NULL COMMENT '客户单号' AFTER `order_no`;
+
+-- 2. 添加订单来源字段
+ALTER TABLE `main_order` ADD COLUMN `source` varchar(50) DEFAULT '小程序' COMMENT '订单来源(小程序/APP/PC)' AFTER `buyer_name`;
+
+-- 3. 添加定金字段
+ALTER TABLE `main_order` ADD COLUMN `deposit` decimal(10,2) DEFAULT 0.00 COMMENT '定金金额' AFTER `total_amount`;
+
+-- 4. 添加尾款字段
+ALTER TABLE `main_order` ADD COLUMN `balance` decimal(10,2) DEFAULT 0.00 COMMENT '尾款金额' AFTER `deposit`;
+
+-- 5. 添加数量字段
+ALTER TABLE `main_order` ADD COLUMN `quantity` int DEFAULT 1 COMMENT '商品数量' AFTER `balance`;
+
+-- 说明:
+-- 1. customer_sn: 客户自定义单号,用于对账
+-- 2. source: 订单来源渠道,便于统计分析
+-- 3. deposit/balance: 定金订单的金额拆分,全款订单时 deposit=0, balance=total_amount
+-- 4. quantity: 商品数量
+-- 
+-- 以下字段应通过关联查询获取,不需要添加到订单表:
+-- - phone: 从 main_student.mobile 关联查询(当 buyer_type=2 时)
+-- - userAvatar: 从 main_student.avatar 关联查询(当 buyer_type=2 时)
+-- - productName: 从 main_product 表关联查询
+-- - productImg: 从 main_product 表关联查询
+
+
+-- =====================================================
+-- main_back_candidate 表 Offer 管理字段补充
+-- 支持企业和学员双向确认流程
+-- =====================================================
+
+-- 1. 添加企业意愿状态字段
+ALTER TABLE `main_back_candidate` ADD COLUMN `enterprise_status` varchar(20) DEFAULT 'pending' COMMENT '企业意愿状态(pending-待处理/adopted-录用/rejected-不录用)' AFTER `source`;
+
+-- 2. 添加学员意愿状态字段
+ALTER TABLE `main_back_candidate` ADD COLUMN `student_status` varchar(20) DEFAULT 'pending' COMMENT '学员意愿状态(pending-待确认/accepted-已接受/rejected-已拒绝)' AFTER `enterprise_status`;
+
+-- 3. 添加Offer文件地址字段
+ALTER TABLE `main_back_candidate` ADD COLUMN `offer_file_url` varchar(500) DEFAULT NULL COMMENT 'Offer PDF文件URL' AFTER `student_status`;
+
+-- 4. 添加Offer文件名字段
+ALTER TABLE `main_back_candidate` ADD COLUMN `offer_file_name` varchar(255) DEFAULT NULL COMMENT 'Offer PDF文件名' AFTER `offer_file_url`;
+
+-- 5. 添加企业发送Offer时间字段
+ALTER TABLE `main_back_candidate` ADD COLUMN `offer_time` datetime DEFAULT NULL COMMENT '企业发送Offer时间' AFTER `offer_file_name`;
+
+-- 6. 添加学员确认/拒绝时间字段
+ALTER TABLE `main_back_candidate` ADD COLUMN `student_reply_time` datetime DEFAULT NULL COMMENT '学员确认或拒绝Offer时间' AFTER `offer_time`;
+
+-- 7. 修改status字段长度(兼容新状态值)
+ALTER TABLE `main_back_candidate` MODIFY COLUMN `status` varchar(20) DEFAULT NULL COMMENT '状态(兼容旧数据)';
+
+-- 说明:
+-- 1. enterprise_status: 企业对候选人的录用意愿
+-- 2. student_status: 学员对企业Offer的接受意愿
+-- 3. offer_file_url/offer_file_name: Offer PDF文件信息
+-- 4. offer_time: 企业发出Offer的时间点
+-- 5. student_reply_time: 学员回复的时间点
+--
+-- 状态组合逻辑:
+-- - enterprise_status=pending, student_status=pending: 待审核(企业未处理)
+-- - enterprise_status=adopted, student_status=pending: 待确认(Offer已发出)
+-- - enterprise_status=adopted, student_status=accepted: 已录用(双方确认)
+-- - enterprise_status=adopted, student_status=rejected: 已拒绝(学员拒绝)
+-- - enterprise_status=rejected: 不录用(企业拒绝)

+ 4 - 0
script/sql/alter_main_ability_config.sql

@@ -0,0 +1,4 @@
+-- 为 main_ability_config 表添加考试链接字段
+
+ALTER TABLE `main_ability_config` 
+ADD COLUMN `third_exam_link` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '考试链接' AFTER `third_exam_total_score`;

+ 33 - 26
script/sql/sj.sql

@@ -11,7 +11,7 @@
  Target Server Version : 80036 (8.0.36)
  File Encoding         : 65001
 
- Date: 10/04/2026 16:03:40
+ Date: 14/04/2026 13:44:03
 */
 
 SET NAMES utf8mb4;
@@ -48,11 +48,14 @@ CREATE TABLE `cs_message`  (
   INDEX `idx_session`(`session_id` ASC) USING BTREE,
   INDEX `idx_send_time`(`send_time` ASC) USING BTREE,
   INDEX `idx_msg_type`(`msg_type` ASC) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 62 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '聊天消息表' ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 76 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '聊天消息表' ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Table structure for cs_order_card
 -- ----------------------------
+-- 增量变更:加 tenant_id 字段
+-- ALTER TABLE `cs_order_card` ADD COLUMN `tenant_id` varchar(20) NULL DEFAULT '000000' COMMENT '租户编号' AFTER `original_order_id`;
+
 DROP TABLE IF EXISTS `cs_order_card`;
 CREATE TABLE `cs_order_card`  (
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '结算单ID',
@@ -62,6 +65,7 @@ CREATE TABLE `cs_order_card`  (
   `order_price` decimal(10, 2) NOT NULL COMMENT '支付金额',
   `order_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '订单类型说明',
   `original_order_id` bigint NULL DEFAULT NULL COMMENT '关联平台真实订单ID',
+  `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '000000' COMMENT '租户编号',
   `status` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT 'pending' COMMENT '状态: pending=待支付, paid=已支付, cancelled=已取消, expired=已失效',
   `expire_time` datetime NOT NULL COMMENT '结算单过期时间(发送时间+60s)',
   `pay_time` datetime NULL DEFAULT NULL COMMENT '实际支付时间',
@@ -160,6 +164,7 @@ CREATE TABLE `cs_session`  (
   `end_time` datetime NULL DEFAULT NULL COMMENT '结束时间',
   `update_by` bigint NULL DEFAULT NULL COMMENT '更新人',
   `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)',
+  `source_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '业务来源ID (如 assessment_1 或 job_5)',
   PRIMARY KEY (`id`) USING BTREE,
   UNIQUE INDEX `session_no`(`session_no` ASC) USING BTREE,
   INDEX `idx_from_user`(`from_user_id` ASC) USING BTREE,
@@ -279,7 +284,7 @@ CREATE TABLE `main_ability_config`  (
   `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '删除标志',
   PRIMARY KEY (`id`) USING BTREE,
   INDEX `idx_evaluation_id`(`evaluation_id` ASC) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 17 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '测评能力配置表' ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 23 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '测评能力配置表' ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Table structure for main_agreement
@@ -327,7 +332,7 @@ CREATE TABLE `main_audit`  (
   INDEX `idx_target_id`(`target_id` ASC) USING BTREE,
   INDEX `idx_audit_result`(`audit_result` ASC) USING BTREE,
   INDEX `idx_audit_time`(`audit_time` ASC) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 2041792456597020674 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '审核信息表' ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 2043618977129295874 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '审核信息表' ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Table structure for main_back_candidate
@@ -549,6 +554,7 @@ CREATE TABLE `main_company_apply`  (
   `surname` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '姓氏',
   `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '名字',
   `mobile` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '手机号',
+  `password` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '登录密码',
   `apply_status` tinyint(1) NULL DEFAULT 0 COMMENT '申请状态(0-待审核 1-审核中 2-已通过 3-已驳回)',
   `audit_id` bigint NULL DEFAULT NULL COMMENT '关联审核ID',
   `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '租户ID',
@@ -566,7 +572,7 @@ CREATE TABLE `main_company_apply`  (
   UNIQUE INDEX `uk_credit_code`(`credit_code` ASC) USING BTREE,
   INDEX `idx_apply_status`(`apply_status` ASC) USING BTREE,
   INDEX `idx_mobile`(`mobile` ASC) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 2041792456253087746 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '企业入驻申请表' ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 2042524183019778051 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '企业入驻申请表' ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Table structure for main_company_withdraw_account
@@ -670,7 +676,7 @@ CREATE TABLE `main_exam_apply`  (
   INDEX `idx_tenant_id`(`tenant_id` ASC) USING BTREE,
   INDEX `idx_apply_status`(`apply_status` ASC) USING BTREE,
   INDEX `idx_final_result`(`final_result` ASC) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 2039950266350546946 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '测评报名与分配表' ROW_FORMAT = DYNAMIC;
+) ENGINE = InnoDB AUTO_INCREMENT = 2039955681964535810 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '测评报名与分配表' ROW_FORMAT = DYNAMIC;
 
 -- ----------------------------
 -- Table structure for main_exam_attempt_question
@@ -747,7 +753,7 @@ CREATE TABLE `main_exam_evaluation`  (
   `main_image` bigint NULL DEFAULT NULL COMMENT '主图',
   `image_album` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '商品相册',
   `detail` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '详情',
-  `price` decimal(10, 0) NULL DEFAULT NULL COMMENT '价格',
+  `price` decimal(10, 2) NULL DEFAULT NULL COMMENT '价格',
   `on_time` date NULL DEFAULT NULL COMMENT '上架时间',
   `down_time` date NULL DEFAULT NULL COMMENT '下架时间',
   `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '状态',
@@ -762,7 +768,7 @@ CREATE TABLE `main_exam_evaluation`  (
   PRIMARY KEY (`id`) USING BTREE,
   INDEX `idx_tenant_id`(`tenant_id` ASC) USING BTREE,
   INDEX `idx_status`(`status` ASC) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 2042118691629834243 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '测评管理表' ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 2043876124257804291 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '测评管理表' ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Table structure for main_goods
@@ -851,13 +857,14 @@ CREATE TABLE `main_order`  (
   `create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
   `update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
   `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `wechat_order_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '预支付id',
   PRIMARY KEY (`id`) USING BTREE,
   UNIQUE INDEX `uk_order_no`(`order_no` ASC) USING BTREE,
   INDEX `idx_buyer`(`buyer_type` ASC, `buyer_id` ASC) USING BTREE,
   INDEX `idx_business`(`order_type` ASC, `business_id` ASC) USING BTREE,
   INDEX `idx_create_time`(`create_time` ASC) USING BTREE,
   INDEX `idx_product_id`(`product_id` ASC) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 2041690762320019458 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '订单主表' ROW_FORMAT = DYNAMIC;
+) ENGINE = InnoDB AUTO_INCREMENT = 2043587132417155075 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '订单主表' ROW_FORMAT = DYNAMIC;
 
 -- ----------------------------
 -- Table structure for main_payment
@@ -888,7 +895,7 @@ CREATE TABLE `main_payment`  (
   INDEX `idx_order_id`(`order_id` ASC) USING BTREE,
   INDEX `idx_trade_no`(`trade_no` ASC) USING BTREE,
   INDEX `idx_create_time`(`create_time` ASC) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 2041690763502813187 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '支付记录表' ROW_FORMAT = DYNAMIC;
+) ENGINE = InnoDB AUTO_INCREMENT = 2042525307261001731 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '支付记录表' ROW_FORMAT = DYNAMIC;
 
 -- ----------------------------
 -- Table structure for main_payment_config
@@ -1023,7 +1030,7 @@ CREATE TABLE `main_position`  (
   `max_salary` decimal(10, 2) NULL DEFAULT NULL COMMENT '最大工资',
   PRIMARY KEY (`id`) USING BTREE,
   INDEX `idx_tenant_id`(`tenant_id` ASC) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 2041333602243313667 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '岗位表(这是要发布出去的,与sys_post不同)' ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 2043620022148399106 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '岗位表(这是要发布出去的,与sys_post不同)' ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Table structure for main_post_apply
@@ -1078,7 +1085,7 @@ CREATE TABLE `main_post_apply`  (
   UNIQUE INDEX `uk_apply_no`(`apply_no` ASC) USING BTREE,
   INDEX `idx_tenant_id`(`tenant_id` ASC) USING BTREE,
   INDEX `idx_apply_status`(`apply_status` ASC) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 2041335302127702018 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '岗位发布申请表' ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 2043618976835694595 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '岗位发布申请表' ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Table structure for main_post_candidate_hire_attachment
@@ -1158,7 +1165,7 @@ CREATE TABLE `main_post_candidate_review`  (
   INDEX `idx_post_id`(`post_id` ASC) USING BTREE,
   INDEX `idx_student_id`(`student_id` ASC) USING BTREE,
   INDEX `idx_review_status`(`review_status` ASC) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '岗位候选人任职评价表' ROW_FORMAT = DYNAMIC;
+) ENGINE = InnoDB AUTO_INCREMENT = 11 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '岗位候选人任职评价表' ROW_FORMAT = DYNAMIC;
 
 -- ----------------------------
 -- Table structure for main_refund
@@ -1985,27 +1992,27 @@ CREATE TABLE `sys_tag`  (
 DROP TABLE IF EXISTS `sys_tenant`;
 CREATE TABLE `sys_tenant`  (
   `id` bigint NOT NULL COMMENT 'id',
-  `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '租户编号',
-  `contact_user_name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '联系人',
-  `contact_phone` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '联系电话',
-  `company_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '企业名称',
-  `email` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
+  `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '租户编号',
+  `contact_user_name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '联系人',
+  `contact_phone` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '联系电话',
+  `company_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '企业名称',
+  `email` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
   `logo` bigint NULL DEFAULT NULL COMMENT '企业logo',
   `company_entrust_proof` bigint NULL DEFAULT NULL COMMENT '企业委托证明',
-  `license_number` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '统一社会信用代码',
-  `address` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '地址',
-  `intro` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '企业简介',
-  `domain` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '域名',
+  `license_number` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '统一社会信用代码',
+  `address` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '地址',
+  `intro` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '企业简介',
+  `domain` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '域名',
   `withdrawing_balance` decimal(10, 2) NULL DEFAULT 0.00 COMMENT '提现中余额',
   `in_use_balance` decimal(10, 2) NULL DEFAULT 0.00 COMMENT '使用中余额(订单进行中)',
   `total_consume` decimal(10, 2) NULL DEFAULT 0.00 COMMENT '累计消费(元)',
   `available_balance` decimal(10, 2) NULL DEFAULT 0.00 COMMENT '可使用余额(元)',
-  `remark` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
+  `remark` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注',
   `package_id` bigint NULL DEFAULT NULL COMMENT '租户套餐编号',
   `expire_time` datetime NULL DEFAULT NULL COMMENT '过期时间',
   `account_count` int NULL DEFAULT -1 COMMENT '用户数量(-1不限制)',
-  `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '租户状态(0正常 1停用)',
-  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
+  `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '租户状态(0正常 1停用)',
+  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
   `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
   `create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
   `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
@@ -2014,7 +2021,7 @@ CREATE TABLE `sys_tenant`  (
   `longitude` decimal(10, 7) NULL DEFAULT NULL COMMENT '经度(例如:116.397128)',
   `latitude` decimal(10, 7) NULL DEFAULT NULL COMMENT '纬度(例如:39.916527)',
   PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '租户表' ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '租户表' ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Table structure for sys_tenant_package

+ 0 - 13
sql/collection.sql

@@ -1,13 +0,0 @@
--- 1. 学员收藏表
-CREATE TABLE `main_student_collection` (
-  `id` bigint(20) NOT NULL COMMENT '主键',
-  `student_id` bigint(20) NOT NULL COMMENT '学员ID',
-  `target_id` bigint(20) NOT NULL COMMENT '收藏目标ID(岗位ID/测评ID)',
-  `type` varchar(20) NOT NULL COMMENT '收藏类型(job:岗位, assessment:测评)',
-  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
-  `create_by` varchar(64) DEFAULT NULL COMMENT '创建者',
-  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
-  `update_by` varchar(64) DEFAULT NULL COMMENT '更新者',
-  PRIMARY KEY (`id`),
-  KEY `idx_student_type` (`student_id`,`type`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='学员收藏表';