build / build (push) Successful in 1m47s
任务书 P95 W4/W5/W6。填报入口收回中心后,前端不再从应用模块树里挑 /f/{code} 行算清单。
- My.vue「可填写」:数据源 store.modules → GET /api/form/my/fillable,只画 canFill=true;
空态文案改「表单发布后按面向人群自动出现在这里」,不再引导去 UserBase 配模块行
- AppContext.vue 整页改版:清单吃 fillable?appCode=,三档按 myTier 渲染
(填报恒显 + 单表单直落保留 / 数据管理 MANAGE∪ADMIN / 统计 ADMIN);
GetUserMod?appCode 仍拉一次,唯一用途=交给内嵌 Data.vue 判导出锚点(P76 机制原样),
空树整页告警与「树里没有 /f/ 行」分支退役——取树失败只等于不画导出按钮(fail-closed)
- fillLink 新增 fillRouteOf(与 buildFillLink 同一条 appCode 规则,点进去与分享出去同址);
modulePerms 删 fillCodesOfModules(唯一消费者已退役),canExport/anchorRows/hasPage 保留勿伤;
menuRoute 的 /f/ 解析与门户导航未动(分享链接、P87 探针照旧)
- mock:快应用树改四行终态(删填报行),新增 /api/form/my/fillable 桩覆盖 FILL/MANAGE/ADMIN
- vue-tsc --noEmit 与 vite build 双绿;p87 探针由当前源码重打包后 15/15 复跑绿
69 lines
3.4 KiB
TypeScript
69 lines
3.4 KiB
TypeScript
/**
|
||
* 填报面 API(用户面,CAS 会话):resolve / submit / my-list / upload。
|
||
*
|
||
* 沿 P49 写法:alovaInstance.Get<T>(url, {params}) / Post<T>(url, body, {params})。
|
||
* 与后端 FormResolveController / FormAnswerController 对齐。
|
||
*/
|
||
import { alovaInstance } from "@/utils/alova/alova-iview";
|
||
import type { ResolvedForm, SubmitRequest, SubmitView, MyAnswerItem } from "@/types/answer";
|
||
import type { AnswerDetail, FillableForm, MyAnswerViewItem } from "@/types/data";
|
||
|
||
/** 解析当前发布版本(契约 §1:入口寻址) */
|
||
export function resolveForm(code: string, appCode?: string) {
|
||
const params: Record<string, string> = { code };
|
||
if (appCode) params.appCode = appCode;
|
||
return alovaInstance.Get<ResolvedForm>("/api/form/resolve", { params }).send();
|
||
}
|
||
|
||
/** 提交答卷(契约 §5) */
|
||
export function submitAnswer(body: SubmitRequest) {
|
||
return alovaInstance.Post<SubmitView>("/api/form/submit", body).send();
|
||
}
|
||
|
||
/** 我的答卷列表(按 submitter 过滤,"我的提交"段) */
|
||
export function listMyAnswers(formCode: string, appCode?: string) {
|
||
const params: Record<string, string> = { formCode };
|
||
if (appCode) params.appCode = appCode;
|
||
return alovaInstance.Get<MyAnswerItem[]>("/api/form/my/list", { params }).send();
|
||
}
|
||
|
||
/** 软删我的答卷(确认对话框后调用) */
|
||
export function deleteMyAnswer(answerId: string) {
|
||
return alovaInstance.Post<void>("/api/form/my/delete", { answerId }).send();
|
||
}
|
||
|
||
/** 编辑我的答卷(按钉住 version 校验) */
|
||
export function editMyAnswer(answerId: string, values: Record<string, any>, summary?: string) {
|
||
return alovaInstance.Post<SubmitView>("/api/form/my/edit", { answerId, values, summary }).send();
|
||
}
|
||
|
||
// ==================== 我的填写两视图(T8,/my/submit 与 /my/about) ====================
|
||
// 两个视图 = 两个端点、两个谓词,不是一个端点加 view 参数(方案 §6.3"鉴权分支容易写漏")。
|
||
// 页面侧按路由分派,不做 query 参数分支;身份一律会话推导(V17),这里不传 userId。
|
||
|
||
/** 我提交的(submitter=会话用户,跨表单、不带值文档) */
|
||
export function listMySubmitted() {
|
||
return alovaInstance.Get<MyAnswerViewItem[]>("/api/form/my/submit-list").send();
|
||
}
|
||
|
||
/** 关于我的(subject=会话用户,含管理员代填的那几条——V18 的另一半) */
|
||
export function listAnswersAboutMe() {
|
||
return alovaInstance.Get<MyAnswerViewItem[]>("/api/form/my/about-list").send();
|
||
}
|
||
|
||
/** 我的答卷详情(钉住版本的 groups + 值文档,与数据管理面同一个 AnswerDetail 形状) */
|
||
export function getMyAnswerDetail(answerId: string) {
|
||
return alovaInstance.Get<AnswerDetail>("/api/form/my/detail", { params: { answerId } }).send();
|
||
}
|
||
|
||
// ==================== 可填写列表(P95 W3/W4,/my/fillable) ====================
|
||
// 数据源=后端按 P95 三层模型解析的**填报入口**清单,不再是会话菜单树里挑 /f/ 行(P91 的形态)。
|
||
// appCode 可选:缺省=全部应用(中心 + 快应用),快应用上下文传自身 appCode 收窄。
|
||
|
||
/** 我可填的表单(入口层非 NONE 的都下发;本人能不能填看 canFill) */
|
||
export function listFillableForms(appCode?: string) {
|
||
const params: Record<string, string> = {};
|
||
if (appCode) params.appCode = appCode;
|
||
return alovaInstance.Get<FillableForm[]>("/api/form/my/fillable", { params }).send();
|
||
}
|