diff --git a/src/__tests__/siteRouter.spec.ts b/src/__tests__/siteRouter.spec.ts index 5838a35..a85605d 100644 --- a/src/__tests__/siteRouter.spec.ts +++ b/src/__tests__/siteRouter.spec.ts @@ -58,26 +58,11 @@ describe("docs/13 路由结构(真实 routes 数组,docs/15 T1)", () => { expect(main.name).toBe("CategoryManage"); }); - it("②c 事项库路由(审计批次 3 补口):办事事项 modId=21、服务字典 modId=22,子站镜像可解析", () => { + it("②c 事项库路由已随 V2.0 拆分移除(svc/item、svc/dict 不再注册,直达落入 404 重定向)", () => { + // 事项管理能力已迁独立办事大厅(svc-hall 应用);CMS 前端仅保留展示壳, + // 旧菜单路径由 UserBase 停用 + 通配重定向兜底。 const item = router.resolve("/sch/demo/svc/item"); - expect(item.name).toBe("SvcItemList"); - expect(item.meta.modId).toBe(21); - - const dict = router.resolve("/sch/demo/svc/dict"); - expect(dict.name).toBe("SvcDictManage"); - expect(dict.meta.modId).toBe(22); - - // 编辑页:新建与带 id 两种形态都命中同一编辑组件(subOf 归属事项列表) - const editNew = router.resolve("/sch/demo/svc/item/edit"); - const edit = router.resolve("/sch/demo/svc/item/edit/12"); - expect(editNew.name).toBe("SvcItemEditNew"); - expect(edit.name).toBe("SvcItemEdit"); - expect(edit.params.id).toBe("12"); - - // 子站镜像形态可解析(去 name、meta.modId 保留) - const sub = router.resolve("/sch/demo/site/jdxy/svc/item/edit/12"); - expect(sub.matched).toHaveLength(3); - expect(sub.meta.modId).toBe(21); + expect(item.name).toBeUndefined(); }); }); diff --git a/src/api/module/cms.spec.ts b/src/api/module/cms.spec.ts index 8241fa4..b4eecad 100644 --- a/src/api/module/cms.spec.ts +++ b/src/api/module/cms.spec.ts @@ -23,7 +23,7 @@ vi.mock("@/utils/alova/alova-iview", () => ({ }, })); -import { articleApi, assetUrl, svcDictApi, svcItemApi, themeApi, themePreviewUrl } from "./cms"; +import { articleApi, assetUrl, themeApi, themePreviewUrl } from "./cms"; import { alovaInstance } from "@/utils/alova/alova-iview"; const JSON_HEADERS = { "Content-Type": "application/json;charset=UTF-8" }; @@ -148,106 +148,3 @@ describe("themePreviewUrl 参数语义(T-W4-17:W4 起 sitePath)", () => { expect(url).not.toContain("siteCode="); }); }); - -describe("svc 事项库 API 路径与参数(事项库 §3.3 契约)", () => { - beforeEach(() => { - vi.mocked(alovaInstance.Get).mockClear(); - vi.mocked(alovaInstance.Post).mockClear(); - }); - - it("item: page/get/attList 走 GET query;publish/offline/sort 的 siteId 走 query,delete 走 body", () => { - svcItemApi.page({ siteId: 5, keyword: "转学" }); - expect(alovaInstance.Get).toHaveBeenCalledWith("/api/svc/item/page", { - params: { siteId: 5, keyword: "转学" }, - }); - - svcItemApi.get(5, 2); - expect(alovaInstance.Get).toHaveBeenCalledWith("/api/svc/item/get", { params: { siteId: 5, id: 2 } }); - - svcItemApi.attList(5, 2); - expect(alovaInstance.Get).toHaveBeenCalledWith("/api/svc/item/attList", { params: { siteId: 5, id: 2 } }); - - svcItemApi.publish(5, 2); - expect(alovaInstance.Post).toHaveBeenCalledWith("/api/svc/item/publish/2", undefined, { - headers: JSON_HEADERS, - params: { siteId: 5 }, - }); - - svcItemApi.offline(5, 2); - expect(alovaInstance.Post).toHaveBeenCalledWith("/api/svc/item/offline/2", undefined, { - headers: JSON_HEADERS, - params: { siteId: 5 }, - }); - - svcItemApi.sort(5, [{ id: 1, sortNo: 2 }]); - expect(alovaInstance.Post).toHaveBeenCalledWith("/api/svc/item/sort", [{ id: 1, sortNo: 2 }], { - headers: JSON_HEADERS, - params: { siteId: 5 }, - }); - - svcItemApi.delete({ id: 2, siteId: 5 }); - expect(alovaInstance.Post).toHaveBeenCalledWith("/api/svc/item/delete", { id: 2, siteId: 5 }, { - headers: JSON_HEADERS, - params: undefined, - }); - }); - - it("dict: list 带 dictType 透传;dept/tree 路径正确", () => { - svcDictApi.list(5, "object"); - expect(alovaInstance.Get).toHaveBeenCalledWith("/api/svc/dict/list", { - params: { siteId: 5, dictType: "object" }, - }); - - svcDictApi.deptTree(5); - expect(alovaInstance.Get).toHaveBeenCalledWith("/api/svc/dept/tree", { params: { siteId: 5 } }); - }); - - it("item: save/syncDeptName/selList 契约(审计批次 3 补口)", () => { - const payload = { - id: 2, - siteId: 5, - itemCode: "BG-ZX-001", - title: "转学办理", - handleMode: 1, - onlineFlag: 1, - sortNo: 0, - attachmentIds: [7, 8], - }; - svcItemApi.save(payload); - expect(alovaInstance.Post).toHaveBeenCalledWith("/api/svc/item/save", payload, { - headers: JSON_HEADERS, - params: undefined, - }); - - svcItemApi.syncDeptName(5); - expect(alovaInstance.Post).toHaveBeenCalledWith("/api/svc/item/syncDeptName", undefined, { - headers: JSON_HEADERS, - params: { siteId: 5 }, - }); - - svcItemApi.selList(5); - expect(alovaInstance.Get).toHaveBeenCalledWith("/api/svc/item/selList", { params: { siteId: 5 } }); - }); - - it("dict: save/delete 契约(审计批次 3 补口)", () => { - const payload = { - siteId: 5, - dictType: "object" as const, - dictKey: "person", - dictName: "个人", - sortNo: 0, - status: 1, - }; - svcDictApi.save(payload); - expect(alovaInstance.Post).toHaveBeenCalledWith("/api/svc/dict/save", payload, { - headers: JSON_HEADERS, - params: undefined, - }); - - svcDictApi.delete({ id: 3, siteId: 5 }); - expect(alovaInstance.Post).toHaveBeenCalledWith("/api/svc/dict/delete", { id: 3, siteId: 5 }, { - headers: JSON_HEADERS, - params: undefined, - }); - }); -}); diff --git a/src/api/module/cms.ts b/src/api/module/cms.ts index 97ec553..f17a15a 100644 --- a/src/api/module/cms.ts +++ b/src/api/module/cms.ts @@ -17,15 +17,6 @@ import { SchoolCard, SchoolOption, SiteVo, - SvcDeptVo, - SvcDictSaveRequest, - SvcDictVo, - SvcItemAttachmentVo, - SvcItemEditVo, - SvcItemPageItem, - SvcItemPageQuery, - SvcItemSaveRequest, - SvcItemSimpleVo, ThemeVo, } from "@/types/cms"; @@ -44,7 +35,6 @@ const ATTACHMENT = "/api/attachment"; const BANNER = "/api/banner"; const LINK = "/api/link"; const THEME = "/api/theme"; -const SVC = "/api/svc"; /** GET(query 参数) */ function get(url: string, params?: IObj): Method { @@ -258,75 +248,6 @@ class ThemeApi { } } -/** 事项管理(事项库详细设计 §3.3:/api/svc/item/**) */ -class SvcItemApi { - page(query: SvcItemPageQuery) { - return get>(`${SVC}/item/page`, { ...query }); - } - - /** 编辑回显(applyUrl 已从 ext_json 提取) */ - get(siteId: number, id: number) { - return get(`${SVC}/item/get`, { siteId, id }); - } - - /** 保存(新建草稿/编辑;富文本服务端 jsoup 清洗) */ - save(data: SvcItemSaveRequest) { - return postJSON(`${SVC}/item/save`, data); - } - - publish(siteId: number, id: number) { - return postJSON(`${SVC}/item/publish/${id}`, undefined, { siteId }); - } - - offline(siteId: number, id: number) { - return postJSON(`${SVC}/item/offline/${id}`, undefined, { siteId }); - } - - delete(data: DeleteRequest) { - return postJSON(`${SVC}/item/delete`, data); - } - - /** 自定义排序(按传入 (id, sortNo) 落库) */ - sort(siteId: number, items: { id: number; sortNo: number }[]) { - return postJSON(`${SVC}/item/sort`, items, { siteId }); - } - - /** 同步部门名快照(UserBase 组树改名后刷新) */ - syncDeptName(siteId: number) { - return postJSON<{ updated: number }>(`${SVC}/item/syncDeptName`, undefined, { siteId }); - } - - /** 选择器精简列表 */ - selList(siteId: number) { - return get(`${SVC}/item/selList`, { siteId }); - } - - /** 指南附件回显(编辑页列表) */ - attList(siteId: number, id: number) { - return get(`${SVC}/item/attList`, { siteId, id }); - } -} - -/** 事项字典 + 服务部门选项(/api/svc/dict/**、/api/svc/dept/tree) */ -class SvcDictApi { - list(siteId: number, dictType?: string) { - return get(`${SVC}/dict/list`, { siteId, dictType }); - } - - save(data: SvcDictSaveRequest) { - return postJSON(`${SVC}/dict/save`, data); - } - - delete(data: DeleteRequest) { - return postJSON(`${SVC}/dict/delete`, data); - } - - /** 服务部门选项(UserBase 组树代理;平台不可达为空数组) */ - deptTree(siteId: number) { - return get(`${SVC}/dept/tree`, { siteId }); - } -} - /** 主题预览 iframe URL(方案 §5.5:/api/theme/preview,CAS 会话同源,参数 p_ 前缀)。 * W4:内容源站点参数 sitePath(嵌套路径语义,后端 siteSnapshotByPath 解析)。 */ export function themePreviewUrl(sitePath: string, theme: string, themeParams: Record = {}): string { @@ -345,8 +266,6 @@ export const attachmentApi = new AttachmentApi(); export const bannerApi = new BannerApi(); export const linkApi = new LinkApi(); export const themeApi = new ThemeApi(); -export const svcItemApi = new SvcItemApi(); -export const svcDictApi = new SvcDictApi(); export default { authApi, @@ -359,8 +278,6 @@ export default { bannerApi, linkApi, themeApi, - svcItemApi, - svcDictApi, uploadUrl, portalBase, themePreviewUrl, diff --git a/src/components/ImageAssetField.vue b/src/components/ImageAssetField.vue index bbc0131..4ec27ad 100644 --- a/src/components/ImageAssetField.vue +++ b/src/components/ImageAssetField.vue @@ -12,7 +12,7 @@ const props = defineProps<{ modelValue: string; /** 上传归属站点(附件场景引用;缺省不携带) */ siteId?: number; - /** 附件场景(svc_item 等;缺省不带 scene,与既有调用一致) */ + /** 附件场景(空=不带 scene;svc 场景已迁办事大厅,CMS 内为 article/banner 等) */ scene?: string; placeholder?: string; }>(); diff --git a/src/components/RichTextEditor.spec.ts b/src/components/RichTextEditor.spec.ts index 6491af3..a9abfb4 100644 --- a/src/components/RichTextEditor.spec.ts +++ b/src/components/RichTextEditor.spec.ts @@ -74,7 +74,7 @@ afterEach(() => { }); describe("RichTextEditor - 正文上传与事件契约", () => { - it("① 上传 FormData 带 siteId/scene/articleId(事项页口径:scene=svc_item_asset)", async () => { + it("① 上传 FormData 带 siteId/scene/articleId(scene 透传契约)", async () => { const seen: FormData[] = []; vi.stubGlobal( "fetch", diff --git a/src/components/RichTextEditor.vue b/src/components/RichTextEditor.vue index f785e70..8d7176f 100644 --- a/src/components/RichTextEditor.vue +++ b/src/components/RichTextEditor.vue @@ -15,7 +15,7 @@ import config from "@/assets/config/host.config"; const props = defineProps<{ modelValue: string; siteId?: number; - /** 附件场景(svc_item_asset 正文资产 / svc_item 指南附件等;空=不带 scene) */ + /** 附件场景(article_asset 正文资产等;空=不带 scene;svc 场景已迁办事大厅) */ scene?: string; /** 文章 id(文章编辑器上传时的归属参数;无文章 id 的页面不传) */ articleId?: number; diff --git a/src/components/SchoolLayout.vue b/src/components/SchoolLayout.vue index fec9834..f097521 100644 --- a/src/components/SchoolLayout.vue +++ b/src/components/SchoolLayout.vue @@ -195,8 +195,6 @@ const getMenuIcon = (item?: any): string => { if (page === "/attachment") return "icon-sjlm"; if (page === "/site") return "icon-zhandian"; // 事项库 R2(§7.5):办事事项取"申请"图标,服务字典取列表图标(前缀分支,优先于 modId 对照) - if (page === "/svc/item" || page.startsWith("/svc/item")) return "icon-shenqing"; - if (page === "/svc/dict") return "icon-liebiao"; switch (item?.modId ?? item?.id) { case 1: return "icon-wenzhang"; case 2: return "icon-liebiao"; diff --git a/src/router/routes.ts b/src/router/routes.ts index 941824a..969ab1c 100644 --- a/src/router/routes.ts +++ b/src/router/routes.ts @@ -106,32 +106,6 @@ const cmsChildren: RouteRecordRaw[] = [ component: () => import("@/views/cms/PortalPreview.vue"), meta: { title: "门户预览", modId: 99 }, }, - { - // 事项库(事项库详细设计 §7.2):办事事项列表 + 编辑(modId=21 对应 UserBase app_module cms_svc_item) - path: "svc/item", - name: "SvcItemList", - component: () => import("@/views/cms/ServiceItemList.vue"), - meta: { title: "办事事项", modId: 21 }, - }, - { - path: "svc/item/edit", - name: "SvcItemEditNew", - component: () => import("@/views/cms/ServiceItemEdit.vue"), - meta: { title: "新建事项", modId: 21, subOf: "/svc/item" }, - }, - { - path: "svc/item/edit/:id", - name: "SvcItemEdit", - component: () => import("@/views/cms/ServiceItemEdit.vue"), - meta: { title: "编辑事项", modId: 21, subOf: "/svc/item" }, - }, - { - // 服务字典(modId=22 对应 UserBase app_module cms_svc_dict) - path: "svc/dict", - name: "SvcDictManage", - component: () => import("@/views/cms/ServiceDictManage.vue"), - meta: { title: "服务字典", modId: 22 }, - }, ]; /** 子站形态:同一批页面,去掉 name(防重复注册告警;子站导航一律走 path 拼装) */ @@ -186,9 +160,6 @@ export const routes: RouteRecordRaw[] = [ { path: "/site/setting/:id", redirect: legacyRedirect("site/setting") }, { path: "/theme", redirect: "/theme-manage" }, { path: "/portal-preview", redirect: legacyRedirect("portal-preview") }, - { path: "/svc/item", redirect: legacyRedirect("svc/item") }, - { path: "/svc/item/edit/:id?", redirect: legacyRedirect("svc/item/edit") }, - { path: "/svc/dict", redirect: legacyRedirect("svc/dict") }, { path: "/:pathMatch(.*)*", redirect: "/workbench", diff --git a/src/types/cms.ts b/src/types/cms.ts index 12ccd67..bf3b45e 100644 --- a/src/types/cms.ts +++ b/src/types/cms.ts @@ -228,209 +228,3 @@ export interface LinkVo { } /* ===== 事项库(svc,事项库详细设计 §7.4)===== */ - -/** 事项分页行(SvcItemPageItem) */ -export interface SvcItemPageItem { - id: number; - siteId: number; - itemCode: string; - title: string; - summary?: string; - objectKey?: string; - objectName?: string; - categoryKey?: string; - categoryName?: string; - deptGroupId?: number; - deptName?: string; - /** 1=线上 2=线下 3=线上线下 */ - handleMode: number; - /** 1/0("可在线办理"筛选维度) */ - onlineFlag: number; - /** 0=草稿 1=已发布 2=已下架 */ - status: number; - sortNo: number; - publishTime?: string; - viewCount: number; - createTime?: string; - createBy?: string; -} - -/** 事项编辑回显(SvcItemEditVo) */ -export interface SvcItemEditVo { - id: number; - siteId: number; - itemCode: string; - title: string; - summary?: string; - objectKey?: string; - categoryKey?: string; - deptGroupId?: number; - deptName?: string; - handleMode: number; - onlineFlag: number; - handlePlace?: string; - handleTimeLimit?: string; - promiseTimeLimit?: string; - contactPhone?: string; - supervisePhone?: string; - processHtml?: string; - materialHtml?: string; - noticeHtml?: string; - faqCategoryId?: number; - noticeCategoryId?: number; - ruleCategoryId?: number; - coverImage?: string; - sortNo: number; - status: number; - publishTime?: string; - offlineTime?: string; - viewCount: number; - /** ext_json.apply_url(我要办理手填外链,可空) */ - applyUrl?: string; -} - -/** 事项保存入参(SvcItemSaveRequest;applyUrl 服务端写入 ext_json) */ -export interface SvcItemSaveRequest { - id?: number; - siteId: number; - itemCode: string; - title: string; - summary?: string; - objectKey?: string; - categoryKey?: string; - deptGroupId?: number; - handleMode?: number; - onlineFlag?: number; - handlePlace?: string; - handleTimeLimit?: string; - promiseTimeLimit?: string; - contactPhone?: string; - supervisePhone?: string; - processHtml?: string; - materialHtml?: string; - noticeHtml?: string; - faqCategoryId?: number; - noticeCategoryId?: number; - ruleCategoryId?: number; - coverImage?: string; - sortNo?: number; - applyUrl?: string; - /** 指南页附件 id(保存时全量重绑) */ - attachmentIds?: number[]; -} - -/** 事项分页查询(SvcItemPageQuery) */ -export interface SvcItemPageQuery { - siteId: number; - status?: number; - keyword?: string; - objectKey?: string; - categoryKey?: string; - deptGroupId?: number; - page?: number; - pageSize?: number; -} - -/** 事项选择器精简行(SvcItemSimpleVo) */ -export interface SvcItemSimpleVo { - id: number; - itemCode: string; - title: string; - status: number; -} - -/** 事项指南附件(SvcItemAttachmentVo) */ -export interface SvcItemAttachmentVo { - id: number; - fileName: string; - webUrl: string; - fileSize?: number; -} - -/** 服务部门选项(SvcDeptVo:UserBase 组树节点,嵌套下发) */ -export interface SvcDeptVo { - id: number; - name: string; - /** 子部门(后端返回嵌套组树;选择器按层级缩进展示) */ - children?: SvcDeptVo[]; -} - -/** 事项字典(SvcDictVo;referenced=被事项引用条数) */ -export interface SvcDictVo { - id: number; - siteId: number; - /** object=服务对象 category=事项类别 */ - dictType: string; - dictKey: string; - dictName: string; - sortNo: number; - /** 0=停用 1=启用 */ - status: number; - referenced: number; -} - -/** 事项字典保存入参(SvcDictSaveRequest) */ -export interface SvcDictSaveRequest { - id?: number; - siteId: number; - dictType: string; - dictKey: string; - dictName: string; - sortNo?: number; - status?: number; -} - -/* ===== 通用 ===== */ - -/** 删除入参(DeleteRequest) */ -export interface DeleteRequest { - id: number; - siteId: number; -} - -/** 后端分页包装 {total, list} */ -export interface PageResult { - total: number; - list: T[]; -} - -/* ===== 主题 ===== */ - -/** theme.json 可调参数选项(select 类型) */ -export interface ThemeParamOption { - value: string; - label: string; -} - -/** 主题包参数 schema(ThemeParam) */ -export interface ThemeParamVo { - key: string; - /** 聚合进 :root{} 的 CSS 变量名(仅 color 类型有) */ - cssVar?: string; - label: string; - /** color / image / select / text */ - type: string; - defaultValue?: string; - options?: ThemeParamOption[]; -} - -/** 主题包(ThemeVo,GET /api/theme/list) */ -export interface ThemeVo { - name: string; - title: string; - description?: string; - version?: string; - author?: string; - bannerSize?: string; - /** 预览图(管理端资产代理 /api/theme/{name}/asset/screenshot.png) */ - screenshotUrl: string; - params: ThemeParamVo[]; - /** 包来源(W1):builtin=内置只读 / external=外部可管 */ - source?: string; - /** 被用站点数(W1,删除保护口径与后端一致) */ - inUseCount?: number; - /** 是否可编辑/删除(W1:仅外部包) */ - editable?: boolean; - /** 引用站点名列表(W1:删除保护提示/tooltip) */ - usedBySiteNames?: string[]; -} diff --git a/src/views/cms/CategoryManage.vue b/src/views/cms/CategoryManage.vue index a2b6cf9..ce14761 100644 --- a/src/views/cms/CategoryManage.vue +++ b/src/views/cms/CategoryManage.vue @@ -112,25 +112,28 @@ function findNode(list: any[], id: number): any { return null; } -/** target 是否 node 自身或其子孙(上级下拉排除,防把栏目挂到自己子树下成环) */ +/** target 是否 node 自身或其子孙(成环判定:把栏目挂到自己子树下会形成环) */ function isSelfOrDescendant(node: any, targetId: number | undefined): boolean { if (!node || targetId == null) return false; if (node.id === targetId) return true; return (node.children || []).some((c: any) => isSelfOrDescendant(c, targetId)); } -/** 上级栏目选项:虚拟根(0=rootLabel)+ 真实树拍平缩进;编辑态禁选自身及后代(后端仅防一级成环) */ +/** + * 上级栏目选项:虚拟根(0=rootLabel)+ 真实树拍平缩进。 + * + * 2026-09-11 口径调整:**不再置灰任何选项**(含外链型栏目、含自身及其子栏目)—— + * 类型与"能否作父"无关,而且灰色项只显示一个无解释的锁,用户看到的往往是 + * "办事大厅被禁用了"这类误解。成环改为保存前校验(见 save())并给出明确原因, + * 后端 CategoryService.validateParent 同步升级为沿祖先链防任意层级成环。 + */ const parentOptions = computed(() => { - const list: { id: number; label: string; disabled: boolean }[] = [ - { id: 0, label: rootLabel.value || "根栏目", disabled: false }, + const list: { id: number; label: string }[] = [ + { id: 0, label: rootLabel.value || "根栏目" }, ]; const walk = (nodes: any[], depth: number) => { (nodes || []).forEach((n: any) => { - list.push({ - id: n.id, - label: `${" ".repeat(depth)}${n.name}`, - disabled: isSelfOrDescendant(n, form.id), - }); + list.push({ id: n.id, label: `${" ".repeat(depth)}${n.name}` }); walk(n.children || [], depth + 1); }); }; @@ -217,9 +220,32 @@ function showDeleteNode() { }); } +/** + * 保存前成环校验:上级栏目不能是自身或自己的子栏目。 + * 返回提示文案(命中)或空串(通过)。 + */ +function findCycleParent(): string { + const parentId = Number(form.parentId); + if (!parentId) return ""; + if (form.id != null && parentId === Number(form.id)) { + return "上级栏目不能是自身,请另选一个上级栏目"; + } + const parentNode = findNode(treeData.value, parentId); + if (parentNode && isSelfOrDescendant(parentNode, form.id)) { + return `「${parentNode.name}」是当前栏目的子栏目,挂到它下面会形成循环,请另选上级栏目`; + } + return ""; +} + async function save() { const valid = await refFormData.value?.validate(); if (!valid) return; + // 成环校验(下拉已不再置灰,这里给出可读原因;后端 CategoryService.validateParent 同口径兜底) + const cycleHit = findCycleParent(); + if (cycleHit) { + Message.warning(cycleHit); + return; + } saving.value = true; try { await categoryApi @@ -474,10 +500,11 @@ function openLink(url: string) { 基本信息 +

任何类型的栏目都可作为上级(外链型也可以);不能选自身或自己的子栏目(会成环)。

diff --git a/src/views/cms/ServiceDictManage.vue b/src/views/cms/ServiceDictManage.vue deleted file mode 100644 index bdb7fdf..0000000 --- a/src/views/cms/ServiceDictManage.vue +++ /dev/null @@ -1,210 +0,0 @@ - - - - - diff --git a/src/views/cms/ServiceItemEdit.vue b/src/views/cms/ServiceItemEdit.vue deleted file mode 100644 index 446399c..0000000 --- a/src/views/cms/ServiceItemEdit.vue +++ /dev/null @@ -1,421 +0,0 @@ - - - - - diff --git a/src/views/cms/ServiceItemList.vue b/src/views/cms/ServiceItemList.vue deleted file mode 100644 index 1755a1b..0000000 --- a/src/views/cms/ServiceItemList.vue +++ /dev/null @@ -1,303 +0,0 @@ - - - diff --git a/src/views/cms/ServiceItemSortModal.vue b/src/views/cms/ServiceItemSortModal.vue deleted file mode 100644 index 5cbdb87..0000000 --- a/src/views/cms/ServiceItemSortModal.vue +++ /dev/null @@ -1,186 +0,0 @@ - - - - -