cd54039f28
新增 com.gxwebsoft.gxmu.openplat:开放平台客户端(oauth 鉴权、token 缓存与失效 重取、分页拉取)、部门/教师/班级/学生四段同步、异步编排与手动同步接口、学生认领、 学生名册查询与导出、每天 03:30 的定时任务、同步记录。 关键设计: - 名册与登录账号分离,学生通过「认领」(手机号自动 / 学号姓名自助)关联 sys_user - 组织数据以 sys_organization 为唯一载体,gxmu_college 废弃 - 平台无可用增量字段,只做全量拉取 + 幂等 upsert - 上游消失只停用不删除,且只作用于同步来源的记录(避免误停用人工维护的研究生班) - 平台权威字段按白名单覆盖,人工字段不触碰 - 码表可配置并保留原始码,码值实测存在两套编码混用,不做硬编码 - 手动同步为异步:提交返回批次号,前端轮询 /status 看分段进度 性能: - 班级/部门由逐条 update 改为多行 upsert,班级 1584 条 41s -> 0.19s - 码表解析加进程内缓存,学生同步由 >17 分钟不完成 -> 170 秒完成 98187 行 迁移脚本需手动执行(可重复执行): sql/20260912_create_openplat_sync_tables.sql sql/20260912_add_openplat_menu.sql 离线单测 43 个;另有联网集成测试 OpenPlatformClientIT(需 -Dopenplat.it=true)。
67 lines
3.2 KiB
SQL
67 lines
3.2 KiB
SQL
-- ============================================================================
|
|
-- 开放平台数据同步:后台菜单与按钮权限
|
|
-- 参见 .scratch/openplat-sync/issues/14-menu-permission-sql.md
|
|
-- 可重复执行
|
|
--
|
|
-- 说明:后台菜单是动态从 sys_menu 读取的(GET /auth/user -> formatMenus -> addRoute)。
|
|
-- menu_type=1 的记录不生成路由,只作按钮权限。
|
|
-- path 与 component 填相同值,组件按 import.meta.glob('/src/views/**/index.vue') 解析。
|
|
-- ============================================================================
|
|
|
|
-- 菜单:数据同步
|
|
INSERT INTO `sys_menu`
|
|
(`menu_id`, `parent_id`, `title`, `path`, `component`, `menu_type`, `sort_number`,
|
|
`authority`, `hide`, `app_id`, `deleted`, `merchant_code`, `tenant_id`)
|
|
SELECT 14400, 8574, '数据同步', '/gxmu/dataSync', '/gxmu/dataSync', 0, 100,
|
|
'', 0, 0, 0, '', 10049
|
|
FROM DUAL
|
|
WHERE NOT EXISTS (SELECT 1 FROM `sys_menu` m WHERE m.`menu_id` = 14400);
|
|
|
|
-- 按钮:手动同步
|
|
INSERT INTO `sys_menu`
|
|
(`menu_id`, `parent_id`, `title`, `path`, `component`, `menu_type`, `sort_number`,
|
|
`authority`, `hide`, `app_id`, `deleted`, `merchant_code`, `tenant_id`)
|
|
SELECT 14401, 14400, '手动同步', '', '', 1, 1,
|
|
'gxmu:sync:manual', 0, 0, 0, '', 10049
|
|
FROM DUAL
|
|
WHERE NOT EXISTS (SELECT 1 FROM `sys_menu` m WHERE m.`menu_id` = 14401);
|
|
|
|
-- 菜单:学生名册
|
|
INSERT INTO `sys_menu`
|
|
(`menu_id`, `parent_id`, `title`, `path`, `component`, `menu_type`, `sort_number`,
|
|
`authority`, `hide`, `app_id`, `deleted`, `merchant_code`, `tenant_id`)
|
|
SELECT 14402, 8574, '学生名册', '/gxmu/studentRoster', '/gxmu/studentRoster', 0, 105,
|
|
'', 0, 0, 0, '', 10049
|
|
FROM DUAL
|
|
WHERE NOT EXISTS (SELECT 1 FROM `sys_menu` m WHERE m.`menu_id` = 14402);
|
|
|
|
-- 按钮:名册查询
|
|
INSERT INTO `sys_menu`
|
|
(`menu_id`, `parent_id`, `title`, `path`, `component`, `menu_type`, `sort_number`,
|
|
`authority`, `hide`, `app_id`, `deleted`, `merchant_code`, `tenant_id`)
|
|
SELECT 14403, 14402, '名册查询', '', '', 1, 1,
|
|
'gxmu:student:list', 0, 0, 0, '', 10049
|
|
FROM DUAL
|
|
WHERE NOT EXISTS (SELECT 1 FROM `sys_menu` m WHERE m.`menu_id` = 14403);
|
|
|
|
-- 按钮:名册导出(泄露风险最高,单独授权)
|
|
INSERT INTO `sys_menu`
|
|
(`menu_id`, `parent_id`, `title`, `path`, `component`, `menu_type`, `sort_number`,
|
|
`authority`, `hide`, `app_id`, `deleted`, `merchant_code`, `tenant_id`)
|
|
SELECT 14404, 14402, '名册导出', '', '', 1, 2,
|
|
'gxmu:student:export', 0, 0, 0, '', 10049
|
|
FROM DUAL
|
|
WHERE NOT EXISTS (SELECT 1 FROM `sys_menu` m WHERE m.`menu_id` = 14404);
|
|
|
|
-- ---------------------------------------------------------------------------
|
|
-- 给超级管理员授权(其它角色请按需在后台「角色管理」里勾选)
|
|
-- ---------------------------------------------------------------------------
|
|
INSERT INTO `sys_role_menu` (`role_id`, `menu_id`, `tenant_id`)
|
|
SELECT r.`role_id`, m.`menu_id`, 10049
|
|
FROM `sys_role` r
|
|
JOIN `sys_menu` m ON m.`menu_id` IN (14400, 14401, 14402, 14403, 14404)
|
|
LEFT JOIN `sys_role_menu` rm ON rm.`role_id` = r.`role_id` AND rm.`menu_id` = m.`menu_id`
|
|
WHERE r.`role_code` = 'superAdmin'
|
|
AND r.`tenant_id` = 10049
|
|
AND rm.`id` IS NULL;
|