Commit Graph
187 Commits
Author SHA1 Message Date
guoju0808 d7107436a6 fix: 操作列更多优化 (Plans 3个以内不折叠 / 去掉前面竖线 / hover打开下拉)
1. Plans 操作列只有 3 个按钮 (修改/审核/结算), 不需要更多折叠
   - 还原为直接展示 3 个 el-link
   - 删除 onMorePlan 函数 + ArrowDown import
   - width 120 → 160

2. main.scss .op-dropdown 删除 border-left 竖线分隔
   - 加 cursor: pointer + color: primary + hover 色变浅
   - 加 padding 0 4px 与 el-link 视觉对齐
   - 加 user-select: none 避免点击选中

3. Meetings / Projects el-dropdown trigger: click → hover
   - hover 鼠标进入触发, 离开关闭
   - 更符合操作列多按钮场景的直觉
2026-08-26 12:01:43 +00:00
guoju0808 61303a822b feat: manager/workbench 移动端精细适配 (KPI 2列/单列/role-grid/快捷入口单列)
之前 Workbench 已有基础 media (1200px 5→3列, 768px 5→2列), 但:
- KPI 卡 padding 没缩, 字号没缩
- 双栏内容没堆叠
- 角色卡 padding 没缩
- 快捷入口 8 项还是 2 列, 手机端拥挤
- 超窄屏 (≤480px) 无适配

新增:
≤768px:
- 容器 padding 0 4px
- 面包屑 12px
- KPI 2 列, 数字 30→22px, padding 12px
- content-grid 强制单列
- content-card padding 14/16
- 角色卡 2 列, padding 10/12, 数字 22→18px
- 快捷入口 1 列 (8 项单列更易点)

≤480px:
- KPI 单列, role-grid 单列
- stat-value 20px
- content-card padding 12/14

不影响桌面: 所有规则都在 @media 内
2026-08-26 11:57:13 +00:00
guoju0808 d318e4383f fix: manager/Plans 操作列折叠次要操作 (审核/结算进更多下拉, 操作列 200→120px)
- 外置'修改' (高频)
- 折叠'审核/结算' 到 el-dropdown'更多'
- 操作列 width:200 → 120, 桌面+手机端共享同一模板
- 复用 main.scss 已有的 .op-dropdown + .op-caret 样式
- 禁用条件: 审核仅 planStatus='0' 可点, 结算仅 isSettled!=='Y' 可点 (逻辑移到 dropdown :disabled, 跟原 v-if 行为一致)
2026-08-26 11:50:28 +00:00
guoju0808 8b6a0b4e27 feat: Publicity 公示页移动端适配 (顶栏紧凑 + nav 横滚 + 列表卡片化)
Publicity.vue 是公共项目公示页, 有完整桌面布局 (1354px min-width, 72px 顶栏,
60px padding, 36px nav 间距), 手机端需要专门的 media query 才能正常显示:

≤768px:
- body min-width: 0 (解除桌面 1354 强制)
- 顶栏 72→56px, padding 60→12px
- logo 36→30px, title 16→14px
- nav-list 横向滚动 + gap 36→16px
- 顶栏用户区紧凑 (font 15→13px)
- container padding 收窄 (16/12)
- filter-bar 单列, filter-input 全宽
- 列表项 padding 12px, 字号适配
- 弹窗 width 100vw 全屏化

不影响桌面: 所有规则都在 @media (max-width: 768px) 内

