openxiangda 1.0.68 → 1.0.69
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/templates/openxiangda-react-spa/AGENTS.md +26 -19
- package/templates/openxiangda-react-spa/src/app/navigation.ts +165 -0
- package/templates/openxiangda-react-spa/src/app/router.tsx +20 -62
- package/templates/openxiangda-react-spa/src/app/starter-content.ts +182 -0
- package/templates/openxiangda-react-spa/src/layouts/AdminShell.tsx +94 -233
- package/templates/openxiangda-react-spa/src/layouts/PublicShell.tsx +6 -6
- package/templates/openxiangda-react-spa/src/layouts/UserShell.tsx +15 -15
- package/templates/openxiangda-react-spa/src/pages/admin/AdminDashboardPage.tsx +193 -0
- package/templates/openxiangda-react-spa/src/pages/admin/DataCenterPage.tsx +96 -0
- package/templates/openxiangda-react-spa/src/pages/admin/ServiceCenterPage.tsx +100 -0
- package/templates/openxiangda-react-spa/src/pages/admin/TaskCenterPage.tsx +135 -0
- package/templates/openxiangda-react-spa/src/pages/defaults/DataRoutePage.tsx +22 -25
- package/templates/openxiangda-react-spa/src/pages/defaults/FilePreviewRoutePage.tsx +41 -45
- package/templates/openxiangda-react-spa/src/pages/defaults/FormRoutePage.tsx +22 -30
- package/templates/openxiangda-react-spa/src/pages/portal/UserPortalPage.tsx +47 -42
- package/templates/openxiangda-react-spa/src/pages/public/PublicHomePage.tsx +30 -31
- package/templates/openxiangda-react-spa/src/pages/states/NotFoundPage.tsx +7 -7
- package/templates/openxiangda-react-spa/src/resources/menus/menus.json +32 -5
- package/templates/openxiangda-react-spa/src/resources/roles/roles.json +2 -2
- package/templates/openxiangda-react-spa/src/shared/mac-admin.tsx +2 -2
- package/templates/openxiangda-react-spa/src/shared/ui.tsx +13 -0
- package/templates/openxiangda-react-spa/src/pages/admin/RuntimeWorkspacePage.tsx +0 -219
package/package.json
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
|
-
# AGENTS.md — OpenXiangda React SPA
|
|
1
|
+
# AGENTS.md — OpenXiangda React SPA 应用工作区
|
|
2
2
|
|
|
3
|
-
本工作区是标准 React
|
|
3
|
+
本工作区是标准 React 18 + Vite + React Router 应用。默认模板面向真实用户交付,不是开发验证控制台。
|
|
4
4
|
|
|
5
5
|
## 开发原则
|
|
6
6
|
|
|
7
|
+
- 用户界面使用业务语言:工作台、待办、服务、数据、门户、公开服务。
|
|
8
|
+
- 不在默认可见页面展示 SDK、Runtime、Cookie、Proxy、Playwright、AI 验证、调试上下文、构建号等开发语言。
|
|
7
9
|
- 使用 React Router 管理路由,路由定义在 `src/app/router.tsx`。
|
|
8
10
|
- 使用 Tailwind CSS 表达样式,不依赖平台 theme tokens。
|
|
9
|
-
-
|
|
10
|
-
-
|
|
11
|
-
-
|
|
12
|
-
- 本地开发通过 Vite `/service` 代理远端平台,保留 HttpOnly Cookie。
|
|
11
|
+
- 菜单、首页卡片、快捷入口和示例业务数据优先改 `src/app/navigation.ts` 与 `src/app/starter-content.ts`。
|
|
12
|
+
- 页面、表单、字段、数据范围、流程动作、文件、连接器权限以后端接口为准;前端只做展示保护和清晰状态页。
|
|
13
|
+
- 本地开发通过 Vite `/service` 代理远端平台,保持 HttpOnly Cookie 同域访问。
|
|
13
14
|
|
|
14
15
|
## 常用命令
|
|
15
16
|
|
|
@@ -24,8 +25,6 @@ openxiangda resource publish --profile <name>
|
|
|
24
25
|
openxiangda runtime deploy --profile <name>
|
|
25
26
|
```
|
|
26
27
|
|
|
27
|
-
`openxiangda runtime deploy` 会自动设置 `OPENXIANGDA_BUILD_ID` 和 Vite asset base,构建 `dist/`,上传 runtime release,并默认激活。不要手工改 `dist/index.html`。
|
|
28
|
-
|
|
29
28
|
完整发布顺序:
|
|
30
29
|
|
|
31
30
|
```bash
|
|
@@ -34,31 +33,39 @@ openxiangda resource publish --profile <name>
|
|
|
34
33
|
openxiangda runtime deploy --profile <name>
|
|
35
34
|
```
|
|
36
35
|
|
|
37
|
-
|
|
36
|
+
`openxiangda runtime deploy` 会构建 `dist/`、上传应用前端包并激活当前版本。不要手工修改 `dist/index.html`。
|
|
37
|
+
|
|
38
|
+
## 应用结构
|
|
39
|
+
|
|
40
|
+
- `src/layouts/AdminShell.tsx`:管理后台应用壳、侧边栏、顶部栏、用户菜单。
|
|
41
|
+
- `src/pages/admin/*`:业务工作台、待办中心、服务入口、数据中心。
|
|
42
|
+
- `src/pages/portal/UserPortalPage.tsx`:普通用户门户。
|
|
43
|
+
- `src/pages/public/PublicHomePage.tsx`:公开服务页。
|
|
44
|
+
- `src/pages/defaults/*`:表单、流程、数据列表、文件预览等默认页。
|
|
45
|
+
- `src/runtime/default-page-overrides.tsx`:整页覆盖默认页的入口。
|
|
38
46
|
|
|
39
47
|
## 权限资源
|
|
40
48
|
|
|
41
|
-
React SPA 页面需要声明菜单 code、route code 和 path pattern
|
|
49
|
+
React SPA 页面需要声明菜单 code、route code 和 path pattern。默认菜单资源在 `src/resources/menus/menus.json`:
|
|
42
50
|
|
|
43
51
|
```json
|
|
44
52
|
{
|
|
45
|
-
"code": "
|
|
46
|
-
"
|
|
47
|
-
"
|
|
48
|
-
"
|
|
49
|
-
"pathPatterns": ["/view/:appType/portal/*"]
|
|
53
|
+
"code": "admin_dashboard",
|
|
54
|
+
"name": "业务工作台",
|
|
55
|
+
"routeCode": "admin.dashboard",
|
|
56
|
+
"path": "/view/:appType/admin"
|
|
50
57
|
}
|
|
51
58
|
```
|
|
52
59
|
|
|
53
|
-
|
|
60
|
+
页面中可以使用:
|
|
54
61
|
|
|
55
62
|
```tsx
|
|
56
63
|
import { PermissionBoundary, useAppMenus, useRuntimeBootstrap } from "openxiangda/runtime/react";
|
|
57
64
|
```
|
|
58
65
|
|
|
59
|
-
`PermissionBoundary`
|
|
66
|
+
`PermissionBoundary` 只能做展示保护,不能替代后端权限。后端返回 401 时跳登录,403 时展示无权限状态。
|
|
60
67
|
|
|
61
|
-
##
|
|
68
|
+
## 默认页与覆盖
|
|
62
69
|
|
|
63
70
|
- 表单提交:`/view/:appType/admin/forms/:formUuid/new`
|
|
64
71
|
- 表单详情:`/view/:appType/admin/forms/:formUuid/:formInstId`
|
|
@@ -66,4 +73,4 @@ import { PermissionBoundary, useAppMenus, useRuntimeBootstrap } from "openxiangd
|
|
|
66
73
|
- 数据列表:`/view/:appType/admin/data/:formUuid`
|
|
67
74
|
- 文件预览:`/view/file-preview?ticket=...`
|
|
68
75
|
|
|
69
|
-
|
|
76
|
+
需要自定义默认页时,在 `src/runtime/default-page-overrides.tsx` 中按页面类型和 `formUuid` 注册覆盖组件。不要回到旧平台 `isRenderNav` 或 workbench 参数模型。
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import type { ComponentType } from "react";
|
|
2
|
+
import {
|
|
3
|
+
ClipboardList,
|
|
4
|
+
Database,
|
|
5
|
+
FileText,
|
|
6
|
+
Globe2,
|
|
7
|
+
Home,
|
|
8
|
+
Inbox,
|
|
9
|
+
LayoutDashboard,
|
|
10
|
+
Search,
|
|
11
|
+
Workflow,
|
|
12
|
+
} from "lucide-react";
|
|
13
|
+
|
|
14
|
+
export type StarterNavigationItem = {
|
|
15
|
+
code?: string;
|
|
16
|
+
hint?: string;
|
|
17
|
+
icon: ComponentType<{ size?: string | number; className?: string }>;
|
|
18
|
+
name: string;
|
|
19
|
+
path: string;
|
|
20
|
+
routeCode?: string;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export type StarterNavigationGroup = {
|
|
24
|
+
title: string;
|
|
25
|
+
items: StarterNavigationItem[];
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export type BuildStarterNavigationOptions = {
|
|
29
|
+
appType: string;
|
|
30
|
+
dataFormUuid?: string;
|
|
31
|
+
processFormUuid?: string;
|
|
32
|
+
receiptFormUuid?: string;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
export const viewPath = (appType: string, path: string) =>
|
|
36
|
+
`/view/${appType}/${path}`.replace(/\/{2,}/g, "/");
|
|
37
|
+
|
|
38
|
+
export const formPath = (appType: string, formUuid?: string) =>
|
|
39
|
+
formUuid ? viewPath(appType, `admin/forms/${encodeURIComponent(formUuid)}/new`) : viewPath(appType, "admin/forms");
|
|
40
|
+
|
|
41
|
+
export const processPath = (appType: string, formUuid?: string) =>
|
|
42
|
+
formUuid ? viewPath(appType, `admin/forms/${encodeURIComponent(formUuid)}/new`) : viewPath(appType, "admin/process");
|
|
43
|
+
|
|
44
|
+
export const dataPath = (appType: string, formUuid?: string) =>
|
|
45
|
+
formUuid ? viewPath(appType, `admin/data/${encodeURIComponent(formUuid)}`) : viewPath(appType, "admin/data");
|
|
46
|
+
|
|
47
|
+
export function buildStarterAdminNavigation({
|
|
48
|
+
appType,
|
|
49
|
+
dataFormUuid,
|
|
50
|
+
processFormUuid,
|
|
51
|
+
receiptFormUuid,
|
|
52
|
+
}: BuildStarterNavigationOptions): StarterNavigationGroup[] {
|
|
53
|
+
return [
|
|
54
|
+
{
|
|
55
|
+
title: "工作台",
|
|
56
|
+
items: [
|
|
57
|
+
{
|
|
58
|
+
code: "admin_dashboard",
|
|
59
|
+
hint: "业务概览",
|
|
60
|
+
icon: LayoutDashboard,
|
|
61
|
+
name: "业务工作台",
|
|
62
|
+
path: viewPath(appType, "admin"),
|
|
63
|
+
routeCode: "admin.dashboard",
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
code: "task_center",
|
|
67
|
+
hint: "待办与跟进",
|
|
68
|
+
icon: Inbox,
|
|
69
|
+
name: "待办中心",
|
|
70
|
+
path: viewPath(appType, "admin/tasks"),
|
|
71
|
+
routeCode: "admin.tasks",
|
|
72
|
+
},
|
|
73
|
+
],
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
title: "业务办理",
|
|
77
|
+
items: [
|
|
78
|
+
{
|
|
79
|
+
code: "service_center",
|
|
80
|
+
hint: "常用服务",
|
|
81
|
+
icon: ClipboardList,
|
|
82
|
+
name: "服务入口",
|
|
83
|
+
path: viewPath(appType, "admin/services"),
|
|
84
|
+
routeCode: "admin.services",
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
code: "service_center",
|
|
88
|
+
hint: receiptFormUuid ? "提交业务申请" : "配置后可用",
|
|
89
|
+
icon: FileText,
|
|
90
|
+
name: "发起申请",
|
|
91
|
+
path: formPath(appType, receiptFormUuid),
|
|
92
|
+
routeCode: "admin.services",
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
code: "service_center",
|
|
96
|
+
hint: processFormUuid ? "发起流程办理" : "配置后可用",
|
|
97
|
+
icon: Workflow,
|
|
98
|
+
name: "流程办理",
|
|
99
|
+
path: processPath(appType, processFormUuid),
|
|
100
|
+
routeCode: "admin.services",
|
|
101
|
+
},
|
|
102
|
+
],
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
title: "数据管理",
|
|
106
|
+
items: [
|
|
107
|
+
{
|
|
108
|
+
code: "data_center",
|
|
109
|
+
hint: "经营数据",
|
|
110
|
+
icon: Database,
|
|
111
|
+
name: "数据中心",
|
|
112
|
+
path: viewPath(appType, "admin/data"),
|
|
113
|
+
routeCode: "admin.data",
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
code: "data_center",
|
|
117
|
+
hint: dataFormUuid ? "业务台账" : "配置后可用",
|
|
118
|
+
icon: Search,
|
|
119
|
+
name: "数据查询",
|
|
120
|
+
path: dataPath(appType, dataFormUuid),
|
|
121
|
+
routeCode: "admin.data",
|
|
122
|
+
},
|
|
123
|
+
],
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
title: "服务门户",
|
|
127
|
+
items: [
|
|
128
|
+
{
|
|
129
|
+
code: "user_portal",
|
|
130
|
+
hint: "普通用户入口",
|
|
131
|
+
icon: Home,
|
|
132
|
+
name: "用户门户",
|
|
133
|
+
path: viewPath(appType, "portal"),
|
|
134
|
+
routeCode: "portal.home",
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
code: "public_home",
|
|
138
|
+
hint: "公开服务",
|
|
139
|
+
icon: Globe2,
|
|
140
|
+
name: "公开访问",
|
|
141
|
+
path: viewPath(appType, "public"),
|
|
142
|
+
routeCode: "public.home",
|
|
143
|
+
},
|
|
144
|
+
],
|
|
145
|
+
},
|
|
146
|
+
];
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
export function filterNavigationByMenuCodes(
|
|
150
|
+
groups: StarterNavigationGroup[],
|
|
151
|
+
menuCodes: Set<string>,
|
|
152
|
+
) {
|
|
153
|
+
if (!menuCodes.size) return groups;
|
|
154
|
+
return groups
|
|
155
|
+
.map(group => ({
|
|
156
|
+
...group,
|
|
157
|
+
items: group.items.filter(
|
|
158
|
+
item =>
|
|
159
|
+
(!item.code && !item.routeCode) ||
|
|
160
|
+
Boolean(item.code && menuCodes.has(item.code)) ||
|
|
161
|
+
Boolean(item.routeCode && menuCodes.has(item.routeCode)),
|
|
162
|
+
),
|
|
163
|
+
}))
|
|
164
|
+
.filter(group => group.items.length > 0);
|
|
165
|
+
}
|
|
@@ -5,17 +5,20 @@ import {
|
|
|
5
5
|
useParams,
|
|
6
6
|
} from "react-router-dom";
|
|
7
7
|
import { lazy, Suspense, type ReactNode } from "react";
|
|
8
|
-
import {
|
|
8
|
+
import { FileText, Sparkles, Workflow } from "lucide-react";
|
|
9
9
|
import { OpenXiangdaProvider } from "openxiangda/runtime/react";
|
|
10
10
|
|
|
11
11
|
import { AdminShell } from "@/layouts/AdminShell";
|
|
12
12
|
import { PublicShell } from "@/layouts/PublicShell";
|
|
13
13
|
import { UserShell } from "@/layouts/UserShell";
|
|
14
|
-
import {
|
|
14
|
+
import { AdminDashboardPage } from "@/pages/admin/AdminDashboardPage";
|
|
15
|
+
import { DataCenterPage } from "@/pages/admin/DataCenterPage";
|
|
16
|
+
import { ServiceCenterPage } from "@/pages/admin/ServiceCenterPage";
|
|
17
|
+
import { TaskCenterPage } from "@/pages/admin/TaskCenterPage";
|
|
15
18
|
import { UserPortalPage } from "@/pages/portal/UserPortalPage";
|
|
16
19
|
import { PublicHomePage } from "@/pages/public/PublicHomePage";
|
|
17
20
|
import { NotFoundPage } from "@/pages/states/NotFoundPage";
|
|
18
|
-
import {
|
|
21
|
+
import { StatePage } from "@/shared/ui";
|
|
19
22
|
|
|
20
23
|
const servicePrefix = process.env.APP_SERVICE_PREFIX || "/service";
|
|
21
24
|
const DataRoutePage = lazy(() =>
|
|
@@ -37,7 +40,7 @@ const FormRoutePage = lazy(() =>
|
|
|
37
40
|
const routeElement = (element: ReactNode) => (
|
|
38
41
|
<Suspense
|
|
39
42
|
fallback={
|
|
40
|
-
<
|
|
43
|
+
<StatePage
|
|
41
44
|
description="正在加载页面组件。"
|
|
42
45
|
icon={<Sparkles size={24} />}
|
|
43
46
|
status="LOADING"
|
|
@@ -77,14 +80,12 @@ export const router = createBrowserRouter([
|
|
|
77
80
|
path: "admin",
|
|
78
81
|
element: <AdminShell />,
|
|
79
82
|
children: [
|
|
80
|
-
{ index: true, element: <
|
|
81
|
-
{ path: "
|
|
82
|
-
{ path: "
|
|
83
|
-
{ path: "
|
|
84
|
-
{ path: "
|
|
85
|
-
{ path: "
|
|
86
|
-
{ path: "releases", element: <AdminSectionPage type="releases" /> },
|
|
87
|
-
{ path: "settings", element: <AdminSectionPage type="settings" /> },
|
|
83
|
+
{ index: true, element: <AdminDashboardPage /> },
|
|
84
|
+
{ path: "tasks", element: <TaskCenterPage /> },
|
|
85
|
+
{ path: "services", element: <ServiceCenterPage /> },
|
|
86
|
+
{ path: "forms", element: <ResourceEmptyPage type="form" /> },
|
|
87
|
+
{ path: "process", element: <ResourceEmptyPage type="process" /> },
|
|
88
|
+
{ path: "data", element: <DataCenterPage /> },
|
|
88
89
|
{ path: "data/:formUuid", element: routeElement(<DataRoutePage />) },
|
|
89
90
|
{ path: "forms/:formUuid/new", element: routeElement(<FormRoutePage mode="submit" />) },
|
|
90
91
|
{ path: "forms/:formUuid/:formInstId", element: routeElement(<FormRoutePage mode="detail" />) },
|
|
@@ -115,68 +116,25 @@ export const router = createBrowserRouter([
|
|
|
115
116
|
{ path: "*", element: <NotFoundPage /> },
|
|
116
117
|
]);
|
|
117
118
|
|
|
118
|
-
function
|
|
119
|
+
function ResourceEmptyPage({ type }: { type: "form" | "process" }) {
|
|
119
120
|
const config = {
|
|
120
121
|
form: {
|
|
121
|
-
description: "
|
|
122
|
+
description: "当前应用还没有配置可发起的普通表单。配置完成后,这里会进入对应的申请页面。",
|
|
122
123
|
icon: <FileText size={24} />,
|
|
123
|
-
title: "
|
|
124
|
+
title: "暂无可发起申请",
|
|
124
125
|
},
|
|
125
126
|
process: {
|
|
126
|
-
description: "
|
|
127
|
+
description: "当前应用还没有配置流程办理入口。配置完成后,这里会进入对应的流程页面。",
|
|
127
128
|
icon: <Workflow size={24} />,
|
|
128
|
-
title: "
|
|
129
|
-
},
|
|
130
|
-
data: {
|
|
131
|
-
description: "当前应用还没有可用于数据管理列表的普通表单。发布表单资源后,菜单会自动进入对应数据列表。",
|
|
132
|
-
icon: <Database size={24} />,
|
|
133
|
-
title: "暂无数据资源",
|
|
134
|
-
},
|
|
135
|
-
}[type];
|
|
136
|
-
|
|
137
|
-
return (
|
|
138
|
-
<MacStatePage
|
|
139
|
-
description={config.description}
|
|
140
|
-
icon={config.icon}
|
|
141
|
-
status="RESOURCE"
|
|
142
|
-
title={config.title}
|
|
143
|
-
/>
|
|
144
|
-
);
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
function AdminSectionPage({
|
|
148
|
-
type,
|
|
149
|
-
}: {
|
|
150
|
-
type: "verification" | "permissions" | "releases" | "settings";
|
|
151
|
-
}) {
|
|
152
|
-
const config = {
|
|
153
|
-
verification: {
|
|
154
|
-
description: "这里预留 AI 验证、测试账号和一次性登录链接的工作台入口。后续可按项目需要替换为自定义实现。",
|
|
155
|
-
icon: <Sparkles size={24} />,
|
|
156
|
-
title: "AI 验证",
|
|
157
|
-
},
|
|
158
|
-
permissions: {
|
|
159
|
-
description: "这里预留页面 code、角色页面权限和菜单可见性配置说明。平台权限仍以后端接口为准。",
|
|
160
|
-
icon: <Shield size={24} />,
|
|
161
|
-
title: "角色权限",
|
|
162
|
-
},
|
|
163
|
-
releases: {
|
|
164
|
-
description: "这里预留运行时版本、构建记录和发布动作入口。当前模板默认通过 OpenXiangda CLI 发布。",
|
|
165
|
-
icon: <Rocket size={24} />,
|
|
166
|
-
title: "发布版本",
|
|
167
|
-
},
|
|
168
|
-
settings: {
|
|
169
|
-
description: "这里预留应用运行参数和本地开发代理配置入口。业务项目可以按需整页覆盖。",
|
|
170
|
-
icon: <Settings size={24} />,
|
|
171
|
-
title: "系统设置",
|
|
129
|
+
title: "暂无流程入口",
|
|
172
130
|
},
|
|
173
131
|
}[type];
|
|
174
132
|
|
|
175
133
|
return (
|
|
176
|
-
<
|
|
134
|
+
<StatePage
|
|
177
135
|
description={config.description}
|
|
178
136
|
icon={config.icon}
|
|
179
|
-
status="
|
|
137
|
+
status="EMPTY"
|
|
180
138
|
title={config.title}
|
|
181
139
|
/>
|
|
182
140
|
);
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import type { AppTone } from "@/shared/ui";
|
|
2
|
+
|
|
3
|
+
export const starterBrand = {
|
|
4
|
+
fallbackName: "业务应用",
|
|
5
|
+
logoText: "企",
|
|
6
|
+
subtitle: "运营后台",
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export const dashboardHero = {
|
|
10
|
+
title: "业务工作台",
|
|
11
|
+
description: "集中处理待办事项、跟进关键业务进展,并快速进入常用服务。",
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export const dashboardMetrics: Array<{
|
|
15
|
+
label: string;
|
|
16
|
+
value: string;
|
|
17
|
+
caption: string;
|
|
18
|
+
tone: AppTone;
|
|
19
|
+
}> = [
|
|
20
|
+
{
|
|
21
|
+
caption: "待审批、待办理和需要补充资料的事项。",
|
|
22
|
+
label: "今日待办",
|
|
23
|
+
tone: "amber",
|
|
24
|
+
value: "18",
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
caption: "本周新增的申请、登记和服务请求。",
|
|
28
|
+
label: "新增业务",
|
|
29
|
+
tone: "blue",
|
|
30
|
+
value: "126",
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
caption: "按当前权限可查看的数据记录。",
|
|
34
|
+
label: "可查数据",
|
|
35
|
+
tone: "emerald",
|
|
36
|
+
value: "3,428",
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
caption: "近七日平均办理完成率。",
|
|
40
|
+
label: "办理效率",
|
|
41
|
+
tone: "violet",
|
|
42
|
+
value: "92%",
|
|
43
|
+
},
|
|
44
|
+
];
|
|
45
|
+
|
|
46
|
+
export const trendOverview = {
|
|
47
|
+
title: "近七日业务趋势",
|
|
48
|
+
description: "用于呈现申请、审批和数据更新节奏,帮助团队判断当前业务负载。",
|
|
49
|
+
values: [38, 52, 46, 68, 74, 63, 91],
|
|
50
|
+
summary: [
|
|
51
|
+
{ label: "平均响应", value: "2.6 小时" },
|
|
52
|
+
{ label: "按时完成", value: "94%" },
|
|
53
|
+
{ label: "本周高峰", value: "周五" },
|
|
54
|
+
],
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
export const quickActions = [
|
|
58
|
+
{
|
|
59
|
+
desc: "提交业务申请、登记信息或创建流程。",
|
|
60
|
+
label: "发起申请",
|
|
61
|
+
tone: "blue" as AppTone,
|
|
62
|
+
type: "form" as const,
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
desc: "查看需要当前用户处理的审批与任务。",
|
|
66
|
+
label: "处理待办",
|
|
67
|
+
tone: "amber" as AppTone,
|
|
68
|
+
type: "tasks" as const,
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
desc: "进入有权限的数据列表和业务台账。",
|
|
72
|
+
label: "数据查询",
|
|
73
|
+
tone: "emerald" as AppTone,
|
|
74
|
+
type: "data" as const,
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
desc: "打开面向普通用户的服务门户。",
|
|
78
|
+
label: "用户门户",
|
|
79
|
+
tone: "violet" as AppTone,
|
|
80
|
+
type: "portal" as const,
|
|
81
|
+
},
|
|
82
|
+
];
|
|
83
|
+
|
|
84
|
+
export const taskItems = [
|
|
85
|
+
{
|
|
86
|
+
assignee: "当前用户",
|
|
87
|
+
due: "今天 18:00",
|
|
88
|
+
priority: "high" as const,
|
|
89
|
+
status: "待处理",
|
|
90
|
+
title: "审批新的业务申请",
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
assignee: "业务运营组",
|
|
94
|
+
due: "明天 10:00",
|
|
95
|
+
priority: "medium" as const,
|
|
96
|
+
status: "跟进中",
|
|
97
|
+
title: "补充客户资料并更新台账",
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
assignee: "数据管理员",
|
|
101
|
+
due: "本周五",
|
|
102
|
+
priority: "low" as const,
|
|
103
|
+
status: "待确认",
|
|
104
|
+
title: "核对本周数据汇总结果",
|
|
105
|
+
},
|
|
106
|
+
];
|
|
107
|
+
|
|
108
|
+
export const recentActivities = [
|
|
109
|
+
"业务申请已提交并进入审批流程。",
|
|
110
|
+
"数据列表完成更新,新增记录已可查询。",
|
|
111
|
+
"用户门户服务入口已同步最新配置。",
|
|
112
|
+
"公开服务页收到新的访问请求。",
|
|
113
|
+
];
|
|
114
|
+
|
|
115
|
+
export const serviceEntries = [
|
|
116
|
+
{
|
|
117
|
+
desc: "适合信息登记、业务申请和资料收集。",
|
|
118
|
+
label: "普通表单",
|
|
119
|
+
tone: "blue" as AppTone,
|
|
120
|
+
type: "form" as const,
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
desc: "适合需要审批、办理或抄送的业务流程。",
|
|
124
|
+
label: "流程办理",
|
|
125
|
+
tone: "amber" as AppTone,
|
|
126
|
+
type: "process" as const,
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
desc: "按权限查看、筛选和维护业务数据。",
|
|
130
|
+
label: "数据管理",
|
|
131
|
+
tone: "emerald" as AppTone,
|
|
132
|
+
type: "data" as const,
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
desc: "面向内部普通用户的统一服务入口。",
|
|
136
|
+
label: "用户门户",
|
|
137
|
+
tone: "violet" as AppTone,
|
|
138
|
+
type: "portal" as const,
|
|
139
|
+
},
|
|
140
|
+
];
|
|
141
|
+
|
|
142
|
+
export const portalEntries = [
|
|
143
|
+
{
|
|
144
|
+
desc: "快速提交常用业务申请。",
|
|
145
|
+
label: "我要申请",
|
|
146
|
+
tone: "blue" as AppTone,
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
desc: "查看待处理、已提交和已完成事项。",
|
|
150
|
+
label: "我的事项",
|
|
151
|
+
tone: "amber" as AppTone,
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
desc: "查询当前账号有权限访问的数据。",
|
|
155
|
+
label: "数据查询",
|
|
156
|
+
tone: "emerald" as AppTone,
|
|
157
|
+
},
|
|
158
|
+
];
|
|
159
|
+
|
|
160
|
+
export const publicServices = [
|
|
161
|
+
{
|
|
162
|
+
desc: "发布无需登录即可查看的说明、指南或入口。",
|
|
163
|
+
label: "公开说明",
|
|
164
|
+
tone: "blue" as AppTone,
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
desc: "开放访客可提交的登记或反馈表单。",
|
|
168
|
+
label: "公开登记",
|
|
169
|
+
tone: "emerald" as AppTone,
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
desc: "使用短期凭证打开文件、邀请或查询页面。",
|
|
173
|
+
label: "安全链接",
|
|
174
|
+
tone: "amber" as AppTone,
|
|
175
|
+
},
|
|
176
|
+
];
|
|
177
|
+
|
|
178
|
+
export const dataRows = [
|
|
179
|
+
{ count: "428", label: "本月新增", trend: "+12%" },
|
|
180
|
+
{ count: "96", label: "处理中", trend: "-8%" },
|
|
181
|
+
{ count: "2,904", label: "累计完成", trend: "+18%" },
|
|
182
|
+
];
|