Files
svc-hall-front/README.md
T
chenxing 6d972fe0cc
build / build (push) Successful in 4m51s
docs: 重写 README(原为 Notice 前端副本)+ 修正 context-path 注释
- README.md 整篇是通知公告前端的副本(标题「通知公告前端」、/notice/* 路由表、
  src/assets/mock/noticeapi.ts、NoticeUpload.vue、VITE_SERVICE_HOST=.../notice 等
  本仓不存在的文件),仓库唯一人类可读文档描述的是另一个应用 → 按本仓实际代码重写:
  启动/脚本/运行期配置优先级、路由与 modId 契约、目录要点、表单 schema 契约纪律
  (行不可变→已发布版本保存不传 id)、CI 构建发布链路、验收口径(vue-tsc 不可用)
- host.config.ts:注释里残留「base/prod /notice」,本应用 context-path 是 /svc-hall
2026-09-16 22:24:04 +08:00

82 lines
4.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 办事大厅前端(svc-hall-front)
云海平台子应用:办事大厅(事项库 + 自定义表单 + 办件记录)。Vue 3 + Vite + view-ui-plus + alova。
> 说明:本文件此前误为本仓 Notice(通知公告)前端的副本(描述 `/notice/*` 路由、
> `src/assets/mock/noticeapi.ts`、`NoticeUpload.vue` 等本仓不存在的文件),2026-09-16
> 依据本仓实际代码重写。
## 本地启动
```bash
npm install
npm run dev # http://localhost:8087
```
`dev` 模式下 `serviceHost` 留空,接口走同源相对路径 `/api/...`,由 vite proxy 转发到本地后端
`http://localhost:8086`(后端 CAS 过滤器对 `/api/*` 不回 CORS 头,浏览器直连会被拦,必须同源代理)。
本地完整链路还需:UserBase(base/sso 鉴权)、流程中心 `http://localhost:8085`(撤回、查看进度)。
另有 `npm run dev:mock`(`.env.mock`)用于后端不可达时的纯前端联调。
## 脚本
| 命令 | 说明 |
|---|---|
| `npm run dev` | 本地联调(读 `.env.dev`) |
| `npm run dev:mock` | 纯前端模式(读 `.env.mock`;mock 中间件仅在 `--mode mock` 启用) |
| `npm run build` / `build:base` / `build:ld` / `build:prod` | 构建产物恒为 `dist` 根(CI 打包要求 zip 根直接有 `index.html`,见 `vite.config.ts` 头注) |
| `npm run api:gen` | alova 接口代码生成 |
## 运行期配置
优先级见 `src/assets/config/host.config.ts`:① 线上 `window.__APP_CONFIG__`(`index.html` 引导脚本同步拉
`/<contextPath>/api/env-config?target=front`,projman 配置管理维护)→ ② 本地 `import.meta.env.VITE_*`
(build 产物不读任何 `.env.*`)→ ③ 同域推导兜底。
## 页面与路由(`src/router/routes.ts`)
| 路径 | 页面 | modId |
|---|---|---|
| `/svc/item` | 办事事项(管理面) | 23 |
| `/svc/item/edit` | 编辑事项 | 28(parentId 23) |
| `/svc/dict` | 服务字典 | 24 |
| `/svc/form` | 表单管理 | 25 |
| `/svc/form/designer` | 表单设计器(拖拽三栏,`?id=` 回填) | 25(parentId 25) |
| `/svc/apply` | 办件记录(管理面) | 26 |
| `/my` | 我的办件(用户面) | 27 |
| `/apply` | 在线办理(用户面,query 传 `siteCode`/`itemCode`) | 不挂菜单 |
| `/apply-detail` | 办件详情(用户面,query 传 `id`) | 不挂菜单 |
`modId` 是菜单 ↔ 路由的稳定契约(UserBase `app_module` 按本应用 appKey 配置);`/` 与未匹配路径都回落
`/my`(详情页走 query 传参,拼成路径参数会 no-match)。
## 目录要点
- `src/api/module/svc.ts`:接口封装(alova;`siteApi`/`svcItemApi`/`svcDictApi`/`svcFormApi`/`svcFlowApi`/`applyApi`/`fileApi`)
- `src/utils/site.ts`:当前站点上下文(`localStorage.svchall.site` 持久化,管理页共用)
- `src/components/DynamicForm.vue`:表单 schema 渲染器(`{groups:[{title,fields:[…]}]}`,一期 11 类控件;
多选类值为 `string[]`,附件/图片为上传返回体数组 `[{id,fileName,fileUrl,fileSize,mimeType}]`)
- `src/views/svc/FormDesigner.vue` + `src/components/designer/*`:拖拽设计器(左组件库/中多分组画布/右属性面板,保存前可预览)
- `src/types/designer.ts`、`src/utils/designer/schema.ts`:设计器类型、控件字典与 schema 序列化
## 契约纪律(改表单相关代码前必读)
- schema 由后端 `FormValidator` 强校验:属性白名单 16 项(无 `precision`)、`key` 限
`^[A-Za-z0-9_]{1,64}$` 且表单内唯一、`select/radio/checkbox/multiselect` 必须有非空 `options`、
`maxSize` 单位 **MB**、`maxFiles` 缺省或 0=不限。设计器序列化只输出白名单键(剔除内部 `_uid` 与空串)。
- 表单行不可变:已发布版本改结构 = 后端按 `code` 克隆出新草稿版本。设计器装载到已发布版本时**保存不传 `id`**
(传了会被后端直接拒「该版本已发布不可修改」),装载到草稿才带 `id` 就地更新。
## 构建与发布
push 到 `main` → gitea CI(`.gitea/workflows/build.yml`):`npm run build` → 打包
`svc-hall-front-<sha8>.zip` → 推 Nexus raw → 通知 projman 建档(`status=pending`)。
线上部署由运维/管理员在 projman「前端发布」手动触发,push 不会自动上线。
## 验收口径
`npm run build` 退出 0 且 `dist/static/js/<页面>-<hash>.js` 正常产出。
注意:仓库自带 `vue-tsc@1.8.27` 与 `typescript@5.9.3` 不兼容,`npx vue-tsc --noEmit` 会直接抛
`Search string not found: "/supportedTSExtensions…"`(工具链问题,非代码错误),当前**无类型门禁**。