不需要适配的页面 (已 mobile-friendly):
- App.vue / PortalLayout.vue (纯容器)
- views/doctor/SignContract.vue (mobile-first 设计, 固定底栏)
- components/* (11 个组件用 flex + min-width:0, 自动响应)
2026-08-26 11:47:04 +00:00
guoju0808 d26a99f821 feat: 批量 H5 适配 (37 个 form/card 页面加统一移动端规则)
覆盖: Account (4 角色), BizArticleAdmin/Edit, BizSpecialPlanAdmin/Edit,
ExpertDetail, LaborProtocolEdit, Roles, Register 系列 (3), doctor 系列
(Account/Meetings/SignFill/SignSuccess/SubmissionDetail/SubmissionNew),
executor 系列 (Account/NewPerson/Overview/PersonDetail),
executor-people 系列 (PersonDetail/PersonNew),
expert/ExpertNew, manager 系列 (Accounts/ProjectsNew/ManagerProjectsAssign),
meetings 系列 (MeetingDetail 1993L/MeetingNew), messages/Messages,
portal 系列 (Invitation/SupportLetter),
sponsor 系列 (Account/NewPerson/PersonDetail),
sponsor-people 系列 (PersonDetail/PersonNew)

统一规则 (≤768px):
- 卡片 padding 12px, radius 4px
- 工具栏横向滚动 (overflow-x)
- filter-form 保持横向 (label 80px 右对齐 + input 占满)
- 查找/重置按钮垂直堆叠 (block + margin-top 8px)
- 表格字号 12px

不影响桌面端: 所有规则都在 @media (max-width: 768px) 内
2026-08-26 11:46:07 +00:00
guoju0808 bfc801a16a feat: 批量移动端适配 (24 个列表页 + 13 个宽表用 GrTable)
- 给 24 个有 filter-form 但无 media query 的列表页统一加 @media (max-width:768px)
  - 卡片 padding 收窄 (12px, radius 4px)
  - 工具栏横向滚动 (6+ 按钮铺不下)
  - filter-form 保持横向布局 (label 左 80px 右对齐 + input 右占满)
  - 查找/重置按钮垂直堆叠不偏移
  - 表格字号 12px

- 13 个宽表 (≥10 列) 替换为 GrTable 组件:
  - sponsor/Projects, executor/Projects, sponsor/SponsorProjects
  - sponsor/SponsorPeople, expert/Experts, executor/People
  - meetings/Meetings, sponsor/Meetings, executor/Meetings
  - manager/ExecIntent, manager/SupportIntent, manager/Plans
  - admin/Users
  - 每个页面的 mainCols 取业务主键 (项目编号+名称 / 账号+姓名 等)
  - 手机端次要列折叠到展开行, 主列+操作列保留

- 修复 executor/Projects.vue 多行 el-table 标签导致的 GrTable 替换错误

全 95 个 vue 编译 200, 0 错误
2026-08-26 11:43:08 +00:00
guoju0808 614a31c404 fix: 移动端 filter-form 保持横向布局 (label 左 + input 右, 不再上下堆叠) 2026-08-26 11:40:40 +00:00
guoju0808 ce26361b30 fix: 移动端按钮组对齐 (block + margin reset, 查找重置不再偏移) 2026-08-26 11:39:01 +00:00
guoju0808 a0f566eb38 fix: 移动端 filter-form 按钮垂直堆叠 (查找/重置不再叠在一起) 2026-08-26 11:37:20 +00:00
guoju0808 8ac3538341 style: 去除操作列竖线分隔 (padding 6→4px, 节省操作列宽度) 2026-08-26 11:36:06 +00:00
guoju0808 31b3fb504a fix: GrTable 移动端保留操作列 fixed="right" 2026-08-26 11:35:10 +00:00
guoju0808 4de6479be0 fix: GrTable 移动端去除 fixed 方向 (主列+操作列不再 fixed) 2026-08-26 11:34:32 +00:00
guoju0808 0644e26120 feat: GrTable 移动端表格组件 + manager/Projects 试点
业务背景
- 项目里 17+ 列的列表页 (manager/Projects, Meetings, AdminUsers 等) 在手机端只能
  横向滚动, 操作体验差.
- refer/gr-table.vue 是 Vue2 + Vant 组件, Vue3 不能直接用 (componentOptions
  私有 API 已被 Vue3 移除).
- 新建 Vue3 + EP 兼容版本 GrTable, 吸收"主列显示 / 次要列折叠到展开行"思想.

组件设计
- props: data, mainCols (默认 = 第一个 prop + 最后一个 prop), mobileBreakpoint
- 通过 slots.default() 取 vnode, 读 vnode.props.prop/label (Vue3 思路, 替代
  Vue2 componentOptions 私有 API)
- v-bind="\$attrs" 全透传 el-table 原生 props/events
- el-table 引用方法 (clearSelection / toggleRowSelection 等) defineExpose
  暴露

manager/Projects 试点
- 引入 GrTable, :main-cols="['projectNo', 'projectName']"
- 手机端: 只显示项目编号 + 项目名称 + 操作列, 其他 13 列折叠到展开行
- 桌面端: 与原 el-table 完全一致 (所有 17 列)
- 操作列 (label=操作, 无 prop) 自动保留 (因为 shouldRenderColumn 跳过无 prop 列)
2026-08-26 11:32:53 +00:00
guoju0808 02715a1385 fix: main.scss 移动端 el-table 规则 3 个 bug 2026-08-26 11:22:02 +00:00
guoju0808 7cf8c5b660 feat: manager/Projects 移动端适配 (工具栏横滚/筛选栏堆叠) 2026-08-26 11:19:00 +00:00
guoju0808 e5d7d08ec1 feat: PlanEdit 移动端适配 (单列堆叠/label 上对齐/按钮全宽) 2026-08-26 11:17:30 +00:00
guoju0808 a763598637 feat: ManagerProjectDetail 移动端适配 (单列堆叠/表格横滚/按钮全宽) 2026-08-26 11:16:43 +00:00
guoju0808 58f02f1262 fix: AdminLayout 汉堡抽屉蒙层被 aside 遮挡不可点击 2026-08-26 11:15:19 +00:00
郭庆泰 a837e43b53 chore: 新增 refer 参考表格组件
- gr-table.vue: 通用 el-table 封装 (展开详情 + 事件透传)
- gr-table-simple.vue: 简化版表格
- gr-table-plus.vue: 增强版 (筛选框 + 展开详情)
2026-08-26 19:14:34 +08:00
guoju0808 8a08c8378f feat: 全局移动端适配 AdminLayout 汉堡抽屉 + 67 页通用规则 2026-08-26 11:13:12 +00:00
guoju0808 d2fe5a4035 style: 重塑政务风格 + 操作列统一 el-link + 表格紧凑化
业务背景
- ry-vue3 为政务/卫健委风合规管理系统 (医疗机构合规系统), 不要可爱配色、不要插画
- 品牌色: 主色 #15803D (低调深绿) + 次色 #0E7490 (青蓝), 不要蓝色系主色

变更概要
1. 全局地基
   - theme.scss: Element Plus 主色改为 #15803D, slate 9 档, 联动组件库
   - main.scss: 字体/页面骨架/筛选栏/表格/控件/滚动条 全套样式
   - AdminLayout.vue: 政务顶栏 + 浅色侧栏
   - Workbench.vue: 替换原绿底大字卡为 KPI 白底色条 + 快捷入口 + 进度条

2. 表格操作列改造
   - el-button link 全面替换为 el-link (:underline="false" + type="primary/danger")
   - 36 文件 132 处替换, 操作列外加 .table-actions 容器 (内含分隔线)
   - 修复 el-link 不支持的属性 (size="small"/text/loading)

3. 筛选栏
   - 弹性布局 + gap 14px 16px + align-items: flex-start + min-height 32px
   - 删除所有 scoped .filter-form 覆盖 (28 处) 让全局样式生效
   - 控件宽度 180px 统一, 标签 32px 居中, 折行不紧贴

4. 表格紧凑化
   - cell-padding 10px → 6px, 表头高度 36px
   - 行高 ~46px → ~36px, 字号 13px

5. 每页默认 20 条
   - 21 文件 pageSize: 10 → 20

6. meetings 操作列折叠
   - 11 操作 → 外置 3 个主操作 + 1 个"更多" el-dropdown (8 个次操作)
   - width 500px → 260px
   - 配 .op-dropdown / .op-caret 样式 (hover 旋转)
   - 新增 onMoreAction dispatch 函数 (复用原 handler)

7. 操作列文字防拆行
   - .table-actions flex-wrap: nowrap + white-space: nowrap
   - el-link padding 0 8px → 0 6px, flex-shrink: 0

8. 环境配置
   - .env.development: 直连远端 https://risingdoctor.com/hg-api (绕过 vite proxy 卡顿)
   - vite.config.js: proxy fallback 保留
2026-08-26 11:04:15 +00:00
郭庆泰 b0256ccac3 feat: 会议劳务/会务材料分轨审核 + 注册页标题 + 下拉空值修复
会议材料分轨 (material_audit_stage 单轨 → labor/service 双轨):
- biz_meeting: labor_audit_stage/labor_compliance_approved + service_audit_stage/service_compliance_approved 四列替换原单轨两列
- StageDeriver: 单轨状态机(R/N/C0/C1/A) + 角色优先级选代表轨 + 会议物理态取两轨最小进度
- MeetingAuditStageEnum / 前端 meetingStage.js 镜像: 分轨推导 + 颜色跟随角色展示阶段(避免文案与颜色错位)
- BizMeetingController/ServiceImpl/AuditLog + mapper + MeetingStageScheduler 同步分轨字段
- MeetingDetail/Meetings/doctor/executor Meetings/ManagerProjectDetail/ManagerProjectsAssign/PublicityDetail 同步双轨

其它:
- 注册页 (执行单位/专家/支持单位) 加居中页标题
- DoctorDeptSelect/DoctorTitleSelect 空字符串统一 null, 避免挂载必填项飘红
- BizOrgMapper sponsor/executor options 加 status 字段
- sponsor/NewPerson 编辑态 orgName 只读
2026-08-26 18:13:22 +08:00
郭庆泰 b5b3e3a213 feat: 会议批量审核 + 公示按发布时间倒序 + 现场照片 dialog 预览 + 重复报错精确
- 会议列表 manager 批量合规审核 (批量通过/退回, best-effort 逐条回执)
- 公示列表按 publish_time 倒序, 发布/开通写本地 publish_time (修 toISOString UTC 时区 bug)
- 签到表/前全景/后全景「查看照片」改 dialog 预览 (复用 Preview.vue)
- 手机号/用户名重复报错精确提示 (后端 fieldMap + 前端 duplicateTip)
- 医生首页欢迎语改「欢迎使用合规系统」
2026-08-26 00:41:33 +08:00
郭庆泰 ea2024d083 feat: 会议ID应用赋值 + 会议表单/详情优化 + admin工作台统计与用户管理
- meetingId 由 DB 自增改为应用赋值 10 位数字 (yyMMdd + 4 位序列, Redis 按日期计数)
- 会议开始时间不能晚于结束时间校验; 参会人表单身份证附件/角色单独一行
- 会议详情左右列比例 7:3 -> 8:2 (材料审核列收窄)
- admin/workbench 用户总数/角色类型数/各角色分布统计修复 (改用 listByRole 按 role_type 过滤)
- 新增 admin 用户管理接口 + 门户页脚 + H5 签到/上传优化
2026-08-25 23:33:14 +08:00
郭庆泰andClaude 591a43fe61 feat: 会议提交剩余时间+解冻 + 会务/劳务材料批量下载 + 多角色人员/账号模块完善
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-25 06:53:18 +08:00
郭庆泰 0c882ae846 feat: 本地 Java 发票 OCR + 策划方案多角色开放 + H5 相机脱敏修复
- OCR: 进程内 PaddleOCR ONNX Runtime 识别替代远程 Python 微服务
  (新增 ocr/core/service/config 引擎, 删 OcrClient/OcrConfig, PDF 文本层优先 + QR 快路径)
- 投稿: 项目设计投稿 → 项目策划方案, doctor/executor/sponsor 三角色开放
  (BizProjectPlan 按非 admin/manager 隔离, 复用 Submissions.vue, 设计文件改 OssFileUploader)
- H5: <video> 去掉 autoplay + safePlay 重试, 穿透 uni-app wrapper 找原生 video
- 脱敏: 签到表高斯模糊由横向条带改为全高竖条带 (20%~50% 宽度)
- 域名: ringdoctor.com → risingdoctor.com
2026-08-24 19:23:53 +08:00
郭庆泰andClaude 904e28710f feat: 生产部署 + 会议全链路 (执行方分配/费用结算/签到脱敏/H5相机)
- 生产 nginx 三路径: ry-vue3 /hg/, ry-h5 /camera/, API /hg-api, .env 分环境
- 签约链接/摄像头 base-url 走 yml, 不再硬编码 /hg 与 localhost
- 新增 biz_project_executor_assign (镜像 sponsor_assign) 执行方项目级分配
- 会议费用后台汇总 FeeCalcScheduler + 结算回写项目金额 + 状态流转调度
- 签到表拍照高斯模糊脱敏 extra_oss_url, 新增 PosterService/StageDeriver
- 清理 biz_support_intent 旧表 (6 Java/XML 删除)
- ry-h5 相机黑屏修复: 显式 video.play() + 动态 apiBase 上传
- 资源: simhei 字体 / logo.png / qrcode_1.png / favicon.ico

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-24 01:00:09 +08:00
郭庆泰 80a276e661 fix(theme): 4 个亮色 #4da2b5/#4db892/#80bdca/#80ccb1 不适合做背景色
问题: 之前 Element mix(white) 算法在 S=100% 主色 (#007A95)
上生成的中色 (#4da2b5 / #4db892) 跟主色对比度太低,
作 hover-bg / 选中态底色时白字看不清.

新算法: HSL 降饱和 + 提亮度 (色相不变, 灰度提升).
  text    = S-40 L+15  (中蓝可读, 链接用)
  light   = S-65 L+40  (灰中, disabled 浅背景)
  lighter = S-65 L+50  (灰浅, hover-bg / 选中态, **够淡字可读**)
  mix     = S-75 L+60  (近白, focus border)

主色 (#007A95):
  text    #2d9cb4  lighter #b7d6dd
  light   #95c2cc  mix     #dde8ea

次色 (#009963):
  text    #2eb887  lighter #baded1
  light   #98cdba  mix     #dfece7

Element Plus 联动:
  --el-color-primary-light-9 → var(--brand-primary-mix) (近白, 最浅)
  --el-color-success-light-9 → var(--brand-secondary-mix)

theme.js derivePalette 同步改成同算法 (运行时 setBrand 仍正确)
2026-08-22 21:31:08 +08:00
郭庆泰 746e9e01b4 fix(theme): 4 个亮色派生 #49deff/#4dffc0/#06d2ff/#0affa9 改为 Element mix() 算法
之前 HSL +35% 提亮算法生成荧光色 (例 #49deff / #4dffc0),
对政务/严肃网站完全不适用, 跟 Element Plus 默认色系也对不上.

新算法 (浅色) = Element Plus mix(white, base, N*10%):
  --brand-primary-light   = mix 50% white   (背景 / disabled)
  --brand-primary-lighter = mix 70% white   (hover-bg / 选中态)
  --brand-primary-text    = mix 30% white   (链接默认)
  --brand-primary-mix     = mix 80% white   (输入框 focus border)

新色 (全是低饱和度灰蓝/灰绿, 跟 Element 默认同源):
  PRIMARY (#007A95):
    light    #80bdca    lighter #4da2b5
    text     #b3d7df    mix     #3395aa
  SECONDARY (#009963):
    light    #80ccb1    lighter #4db892
    text     #b3e0d0    mix     #33ad82

深色 (deep/darker) 保持 HSL 算法不变 (合理, 政务场景需要深色 hover)

theme.js derivePalette 同步改成双轨: HSL 调深 + Element mix 调浅
2026-08-22 21:26:50 +08:00
郭庆泰 3c23222841 fix(theme): 修 hover 颜色不正确 - 干掉硬编码老蓝 + fallback 双重失效
核心问题 (按影响面排序):

1. Login.vue: login-btn hover 是硬编码 Tailwind blue-800 #1e40af
   跟主色 #007A95 青蓝完全不同色系, hover 突变
   - 改成 var(--brand-primary-deep) (#004858 暗青蓝)

2. 14 个页面写了 :deep(.el-button--primary:hover) { background:
   var(--brand-primary-deep, var(--brand-primary)) } — 第二参数
   fallback 让 hover 退化成主色 (不变深), 视觉上'按钮没反应'
   - 删第二参数, 直接 var(--brand-primary-deep)

3. AdminLayout: 菜单激活背景硬编码 #1890ff (Ant 老蓝),
   跟青蓝主题对比突兀
   - 改成 var(--brand-primary)

4. 17 处 .breadcrumb a:hover / .hint-link:hover / el-button.is-link:hover
   同样 fallback 双重失效问题, 删 fallback

5. 其余硬编码老蓝 (#1890ff / #409eff) 在:
   - OssFileUploader / OssImageUploader / IdCardUploader (upload hover border)
   - Login.vue (modal-btn, accent-color, user-type-item hover)
   - doctor/Account.vue (breadcrumb link, 章节左边竖线)
   - ManagerProjectsAssign.vue (合同链接)
   - PublicityDetail.vue (ann-menu hover)
   全部换成 var(--brand-primary) / var(--brand-primary-deep)

6. 修 PublicityDetail.vue 注释错误:
   原: // 深色用品牌主色 (#1890ff), ...
   正: 二维码 dark 是 #1f2937 (深灰), 不是主色

总计 24 个文件
grep '#1890ff|#409eff|#096dd9|#0050b3|#1e40af|#1d4ed8' 已 0 命中
2026-08-22 21:22:17 +08:00
郭庆泰 d9316e87d0 feat(ry-h5): logo 改为项目根 logo.png, 加 favicon
- ry-h5/static/logo.png 72x72 占位图 → 776x776 项目 logo
- ry-h5/index.html 加 <link rel='icon' type='image/png' href='/static/logo.png'>
- 代码里现无 logo 引用 (POC 只有相机页), 但文件统一品牌
2026-08-22 20:56:48 +08:00
郭庆泰 cec39554ee style(portal+login): 7 个 logo 占位符 '医' 换为 logo.png 图片
- components/PortalShell.vue (navbar + footer, 共享给 3 个注册页)
- views/portal/Home.vue (navbar + footer)
- views/portal/ArticleView.vue (navbar + footer)
- views/portal/SpecialPlanDetail.vue (navbar + footer)
- views/portal/Publicity.vue (navbar + footer)
- views/portal/PublicityDetail.vue (navbar + footer)
- views/auth/Login.vue (登录页 logo)

每个 .logo-icon / .footer-logo-icon:
  HTML: <div class='logo-icon'>医</div> → 含 <img src='/logo.png'>
  CSS:  删 background/color/font-size/font-weight (字标样式)
       改 overflow:hidden + object-fit:contain (图片容器)

全站 '医' 字符占位符清零.
2026-08-22 20:54:45 +08:00
郭庆泰 5b54e84c4d style(layout): 侧栏 logo 占位符 '医' 换成 logo.png 图片
- aside-logo 内 <div class='logo-icon'> 字符占位符 → <img src='/logo.png'>
- .logo-icon 改成 img 容器样式 (44x44, object-fit: contain)
- 删 logo-sub 'BAHIM 工作台' (与角色名重复)
- 浏览器 favicon 保持 logo.png (上一 commit)
2026-08-22 20:50:43 +08:00
郭庆泰 93133c2707 feat(favicon): 网站图标改为 logo.png
- ry-vue3/public/logo.png 从项目根 logo.png 拷入 (776x776 PNG)
- index.html head 加 <link rel='icon' type='image/png' href='/logo.png' />
- 浏览器 tab/书签/PWA 都用这个 logo

侧栏 logo 区 (AdminLayout 的 aside-logo 当前是 BAHIM 工作台 文字)
未改, 等用户确认.
2026-08-22 20:48:53 +08:00
郭庆泰 884eadcd8e feat(theme): 加 --brand-secondary 翠绿 #009963 (双品牌色系)
- theme.scss 加 7 个 --brand-secondary-* 派生色 (HSL 算法)
- 绑定 Element Plus --el-color-success* (绿=成功语义)
- theme.js derivePalette 重构成通用函数 (base, prefix), 加 setBrandSecondary / applyStoredBrands
- main.js 启动改调 applyStoredBrands, 主色+次色一起从 localStorage 恢复

主色 primary (青蓝 #007A95) / 次色 secondary (翠绿 #009963)
改 theme.scss :root 两个变量即可全局换色.
2026-08-22 20:46:28 +08:00
郭庆泰 e5fb015cd8 feat(theme): 主色从深海军蓝 #1E3A8A 改为青蓝 #007A95
改动 theme.scss :root 7 个 CSS 变量:
- --brand-primary        #1E3A8A → #007A95 (青蓝/cyan)
- --brand-primary-deep   #152a66 → #004858
- --brand-primary-darker #0d1d4d → #002129
- --brand-primary-light  #3a55a3 → #00acd2
- --brand-primary-lighter #c1cbe6 → #49deff
- --brand-primary-text   #4f6dbf → #06d2ff
- --brand-primary-mix    #8e9ad1 → #7ce7ff

派生色算法 (theme.js derivePalette):
- deep/darker: lightness -12 / -22
- light: lightness +12
- lighter: lightness +35
- text: lightness +22
- mix: lightness +45

新色 HSL: H=191° S=100% L=29% (青蓝范围)
派生色按 HSL lightness 算法重算, 跟 theme.js derivePalette() 一致.

业务代码全部用 var(--brand-primary) 变量, 无任何硬编码
(上个 commit cd01550 已清理), 换色自动全局生效.

Element Plus 联动变量 (--el-color-primary 等) 通过 main.js 同步, 也跟着换.
2026-08-22 20:40:54 +08:00
郭庆泰 cd01550d80 refactor(style): 全部硬编码 #1E3A8A 替换为 var(--brand-primary)
为支持全局换色 (theme.scss :root 改 1 行即换主色), 把所有业务代码里
硬编码主色清理掉, 改用 CSS 变量.

扫描结果 (grep -ri '#1[Ee]3[Aa]8[Aa]' src/):
- theme.scss:21 定义本身 → 保留
- theme.js:7-8 JSDoc 注释示例 → 保留
- 其它 19 处业务硬编码 → 全部替换

替换明细:
- auth/Login.vue     13 处 (login-tabs/bg/color/border/btn/links)
- manager/Workbench.vue 2 处 (stat-card bg + border, 跟上个 commit 对齐)
- sponsor/SponsorProjects.vue 1 处 (var(--brand-primary, #1E3A8A) fallback → 裸变量, SKILL 禁 fallback)
- doctor/SignContract.vue 1 处 (同上)

rgb(30,58,138) / rgba(30,58,138,X) 形式: 0 处.

效果: 改 theme.scss :root --brand-primary 一行, 全项目颜色自动跟随.
派生色 (deep/darker/light/lighter/text/mix) 已在 theme.scss 内 HEX→HSL 自动算, 不需手动改.
2026-08-22 20:36:47 +08:00
郭庆泰 976178c3f1 fix(admin/workbench): stat-card 改单色 var(--brand-primary), 跟 manager/Workbench 一致
上次 0f124de commit 用了 linear-gradient + 蓝色阴影, 跟项目其它 workbench 不一致.

按用户要求:
- 背景: linear-gradient → var(--brand-primary) 单色 (不用渐变)
- 边框: 删 → 加 1px solid var(--brand-primary) (单色, 跟 manager 同款)
- hover: translateY + box-shadow → opacity .9 + translateY(-2px) (manager 同款)
- label 颜色: rgba(255,255,255,0.75) → rgba(255,255,255,0.85) (跟 manager 一致)

现在 admin/manager 两个 workbench 的 stat-card 视觉完全一致, 都用系统主色变量.
2026-08-22 20:32:29 +08:00
郭庆泰 0f124dea61 style(admin/workbench): 上方 5 个 KPI stat-card 改为深色底白字
改动 (仅 CSS, 业务逻辑 100% 保留):
- .stat-card 背景: #fff → linear-gradient var(--brand-primary) → var(--brand-primary-deep)
- .stat-card 边框: 1px solid #f0f0f0 → 删 (深色底不需要边框)
- .stat-card 文字: inherit → #fff (白字)
- .stat-card hover: border-color 变化 → translateY(-2px) + 蓝色阴影上浮
- .stat-label 颜色: #8c8c8c → rgba(255,255,255,0.75) (白字次级)
- .stat-value 渐变文字 hack → 直接 color: #fff (去掉 -webkit-background-clip/text-fill-color)

视觉效果: 5 个 KPI 卡变深海军蓝渐变方块, 白字 + 半透明 label, 鼠标 hover 上浮 2px

不变: 模板/grid 布局/点击跳转逻辑/data load 函数 都不动
2026-08-22 20:31:41 +08:00
郭庆泰 5409b7f815 feat(RichEditor): 富文本编辑器支持 OSS 图片上传
原 customUpload: () => {} 是空函数, 工具栏点图片/粘贴图片/拖拽图片都无效.

参考 hwt-web/wang-editor4.vue 的思路, 但用项目已有的 /common/oss/sign 签名 + utils/oss.uploadToOss,
不在前端硬编码 accessKey (hwt-web 那种写法有 key 泄露风险).

新行为:
- 工具栏点 '图片' → 选本地 → uploadToO Oss → insertFn(url) 插入 OSS URL
- 粘贴图片 (Ctrl+V) → 同上
- 拖拽图片 → 同上
- 非图片文件 → ElMessage.warning '只支持图片文件'
- >5MB → ElMessage.warning '图片大小不能超过 5MB'
- 上传失败 → ElMessage.error

文件存到 OSS 'ry8080/rich-editor/' 目录.

适用场景:
- BizArticleEdit (协议管理)
- BizSpecialPlanEdit (专项计划管理)
- 其它用 <RichEditor> 的页面立即获得上传能力

业务逻辑 100% 保留: toolbarConfig excludeKeys (排除视频), placeholder, v-model 双向绑定, change emit 都不动.
2026-08-22 20:28:28 +08:00
郭庆泰 6710c459ce style(special-plan): 对齐 BizSpecialPlanEdit 到 People.vue 风格 (form 页)
改动 (仅 UI/CSS, 业务逻辑 100% 保留):
- 删 <div class="header"> 返回按钮 + 大标题 → 改用 <div class="breadcrumb">
  首页 / 网站管理 / 专项计划管理 / {{isEdit ? '编辑' : '新建'}}
- form-actions 改用 <el-form-item class="form-actions"> 包裹 (隐藏 label, 顶部
  border-top 分割线, 按钮左对齐)
- 取消按钮 @click="$router.back()" 改 router.push('/admin/special-plan')
  避免外链直接进编辑页时 back 跳出 SPA
- 删未用 import { ArrowLeft } (返回按钮已删)
- page-card 加 background/border/padding/max-width 1200px (form 页标准, 居左不居中)
- 加 .breadcrumb / .form-actions CSS (跟 MeetingNew.vue / ProjectsNew.vue 同款)

不动的:
- isEdit computed / loadDetail / save / onTypeChange handler
- 表单字段定义 / 校验逻辑
- RichEditor / OssFileUploader 用法
2026-08-22 20:26:05 +08:00
郭庆泰 e2df096f33 fix(meetings): 删 MeetingNew 死代码 import (useUserStore 实际未用, 路径错)
commit 996ac13 加了 import { useUserStore } from '@/store/modules/user'
+ const userStore = useUserStore(), 但:
- 实际 userStore 在文件里完全没被引用 (roleSegment 直接走 route.path.split('/'))
- import 路径错了: 真实路径是 @/store/user, 不是 @/store/modules/user
  (src/store/ 下只有 user.js, 没有 modules/ 子目录)

上次 commit e68476e 把 MeetingNew 挪到 views/meetings/ 后, Vite import-analysis
触发解析错误: '@/store/modules/user does the file exist?'

修法: 直接删 import + userStore 声明 (本来就没用).
roleSegment/isAdmin 仍然从 route.path 算, 不依赖 store.

为什么 996ac13 时没暴露:
- 用户没在那个 commit 后跑过 npm run dev
- e68476e 的 git mv 让 vite 重新分析 import, 才报出来
2026-08-22 20:23:46 +08:00
郭庆泰 e68476eeeb refactor(meetings): MeetingDetail + MeetingNew 挪到公共目录 views/meetings/
会议管理 3 个公共组件统一放在 views/meetings/ 下:
- Meetings.vue          (列表, 上轮 Option C 已挪)
- MeetingDetail.vue     ← 本次挪
- MeetingNew.vue        ← 本次挪

理由:
- 3 个组件都是 admin/manager 共用 (路由前缀对称指过去)
- 目录名 'meetings' 精确表达 '会议公共组件' 语义
- 避免 grep 'manager/Meeting*' 误以为是 manager 专属

router/index.js 4 个 import 路径同步更新:
- admin-meetings-detail / admin-meetings-new
- manager-meetings-detail / manager-meetings-new

git mv 保留文件历史 (rename detection), 无新增代码逻辑改动.
2026-08-22 20:22:46 +08:00
郭庆泰 996ac13994 refactor(meetings): MeetingNew admin/manager 双前缀路由 (admin 不用 /manager 路径)
把 'admin 用 manager 前缀 URL' 这个跨角色硬编码改对称.

router:
- 新增 admin-meetings-new → manager/MeetingNew.vue (公共页)

MeetingNew.vue goBack():
- new 模式: admin 跳 /admin/projects, manager 跳 /manager/projects (用 projectsBase computed)
- edit/copy 模式: admin 跳 /admin/meetings, manager 跳 /manager/meetings (用 meetingsBase computed)
- roleSegment / isAdmin 从 route.path.split('/')[1] 计算, 不依赖 userStore

meetings/Meetings.vue onEdit/onCopy:
- 引入 newRouteName computed (isAdmin ? 'admin-meetings-new' : 'manager-meetings-new')
- router.push({ name: newRouteName.value, query: {...} })

效果:
- admin 点 '新建/修改/复制' → URL 是 /admin/meetings/new, 不再跨到 /manager/meetings/new
- admin 取消保存 → 回 /admin/meetings (列表) 或 /admin/projects (新建上游)
- manager 行为不变
2026-08-22 20:21:01 +08:00
郭庆泰 62a855e562 refactor(meetings): admin/manager 会议管理合并为 1 文件双路由 (Option C)
把 admin/AdminMeetings.vue (212 行) + manager/Meetings.vue (262 行) 合并到
新位置 views/meetings/Meetings.vue (~265 行), 双路由指向同一组件.

角色感知实现 (route.path.split('/')[1] 算 roleSegment):
- 面包屑: admin 显示 '首页 / 项目管理 / 会议管理', manager 显示 '首页 / 会议管理'
- 详情跳转: admin 跳 /admin/meetings/detail/X, manager 跳 /manager/meetings/detail/X
- 修改/复制: 双角色都跳 manager-meetings-new (跨角色 URL, MeetingNew.vue 公共页)

admin 自动获得 manager 全部权限 (5 操作按钮 + 批量提交 + 备注筛选 +
详细删除确认文案), 跟 'admin 应该拥有全部权限' 的产品语义对齐.

净收益:
- 代码 -474/+265 = -209 行 (-44%)
- 真相源从 2 文件变 1 文件, 后续新增功能只改 1 处
- 物理消除 admin/manager 功能集漂移风险
2026-08-22 20:18:08 +08:00
郭庆泰 2eb2d1a43b feat(front): 项目/会议管理 admin 端补齐 + 删除按钮 + 级联 UI + 角色劳务组件
admin 会议管理:
- 新建 admin/AdminMeetings.vue (查看/删除/批量删除, 面包屑 首页/项目管理/会议管理)
- AdminLayout.vue 加 /admin/meetings 菜单
- router/index.js 加 admin-meetings + admin-meetings-detail 路由
- MeetingDetail.vue admin 删除按钮改 admin+manager 双角色可触发 (onAdminDelete 跳回按角色)

manager 会议管理:
- Meetings.vue 加批量删除 + 删除按钮 + 删除确认文案 (6 张表级联)
- MeetingDetail.vue 删除按钮 v-if 改 canDeleteMeeting = isAdmin || isManager

manager 项目管理:
- Projects.vue 加批量删除 + 删除项 + doDelete 改走 cascade (5 张项目表 + 会议链)
- ProjectsNew.vue style-alignment: page-card 居左 (max-width 1200px, 无 margin auto), form-actions 包在 el-form 内
- Projects.vue + Meetings.vue + AdminMeetings.vue 删页内冗余删除提示

store + 组件:
- store/user.js 加 isAdmin getter
- components/ProjectRoleSelect.vue 新建 (项目级角色劳务下拉, 接 roleLabor)
2026-08-22 20:16:46 +08:00
郭庆泰 0eb5da6ea8 feat(biz_project+meeting): 项目+会议软删除级联, admin/manager 双角色可删
biz_project* 5 表级联 (project/plan/assign/sponsor_assign/rating) + 会议链
biz_meeting* 6 表级联 admin-only → admin/manager 可删

DB:
- 5 ALTER TABLE 加 is_deleted TINYINT DEFAULT 0 NOT NULL (biz_project/plan/assign/sponsor_assign/rating)
- biz_meeting* 6 表已有 is_deleted 列 (上轮已 ALTER)

Domain (10 文件):
- 5 个 biz_project* 加 isDeleted 字段
- 6 个 biz_meeting* 加 isDeleted 字段
- (audit_log 列名特殊: 使用 deleted 字段存操作类型, 不冲突)

Mapper 接口 (10 文件):
- 5 个 project mapper 加 softDeleteByProjectId / softDeleteByProjectNo
- 5 个 meeting mapper 加 softDeleteByMeetingId
- BizMeetingMapper 加 selectIdListByProjectId (级联调用)

Mapper XML (10 文件):
- 所有 SELECT 加 is_deleted=0 过滤 (含 JOIN 子查询)
- 加 softDeleteByXxx UPDATE (10 处)
- BizMeetingMapper.xml 的 plan LEFT JOIN 加 proj.is_deleted=0 防悬挂

Service (3 文件):
- IBizProjectService.softDeleteCascade/Batch (含会议链调用)
- IBizMeetingService.softDeleteCascade/Batch
- BizProjectServiceImpl / BizMeetingServiceImpl @Transactional(rollbackFor=Exception.class)

Controller (2 文件):
- BizProjectController.DELETE 改 admin+manager 可删
- BizMeetingController.DELETE 改 admin+manager 可删 (放宽权限)
2026-08-22 20:16:40 +08:00
郭庆泰 da46a45682 feat(select): DoctorDeptSelect / DoctorTitleSelect 加 "其他" 逃生口 (虚拟项 + 下方 input + 自动回填识别) 2026-08-22 16:56:37 +08:00
郭庆泰 2bc2b7f36b feat(detail): 参会人 dialog 科室/职称 改用 DoctorDeptSelect / DoctorTitleSelect (与专家页对齐规范下拉) 2026-08-22 16:50:58 +08:00
郭庆泰 67fc425639 style(detail): 参会人 dialog 改 2 列布局 (760px grid 1fr 1fr) + close-on-click-modal=false 防误触关闭 2026-08-22 16:48:24 +08:00