mirror of
https://gitee.com/JavaLionLi/plus-ui.git
synced 2026-05-01 05:10:26 +00:00
Compare commits
408 Commits
v5.2.3-v2.
...
future/6.X
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
97e984afa5 | ||
|
|
6c1dae5b6a | ||
|
|
87fad7bc16 | ||
|
|
c7bcf52f03 | ||
|
|
6a3394bdc5 | ||
|
|
2ce3786ee0 | ||
|
|
2d13215304 | ||
|
|
f269c003da | ||
|
|
7aaa40b46c | ||
|
|
ffcb15ba96 | ||
|
|
0a5c72988a | ||
|
|
8a900fa94d | ||
|
|
f10e6dbc71 | ||
|
|
090e395dcf | ||
|
|
eab7f49553 | ||
|
|
cedf975ed3 | ||
|
|
d38329befb | ||
|
|
9acf52e8a7 | ||
|
|
eb62402423 | ||
|
|
8c730950a9 | ||
|
|
1133665122 | ||
|
|
4f713d66db | ||
|
|
02b5ca7c48 | ||
|
|
4f8bcbd525 | ||
|
|
fb5b1ed1bd | ||
|
|
a2d9a6d5f2 | ||
|
|
90926ddc7c | ||
|
|
b64357a595 | ||
|
|
81552f0cb9 | ||
|
|
029eb6636c | ||
|
|
38c67fba25 | ||
|
|
3f30bac6f3 | ||
|
|
0b65932eee | ||
|
|
16d9e1e7fe | ||
|
|
199771997d | ||
|
|
6c395bb65b | ||
|
|
57f18eece5 | ||
|
|
cac35ecf4c | ||
|
|
f38e5e7c4d | ||
|
|
125da80953 | ||
|
|
7f99bbf889 | ||
|
|
87c09d0917 | ||
|
|
87b56a3823 | ||
|
|
680c00bd06 | ||
|
|
ebc7760de2 | ||
|
|
5907e4778b | ||
|
|
b9e5220069 | ||
|
|
1daa291bb6 | ||
|
|
5be8fcf571 | ||
|
|
42f63fbe24 | ||
|
|
05527965e2 | ||
|
|
8469c254af | ||
|
|
2502de3081 | ||
|
|
fed0ac99e8 | ||
|
|
9f577be6ff | ||
|
|
1fb116f059 | ||
|
|
448f5f303e | ||
|
|
da5f369bb4 | ||
|
|
13a41679bc | ||
|
|
1442d539e8 | ||
|
|
a86557cc2a | ||
|
|
4fb60440f2 | ||
|
|
6ed02a2ddd | ||
|
|
3194ea4fe7 | ||
|
|
8286b5906e | ||
|
|
c69a6a2a45 | ||
|
|
f2de9af401 | ||
|
|
790abfac85 | ||
|
|
e138c314a8 | ||
|
|
b9ca2d3c67 | ||
|
|
c415e130b9 | ||
|
|
decbd4ac34 | ||
|
|
b8b0db2367 | ||
|
|
82d28a3188 | ||
|
|
8eac8987b1 | ||
|
|
d97c93cc98 | ||
|
|
766d9b2142 | ||
|
|
833dfa67fc | ||
|
|
b83755e626 | ||
|
|
e3227f5cc5 | ||
|
|
0dc58fa3c6 | ||
|
|
767b00c257 | ||
|
|
c9f9fbed49 | ||
|
|
41c8e06c54 | ||
|
|
33a397032c | ||
|
|
5b55687a76 | ||
|
|
7fd45ab2e8 | ||
|
|
3e592c1c5e | ||
|
|
2db01677e3 | ||
|
|
656366d610 | ||
|
|
eb8bdd5655 | ||
|
|
1681a32dbc | ||
|
|
705e68759d | ||
|
|
6208a2d0ca | ||
|
|
9cae1bb675 | ||
|
|
6b9802dfe1 | ||
|
|
419e7bde9a | ||
|
|
3c7691a6b7 | ||
|
|
32ee077f1a | ||
|
|
6b8600a989 | ||
|
|
3724baa93a | ||
|
|
1e5f89817e | ||
|
|
c28a224d78 | ||
|
|
3008a8d7b0 | ||
|
|
56bb05d547 | ||
|
|
b4282f1423 | ||
|
|
f9c3958d5d | ||
|
|
0e210b90a2 | ||
|
|
6a17a0735d | ||
|
|
8284a87d36 | ||
|
|
cdad26bba6 | ||
|
|
ab9b1a1367 | ||
|
|
8048d80baa | ||
|
|
f1ef2b1083 | ||
|
|
5e1d44c2af | ||
|
|
55691695c4 | ||
|
|
53e7d03a1c | ||
|
|
9c84bf242c | ||
|
|
b89e9cee7f | ||
|
|
014bedd301 | ||
|
|
ceb6de9044 | ||
|
|
04c6131fb0 | ||
|
|
c9cfefdc3e | ||
|
|
fbe9254114 | ||
|
|
88056a5067 | ||
|
|
3da18c9464 | ||
|
|
b4a40c94dc | ||
|
|
c11b91a48e | ||
|
|
65da8dfa93 | ||
|
|
e10ef50288 | ||
|
|
4c607f6915 | ||
|
|
43b4e74c9c | ||
|
|
f84e95d735 | ||
|
|
dba12f25e2 | ||
|
|
257ececa52 | ||
|
|
7d36621c44 | ||
|
|
a29d03b231 | ||
|
|
ab99104240 | ||
|
|
153758df82 | ||
|
|
5e5fca8f6b | ||
|
|
d23bf73a2e | ||
|
|
ad7058b739 | ||
|
|
0dd5044bbe | ||
|
|
ae5dd09ba2 | ||
|
|
0e20743c28 | ||
|
|
9223fabde7 | ||
|
|
1282839f67 | ||
|
|
952f56ca2e | ||
|
|
e08f41dd72 | ||
|
|
2392f64233 | ||
|
|
1565ec1996 | ||
|
|
d95f358d1b | ||
|
|
7ea5199fd2 | ||
|
|
4280c7177d | ||
|
|
4472b24def | ||
|
|
33cf333b2a | ||
|
|
27a427eb97 | ||
|
|
e2e1ce4091 | ||
|
|
4013c06fea | ||
|
|
8a029f6c4c | ||
|
|
c785a9fb7f | ||
|
|
95cbd2f3af | ||
|
|
edacb79ccb | ||
|
|
0872624adc | ||
|
|
1bf03053e1 | ||
|
|
47c2724058 | ||
|
|
219ab65eb7 | ||
|
|
107b2d444b | ||
|
|
a8bb81c984 | ||
|
|
0ca453d549 | ||
|
|
093c05bda0 | ||
|
|
94dcc28c8a | ||
|
|
35b016b3ba | ||
|
|
f6d69e2bea | ||
|
|
9573343afc | ||
|
|
8f99c76e72 | ||
|
|
62f7d393f3 | ||
|
|
31037db627 | ||
|
|
4e0d946676 | ||
|
|
71dceeacc2 | ||
|
|
d59259737f | ||
|
|
8afe7c3931 | ||
|
|
d59738b473 | ||
|
|
2f35342782 | ||
|
|
720c822bb3 | ||
|
|
48b5d595df | ||
|
|
1034399fe4 | ||
|
|
ba257e2357 | ||
|
|
8bd26758dd | ||
|
|
1f1cd489be | ||
|
|
9c528d9a8c | ||
|
|
0472b823e7 | ||
|
|
f71cf3cfb4 | ||
|
|
8179ee8196 | ||
|
|
8b8099ad09 | ||
|
|
fd30362267 | ||
|
|
1878f49e8d | ||
|
|
ca0fe5ebae | ||
|
|
ba78f8cc0d | ||
|
|
a614dee5c6 | ||
|
|
463faba9b9 | ||
|
|
9dea8369e3 | ||
|
|
592fb84aa7 | ||
|
|
3019701856 | ||
|
|
1ea70dd3ce | ||
|
|
2a5ad70155 | ||
|
|
9c8e3404bb | ||
|
|
385bbb77a9 | ||
|
|
70f7c06e55 | ||
|
|
369f48ced5 | ||
|
|
7f15f0e15a | ||
|
|
7b48bd44a2 | ||
|
|
7affcd27b7 | ||
|
|
7de9f23226 | ||
|
|
afc35feb8c | ||
|
|
84d682a4a2 | ||
|
|
b29c5bd2fa | ||
|
|
e4c24a511a | ||
|
|
9955a52059 | ||
|
|
de22609196 | ||
|
|
e5de3f4e9d | ||
|
|
660d5b3d4f | ||
|
|
d5eac17097 | ||
|
|
6fe2317681 | ||
|
|
e9e8a2eaaf | ||
|
|
5ec984ac7d | ||
|
|
c98a14e2ac | ||
|
|
bbc656a26c | ||
|
|
722acf0ae7 | ||
|
|
15acd995f9 | ||
|
|
35b90aa746 | ||
|
|
de926211ef | ||
|
|
30e1ea1c6d | ||
|
|
8fa765f7be | ||
|
|
7321b4c4ca | ||
|
|
85608594bc | ||
|
|
fc8b795bd9 | ||
|
|
3a7fad80a8 | ||
|
|
f5d557fe80 | ||
|
|
8bff98ac72 | ||
|
|
8fadab9741 | ||
|
|
fba121f5c3 | ||
|
|
48e9f2c5c0 | ||
|
|
d8a395bfd1 | ||
|
|
597c8370d3 | ||
|
|
6b2838141a | ||
|
|
b3edce5a20 | ||
|
|
53424765f9 | ||
|
|
b23b123613 | ||
|
|
3eab423da5 | ||
|
|
2e627832ae | ||
|
|
8b5cf9a35f | ||
|
|
78798f99ea | ||
|
|
57f288c892 | ||
|
|
0815fa2978 | ||
|
|
7feead9afc | ||
|
|
98728828ad | ||
|
|
d9218fac24 | ||
|
|
6d290785ef | ||
|
|
f6400f3cbe | ||
|
|
9d7f3101b9 | ||
|
|
7784709cae | ||
|
|
b5a4ebe2f6 | ||
|
|
b814fb5105 | ||
|
|
e98d43f50d | ||
|
|
71b9d5d468 | ||
|
|
e341b45429 | ||
|
|
b2219cabec | ||
|
|
abc6e4f454 | ||
|
|
b1b63ebf7f | ||
|
|
acc760a20f | ||
|
|
62e3351bc7 | ||
|
|
4fe828faa4 | ||
|
|
21466ca8a1 | ||
|
|
21234379b3 | ||
|
|
44bf7e7212 | ||
|
|
e91d11876f | ||
|
|
a90f38734f | ||
|
|
761f97e143 | ||
|
|
bfcffc50e2 | ||
|
|
07b8bc65ec | ||
|
|
f241c187b3 | ||
|
|
ef535a3f33 | ||
|
|
a01545bc84 | ||
|
|
bdaddb4bf6 | ||
|
|
ace672dd0c | ||
|
|
0539fa3c1f | ||
|
|
18f89055e1 | ||
|
|
7a8620c994 | ||
|
|
e38d286c11 | ||
|
|
05e7e93cf1 | ||
|
|
f2adc5e5fa | ||
|
|
7be0723c31 | ||
|
|
eab4345198 | ||
|
|
e040820dae | ||
|
|
61b81f4692 | ||
|
|
aef5a02097 | ||
|
|
cc38d23d14 | ||
|
|
74c29dc13e | ||
|
|
b474a1cffc | ||
|
|
e3219c434a | ||
|
|
c28fbdfb27 | ||
|
|
ef19e97109 | ||
|
|
bb90dbc35b | ||
|
|
770861ed33 | ||
|
|
edf9529a10 | ||
|
|
a11679dc0d | ||
|
|
4d6a1ee73b | ||
|
|
b43158914b | ||
|
|
66580a05a8 | ||
|
|
dccfa219d7 | ||
|
|
b1f0b3c096 | ||
|
|
b95a49c7d7 | ||
|
|
2155d9f4b0 | ||
|
|
fb7bca27eb | ||
|
|
904ee32b24 | ||
|
|
4839a5152f | ||
|
|
c454efd713 | ||
|
|
e8bbe0ac15 | ||
|
|
b2a4157285 | ||
|
|
5682b5f9c2 | ||
|
|
a4eab94188 | ||
|
|
8994e3ad3e | ||
|
|
060f99dee5 | ||
|
|
aef170f374 | ||
|
|
bfc6e7b8da | ||
|
|
5e440a7dc4 | ||
|
|
3280baff16 | ||
|
|
bbe94610a2 | ||
|
|
4c12943e3c | ||
|
|
25189f3052 | ||
|
|
11e2695465 | ||
|
|
0d493f1c74 | ||
|
|
8d398d2940 | ||
|
|
801700044c | ||
|
|
3c2409169b | ||
|
|
490eecccc5 | ||
|
|
ecf2337205 | ||
|
|
9cc8195237 | ||
|
|
522087e18f | ||
|
|
b7e96dec38 | ||
|
|
71528c78ac | ||
|
|
2fc220f9d3 | ||
|
|
e0eed9c89a | ||
|
|
e423d8afcf | ||
|
|
100f44e197 | ||
|
|
b39e0ad6db | ||
|
|
2b1f5f2c70 | ||
|
|
e521af0eae | ||
|
|
b600fb34b5 | ||
|
|
e29beed8bd | ||
|
|
7772c7c7d6 | ||
|
|
ed82954643 | ||
|
|
1c28058141 | ||
|
|
f5410dfff4 | ||
|
|
1f93137b80 | ||
|
|
8a034662c7 | ||
|
|
7a9ccedadc | ||
|
|
84888c3c28 | ||
|
|
cc4186b578 | ||
|
|
fd01b5a61f | ||
|
|
00f7ab34ef | ||
|
|
b61865f45f | ||
|
|
4075b838fc | ||
|
|
116a214ce6 | ||
|
|
484db3c09e | ||
|
|
150f1d793c | ||
|
|
334ee0d40d | ||
|
|
76f4824d2b | ||
|
|
bf43f8aa3c | ||
|
|
0874e32597 | ||
|
|
23f372dad7 | ||
|
|
5ca894369a | ||
|
|
786f25bfd4 | ||
|
|
06a8d871f7 | ||
|
|
42b6668fd0 | ||
|
|
6ef9b9a741 | ||
|
|
98a8e96feb | ||
|
|
7c1525fd21 | ||
|
|
eb406fbb26 | ||
|
|
845b848b60 | ||
|
|
f3425493ed | ||
|
|
f203716f31 | ||
|
|
3b710d9e99 | ||
|
|
3960c31975 | ||
|
|
e3b5d7ca54 | ||
|
|
a06db1a6f9 | ||
|
|
247bf826d8 | ||
|
|
6eeb711d2f | ||
|
|
525be3cef0 | ||
|
|
a5931a78f6 | ||
|
|
971b4f60ec | ||
|
|
51e4c44fd0 | ||
|
|
a150c8c9a7 | ||
|
|
9dd7bf8990 | ||
|
|
24f1e8b4b1 | ||
|
|
22e8a57b31 | ||
|
|
ec0e6a167e | ||
|
|
5f582c09ba | ||
|
|
2ef0cf5bd5 | ||
|
|
cdbbca43c4 | ||
|
|
72ac227ecf | ||
|
|
e2f18565d1 | ||
|
|
9836d6d9bd | ||
|
|
4310e5e049 | ||
|
|
b19c2805e1 | ||
|
|
fdfb556c8e | ||
|
|
9ed3ae3fab |
28
.claude/agents/frontend-api-types.md
Normal file
28
.claude/agents/frontend-api-types.md
Normal file
@@ -0,0 +1,28 @@
|
||||
---
|
||||
name: frontend-api-types
|
||||
description: 前端 API 与类型定义专家。用于当前项目中的 src/api 层、types.ts、返回结构、Query/Form/VO/InfoVO 定义,以及前后端接口映射任务。
|
||||
---
|
||||
|
||||
你负责当前前端项目中的 API 层和类型定义。
|
||||
|
||||
## 核心原则
|
||||
|
||||
1. 先看当前模块已有 `src/api/<module>/<business>`。
|
||||
2. API 路径、返回类型、命名风格与当前模块保持一致。
|
||||
3. 能明确写出类型时,不要偷懒用 `any`。
|
||||
4. 如果当前模块已有 `export default { ... }`,继续保持一致。
|
||||
|
||||
## 重点关注
|
||||
|
||||
- `Query`
|
||||
- `VO`
|
||||
- `Form`
|
||||
- `InfoVO`
|
||||
- `AxiosPromise<PageResult<T>>`
|
||||
- 详情接口与列表接口返回结构
|
||||
|
||||
## 自检
|
||||
|
||||
- API 路径是否与后端一致
|
||||
- 类型是否覆盖接口真实结构
|
||||
- 是否不必要地把类型写宽了
|
||||
18
.claude/agents/frontend-crud-coding.md
Normal file
18
.claude/agents/frontend-crud-coding.md
Normal file
@@ -0,0 +1,18 @@
|
||||
---
|
||||
name: frontend-crud-coding
|
||||
description: 前端总入口。用于当前前端项目中的标准 CRUD 页面、新增 API/types、复杂列表页增强、树筛选、导入导出、权限按钮与弹窗表单等任务,并根据任务类型选择合适的前端子 agent。
|
||||
---
|
||||
|
||||
你是当前前端项目的总入口 agent。
|
||||
|
||||
先判断任务类型,再按下面规则处理:
|
||||
|
||||
1. 如果是新增标准 CRUD 页面、补 `src/api`、`types.ts`、`index.vue`,优先使用 `frontend-crud-page.md`。
|
||||
2. 如果是修改已有列表页、增强导入导出、树筛选、更多菜单、状态切换,优先使用 `frontend-page-enhancement.md`。
|
||||
3. 如果只改接口层和类型定义,优先使用 `frontend-api-types.md`。
|
||||
|
||||
通用要求:
|
||||
|
||||
- 先读当前目录下最近似页面和 API,再动代码。
|
||||
- 冲突时优先相信当前项目真实页面,其次是公共组件和工具,再其次才是关联后端工程的 generator 模板。
|
||||
- 默认直接产出可落地代码,而不是只给抽象建议。
|
||||
37
.claude/agents/frontend-crud-page.md
Normal file
37
.claude/agents/frontend-crud-page.md
Normal file
@@ -0,0 +1,37 @@
|
||||
---
|
||||
name: frontend-crud-page
|
||||
description: 前端标准 CRUD 页面专家。用于当前项目中的新建列表页、弹窗表单页、标准 API/types/index.vue 骨架,以及 gen 模板到项目风格的落地任务。
|
||||
---
|
||||
|
||||
你负责当前前端项目中的标准 CRUD 页面实现。
|
||||
|
||||
## 核心原则
|
||||
|
||||
1. 先看当前模块最近似页面。
|
||||
2. 再参考关联后端工程中的 generator 模板。
|
||||
3. 默认同时维护:
|
||||
`src/api/<module>/<business>/index.ts`
|
||||
`src/api/<module>/<business>/types.ts`
|
||||
`src/views/<module>/<business>/index.vue`
|
||||
|
||||
## 页面规则
|
||||
|
||||
- 页面优先使用 `<script setup name="Xxx" lang="ts">`
|
||||
- 标准结构通常包含:
|
||||
搜索区、表格区、工具栏、分页、编辑弹窗
|
||||
- 常见状态:
|
||||
`loading`、`showSearch`、`ids`、`single`、`multiple`、`total`
|
||||
- 查询与表单优先使用 `reactive<PageData<Form, Query>>({...})`
|
||||
|
||||
## API / types 规则
|
||||
|
||||
- 请求统一通过 `@/utils/request`
|
||||
- 同目录维护 `index.ts` 与 `types.ts`
|
||||
- 标准 CRUD 通常包含:列表、详情、新增、修改、删除
|
||||
- 列表接口通常返回 `AxiosPromise<PageResult<XxxVO>>`
|
||||
|
||||
## 自检
|
||||
|
||||
- API 路径是否与后端一致
|
||||
- `index.ts` 与 `types.ts` 是否同步补齐
|
||||
- 页面是否只是模板裸输出,如果是要继续补强到当前项目风格
|
||||
27
.claude/agents/frontend-page-enhancement.md
Normal file
27
.claude/agents/frontend-page-enhancement.md
Normal file
@@ -0,0 +1,27 @@
|
||||
---
|
||||
name: frontend-page-enhancement
|
||||
description: 复杂前端页面增强专家。用于修改当前项目中已经存在的列表页、树筛选页、带导入导出和更多菜单的页面,强调增量修改和保留现有交互能力。
|
||||
---
|
||||
|
||||
你负责当前前端项目中已有页面的增强,不是重写页面。
|
||||
|
||||
## 核心原则
|
||||
|
||||
1. 优先阅读当前页面完整实现。
|
||||
2. 增量修改,不重写整页。
|
||||
3. 保留已有树筛选、导入导出、列显隐、更多菜单、状态切换、路由跳转、SCSS 页面壳。
|
||||
4. 不要把复杂页面退化成 generator 式基础列表页。
|
||||
|
||||
## 常见任务
|
||||
|
||||
- 调整工具栏和更多菜单
|
||||
- 增加筛选条件和日期范围
|
||||
- 增加导入导出能力
|
||||
- 增加状态切换、快捷操作、确认弹窗
|
||||
- 补复杂页面的小型子功能
|
||||
|
||||
## 自检
|
||||
|
||||
- 是否破坏了原页面结构和样式
|
||||
- 是否误删了已有权限控制或交互能力
|
||||
- 是否应该拆成子组件而不是继续堆主页面
|
||||
136
.codex/skills/frontend-crud-coding/SKILL.md
Normal file
136
.codex/skills/frontend-crud-coding/SKILL.md
Normal file
@@ -0,0 +1,136 @@
|
||||
---
|
||||
name: frontend-crud-coding
|
||||
description: 在当前前端项目中按现有 Vue 3 + TypeScript + Element Plus 代码风格生成或修改页面、API、types、组件接入和样式。用于新增列表页、表单弹窗页、树表页、系统管理页、workflow 页面,以及补全与后端接口对应的 src/api 和 src/views 代码。
|
||||
---
|
||||
|
||||
# 前端编码规范
|
||||
|
||||
先对齐当前前端项目里的真实实现,再参考关联后端工程中代码生成器产出的前端模板。不要只套通用 Vue 模板,也不要把生成器模板原样照搬而忽略当前前端项目的实际演进。
|
||||
|
||||
## 适用场景
|
||||
|
||||
在下面这些任务里优先使用此 skill:
|
||||
|
||||
- 新增标准 CRUD 列表页、弹窗表单页、树表页。
|
||||
- 补齐后端新增接口对应的 `src/api`、`src/views`、`types.ts`。
|
||||
- 按系统管理、监控、工作流、demo 模块现有方式扩展页面功能。
|
||||
- 调整已有列表页的搜索、导出、导入、树筛选、列显隐、权限按钮、样式壳。
|
||||
- 把关联后端工程中的 generator 模板转换为符合当前前端项目风格的实际代码。
|
||||
|
||||
## 不适用场景
|
||||
|
||||
下面这些任务不要机械套用本 skill 的 CRUD 规则:
|
||||
|
||||
- 纯展示型落地页、营销页、可视化大屏。
|
||||
- 完全独立的低代码设计器或第三方嵌入页。
|
||||
- 全局框架升级、Vite 配置改造、构建链路迁移。
|
||||
- 与当前项目目录结构明显不同的实验性页面。
|
||||
|
||||
## 执行流程
|
||||
|
||||
1. 先定位目标模块,并阅读 `src/api/<module>/<business>` 与 `src/views/<module>/<business>` 下最近似页面。
|
||||
2. 再参考关联后端工程 `ruoyi-modules/ruoyi-gen/src/main/resources/vm/ts` 与 `vm/vue` 下的生成器模板,确认标准 CRUD 的基础骨架。
|
||||
3. 新增代码时同时维护 `api/index.ts`、`api/types.ts`、`views/.../index.vue`,必要时补相关子页面或弹窗页。
|
||||
4. 页面结构、样式组织、状态管理、权限指令、下载导出、字典使用都以仓库现有模式为准。
|
||||
5. 如果后端接口与生成器套路一致,可以用 generator 模板作为起点;如果当前前端项目已有更强约定,以当前项目约定覆盖模板默认行为。
|
||||
|
||||
## 优先级规则
|
||||
|
||||
发生冲突时按下面顺序决策:
|
||||
|
||||
1. 当前目录下最近似页面的真实实现。
|
||||
2. 当前项目公共组件、公共工具、公共样式约定。
|
||||
3. 关联后端工程中的 generator 模板。
|
||||
4. 通用 Vue / Element Plus 习惯。
|
||||
|
||||
也就是说:
|
||||
|
||||
- 同一模块已有页面怎么写,优先怎么写。
|
||||
- 没有现成页面时,再退回到 generator 模板骨架。
|
||||
- 没有现成模式时,才使用通用框架默认写法。
|
||||
|
||||
## 主要规则
|
||||
|
||||
详细规则见 [references/frontend.md](references/frontend.md)。
|
||||
使用案例见 [references/examples.md](references/examples.md)。
|
||||
|
||||
## 仓库通用规则
|
||||
|
||||
- 遵循 [`.editorconfig`](../../../.editorconfig):UTF-8、LF、默认 2 空格缩进。
|
||||
- 遵循 [`.prettierrc`](../../../.prettierrc):单引号、分号、`printWidth: 150`、`trailingComma: none`。
|
||||
- 页面优先使用 `<script setup name="Xxx" lang="ts">`。
|
||||
- 优先复用仓库已有基础设施,例如 `request`、`proxy?.$modal`、`proxy?.download`、`proxy?.useDict`、`pagination`、`right-toolbar`。
|
||||
- 对于标准 CRUD 页,允许先按后端生成器模板组织 `api/types/index.vue` 骨架,再补齐当前前端项目自己的页面壳、样式和交互。
|
||||
- 新页面不要无故引入另一套状态管理、另一套请求封装或另一套 UI 风格。
|
||||
|
||||
## 目录映射规则
|
||||
|
||||
通常按下面的对应关系组织代码:
|
||||
|
||||
- 后端路由 `/system/user/*` 对应 `src/api/system/user/*` 与 `src/views/system/user/*`
|
||||
- 后端路由 `/monitor/xxx/*` 对应 `src/api/monitor/xxx/*` 与 `src/views/monitor/xxx/*`
|
||||
- 后端路由 `/workflow/xxx/*` 对应 `src/api/workflow/xxx/*` 与 `src/views/workflow/xxx/*`
|
||||
- 后端路由 `/demo/xxx/*` 对应 `src/api/demo/xxx/*` 与 `src/views/demo/xxx/*`
|
||||
|
||||
标准新增通常至少包含:
|
||||
|
||||
- `src/api/<module>/<business>/index.ts`
|
||||
- `src/api/<module>/<business>/types.ts`
|
||||
- `src/views/<module>/<business>/index.vue`
|
||||
|
||||
按业务复杂度,可能继续补:
|
||||
|
||||
- 导入弹窗
|
||||
- 分配角色页
|
||||
- 详情页
|
||||
- 编辑页
|
||||
- 子组件
|
||||
- 自定义 SCSS 样式
|
||||
|
||||
## 任务分型
|
||||
|
||||
### 1. 标准单表 CRUD
|
||||
|
||||
目标是快速补齐 `api + types + index.vue`,优先参考 generator 模板,再贴近 demo 或系统模块现有页。
|
||||
|
||||
### 2. 强业务页面
|
||||
|
||||
如果页面包含树筛选、导入导出、更多操作、状态切换、角色分配、复杂校验、联动选择,则优先参考 `src/views/system/user/index.vue` 一类更完整页面。
|
||||
|
||||
### 3. 工作流页面
|
||||
|
||||
如果页面属于流程定义、分类、任务、实例等 workflow 目录,优先参考 `src/views/workflow/*`,不要硬套系统管理模块的页面骨架。
|
||||
|
||||
## 输出要求
|
||||
|
||||
使用本 skill 时,默认期望产出应满足:
|
||||
|
||||
- 类型完整,不把大量 `any` 塞进页面逻辑里。
|
||||
- 查询、重置、分页、弹窗、删除、导出流程闭环完整。
|
||||
- 权限指令、字典、公共组件接入到位。
|
||||
- 样式尽量贴合现有页面壳,而不是只保证“功能能跑”。
|
||||
- 如果是从 generator 模板演化而来,要体现出当前前端项目已有增强,而不是模板裸输出。
|
||||
|
||||
## 快速检查清单
|
||||
|
||||
- API 路径与后端路由完全对应。
|
||||
- `src/api` 中同时维护 `index.ts` 和 `types.ts`。
|
||||
- 列表页查询、重置、导出、删除、弹窗提交流程与现有页一致。
|
||||
- 继续使用项目内权限指令与公共组件。
|
||||
- 表单、查询、弹窗、表格样式优先复用现有布局类和 SCSS 片段。
|
||||
- 缩进、引号、分号与仓库格式一致。
|
||||
|
||||
## 推荐提问方式
|
||||
|
||||
推荐把请求描述到下面这个粒度:
|
||||
|
||||
- 目标模块和业务名
|
||||
- 后端接口前缀
|
||||
- 是新增页面还是修改页面
|
||||
- 是否需要导入、导出、树筛选、状态切换、字典、权限按钮
|
||||
- 希望参考哪个现有页面
|
||||
|
||||
例如:
|
||||
|
||||
- 使用 `$frontend-crud-coding` 为 `/system/client` 补一套标准 CRUD 页面,参考 `system/user` 和 generator 模板。
|
||||
- 使用 `$frontend-crud-coding` 修改 `workflow/category` 列表页,增加导出按钮和状态筛选,保持当前项目风格。
|
||||
7
.codex/skills/frontend-crud-coding/agents/openai.yaml
Normal file
7
.codex/skills/frontend-crud-coding/agents/openai.yaml
Normal file
@@ -0,0 +1,7 @@
|
||||
interface:
|
||||
display_name: "前端编码"
|
||||
short_description: "按当前前端项目约定编写页面与 API"
|
||||
default_prompt: "使用 $frontend-crud-coding 在当前前端项目里按现有约定实现页面和 API 修改。"
|
||||
|
||||
policy:
|
||||
allow_implicit_invocation: true
|
||||
112
.codex/skills/frontend-crud-coding/references/examples.md
Normal file
112
.codex/skills/frontend-crud-coding/references/examples.md
Normal file
@@ -0,0 +1,112 @@
|
||||
# 使用案例
|
||||
|
||||
## 案例 1:新增标准 CRUD 页面
|
||||
|
||||
### 用户提问示例
|
||||
|
||||
```text
|
||||
使用 $frontend-crud-coding 为 system/client 补一套前端 CRUD 页面。
|
||||
后端接口已经有 /system/client/list、/system/client/{id}、POST /system/client、PUT /system/client、DELETE /system/client/{ids}。
|
||||
请参考 generator 模板和现有的 system/user、system/config 页面风格实现。
|
||||
```
|
||||
|
||||
### 期望执行方式
|
||||
|
||||
- 先看 `src/api/system/client/*` 是否已存在。
|
||||
- 再看 `src/views/system/client/index.vue` 是否为空或缺失。
|
||||
- 参考同目录系统模块页面,确定是否需要搜索卡片、表格卡片、弹窗、导出按钮。
|
||||
- 再参考关联后端工程中的 generator 模板,补齐基础骨架。
|
||||
|
||||
### 期望产物
|
||||
|
||||
- `src/api/system/client/index.ts`
|
||||
- `src/api/system/client/types.ts`
|
||||
- `src/views/system/client/index.vue`
|
||||
|
||||
## 案例 2:把 generator 模板落成当前项目风格
|
||||
|
||||
### 用户提问示例
|
||||
|
||||
```text
|
||||
使用 $frontend-crud-coding 按 generator 模板为 demo/order 生成一个标准页面,但不要直接复制模板,要改成当前前端项目现有样式壳和工具链写法。
|
||||
```
|
||||
|
||||
### 期望执行方式
|
||||
|
||||
- 先看 generator 的 `ts/types/index.vue` 模板。
|
||||
- 再看 `src/views/demo/demo/index.vue`、`src/views/system/user/index.vue` 的实际风格差异。
|
||||
- 生成的页面要使用当前项目里的 `right-toolbar`、`pagination`、`proxy?.$modal`、`proxy?.download` 等。
|
||||
|
||||
## 案例 3:修改已有列表页
|
||||
|
||||
### 用户提问示例
|
||||
|
||||
```text
|
||||
使用 $frontend-crud-coding 修改 system/user 页面:
|
||||
1. 新增一个创建时间快捷筛选
|
||||
2. 导出按钮放到更多菜单中
|
||||
3. 保持现有样式和交互不变
|
||||
```
|
||||
|
||||
### 期望执行方式
|
||||
|
||||
- 优先阅读现有 `src/views/system/user/index.vue`。
|
||||
- 判断这是“已有页面增强”,不是“重新生成页面”。
|
||||
- 保留树筛选、导入导出、列显隐、角色分配等现有能力。
|
||||
- 增量修改,而不是重写整个页面。
|
||||
|
||||
## 案例 4:补齐复杂业务页面
|
||||
|
||||
### 用户提问示例
|
||||
|
||||
```text
|
||||
使用 $frontend-crud-coding 为 workflow/category 增加导入、导出和状态切换功能,参考 system/user 的完整页面能力,但保持 workflow 模块自己的风格。
|
||||
```
|
||||
|
||||
### 期望执行方式
|
||||
|
||||
- 优先看 `src/views/workflow/category/index.vue`。
|
||||
- 再看 `src/views/system/user/index.vue` 里复杂列表页的做法。
|
||||
- 只迁移需要的能力,不把用户模块专属逻辑照搬到 workflow 页面。
|
||||
|
||||
## 案例 5:只补 API 和 types
|
||||
|
||||
### 用户提问示例
|
||||
|
||||
```text
|
||||
使用 $frontend-crud-coding 为 monitor/cache 补全前端 API 和 types,页面先不改。
|
||||
```
|
||||
|
||||
### 期望执行方式
|
||||
|
||||
- 只维护 `src/api/monitor/cache/index.ts` 和 `src/api/monitor/cache/types.ts`。
|
||||
- 仍然要与后端路由、现有 API 风格、返回类型保持一致。
|
||||
|
||||
## 案例 6:推荐的高质量任务描述
|
||||
|
||||
下面这种描述最容易得到稳定结果:
|
||||
|
||||
```text
|
||||
使用 $frontend-crud-coding 在当前前端项目中新增一个 `/system/notice` 列表页增强:
|
||||
1. 保留现有页面
|
||||
2. 新增状态筛选和导出
|
||||
3. API 路径沿用后端现有接口
|
||||
4. 参考 system/user 的工具栏与导出交互
|
||||
5. 参考 generator 模板补齐缺失的 types 定义
|
||||
```
|
||||
|
||||
## 不推荐的任务描述
|
||||
|
||||
下面这种描述太模糊,容易让产物偏离项目:
|
||||
|
||||
```text
|
||||
帮我写个后台页面
|
||||
```
|
||||
|
||||
更好的写法至少要补充:
|
||||
|
||||
- 模块名
|
||||
- 业务名
|
||||
- 后端接口前缀
|
||||
- 是新增还是修改
|
||||
- 想参考哪个现有页面
|
||||
241
.codex/skills/frontend-crud-coding/references/frontend.md
Normal file
241
.codex/skills/frontend-crud-coding/references/frontend.md
Normal file
@@ -0,0 +1,241 @@
|
||||
# 前端约定
|
||||
|
||||
## 优先参考的代码来源
|
||||
|
||||
- 关联后端工程中的生成器模板:
|
||||
`ruoyi-modules/ruoyi-gen/src/main/resources/vm/ts/*.vm`
|
||||
`ruoyi-modules/ruoyi-gen/src/main/resources/vm/vue/*.vm`
|
||||
- `src/api/system/user/index.ts`
|
||||
- `src/api/system/user/types.ts`
|
||||
- `src/views/system/user/index.vue`
|
||||
- `src/views/demo/demo/index.vue`
|
||||
- `src/views/system/*`
|
||||
- `src/views/workflow/*`
|
||||
- `src/components/*`
|
||||
- `src/assets/styles/components/*`
|
||||
|
||||
## 基础栈与格式
|
||||
|
||||
- 技术栈是 Vue 3 + TypeScript + Element Plus + Vite。
|
||||
- 请求统一通过 `@/utils/request`。
|
||||
- API 返回值类型常用 `AxiosPromise<T>`。
|
||||
- 项目默认 2 空格缩进。
|
||||
- 使用单引号和分号。
|
||||
- 不要在一个页面里混入与仓库不一致的格式和写法。
|
||||
|
||||
## 决策顺序
|
||||
|
||||
写代码时按下面顺序取样:
|
||||
|
||||
1. 当前业务目录下最近似页面。
|
||||
2. 当前模块下最近似 API/types 文件。
|
||||
3. 当前项目的公共组件、公共工具、公共样式。
|
||||
4. 关联后端工程的 generator 模板。
|
||||
5. 通用 Vue 3 / Element Plus 默认写法。
|
||||
|
||||
如果上述规则冲突,优先相信当前项目真实代码。
|
||||
|
||||
## API 文件规则
|
||||
|
||||
- 标准 CRUD 的 API、types、列表页骨架可以先参考后端生成器模板,再根据当前前端项目风格落地。
|
||||
- API 文件通常放在 `src/api/<module>/<business>/index.ts`。
|
||||
- 同目录维护 `types.ts`。
|
||||
- 常见 import 形式:
|
||||
`import request from '@/utils/request';`
|
||||
`import { AxiosPromise } from 'axios';`
|
||||
`import { XxxForm, XxxQuery, XxxVO } from './types';`
|
||||
`import { PageResult } from '@/api/types';`
|
||||
- 列表接口通常返回 `AxiosPromise<PageResult<XxxVO>>`。
|
||||
- 详情接口返回 `AxiosPromise<XxxVO>` 或更复杂的 `InfoVO`。
|
||||
- 特殊请求参数沿用现有实现,例如:
|
||||
`parseStrEmpty(userId)`
|
||||
`headers: { isEncrypt: true, repeatSubmit: false }`
|
||||
`params` 用于 query string,`data` 用于 body。
|
||||
- 当前仓库部分模块会在文件底部 `export default { ... }`,已有模块使用这种形式时继续保持一致。
|
||||
|
||||
### API 文件建议结构
|
||||
|
||||
标准 CRUD 一般按这个顺序组织:
|
||||
|
||||
1. import 区
|
||||
2. 列表接口
|
||||
3. 详情接口
|
||||
4. 新增接口
|
||||
5. 修改接口
|
||||
6. 删除接口
|
||||
7. 特殊接口
|
||||
8. 可选的 `export default`
|
||||
|
||||
### API 常见判断
|
||||
|
||||
- 如果后端是列表分页接口,前端通常返回 `AxiosPromise<PageResult<XxxVO>>`。
|
||||
- 如果后端返回复合结构,例如 `user + roles + posts`,单独定义 `InfoVO`。
|
||||
- 如果接口需要加密或关闭重复提交,直接在 `headers` 里表达,不要另起封装。
|
||||
|
||||
## 类型文件规则
|
||||
|
||||
- 类型文件通常定义 `Query`、`VO`、`Form`,必要时补 `InfoVO`、`ResetPwdForm` 等扩展类型。
|
||||
- `Query` 一般继承 `PageQuery`。
|
||||
- `VO` 常继承 `BaseEntity`。
|
||||
- ID 字段通常使用 `string | number`。
|
||||
- 列表页多选 ID 常用 `Array<string | number>`。
|
||||
- 数组字段在表单里常直接用 `string[]`、`number[]` 或宽松类型,优先跟随现有模块。
|
||||
|
||||
### 类型拆分建议
|
||||
|
||||
- `VO` 面向列表和详情展示。
|
||||
- `Form` 面向新增和编辑。
|
||||
- `Query` 面向列表筛选。
|
||||
- `InfoVO` 面向详情页、编辑页、弹窗预加载等复合返回结构。
|
||||
|
||||
### 类型字段策略
|
||||
|
||||
- 能明确写出类型时,不要偷懒用 `any`。
|
||||
- 只有在当前模块已有宽松写法或后端返回非常不稳定时,才保留 `any`。
|
||||
- 如果列表和表单字段明显不同,不要强行复用一个接口类型。
|
||||
|
||||
## Vue 页面结构规则
|
||||
|
||||
- 标准 CRUD 页可先参考生成器的 `index.vue.vm` 骨架,再按本仓库现有页面补强。
|
||||
- 页面优先使用 `<script setup name="Xxx" lang="ts">`。
|
||||
- 常见列表页结构:
|
||||
搜索区卡片、表格区卡片、工具栏、分页、编辑弹窗。
|
||||
- 常见页面状态包括:
|
||||
`loading`、`showSearch`、`ids`、`single`、`multiple`、`total`。
|
||||
- 表单和查询对象通常通过 `reactive<PageData<Form, Query>>({...})` 管理。
|
||||
- 弹窗状态通常使用:
|
||||
`const dialog = reactive<DialogOption>({ visible: false, title: '' });`
|
||||
- 表单 ref 通常命名为 `queryFormRef`、`xxxFormRef`。
|
||||
- 复杂页面可补充树面板、导入弹窗、子弹窗、路由跳转逻辑。
|
||||
|
||||
### 标准页面骨架
|
||||
|
||||
标准页面通常包含这些区域:
|
||||
|
||||
1. 搜索区
|
||||
2. 表格区
|
||||
3. 工具栏
|
||||
4. 分页
|
||||
5. 编辑弹窗
|
||||
|
||||
复杂页面可以额外增加:
|
||||
|
||||
- 左侧树筛选
|
||||
- 导入弹窗
|
||||
- 二级对话框
|
||||
- 独立详情页
|
||||
- 路由跳转按钮
|
||||
- 列显隐控制
|
||||
|
||||
### 页面命名建议
|
||||
|
||||
- 页面组件名通常为业务名,例如 `name="User"`、`name="Demo"`。
|
||||
- 页面根类名尽量带模块语义,例如:
|
||||
`system-user-page`
|
||||
`demo-demo-page`
|
||||
`workflow-category-page`
|
||||
|
||||
## 页面行为规则
|
||||
|
||||
- `getList` 负责发起列表请求、处理 loading、回填 `rows` 和 `total`。
|
||||
- `handleQuery` 先把 `pageNum` 置为 `1`,再重新查询。
|
||||
- `resetQuery` 负责清空查询表单、日期范围、树节点选择,然后重新加载。
|
||||
- `handleSelectionChange` 更新 `ids`、`single`、`multiple`。
|
||||
- `handleAdd` 重置表单并打开新增弹窗。
|
||||
- `handleUpdate` 查详情后回填表单并打开编辑弹窗。
|
||||
- `submitForm` 使用表单校验,通过后调用新增或修改接口,再提示成功并刷新列表。
|
||||
- `handleDelete` 通常使用 `proxy?.$modal.confirm(...)` 二次确认。
|
||||
- `handleExport` 使用 `proxy?.download(...)`。
|
||||
- 日期范围查询沿用 `proxy?.addDateRange(queryParams.value, dateRange.value)`。
|
||||
- 需要更稳妥地处理确认框或异步异常时,可沿用 `await-to-js` 的 `to(...)` 风格。
|
||||
|
||||
### 页面逻辑建议
|
||||
|
||||
- 新增和编辑优先共用一套弹窗和表单。
|
||||
- `reset()` 与 `cancel()` 分开写,避免关闭弹窗时状态残留。
|
||||
- `handleUpdate()` 先查详情再 `Object.assign(form.value, res.data)`。
|
||||
- 删除、状态切换、解锁、重置密码这类危险操作优先保留确认提示。
|
||||
- 列表页只做列表页职责,复杂复合逻辑优先拆到子组件或独立页面。
|
||||
|
||||
## 字典、权限与公共工具
|
||||
|
||||
- 字典通常通过:
|
||||
`const { xxx_dict } = toRefs<any>(proxy?.useDict('xxx_dict'));`
|
||||
- 权限指令以仓库现状为准,存在 `v-hasPermi` 和 `v-has-permi` 两种写法;新增代码优先跟随所在目录附近文件,不要在同一文件里混用新的变体。
|
||||
- 常用公共能力:
|
||||
`proxy?.$modal`
|
||||
`proxy?.download`
|
||||
`proxy?.useDict`
|
||||
`proxy?.getConfigKey`
|
||||
`checkPermi`
|
||||
`useUserStore`
|
||||
|
||||
### 权限规则
|
||||
|
||||
- 所有增删改导入导出按钮都先看附近页面是否有权限控制。
|
||||
- 新按钮默认补权限指令,除非它是纯展示行为。
|
||||
- 如果同目录页面使用 `v-hasPermi`,新代码优先继续用 `v-hasPermi`。
|
||||
- 如果同目录页面使用 `v-has-permi`,新代码优先继续用 `v-has-permi`。
|
||||
|
||||
## 组件与样式规则
|
||||
|
||||
- 优先复用公共组件:
|
||||
`right-toolbar`
|
||||
`pagination`
|
||||
`ImageUpload`
|
||||
`ImagePreview`
|
||||
`FileUpload`
|
||||
`Editor`
|
||||
`DictTag`
|
||||
- 页面样式不要堆大量内联样式,优先沿用仓库里的布局类和组件样式。
|
||||
- 已有页面使用 SCSS 模块片段时,继续沿用:
|
||||
`@use '@/assets/styles/components/page-shell' as pageShell;`
|
||||
`@include pageShell.xxx;`
|
||||
- 类名命名保持模块化,例如:
|
||||
`system-user-page`
|
||||
`demo-demo-page`
|
||||
`table-panel`
|
||||
`search-panel`
|
||||
`toolbar-shell`
|
||||
|
||||
### 样式落点建议
|
||||
|
||||
- 页面只需要轻量调整时,优先复用已有通用类。
|
||||
- 页面结构明显复杂时,优先在 `<style lang="scss" scoped>` 中通过 `@use` 复用组件样式片段。
|
||||
- 不要为了单页需求破坏全局组件样式。
|
||||
|
||||
## 与生成器模板的关系
|
||||
|
||||
- 关联后端工程生成器给出的前端结构可以作为起点,但真实页面通常更完整,包含:
|
||||
树筛选、列显隐、导入导出、更多操作、SCSS 页面壳、复杂表单校验、独立子页面。
|
||||
- 因此新增页面时,不要只满足“能跑”,要先看所在模块已有页面的复杂度和 UI 组织方式。
|
||||
|
||||
### 什么时候优先看 generator
|
||||
|
||||
- 新增一个标准单表 CRUD 页面时。
|
||||
- 当前项目里还没有这个业务对应页面时。
|
||||
- 你只拿到了后端路由和字段信息时。
|
||||
|
||||
### 什么时候优先看现有页面
|
||||
|
||||
- 当前模块已经有同类页面时。
|
||||
- 页面包含树筛选、导入导出、联动弹窗、路由跳转时。
|
||||
- 任务是“修改已有页面”而不是“新建页面”时。
|
||||
|
||||
## 避免事项
|
||||
|
||||
- 不要直接把后端仓库里的前端模板原样复制进来。
|
||||
- 不要跳过 `types.ts`,把类型全堆在页面里。
|
||||
- 不要绕开 `request` 自己再包一层请求工具。
|
||||
- 不要引入与仓库现状不一致的 CSS 组织方式。
|
||||
- 不要为了省事删掉权限控制、导出、导入、树筛选、日期范围等现有交互能力。
|
||||
|
||||
## 交付前自检
|
||||
|
||||
交付前至少检查这些点:
|
||||
|
||||
- 页面能否完整走通查询、新增、编辑、删除、导出流程。
|
||||
- 类型是否与接口返回结构一致。
|
||||
- 是否保留了原页面已有的权限和交互能力。
|
||||
- 是否沿用了当前模块已有的组件和样式壳。
|
||||
- 是否只是“生成器裸页”,如果是,需要继续补齐到当前项目风格。
|
||||
@@ -1,5 +1,6 @@
|
||||
# 页面标题
|
||||
VITE_APP_TITLE = RuoYi-Vue-Plus多租户管理系统
|
||||
VITE_APP_TITLE = RuoYi-Vue-Plus后台管理系统
|
||||
VITE_APP_LOGO_TITLE = RuoYi-Vue-Plus
|
||||
|
||||
# 开发环境配置
|
||||
VITE_APP_ENV = 'development'
|
||||
@@ -28,8 +29,11 @@ VITE_APP_RSA_PRIVATE_KEY = 'MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAmc3C
|
||||
# 客户端id
|
||||
VITE_APP_CLIENT_ID = 'e5cd7e4891bf95d1d19206ce24a7b32e'
|
||||
|
||||
# websocket 开关 默认使用sse推送
|
||||
VITE_APP_WEBSOCKET = false
|
||||
# 统一消息推送开关
|
||||
VITE_APP_MESSAGE_ENABLED = true
|
||||
|
||||
# sse 开关
|
||||
VITE_APP_SSE = true
|
||||
# sse / websocket
|
||||
VITE_APP_MESSAGE_TRANSPORT = 'sse'
|
||||
|
||||
# 统一消息推送路径
|
||||
VITE_APP_MESSAGE_PATH = '/resource/message'
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
# 页面标题
|
||||
VITE_APP_TITLE = RuoYi-Vue-Plus多租户管理系统
|
||||
VITE_APP_TITLE = RuoYi-Vue-Plus后台管理系统
|
||||
VITE_APP_LOGO_TITLE = RuoYi-Vue-Plus
|
||||
|
||||
# 生产环境配置
|
||||
VITE_APP_ENV = 'production'
|
||||
@@ -31,8 +32,11 @@ VITE_APP_RSA_PRIVATE_KEY = 'MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAmc3C
|
||||
# 客户端id
|
||||
VITE_APP_CLIENT_ID = 'e5cd7e4891bf95d1d19206ce24a7b32e'
|
||||
|
||||
# websocket 开关 默认使用sse推送
|
||||
VITE_APP_WEBSOCKET = false
|
||||
# 统一消息推送开关
|
||||
VITE_APP_MESSAGE_ENABLED = true
|
||||
|
||||
# sse 开关
|
||||
VITE_APP_SSE = true
|
||||
# sse / websocket
|
||||
VITE_APP_MESSAGE_TRANSPORT = 'sse'
|
||||
|
||||
# 统一消息推送路径
|
||||
VITE_APP_MESSAGE_PATH = '/resource/message'
|
||||
|
||||
@@ -1,17 +0,0 @@
|
||||
*.sh
|
||||
node_modules
|
||||
*.md
|
||||
*.woff
|
||||
*.ttf
|
||||
.vscode
|
||||
.idea
|
||||
dist
|
||||
/public
|
||||
/docs
|
||||
.husky
|
||||
.local
|
||||
/bin
|
||||
.eslintrc.cjs
|
||||
prettier.config.js
|
||||
src/assets
|
||||
tailwind.config.js
|
||||
@@ -1,312 +0,0 @@
|
||||
{
|
||||
"globals": {
|
||||
"ComponentInternalInstance": true,
|
||||
"TransferKey": true,
|
||||
"ElFormRules": true,
|
||||
"CheckboxValueType": true,
|
||||
"PropType": true,
|
||||
"DateModelType": true,
|
||||
"UploadFile": true,
|
||||
"ElFormInstance": true,
|
||||
"ElTableInstance": true,
|
||||
"ElTreeInstance": true,
|
||||
"ElTreeSelectInstance": true,
|
||||
"ElSelectInstance": true,
|
||||
"ElUploadInstance": true,
|
||||
"ElCardInstance": true,
|
||||
"ElDialogInstance": true,
|
||||
"ElInputInstance": true,
|
||||
"ElInputNumberInstance": true,
|
||||
"ElRadioInstance": true,
|
||||
"ElRadioGroupInstance": true,
|
||||
"ElRadioButtonInstance": true,
|
||||
"ElCheckboxInstance": true,
|
||||
"ElCheckboxGroupInstance": true,
|
||||
"ElSwitchInstance": true,
|
||||
"ElDatePickerInstance": true,
|
||||
"ElTimePickerInstance": true,
|
||||
"ElTimeSelectInstance": true,
|
||||
"ElScrollbarInstance": true,
|
||||
"ElCascaderInstance": true,
|
||||
"ElColorPickerInstance": true,
|
||||
"ElRateInstance": true,
|
||||
"ElSliderInstance": true,
|
||||
"useRouter": true,
|
||||
"useRoute": true,
|
||||
"EffectScope": true,
|
||||
"ElTable": true,
|
||||
"ElSelect": true,
|
||||
"ElUpload": true,
|
||||
"ElForm": true,
|
||||
"ElTree": true,
|
||||
"ElMessage": true,
|
||||
"ElMessageBox": true,
|
||||
"asyncComputed": true,
|
||||
"autoResetRef": true,
|
||||
"computed": true,
|
||||
"computedAsync": true,
|
||||
"computedEager": true,
|
||||
"computedInject": true,
|
||||
"computedWithControl": true,
|
||||
"controlledComputed": true,
|
||||
"controlledRef": true,
|
||||
"createApp": true,
|
||||
"createEventHook": true,
|
||||
"createGlobalState": true,
|
||||
"createInjectionState": true,
|
||||
"createReactiveFn": true,
|
||||
"createSharedComposable": true,
|
||||
"createUnrefFn": true,
|
||||
"customRef": true,
|
||||
"debouncedRef": true,
|
||||
"debouncedWatch": true,
|
||||
"defineAsyncComponent": true,
|
||||
"defineComponent": true,
|
||||
"eagerComputed": true,
|
||||
"effectScope": true,
|
||||
"extendRef": true,
|
||||
"getCurrentInstance": true,
|
||||
"getCurrentScope": true,
|
||||
"h": true,
|
||||
"ignorableWatch": true,
|
||||
"inject": true,
|
||||
"isDefined": true,
|
||||
"isProxy": true,
|
||||
"isReactive": true,
|
||||
"isReadonly": true,
|
||||
"isRef": true,
|
||||
"makeDestructurable": true,
|
||||
"markRaw": true,
|
||||
"nextTick": true,
|
||||
"onActivated": true,
|
||||
"onBeforeMount": true,
|
||||
"onBeforeUnmount": true,
|
||||
"onBeforeUpdate": true,
|
||||
"onClickOutside": true,
|
||||
"onDeactivated": true,
|
||||
"onErrorCaptured": true,
|
||||
"onKeyStroke": true,
|
||||
"onLongPress": true,
|
||||
"onMounted": true,
|
||||
"onRenderTracked": true,
|
||||
"onRenderTriggered": true,
|
||||
"onScopeDispose": true,
|
||||
"onServerPrefetch": true,
|
||||
"onStartTyping": true,
|
||||
"onUnmounted": true,
|
||||
"onUpdated": true,
|
||||
"pausableWatch": true,
|
||||
"provide": true,
|
||||
"reactify": true,
|
||||
"reactifyObject": true,
|
||||
"reactive": true,
|
||||
"reactiveComputed": true,
|
||||
"reactiveOmit": true,
|
||||
"reactivePick": true,
|
||||
"readonly": true,
|
||||
"ref": true,
|
||||
"refAutoReset": true,
|
||||
"refDebounced": true,
|
||||
"refDefault": true,
|
||||
"refThrottled": true,
|
||||
"refWithControl": true,
|
||||
"resolveComponent": true,
|
||||
"resolveDirective": true,
|
||||
"resolveRef": true,
|
||||
"resolveUnref": true,
|
||||
"shallowReactive": true,
|
||||
"shallowReadonly": true,
|
||||
"shallowRef": true,
|
||||
"syncRef": true,
|
||||
"syncRefs": true,
|
||||
"templateRef": true,
|
||||
"throttledRef": true,
|
||||
"throttledWatch": true,
|
||||
"toRaw": true,
|
||||
"toReactive": true,
|
||||
"toRef": true,
|
||||
"toRefs": true,
|
||||
"triggerRef": true,
|
||||
"tryOnBeforeMount": true,
|
||||
"tryOnBeforeUnmount": true,
|
||||
"tryOnMounted": true,
|
||||
"tryOnScopeDispose": true,
|
||||
"tryOnUnmounted": true,
|
||||
"unref": true,
|
||||
"unrefElement": true,
|
||||
"until": true,
|
||||
"useActiveElement": true,
|
||||
"useArrayEvery": true,
|
||||
"useArrayFilter": true,
|
||||
"useArrayFind": true,
|
||||
"useArrayFindIndex": true,
|
||||
"useArrayFindLast": true,
|
||||
"useArrayJoin": true,
|
||||
"useArrayMap": true,
|
||||
"useArrayReduce": true,
|
||||
"useArraySome": true,
|
||||
"useArrayUnique": true,
|
||||
"useAsyncQueue": true,
|
||||
"useAsyncState": true,
|
||||
"useAttrs": true,
|
||||
"useBase64": true,
|
||||
"useBattery": true,
|
||||
"useBluetooth": true,
|
||||
"useBreakpoints": true,
|
||||
"useBroadcastChannel": true,
|
||||
"useBrowserLocation": true,
|
||||
"useCached": true,
|
||||
"useClipboard": true,
|
||||
"useCloned": true,
|
||||
"useColorMode": true,
|
||||
"useConfirmDialog": true,
|
||||
"useCounter": true,
|
||||
"useCssModule": true,
|
||||
"useCssVar": true,
|
||||
"useCssVars": true,
|
||||
"useCurrentElement": true,
|
||||
"useCycleList": true,
|
||||
"useDark": true,
|
||||
"useDateFormat": true,
|
||||
"useDebounce": true,
|
||||
"useDebounceFn": true,
|
||||
"useDebouncedRefHistory": true,
|
||||
"useDeviceMotion": true,
|
||||
"useDeviceOrientation": true,
|
||||
"useDevicePixelRatio": true,
|
||||
"useDevicesList": true,
|
||||
"useDisplayMedia": true,
|
||||
"useDocumentVisibility": true,
|
||||
"useDraggable": true,
|
||||
"useDropZone": true,
|
||||
"useElementBounding": true,
|
||||
"useElementByPoint": true,
|
||||
"useElementHover": true,
|
||||
"useElementSize": true,
|
||||
"useElementVisibility": true,
|
||||
"useEventBus": true,
|
||||
"useEventListener": true,
|
||||
"useEventSource": true,
|
||||
"useEyeDropper": true,
|
||||
"useFavicon": true,
|
||||
"useFetch": true,
|
||||
"useFileDialog": true,
|
||||
"useFileSystemAccess": true,
|
||||
"useFocus": true,
|
||||
"useFocusWithin": true,
|
||||
"useFps": true,
|
||||
"useFullscreen": true,
|
||||
"useGamepad": true,
|
||||
"useGeolocation": true,
|
||||
"useIdle": true,
|
||||
"useImage": true,
|
||||
"useInfiniteScroll": true,
|
||||
"useIntersectionObserver": true,
|
||||
"useInterval": true,
|
||||
"useIntervalFn": true,
|
||||
"useKeyModifier": true,
|
||||
"useLastChanged": true,
|
||||
"useLocalStorage": true,
|
||||
"useMagicKeys": true,
|
||||
"useManualRefHistory": true,
|
||||
"useMediaControls": true,
|
||||
"useMediaQuery": true,
|
||||
"useMemoize": true,
|
||||
"useMemory": true,
|
||||
"useMounted": true,
|
||||
"useMouse": true,
|
||||
"useMouseInElement": true,
|
||||
"useMousePressed": true,
|
||||
"useMutationObserver": true,
|
||||
"useNavigatorLanguage": true,
|
||||
"useNetwork": true,
|
||||
"useNow": true,
|
||||
"useObjectUrl": true,
|
||||
"useOffsetPagination": true,
|
||||
"useOnline": true,
|
||||
"usePageLeave": true,
|
||||
"useParallax": true,
|
||||
"usePermission": true,
|
||||
"usePointer": true,
|
||||
"usePointerLock": true,
|
||||
"usePointerSwipe": true,
|
||||
"usePreferredColorScheme": true,
|
||||
"usePreferredContrast": true,
|
||||
"usePreferredDark": true,
|
||||
"usePreferredLanguages": true,
|
||||
"usePreferredReducedMotion": true,
|
||||
"usePrevious": true,
|
||||
"useRafFn": true,
|
||||
"useRefHistory": true,
|
||||
"useResizeObserver": true,
|
||||
"useScreenOrientation": true,
|
||||
"useScreenSafeArea": true,
|
||||
"useScriptTag": true,
|
||||
"useScroll": true,
|
||||
"useScrollLock": true,
|
||||
"useSessionStorage": true,
|
||||
"useShare": true,
|
||||
"useSlots": true,
|
||||
"useSorted": true,
|
||||
"useSpeechRecognition": true,
|
||||
"useSpeechSynthesis": true,
|
||||
"useStepper": true,
|
||||
"useStorage": true,
|
||||
"useStorageAsync": true,
|
||||
"useStyleTag": true,
|
||||
"useSupported": true,
|
||||
"useSwipe": true,
|
||||
"useTemplateRefsList": true,
|
||||
"useTextDirection": true,
|
||||
"useTextSelection": true,
|
||||
"useTextareaAutosize": true,
|
||||
"useThrottle": true,
|
||||
"useThrottleFn": true,
|
||||
"useThrottledRefHistory": true,
|
||||
"useTimeAgo": true,
|
||||
"useTimeout": true,
|
||||
"useTimeoutFn": true,
|
||||
"useTimeoutPoll": true,
|
||||
"useTimestamp": true,
|
||||
"useTitle": true,
|
||||
"useToNumber": true,
|
||||
"useToString": true,
|
||||
"useToggle": true,
|
||||
"useTransition": true,
|
||||
"useUrlSearchParams": true,
|
||||
"useUserMedia": true,
|
||||
"useVModel": true,
|
||||
"useVModels": true,
|
||||
"useVibrate": true,
|
||||
"useVirtualList": true,
|
||||
"useWakeLock": true,
|
||||
"useWebNotification": true,
|
||||
"useWebSocket": true,
|
||||
"useWebWorker": true,
|
||||
"useWebWorkerFn": true,
|
||||
"useWindowFocus": true,
|
||||
"useWindowScroll": true,
|
||||
"useWindowSize": true,
|
||||
"watch": true,
|
||||
"watchArray": true,
|
||||
"watchAtMost": true,
|
||||
"watchDebounced": true,
|
||||
"watchEffect": true,
|
||||
"watchIgnorable": true,
|
||||
"watchOnce": true,
|
||||
"watchPausable": true,
|
||||
"watchPostEffect": true,
|
||||
"watchSyncEffect": true,
|
||||
"watchThrottled": true,
|
||||
"watchTriggerable": true,
|
||||
"watchWithFilter": true,
|
||||
"whenever": true,
|
||||
"ImportOption": true,
|
||||
"TreeType": true,
|
||||
"FieldOption": true,
|
||||
"PageData": true,
|
||||
"storeToRefs": true,
|
||||
"DictDataOption": true,
|
||||
"UploadOption": true
|
||||
}
|
||||
}
|
||||
@@ -1,51 +0,0 @@
|
||||
module.exports = {
|
||||
env: {
|
||||
browser: true,
|
||||
node: true,
|
||||
es6: true
|
||||
},
|
||||
parser: 'vue-eslint-parser',
|
||||
extends: [
|
||||
'plugin:vue/vue3-recommended',
|
||||
'./.eslintrc-auto-import.json',
|
||||
'plugin:@typescript-eslint/recommended',
|
||||
'prettier',
|
||||
'plugin:prettier/recommended'
|
||||
],
|
||||
parserOptions: {
|
||||
ecmaVersion: '2020',
|
||||
sourceType: 'module',
|
||||
project: './tsconfig.*?.json',
|
||||
parser: '@typescript-eslint/parser'
|
||||
},
|
||||
plugins: ['vue', '@typescript-eslint', 'import', 'promise', 'node', 'prettier'],
|
||||
rules: {
|
||||
'@typescript-eslint/no-empty-function': 'off',
|
||||
'@typescript-eslint/no-explicit-any': 'off',
|
||||
'@typescript-eslint/no-unused-vars': 'off',
|
||||
'@typescript-eslint/no-this-alias': 'off',
|
||||
|
||||
// vue
|
||||
'vue/multi-word-component-names': 'off',
|
||||
'vue/valid-define-props': 'off',
|
||||
'vue/no-v-model-argument': 'off',
|
||||
'prefer-rest-params': 'off',
|
||||
// prettier
|
||||
'prettier/prettier': 'error',
|
||||
'@typescript-eslint/ban-types': [
|
||||
'error',
|
||||
{
|
||||
// 关闭空类型检查 {}
|
||||
extendDefaults: true,
|
||||
types: {
|
||||
'{}': false,
|
||||
Function: false
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
globals: {
|
||||
DialogOption: 'readonly',
|
||||
OptionType: 'readonly'
|
||||
}
|
||||
};
|
||||
31
.oxfmtrc.json
Normal file
31
.oxfmtrc.json
Normal file
@@ -0,0 +1,31 @@
|
||||
{
|
||||
"$schema": "./node_modules/oxfmt/configuration_schema.json",
|
||||
"ignorePatterns": [
|
||||
"src/types/components.d.ts",
|
||||
"src/types/auto-imports.d.ts",
|
||||
".ai_state",
|
||||
".claude",
|
||||
".codex",
|
||||
"doc"
|
||||
],
|
||||
"printWidth": 120,
|
||||
"singleQuote": true,
|
||||
"trailingComma": "none",
|
||||
"arrowParens": "avoid",
|
||||
"htmlWhitespaceSensitivity": "ignore",
|
||||
"experimentalSortPackageJson": {
|
||||
"sortScripts": true
|
||||
},
|
||||
"sortImports": {
|
||||
"newlinesBetween": false,
|
||||
"groups": [
|
||||
"type-import",
|
||||
["value-builtin", "value-external"],
|
||||
"type-internal",
|
||||
"value-internal",
|
||||
["type-parent", "type-sibling", "type-index"],
|
||||
["value-parent", "value-sibling", "value-index"],
|
||||
"unknown"
|
||||
]
|
||||
}
|
||||
}
|
||||
25
.oxlintrc.json
Normal file
25
.oxlintrc.json
Normal file
@@ -0,0 +1,25 @@
|
||||
{
|
||||
"$schema": "https://raw.githubusercontent.com/oxc-project/oxc/main/npm/oxlint/configuration_schema.json",
|
||||
"plugins": ["eslint", "typescript", "unicorn", "oxc", "import", "vue"],
|
||||
"rules": {
|
||||
"typescript/no-empty-function": "off",
|
||||
"typescript/no-explicit-any": "off",
|
||||
"typescript/no-unused-vars": "off",
|
||||
"typescript/no-this-alias": "off",
|
||||
"typescript/no-empty-object-type": "off",
|
||||
"typescript/no-unused-expressions": "off",
|
||||
"prefer-rest-params": "off",
|
||||
"import/no-unassigned-import": "off",
|
||||
"import/no-named-as-default-member": "off",
|
||||
"import/no-named-as-default": "off",
|
||||
"no-shadow": "off",
|
||||
"unicorn/prefer-add-event-listener": "off",
|
||||
"unicorn/consistent-function-scoping": "off",
|
||||
"unicorn/no-instanceof-builtins": "off"
|
||||
},
|
||||
"categories": {
|
||||
"correctness": "error",
|
||||
"suspicious": "error"
|
||||
},
|
||||
"ignorePatterns": [".ai_state", ".claude", ".codex", "doc", "dist/**", "dist-ssr/**", "coverage/**"]
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
/dist/*
|
||||
.local
|
||||
.output.js
|
||||
/node_modules/**
|
||||
|
||||
**/*.svg
|
||||
**/*.sh
|
||||
|
||||
/public/*
|
||||
20
.prettierrc
20
.prettierrc
@@ -1,20 +0,0 @@
|
||||
{
|
||||
"printWidth": 150,
|
||||
"tabWidth": 2,
|
||||
"useTabs": false,
|
||||
"semi": true,
|
||||
"singleQuote": true,
|
||||
"quoteProps": "preserve",
|
||||
"jsxSingleQuote": false,
|
||||
"bracketSameLine": false,
|
||||
"trailingComma": "none",
|
||||
"bracketSpacing": true,
|
||||
"embeddedLanguageFormatting": "auto",
|
||||
"arrowParens": "always",
|
||||
"requirePragma": false,
|
||||
"insertPragma": false,
|
||||
"proseWrap": "preserve",
|
||||
"htmlWhitespaceSensitivity": "css",
|
||||
"vueIndentScriptAndStyle": false,
|
||||
"endOfLine": "auto"
|
||||
}
|
||||
31
README.md
31
README.md
@@ -1,25 +1,32 @@
|
||||
## 平台简介
|
||||
|
||||
- 本仓库为前端技术栈 [Vue3](https://v3.cn.vuejs.org) + [TS](https://www.typescriptlang.org/) + [Element Plus](https://element-plus.org/zh-CN) + [Vite](https://cn.vitejs.dev) 版本。
|
||||
- 成员项目: 基于 vben(ant-design-vue) 的前端项目 [ruoyi-plus-vben](https://gitee.com/dapppp/ruoyi-plus-vben)
|
||||
- 配套后端代码仓库地址
|
||||
- [RuoYi-Vue-Plus 5.X(注意版本号)](https://gitee.com/dromara/RuoYi-Vue-Plus)
|
||||
- [RuoYi-Cloud-Plus 2.X(注意版本号)](https://gitee.com/dromara/RuoYi-Cloud-Plus)
|
||||
- 成员项目: 基于 vben5(ant-design-vue) 的前端项目 [ruoyi-plus-vben5](https://gitee.com/dapppp/ruoyi-plus-vben5)
|
||||
- 成员项目: 基于soybean 的前端项目 [ruoyi-plus-soybean](https://gitee.com/xlsea/ruoyi-plus-soybean)
|
||||
|
||||
## 配套后端代码仓库地址
|
||||
|
||||
| 介绍 | 项目名 | 项目地址 |
|
||||
| ----------------- | :--------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| 🔥 分布式集群框架 | RuoYi-Vue-Plus | - [Gitee](https://gitee.com/dromara/RuoYi-Vue-Plus)<br> - [GitHub](https://github.com/dromara/RuoYi-Vue-Plus)<br> - [GitCode](https://gitcode.com/dromara/RuoYi-Vue-Plus) |
|
||||
| 🔥 微服务框架 | RuoYi-Cloud-Plus | - [Gitee](https://gitee.com/dromara/RuoYi-Cloud-Plus)<br>- [GitHub](https://github.com/dromara/RuoYi-Cloud-Plus)<br> - [GitCode](https://gitcode.com/dromara/RuoYi-Cloud-Plus) |
|
||||
|
||||
## 分支说明
|
||||
|
||||
- ts分支(稳定发布主分支 生产可用)
|
||||
- dev分支(开发分支 开发过程中使用)
|
||||
|
||||
## 前端运行
|
||||
|
||||
```bash
|
||||
# 克隆项目
|
||||
git clone https://gitee.com/JavaLionLi/plus-ui.git
|
||||
|
||||
# 安装依赖
|
||||
npm install --registry=https://registry.npmmirror.com
|
||||
pnpm install --registry=https://registry.npmmirror.com
|
||||
|
||||
# 启动服务
|
||||
npm run dev
|
||||
pnpm dev
|
||||
|
||||
# 构建生产环境
|
||||
npm run build:prod
|
||||
pnpm build:prod
|
||||
|
||||
# 前端访问地址 http://localhost:80
|
||||
```
|
||||
@@ -28,8 +35,6 @@ npm run build:prod
|
||||
|
||||
| 业务 | 功能说明 | 本框架 | RuoYi |
|
||||
| ------------ | ------------------------------------------------------------- | ------ | ----------------------------- |
|
||||
| 租户管理 | 系统内租户的管理 如:租户套餐、过期时间、用户数量、企业信息等 | 支持 | 无 |
|
||||
| 租户套餐管理 | 系统内租户所能使用的套餐管理 如:套餐内所包含的菜单等 | 支持 | 无 |
|
||||
| 用户管理 | 用户的管理配置 如:新增用户、分配用户所属部门、角色、岗位等 | 支持 | 支持 |
|
||||
| 部门管理 | 配置系统组织机构(公司、部门、小组) 树结构展现支持数据权限 | 支持 | 支持 |
|
||||
| 岗位管理 | 配置系统用户所属担任职务 | 支持 | 支持 |
|
||||
@@ -73,4 +78,4 @@ npm run build:prod
|
||||
|  |  |
|
||||
|  |  |
|
||||
|  |  |
|
||||
|  |  |
|
||||
|  |  |
|
||||
@@ -1,12 +0,0 @@
|
||||
@echo off
|
||||
echo.
|
||||
echo [<5B><>Ϣ] <20><><EFBFBD><EFBFBD>Web<65><62><EFBFBD>̣<EFBFBD><CCA3><EFBFBD><EFBFBD><EFBFBD>dist<73>ļ<EFBFBD><C4BC><EFBFBD>
|
||||
echo.
|
||||
|
||||
%~d0
|
||||
cd %~dp0
|
||||
|
||||
cd ..
|
||||
yarn build:prod
|
||||
|
||||
pause
|
||||
@@ -1,12 +0,0 @@
|
||||
@echo off
|
||||
echo.
|
||||
echo [<5B><>Ϣ] <20><>װWeb<65><62><EFBFBD>̣<EFBFBD><CCA3><EFBFBD><EFBFBD><EFBFBD>node_modules<65>ļ<EFBFBD><C4BC><EFBFBD>
|
||||
echo.
|
||||
|
||||
%~d0
|
||||
cd %~dp0
|
||||
|
||||
cd ..
|
||||
yarn --registry=https://registry.npmmirror.com
|
||||
|
||||
pause
|
||||
@@ -1,12 +0,0 @@
|
||||
@echo off
|
||||
echo.
|
||||
echo [<5B><>Ϣ] ʹ<><CAB9> Vite <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Web <20><><EFBFBD>̡<EFBFBD>
|
||||
echo.
|
||||
|
||||
%~d0
|
||||
cd %~dp0
|
||||
|
||||
cd ..
|
||||
yarn dev
|
||||
|
||||
pause
|
||||
34
html/ie.html
34
html/ie.html
@@ -144,7 +144,8 @@
|
||||
font-size: 14px;
|
||||
line-height: 24px;
|
||||
color: #454545;
|
||||
font-family: 'Microsoft YaHei UI', 'Microsoft YaHei', DengXian, SimSun, 'Segoe UI', Tahoma, Helvetica, sans-serif;
|
||||
font-family:
|
||||
'Microsoft YaHei UI', 'Microsoft YaHei', DengXian, SimSun, 'Segoe UI', Tahoma, Helvetica, sans-serif;
|
||||
overflow-y: scroll;
|
||||
}
|
||||
h1 {
|
||||
@@ -208,15 +209,18 @@
|
||||
</head>
|
||||
<body style="margin-top: 50px">
|
||||
<h1>请升级您的浏览器,以便我们更好的为您提供服务!</h1>
|
||||
<p>您正在使用 Internet Explorer 的早期版本(IE11以下版本或使用该内核的浏览器)。这意味着在升级浏览器前,您将无法访问此网站。</p>
|
||||
<p>
|
||||
您正在使用 Internet Explorer
|
||||
的早期版本(IE11以下版本或使用该内核的浏览器)。这意味着在升级浏览器前,您将无法访问此网站。
|
||||
</p>
|
||||
<hr />
|
||||
<h2>请注意:微软公司对Windows XP 及 Internet Explorer 早期版本的支持已经结束</h2>
|
||||
<p>
|
||||
自 2016 年 1 月 12 日起,Microsoft 不再为 IE 11
|
||||
以下版本提供相应支持和更新。没有关键的浏览器安全更新,您的电脑可能易受有害病毒、间谍软件和其他恶意软件的攻击,它们可以窃取或损害您的业务数据和信息。请参阅
|
||||
<a href="https://www.microsoft.com/zh-cn/WindowsForBusiness/End-of-IE-support"
|
||||
>微软对 Internet Explorer 早期版本的支持将于 2016 年 1 月 12 日结束的说明</a
|
||||
>
|
||||
<a href="https://www.microsoft.com/zh-cn/WindowsForBusiness/End-of-IE-support">
|
||||
微软对 Internet Explorer 早期版本的支持将于 2016 年 1 月 12 日结束的说明
|
||||
</a>
|
||||
。
|
||||
</p>
|
||||
<hr />
|
||||
@@ -224,16 +228,28 @@
|
||||
<p>推荐使用以下浏览器的最新版本。如果您的电脑已有以下浏览器的最新版本则直接使用该浏览器访问即可。</p>
|
||||
<ul class="browser">
|
||||
<li class="browser-chrome">
|
||||
<a href="https://www.google.cn/chrome/browser/desktop/index.html?hl=zh-CN&standalone=1"> 谷歌浏览器<span>Google Chrome</span></a>
|
||||
<a href="https://www.google.cn/chrome/browser/desktop/index.html?hl=zh-CN&standalone=1">
|
||||
谷歌浏览器
|
||||
<span>Google Chrome</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="browser-firefox">
|
||||
<a href="https://www.mozilla.org/zh-CN/firefox/new/"> 火狐浏览器<span>Mozilla Firefox</span></a>
|
||||
<a href="https://www.mozilla.org/zh-CN/firefox/new/">
|
||||
火狐浏览器
|
||||
<span>Mozilla Firefox</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="browser-ie">
|
||||
<a href="https://windows.microsoft.com/zh-cn/internet-explorer/download-ie"> IE 11 浏览器<span>Internet Explorer</span></a>
|
||||
<a href="https://windows.microsoft.com/zh-cn/internet-explorer/download-ie">
|
||||
IE 11 浏览器
|
||||
<span>Internet Explorer</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="browser-360">
|
||||
<a href="http://se.360.cn/"> 360安全浏览器<span>360 Chrome</span></a>
|
||||
<a href="http://se.360.cn/">
|
||||
360安全浏览器
|
||||
<span>360 Chrome</span>
|
||||
</a>
|
||||
</li>
|
||||
<div class="clean"></div>
|
||||
</ul>
|
||||
|
||||
10
index.html
10
index.html
@@ -6,12 +6,12 @@
|
||||
<meta name="renderer" content="webkit" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />
|
||||
<link rel="icon" href="/favicon.ico" />
|
||||
<title>RuoYi-Vue-Plus多租户管理系统</title>
|
||||
<!--[if lt IE 11
|
||||
]><script>
|
||||
<title>%VITE_APP_TITLE%</title>
|
||||
<!--[if lt IE 11]>
|
||||
<script>
|
||||
window.location.href = '/html/ie.html';
|
||||
</script><!
|
||||
[endif]-->
|
||||
</script>
|
||||
<![endif]-->
|
||||
<style>
|
||||
html,
|
||||
body,
|
||||
|
||||
140
package.json
140
package.json
@@ -1,91 +1,87 @@
|
||||
{
|
||||
"$schema": "https://json.schemastore.org/package",
|
||||
"name": "ruoyi-vue-plus",
|
||||
"version": "5.2.3",
|
||||
"description": "RuoYi-Vue-Plus多租户管理系统",
|
||||
"author": "LionLi",
|
||||
"version": "5.5.3-2.5.3",
|
||||
"description": "RuoYi-Vue-Plus后台管理系统",
|
||||
"license": "MIT",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite serve --mode development",
|
||||
"build:prod": "vite build --mode production",
|
||||
"build:dev": "vite build --mode development",
|
||||
"preview": "vite preview",
|
||||
"lint:eslint": "eslint --fix --ext .ts,.js,.vue ./src ",
|
||||
"prettier": "prettier --write ."
|
||||
},
|
||||
"author": "LionLi",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://gitee.com/JavaLionLi/plus-ui.git"
|
||||
},
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"build:dev": "vite build --mode development",
|
||||
"build:prod": "vite build --mode production",
|
||||
"dev": "vite serve --mode development",
|
||||
"fmt": "oxfmt .",
|
||||
"lint": "oxlint src",
|
||||
"lint:fix": "oxlint --fix src",
|
||||
"preview": "vite preview"
|
||||
},
|
||||
"dependencies": {
|
||||
"@element-plus/icons-vue": "2.3.1",
|
||||
"@highlightjs/vue-plugin": "2.1.0",
|
||||
"@vueup/vue-quill": "1.2.0",
|
||||
"@vueuse/core": "10.9.0",
|
||||
"@element-plus/icons-vue": "2.3.2",
|
||||
"@highlightjs/vue-plugin": "2.1.2",
|
||||
"@iconify/vue": "^5.0.0",
|
||||
"@vueuse/core": "14.2.1",
|
||||
"@wangeditor-next/editor": "5.7.0",
|
||||
"@wangeditor-next/editor-for-vue": "5.1.14",
|
||||
"animate.css": "4.1.1",
|
||||
"await-to-js": "3.0.0",
|
||||
"axios": "1.6.8",
|
||||
"bpmn-js": "16.4.0",
|
||||
"axios": "1.15.2",
|
||||
"crypto-js": "4.2.0",
|
||||
"diagram-js": "12.3.0",
|
||||
"didi": "9.0.2",
|
||||
"echarts": "5.5.0",
|
||||
"element-plus": "2.7.8",
|
||||
"file-saver": "2.0.5",
|
||||
"fuse.js": "7.0.0",
|
||||
"highlight.js": "11.9.0",
|
||||
"image-conversion": "^2.1.1",
|
||||
"js-cookie": "3.0.5",
|
||||
"jsencrypt": "3.3.2",
|
||||
"echarts": "6.0.0",
|
||||
"element-plus": "2.13.7",
|
||||
"highlight.js": "11.11.1",
|
||||
"image-conversion": "2.1.1",
|
||||
"jsencrypt": "3.5.4",
|
||||
"nprogress": "0.2.0",
|
||||
"pinia": "2.1.7",
|
||||
"screenfull": "6.0.2",
|
||||
"vue": "3.4.34",
|
||||
"vue-cropper": "1.1.1",
|
||||
"vue-i18n": "9.10.2",
|
||||
"vue-router": "4.3.2",
|
||||
"vue-types": "5.1.1",
|
||||
"vxe-table": "4.5.22"
|
||||
"pinia": "3.0.4",
|
||||
"vue": "3.5.33",
|
||||
"vue-cropper": "1.1.4",
|
||||
"vue-i18n": "11.4.0",
|
||||
"vue-json-pretty": "2.6.0",
|
||||
"vue-router": "5.0.6",
|
||||
"vue-types": "6.0.0",
|
||||
"vxe-table": "4.18.13"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@iconify/json": "2.2.201",
|
||||
"@intlify/unplugin-vue-i18n": "3.0.1",
|
||||
"@types/crypto-js": "4.2.2",
|
||||
"@types/file-saver": "2.0.7",
|
||||
"@types/js-cookie": "3.0.6",
|
||||
"@types/node": "18.18.2",
|
||||
"@types/node": "^25.6.0",
|
||||
"@types/nprogress": "0.2.3",
|
||||
"@typescript-eslint/eslint-plugin": "7.3.1",
|
||||
"@typescript-eslint/parser": "7.3.1",
|
||||
"@unocss/preset-attributify": "0.58.6",
|
||||
"@unocss/preset-icons": "0.58.6",
|
||||
"@unocss/preset-uno": "0.58.6",
|
||||
"@vitejs/plugin-vue": "5.0.4",
|
||||
"@vue/compiler-sfc": "3.4.23",
|
||||
"autoprefixer": "10.4.18",
|
||||
"eslint": "8.57.0",
|
||||
"eslint-config-prettier": "9.1.0",
|
||||
"eslint-define-config": "2.1.0",
|
||||
"eslint-plugin-prettier": "5.1.3",
|
||||
"eslint-plugin-promise": "6.1.1",
|
||||
"eslint-plugin-node": "11.1.0",
|
||||
"eslint-plugin-import": "2.29.1",
|
||||
"eslint-plugin-vue": "9.23.0",
|
||||
"fast-glob": "3.3.2",
|
||||
"postcss": "8.4.36",
|
||||
"prettier": "3.2.5",
|
||||
"sass": "1.72.0",
|
||||
"typescript": "5.4.5",
|
||||
"unocss": "0.58.6",
|
||||
"unplugin-auto-import": "0.17.5",
|
||||
"unplugin-icons": "0.18.5",
|
||||
"unplugin-vue-components": "0.26.0",
|
||||
"@unocss/preset-attributify": "66.6.8",
|
||||
"@unocss/preset-wind3": "66.6.8",
|
||||
"@vitejs/plugin-vue": "^6.0.6",
|
||||
"@vue/compiler-sfc": "3.5.33",
|
||||
"autoprefixer": "10.5.0",
|
||||
"oxfmt": "^0.46.0",
|
||||
"oxlint": "^1.61.0",
|
||||
"sass": "1.99.0",
|
||||
"typescript": "^6.0.3",
|
||||
"unocss": "66.6.8",
|
||||
"unplugin-auto-import": "21.0.0",
|
||||
"unplugin-vue-components": "32.0.0",
|
||||
"unplugin-vue-setup-extend-plus": "1.0.1",
|
||||
"vite": "5.2.12",
|
||||
"vite-plugin-compression": "0.5.1",
|
||||
"vite-plugin-svg-icons": "2.0.1",
|
||||
"vitest": "1.5.0",
|
||||
"vue-eslint-parser": "9.4.2",
|
||||
"vue-tsc": "2.0.13"
|
||||
"vite": "^8.0.10",
|
||||
"vite-plugin-svg-icons-ng": "^1.8.0",
|
||||
"vitest": "4.1.5",
|
||||
"vue-tsc": "^3.2.7"
|
||||
},
|
||||
"browserslist": [
|
||||
"Chrome >= 87",
|
||||
"Edge >= 88",
|
||||
"Safari >= 14",
|
||||
"Firefox >= 78"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=20.19.0",
|
||||
"pnpm": ">=10.0.0"
|
||||
},
|
||||
"pnpm": {
|
||||
"onlyBuiltDependencies": [
|
||||
"@parcel/watcher",
|
||||
"es5-ext",
|
||||
"esbuild"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,9 +5,9 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import useSettingsStore from '@/store/modules/settings';
|
||||
import { useAppStore } from '@/store/modules/app';
|
||||
import { useSettingsStore } from '@/store/modules/settings';
|
||||
import { handleThemeStyle } from '@/utils/theme';
|
||||
import useAppStore from '@/store/modules/app';
|
||||
|
||||
const appStore = useAppStore();
|
||||
|
||||
|
||||
@@ -1,13 +1,14 @@
|
||||
import type { DemoForm, DemoQuery, DemoVO } from '@/api/demo/demo/types';
|
||||
import type { PageResult } from '@/api/types';
|
||||
import type { AxiosPromise } from '@/utils/api-types';
|
||||
import request from '@/utils/request';
|
||||
import { AxiosPromise } from 'axios';
|
||||
import { DemoVO, DemoForm, DemoQuery } from '@/api/demo/demo/types';
|
||||
|
||||
/**
|
||||
* 查询测试单列表
|
||||
* @param query
|
||||
* @returns {*}
|
||||
*/
|
||||
export const listDemo = (query?: DemoQuery): AxiosPromise<DemoVO[]> => {
|
||||
export const listDemo = (query?: DemoQuery): AxiosPromise<PageResult<DemoVO>> => {
|
||||
return request({
|
||||
url: '/demo/demo/list',
|
||||
method: 'get',
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import type { TreeForm, TreeQuery, TreeVO } from '@/api/demo/tree/types';
|
||||
import type { AxiosPromise } from '@/utils/api-types';
|
||||
import request from '@/utils/request';
|
||||
import { AxiosPromise } from 'axios';
|
||||
import { TreeVO, TreeForm, TreeQuery } from '@/api/demo/tree/types';
|
||||
|
||||
/**
|
||||
* 查询测试树列表
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
import type { UserInfo } from '@/api/system/user/types';
|
||||
import type { AxiosPromise } from '@/utils/api-types';
|
||||
import { closePush } from '@/utils/push';
|
||||
import request from '@/utils/request';
|
||||
import { AxiosPromise } from 'axios';
|
||||
import { LoginData, LoginResult, VerifyCodeResult, TenantInfo } from './types';
|
||||
import { UserInfo } from '@/api/system/user/types';
|
||||
import type { LoginData, LoginResult, VerifyCodeResult } from './types';
|
||||
|
||||
// pc端固定客户端授权id
|
||||
const clientId = import.meta.env.VITE_APP_CLIENT_ID;
|
||||
@@ -51,10 +52,16 @@ export function register(data: any) {
|
||||
* 注销
|
||||
*/
|
||||
export function logout() {
|
||||
request({
|
||||
url: '/resource/sse/close',
|
||||
method: 'get'
|
||||
});
|
||||
closePush();
|
||||
if (
|
||||
import.meta.env.VITE_APP_MESSAGE_ENABLED === 'true' &&
|
||||
import.meta.env.VITE_APP_MESSAGE_TRANSPORT.toLowerCase() === 'sse'
|
||||
) {
|
||||
request({
|
||||
url: import.meta.env.VITE_APP_MESSAGE_PATH + '/close',
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
return request({
|
||||
url: '/auth/logout',
|
||||
method: 'post'
|
||||
@@ -98,14 +105,3 @@ export function getInfo(): AxiosPromise<UserInfo> {
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
|
||||
// 获取租户列表
|
||||
export function getTenantList(): AxiosPromise<TenantInfo> {
|
||||
return request({
|
||||
url: '/auth/tenant/list',
|
||||
headers: {
|
||||
isToken: false
|
||||
},
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import type { RouteRecordRaw } from 'vue-router';
|
||||
import type { AxiosPromise } from '@/utils/api-types';
|
||||
import request from '@/utils/request';
|
||||
import { AxiosPromise } from 'axios';
|
||||
import { RouteRecordRaw } from 'vue-router';
|
||||
|
||||
// 获取路由
|
||||
export function getRouters(): AxiosPromise<RouteRecordRaw[]> {
|
||||
|
||||
4
src/api/monitor/cache/index.ts
vendored
4
src/api/monitor/cache/index.ts
vendored
@@ -1,6 +1,6 @@
|
||||
import type { AxiosPromise } from '@/utils/api-types';
|
||||
import request from '@/utils/request';
|
||||
import { AxiosPromise } from 'axios';
|
||||
import { CacheVO } from './types';
|
||||
import type { CacheVO } from './types';
|
||||
|
||||
// 查询缓存详细
|
||||
export function getCache(): AxiosPromise<CacheVO> {
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
import type { PageResult } from '@/api/types';
|
||||
import type { AxiosPromise } from '@/utils/api-types';
|
||||
import request from '@/utils/request';
|
||||
import { LoginInfoQuery, LoginInfoVO } from './types';
|
||||
import { AxiosPromise } from 'axios';
|
||||
import type { LoginInfoQuery, LoginInfoVO } from './types';
|
||||
|
||||
// 查询登录日志列表
|
||||
export function list(query: LoginInfoQuery): AxiosPromise<LoginInfoVO[]> {
|
||||
export function list(query: LoginInfoQuery): AxiosPromise<PageResult<LoginInfoVO>> {
|
||||
return request({
|
||||
url: '/monitor/logininfor/list',
|
||||
url: '/monitor/loginInfo/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
@@ -14,7 +15,7 @@ export function list(query: LoginInfoQuery): AxiosPromise<LoginInfoVO[]> {
|
||||
// 删除登录日志
|
||||
export function delLoginInfo(infoId: string | number | Array<string | number>) {
|
||||
return request({
|
||||
url: '/monitor/logininfor/' + infoId,
|
||||
url: '/monitor/loginInfo/' + infoId,
|
||||
method: 'delete'
|
||||
});
|
||||
}
|
||||
@@ -22,7 +23,7 @@ export function delLoginInfo(infoId: string | number | Array<string | number>) {
|
||||
// 解锁用户登录状态
|
||||
export function unlockLoginInfo(userName: string | Array<string>) {
|
||||
return request({
|
||||
url: '/monitor/logininfor/unlock/' + userName,
|
||||
url: '/monitor/loginInfo/unlock/' + userName,
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
@@ -30,7 +31,7 @@ export function unlockLoginInfo(userName: string | Array<string>) {
|
||||
// 清空登录日志
|
||||
export function cleanLoginInfo() {
|
||||
return request({
|
||||
url: '/monitor/logininfor/clean',
|
||||
url: '/monitor/loginInfo/clean',
|
||||
method: 'delete'
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
import type { PageResult } from '@/api/types';
|
||||
import type { AxiosPromise } from '@/utils/api-types';
|
||||
import request from '@/utils/request';
|
||||
import { OnlineQuery, OnlineVO } from './types';
|
||||
import { AxiosPromise } from 'axios';
|
||||
import type { OnlineQuery, OnlineVO } from './types';
|
||||
|
||||
// 查询在线用户列表
|
||||
export function list(query: OnlineQuery): AxiosPromise<OnlineVO[]> {
|
||||
export function list(query: OnlineQuery): AxiosPromise<PageResult<OnlineVO>> {
|
||||
return request({
|
||||
url: '/monitor/online/list',
|
||||
method: 'get',
|
||||
@@ -30,7 +31,7 @@ export function getOnline() {
|
||||
// 删除当前在线设备
|
||||
export function delOnline(tokenId: string) {
|
||||
return request({
|
||||
url: '/monitor/online/' + tokenId,
|
||||
method: 'post'
|
||||
url: '/monitor/online/myself/' + tokenId,
|
||||
method: 'delete'
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
import type { PageResult } from '@/api/types';
|
||||
import type { AxiosPromise } from '@/utils/api-types';
|
||||
import request from '@/utils/request';
|
||||
import { OperLogQuery, OperLogVO } from './types';
|
||||
import { AxiosPromise } from 'axios';
|
||||
import type { OperLogQuery, OperLogVO } from './types';
|
||||
|
||||
// 查询操作日志列表
|
||||
export function list(query: OperLogQuery): AxiosPromise<OperLogVO[]> {
|
||||
export function list(query: OperLogQuery): AxiosPromise<PageResult<OperLogVO>> {
|
||||
return request({
|
||||
url: '/monitor/operlog/list',
|
||||
method: 'get',
|
||||
|
||||
@@ -2,6 +2,12 @@ export interface OperLogQuery extends PageQuery {
|
||||
operIp: string;
|
||||
title: string;
|
||||
operName: string;
|
||||
userId: string;
|
||||
deptId: string;
|
||||
clientKey: string;
|
||||
deviceType: string;
|
||||
browser: string;
|
||||
os: string;
|
||||
businessType: string;
|
||||
status: string;
|
||||
orderByColumn: string;
|
||||
@@ -18,7 +24,13 @@ export interface OperLogVO extends BaseEntity {
|
||||
requestMethod: string;
|
||||
operatorType: number;
|
||||
operName: string;
|
||||
userId: string | number;
|
||||
deptId: string | number;
|
||||
deptName: string;
|
||||
clientKey: string;
|
||||
deviceType: string;
|
||||
browser: string;
|
||||
os: string;
|
||||
operUrl: string;
|
||||
operIp: string;
|
||||
operLocation: string;
|
||||
@@ -40,7 +52,13 @@ export interface OperLogForm {
|
||||
requestMethod: string;
|
||||
operatorType: number;
|
||||
operName: string;
|
||||
userId: string | number | undefined;
|
||||
deptId: string | number | undefined;
|
||||
deptName: string;
|
||||
clientKey: string;
|
||||
deviceType: string;
|
||||
browser: string;
|
||||
os: string;
|
||||
operUrl: string;
|
||||
operIp: string;
|
||||
operLocation: string;
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import type { ClientForm, ClientQuery, ClientVO } from '@/api/system/client/types';
|
||||
import type { PageResult } from '@/api/types';
|
||||
import type { AxiosPromise } from '@/utils/api-types';
|
||||
import request from '@/utils/request';
|
||||
import { AxiosPromise } from 'axios';
|
||||
import { ClientVO, ClientForm, ClientQuery } from '@/api/system/client/types';
|
||||
|
||||
/**
|
||||
* 查询客户端管理列表
|
||||
@@ -8,7 +9,7 @@ import { ClientVO, ClientForm, ClientQuery } from '@/api/system/client/types';
|
||||
* @returns {*}
|
||||
*/
|
||||
|
||||
export const listClient = (query?: ClientQuery): AxiosPromise<ClientVO[]> => {
|
||||
export const listClient = (query?: ClientQuery): AxiosPromise<PageResult<ClientVO>> => {
|
||||
return request({
|
||||
url: '/system/client/list',
|
||||
method: 'get',
|
||||
|
||||
@@ -29,6 +29,26 @@ export interface ClientVO {
|
||||
*/
|
||||
deviceType: string;
|
||||
|
||||
/**
|
||||
* 允许访问路径
|
||||
*/
|
||||
accessPath?: string;
|
||||
|
||||
/**
|
||||
* 允许访问路径列表
|
||||
*/
|
||||
accessPathList?: string[];
|
||||
|
||||
/**
|
||||
* IP白名单
|
||||
*/
|
||||
ipWhitelist?: string;
|
||||
|
||||
/**
|
||||
* IP白名单列表
|
||||
*/
|
||||
ipWhitelistList?: string[];
|
||||
|
||||
/**
|
||||
* token活跃超时时间
|
||||
*/
|
||||
@@ -76,6 +96,26 @@ export interface ClientForm extends BaseEntity {
|
||||
*/
|
||||
deviceType?: string;
|
||||
|
||||
/**
|
||||
* 允许访问路径
|
||||
*/
|
||||
accessPath?: string;
|
||||
|
||||
/**
|
||||
* 允许访问路径列表
|
||||
*/
|
||||
accessPathList?: string[];
|
||||
|
||||
/**
|
||||
* IP白名单
|
||||
*/
|
||||
ipWhitelist?: string;
|
||||
|
||||
/**
|
||||
* IP白名单列表
|
||||
*/
|
||||
ipWhitelistList?: string[];
|
||||
|
||||
/**
|
||||
* token活跃超时时间
|
||||
*/
|
||||
@@ -118,6 +158,16 @@ export interface ClientQuery extends PageQuery {
|
||||
*/
|
||||
deviceType?: string;
|
||||
|
||||
/**
|
||||
* 允许访问路径
|
||||
*/
|
||||
accessPath?: string;
|
||||
|
||||
/**
|
||||
* IP白名单
|
||||
*/
|
||||
ipWhitelist?: string;
|
||||
|
||||
/**
|
||||
* token活跃超时时间
|
||||
*/
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
import type { PageResult } from '@/api/types';
|
||||
import type { AxiosPromise } from '@/utils/api-types';
|
||||
import request from '@/utils/request';
|
||||
import { ConfigForm, ConfigQuery, ConfigVO } from './types';
|
||||
import { AxiosPromise } from 'axios';
|
||||
import type { ConfigForm, ConfigQuery, ConfigVO } from './types';
|
||||
|
||||
// 查询参数列表
|
||||
export function listConfig(query: ConfigQuery): AxiosPromise<ConfigVO[]> {
|
||||
export function listConfig(query: ConfigQuery): AxiosPromise<PageResult<ConfigVO>> {
|
||||
return request({
|
||||
url: '/system/config/list',
|
||||
method: 'get',
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import type { AxiosPromise } from '@/utils/api-types';
|
||||
import request from '@/utils/request';
|
||||
import { AxiosPromise } from 'axios';
|
||||
import { DeptForm, DeptQuery, DeptVO } from './types';
|
||||
import { type DeptForm, type DeptQuery, type DeptVO } from './types';
|
||||
|
||||
// 查询部门列表
|
||||
export const listDept = (query?: DeptQuery) => {
|
||||
@@ -11,6 +11,17 @@ export const listDept = (query?: DeptQuery) => {
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 通过deptIds查询部门
|
||||
* @param deptIds
|
||||
*/
|
||||
export const optionSelect = (deptIds: (number | string)[]): AxiosPromise<DeptVO[]> => {
|
||||
return request({
|
||||
url: '/system/dept/optionselect?deptIds=' + deptIds,
|
||||
method: 'get'
|
||||
});
|
||||
};
|
||||
|
||||
// 查询部门列表(排除节点)
|
||||
export const listDeptExcludeChild = (deptId: string | number): AxiosPromise<DeptVO[]> => {
|
||||
return request({
|
||||
@@ -27,14 +38,6 @@ export const getDept = (deptId: string | number): AxiosPromise<DeptVO> => {
|
||||
});
|
||||
};
|
||||
|
||||
// 查询部门下拉树结构
|
||||
export const treeselect = (): AxiosPromise<DeptVO[]> => {
|
||||
return request({
|
||||
url: '/system/dept/treeselect',
|
||||
method: 'get'
|
||||
});
|
||||
};
|
||||
|
||||
// 新增部门
|
||||
export const addDept = (data: DeptForm) => {
|
||||
return request({
|
||||
|
||||
@@ -28,6 +28,18 @@ export interface DeptVO extends BaseEntity {
|
||||
menuId: string | number;
|
||||
}
|
||||
|
||||
/**
|
||||
* 部门类型
|
||||
*/
|
||||
export interface DeptTreeVO extends BaseEntity {
|
||||
id: number | string;
|
||||
label: string;
|
||||
parentId: number | string;
|
||||
weight: number;
|
||||
children: DeptTreeVO[];
|
||||
disabled: boolean;
|
||||
}
|
||||
|
||||
/**
|
||||
* 部门表单类型
|
||||
*/
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import type { PageResult } from '@/api/types';
|
||||
import type { AxiosPromise } from '@/utils/api-types';
|
||||
import request from '@/utils/request';
|
||||
import { AxiosPromise } from 'axios';
|
||||
import { DictDataForm, DictDataQuery, DictDataVO } from './types';
|
||||
import type { DictDataForm, DictDataQuery, DictDataVO } from './types';
|
||||
// 根据字典类型查询字典数据信息
|
||||
export function getDicts(dictType: string): AxiosPromise<DictDataVO[]> {
|
||||
return request({
|
||||
@@ -10,7 +11,7 @@ export function getDicts(dictType: string): AxiosPromise<DictDataVO[]> {
|
||||
}
|
||||
|
||||
// 查询字典数据列表
|
||||
export function listData(query: DictDataQuery): AxiosPromise<DictDataVO[]> {
|
||||
export function listData(query: DictDataQuery): AxiosPromise<PageResult<DictDataVO>> {
|
||||
return request({
|
||||
url: '/system/dict/data/list',
|
||||
method: 'get',
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
import type { PageResult } from '@/api/types';
|
||||
import type { AxiosPromise } from '@/utils/api-types';
|
||||
import request from '@/utils/request';
|
||||
import { DictTypeForm, DictTypeVO, DictTypeQuery } from './types';
|
||||
import { AxiosPromise } from 'axios';
|
||||
import type { DictTypeForm, DictTypeQuery, DictTypeVO } from './types';
|
||||
|
||||
// 查询字典类型列表
|
||||
export function listType(query: DictTypeQuery): AxiosPromise<DictTypeVO[]> {
|
||||
export function listType(query: DictTypeQuery): AxiosPromise<PageResult<DictTypeVO>> {
|
||||
return request({
|
||||
url: '/system/dict/type/list',
|
||||
method: 'get',
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import type { AxiosPromise } from '@/utils/api-types';
|
||||
import request from '@/utils/request';
|
||||
import { AxiosPromise } from 'axios';
|
||||
import { MenuQuery, MenuVO, MenuForm, MenuTreeOption, RoleMenuTree } from './types';
|
||||
import type { MenuForm, MenuQuery, MenuTreeOption, MenuVO, RoleMenuTree } from './types';
|
||||
|
||||
// 查询菜单列表
|
||||
export const listMenu = (query?: MenuQuery): AxiosPromise<MenuVO[]> => {
|
||||
@@ -35,14 +35,6 @@ export const roleMenuTreeselect = (roleId: string | number): AxiosPromise<RoleMe
|
||||
});
|
||||
};
|
||||
|
||||
// 根据角色ID查询菜单下拉树结构
|
||||
export const tenantPackageMenuTreeselect = (packageId: string | number): AxiosPromise<RoleMenuTree> => {
|
||||
return request({
|
||||
url: '/system/menu/tenantPackageMenuTreeselect/' + packageId,
|
||||
method: 'get'
|
||||
});
|
||||
};
|
||||
|
||||
// 新增菜单
|
||||
export const addMenu = (data: MenuForm) => {
|
||||
return request({
|
||||
@@ -68,3 +60,11 @@ export const delMenu = (menuId: string | number) => {
|
||||
method: 'delete'
|
||||
});
|
||||
};
|
||||
|
||||
// 级联删除菜单
|
||||
export const cascadeDelMenu = (menuIds: Array<string | number>) => {
|
||||
return request({
|
||||
url: '/system/menu/cascade/' + menuIds,
|
||||
method: 'delete'
|
||||
});
|
||||
};
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { MenuTypeEnum } from '@/enums/MenuTypeEnum';
|
||||
import type { MenuTypeEnum } from '@/enums/MenuTypeEnum';
|
||||
|
||||
/**
|
||||
* 菜单树形结构类型
|
||||
@@ -8,12 +8,28 @@ export interface MenuTreeOption {
|
||||
label: string;
|
||||
parentId: string | number;
|
||||
weight: number;
|
||||
menuType?: MenuTypeEnum | string;
|
||||
visible?: string;
|
||||
status?: string;
|
||||
disabled?: boolean;
|
||||
children?: MenuTreeOption[];
|
||||
}
|
||||
|
||||
export interface RoleMenuTree {
|
||||
menus: MenuTreeOption[];
|
||||
checkedKeys: string[];
|
||||
checkedKeys: Array<string | number>;
|
||||
}
|
||||
|
||||
/**
|
||||
* 角色菜单分配中的按钮节点类型
|
||||
*/
|
||||
export interface RoleMenuButtonOption {
|
||||
menuId: string | number;
|
||||
menuName: string;
|
||||
parentId: string | number;
|
||||
perms?: string;
|
||||
status?: string;
|
||||
disabled?: boolean;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -44,6 +60,8 @@ export interface MenuVO extends BaseEntity {
|
||||
visible: string;
|
||||
status: string;
|
||||
icon: string;
|
||||
activeMenu: string;
|
||||
ext: string;
|
||||
remark: string;
|
||||
}
|
||||
|
||||
@@ -63,6 +81,8 @@ export interface MenuForm {
|
||||
visible?: string;
|
||||
status?: string;
|
||||
icon?: string;
|
||||
activeMenu?: string;
|
||||
ext?: string;
|
||||
remark?: string;
|
||||
query?: string;
|
||||
perms?: string;
|
||||
|
||||
10
src/api/system/message/index.ts
Normal file
10
src/api/system/message/index.ts
Normal file
@@ -0,0 +1,10 @@
|
||||
import type { AxiosPromise } from '@/utils/api-types';
|
||||
import request from '@/utils/request';
|
||||
import type { MessageBoxVO } from './types';
|
||||
|
||||
export function getMessageBox(): AxiosPromise<MessageBoxVO> {
|
||||
return request({
|
||||
url: '/resource/message/box',
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
17
src/api/system/message/types.ts
Normal file
17
src/api/system/message/types.ts
Normal file
@@ -0,0 +1,17 @@
|
||||
export interface MessageVO extends BaseEntity {
|
||||
messageId: number | string;
|
||||
category: string;
|
||||
type: string;
|
||||
source: string;
|
||||
title: string;
|
||||
message: string;
|
||||
content?: string;
|
||||
data?: Record<string, any> | null;
|
||||
path?: string;
|
||||
}
|
||||
|
||||
export interface MessageBoxVO {
|
||||
systemList: MessageVO[];
|
||||
noticeList: MessageVO[];
|
||||
workflowList: MessageVO[];
|
||||
}
|
||||
@@ -1,8 +1,9 @@
|
||||
import type { PageResult } from '@/api/types';
|
||||
import type { AxiosPromise } from '@/utils/api-types';
|
||||
import request from '@/utils/request';
|
||||
import { NoticeForm, NoticeQuery, NoticeVO } from './types';
|
||||
import { AxiosPromise } from 'axios';
|
||||
import type { NoticeForm, NoticeQuery, NoticeVO } from './types';
|
||||
// 查询公告列表
|
||||
export function listNotice(query: NoticeQuery): AxiosPromise<NoticeVO[]> {
|
||||
export function listNotice(query: NoticeQuery): AxiosPromise<PageResult<NoticeVO>> {
|
||||
return request({
|
||||
url: '/system/notice/list',
|
||||
method: 'get',
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
import type { PageResult } from '@/api/types';
|
||||
import type { AxiosPromise } from '@/utils/api-types';
|
||||
import request from '@/utils/request';
|
||||
import { OssQuery, OssVO } from './types';
|
||||
import { AxiosPromise } from 'axios';
|
||||
import type { OssQuery, OssVO } from './types';
|
||||
|
||||
// 查询OSS对象存储列表
|
||||
export function listOss(query: OssQuery): AxiosPromise<OssVO[]> {
|
||||
export function listOss(query: OssQuery): AxiosPromise<PageResult<OssVO>> {
|
||||
return request({
|
||||
url: '/resource/oss/list',
|
||||
method: 'get',
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
import type { PageResult } from '@/api/types';
|
||||
import type { AxiosPromise } from '@/utils/api-types';
|
||||
import request from '@/utils/request';
|
||||
import { OssConfigForm, OssConfigQuery, OssConfigVO } from './types';
|
||||
import { AxiosPromise } from 'axios';
|
||||
import type { OssConfigForm, OssConfigQuery, OssConfigVO } from './types';
|
||||
|
||||
// 查询对象存储配置列表
|
||||
export function listOssConfig(query: OssConfigQuery): AxiosPromise<OssConfigVO[]> {
|
||||
export function listOssConfig(query: OssConfigQuery): AxiosPromise<PageResult<OssConfigVO>> {
|
||||
return request({
|
||||
url: '/resource/oss/config/list',
|
||||
method: 'get',
|
||||
|
||||
@@ -6,7 +6,7 @@ export interface OssConfigVO extends BaseEntity {
|
||||
bucketName: string;
|
||||
prefix: string;
|
||||
endpoint: string;
|
||||
domain: string;
|
||||
domainUrl: string;
|
||||
isHttps: string;
|
||||
region: string;
|
||||
status: string;
|
||||
@@ -29,7 +29,7 @@ export interface OssConfigForm {
|
||||
bucketName: string;
|
||||
prefix: string;
|
||||
endpoint: string;
|
||||
domain: string;
|
||||
domainUrl: string;
|
||||
isHttps: string;
|
||||
accessPolicy: string;
|
||||
region: string;
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
import type { PageResult } from '@/api/types';
|
||||
import type { AxiosPromise } from '@/utils/api-types';
|
||||
import request from '@/utils/request';
|
||||
import { PostForm, PostQuery, PostVO } from './types';
|
||||
import { AxiosPromise } from 'axios';
|
||||
import type { DeptTreeVO } from '../dept/types';
|
||||
import type { PostForm, PostQuery, PostVO } from './types';
|
||||
|
||||
// 查询岗位列表
|
||||
export function listPost(query: PostQuery): AxiosPromise<PostVO[]> {
|
||||
export function listPost(query: PostQuery): AxiosPromise<PageResult<PostVO>> {
|
||||
return request({
|
||||
url: '/system/post/list',
|
||||
method: 'get',
|
||||
@@ -56,3 +58,13 @@ export function delPost(postId: string | number | (string | number)[]) {
|
||||
method: 'delete'
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询部门下拉树结构
|
||||
*/
|
||||
export const deptTreeSelect = (): AxiosPromise<DeptTreeVO[]> => {
|
||||
return request({
|
||||
url: '/system/post/deptTree',
|
||||
method: 'get'
|
||||
});
|
||||
};
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
import { UserVO } from '@/api/system/user/types';
|
||||
import { UserQuery } from '@/api/system/user/types';
|
||||
import { AxiosPromise } from 'axios';
|
||||
import { RoleQuery, RoleVO, RoleDeptTree } from './types';
|
||||
import type { UserQuery, UserVO } from '@/api/system/user/types';
|
||||
import type { PageResult } from '@/api/types';
|
||||
import type { AxiosPromise } from '@/utils/api-types';
|
||||
import request from '@/utils/request';
|
||||
import type { RoleDeptTree, RoleQuery, RoleVO } from './types';
|
||||
|
||||
export const listRole = (query: RoleQuery): AxiosPromise<RoleVO[]> => {
|
||||
export const listRole = (query: RoleQuery): AxiosPromise<PageResult<RoleVO>> => {
|
||||
return request({
|
||||
url: '/system/role/list',
|
||||
method: 'get',
|
||||
@@ -45,7 +45,7 @@ export const addRole = (data: any) => {
|
||||
};
|
||||
|
||||
/**
|
||||
* 修改角色
|
||||
* 修改角色基础信息
|
||||
* @param data
|
||||
*/
|
||||
export const updateRole = (data: any) => {
|
||||
@@ -57,11 +57,11 @@ export const updateRole = (data: any) => {
|
||||
};
|
||||
|
||||
/**
|
||||
* 角色数据权限
|
||||
* 修改角色权限(菜单权限 + 数据权限)
|
||||
*/
|
||||
export const dataScope = (data: any) => {
|
||||
export const updateRolePermission = (data: any) => {
|
||||
return request({
|
||||
url: '/system/role/dataScope',
|
||||
url: '/system/role/permission',
|
||||
method: 'put',
|
||||
data: data
|
||||
});
|
||||
@@ -95,7 +95,7 @@ export const delRole = (roleId: Array<string | number> | string | number) => {
|
||||
/**
|
||||
* 查询角色已授权用户列表
|
||||
*/
|
||||
export const allocatedUserList = (query: UserQuery): AxiosPromise<UserVO[]> => {
|
||||
export const allocatedUserList = (query: UserQuery): AxiosPromise<PageResult<UserVO>> => {
|
||||
return request({
|
||||
url: '/system/role/authUser/allocatedList',
|
||||
method: 'get',
|
||||
@@ -106,7 +106,7 @@ export const allocatedUserList = (query: UserQuery): AxiosPromise<UserVO[]> => {
|
||||
/**
|
||||
* 查询角色未授权用户列表
|
||||
*/
|
||||
export const unallocatedUserList = (query: UserQuery): AxiosPromise<UserVO[]> => {
|
||||
export const unallocatedUserList = (query: UserQuery): AxiosPromise<PageResult<UserVO>> => {
|
||||
return request({
|
||||
url: '/system/role/authUser/unallocatedList',
|
||||
method: 'get',
|
||||
|
||||
@@ -1,14 +1,10 @@
|
||||
import request from '@/utils/request';
|
||||
|
||||
// 绑定账号
|
||||
export function authBinding(source: string, tenantId: string) {
|
||||
// 获取跳转URL
|
||||
export function authRouterUrl(source: string) {
|
||||
return request({
|
||||
url: '/auth/binding/' + source,
|
||||
method: 'get',
|
||||
params: {
|
||||
tenantId: tenantId,
|
||||
domain: window.location.host
|
||||
}
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -1,101 +0,0 @@
|
||||
import request from '@/utils/request';
|
||||
import { TenantForm, TenantQuery, TenantVO } from './types';
|
||||
import { AxiosPromise } from 'axios';
|
||||
|
||||
// 查询租户列表
|
||||
export function listTenant(query: TenantQuery): AxiosPromise<TenantVO[]> {
|
||||
return request({
|
||||
url: '/system/tenant/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
}
|
||||
|
||||
// 查询租户详细
|
||||
export function getTenant(id: string | number): AxiosPromise<TenantVO> {
|
||||
return request({
|
||||
url: '/system/tenant/' + id,
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
|
||||
// 新增租户
|
||||
export function addTenant(data: TenantForm) {
|
||||
return request({
|
||||
url: '/system/tenant',
|
||||
method: 'post',
|
||||
headers: {
|
||||
isEncrypt: true,
|
||||
repeatSubmit: false
|
||||
},
|
||||
data: data
|
||||
});
|
||||
}
|
||||
|
||||
// 修改租户
|
||||
export function updateTenant(data: TenantForm) {
|
||||
return request({
|
||||
url: '/system/tenant',
|
||||
method: 'put',
|
||||
data: data
|
||||
});
|
||||
}
|
||||
|
||||
// 租户状态修改
|
||||
export function changeTenantStatus(id: string | number, tenantId: string | number, status: string) {
|
||||
const data = {
|
||||
id,
|
||||
tenantId,
|
||||
status
|
||||
};
|
||||
return request({
|
||||
url: '/system/tenant/changeStatus',
|
||||
method: 'put',
|
||||
data: data
|
||||
});
|
||||
}
|
||||
|
||||
// 删除租户
|
||||
export function delTenant(id: string | number | Array<string | number>) {
|
||||
return request({
|
||||
url: '/system/tenant/' + id,
|
||||
method: 'delete'
|
||||
});
|
||||
}
|
||||
|
||||
// 动态切换租户
|
||||
export function dynamicTenant(tenantId: string | number) {
|
||||
return request({
|
||||
url: '/system/tenant/dynamic/' + tenantId,
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
|
||||
// 清除动态租户
|
||||
export function dynamicClear() {
|
||||
return request({
|
||||
url: '/system/tenant/dynamic/clear',
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
|
||||
// 同步租户套餐
|
||||
export function syncTenantPackage(tenantId: string | number, packageId: string | number) {
|
||||
const data = {
|
||||
tenantId,
|
||||
packageId
|
||||
};
|
||||
return request({
|
||||
url: '/system/tenant/syncTenantPackage',
|
||||
method: 'get',
|
||||
params: data
|
||||
});
|
||||
}
|
||||
|
||||
// 同步租户字典
|
||||
export function syncTenantDict() {
|
||||
return request({
|
||||
url: '/system/tenant/syncTenantDict',
|
||||
method: 'get',
|
||||
});
|
||||
}
|
||||
@@ -1,46 +0,0 @@
|
||||
export interface TenantVO extends BaseEntity {
|
||||
id: number | string;
|
||||
tenantId: number | string;
|
||||
username: string;
|
||||
contactUserName: string;
|
||||
contactPhone: string;
|
||||
companyName: string;
|
||||
licenseNumber: string;
|
||||
address: string;
|
||||
domain: string;
|
||||
intro: string;
|
||||
remark: string;
|
||||
packageId: string | number;
|
||||
expireTime: string;
|
||||
accountCount: number;
|
||||
status: string;
|
||||
}
|
||||
|
||||
export interface TenantQuery extends PageQuery {
|
||||
tenantId: string | number;
|
||||
|
||||
contactUserName: string;
|
||||
|
||||
contactPhone: string;
|
||||
|
||||
companyName: string;
|
||||
}
|
||||
|
||||
export interface TenantForm {
|
||||
id: number | string | undefined;
|
||||
tenantId: number | string | undefined;
|
||||
username: string;
|
||||
password: string;
|
||||
contactUserName: string;
|
||||
contactPhone: string;
|
||||
companyName: string;
|
||||
licenseNumber: string;
|
||||
domain: string;
|
||||
address: string;
|
||||
intro: string;
|
||||
remark: string;
|
||||
packageId: string | number;
|
||||
expireTime: string;
|
||||
accountCount: number;
|
||||
status: string;
|
||||
}
|
||||
@@ -1,67 +0,0 @@
|
||||
import request from '@/utils/request';
|
||||
import { TenantPkgForm, TenantPkgQuery, TenantPkgVO } from './types';
|
||||
import { AxiosPromise } from 'axios';
|
||||
|
||||
// 查询租户套餐列表
|
||||
export function listTenantPackage(query?: TenantPkgQuery): AxiosPromise<TenantPkgVO[]> {
|
||||
return request({
|
||||
url: '/system/tenant/package/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
}
|
||||
|
||||
// 查询租户套餐下拉选列表
|
||||
export function selectTenantPackage(): AxiosPromise<TenantPkgVO[]> {
|
||||
return request({
|
||||
url: '/system/tenant/package/selectList',
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
|
||||
// 查询租户套餐详细
|
||||
export function getTenantPackage(packageId: string | number): AxiosPromise<TenantPkgVO> {
|
||||
return request({
|
||||
url: '/system/tenant/package/' + packageId,
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
|
||||
// 新增租户套餐
|
||||
export function addTenantPackage(data: TenantPkgForm) {
|
||||
return request({
|
||||
url: '/system/tenant/package',
|
||||
method: 'post',
|
||||
data: data
|
||||
});
|
||||
}
|
||||
|
||||
// 修改租户套餐
|
||||
export function updateTenantPackage(data: TenantPkgForm) {
|
||||
return request({
|
||||
url: '/system/tenant/package',
|
||||
method: 'put',
|
||||
data: data
|
||||
});
|
||||
}
|
||||
|
||||
// 租户套餐状态修改
|
||||
export function changePackageStatus(packageId: number | string, status: string) {
|
||||
const data = {
|
||||
packageId,
|
||||
status
|
||||
};
|
||||
return request({
|
||||
url: '/system/tenant/package/changeStatus',
|
||||
method: 'put',
|
||||
data: data
|
||||
});
|
||||
}
|
||||
|
||||
// 删除租户套餐
|
||||
export function delTenantPackage(packageId: string | number | Array<string | number>) {
|
||||
return request({
|
||||
url: '/system/tenant/package/' + packageId,
|
||||
method: 'delete'
|
||||
});
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
export interface TenantPkgVO extends BaseEntity {
|
||||
packageId: string | number;
|
||||
packageName: string;
|
||||
menuIds: string;
|
||||
remark: string;
|
||||
menuCheckStrictly: boolean;
|
||||
status: string;
|
||||
}
|
||||
|
||||
export interface TenantPkgQuery extends PageQuery {
|
||||
packageName: string;
|
||||
}
|
||||
|
||||
export interface TenantPkgForm {
|
||||
packageId: string | number | undefined;
|
||||
packageName: string;
|
||||
menuIds: string;
|
||||
remark: string;
|
||||
menuCheckStrictly: boolean;
|
||||
}
|
||||
@@ -1,15 +1,16 @@
|
||||
import { DeptVO } from './../dept/types';
|
||||
import { RoleVO } from '@/api/system/role/types';
|
||||
import type { RoleVO } from '@/api/system/role/types';
|
||||
import type { PageResult } from '@/api/types';
|
||||
import type { AxiosPromise } from '@/utils/api-types';
|
||||
import request from '@/utils/request';
|
||||
import { AxiosPromise } from 'axios';
|
||||
import { UserForm, UserQuery, UserVO, UserInfoVO } from './types';
|
||||
import { parseStrEmpty } from '@/utils/ruoyi';
|
||||
import type { DeptTreeVO } from './../dept/types';
|
||||
import type { UserForm, UserInfoVO, UserQuery, UserVO } from './types';
|
||||
|
||||
/**
|
||||
* 查询用户列表
|
||||
* @param query
|
||||
*/
|
||||
export const listUser = (query: UserQuery): AxiosPromise<UserVO[]> => {
|
||||
export const listUser = (query: UserQuery): AxiosPromise<PageResult<UserVO>> => {
|
||||
return request({
|
||||
url: '/system/user/list',
|
||||
method: 'get',
|
||||
@@ -110,6 +111,17 @@ export const changeUserStatus = (userId: number | string, status: string) => {
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 解锁用户
|
||||
* @param userId 用户ID
|
||||
*/
|
||||
export const unlockUser = (userId: number | string) => {
|
||||
return request({
|
||||
url: '/system/user/unlock/' + userId,
|
||||
method: 'get'
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 查询用户个人信息
|
||||
*/
|
||||
@@ -202,7 +214,7 @@ export const listUserByDeptId = (deptId: string | number): AxiosPromise<UserVO[]
|
||||
/**
|
||||
* 查询部门下拉树结构
|
||||
*/
|
||||
export const deptTreeSelect = (): AxiosPromise<DeptVO[]> => {
|
||||
export const deptTreeSelect = (): AxiosPromise<DeptTreeVO[]> => {
|
||||
return request({
|
||||
url: '/system/user/deptTree',
|
||||
method: 'get'
|
||||
@@ -218,6 +230,7 @@ export default {
|
||||
delUser,
|
||||
resetUserPwd,
|
||||
changeUserStatus,
|
||||
unlockUser,
|
||||
getUserProfile,
|
||||
updateUserProfile,
|
||||
updateUserPwd,
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { RoleVO } from '@/api/system/role/types';
|
||||
import { PostVO } from '@/api/system/post/types';
|
||||
import type { PostVO } from '@/api/system/post/types';
|
||||
import type { RoleVO } from '@/api/system/role/types';
|
||||
|
||||
/**
|
||||
* 用户信息
|
||||
@@ -15,10 +15,12 @@ export interface UserInfo {
|
||||
*/
|
||||
export interface UserQuery extends PageQuery {
|
||||
userName?: string;
|
||||
phonenumber?: string;
|
||||
nickName?: string;
|
||||
phoneNumber?: string;
|
||||
status?: string;
|
||||
deptId?: string | number;
|
||||
roleId?: string | number;
|
||||
userIds?: string | number | (string | number)[] | undefined;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -32,8 +34,8 @@ export interface UserVO extends BaseEntity {
|
||||
nickName: string;
|
||||
userType: string;
|
||||
email: string;
|
||||
phonenumber: string;
|
||||
sex: string;
|
||||
phoneNumber: string;
|
||||
gender: string;
|
||||
avatar: string;
|
||||
status: string;
|
||||
delFlag: string;
|
||||
@@ -41,6 +43,8 @@ export interface UserVO extends BaseEntity {
|
||||
loginDate: string;
|
||||
remark: string;
|
||||
deptName: string;
|
||||
/** 详情接口可能返回嵌套部门 */
|
||||
dept?: { deptName?: string };
|
||||
roles: RoleVO[];
|
||||
roleIds: any;
|
||||
postIds: any;
|
||||
@@ -58,9 +62,9 @@ export interface UserForm {
|
||||
userName: string;
|
||||
nickName?: string;
|
||||
password: string;
|
||||
phonenumber?: string;
|
||||
phoneNumber?: string;
|
||||
email?: string;
|
||||
sex?: string;
|
||||
gender?: string;
|
||||
status: string;
|
||||
remark?: string;
|
||||
postIds: string[];
|
||||
|
||||
@@ -1,9 +1,12 @@
|
||||
import type { PageResult } from '@/api/types';
|
||||
import type { AxiosPromise } from '@/utils/api-types';
|
||||
import request from '@/utils/request';
|
||||
import { DbTableQuery, DbTableVO, TableQuery, TableVO, GenTableVO, DbTableForm } from './types';
|
||||
import { AxiosPromise } from 'axios';
|
||||
import type { DbTableForm, DbTableQuery, DbTableVO, GenTableDetailPayload, TableQuery, TableVO } from './types';
|
||||
|
||||
export type { GenTableDetailPayload } from './types';
|
||||
|
||||
// 查询生成表数据
|
||||
export const listTable = (query: TableQuery): AxiosPromise<TableVO[]> => {
|
||||
export const listTable = (query: TableQuery): AxiosPromise<PageResult<TableVO>> => {
|
||||
return request({
|
||||
url: '/tool/gen/list',
|
||||
method: 'get',
|
||||
@@ -11,7 +14,7 @@ export const listTable = (query: TableQuery): AxiosPromise<TableVO[]> => {
|
||||
});
|
||||
};
|
||||
// 查询db数据库列表
|
||||
export const listDbTable = (query: DbTableQuery): AxiosPromise<DbTableVO[]> => {
|
||||
export const listDbTable = (query: DbTableQuery): AxiosPromise<PageResult<DbTableVO>> => {
|
||||
return request({
|
||||
url: '/tool/gen/db/list',
|
||||
method: 'get',
|
||||
@@ -20,7 +23,7 @@ export const listDbTable = (query: DbTableQuery): AxiosPromise<DbTableVO[]> => {
|
||||
};
|
||||
|
||||
// 查询表详细信息
|
||||
export const getGenTable = (tableId: string | number): AxiosPromise<GenTableVO> => {
|
||||
export const getGenTable = (tableId: string | number): AxiosPromise<GenTableDetailPayload> => {
|
||||
return request({
|
||||
url: '/tool/gen/' + tableId,
|
||||
method: 'get'
|
||||
@@ -28,7 +31,7 @@ export const getGenTable = (tableId: string | number): AxiosPromise<GenTableVO>
|
||||
};
|
||||
|
||||
// 修改代码生成信息
|
||||
export const updateGenTable = (data: DbTableForm): AxiosPromise<GenTableVO> => {
|
||||
export const updateGenTable = (data: DbTableForm): AxiosPromise<unknown> => {
|
||||
return request({
|
||||
url: '/tool/gen',
|
||||
method: 'put',
|
||||
@@ -37,7 +40,7 @@ export const updateGenTable = (data: DbTableForm): AxiosPromise<GenTableVO> => {
|
||||
};
|
||||
|
||||
// 导入表
|
||||
export const importTable = (data: { tables: string; dataName: string }): AxiosPromise<GenTableVO> => {
|
||||
export const importTable = (data: { tables: string; dataName: string }): AxiosPromise<unknown> => {
|
||||
return request({
|
||||
url: '/tool/gen/importTable',
|
||||
method: 'post',
|
||||
|
||||
@@ -4,8 +4,6 @@ export interface TableVO extends BaseEntity {
|
||||
dataName: string;
|
||||
tableName: string;
|
||||
tableComment: string;
|
||||
subTableName?: any;
|
||||
subTableFkName?: any;
|
||||
className: string;
|
||||
tplCategory: string;
|
||||
packageName: string;
|
||||
@@ -25,6 +23,16 @@ export interface TableVO extends BaseEntity {
|
||||
menuIds?: any;
|
||||
parentMenuId?: any;
|
||||
parentMenuName?: any;
|
||||
enableExport?: boolean;
|
||||
enableStatus?: boolean;
|
||||
statusField?: string;
|
||||
enableUnique?: boolean;
|
||||
uniqueFields?: string[];
|
||||
enableSort?: boolean;
|
||||
sortField?: string;
|
||||
treeRootValue?: string;
|
||||
treeAncestorsField?: string;
|
||||
treeOrderField?: string;
|
||||
tree: boolean;
|
||||
crud: boolean;
|
||||
}
|
||||
@@ -72,8 +80,6 @@ export interface DbTableVO {
|
||||
tableId?: any;
|
||||
tableName: string;
|
||||
tableComment: string;
|
||||
subTableName?: any;
|
||||
subTableFkName?: any;
|
||||
className?: any;
|
||||
tplCategory?: any;
|
||||
packageName?: any;
|
||||
@@ -93,6 +99,16 @@ export interface DbTableVO {
|
||||
menuIds?: any;
|
||||
parentMenuId?: any;
|
||||
parentMenuName?: any;
|
||||
enableExport?: boolean;
|
||||
enableStatus?: boolean;
|
||||
statusField?: string;
|
||||
enableUnique?: boolean;
|
||||
uniqueFields?: string[];
|
||||
enableSort?: boolean;
|
||||
sortField?: string;
|
||||
treeRootValue?: string;
|
||||
treeAncestorsField?: string;
|
||||
treeOrderField?: string;
|
||||
tree: boolean;
|
||||
crud: boolean;
|
||||
}
|
||||
@@ -103,10 +119,14 @@ export interface DbTableQuery extends PageQuery {
|
||||
tableComment: string;
|
||||
}
|
||||
|
||||
export interface GenTableVO {
|
||||
/**
|
||||
* 代码生成表详情接口 data 结构
|
||||
* - info:当前表 GenTable
|
||||
* - rows:字段列表 GenTableColumn[]
|
||||
*/
|
||||
export interface GenTableDetailPayload {
|
||||
info: DbTableVO;
|
||||
rows: DbColumnVO[];
|
||||
tables: DbTableVO[];
|
||||
}
|
||||
|
||||
export interface DbColumnForm extends BaseEntity {
|
||||
@@ -146,6 +166,16 @@ export interface DbParamForm {
|
||||
treeName?: any;
|
||||
treeParentCode?: any;
|
||||
parentMenuId: string;
|
||||
enableExport?: boolean;
|
||||
enableStatus?: boolean;
|
||||
statusField?: string;
|
||||
enableUnique?: boolean;
|
||||
uniqueFields?: string[];
|
||||
enableSort?: boolean;
|
||||
sortField?: string;
|
||||
treeRootValue?: string;
|
||||
treeAncestorsField?: string;
|
||||
treeOrderField?: string;
|
||||
}
|
||||
|
||||
export interface DbTableForm extends BaseEntity {
|
||||
@@ -153,8 +183,6 @@ export interface DbTableForm extends BaseEntity {
|
||||
tableId: string | string;
|
||||
tableName: string;
|
||||
tableComment: string;
|
||||
subTableName?: any;
|
||||
subTableFkName?: any;
|
||||
className: string;
|
||||
tplCategory: string;
|
||||
packageName: string;
|
||||
@@ -174,6 +202,16 @@ export interface DbTableForm extends BaseEntity {
|
||||
menuIds?: any;
|
||||
parentMenuId: string;
|
||||
parentMenuName?: any;
|
||||
enableExport?: boolean;
|
||||
enableStatus?: boolean;
|
||||
statusField?: string;
|
||||
enableUnique?: boolean;
|
||||
uniqueFields?: string[];
|
||||
enableSort?: boolean;
|
||||
sortField?: string;
|
||||
treeRootValue?: string;
|
||||
treeAncestorsField?: string;
|
||||
treeOrderField?: string;
|
||||
tree: boolean;
|
||||
crud: boolean;
|
||||
params: DbParamForm;
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
* 注册
|
||||
*/
|
||||
export type RegisterForm = {
|
||||
tenantId: string;
|
||||
username: string;
|
||||
password: string;
|
||||
confirmPassword?: string;
|
||||
@@ -15,7 +14,6 @@ export type RegisterForm = {
|
||||
* 登录请求
|
||||
*/
|
||||
export interface LoginData {
|
||||
tenantId?: string;
|
||||
username?: string;
|
||||
password?: string;
|
||||
rememberMe?: boolean;
|
||||
@@ -45,15 +43,9 @@ export interface VerifyCodeResult {
|
||||
}
|
||||
|
||||
/**
|
||||
* 租户
|
||||
* 分页返回结果
|
||||
*/
|
||||
export interface TenantVO {
|
||||
companyName: string;
|
||||
domain: any;
|
||||
tenantId: string;
|
||||
}
|
||||
|
||||
export interface TenantInfo {
|
||||
tenantEnabled: boolean;
|
||||
voList: TenantVO[];
|
||||
export interface PageResult<T = any> {
|
||||
total: number;
|
||||
rows: T[];
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import type { CategoryForm, CategoryQuery, CategoryTreeVO, CategoryVO } from '@/api/workflow/category/types';
|
||||
import type { AxiosPromise } from '@/utils/api-types';
|
||||
import request from '@/utils/request';
|
||||
import { AxiosPromise } from 'axios';
|
||||
import { CategoryVO, CategoryForm, CategoryQuery } from '@/api/workflow/category/types';
|
||||
|
||||
/**
|
||||
* 查询流程分类列表
|
||||
@@ -18,11 +18,11 @@ export const listCategory = (query?: CategoryQuery): AxiosPromise<CategoryVO[]>
|
||||
|
||||
/**
|
||||
* 查询流程分类详细
|
||||
* @param id
|
||||
* @param categoryId
|
||||
*/
|
||||
export const getCategory = (id: string | number): AxiosPromise<CategoryVO> => {
|
||||
export const getCategory = (categoryId: string | number): AxiosPromise<CategoryVO> => {
|
||||
return request({
|
||||
url: '/workflow/category/' + id,
|
||||
url: '/workflow/category/' + categoryId,
|
||||
method: 'get'
|
||||
});
|
||||
};
|
||||
@@ -53,11 +53,24 @@ export const updateCategory = (data: CategoryForm) => {
|
||||
|
||||
/**
|
||||
* 删除流程分类
|
||||
* @param id
|
||||
* @param categoryId
|
||||
*/
|
||||
export const delCategory = (id: string | number | Array<string | number>) => {
|
||||
export const delCategory = (categoryId: string | number | Array<string | number>) => {
|
||||
return request({
|
||||
url: '/workflow/category/' + id,
|
||||
url: '/workflow/category/' + categoryId,
|
||||
method: 'delete'
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 获取流程分类树列表
|
||||
* @param query 流程实例id
|
||||
* @returns
|
||||
*/
|
||||
export const categoryTree = (query?: CategoryForm): AxiosPromise<CategoryTreeVO[]> => {
|
||||
return request({
|
||||
url: `/workflow/category/categoryTree`,
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
};
|
||||
|
||||
@@ -1,18 +1,15 @@
|
||||
export interface CategoryTreeVO {
|
||||
id: number | string;
|
||||
label: string;
|
||||
parentId: number | string;
|
||||
weight: number;
|
||||
children: CategoryTreeVO[];
|
||||
}
|
||||
export interface CategoryVO {
|
||||
/**
|
||||
* 主键
|
||||
* 流程分类ID
|
||||
*/
|
||||
id: string;
|
||||
|
||||
/**
|
||||
* 分类名称
|
||||
*/
|
||||
categoryName: string;
|
||||
|
||||
/**
|
||||
* 分类编码
|
||||
*/
|
||||
categoryCode: string;
|
||||
categoryId: string | number;
|
||||
|
||||
/**
|
||||
* 父级id
|
||||
@@ -20,48 +17,51 @@ export interface CategoryVO {
|
||||
parentId: string | number;
|
||||
|
||||
/**
|
||||
* 排序
|
||||
* 流程分类名称
|
||||
*/
|
||||
sortNum: number;
|
||||
categoryName: string;
|
||||
|
||||
children?: CategoryVO[];
|
||||
/**
|
||||
* 显示顺序
|
||||
*/
|
||||
orderNum: number;
|
||||
|
||||
/**
|
||||
* 创建时间
|
||||
*/
|
||||
createTime: string;
|
||||
|
||||
/**
|
||||
* 子对象
|
||||
*/
|
||||
children: CategoryVO[];
|
||||
}
|
||||
|
||||
export interface CategoryForm extends BaseEntity {
|
||||
/**
|
||||
* 主键
|
||||
* 流程分类ID
|
||||
*/
|
||||
id?: string | number;
|
||||
categoryId?: string | number;
|
||||
|
||||
/**
|
||||
* 分类名称
|
||||
* 流程分类名称
|
||||
*/
|
||||
categoryName?: string;
|
||||
|
||||
/**
|
||||
* 分类编码
|
||||
*/
|
||||
categoryCode?: string;
|
||||
|
||||
/**
|
||||
* 父级id
|
||||
* 父流程分类id
|
||||
*/
|
||||
parentId?: string | number;
|
||||
|
||||
/**
|
||||
* 排序
|
||||
* 显示顺序
|
||||
*/
|
||||
sortNum?: number;
|
||||
orderNum?: number;
|
||||
}
|
||||
|
||||
export interface CategoryQuery extends PageQuery {
|
||||
export interface CategoryQuery {
|
||||
/**
|
||||
* 分类名称
|
||||
* 流程分类名称
|
||||
*/
|
||||
categoryName?: string;
|
||||
|
||||
/**
|
||||
* 分类编码
|
||||
*/
|
||||
categoryCode?: string;
|
||||
}
|
||||
|
||||
176
src/api/workflow/definition/index.ts
Normal file
176
src/api/workflow/definition/index.ts
Normal file
@@ -0,0 +1,176 @@
|
||||
import type { PageResult } from '@/api/types';
|
||||
import type {
|
||||
definitionXmlVO,
|
||||
FlowDefinitionForm,
|
||||
FlowDefinitionQuery,
|
||||
FlowDefinitionVo
|
||||
} from '@/api/workflow/definition/types';
|
||||
import type { AxiosPromise } from '@/utils/api-types';
|
||||
import request from '@/utils/request';
|
||||
|
||||
/**
|
||||
* 获取流程定义列表
|
||||
* @param query 流程实例id
|
||||
* @returns
|
||||
*/
|
||||
export const listDefinition = (query: FlowDefinitionQuery): AxiosPromise<PageResult<FlowDefinitionVo>> => {
|
||||
return request({
|
||||
url: `/workflow/definition/list`,
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 查询未发布的流程定义列表
|
||||
* @param query 流程实例id
|
||||
* @returns
|
||||
*/
|
||||
export const unPublishList = (query: FlowDefinitionQuery): AxiosPromise<PageResult<FlowDefinitionVo>> => {
|
||||
return request({
|
||||
url: `/workflow/definition/unPublishList`,
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 通过流程定义id获取xml
|
||||
* @param definitionId 流程定义id
|
||||
* @returns
|
||||
*/
|
||||
export const definitionXml = (definitionId: string): AxiosPromise<definitionXmlVO> => {
|
||||
return request({
|
||||
url: `/workflow/definition/definitionXml/${definitionId}`,
|
||||
method: 'get'
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 删除流程定义
|
||||
* @param id 流程定义id
|
||||
* @returns
|
||||
*/
|
||||
export const deleteDefinition = (id: string | string[]) => {
|
||||
return request({
|
||||
url: `/workflow/definition/${id}`,
|
||||
method: 'delete'
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 挂起/激活
|
||||
* @param definitionId 流程定义id
|
||||
* @param activityStatus 状态
|
||||
* @returns
|
||||
*/
|
||||
export const active = (definitionId: string, activityStatus: boolean) => {
|
||||
return request({
|
||||
url: `/workflow/definition/active/${definitionId}`,
|
||||
method: 'put',
|
||||
params: {
|
||||
active: activityStatus
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 通过zip或xml部署流程定义
|
||||
* @returns
|
||||
*/
|
||||
export function importDef(data: any) {
|
||||
return request({
|
||||
url: '/workflow/definition/importDef',
|
||||
method: 'post',
|
||||
data: data,
|
||||
headers: {
|
||||
repeatSubmit: false
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 发布流程定义
|
||||
* @param id 流程定义id
|
||||
* @returns
|
||||
*/
|
||||
export const publish = (id: string) => {
|
||||
return request({
|
||||
url: `/workflow/definition/publish/${id}`,
|
||||
method: 'put'
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 取消发布流程定义
|
||||
* @param id 流程定义id
|
||||
* @returns
|
||||
*/
|
||||
export const unPublish = (id: string) => {
|
||||
return request({
|
||||
url: `/workflow/definition/unPublish/${id}`,
|
||||
method: 'put'
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 获取流程定义xml字符串
|
||||
* @param id 流程定义id
|
||||
* @returns
|
||||
*/
|
||||
export const xmlString = (id: string) => {
|
||||
return request({
|
||||
url: `/workflow/definition/xmlString/${id}`,
|
||||
method: 'get'
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 新增
|
||||
* @param data 参数
|
||||
* @returns
|
||||
*/
|
||||
export const add = (data: FlowDefinitionForm) => {
|
||||
return request({
|
||||
url: `/workflow/definition`,
|
||||
method: 'post',
|
||||
data: data
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 修改
|
||||
* @param data 参数
|
||||
* @returns
|
||||
*/
|
||||
export const edit = (data: FlowDefinitionForm) => {
|
||||
return request({
|
||||
url: `/workflow/definition`,
|
||||
method: 'put',
|
||||
data: data
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 查询详情
|
||||
* @param id 参数
|
||||
* @returns
|
||||
*/
|
||||
export const getInfo = (id: number | string) => {
|
||||
return request({
|
||||
url: `/workflow/definition/${id}`,
|
||||
method: 'get'
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 复制流程定义
|
||||
* @param id 流程定义id
|
||||
* @returns
|
||||
*/
|
||||
export const copy = (id: string) => {
|
||||
return request({
|
||||
url: `/workflow/definition/copy/${id}`,
|
||||
method: 'post'
|
||||
});
|
||||
};
|
||||
34
src/api/workflow/definition/types.ts
Normal file
34
src/api/workflow/definition/types.ts
Normal file
@@ -0,0 +1,34 @@
|
||||
export interface FlowDefinitionQuery extends PageQuery {
|
||||
flowCode?: string;
|
||||
flowName?: string;
|
||||
category: string | number;
|
||||
isPublish?: number;
|
||||
}
|
||||
|
||||
export interface FlowDefinitionVo {
|
||||
id: string;
|
||||
flowName: string;
|
||||
flowCode: string;
|
||||
formPath: string;
|
||||
version: string;
|
||||
isPublish: number;
|
||||
activityStatus: number;
|
||||
createTime: Date;
|
||||
updateTime: Date;
|
||||
}
|
||||
|
||||
export interface FlowDefinitionForm {
|
||||
id: string;
|
||||
flowName: string;
|
||||
flowCode: string;
|
||||
category: string;
|
||||
ext: string;
|
||||
formPath: string;
|
||||
formCustom: string;
|
||||
modelValue: string;
|
||||
}
|
||||
|
||||
export interface definitionXmlVO {
|
||||
xml: string[];
|
||||
xmlStr: string;
|
||||
}
|
||||
@@ -1,49 +0,0 @@
|
||||
import request from '@/utils/request';
|
||||
import { AxiosPromise } from 'axios';
|
||||
import { DefinitionConfigVO, DefinitionConfigForm } from '@/api/workflow/definitionConfig/types';
|
||||
|
||||
/**
|
||||
* 查询表单配置详细
|
||||
* @param definitionId
|
||||
*/
|
||||
export const getByDefId = (definitionId: string | number): AxiosPromise<DefinitionConfigVO> => {
|
||||
return request({
|
||||
url: '/workflow/definitionConfig/getByDefId/' + definitionId,
|
||||
method: 'get'
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 新增表单配置
|
||||
* @param data
|
||||
*/
|
||||
export const saveOrUpdate = (data: DefinitionConfigForm) => {
|
||||
return request({
|
||||
url: '/workflow/definitionConfig/saveOrUpdate',
|
||||
method: 'post',
|
||||
data: data
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 删除表单配置
|
||||
* @param id
|
||||
*/
|
||||
export const deldefinitionConfig = (id: string | number | Array<string | number>) => {
|
||||
return request({
|
||||
url: '/workflow/definitionConfig/' + id,
|
||||
method: 'delete'
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 查询流程定义配置排除当前查询的流程定义
|
||||
* @param tableName
|
||||
* @param definitionId
|
||||
*/
|
||||
export const getByTableNameNotDefId = (tableName: string, definitionId: string | number) => {
|
||||
return request({
|
||||
url: `/workflow/definitionConfig/getByTableNameNotDefId/${tableName}/${definitionId}`,
|
||||
method: 'get'
|
||||
});
|
||||
};
|
||||
@@ -1,102 +0,0 @@
|
||||
import { FormManageVO } from '@/api/workflow/formManage/types';
|
||||
|
||||
export interface DefinitionConfigVO {
|
||||
/**
|
||||
* 主键
|
||||
*/
|
||||
id: string | number;
|
||||
|
||||
/**
|
||||
* 表名
|
||||
*/
|
||||
tableName?: string;
|
||||
|
||||
/**
|
||||
* 流程定义ID
|
||||
*/
|
||||
definitionId: string | number;
|
||||
|
||||
/**
|
||||
* 流程KEY
|
||||
*/
|
||||
processKey: string;
|
||||
|
||||
/**
|
||||
* 流程版本
|
||||
*/
|
||||
version?: string | number;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
remark: string;
|
||||
|
||||
/**
|
||||
* 表单管理
|
||||
*/
|
||||
wfFormManageVo: FormManageVO;
|
||||
}
|
||||
|
||||
export interface DefinitionConfigForm extends BaseEntity {
|
||||
/**
|
||||
* 主键
|
||||
*/
|
||||
id?: string | number;
|
||||
|
||||
/**
|
||||
* 表名
|
||||
*/
|
||||
tableName?: string;
|
||||
|
||||
/**
|
||||
* 流程定义ID
|
||||
*/
|
||||
definitionId?: string | number;
|
||||
|
||||
/**
|
||||
* 流程KEY
|
||||
*/
|
||||
processKey?: string;
|
||||
|
||||
/**
|
||||
* 流程版本
|
||||
*/
|
||||
version?: string | number;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
remark?: string;
|
||||
|
||||
/**
|
||||
* 表单管理
|
||||
*/
|
||||
wfFormManageVo?: FormManageVO;
|
||||
}
|
||||
|
||||
export interface DefinitionConfigQuery extends PageQuery {
|
||||
/**
|
||||
* 表名
|
||||
*/
|
||||
tableName?: string;
|
||||
|
||||
/**
|
||||
* 流程定义ID
|
||||
*/
|
||||
definitionId?: string | number;
|
||||
|
||||
/**
|
||||
* 流程KEY
|
||||
*/
|
||||
processKey?: string;
|
||||
|
||||
/**
|
||||
* 流程版本
|
||||
*/
|
||||
version?: string | number;
|
||||
|
||||
/**
|
||||
* 表单管理
|
||||
*/
|
||||
wfFormManageVo: FormManageVO;
|
||||
}
|
||||
@@ -1,76 +0,0 @@
|
||||
import request from '@/utils/request';
|
||||
import { AxiosPromise } from 'axios';
|
||||
import { FormManageVO, FormManageForm, FormManageQuery } from '@/api/workflow/formManage/types';
|
||||
|
||||
/**
|
||||
* 查询表单管理列表
|
||||
* @param query
|
||||
* @returns {*}
|
||||
*/
|
||||
|
||||
export const listFormManage = (query?: FormManageQuery): AxiosPromise<FormManageVO[]> => {
|
||||
return request({
|
||||
url: '/workflow/formManage/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 查询表单管理列表
|
||||
* @param query
|
||||
* @returns {*}
|
||||
*/
|
||||
|
||||
export const selectListFormManage = (): AxiosPromise<FormManageVO[]> => {
|
||||
return request({
|
||||
url: '/workflow/formManage/list/selectList',
|
||||
method: 'get'
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 查询表单管理详细
|
||||
* @param id
|
||||
*/
|
||||
export const getFormManage = (id: string | number): AxiosPromise<FormManageVO> => {
|
||||
return request({
|
||||
url: '/workflow/formManage/' + id,
|
||||
method: 'get'
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 新增表单管理
|
||||
* @param data
|
||||
*/
|
||||
export const addFormManage = (data: FormManageForm) => {
|
||||
return request({
|
||||
url: '/workflow/formManage',
|
||||
method: 'post',
|
||||
data: data
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 修改表单管理
|
||||
* @param data
|
||||
*/
|
||||
export const updateFormManage = (data: FormManageForm) => {
|
||||
return request({
|
||||
url: '/workflow/formManage',
|
||||
method: 'put',
|
||||
data: data
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 删除表单管理
|
||||
* @param id
|
||||
*/
|
||||
export const delFormManage = (id: string | number | Array<string | number>) => {
|
||||
return request({
|
||||
url: '/workflow/formManage/' + id,
|
||||
method: 'delete'
|
||||
});
|
||||
};
|
||||
@@ -1,69 +0,0 @@
|
||||
export interface FormManageVO {
|
||||
/**
|
||||
* 主键
|
||||
*/
|
||||
id: string | number;
|
||||
|
||||
/**
|
||||
* 表单名称
|
||||
*/
|
||||
formName: string;
|
||||
|
||||
/**
|
||||
* 表单类型
|
||||
*/
|
||||
formType: string;
|
||||
/**
|
||||
* 表单类型名称
|
||||
*/
|
||||
formTypeName: string;
|
||||
|
||||
/**
|
||||
* 路由地址/表单ID
|
||||
*/
|
||||
router: string;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
remark: string;
|
||||
}
|
||||
|
||||
export interface FormManageForm extends BaseEntity {
|
||||
/**
|
||||
* 主键
|
||||
*/
|
||||
id?: string | number;
|
||||
|
||||
/**
|
||||
* 表单名称
|
||||
*/
|
||||
formName?: string;
|
||||
|
||||
/**
|
||||
* 表单类型
|
||||
*/
|
||||
formType?: string;
|
||||
|
||||
/**
|
||||
* 路由地址/表单ID
|
||||
*/
|
||||
router?: string;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
remark?: string;
|
||||
}
|
||||
|
||||
export interface FormManageQuery extends PageQuery {
|
||||
/**
|
||||
* 表单名称
|
||||
*/
|
||||
formName?: string;
|
||||
|
||||
/**
|
||||
* 表单类型
|
||||
*/
|
||||
formType?: string;
|
||||
}
|
||||
126
src/api/workflow/instance/index.ts
Normal file
126
src/api/workflow/instance/index.ts
Normal file
@@ -0,0 +1,126 @@
|
||||
import type { PageResult } from '@/api/types';
|
||||
import type { FlowInstanceQuery, FlowInstanceVO } from '@/api/workflow/instance/types';
|
||||
import type { AxiosPromise } from '@/utils/api-types';
|
||||
import request from '@/utils/request';
|
||||
|
||||
/**
|
||||
* 查询运行中实例列表
|
||||
* @param query
|
||||
* @returns {*}
|
||||
*/
|
||||
export const pageByRunning = (query: FlowInstanceQuery): AxiosPromise<PageResult<FlowInstanceVO>> => {
|
||||
return request({
|
||||
url: '/workflow/instance/pageByRunning',
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 查询已完成实例列表
|
||||
* @param query
|
||||
* @returns {*}
|
||||
*/
|
||||
export const pageByFinish = (query: FlowInstanceQuery): AxiosPromise<PageResult<FlowInstanceVO>> => {
|
||||
return request({
|
||||
url: '/workflow/instance/pageByFinish',
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 通过业务id获取历史流程图
|
||||
*/
|
||||
export const flowHisTaskList = (businessId: string | number) => {
|
||||
return request({
|
||||
url: `/workflow/instance/flowHisTaskList/${businessId}?t=${Math.random()}`,
|
||||
method: 'get'
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 分页查询当前登录人单据
|
||||
* @param query
|
||||
* @returns {*}
|
||||
*/
|
||||
export const pageByCurrent = (query: FlowInstanceQuery): AxiosPromise<PageResult<FlowInstanceVO>> => {
|
||||
return request({
|
||||
url: '/workflow/instance/pageByCurrent',
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 撤销流程
|
||||
* @param data 参数
|
||||
* @returns
|
||||
*/
|
||||
export const cancelProcessApply = (data: any) => {
|
||||
return request({
|
||||
url: `/workflow/instance/cancelProcessApply`,
|
||||
method: 'put',
|
||||
data: data
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 获取流程变量
|
||||
* @param instanceId 实例id
|
||||
* @returns
|
||||
*/
|
||||
export const instanceVariable = (instanceId: string | number) => {
|
||||
return request({
|
||||
url: `/workflow/instance/instanceVariable/${instanceId}`,
|
||||
method: 'get'
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 删除
|
||||
* @param instanceIds 流程实例id
|
||||
* @returns
|
||||
*/
|
||||
export const deleteByInstanceIds = (instanceIds: Array<string | number> | string | number) => {
|
||||
return request({
|
||||
url: `/workflow/instance/deleteByInstanceIds/${instanceIds}`,
|
||||
method: 'delete'
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 删除历史流程实例
|
||||
* @param instanceIds
|
||||
*/
|
||||
export const deleteHisByInstanceIds = (instanceIds: Array<string | number> | string | number) => {
|
||||
return request({
|
||||
url: `/workflow/instance/deleteHisByInstanceIds/${instanceIds}`,
|
||||
method: 'delete'
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 作废流程
|
||||
* @param data 参数
|
||||
* @returns
|
||||
*/
|
||||
export const invalid = (data: any) => {
|
||||
return request({
|
||||
url: `/workflow/instance/invalid`,
|
||||
method: 'post',
|
||||
data: data
|
||||
});
|
||||
};
|
||||
/**
|
||||
* 修改流程变量
|
||||
* @param data 参数
|
||||
* @returns
|
||||
*/
|
||||
export const updateVariable = (data: any) => {
|
||||
return request({
|
||||
url: `/workflow/instance/updateVariable`,
|
||||
method: 'put',
|
||||
data: data
|
||||
});
|
||||
};
|
||||
28
src/api/workflow/instance/types.ts
Normal file
28
src/api/workflow/instance/types.ts
Normal file
@@ -0,0 +1,28 @@
|
||||
import type { FlowTaskVO } from '@/api/workflow/task/types';
|
||||
|
||||
export interface FlowInstanceQuery extends PageQuery {
|
||||
category?: string | number;
|
||||
nodeName?: string;
|
||||
flowCode?: string;
|
||||
flowName?: string;
|
||||
createByIds?: Array<string | number>;
|
||||
businessId?: string;
|
||||
}
|
||||
|
||||
export interface FlowInstanceVO extends BaseEntity {
|
||||
id: string | number;
|
||||
definitionId: string;
|
||||
flowName: string;
|
||||
flowCode: string;
|
||||
version: string;
|
||||
businessId: string;
|
||||
activityStatus: number;
|
||||
tenantId: string;
|
||||
createTime: string;
|
||||
createBy: string;
|
||||
flowStatus: string;
|
||||
flowStatusName: string;
|
||||
flowTaskList: FlowTaskVO[];
|
||||
businessCode: string;
|
||||
businessTitle: string;
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
import type { PageResult } from '@/api/types';
|
||||
import type { LeaveForm, LeaveQuery, LeaveVO } from '@/api/workflow/leave/types';
|
||||
import type { AxiosPromise } from '@/utils/api-types';
|
||||
import request from '@/utils/request';
|
||||
import { AxiosPromise } from 'axios';
|
||||
import { LeaveVO, LeaveQuery, LeaveForm } from '@/api/workflow/leave/types';
|
||||
|
||||
/**
|
||||
* 查询请假列表
|
||||
@@ -8,7 +9,7 @@ import { LeaveVO, LeaveQuery, LeaveForm } from '@/api/workflow/leave/types';
|
||||
* @returns {*}
|
||||
*/
|
||||
|
||||
export const listLeave = (query?: LeaveQuery): AxiosPromise<LeaveVO[]> => {
|
||||
export const listLeave = (query?: LeaveQuery): AxiosPromise<PageResult<LeaveVO>> => {
|
||||
return request({
|
||||
url: '/workflow/leave/list',
|
||||
method: 'get',
|
||||
@@ -39,6 +40,18 @@ export const addLeave = (data: LeaveForm): AxiosPromise<LeaveVO> => {
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 提交请假并发起流程
|
||||
* @param data
|
||||
*/
|
||||
export const submitAndFlowStart = (data: LeaveForm): AxiosPromise<LeaveVO> => {
|
||||
return request({
|
||||
url: '/workflow/leave/submitAndFlowStart',
|
||||
method: 'post',
|
||||
data: data
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 修改请假
|
||||
* @param data
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
export interface LeaveVO {
|
||||
id: string | number;
|
||||
applyCode?: string;
|
||||
leaveType: string;
|
||||
startDate: string;
|
||||
endDate: string;
|
||||
@@ -10,6 +11,7 @@ export interface LeaveVO {
|
||||
|
||||
export interface LeaveForm extends BaseEntity {
|
||||
id?: string | number;
|
||||
applyCode?: string;
|
||||
leaveType?: string;
|
||||
startDate?: string;
|
||||
endDate?: string;
|
||||
|
||||
@@ -1,104 +0,0 @@
|
||||
import request from '@/utils/request';
|
||||
import { AxiosPromise } from 'axios';
|
||||
import { ModelForm, ModelQuery, ModelVO } from '@/api/workflow/model/types';
|
||||
|
||||
/**
|
||||
* 查询模型列表
|
||||
* @param query
|
||||
* @returns {*}
|
||||
*/
|
||||
export const listModel = (query: ModelQuery): AxiosPromise<ModelVO[]> => {
|
||||
return request({
|
||||
url: '/workflow/model/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 查询模型信息
|
||||
* @param query
|
||||
* @returns {*}
|
||||
*/
|
||||
export const getInfo = (id: string): AxiosPromise<ModelForm> => {
|
||||
return request({
|
||||
url: '/workflow/model/getInfo/' + id,
|
||||
method: 'get'
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 新增模型
|
||||
* @param data
|
||||
* @returns {*}
|
||||
*/
|
||||
export const addModel = (data: ModelForm): AxiosPromise<void> => {
|
||||
return request({
|
||||
url: '/workflow/model/save',
|
||||
method: 'post',
|
||||
data: data
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 修改模型信息
|
||||
* @param data
|
||||
* @returns {*}
|
||||
*/
|
||||
export function update(data: ModelForm): AxiosPromise<void> {
|
||||
return request({
|
||||
url: '/workflow/model/update',
|
||||
method: 'put',
|
||||
data: data
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改模型信息
|
||||
* @param data
|
||||
* @returns {*}
|
||||
*/
|
||||
export function editModelXml(data: ModelForm): AxiosPromise<void> {
|
||||
return request({
|
||||
url: '/workflow/model/editModelXml',
|
||||
method: 'put',
|
||||
data: data
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 按id删除模型
|
||||
* @returns {*}
|
||||
* @param id 模型id
|
||||
*/
|
||||
export function delModel(id: string | string[]): AxiosPromise<void> {
|
||||
return request({
|
||||
url: '/workflow/model/' + id,
|
||||
method: 'delete'
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 模型部署
|
||||
* @returns {*}
|
||||
* @param id 模型id
|
||||
*/
|
||||
export const modelDeploy = (id: string): AxiosPromise<void> => {
|
||||
return request({
|
||||
url: `/workflow/model/modelDeploy/${id}`,
|
||||
method: 'post'
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 复制模型
|
||||
* @param data
|
||||
* @returns {*}
|
||||
*/
|
||||
export const copyModel = (data: ModelForm): AxiosPromise<void> => {
|
||||
return request({
|
||||
url: '/workflow/model/copyModel',
|
||||
method: 'post',
|
||||
data: data
|
||||
});
|
||||
};
|
||||
@@ -1,66 +0,0 @@
|
||||
export interface ModelForm {
|
||||
id: string;
|
||||
name: string;
|
||||
key: string;
|
||||
categoryCode: string;
|
||||
xml: string;
|
||||
svg: string;
|
||||
description: string;
|
||||
}
|
||||
|
||||
export interface ModelQuery extends PageQuery {
|
||||
name?: string;
|
||||
key?: string;
|
||||
categoryCode?: string;
|
||||
}
|
||||
|
||||
export interface OriginalPersistentState {
|
||||
metaInfo: string;
|
||||
editorSourceValueId: string;
|
||||
createTime: string;
|
||||
deploymentId?: string;
|
||||
name: string;
|
||||
tenantId: string;
|
||||
category?: string;
|
||||
version: number;
|
||||
editorSourceExtraValueId?: string;
|
||||
key: string;
|
||||
lastUpdateTime: string;
|
||||
}
|
||||
|
||||
export interface PersistentState {
|
||||
metaInfo: string;
|
||||
editorSourceValueId: string;
|
||||
createTime: string;
|
||||
deploymentId?: string;
|
||||
name: string;
|
||||
tenantId: string;
|
||||
category?: string;
|
||||
version: number;
|
||||
editorSourceExtraValueId?: string;
|
||||
key: string;
|
||||
lastUpdateTime: string;
|
||||
}
|
||||
|
||||
export interface ModelVO {
|
||||
id: string;
|
||||
revision: number;
|
||||
originalPersistentState: OriginalPersistentState;
|
||||
name: string;
|
||||
key: string;
|
||||
category?: string;
|
||||
createTime: string;
|
||||
lastUpdateTime: string;
|
||||
version: number;
|
||||
metaInfo: string;
|
||||
deploymentId?: string;
|
||||
editorSourceValueId: string;
|
||||
editorSourceExtraValueId?: string;
|
||||
tenantId: string;
|
||||
persistentState: PersistentState;
|
||||
revisionNext: number;
|
||||
idPrefix: string;
|
||||
inserted: boolean;
|
||||
updated: boolean;
|
||||
deleted: boolean;
|
||||
}
|
||||
@@ -1,38 +0,0 @@
|
||||
import { FormManageVO } from '@/api/workflow/formManage/types';
|
||||
|
||||
export interface NodeConfigVO {
|
||||
/**
|
||||
* 主键
|
||||
*/
|
||||
id: string | number;
|
||||
|
||||
/**
|
||||
* 表单id
|
||||
*/
|
||||
formId: string | number;
|
||||
|
||||
/**
|
||||
* 表单类型
|
||||
*/
|
||||
formType: string;
|
||||
|
||||
/**
|
||||
* 节点名称
|
||||
*/
|
||||
nodeName: string;
|
||||
|
||||
/**
|
||||
* 节点id
|
||||
*/
|
||||
nodeId: string | number;
|
||||
|
||||
/**
|
||||
* 流程定义id
|
||||
*/
|
||||
definitionId: string | number;
|
||||
|
||||
/**
|
||||
* 表单管理
|
||||
*/
|
||||
wfFormManageVo: FormManageVO;
|
||||
}
|
||||
@@ -1,114 +0,0 @@
|
||||
import request from '@/utils/request';
|
||||
import { ProcessDefinitionQuery, ProcessDefinitionVO, definitionXmlVO } from '@/api/workflow/processDefinition/types';
|
||||
import { AxiosPromise } from 'axios';
|
||||
|
||||
/**
|
||||
* 获取流程定义列表
|
||||
* @param query 流程实例id
|
||||
* @returns
|
||||
*/
|
||||
export const listProcessDefinition = (query: ProcessDefinitionQuery): AxiosPromise<ProcessDefinitionVO[]> => {
|
||||
return request({
|
||||
url: `/workflow/processDefinition/list`,
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
};
|
||||
/**
|
||||
* 按照流程定义key获取流程定义
|
||||
* @param processInstanceId 流程实例id
|
||||
* @returns
|
||||
*/
|
||||
export const getListByKey = (key: string) => {
|
||||
return request({
|
||||
url: `/workflow/processDefinition/getListByKey/${key}`,
|
||||
method: 'get'
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 通过流程定义id获取流程图
|
||||
*/
|
||||
export const definitionImage = (processDefinitionId: string): AxiosPromise<any> => {
|
||||
return request({
|
||||
url: `/workflow/processDefinition/definitionImage/${processDefinitionId}` + '?t' + Math.random(),
|
||||
method: 'get'
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 通过流程定义id获取xml
|
||||
* @param processDefinitionId 流程定义id
|
||||
* @returns
|
||||
*/
|
||||
export const definitionXml = (processDefinitionId: string): AxiosPromise<definitionXmlVO> => {
|
||||
return request({
|
||||
url: `/workflow/processDefinition/definitionXml/${processDefinitionId}`,
|
||||
method: 'get'
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 删除流程定义
|
||||
* @param deploymentId 部署id
|
||||
* @param processDefinitionId 流程定义id
|
||||
* @returns
|
||||
*/
|
||||
export const deleteProcessDefinition = (deploymentId: string | string[], processDefinitionId: string | string[]) => {
|
||||
return request({
|
||||
url: `/workflow/processDefinition/${deploymentId}/${processDefinitionId}`,
|
||||
method: 'delete'
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 挂起/激活
|
||||
* @param processDefinitionId 流程定义id
|
||||
* @returns
|
||||
*/
|
||||
export const updateDefinitionState = (processDefinitionId: string) => {
|
||||
return request({
|
||||
url: `/workflow/processDefinition/updateDefinitionState/${processDefinitionId}`,
|
||||
method: 'put'
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 流程定义转换为模型
|
||||
* @param processDefinitionId 流程定义id
|
||||
* @returns
|
||||
*/
|
||||
export const convertToModel = (processDefinitionId: string) => {
|
||||
return request({
|
||||
url: `/workflow/processDefinition/convertToModel/${processDefinitionId}`,
|
||||
method: 'put'
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 通过zip或xml部署流程定义
|
||||
* @returns
|
||||
*/
|
||||
export function deployProcessFile(data: any) {
|
||||
return request({
|
||||
url: '/workflow/processDefinition/deployByFile',
|
||||
method: 'post',
|
||||
data: data,
|
||||
headers: {
|
||||
repeatSubmit: false
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 迁移流程
|
||||
* @param currentProcessDefinitionId
|
||||
* @param fromProcessDefinitionId
|
||||
* @returns
|
||||
*/
|
||||
export const migrationDefinition = (currentProcessDefinitionId: string, fromProcessDefinitionId: string) => {
|
||||
return request({
|
||||
url: `/workflow/processDefinition/migrationDefinition/${currentProcessDefinitionId}/${fromProcessDefinitionId}`,
|
||||
method: 'put'
|
||||
});
|
||||
};
|
||||
@@ -1,24 +0,0 @@
|
||||
import { DefinitionConfigVO } from '@/api/workflow/definitionConfig/types';
|
||||
export interface ProcessDefinitionQuery extends PageQuery {
|
||||
key?: string;
|
||||
name?: string;
|
||||
categoryCode?: string;
|
||||
}
|
||||
|
||||
export interface ProcessDefinitionVO extends BaseEntity {
|
||||
id: string;
|
||||
name: string;
|
||||
key: string;
|
||||
version: number;
|
||||
suspensionState: number;
|
||||
resourceName: string;
|
||||
diagramResourceName: string;
|
||||
deploymentId: string;
|
||||
deploymentTime: string;
|
||||
wfDefinitionConfigVo: DefinitionConfigVO;
|
||||
}
|
||||
|
||||
export interface definitionXmlVO {
|
||||
xml: string[];
|
||||
xmlStr: string;
|
||||
}
|
||||
@@ -1,136 +0,0 @@
|
||||
import request from '@/utils/request';
|
||||
import { ProcessInstanceQuery, ProcessInstanceVO } from '@/api/workflow/processInstance/types';
|
||||
import { AxiosPromise } from 'axios';
|
||||
|
||||
/**
|
||||
* 查询运行中实例列表
|
||||
* @param query
|
||||
* @returns {*}
|
||||
*/
|
||||
export const getPageByRunning = (query: ProcessInstanceQuery): AxiosPromise<ProcessInstanceVO[]> => {
|
||||
return request({
|
||||
url: '/workflow/processInstance/getPageByRunning',
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 查询已完成实例列表
|
||||
* @param query
|
||||
* @returns {*}
|
||||
*/
|
||||
export const getPageByFinish = (query: ProcessInstanceQuery): AxiosPromise<ProcessInstanceVO[]> => {
|
||||
return request({
|
||||
url: '/workflow/processInstance/getPageByFinish',
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 通过业务id获取历史流程图
|
||||
*/
|
||||
export const getHistoryImage = (businessKey: string) => {
|
||||
return request({
|
||||
url: `/workflow/processInstance/getHistoryImage/${businessKey}` + '?t' + Math.random(),
|
||||
method: 'get'
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 通过业务id获取历史流程图运行中,历史等节点
|
||||
*/
|
||||
export const getHistoryList = (businessKey: string): AxiosPromise<Record<string, any>> => {
|
||||
return request({
|
||||
url: `/workflow/processInstance/getHistoryList/${businessKey}` + '?t' + Math.random(),
|
||||
method: 'get'
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 获取审批记录
|
||||
* @param businessKey 业务id
|
||||
* @returns
|
||||
*/
|
||||
export const getHistoryRecord = (businessKey: string | number) => {
|
||||
return request({
|
||||
url: `/workflow/processInstance/getHistoryRecord/${businessKey}`,
|
||||
method: 'get'
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 作废
|
||||
* @param data 参数
|
||||
* @returns
|
||||
*/
|
||||
export const deleteRunInstance = (data: object) => {
|
||||
return request({
|
||||
url: `/workflow/processInstance/deleteRunInstance`,
|
||||
method: 'post',
|
||||
data: data
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 运行中的实例 删除程实例,删除历史记录,删除业务与流程关联信息
|
||||
* @param businessKey 业务id
|
||||
* @returns
|
||||
*/
|
||||
export const deleteRunAndHisInstance = (businessKey: string | string[]) => {
|
||||
return request({
|
||||
url: `/workflow/processInstance/deleteRunAndHisInstance/${businessKey}`,
|
||||
method: 'delete'
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 已完成的实例 删除程实例,删除历史记录,删除业务与流程关联信息
|
||||
* @param businessKey 业务id
|
||||
* @returns
|
||||
*/
|
||||
export const deleteFinishAndHisInstance = (businessKey: string | string[]) => {
|
||||
return request({
|
||||
url: `/workflow/processInstance/deleteFinishAndHisInstance/${businessKey}`,
|
||||
method: 'delete'
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 分页查询当前登录人单据
|
||||
* @param query
|
||||
* @returns {*}
|
||||
*/
|
||||
export const getPageByCurrent = (query: ProcessInstanceQuery): AxiosPromise<ProcessInstanceVO[]> => {
|
||||
return request({
|
||||
url: '/workflow/processInstance/getPageByCurrent',
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 撤销流程
|
||||
* @param businessKey 业务id
|
||||
* @returns
|
||||
*/
|
||||
export const cancelProcessApply = (businessKey: string) => {
|
||||
return request({
|
||||
url: `/workflow/processInstance/cancelProcessApply/${businessKey}`,
|
||||
method: 'post'
|
||||
});
|
||||
};
|
||||
|
||||
export default {
|
||||
getPageByRunning,
|
||||
getPageByFinish,
|
||||
getHistoryImage,
|
||||
getHistoryList,
|
||||
getHistoryRecord,
|
||||
deleteRunInstance,
|
||||
deleteRunAndHisInstance,
|
||||
deleteFinishAndHisInstance,
|
||||
getPageByCurrent,
|
||||
cancelProcessApply
|
||||
};
|
||||
@@ -1,27 +0,0 @@
|
||||
import { TaskVO } from '@/api/workflow/task/types';
|
||||
|
||||
export interface ProcessInstanceQuery extends PageQuery {
|
||||
categoryCode?: string;
|
||||
name?: string;
|
||||
key?: string;
|
||||
startUserId?: string;
|
||||
businessKey?: string;
|
||||
}
|
||||
|
||||
export interface ProcessInstanceVO extends BaseEntity {
|
||||
id: string;
|
||||
processDefinitionId: string;
|
||||
processDefinitionName: string;
|
||||
processDefinitionKey: string;
|
||||
processDefinitionVersion: string;
|
||||
deploymentId: string;
|
||||
businessKey: string;
|
||||
isSuspended?: any;
|
||||
tenantId: string;
|
||||
startTime: string;
|
||||
endTime?: string;
|
||||
startUserId: string;
|
||||
businessStatus: string;
|
||||
businessStatusName: string;
|
||||
taskVoList: TaskVO[];
|
||||
}
|
||||
64
src/api/workflow/spel/index.ts
Normal file
64
src/api/workflow/spel/index.ts
Normal file
@@ -0,0 +1,64 @@
|
||||
import type { PageResult } from '@/api/types';
|
||||
import type { SpelForm, SpelQuery, SpelVO } from '@/api/workflow/spel/types';
|
||||
import type { AxiosPromise } from '@/utils/api-types';
|
||||
import request from '@/utils/request';
|
||||
|
||||
/**
|
||||
* 查询流程spel表达式定义列表
|
||||
* @param query
|
||||
* @returns {*}
|
||||
*/
|
||||
|
||||
export const listSpel = (query?: SpelQuery): AxiosPromise<PageResult<SpelVO>> => {
|
||||
return request({
|
||||
url: '/workflow/spel/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 查询流程spel表达式定义详细
|
||||
* @param id
|
||||
*/
|
||||
export const getSpel = (id: string | number): AxiosPromise<SpelVO> => {
|
||||
return request({
|
||||
url: '/workflow/spel/' + id,
|
||||
method: 'get'
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 新增流程spel表达式定义
|
||||
* @param data
|
||||
*/
|
||||
export const addSpel = (data: SpelForm) => {
|
||||
return request({
|
||||
url: '/workflow/spel',
|
||||
method: 'post',
|
||||
data: data
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 修改流程spel表达式定义
|
||||
* @param data
|
||||
*/
|
||||
export const updateSpel = (data: SpelForm) => {
|
||||
return request({
|
||||
url: '/workflow/spel',
|
||||
method: 'put',
|
||||
data: data
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 删除流程spel表达式定义
|
||||
* @param id
|
||||
*/
|
||||
export const delSpel = (id: string | number | Array<string | number>) => {
|
||||
return request({
|
||||
url: '/workflow/spel/' + id,
|
||||
method: 'delete'
|
||||
});
|
||||
};
|
||||
105
src/api/workflow/spel/types.ts
Normal file
105
src/api/workflow/spel/types.ts
Normal file
@@ -0,0 +1,105 @@
|
||||
export interface SpelVO {
|
||||
/**
|
||||
* 主键id
|
||||
*/
|
||||
id: string | number;
|
||||
|
||||
/**
|
||||
* 组件名称
|
||||
*/
|
||||
componentName: string;
|
||||
|
||||
/**
|
||||
* 方法名
|
||||
*/
|
||||
methodName: string;
|
||||
|
||||
/**
|
||||
* 参数
|
||||
*/
|
||||
methodParams: string;
|
||||
|
||||
/**
|
||||
* 预览spel值
|
||||
*/
|
||||
viewSpel: string;
|
||||
|
||||
/**
|
||||
* 状态(0正常 1停用)
|
||||
*/
|
||||
status: string;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
remark?: string;
|
||||
}
|
||||
|
||||
export interface SpelForm extends BaseEntity {
|
||||
/**
|
||||
* 主键id
|
||||
*/
|
||||
id?: string | number;
|
||||
|
||||
/**
|
||||
* 组件名称
|
||||
*/
|
||||
componentName?: string;
|
||||
|
||||
/**
|
||||
* 方法名
|
||||
*/
|
||||
methodName?: string;
|
||||
|
||||
/**
|
||||
* 参数
|
||||
*/
|
||||
methodParams?: string;
|
||||
|
||||
/**
|
||||
* 预览spel值
|
||||
*/
|
||||
viewSpel?: string;
|
||||
|
||||
/**
|
||||
* 状态(0正常 1停用)
|
||||
*/
|
||||
status?: string;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
remark?: string;
|
||||
}
|
||||
|
||||
export interface SpelQuery extends PageQuery {
|
||||
/**
|
||||
* 组件名称
|
||||
*/
|
||||
componentName?: string;
|
||||
|
||||
/**
|
||||
* 方法名
|
||||
*/
|
||||
methodName?: string;
|
||||
|
||||
/**
|
||||
* 参数
|
||||
*/
|
||||
methodParams?: string;
|
||||
|
||||
/**
|
||||
* 预览spel值
|
||||
*/
|
||||
viewSpel?: string;
|
||||
|
||||
/**
|
||||
* 状态(0正常 1停用)
|
||||
*/
|
||||
status?: string;
|
||||
|
||||
/**
|
||||
* 日期范围参数
|
||||
*/
|
||||
params?: any;
|
||||
}
|
||||
@@ -1,15 +1,16 @@
|
||||
import type { PageResult } from '@/api/types';
|
||||
import type { FlowTaskVO, TaskOperationBo, TaskQuery } from '@/api/workflow/task/types';
|
||||
import type { AxiosPromise } from '@/utils/api-types';
|
||||
import request from '@/utils/request';
|
||||
import { AxiosPromise } from 'axios';
|
||||
import { TaskQuery, TaskVO } from '@/api/workflow/task/types';
|
||||
|
||||
/**
|
||||
* 查询待办列表
|
||||
* @param query
|
||||
* @returns {*}
|
||||
*/
|
||||
export const getPageByTaskWait = (query: TaskQuery): AxiosPromise<TaskVO[]> => {
|
||||
export const pageByTaskWait = (query: TaskQuery): AxiosPromise<PageResult<FlowTaskVO>> => {
|
||||
return request({
|
||||
url: '/workflow/task/getPageByTaskWait',
|
||||
url: '/workflow/task/pageByTaskWait',
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
@@ -20,9 +21,9 @@ export const getPageByTaskWait = (query: TaskQuery): AxiosPromise<TaskVO[]> => {
|
||||
* @param query
|
||||
* @returns {*}
|
||||
*/
|
||||
export const getPageByTaskFinish = (query: TaskQuery): AxiosPromise<TaskVO[]> => {
|
||||
export const pageByTaskFinish = (query: TaskQuery): AxiosPromise<PageResult<FlowTaskVO>> => {
|
||||
return request({
|
||||
url: '/workflow/task/getPageByTaskFinish',
|
||||
url: '/workflow/task/pageByTaskFinish',
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
@@ -33,35 +34,35 @@ export const getPageByTaskFinish = (query: TaskQuery): AxiosPromise<TaskVO[]> =>
|
||||
* @param query
|
||||
* @returns {*}
|
||||
*/
|
||||
export const getPageByTaskCopy = (query: TaskQuery): AxiosPromise<TaskVO[]> => {
|
||||
export const pageByTaskCopy = (query: TaskQuery): AxiosPromise<PageResult<FlowTaskVO>> => {
|
||||
return request({
|
||||
url: '/workflow/task/getPageByTaskCopy',
|
||||
url: '/workflow/task/pageByTaskCopy',
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 当前租户所有待办任务
|
||||
* 查询全部待办任务
|
||||
* @param query
|
||||
* @returns {*}
|
||||
*/
|
||||
export const getPageByAllTaskWait = (query: TaskQuery): AxiosPromise<TaskVO[]> => {
|
||||
export const pageByAllTaskWait = (query: TaskQuery): AxiosPromise<PageResult<FlowTaskVO>> => {
|
||||
return request({
|
||||
url: '/workflow/task/getPageByAllTaskWait',
|
||||
url: '/workflow/task/pageByAllTaskWait',
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 当前租户所有已办任务
|
||||
* 查询全部已办任务
|
||||
* @param query
|
||||
* @returns {*}
|
||||
*/
|
||||
export const getPageByAllTaskFinish = (query: TaskQuery): AxiosPromise<TaskVO[]> => {
|
||||
export const pageByAllTaskFinish = (query: TaskQuery): AxiosPromise<PageResult<FlowTaskVO>> => {
|
||||
return request({
|
||||
url: '/workflow/task/getPageByAllTaskFinish',
|
||||
url: '/workflow/task/pageByAllTaskFinish',
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
@@ -93,30 +94,6 @@ export const completeTask = (data: object) => {
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 认领任务
|
||||
* @param taskId
|
||||
* @returns {*}
|
||||
*/
|
||||
export const claim = (taskId: string): any => {
|
||||
return request({
|
||||
url: '/workflow/task/claim/' + taskId,
|
||||
method: 'post'
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 归还任务
|
||||
* @param taskId
|
||||
* @returns {*}
|
||||
*/
|
||||
export const returnTask = (taskId: string): any => {
|
||||
return request({
|
||||
url: '/workflow/task/returnTask/' + taskId,
|
||||
method: 'post'
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 任务驳回
|
||||
* @param data
|
||||
@@ -135,61 +112,24 @@ export const backProcess = (data: any): any => {
|
||||
* @param taskId
|
||||
* @returns
|
||||
*/
|
||||
export const getTaskById = (taskId: string) => {
|
||||
export const getTask = (taskId: string) => {
|
||||
return request({
|
||||
url: '/workflow/task/getTaskById/' + taskId,
|
||||
url: '/workflow/task/getTask/' + taskId,
|
||||
method: 'get'
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 加签
|
||||
* @param data
|
||||
* @returns
|
||||
*/
|
||||
export const addMultiInstanceExecution = (data: any) => {
|
||||
return request({
|
||||
url: '/workflow/task/addMultiInstanceExecution',
|
||||
method: 'post',
|
||||
data: data
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 减签
|
||||
* @param data
|
||||
* @returns
|
||||
*/
|
||||
export const deleteMultiInstanceExecution = (data: any) => {
|
||||
return request({
|
||||
url: '/workflow/task/deleteMultiInstanceExecution',
|
||||
method: 'post',
|
||||
data: data
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 修改任务办理人
|
||||
* @param taskIds
|
||||
* @param taskIdList
|
||||
* @param userId
|
||||
* @returns
|
||||
*/
|
||||
export const updateAssignee = (taskIds: Array<string>, userId: string) => {
|
||||
export const updateAssignee = (taskIdList: Array<string>, userId: string) => {
|
||||
return request({
|
||||
url: `/workflow/task/updateAssignee/${taskIds}/${userId}`,
|
||||
method: 'put'
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 转办任务
|
||||
* @returns
|
||||
*/
|
||||
export const transferTask = (data: any) => {
|
||||
return request({
|
||||
url: `/workflow/task/transferTask`,
|
||||
method: 'post',
|
||||
data: data
|
||||
url: `/workflow/task/updateAssignee/${userId}`,
|
||||
method: 'put',
|
||||
data: taskIdList
|
||||
});
|
||||
};
|
||||
|
||||
@@ -205,60 +145,63 @@ export const terminationTask = (data: any) => {
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 查询流程变量
|
||||
* @returns
|
||||
*/
|
||||
export const getInstanceVariable = (taskId: string) => {
|
||||
return request({
|
||||
url: `/workflow/task/getInstanceVariable/${taskId}`,
|
||||
method: 'get'
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 获取可驳回得任务节点
|
||||
* @returns
|
||||
*/
|
||||
export const getTaskNodeList = (processInstanceId: string) => {
|
||||
export const getBackTaskNode = (taskId: string | number, nodeCode: string) => {
|
||||
return request({
|
||||
url: `/workflow/task/getTaskNodeList/${processInstanceId}`,
|
||||
url: `/workflow/task/getBackTaskNode/${taskId}/${nodeCode}`,
|
||||
method: 'get'
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 委托任务
|
||||
* 任务操作 操作类型,委派 delegateTask、转办 transferTask、加签 addSignature、减签 reductionSignature
|
||||
* @returns
|
||||
*/
|
||||
export const delegateTask = (data: any) => {
|
||||
export const taskOperation = (data: TaskOperationBo, operation: string) => {
|
||||
return request({
|
||||
url: `/workflow/task/delegateTask`,
|
||||
url: `/workflow/task/taskOperation/${operation}`,
|
||||
method: 'post',
|
||||
data: data
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 查询工作流任务用户选择加签人员
|
||||
* @param taskId
|
||||
* @returns {*}
|
||||
* 获取当前任务办理人
|
||||
* @param taskId 任务id
|
||||
* @returns
|
||||
*/
|
||||
export const getTaskUserIdsByAddMultiInstance = (taskId: string) => {
|
||||
export const currentTaskAllUser = (taskId: string | number) => {
|
||||
return request({
|
||||
url: '/workflow/task/getTaskUserIdsByAddMultiInstance/' + taskId,
|
||||
url: `/workflow/task/currentTaskAllUser/${taskId}`,
|
||||
method: 'get'
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 查询工作流选择减签人员
|
||||
* @param taskId
|
||||
* @returns {*}
|
||||
* 获取下一节点写
|
||||
* @param data参数
|
||||
* @returns
|
||||
*/
|
||||
export const getListByDeleteMultiInstance = (taskId: string) => {
|
||||
export const getNextNodeList = (data: any): any => {
|
||||
return request({
|
||||
url: '/workflow/task/getListByDeleteMultiInstance/' + taskId,
|
||||
method: 'get'
|
||||
url: '/workflow/task/getNextNodeList',
|
||||
method: 'post',
|
||||
data: data
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 催办任务
|
||||
* @param data参数
|
||||
* @returns
|
||||
*/
|
||||
export const urgeTask = (data: any): any => {
|
||||
return request({
|
||||
url: '/workflow/task/urgeTask',
|
||||
method: 'post',
|
||||
data: data
|
||||
});
|
||||
};
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
import { NodeConfigVO } from '@/api/workflow/nodeConfig/types';
|
||||
import { DefinitionConfigVO } from '@/api/workflow/definitionConfig/types';
|
||||
export interface TaskQuery extends PageQuery {
|
||||
name?: string;
|
||||
processDefinitionKey?: string;
|
||||
processDefinitionName?: string;
|
||||
nodeName?: string;
|
||||
flowCode?: string;
|
||||
flowName?: string;
|
||||
createByIds?: Array<string | number>;
|
||||
}
|
||||
|
||||
export interface ParticipantVo {
|
||||
@@ -12,38 +11,50 @@ export interface ParticipantVo {
|
||||
candidateName: string[];
|
||||
claim: boolean;
|
||||
}
|
||||
|
||||
export interface TaskVO extends BaseEntity {
|
||||
id: string;
|
||||
name: string;
|
||||
description?: string;
|
||||
priority: number;
|
||||
owner?: string;
|
||||
assignee?: string | number;
|
||||
assigneeName?: string;
|
||||
processInstanceId: string;
|
||||
executionId: string;
|
||||
taskDefinitionId?: any;
|
||||
processDefinitionId: string;
|
||||
endTime?: string;
|
||||
taskDefinitionKey: string;
|
||||
dueDate?: string;
|
||||
category?: any;
|
||||
parentTaskId?: any;
|
||||
tenantId: string;
|
||||
claimTime?: string;
|
||||
businessStatus?: string;
|
||||
businessStatusName?: string;
|
||||
processDefinitionName?: string;
|
||||
processDefinitionKey?: string;
|
||||
participantVo?: ParticipantVo;
|
||||
multiInstance?: boolean;
|
||||
businessKey?: string;
|
||||
wfNodeConfigVo?: NodeConfigVO;
|
||||
wfDefinitionConfigVo?: DefinitionConfigVO;
|
||||
export interface FlowTaskVO {
|
||||
id: string | number;
|
||||
createTime?: Date;
|
||||
updateTime?: Date;
|
||||
tenantId?: string;
|
||||
definitionId?: string;
|
||||
instanceId: string;
|
||||
flowName: string;
|
||||
businessId: string;
|
||||
nodeCode: string;
|
||||
nodeName: string;
|
||||
flowCode: string;
|
||||
flowStatus: string;
|
||||
formCustom: string;
|
||||
formPath: string;
|
||||
nodeType: number;
|
||||
nodeRatio: string | number;
|
||||
version?: string;
|
||||
applyNode?: boolean;
|
||||
buttonList?: ButtonList[];
|
||||
copyList?: FlowCopyVo[];
|
||||
varList?: Map<string, string>;
|
||||
businessCode: string;
|
||||
businessTitle: string;
|
||||
}
|
||||
|
||||
export interface VariableVo {
|
||||
key: string;
|
||||
value: string;
|
||||
export interface ButtonList {
|
||||
code: string;
|
||||
show: boolean;
|
||||
}
|
||||
export interface FlowCopyVo {
|
||||
userId: string | number;
|
||||
nickName: string;
|
||||
}
|
||||
|
||||
export interface TaskOperationBo {
|
||||
//委派/转办人的用户ID(必填,准对委派/转办人操作)
|
||||
userId?: string;
|
||||
//加签/减签人的用户ID列表(必填,针对加签/减签操作)
|
||||
userIds?: string[];
|
||||
//任务ID(必填)
|
||||
taskId: string | number;
|
||||
//消息类型
|
||||
messageType?: string[];
|
||||
//意见或备注信息(可选)
|
||||
message?: string;
|
||||
}
|
||||
|
||||
@@ -1,29 +1,17 @@
|
||||
import { RouterJumpVo } from '@/api/workflow/workflowCommon/types';
|
||||
import type { RouterJumpVo } from '@/api/workflow/workflowCommon/types';
|
||||
import tab from '@/plugins/tab';
|
||||
import router from '@/router';
|
||||
|
||||
export default {
|
||||
routerJump(routerJumpVo: RouterJumpVo, proxy) {
|
||||
if (routerJumpVo.wfNodeConfigVo && routerJumpVo.wfNodeConfigVo.formType === 'static' && routerJumpVo.wfNodeConfigVo.wfFormManageVo) {
|
||||
proxy.$tab.closePage(proxy.$route);
|
||||
proxy.$router.push({
|
||||
path: `${routerJumpVo.wfNodeConfigVo.wfFormManageVo.router}`,
|
||||
query: {
|
||||
id: routerJumpVo.businessKey,
|
||||
type: routerJumpVo.type,
|
||||
taskId: routerJumpVo.taskId
|
||||
}
|
||||
});
|
||||
} else if (routerJumpVo.wfNodeConfigVo && routerJumpVo.wfNodeConfigVo.formType === 'dynamic' && routerJumpVo.wfNodeConfigVo.wfFormManageVo) {
|
||||
proxy.$tab.closePage(proxy.$route);
|
||||
proxy.$router.push({
|
||||
path: `${routerJumpVo.wfNodeConfigVo.wfFormManageVo.router}`,
|
||||
query: {
|
||||
id: routerJumpVo.businessKey,
|
||||
type: routerJumpVo.type,
|
||||
taskId: routerJumpVo.taskId
|
||||
}
|
||||
});
|
||||
} else {
|
||||
proxy?.$modal.msgError('请到模型配置菜单!');
|
||||
}
|
||||
routerJump(routerJumpVo: RouterJumpVo) {
|
||||
tab.closePage(router.currentRoute.value);
|
||||
router.push({
|
||||
path: routerJumpVo.formPath,
|
||||
query: {
|
||||
id: routerJumpVo.businessId,
|
||||
type: routerJumpVo.type,
|
||||
taskId: routerJumpVo.taskId
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
@@ -1,16 +1,14 @@
|
||||
import { NodeConfigVO } from '@/api/workflow/nodeConfig/types';
|
||||
import { DefinitionConfigVO } from '@/api/workflow/definitionConfig/types';
|
||||
|
||||
export interface RouterJumpVo {
|
||||
wfNodeConfigVo: NodeConfigVO;
|
||||
wfDefinitionConfigVo: DefinitionConfigVO;
|
||||
businessKey: string;
|
||||
taskId: string;
|
||||
businessId: string;
|
||||
taskId: string | number;
|
||||
type: string;
|
||||
formCustom: string;
|
||||
formPath: string;
|
||||
}
|
||||
|
||||
export interface StartProcessBo {
|
||||
businessKey: string | number;
|
||||
tableName: string;
|
||||
businessId: string | number;
|
||||
flowCode: string;
|
||||
variables: any;
|
||||
bizExt: any;
|
||||
}
|
||||
|
||||
@@ -1 +1 @@
|
||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1588670460195" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1314" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M230.4 307.712c13.824 0 25.088-11.264 25.088-25.088 0-100.352 81.92-182.272 182.272-182.272s182.272 81.408 182.272 182.272c0 13.824 11.264 25.088 25.088 25.088s25.088-11.264 24.576-25.088c0-127.488-103.936-231.936-231.936-231.936S205.824 154.624 205.824 282.624c-0.512 14.336 10.752 25.088 24.576 25.088z m564.736 234.496c-11.264 0-21.504 2.048-31.232 6.144 0-44.544-40.448-81.92-88.064-81.92-14.848 0-28.16 3.584-39.936 10.24-13.824-28.16-44.544-48.128-78.848-48.128-12.288 0-24.576 2.56-35.328 7.68V284.16c0-45.568-37.888-81.92-84.48-81.92s-84.48 36.864-84.48 81.92v348.672l-69.12-112.64c-18.432-28.16-58.368-36.864-91.136-19.968-26.624 14.336-46.592 47.104-30.208 88.064 3.072 8.192 76.8 205.312 171.52 311.296 0 0 28.16 24.576 43.008 58.88 4.096 9.728 13.312 15.36 22.528 15.36 3.072 0 6.656-0.512 9.728-2.048 12.288-5.12 18.432-19.968 12.8-32.256-19.456-44.544-53.76-74.752-53.76-74.752C281.6 768 209.408 573.44 208.384 570.88c-5.12-12.8-2.56-20.992 7.168-26.112 9.216-4.608 21.504-4.608 26.112 2.56l113.152 184.32c4.096 8.704 12.8 14.336 22.528 14.336 13.824 0 25.088-10.752 25.088-25.088V284.16c0-17.92 15.36-32.256 34.816-32.256s34.816 14.336 34.816 32.256v284.16c0 13.824 10.24 25.088 24.576 25.088 13.824 0 25.088-11.264 25.088-25.088v-57.344c0-17.92 15.36-32.768 34.816-32.768 19.968 0 37.376 15.36 37.376 32.768v95.232c0 7.168 3.072 13.312 7.68 17.92 4.608 4.608 10.752 7.168 17.92 7.168 13.824 0 24.576-11.264 24.576-25.088V547.84c0-18.432 13.824-32.256 32.256-32.256 20.48 0 38.912 15.36 38.912 32.256v95.232c0 13.824 11.264 25.088 25.088 25.088s24.576-11.264 25.088-25.088v-18.944c0-18.944 12.8-32.256 30.72-32.256 18.432 0 22.528 18.944 22.528 31.744 0 1.024-11.776 99.84-50.688 173.056-30.72 58.368-45.056 112.128-51.2 146.944-2.56 13.312 6.656 26.112 19.968 28.672 1.536 0 3.072 0.512 4.608 0.512 11.776 0 22.016-8.192 24.064-20.48 5.632-31.232 18.432-79.36 46.08-132.608 43.52-81.92 55.808-186.88 56.32-193.536-0.512-50.688-29.696-83.968-72.704-83.968z"></path></path></svg>
|
||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1588670460195" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1314" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M230.4 307.712c13.824 0 25.088-11.264 25.088-25.088 0-100.352 81.92-182.272 182.272-182.272s182.272 81.408 182.272 182.272c0 13.824 11.264 25.088 25.088 25.088s25.088-11.264 24.576-25.088c0-127.488-103.936-231.936-231.936-231.936S205.824 154.624 205.824 282.624c-0.512 14.336 10.752 25.088 24.576 25.088z m564.736 234.496c-11.264 0-21.504 2.048-31.232 6.144 0-44.544-40.448-81.92-88.064-81.92-14.848 0-28.16 3.584-39.936 10.24-13.824-28.16-44.544-48.128-78.848-48.128-12.288 0-24.576 2.56-35.328 7.68V284.16c0-45.568-37.888-81.92-84.48-81.92s-84.48 36.864-84.48 81.92v348.672l-69.12-112.64c-18.432-28.16-58.368-36.864-91.136-19.968-26.624 14.336-46.592 47.104-30.208 88.064 3.072 8.192 76.8 205.312 171.52 311.296 0 0 28.16 24.576 43.008 58.88 4.096 9.728 13.312 15.36 22.528 15.36 3.072 0 6.656-0.512 9.728-2.048 12.288-5.12 18.432-19.968 12.8-32.256-19.456-44.544-53.76-74.752-53.76-74.752C281.6 768 209.408 573.44 208.384 570.88c-5.12-12.8-2.56-20.992 7.168-26.112 9.216-4.608 21.504-4.608 26.112 2.56l113.152 184.32c4.096 8.704 12.8 14.336 22.528 14.336 13.824 0 25.088-10.752 25.088-25.088V284.16c0-17.92 15.36-32.256 34.816-32.256s34.816 14.336 34.816 32.256v284.16c0 13.824 10.24 25.088 24.576 25.088 13.824 0 25.088-11.264 25.088-25.088v-57.344c0-17.92 15.36-32.768 34.816-32.768 19.968 0 37.376 15.36 37.376 32.768v95.232c0 7.168 3.072 13.312 7.68 17.92 4.608 4.608 10.752 7.168 17.92 7.168 13.824 0 24.576-11.264 24.576-25.088V547.84c0-18.432 13.824-32.256 32.256-32.256 20.48 0 38.912 15.36 38.912 32.256v95.232c0 13.824 11.264 25.088 25.088 25.088s24.576-11.264 25.088-25.088v-18.944c0-18.944 12.8-32.256 30.72-32.256 18.432 0 22.528 18.944 22.528 31.744 0 1.024-11.776 99.84-50.688 173.056-30.72 58.368-45.056 112.128-51.2 146.944-2.56 13.312 6.656 26.112 19.968 28.672 1.536 0 3.072 0.512 4.608 0.512 11.776 0 22.016-8.192 24.064-20.48 5.632-31.232 18.432-79.36 46.08-132.608 43.52-81.92 55.808-186.88 56.32-193.536-0.512-50.688-29.696-83.968-72.704-83.968z"></path></svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
90
src/assets/styles/base/_document.scss
Normal file
90
src/assets/styles/base/_document.scss
Normal file
@@ -0,0 +1,90 @@
|
||||
/* Global document styles and lightweight utility helpers. */
|
||||
|
||||
// --- 视口与排版根 ---
|
||||
body {
|
||||
height: 100%;
|
||||
margin: 0;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
text-rendering: optimizeLegibility;
|
||||
background: var(--app-shell-bg);
|
||||
font-family:
|
||||
'MiSans', 'HarmonyOS Sans SC', 'PingFang SC', 'Source Han Sans SC', 'Noto Sans SC', 'Hiragino Sans GB',
|
||||
'Microsoft YaHei', sans-serif;
|
||||
}
|
||||
|
||||
label {
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
html {
|
||||
height: 100%;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
html.dark .svg-icon,
|
||||
html.dark svg {
|
||||
fill: var(--el-text-color-regular);
|
||||
}
|
||||
|
||||
#app {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
html,
|
||||
body,
|
||||
#app {
|
||||
min-height: 100%;
|
||||
}
|
||||
|
||||
*,
|
||||
*:before,
|
||||
*:after {
|
||||
box-sizing: inherit;
|
||||
}
|
||||
|
||||
a:focus,
|
||||
a:active {
|
||||
outline: none;
|
||||
}
|
||||
|
||||
a,
|
||||
a:focus,
|
||||
a:hover {
|
||||
cursor: pointer;
|
||||
color: inherit;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
div:focus {
|
||||
outline: none;
|
||||
}
|
||||
|
||||
.clearfix {
|
||||
&:after {
|
||||
visibility: hidden;
|
||||
display: block;
|
||||
font-size: 0;
|
||||
content: ' ';
|
||||
clear: both;
|
||||
height: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.h1,
|
||||
.h2,
|
||||
.h3,
|
||||
.h4,
|
||||
.h5,
|
||||
.h6,
|
||||
h1,
|
||||
h2,
|
||||
h3,
|
||||
h4,
|
||||
h5,
|
||||
h6 {
|
||||
font-family: inherit;
|
||||
font-weight: 500;
|
||||
line-height: 1.1;
|
||||
color: inherit;
|
||||
}
|
||||
@@ -1,99 +0,0 @@
|
||||
@import './variables.module.scss';
|
||||
|
||||
@mixin colorBtn($color) {
|
||||
background: $color;
|
||||
|
||||
&:hover {
|
||||
color: $color;
|
||||
|
||||
&:before,
|
||||
&:after {
|
||||
background: $color;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.blue-btn {
|
||||
@include colorBtn($blue);
|
||||
}
|
||||
|
||||
.light-blue-btn {
|
||||
@include colorBtn($light-blue);
|
||||
}
|
||||
|
||||
.red-btn {
|
||||
@include colorBtn($red);
|
||||
}
|
||||
|
||||
.pink-btn {
|
||||
@include colorBtn($pink);
|
||||
}
|
||||
|
||||
.green-btn {
|
||||
@include colorBtn($green);
|
||||
}
|
||||
|
||||
.tiffany-btn {
|
||||
@include colorBtn($tiffany);
|
||||
}
|
||||
|
||||
.yellow-btn {
|
||||
@include colorBtn($yellow);
|
||||
}
|
||||
|
||||
.pan-btn {
|
||||
font-size: 14px;
|
||||
color: #fff;
|
||||
padding: 14px 36px;
|
||||
border-radius: 8px;
|
||||
border: none;
|
||||
outline: none;
|
||||
transition: 600ms ease all;
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
|
||||
&:hover {
|
||||
background: #fff;
|
||||
|
||||
&:before,
|
||||
&:after {
|
||||
width: 100%;
|
||||
transition: 600ms ease all;
|
||||
}
|
||||
}
|
||||
|
||||
&:before,
|
||||
&:after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
height: 2px;
|
||||
width: 0;
|
||||
transition: 400ms ease all;
|
||||
}
|
||||
|
||||
&::after {
|
||||
right: inherit;
|
||||
top: inherit;
|
||||
left: 0;
|
||||
bottom: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.custom-button {
|
||||
display: inline-block;
|
||||
line-height: 1;
|
||||
white-space: nowrap;
|
||||
cursor: pointer;
|
||||
background: #fff;
|
||||
color: #fff;
|
||||
-webkit-appearance: none;
|
||||
text-align: center;
|
||||
box-sizing: border-box;
|
||||
outline: 0;
|
||||
margin: 0;
|
||||
padding: 10px 15px;
|
||||
font-size: 14px;
|
||||
border-radius: 4px;
|
||||
}
|
||||
67
src/assets/styles/components/_card-shell.scss
Normal file
67
src/assets/styles/components/_card-shell.scss
Normal file
@@ -0,0 +1,67 @@
|
||||
/* 业务列表/卡片页:分页、树、列表、el-card 等(与 vendors/element-plus 通用覆盖叠加,入口顺序见 index.scss)。
|
||||
* 属「页面模式」而非 EP 公共主题,故放在 components。 */
|
||||
|
||||
// --- 历史「表单分区标题」样式 ---
|
||||
.form-header {
|
||||
font-size: 15px;
|
||||
color: var(--el-color-primary);
|
||||
border-bottom: 1px solid var(--app-surface-border);
|
||||
margin: 8px 10px 25px 10px;
|
||||
padding-bottom: 5px;
|
||||
}
|
||||
|
||||
// --- 树形容器描边(暗色覆盖在 _search-panel) ---
|
||||
.tree-border {
|
||||
margin-top: 8px;
|
||||
border: 1px solid var(--app-surface-border);
|
||||
background: var(--app-surface-bg);
|
||||
border-radius: 22px;
|
||||
width: 100%;
|
||||
padding: 12px;
|
||||
}
|
||||
|
||||
@media (max-width: 768px) {
|
||||
.pagination-container .el-pagination > .el-pagination__jump {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
.pagination-container .el-pagination > .el-pagination__sizes {
|
||||
display: none !important;
|
||||
}
|
||||
}
|
||||
|
||||
.el-tree-node__content > .el-checkbox {
|
||||
margin-right: 8px;
|
||||
}
|
||||
|
||||
// --- el-card 本业务页外观(与 EP vendors 叠加) ---
|
||||
.el-card__header {
|
||||
padding: 14px 16px 10px !important;
|
||||
min-height: auto;
|
||||
background: transparent;
|
||||
border-bottom: 1px solid var(--app-surface-border);
|
||||
}
|
||||
|
||||
.el-card__body {
|
||||
padding: 16px !important;
|
||||
}
|
||||
|
||||
.el-card {
|
||||
border-radius: var(--app-radius-base);
|
||||
box-shadow: var(--app-shadow-sm);
|
||||
border-color: var(--app-surface-border);
|
||||
overflow: hidden;
|
||||
transition:
|
||||
box-shadow 0.2s ease,
|
||||
border-color 0.2s ease;
|
||||
background: var(--app-surface-bg);
|
||||
}
|
||||
|
||||
.el-card:hover {
|
||||
box-shadow: var(--app-shadow-md);
|
||||
border-color: var(--app-accent-soft);
|
||||
}
|
||||
|
||||
.card-box {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
76
src/assets/styles/components/_legacy-utilities.scss
Normal file
76
src/assets/styles/components/_legacy-utilities.scss
Normal file
@@ -0,0 +1,76 @@
|
||||
/* 工具类 */
|
||||
|
||||
.pt5 {
|
||||
padding-top: 5px;
|
||||
}
|
||||
|
||||
.pr5 {
|
||||
padding-right: 5px;
|
||||
}
|
||||
|
||||
.pl5 {
|
||||
padding-left: 5px;
|
||||
}
|
||||
|
||||
.pb5 {
|
||||
padding-bottom: 5px;
|
||||
}
|
||||
|
||||
.mt5 {
|
||||
margin-top: 5px;
|
||||
}
|
||||
|
||||
.mr5 {
|
||||
margin-right: 5px;
|
||||
}
|
||||
|
||||
.mb5 {
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
.mb8 {
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
.ml5 {
|
||||
margin-left: 5px;
|
||||
}
|
||||
|
||||
.mt10 {
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
.mr10 {
|
||||
margin-right: 10px;
|
||||
}
|
||||
|
||||
.mb10 {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.ml10 {
|
||||
margin-left: 10px;
|
||||
}
|
||||
|
||||
.mt20 {
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
.mr20 {
|
||||
margin-right: 20px;
|
||||
}
|
||||
|
||||
.mb20 {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.ml20 {
|
||||
margin-left: 20px;
|
||||
}
|
||||
|
||||
.el-dialog.scrollbar .el-dialog__body {
|
||||
overflow: auto;
|
||||
overflow-x: hidden;
|
||||
max-height: 70vh;
|
||||
padding: 14px 22px 4px;
|
||||
}
|
||||
9
src/assets/styles/components/_misc.scss
Normal file
9
src/assets/styles/components/_misc.scss
Normal file
@@ -0,0 +1,9 @@
|
||||
.link-type,
|
||||
.link-type:focus {
|
||||
color: var(--el-color-primary);
|
||||
cursor: pointer;
|
||||
|
||||
&:hover {
|
||||
color: var(--app-accent-strong);
|
||||
}
|
||||
}
|
||||
200
src/assets/styles/components/_page-shell.scss
Normal file
200
src/assets/styles/components/_page-shell.scss
Normal file
@@ -0,0 +1,200 @@
|
||||
/* Shared vertical page shell spacing helpers. */
|
||||
|
||||
.p-2 {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 12px;
|
||||
}
|
||||
|
||||
.app-main > .p-2 {
|
||||
padding: 0 !important;
|
||||
margin: 0 !important;
|
||||
}
|
||||
|
||||
.p-2 > .el-row,
|
||||
.p-2 > .el-card,
|
||||
.p-2 > .search-wrap,
|
||||
.p-2 > div,
|
||||
.p-2 > section {
|
||||
margin-bottom: 0 !important;
|
||||
}
|
||||
|
||||
// --- CRUD / 树表页用混入(在 .vue 内 @use 后 @include) ---
|
||||
|
||||
@mixin action-link-buttons($background: rgba(53, 109, 255, 0.08)) {
|
||||
.data-table {
|
||||
:deep(.el-button.is-link) {
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
border-radius: 10px;
|
||||
background: $background;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@mixin toolbar-responsive($mobile-breakpoint: 900px) {
|
||||
@media (max-width: $mobile-breakpoint) {
|
||||
.toolbar-shell {
|
||||
align-items: flex-start;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@mixin content-stack($gap: 12px) {
|
||||
.content-main {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: $gap;
|
||||
}
|
||||
}
|
||||
|
||||
@mixin dept-tree-panel($padding-top: 6px) {
|
||||
.dept-tree {
|
||||
padding-top: $padding-top;
|
||||
}
|
||||
}
|
||||
|
||||
@mixin collapsible-tree-layout($mobile-breakpoint: 900px) {
|
||||
.content-grid,
|
||||
.selector-layout {
|
||||
align-items: stretch;
|
||||
}
|
||||
|
||||
.tree-panel-col,
|
||||
.tree-content-col {
|
||||
min-width: 0;
|
||||
transition:
|
||||
max-width 0.24s ease,
|
||||
flex-basis 0.24s ease;
|
||||
}
|
||||
|
||||
.tree-panel-col.is-collapsed {
|
||||
max-width: 56px;
|
||||
flex: 0 0 56px;
|
||||
}
|
||||
|
||||
.tree-content-col.is-tree-collapsed {
|
||||
max-width: calc(100% - 56px);
|
||||
flex: 0 0 calc(100% - 56px);
|
||||
}
|
||||
|
||||
.tree-panel-shell,
|
||||
.side-panel {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.tree-panel-shell {
|
||||
--tree-panel-max-height: 620px;
|
||||
}
|
||||
|
||||
.tree-panel-shell :deep(.el-card__header) {
|
||||
display: block;
|
||||
padding: 12px 16px !important;
|
||||
}
|
||||
|
||||
.tree-panel-shell :deep(.el-card__body) {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
height: var(--tree-panel-max-height);
|
||||
min-height: 0;
|
||||
max-height: var(--tree-panel-max-height);
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.tree-panel-header {
|
||||
cursor: pointer;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
.tree-panel-header::after {
|
||||
display: block;
|
||||
width: 9px;
|
||||
min-width: 9px;
|
||||
height: 9px;
|
||||
margin-left: auto;
|
||||
flex-shrink: 0;
|
||||
transform-origin: center;
|
||||
transform: rotate(135deg);
|
||||
}
|
||||
|
||||
.tree-panel-header.is-collapsed {
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.side-panel.is-collapsed :deep(.el-card__body) {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.dept-tree,
|
||||
.selector-tree {
|
||||
flex: 1 1 auto;
|
||||
min-height: 180px;
|
||||
max-height: 100%;
|
||||
overflow-y: auto;
|
||||
overflow-x: hidden;
|
||||
padding-right: 4px;
|
||||
scrollbar-width: thin;
|
||||
}
|
||||
|
||||
.dept-tree::-webkit-scrollbar,
|
||||
.selector-tree::-webkit-scrollbar {
|
||||
width: 6px;
|
||||
}
|
||||
|
||||
.dept-tree::-webkit-scrollbar-thumb,
|
||||
.selector-tree::-webkit-scrollbar-thumb {
|
||||
border-radius: 999px;
|
||||
background: var(--app-text-muted);
|
||||
opacity: 0.55;
|
||||
}
|
||||
|
||||
.dept-tree::-webkit-scrollbar-track,
|
||||
.selector-tree::-webkit-scrollbar-track {
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
.tree-panel-shell.is-collapsed :deep(.el-card__header) {
|
||||
padding: 12px 0 !important;
|
||||
}
|
||||
|
||||
.tree-panel-shell.is-collapsed .tree-panel-header::after {
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
.tree-panel-shell.is-collapsed .tree-panel-header::after {
|
||||
transform: rotate(-45deg);
|
||||
}
|
||||
|
||||
@media (max-width: $mobile-breakpoint) {
|
||||
.tree-panel-col,
|
||||
.tree-content-col {
|
||||
max-width: 100%;
|
||||
flex: 0 0 100%;
|
||||
}
|
||||
|
||||
.tree-panel-shell {
|
||||
--tree-panel-max-height: 420px;
|
||||
}
|
||||
|
||||
.side-panel.is-collapsed {
|
||||
height: auto;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@mixin table-crud-page($mobile-breakpoint: 900px, $background: rgba(53, 109, 255, 0.08)) {
|
||||
@include action-link-buttons($background);
|
||||
@include toolbar-responsive($mobile-breakpoint);
|
||||
}
|
||||
|
||||
@mixin tree-table-crud-page(
|
||||
$mobile-breakpoint: 900px,
|
||||
$gap: 12px,
|
||||
$tree-padding-top: 6px,
|
||||
$background: rgba(53, 109, 255, 0.08)
|
||||
) {
|
||||
@include content-stack($gap);
|
||||
@include dept-tree-panel($tree-padding-top);
|
||||
@include collapsible-tree-layout($mobile-breakpoint);
|
||||
@include table-crud-page($mobile-breakpoint, $background);
|
||||
}
|
||||
89
src/assets/styles/components/_query-form.scss
Normal file
89
src/assets/styles/components/_query-form.scss
Normal file
@@ -0,0 +1,89 @@
|
||||
/* Shared search and filter form layout. */
|
||||
|
||||
.query-form {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 10px 14px;
|
||||
align-items: end;
|
||||
}
|
||||
|
||||
.query-form .el-form-item {
|
||||
flex: 0 0 auto;
|
||||
margin-bottom: 0;
|
||||
margin-right: 0;
|
||||
display: flex;
|
||||
align-items: flex-end;
|
||||
min-width: 0;
|
||||
}
|
||||
|
||||
.query-form .el-form-item__content {
|
||||
min-width: 0;
|
||||
}
|
||||
|
||||
.query-form .el-form-item:last-child {
|
||||
margin-left: auto;
|
||||
align-self: end;
|
||||
}
|
||||
|
||||
.query-form .el-form-item:last-child .el-form-item__content {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: flex-end;
|
||||
gap: 6px;
|
||||
flex-wrap: nowrap;
|
||||
}
|
||||
|
||||
.query-form .el-form-item:last-child .el-button {
|
||||
margin-left: 0 !important;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.query-form .el-form-item:last-child .el-button + .el-button {
|
||||
margin-left: 0 !important;
|
||||
}
|
||||
|
||||
.query-form .el-input__wrapper,
|
||||
.query-form .el-select__wrapper,
|
||||
.query-form .el-textarea__inner,
|
||||
.query-form .el-date-editor,
|
||||
.query-form .el-range-editor,
|
||||
.query-form .el-cascader .el-input__wrapper,
|
||||
.query-form .el-input-number,
|
||||
.query-form .el-input-number__decrease,
|
||||
.query-form .el-input-number__increase {
|
||||
border-radius: 12px !important;
|
||||
}
|
||||
|
||||
.query-form .el-button {
|
||||
border-radius: 10px !important;
|
||||
}
|
||||
|
||||
@media (max-width: 900px) {
|
||||
.query-form {
|
||||
gap: 10px 12px;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 640px) {
|
||||
.query-form {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: stretch;
|
||||
}
|
||||
|
||||
.query-form .el-form-item {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.query-form .el-input,
|
||||
.query-form .el-select,
|
||||
.query-form .el-date-editor,
|
||||
.query-form .el-cascader,
|
||||
.query-form .el-input-number {
|
||||
width: 100% !important;
|
||||
}
|
||||
|
||||
.query-form .el-form-item:last-child {
|
||||
margin-left: 0;
|
||||
}
|
||||
}
|
||||
83
src/assets/styles/components/_search-panel.scss
Normal file
83
src/assets/styles/components/_search-panel.scss
Normal file
@@ -0,0 +1,83 @@
|
||||
/* Search panel, table actions, and responsive panel shells. */
|
||||
|
||||
// --- 表格工具列链接按钮(全局) ---
|
||||
.data-table .el-button.is-link {
|
||||
width: 28px !important;
|
||||
height: 28px !important;
|
||||
min-width: 28px !important;
|
||||
padding: 0 !important;
|
||||
border-radius: 10px !important;
|
||||
background: var(--app-accent-soft) !important;
|
||||
}
|
||||
|
||||
.data-table .el-button.is-link + .el-button.is-link {
|
||||
margin-left: 4px !important;
|
||||
}
|
||||
|
||||
.search-wrap {
|
||||
margin-bottom: 0 !important;
|
||||
}
|
||||
|
||||
.search-panel {
|
||||
.el-card__header {
|
||||
display: block;
|
||||
padding: 12px 16px !important;
|
||||
}
|
||||
|
||||
.el-card__body {
|
||||
padding-top: 16px !important;
|
||||
overflow: hidden;
|
||||
max-height: 560px;
|
||||
opacity: 1;
|
||||
transition:
|
||||
max-height 0.32s cubic-bezier(0.22, 1, 0.36, 1),
|
||||
opacity 0.24s ease,
|
||||
padding-top 0.24s ease,
|
||||
padding-bottom 0.24s ease;
|
||||
}
|
||||
}
|
||||
|
||||
.search-panel.is-collapsed {
|
||||
.el-card__body {
|
||||
max-height: 0;
|
||||
opacity: 0;
|
||||
padding-top: 0 !important;
|
||||
padding-bottom: 0 !important;
|
||||
pointer-events: none;
|
||||
}
|
||||
}
|
||||
|
||||
.search-panel-toggle {
|
||||
cursor: pointer;
|
||||
user-select: none;
|
||||
transition: color 0.24s ease;
|
||||
|
||||
&:hover {
|
||||
color: var(--app-accent-strong);
|
||||
}
|
||||
|
||||
&::after {
|
||||
content: '';
|
||||
margin-left: auto;
|
||||
width: 9px;
|
||||
height: 9px;
|
||||
border-right: 2px solid currentColor;
|
||||
border-bottom: 2px solid currentColor;
|
||||
color: var(--app-text-muted);
|
||||
transform: rotate(-135deg);
|
||||
transition:
|
||||
transform 0.24s ease,
|
||||
color 0.24s ease;
|
||||
}
|
||||
}
|
||||
|
||||
.search-panel.is-collapsed .search-panel-toggle::after {
|
||||
transform: rotate(45deg);
|
||||
}
|
||||
|
||||
:global(html.dark) {
|
||||
.tree-border {
|
||||
background: var(--app-surface-bg);
|
||||
border-color: var(--app-surface-border);
|
||||
}
|
||||
}
|
||||
79
src/assets/styles/components/_selector-dialog.scss
Normal file
79
src/assets/styles/components/_selector-dialog.scss
Normal file
@@ -0,0 +1,79 @@
|
||||
/* Reusable scoped mixins for selector dialogs backed by cards and vxe tables. */
|
||||
|
||||
/* 为多个根选择器统一设置 gap */
|
||||
@mixin shell-gap($selectors...) {
|
||||
@each $selector in $selectors {
|
||||
#{$selector} {
|
||||
gap: 12px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* 卡片区域撑满弹窗 */
|
||||
@mixin card-shell {
|
||||
.selector-card {
|
||||
height: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
/* 按弹窗根 class 收紧 body 顶内边距 */
|
||||
@mixin dialog-body-padding($dialog-class) {
|
||||
.#{$dialog-class} :deep(.el-dialog__body) {
|
||||
padding-top: 12px;
|
||||
}
|
||||
}
|
||||
|
||||
/* 头部标题与已选 tag 换行、窄屏左对齐 */
|
||||
@mixin selector-header-tags($mobile-breakpoint: 768px) {
|
||||
.selector-header {
|
||||
align-items: flex-start;
|
||||
}
|
||||
|
||||
.selector-tags {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
justify-content: flex-end;
|
||||
gap: 6px;
|
||||
max-width: min(100%, 520px);
|
||||
}
|
||||
|
||||
.selector-tags :deep(.el-tag) {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
@media (max-width: $mobile-breakpoint) {
|
||||
.selector-tags {
|
||||
justify-content: flex-start;
|
||||
max-width: 100%;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* vxe 表格圆角与表头色,与全局表格 token 一致 */
|
||||
@mixin selector-table {
|
||||
.selector-table {
|
||||
border-radius: 10px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.selector-table :deep(.vxe-table--render-default) {
|
||||
border-radius: 10px;
|
||||
color: var(--app-text-title);
|
||||
}
|
||||
|
||||
.selector-table :deep(.vxe-header--column) {
|
||||
background: var(--tableHeaderBg);
|
||||
color: var(--tableHeaderTextColor);
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.selector-table :deep(.vxe-body--column),
|
||||
.selector-table :deep(.vxe-header--column) {
|
||||
border-color: var(--app-surface-border);
|
||||
}
|
||||
|
||||
.selector-table :deep(.vxe-body--row.row--hover),
|
||||
.selector-table :deep(.vxe-body--row:hover) {
|
||||
background-color: rgba(53, 109, 255, 0.05);
|
||||
}
|
||||
}
|
||||
84
src/assets/styles/components/_table-toolbar.scss
Normal file
84
src/assets/styles/components/_table-toolbar.scss
Normal file
@@ -0,0 +1,84 @@
|
||||
/* Table headers and toolbar action layouts. */
|
||||
|
||||
.top-right-btn {
|
||||
margin-left: auto;
|
||||
}
|
||||
|
||||
.panel-heading {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
gap: 12px;
|
||||
}
|
||||
|
||||
.panel-heading h3,
|
||||
.table-heading h3 {
|
||||
margin: 0;
|
||||
font-size: 15px;
|
||||
letter-spacing: 0;
|
||||
color: var(--app-text-title);
|
||||
}
|
||||
|
||||
.panel-kicker {
|
||||
display: none;
|
||||
color: var(--app-accent-strong);
|
||||
font-size: 11px;
|
||||
font-weight: 600;
|
||||
letter-spacing: 0.04em;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
.toolbar-shell {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
gap: 10px;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.table-heading p {
|
||||
margin: 4px 0 0;
|
||||
font-size: 13px;
|
||||
color: var(--app-text-muted);
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
.toolbar-actions {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
flex-wrap: nowrap;
|
||||
gap: 8px;
|
||||
margin-left: auto;
|
||||
white-space: nowrap;
|
||||
overflow-x: auto;
|
||||
overflow-y: hidden;
|
||||
padding-bottom: 2px;
|
||||
}
|
||||
|
||||
.toolbar-actions::-webkit-scrollbar {
|
||||
height: 0;
|
||||
}
|
||||
|
||||
.toolbar-actions > * {
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.toolbar-actions .top-right-btn {
|
||||
margin-left: 0;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.toolbar-actions .el-button + .el-button,
|
||||
.toolbar-actions .el-dropdown + .el-button,
|
||||
.toolbar-actions .el-button + .el-dropdown,
|
||||
.toolbar-actions .el-dropdown + .el-dropdown,
|
||||
.toolbar-actions .top-right-btn + .el-button,
|
||||
.toolbar-actions .el-button + .top-right-btn,
|
||||
.toolbar-actions .top-right-btn + .el-dropdown,
|
||||
.toolbar-actions .el-dropdown + .top-right-btn {
|
||||
margin-left: 0 !important;
|
||||
}
|
||||
|
||||
.table-panel .toolbar-actions .el-button:not(.is-circle):not(.is-link) {
|
||||
border-radius: 10px !important;
|
||||
}
|
||||
49
src/assets/styles/components/_theme-helpers.scss
Normal file
49
src/assets/styles/components/_theme-helpers.scss
Normal file
@@ -0,0 +1,49 @@
|
||||
/* Legacy theme helper classes and color accents. */
|
||||
|
||||
.el-button--cyan.is-active,
|
||||
.el-button--cyan:active {
|
||||
background: #20b2aa;
|
||||
border-color: #20b2aa;
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
.el-button--cyan:focus,
|
||||
.el-button--cyan:hover {
|
||||
background: #48d1cc;
|
||||
border-color: #48d1cc;
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
.el-button--cyan {
|
||||
background-color: #20b2aa;
|
||||
border-color: #20b2aa;
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
.text-navy {
|
||||
color: #1ab394;
|
||||
}
|
||||
|
||||
.text-primary {
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
.text-success {
|
||||
color: #1c84c6;
|
||||
}
|
||||
|
||||
.text-info {
|
||||
color: #23c6c8;
|
||||
}
|
||||
|
||||
.text-warning {
|
||||
color: #f8ac59;
|
||||
}
|
||||
|
||||
.text-danger {
|
||||
color: #ed5565;
|
||||
}
|
||||
|
||||
.text-muted {
|
||||
color: #888888;
|
||||
}
|
||||
@@ -1,149 +0,0 @@
|
||||
|
||||
.el-collapse {
|
||||
.collapse__title {
|
||||
font-weight: 600;
|
||||
padding: 0 8px;
|
||||
font-size: 1.2em;
|
||||
line-height: 1.1em;
|
||||
}
|
||||
.el-collapse-item__content {
|
||||
padding: 0 8px;
|
||||
}
|
||||
}
|
||||
|
||||
.el-divider--horizontal {
|
||||
margin-bottom: 10px;
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
.el-breadcrumb__inner,
|
||||
.el-breadcrumb__inner a {
|
||||
font-weight: 400 !important;
|
||||
}
|
||||
|
||||
.el-upload {
|
||||
input[type='file'] {
|
||||
display: none !important;
|
||||
}
|
||||
}
|
||||
|
||||
.el-upload__input {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.cell {
|
||||
.el-tag {
|
||||
margin-right: 0px;
|
||||
}
|
||||
}
|
||||
|
||||
.small-padding {
|
||||
.cell {
|
||||
padding-left: 5px;
|
||||
padding-right: 5px;
|
||||
}
|
||||
}
|
||||
|
||||
.fixed-width {
|
||||
.el-button--mini {
|
||||
padding: 7px 10px;
|
||||
width: 60px;
|
||||
}
|
||||
}
|
||||
|
||||
.status-col {
|
||||
.cell {
|
||||
padding: 0 10px;
|
||||
text-align: center;
|
||||
|
||||
.el-tag {
|
||||
margin-right: 0px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*-------------Dialog-------------**/
|
||||
.el-overlay {
|
||||
overflow: hidden;
|
||||
|
||||
.el-overlay-dialog {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
|
||||
.el-dialog {
|
||||
margin: 0 auto !important;
|
||||
|
||||
.el-dialog__body {
|
||||
padding: 15px !important;
|
||||
}
|
||||
.el-dialog__header {
|
||||
padding: 16px 16px 8px 16px;
|
||||
box-sizing: border-box;
|
||||
border-bottom: 1px solid var(--brder-color);
|
||||
margin-right: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.el-dialog__body {
|
||||
max-height: calc(90vh - 111px) !important;
|
||||
overflow-y: auto;
|
||||
overflow-x: hidden;
|
||||
}
|
||||
|
||||
// refine element ui upload
|
||||
.upload-container {
|
||||
.el-upload {
|
||||
width: 100%;
|
||||
|
||||
.el-upload-dragger {
|
||||
width: 100%;
|
||||
height: 200px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// dropdown
|
||||
.el-dropdown-menu {
|
||||
a {
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
|
||||
// fix date-picker ui bug in filter-item
|
||||
.el-range-editor.el-input__inner {
|
||||
display: inline-flex !important;
|
||||
}
|
||||
|
||||
// to fix el-date-picker css style
|
||||
.el-range-separator {
|
||||
box-sizing: content-box;
|
||||
}
|
||||
|
||||
.el-menu--collapse > div > .el-submenu > .el-submenu__title .el-submenu__icon-arrow {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.el-dropdown .el-dropdown-link {
|
||||
color: var(--el-color-primary) !important;
|
||||
}
|
||||
|
||||
/* 当 el-form 的 inline 属性为 true 时 */
|
||||
/* 设置 label 的宽度默认为 68px */
|
||||
.el-form--inline .el-form-item__label {
|
||||
width: 68px;
|
||||
}
|
||||
|
||||
/* 设置 el-select 的宽度默认为 240px */
|
||||
.el-form--inline .el-select {
|
||||
width: 240px;
|
||||
}
|
||||
|
||||
/* 设置 el-input 的宽度默认为 240px */
|
||||
.el-form--inline .el-input {
|
||||
width: 240px;
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user