first commit

This commit is contained in:
zc
2026-06-12 17:09:39 +08:00
commit ae41b388cb
756 changed files with 273542 additions and 0 deletions

21
.env.development Normal file
View File

@@ -0,0 +1,21 @@
# 环境变量 (命名必须以 VITE_ 开头)
# 接口前缀
VITE_API_PREFIX = '/dev-api'
# 接口地址
VITE_API_BASE_URL = 'http://localhost:6609'
# 接口地址 (WebSocket)
VITE_API_WS_URL = 'ws://localhost:6609'
# 地址前缀
VITE_BASE = '/'
# 是否开启开发者工具
VITE_OPEN_DEVTOOLS = false
# 应用配置面板
VITE_APP_SETTING = true
# 终端ID
VITE_CLIENT_ID = 'ef51c9a3e9046c4f2ea45142c8a8344a'

17
.env.production Normal file
View File

@@ -0,0 +1,17 @@
# 环境变量 (命名必须以 VITE_ 开头)
# 是否在打包时启用 Mock
VITE_BUILD_MOCK = false
# 接口地址
VITE_API_BASE_URL = 'https://api.continew.top'
VITE_API_WS_URL = 'wss://api.continew.top'
# 地址前缀
VITE_BASE = '/'
# 应用配置面板
VITE_APP_SETTING = true
# 终端ID
VITE_CLIENT_ID = 'ef51c9a3e9046c4f2ea45142c8a8344a'

22
.env.test Normal file
View File

@@ -0,0 +1,22 @@
# 环境变量 (命名必须以 VITE_ 开头)
# 是否在打包时启用 Mock
VITE_BUILD_MOCK = true
# 接口前缀
VITE_API_PREFIX = '/test-api'
# 接口地址
VITE_API_BASE_URL = 'http://localhost:6609'
# 地址前缀
VITE_BASE = '/test'
# 是否开启开发者工具
VITE_OPEN_DEVTOOLS = true
# 应用配置面板
VITE_APP_SETTING = false
# 终端ID
VITE_CLIENT_ID = 'ef51c9a3e9046c4f2ea45142c8a8344a'

5
.gitignore vendored Normal file
View File

@@ -0,0 +1,5 @@
node_modules/
dist/
.idea/
*.zip
package-lock.json

BIN
.image/qrcode.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 211 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 248 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 250 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 250 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 177 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 183 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 130 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 168 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 322 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 185 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 244 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 131 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 139 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 161 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 129 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 145 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 131 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

1
.npmrc Normal file
View File

@@ -0,0 +1 @@
package-lock=true

296
CHANGELOG.md Normal file
View File

@@ -0,0 +1,296 @@
## [v3.5.0](https://github.com/continew-org/continew-admin-ui/compare/v3.4.1...v3.5.0) (2025-03-05)
### ✨ 新特性
* 新增应用配置开关属性,迁移主题配置至 `src/config/setting.ts`,新增色弱模式与哀悼模式 ([Gitee#40](https://gitee.com/continew/continew-admin-ui/pulls/40)) ([f64a716](https://github.com/continew-org/continew-admin-ui/commit/f64a7163e5f40da0e838f1ff0659042f874183a0)) ([22fb597](https://github.com/continew-org/continew-admin-ui/commit/22fb597ac863f095c74fb9a24febf7490f1d2e07))
* 【generator】代码生成、预览支持批量 ([f292db5](https://github.com/continew-org/continew-admin-ui/commit/f292db55af7c7ee21949c7109537a96dbf6443cc))
* 路由菜单组件路径新增下拉选择 ([Gitee#41](https://gitee.com/continew/continew-admin-ui/pulls/41)) ([438c2af](https://github.com/continew-org/continew-admin-ui/commit/438c2af4a656b37a61cc5b102f9aab87b14bb6bd))
* 🔥新增终端管理 ([Gitee#43](https://gitee.com/continew/continew-admin-ui/pulls/43)) ([bc3a5cf](https://github.com/continew-org/continew-admin-ui/commit/bc3a5cff910e8f136151a49ccc34fbbf75d7d642)) ([6ff3072](https://github.com/continew-org/continew-admin-ui/commit/6ff307251fd1fcd69347d300533f1c5724add29f)) ([dc6e0a4](https://github.com/continew-org/continew-admin-ui/commit/dc6e0a4ff6d44ed2f7eca6adbc775f728e6ea3b7))
* 🔥新增分割面板组件(左树右表) ([Gitee#44](https://gitee.com/continew/continew-admin-ui/pulls/44)) ([b98febc](https://github.com/continew-org/continew-admin-ui/commit/b98febcff5e3ecece213ab1689e5d1c03d4ab6b9)) ([8c55504](https://github.com/continew-org/continew-admin-ui/commit/8c55504bf8e94ab27dddeef81dbc834eb91289a9)) ([046f1f7](https://github.com/continew-org/continew-admin-ui/commit/046f1f7492a13b7a018fc6e05581b3e5bc37a96d)) ([28ac501](https://github.com/continew-org/continew-admin-ui/commit/28ac501f4af419e3de198d04b081a9d82f396997)) ([5ab7cdd](https://github.com/continew-org/continew-admin-ui/commit/5ab7cdd1e0781ba2af363d0739e48a92ea7ce9ba))
* 部门管理新增组织架构视图 ([Gitee#45](https://gitee.com/continew/continew-admin-ui/pulls/45)) ([4b61e40](https://github.com/continew-org/continew-admin-ui/commit/4b61e4027e770b63e6301335d5add390d9afef50))
* 【generator】源项目内生成代码 ([GitHub#44](https://github.com/continew-org/continew-admin-ui/pull/44)) ([14cc54d](https://github.com/continew-org/continew-admin-ui/commit/14cc54d97f9958fd6f3d60739fe46523a2a837d2))
* 新增左树右表布局组件GiLeftRightPane封装分割面板组件GiSplitPaneButton封装以及代码优化同步 GiDemo 更新) ([ccfec21](https://github.com/continew-org/continew-admin-ui/commit/ccfec2155f4a27452f090e14c172e05984ad7423))
* add search component ([GitHub#49](https://github.com/continew-org/continew-admin-ui/pull/49)) ([21d0b1e](https://github.com/continew-org/continew-admin-ui/commit/21d0b1e3fb78fa94469d3a01dd921e68b02f22a1)) ([b04a85f](https://github.com/continew-org/continew-admin-ui/commit/b04a85fbc5c80f095c20216455182170e2f495af))
### 💎 功能优化
- 优化菜单表单布局 ([84be614](https://github.com/continew-org/continew-admin-ui/commit/84be614d4c6e640d1c18faecda6c405e2356d082))
- http util and route store ([GitHub#43](https://github.com/continew-org/continew-admin-ui/pull/43)) ([d3aeca8](https://github.com/continew-org/continew-admin-ui/commit/d3aeca81d850d4d13af7fec3c6a7a4690068200c))
- 优化字典操作按钮显示逻辑 ([113c6e3](https://github.com/continew-org/continew-admin-ui/commit/113c6e3a718f50ad5195846d4e0cc44a81950982))
- 重命名表格样式(同步 GiDemo 更新) ([df73245](https://github.com/continew-org/continew-admin-ui/commit/df732455d0a79eac6ecdee7eda4c85b16065bb7f))
- GiForm 新增 show 属性配置,优先级比 hide 高(同步 GiDemo 更新) ([6595a77](https://github.com/continew-org/continew-admin-ui/commit/6595a77317ee922d60354a004d45e7c27f08789d))
- 🔥使用左树右表重构角色管理,角色详情增加用户管理,功能权限扁平化 ([cfa20ac](https://github.com/continew-org/continew-admin-ui/commit/cfa20ac765eb5638f1687ede91a8efb78d6a5d99)) ([bc063e6](https://github.com/continew-org/continew-admin-ui/commit/bc063e624c7fd15657354df9c2eafdea1012ebd0))
- 优化树列表更多按钮样式PR by 番茄大佬) ([3b1f1aa](https://github.com/continew-org/continew-admin-ui/commit/3b1f1aaee47083f84f41557a00364d94c964b44e))
- 🔥优化系统配置 ([fbec732](https://github.com/continew-org/continew-admin-ui/commit/fbec7321079717cda709230e1be145131e922466))
- 🔥优化 GiForm同步 GiDemo 更新) ([47769f9](https://github.com/continew-org/continew-admin-ui/commit/47769f9ad84d66c53787f1d307aafc0f938a7b33)) ([d1e5ecf](https://github.com/continew-org/continew-admin-ui/commit/d1e5ecf81d7122ccd0eceb162578ebddc4105b72))
- 完善部分输入表单项字符长度限制 ([e8249bc](https://github.com/continew-org/continew-admin-ui/commit/e8249bc4d2343078849d7f22b9d1f67629c5ec08))
- 🔥重构存储管理页面,分页列表 => 无分页卡片 ([25da301](https://github.com/continew-org/continew-admin-ui/commit/25da3019a3d9e7e5fd733dbb340b80f67da31ba9))
### 🐛 问题修复
- 🔥修复 AccountLogin 组件多次初始化的问题(图形验证码接口被调用 2 次) ([6b4f0d1](https://github.com/continew-org/continew-admin-ui/commit/6b4f0d1e99ffd6f53201eea412b6cb42ab7d0b84))
- 修复 GiTable 插槽类型不完全问题(同步 GiDemo 更新) ([4b5536a](https://github.com/continew-org/continew-admin-ui/commit/4b5536a0b2d1c100785ca9fef3a51f0c8d632efb))
- 【schedule】修复无法打开 CRON 生成器的问题 ([7f503f3](https://github.com/continew-org/continew-admin-ui/commit/7f503f3af35a34f0e097031961cf39787a7c1faf))
- 消除面包屑组件的控制台警告(同步 GiDemo 更新) ([53fd8a4](https://github.com/continew-org/continew-admin-ui/commit/53fd8a465a1dfd89fdf856ab2f17e8ada790fbd8))
- 🔥验证码过期时间对比改为服务器时间 ([GitHub#39](https://github.com/continew-org/continew-admin-ui/pull/39)) ([f157130](https://github.com/continew-org/continew-admin-ui/commit/f157130b2340fd963249192e0873b4fcd3038d33))
- divider background in dark mode ([GitHub#40](https://github.com/continew-org/continew-admin-ui/pull/40)) ([eb48157](https://github.com/continew-org/continew-admin-ui/commit/eb481572adcd786072b0e33aa42dcb743788296c))
- 🔥修复文件无法直接下载问题 ([91092f1](https://github.com/continew-org/continew-admin-ui/commit/91092f1cf3355da69ada5fd5edd2a17b6c747d1e))
- dark toggle and usedict with fix dict can't persist ([GitHub#47](https://github.com/continew-org/continew-admin-ui/pull/47)) ([1c743fb](https://github.com/continew-org/continew-admin-ui/commit/1c743fb0978d470b014f9ec6e5986e82888a8950)) ([00b47da](https://github.com/continew-org/continew-admin-ui/commit/00b47dae6fece3b4ec1ae46a7a084d32d83838e0))
- 修复Sass的@import规则已弃用警告问题 ([Gitee#47](https://gitee.com/continew/continew-admin-ui/pulls/47)) ([d28b92e](https://github.com/continew-org/continew-admin-ui/commit/d28b92ee898beb89e380c6f61b5d2e822ac0ea89))
## [v3.4.1](https://github.com/continew-org/continew-admin-ui/compare/v3.4.0...v3.4.1) (2024-12-08)
### ✨ 新特性
* 标签页新增重新加载、关闭左侧操作 ([b030921](https://github.com/continew-org/continew-admin-ui/commit/b030921189e9093f07369cebebdfa8b12b3fb153))
* 新增关于项目菜单(该菜单从动态路由调整为静态,且不再需要鉴权) ([7fa4297](https://github.com/continew-org/continew-admin-ui/commit/7fa42975cfa32e1fb8eeca26e3a06be2e10d2aa3)) ([2191335](https://github.com/continew-org/continew-admin-ui/commit/21913350e7d8dfd0a06464efcf27d2d234270ab0))
* GiForm 支持 label 自定义渲染,以及插槽自定义渲染(同步 GiDemo 更新) ([c2463fc](https://github.com/continew-org/continew-admin-ui/commit/c2463fc4502acbd9274f1080f86a74ca43951927))
* 新增验证码配置开关 ([4cd892e](https://github.com/continew-org/continew-admin-ui/commit/4cd892e288c08b04f038bf6034c14ec022c0e919)) ([51a2168](https://github.com/continew-org/continew-admin-ui/commit/51a21688223346877f00f5142e277682e5774158)) (Gitee#37@@aiming317)
* 面包屑新增过渡动画效果(同步 GiDemo 更新) ([abacb26](https://github.com/continew-org/continew-admin-ui/commit/abacb267aaf96516480255f509b07b32d44abd27))
### 💎 功能优化
- 拆分并调整路由守卫,优化顶部进度条展示 ([e8941ad](https://github.com/continew-org/continew-admin-ui/commit/e8941adde4c5156bbe7f2d95f013add353aee61b))
- 移除部分异步组件加载 ([61ef692](https://github.com/continew-org/continew-admin-ui/commit/61ef692c8398b4f352f52f11a82d64dd9f7fa8e3))
- 重构系统配置页面 ([930227e](https://github.com/continew-org/continew-admin-ui/commit/930227ea0cc6f17545841a5548a91202fa0bc2a1))
- useForm => useResetReactive同步 GiDemo 更新) ([6c45483](https://github.com/continew-org/continew-admin-ui/commit/6c45483fae53677c57b9dc0c6a1e4c42b659d151)) ([7fe3ffe](https://github.com/continew-org/continew-admin-ui/commit/7fe3ffe9dab318d744d2dd8d7d1e793efdbc97d1))
- 优化搜索输入框 input => input-search ([7402de5](https://github.com/continew-org/continew-admin-ui/commit/7402de5695140b5d4a6228fd37ef23c793c8e5e7))
- 优化系统日志、系统配置标签样式 ([b82ca81](https://github.com/continew-org/continew-admin-ui/commit/b82ca81b79b56bfa728b7c467d151724b43792b2))
- 调整 eslint.config.js ([99f8edb](https://github.com/continew-org/continew-admin-ui/commit/99f8edb7295f913e36cd28c41ac4a6b536c982d9))
- 角色功能权限第三级扁平化处理 ([43dd512](https://github.com/continew-org/continew-admin-ui/commit/43dd512b8a359d794a2ad48dd4e05c22f7223391)) (Gitee#38@kiki1373639299)
- 优化路由守卫代码(同步 GiDemo 更新) ([7c509fa](https://github.com/continew-org/continew-admin-ui/commit/7c509fa7372de5bf60895bc5e5b66cc6355c8d97))
### 🐛 问题修复
- 修复 GiCellTags 组件的空数据问题 ([068d959](https://github.com/continew-org/continew-admin-ui/commit/068d959d0380f85053d6f001621990309c904519)) (Gitee#35@CoderZone)
- 修复快捷操作代码生成链接错误 ([246d638](https://github.com/continew-org/continew-admin-ui/commit/246d638a8f66bd5a98091bd12cc78f4a2083dd04))
- 修复行为验证码接口重复请求问题 ([be4356f](https://github.com/continew-org/continew-admin-ui/commit/be4356fa041108c46eade7e1f81897346338026b))
- 修复用户选择器超级管理员回显异常的问题 ([3f871e1](https://github.com/continew-org/continew-admin-ui/commit/3f871e102acee6481bfe3fb095279063713fe6e5)) (Gitee#36@kiki1373639299)
## [v3.4.0](https://github.com/continew-org/continew-admin-ui/compare/v3.3.0...v3.4.0) (2024-11-18)
### ✨ 新特性
* 新增全局水印配置 支持开启全局水印,支持设置水印信息(不设置则默认显示昵称+用户名) ([8d8d79e](https://github.com/continew-org/continew-admin-ui/commit/8d8d79e5686a7b87bf6d5b28983585bcc4ccd897)) (Gitee#19)
* 支持可视化生成 Cron 表达式 ([adcb9fe](https://github.com/continew-org/continew-admin-ui/commit/adcb9fed2a5388a1e86f6e86119f361e73d5d15f)) ([33020be](https://github.com/continew-org/continew-admin-ui/commit/33020beb36d22b34bb7ca7ae2d7f59272192211f)) ([6fde089](https://github.com/continew-org/continew-admin-ui/commit/6fde089ba62ea3b8659a872fa149bd517b7ab205)) ([921950b](https://github.com/continew-org/continew-admin-ui/commit/921950b7508befffe6d7414ff6d308340cb1004b)) (Gitee#23、24)
* 新增分析页(拆分仪表盘路由为工作台和分析页) ([2e15cf2](https://github.com/continew-org/continew-admin-ui/commit/2e15cf2d48a8359b4e8455539da8149758db2db9)) ([455f269](https://github.com/continew-org/continew-admin-ui/commit/455f2695c836559f4f1d23d59b2b862691af1c8a)) ([8a3f456](https://github.com/continew-org/continew-admin-ui/commit/8a3f456e547b57c3405dac52c8bb40b20df79a94)) ([6e39681](https://github.com/continew-org/continew-admin-ui/commit/6e39681f960ff271e6df01a129bbc7ff211799bd)) ([abb6d59](https://github.com/continew-org/continew-admin-ui/commit/abb6d59783645785ac5611523329ad36a9b6631b)) ([798dda9](https://github.com/continew-org/continew-admin-ui/commit/798dda94407c8d6d106fa72621e09ee01c110dd1))
* 重构工作台 ([7970940](https://github.com/continew-org/continew-admin-ui/commit/7970940f50791d81b793ceaebaaf9a68bc5d8e30)) ([b13f2ca](https://github.com/continew-org/continew-admin-ui/commit/b13f2ca91da004cb993a04fcb9f87004bb02b5c3)) ([fd1dfcf](https://github.com/continew-org/continew-admin-ui/commit/fd1dfcf3f484db0362dae58f6272b11573452451))
* 使用 vue-office 重构文件预览移除KKFileView ([51aceac](https://github.com/continew-org/continew-admin-ui/commit/51aceac988fcdc4a5795bd8cc8dffd7dcc7f7c39)) (Gitee#25)
* 公告支持设置通知范围,新增用户选择器组件 ([354b6bc](https://github.com/continew-org/continew-admin-ui/commit/354b6bc6d57c43951db512e9599549d32cdedc9c)) ([5ade6bc](https://github.com/continew-org/continew-admin-ui/commit/5ade6bcecf8c89ebc4260e7292cbbdfc5ac30fec)) ([233bd62](https://github.com/continew-org/continew-admin-ui/commit/233bd62babe6660193835b6bb30ae7d169b032ba)) ([84148b6](https://github.com/continew-org/continew-admin-ui/commit/84148b6a68d0701efc6efb900d1da4d7a6b49bd8)) ([5de731d](https://github.com/continew-org/continew-admin-ui/commit/5de731dab48eb38ca3430a6bcfd807ab36c17a7b)) (GitCode#1)
* 角色管理增加分配角色功能 ([2f30df5](https://github.com/continew-org/continew-admin-ui/commit/2f30df528caaca664db24ddb80dd4dbb8a378b43)) ([449e512](https://github.com/continew-org/continew-admin-ui/commit/449e5128d74569cd74d0779a17cbcaf1d8390fe6)) (GitHub#33)
* 调整默认头像规则,由基于性别的固定头像调整为基于昵称展示(背景颜色基于昵称计算随机) ([00c909e](https://github.com/continew-org/continew-admin-ui/commit/00c909e6f1e1767e69024620e99f71f98f2cf474))
* 新增能力开放模块应用管理功能 ([26291a1](https://github.com/continew-org/continew-admin-ui/commit/26291a1e444e3d63a5532e25bcaa4ea6a3d17125)) ([2b7c099](https://github.com/continew-org/continew-admin-ui/commit/2b7c09966fc3f8b059c4f587845149f5b1ea14c7)) (Gitee#27)
* 新增 GiEditTable 编辑表格组件(同步 GiDemo 更新) ([b46235b](https://github.com/continew-org/continew-admin-ui/commit/b46235b7ede5991d3582e68db9ab65515867798e))
* GiTable 表格组件插槽支持插槽类型提示(同步 GiDemo 更新) ([88864d8](https://github.com/continew-org/continew-admin-ui/commit/88864d8c5df55941a50ef23ac2c3d1030b61b47f))
* tab栏增加右键菜单 Closes #IA5RD4 ([169a304](https://github.com/continew-org/continew-admin-ui/commit/169a3049c479bd001e5cb5cff4eb20010e3c66ad)) (Gitee#31)
* 用户管理新增分配角色功能 ([3b74b5c](https://github.com/continew-org/continew-admin-ui/commit/3b74b5c7bfc9617f55565800349f4be51712e805))
### 💎 功能优化
- 完善部分限制字数输入框的限制提示 ([bb246f4](https://github.com/continew-org/continew-admin-ui/commit/bb246f45289f8899ebd5d2dfe1d5bc3be5ba880a))
- 优化公告相关样式 ([5ebdaa0](https://github.com/continew-org/continew-admin-ui/commit/5ebdaa045391c14fbc3456d18f5f1320123e5032)) ([33bf31b](https://github.com/continew-org/continew-admin-ui/commit/33bf31b048638b5a64a7acc3d8eb1e790cd38fa2))
- 重构部门管理、菜单管理树列表过滤(前端过滤) ([d881b93](https://github.com/continew-org/continew-admin-ui/commit/d881b93c7814d6cd92fb81717ab690dd1ac8c732))
- 优化表格工具栏样式 ([ff87940](https://github.com/continew-org/continew-admin-ui/commit/ff879405d76e91c2985536540ff49081e5e631b4))
- 重构用户管理搜索栏(支持多条件展开及折叠) ([50a6d17](https://github.com/continew-org/continew-admin-ui/commit/50a6d17516ab214d2b198b57c4b014360bc596ed)) ([84ad0d5](https://github.com/continew-org/continew-admin-ui/commit/84ad0d55b025fa96c2d83d732b87a496273abe1c))
- 优化表格 slot 命名 ([6a77168](https://github.com/continew-org/continew-admin-ui/commit/6a771686454917324604b1b456a27a96227229ed))
- 优化部分代码 ([1382346](https://github.com/continew-org/continew-admin-ui/commit/13823461d2d0175be1ed37f0a4a5f40f7c055160)) ([f650a6f](https://github.com/continew-org/continew-admin-ui/commit/f650a6f3aedd529e1c7e27fec50cfcca580918fe)) ([ce09f73](https://github.com/continew-org/continew-admin-ui/commit/ce09f737c3f8e8c8e0bcd834c8fbef0cc664be65)) ([4edbe54](https://github.com/continew-org/continew-admin-ui/commit/4edbe54fe37f49fda0b4a5eed16916db02742c43)) ([0bd0ff5](https://github.com/continew-org/continew-admin-ui/commit/0bd0ff5e21c11af30c5188d45ce4896faaebcf0c))
- 调整新增字典按钮位置 ([47a5c44](https://github.com/continew-org/continew-admin-ui/commit/47a5c448895cd5bc793c0f6c9baf5cf15c3c1297))
- 调整字典的操作菜单弹出方式,由右键弹出调整为点击更多按钮弹出 ([e29cf88](https://github.com/continew-org/continew-admin-ui/commit/e29cf88d1c7ea8115819eb528cbeb9c4e5a6d6ba)) ([795932e](https://github.com/continew-org/continew-admin-ui/commit/795932e440737e060c536726d0d3e81f89966ab1))
- 优化 GiForm 组件代码(同步 GiDemo 更新) ([ad31d9f](https://github.com/continew-org/continew-admin-ui/commit/ad31d9f2ffe9372f6bc5108b305086a700ca61de)) ([ae08678](https://github.com/continew-org/continew-admin-ui/commit/ae08678fa103850ba63d3bfeb70033e9f0f4c5ff))
- 优化部分链接样式 ([c6daf41](https://github.com/continew-org/continew-admin-ui/commit/c6daf41a2e418454b873c67252eed2f808b68bd3))
- GiForm 组件替换为 Grid 布局(同步 GiDemo 更新) ([4b90247](https://github.com/continew-org/continew-admin-ui/commit/4b902475dd5e1894329ca00d2d50f12e304856c0))
- 默认选中第一个字典 ([34d4faa](https://github.com/continew-org/continew-admin-ui/commit/34d4faa0903288aa7e71604f832cd1a04864790c))
- 调整 eslint.config.js优化代码格式 ([9e5dff1](https://github.com/continew-org/continew-admin-ui/commit/9e5dff144b31d39f479bd7d377338323c8551ffb))
- 优化导入用户部分界面及接口路径 ([881c7e7](https://github.com/continew-org/continew-admin-ui/commit/881c7e720e5a753115a4121276333ff121a8d741))
- 文件管理、分析页、代码生成等部分组件调整为异步加载 ([2caedd1](https://github.com/continew-org/continew-admin-ui/commit/2caedd165f55b577c921a6527132666e2c9a48a0)) (Gitee#29)
- 重构代码生成列表 ([293718f](https://github.com/continew-org/continew-admin-ui/commit/293718f670d3e214acced99db2eaf48b35856e45))
- 调整 html lang="en" 为 zh-CN ([cefb954](https://github.com/continew-org/continew-admin-ui/commit/cefb95479113a1cace7f075d2045048d84716780)) (Gitee#33)
- 调整查询系统配置参数接口地址 ([0116432](https://github.com/continew-org/continew-admin-ui/commit/011643226cbc88651665c01b2a7b84d58f2f1176))
- 进度条由请求时调整为切换路由显示 ([f702e03](https://github.com/continew-org/continew-admin-ui/commit/f702e03124199b004fe77b7c1c34f01f711b1ed5))
### 🐛 问题修复
- 消除控制台 Sass 警告 ([e2fe1ab](https://github.com/continew-org/continew-admin-ui/commit/e2fe1ab814e80da4bf641710826ec062c0168392)) (Gitee#20)
- 修复定时任务不显示堆栈异常的情况 ([44ef909](https://github.com/continew-org/continew-admin-ui/commit/44ef90917f28217ae1db151bbfa46380d1d1fd34)) (Gitee#22)
- 在useTable选项中将paginationOption设置为可选 ([07294cc](https://github.com/continew-org/continew-admin-ui/commit/07294cce14c5a77de1b4e7f9a40f25951978bc97)) (Gitee#22)
- 修复tab页只剩一个的时候无法关闭的问题 ([0594ae9](https://github.com/continew-org/continew-admin-ui/commit/0594ae91c74fbc19c0bd7ccd2ad6f7f67597d32a))
- 修复系统名太长会使菜单栏右侧黑边过长的问题 ([d1d29df](https://github.com/continew-org/continew-admin-ui/commit/d1d29dfce64abeee08ac924e64ec38950ccd0da6))
- 固定vue-tsc版本避免typescript5.0.4版本冲突 ([2648497](https://github.com/continew-org/continew-admin-ui/commit/2648497f2acc90c76f4246b5c7e249b8277559e7)) (GitHub#28)
- 修复主页公告弹窗MD显示 ([40bfcd5](https://github.com/continew-org/continew-admin-ui/commit/40bfcd5f0d6a8019b2ded0730145d944970cb314)) (GitHub#29)
- 修复搜索图标不生效,并支持模糊搜索 ([6e9b322](https://github.com/continew-org/continew-admin-ui/commit/6e9b32295dc8270e18716b6d7918fe20b6d40d06)) (GitHub#30)
- 修复选择上级菜单过滤失效的问题 ([777f371](https://github.com/continew-org/continew-admin-ui/commit/777f371ffcf763b5f5a958a9e7fad1bd2737d275))
- 修复了开发环境下点击使用了GiTable菜单自动刷新页面的问题 ([20bbf6c](https://github.com/continew-org/continew-admin-ui/commit/20bbf6c6af8c755af84806c675e40951a55fb6a9)) (Gitee#26)
- 修复获取短信、邮箱验证码缺失行为验证码参数错误 ([1cb0172](https://github.com/continew-org/continew-admin-ui/commit/1cb01720589cba3f8944eebb35457d30ee4658f8))
- 修复浏览器控制台报错 ([880fb1d](https://github.com/continew-org/continew-admin-ui/commit/880fb1d55d3a7e91f54dd9840f26f0e4c44fbc06))
- 优化部分表格列宽度样式 ([b908f14](https://github.com/continew-org/continew-admin-ui/commit/b908f14b33c1578ac6da88fb6c74b762b4197664))
- 修复公告显示及详情页跳转错误 ([6b265f7](https://github.com/continew-org/continew-admin-ui/commit/6b265f74bba52647470bd63f7c82968f2d988c41))
- 还原滚动条样式 ([8568ac1](https://github.com/continew-org/continew-admin-ui/commit/8568ac1a2ea2e7e8287ee04d6f7361c54b578d96))
- 补充重构邮箱登录后遗漏的行为验证码 ([2735dcf](https://github.com/continew-org/continew-admin-ui/commit/2735dcf93921c738ee8ffb375d37b2d81ae5121f))
## [v3.3.0](https://github.com/continew-org/continew-admin-ui/compare/v3.2.0...v3.3.0) (2024-09-09)
### ✨ 新特性
* GiForm 新增年\月\季度\周\范围、颜色选择器支持 ([ad53e1d](https://github.com/continew-org/continew-admin-ui/commit/ad53e1d419d8012fbeedc3f26943d3b36b133ee3))
* GiTag 组件功能扩展,提供 color 属性,用于自定义颜色 ([050a171](https://github.com/continew-org/continew-admin-ui/commit/050a171e91ae8f62aeb17d108ccb4a3c7c49eb4b))
* 代码生成字段配置列表支持拖拽排序 ([fcbc3eb](https://github.com/continew-org/continew-admin-ui/commit/fcbc3ebbff5cdbb555e594d73c94dce643c8e8ec))
* 代码生成字段配置支持选择关联字典 ([6574181](https://github.com/continew-org/continew-admin-ui/commit/65741811103a848a38f0f637df02fb677b82f205))
* 代码生成字段配置支持自定义名称、类型 ([b29960f](https://github.com/continew-org/continew-admin-ui/commit/b29960f3f534b3a83f62ec7c64f6302a1daf52bf))
* 修改角色功能权限、数据权限支持衔接新增角色时的父子联动 ([5cfb0d7](https://github.com/continew-org/continew-admin-ui/commit/5cfb0d795a000393514109fdf057ce0c654dc0a9)) ([0f35d29](https://github.com/continew-org/continew-admin-ui/commit/0f35d292addd7498bcdeca432b3ae0591b613c30))
### 💎 功能优化
- 适配后端接口响应 code 数据类型变动 ([f321030](https://github.com/continew-org/continew-admin-ui/commit/f321030c4c8b4f4493388fc73152a56f31bb2a6d))
- 使用分步表单重构新增角色交互 (Gitee#18) ([fe25e1c](https://github.com/continew-org/continew-admin-ui/commit/fe25e1c698078a7ba609b24c730d00029429014c)) ([80de5b0](https://github.com/continew-org/continew-admin-ui/commit/80de5b0e5e13a5ad1a1cf816bbbc223a9d392e74))
- 优化 apis 导入,随着模块和接口的增加,方便维护 ([8a80db0](https://github.com/continew-org/continew-admin-ui/commit/8a80db0f92a2c271594c8027559591f40c27f39b))
- 优化 GiForm 组件代码 ([948158f](https://github.com/continew-org/continew-admin-ui/commit/948158f1fa65fe92bc3040fb0b70550a6ecefa0f))
- 优化部分代码 ([cb03111](https://github.com/continew-org/continew-admin-ui/commit/cb03111c22164365f2e5198d5162bff172492ffe))
- 消除搜索框歧义,明确可输入项 ([ab7ef15](https://github.com/continew-org/continew-admin-ui/commit/ab7ef153abe510aa1d32b27de2d630426d369d94))
### 🐛 问题修复
- 修复 Mix 布局下面包屑显示不全的问题 ([917cd43](https://github.com/continew-org/continew-admin-ui/commit/917cd43a0866a90b81b5af0d11ecc1c457b01f6b))
- 修复用户管理字典管理上一下二布局影响table表格溢出不显示问题 ([23ca50c](https://github.com/continew-org/continew-admin-ui/commit/23ca50c99dad206a97058006b071d1e921fca225))
- 修复切换 tab 页签后参数丢失的问题 ([13181bb](https://github.com/continew-org/continew-admin-ui/commit/13181bbb8980eab8c1acc2da01d6027818e05c82))
- 修复侧边栏宽度塌陷错误 ([1b01ced](https://github.com/continew-org/continew-admin-ui/commit/1b01cedae9f30e69fa7393e89223d382ca01a306))
- 修复修改密码后不弹出跳转提示的问题 ([3f41306](https://github.com/continew-org/continew-admin-ui/commit/3f4130615498b2aa863f75577597b9a6500a192b))
- 修复用户管理列设置未能正确禁用列的问题 ([eec9610](https://github.com/continew-org/continew-admin-ui/commit/eec9610e7004bc18dbc96dcf401d8d47ef275ce5))
## [v3.2.0](https://github.com/continew-org/continew-admin-ui/compare/v3.1.0...v3.2.0) (2024-08-05)
### ✨ 新特性
* 新增用户批量导入功能 (GitHub#23) ([f72b4b8](https://github.com/continew-org/continew-admin-ui/commit/f72b4b8d563acd6d2829018be0d079a835911f18))
* 新增任务调度模块 SnailJob灵活可靠和快速的分布式任务重试和分布式任务调度平台 (Gitee#13) ([e8c1d4b](https://github.com/continew-org/continew-admin-ui/commit/e8c1d4b69b10a53f4adfaf8a2fd4b8280de965c7)) ([d7fc693](https://github.com/continew-org/continew-admin-ui/commit/d7fc693650259d8ad50aaf69504b991343f4694b)) ([edadea9](https://github.com/continew-org/continew-admin-ui/commit/edadea91edc74a7f95b67e7401aa7efb439f6ffd)) ([0a596f3](https://github.com/continew-org/continew-admin-ui/commit/0a596f3fdccc9fcecdb3d550889cb006450b30a3)) ([ff405d1](https://github.com/continew-org/continew-admin-ui/commit/ff405d12ab441f64c29b986fccb91caf727a5811))
* 系统配置-基础配置 logo 及 favicon 改为 base64 存储 (Gitee#16) ([881c1ee](https://github.com/continew-org/continew-admin-ui/commit/881c1ee1e41805d5728648b1a72e50480199216b))
* 新增支持 KKFileView 文件预览功能,需要自行部署文件预览服务器 (Gitee#17) ([99fa570](https://github.com/continew-org/continew-admin-ui/commit/99fa5709ee03a6f368c8297a7306c02872adfcb2))
* 新增单页面通知公告编辑与查看 ([90693cb](https://github.com/continew-org/continew-admin-ui/commit/90693cb25d061af9d15b4579cf82db80a38cfc40))
### 💎 功能优化
- 优化部分代码格式 ([ed085c9](https://github.com/continew-org/continew-admin-ui/commit/ed085c92bdbf61bae6334ceaee4a3b7e5c605065))
- 优化部分命名 ([805ae65](https://github.com/continew-org/continew-admin-ui/commit/805ae65556e7969cd0a1ac0ddee24b9a2c0be0ff))
- 移除滚动条样式 ([b154375](https://github.com/continew-org/continew-admin-ui/commit/b15437537b0b8948e6ede22830852cd3eb778e84))
- 回退用户管理部门树组件(此树查询不应该校验功能权限) ([ee6a6e4](https://github.com/continew-org/continew-admin-ui/commit/ee6a6e437d8f0806137ab49252c8d6f34337d3cd))
- 优化子路由设置 ([f54caed](https://github.com/continew-org/continew-admin-ui/commit/f54caed4da38dc329c52e3e07419fca31f56bee7))
- 路由切换时检测前端版本更新(原为定时器检测) ([5fdfada](https://github.com/continew-org/continew-admin-ui/commit/5fdfada11d6813ae2728797e0c5ef81387c39c6d))
### 🐛 问题修复
- 修复部分路由错误 ([92e773e](https://github.com/continew-org/continew-admin-ui/commit/92e773e621657946aab3a9149208139d98cac996))
- 修复通知公告重叠问题 ([3364cb1](https://github.com/continew-org/continew-admin-ui/commit/3364cb185855541246a93f8663efe197597df170))
- 解决代码生成页面丢失目录层级问题 (Gitee#12) ([fe08683](https://github.com/continew-org/continew-admin-ui/commit/fe086830dd6a50a0bbf7d1d59563b85a3bfa401c))
- 修复表格固定操作列滚动时的错位样式问题 (Gitee#14) ([ce297c0](https://github.com/continew-org/continew-admin-ui/commit/ce297c0904f00ef6f93a9772b149f817a91a3f2a))
- 修复文件管理没有文件时控制台报错 ([bad6e30](https://github.com/continew-org/continew-admin-ui/commit/bad6e30e4133507cd6e44de9f525c25d3ebc1adb))
## [v3.1.0](https://github.com/continew-org/continew-admin-ui/compare/v3.0.1...v3.1.0) (2024-06-16)
### ✨ 新特性
* 系统配置新增安全设置功能 ([395a564](https://github.com/continew-org/continew-admin-ui/commit/395a5642afbe3bac8b6b3f161949264a874033ba))
* useTable 支持 “无分页” 列表 ([1421412](https://github.com/continew-org/continew-admin-ui/commit/1421412d678c926868b06ae8adeba292f390d3b1))
* 图片文件支持缩略图 (GitHub#17) ([c82dc90](https://github.com/continew-org/continew-admin-ui/commit/c82dc9083bf7dbb9cccdd7c4daff6fe743eb9a0c))
* 在线用户增加最后活跃时间显示 ([fff4de5](https://github.com/continew-org/continew-admin-ui/commit/fff4de56f30d3e3f777bd45b2f77be61bba3a555)) ([4eef0db](https://github.com/continew-org/continew-admin-ui/commit/4eef0db9f93cb73e10113c8f69ad547f502db621))
* 新增行为验证码,行为验证码重新上线 (Gitee#7) ([778b3c6](https://github.com/continew-org/continew-admin-ui/commit/778b3c677fee14071d49355980936b52d16a7313))
* 新增消息中心 ([fdd4b9a](https://github.com/continew-org/continew-admin-ui/commit/fdd4b9a4dfcb600e8455c5c402fc6f818b6f1507))
* 新增 WebSocket 消息通知 (GitHub#20) ([adc6f64](https://github.com/continew-org/continew-admin-ui/commit/adc6f643b3ba481313b3f23e876eb4836d8753b4)) ([56b1fdd](https://github.com/continew-org/continew-admin-ui/commit/56b1fdd75521b08334b25e2d03f7cbcfe2014360)) ([c104ba5](https://github.com/continew-org/continew-admin-ui/commit/c104ba5445f1c990b08ec5fd3a8cf1d783d65c76))
* 新增邮件配置 (Gitee#8) ([1ebfd11](https://github.com/continew-org/continew-admin-ui/commit/1ebfd115eb4f488a7a9464415ce061f9ad36eca0)) ([45cbabf](https://github.com/continew-org/continew-admin-ui/commit/45cbabf54503210305f7e74382fa7c4d702c359c)) ([66f89b4](https://github.com/continew-org/continew-admin-ui/commit/66f89b44d897b7e6874b9882e8708cadf5ab60aa)) ([6e520a3](https://github.com/continew-org/continew-admin-ui/commit/6e520a30720c418b7484f37c1736f189613e83ce))
* 文件管理增加复制文件 URL 按钮 ([5c6d311](https://github.com/continew-org/continew-admin-ui/commit/5c6d3119eb4aab0f679aaeadcead7f96f6f1ea22))
* 新增版权条显示配置 ([0f3d927](https://gitee.com/continew/continew-admin-ui/commit/0f3d927f9894e296e5dde83feb1738206c44b5b1)) ([d7e29e2](https://gitee.com/continew/continew-admin-ui/commit/d7e29e238ee31301807275be1147824295995650))
* 新增密码过期修改页面逻辑 ([921d9c6](https://github.com/continew-org/continew-admin-ui/commit/921d9c63e955711473e1c911f59da4711cdc1197))
* 新增前端简略版本更新提示 ([03d05e1](https://github.com/continew-org/continew-admin-ui/commit/03d05e1821a0360afa724d86ce34a51aedb9c07e))
### 💎 功能优化
- 路由多级缓存调整为扁平化方案 ([5f3dd93](https://github.com/continew-org/continew-admin-ui/commit/5f3dd93376ed62c803d6e26965f43812c86abee8))
- 优化 ESLint 配置并更正问题代码eslint src --fix ([5d9fedc](https://github.com/continew-org/continew-admin-ui/commit/5d9fedc35406e00d88d8921ffe04b99a7c49cb8e))
- 代码生成预览调整为以文件树结构形式显示 (Gitee#5) ([c9198b3](https://github.com/continew-org/continew-admin-ui/commit/c9198b315c25cb3e8fd7f769b543e98e131f878c))
- 优化公告和字典项响应式窗口效果 ([4c2f36f](https://github.com/continew-org/continew-admin-ui/commit/4c2f36fe6b5254a613cabd686501e891cd8c7d1c))
- 优化个人中心部分代码 ([eb11cae](https://github.com/continew-org/continew-admin-ui/commit/eb11cae635ff4a0661603509cec4e85a462f5a63))
- 更换 ESLint 配置为 @antfu/eslint-config ([bfc8e42](https://github.com/continew-org/continew-admin-ui/commit/bfc8e42bad6777243fdca9bf37b0d95a92c75159))
- 代码生成预览样式调整 (Gitee#6) ([fe656af](https://github.com/continew-org/continew-admin-ui/commit/fe656af1aa1afbc290cf6a6121347106adf5df60)) ([cc0840e](https://github.com/continew-org/continew-admin-ui/commit/cc0840e2ae7f25f25432c6a01781ac1a8112eea7))
- 启动项目时,控制台增加应用信息打印 ([52e7682](https://github.com/continew-org/continew-admin-ui/commit/52e7682a4786ae6e3fae49dcbd8ee473f30d2cb5))
- 优化部分弹框响应式效果 ([c1c5f7f](https://github.com/continew-org/continew-admin-ui/commit/c1c5f7f632827286982fdc0b9235cb115298e541))
- 优化文件管理部分显示效果 ([7a2c66e](https://github.com/continew-org/continew-admin-ui/commit/7a2c66e6463eb50d8c7bee0dcd21c396fe642ceb))
- 优化重置路由实现 ([7c1106e](https://github.com/continew-org/continew-admin-ui/commit/7c1106e8c26d3dc3c2ecee93f9f98bc56a171720))
- 优化 copy 组件使用 ([c369b88](https://github.com/continew-org/continew-admin-ui/commit/c369b88185c85bb7782383617fd6debf1f6c16d9)) ([a8b5d97](https://github.com/continew-org/continew-admin-ui/commit/a8b5d97bfa0ed256205284deb7364bf50e18927a))
- 优化用户角色名称展示 ([d4b9057](https://github.com/continew-org/continew-admin-ui/commit/d4b9057554f7bbe58d45429529d7279182100616))
- 优化删除弹窗按钮样式 ([c2806c4](https://github.com/continew-org/continew-admin-ui/commit/c2806c469695adbe3ef1950957a33d48059c6cb6))
- 优化表格页面样式及表格纵向滚动条 ([861f620](https://github.com/continew-org/continew-admin-ui/commit/861f6203cc0ebcdd7087434c9d8bafccf4360812))
- 重构字典管理(左树右表) ([a175120](https://github.com/continew-org/continew-admin-ui/commit/a175120d699f5da099e7f027a6c5f0fba26705d8)) ([aac5899](https://github.com/continew-org/continew-admin-ui/commit/aac5899fe0a01fe0e91ffc1904c94ac9ecaa4885))
- 重构用户管理部门树,支持部门管理 ([ca05fab](https://github.com/continew-org/continew-admin-ui/commit/ca05fabdec277965057f7901317edefca74cb258)) ([1be08f1](https://github.com/continew-org/continew-admin-ui/commit/1be08f10010654dc675d67b792f1fc870df5961e)) ([f8ded4b](https://github.com/continew-org/continew-admin-ui/commit/f8ded4b491a22369d43ff3e76f75c771130c4f1c))
- 优化表格列表显示 ([ed7be3e](https://github.com/continew-org/continew-admin-ui/commit/ed7be3ef25a91d66bcd33bae6176ecb81c85ec44))
- 优化文件管理分页 ([00da9ac](https://github.com/continew-org/continew-admin-ui/commit/00da9acdd09e4f2f8233ec22ae37408f9a027674))
- 优化系统配置加载与切换问题 ([605ac4d](https://github.com/continew-org/continew-admin-ui/commit/605ac4d0865e2b7471583f3e0b5a14993bf25104))
- 优化全局 loading 及 empty 配置 ([7e329fc](https://github.com/continew-org/continew-admin-ui/commit/7e329fcffacc58cb626b3b7a71a53d8decc170f7))
- 适配系统参数 API 新的使用方式 ([1909b6e](https://github.com/continew-org/continew-admin-ui/commit/1909b6e907f8d8dd00d8e59eff8c2125914cad3f))
- 存储管理S3存储配置填充默认域名 (GitHub#21) ([5897bde](https://github.com/continew-org/continew-admin-ui/commit/5897bde0c45dd61a94ac9bcf85b55f12a7fe5133))
- 优化个人中心部分默认显示效果 ([f2206b7](https://github.com/continew-org/continew-admin-ui/commit/f2206b78012d594010bc6cee47a95a9ebab1ad1b))
- 调整对话框默认可拖拽,表格默认可调整列宽 ([5581d3f](https://github.com/continew-org/continew-admin-ui/commit/5581d3fd8910997d61ca6e281cec50caef264ca3))
- 目录下仅有一个菜单时平铺展示 ([dc4ae0f](https://github.com/continew-org/continew-admin-ui/commit/dc4ae0fb34a940030f4fc1841ede3557ccccb58c))
### 🐛 问题修复
- 修复用户列表禁用列错误 ([1e5a50c](https://github.com/continew-org/continew-admin-ui/commit/1e5a50c37bc8dbc18d917e523b0a215a510f57db))
- 修复菜单管理列表滚动问题 ([5101dd1](https://github.com/continew-org/continew-admin-ui/commit/5101dd12d9769d8927afb40619fb68d696c22a82))
- 修复打包部署后或 preview 模式下,布局切换及页签显示异常 ([68d8f0f](https://github.com/continew-org/continew-admin-ui/commit/68d8f0f5b36be162a0c64d500d845388c239c4a7))
- 修复文件管理图表加载错误 ([d1af509](https://github.com/continew-org/continew-admin-ui/commit/d1af509a1aaa7d1a6982f3dcdadb7202b71b9475))
- 字典编码不允许修改 ([0a6cd6e](https://github.com/continew-org/continew-admin-ui/commit/0a6cd6ef989309a450a810852cbd74e35ed29b6a))
- 修复字典重复请求问题 ([6705027](https://github.com/continew-org/continew-admin-ui/commit/6705027273e098cde57792743c3a0bdacb559449)) ([30222b0](https://github.com/continew-org/continew-admin-ui/commit/30222b08ab6539552f3679f4cb9442f477f4df55))
- 代码生成配置表单校验错误自动跳转回错误 tab ([a015d9f](https://github.com/continew-org/continew-admin-ui/commit/a015d9f843cb72aeb99674a271914044a4e00794))
- 修复文件管理左侧‘全部’查询问题 ([d6c5b89](https://github.com/continew-org/continew-admin-ui/commit/d6c5b8988c84d6d33474d51162bad12973b86c91))
- 修复导出报 400 的问题 ([377a1ff](https://github.com/continew-org/continew-admin-ui/commit/377a1ff1b74fa357545c3298e5b9c480b0f3f0d3))
- 修复用户管理排序参数错误 ([bcbe106](https://github.com/continew-org/continew-admin-ui/commit/bcbe10660fbfdab5a7c7b17c9353aba3adc12638))
- 修复初始值使用错误 ([fd55ad4](https://github.com/continew-org/continew-admin-ui/commit/fd55ad422888f74ea2deda679172db0cff923c9f))
- 修复第三方登录错误 ([a775b86](https://github.com/continew-org/continew-admin-ui/commit/a775b86e2e0973a16e6b9a1945acbd904773b876))
- 修复验证码长度限制错误 ([8702be4](https://github.com/continew-org/continew-admin-ui/commit/8702be45ed64dde39f443c2e5570fd2474821e6b))
## [v3.0.1](https://github.com/continew-org/continew-admin-ui/compare/v3.0.0...v3.0.1) (2024-05-03)
### ✨ 新特性
* 新增表格全屏、尺寸工具 ([b8a84a3](https://github.com/continew-org/continew-admin-ui/commit/b8a84a3a0890d4f6d0e39ecbe50c4f645bd0f106))
* 新增验证码超时显示效果,超时后显示已过期请刷新 (GitHub#14) ([f99c8f1](https://github.com/continew-org/continew-admin-ui/commit/f99c8f1b5a521f987b2822352f976fb0b1dc93b3))
* 文件管理增加资源统计,统计总存储量、各类型文件存储占用 (GitHub#15) ([c70d1ad](https://github.com/continew-org/continew-admin-ui/commit/c70d1adbf922d28853bf4e6cf8cc4e14ad5b0ac7))
### 💎 功能优化
- 统一性别约束/统一上级部门为必填 ([5264cf2](https://github.com/continew-org/continew-admin-ui/commit/5264cf226fa3acd1398d9309e6a97d4d45b64850))
- 一级部门不能修改上级部门 ([b2a1658](https://github.com/continew-org/continew-admin-ui/commit/b2a1658e3730078cf2fbeb3032c23c0922544594))
- 优化根据选中部门查询用户的点击效果 ([ca25285](https://github.com/continew-org/continew-admin-ui/commit/ca252852373840b000c1f65ab925d18335a71fcb)) ([99c37d7](https://github.com/continew-org/continew-admin-ui/commit/99c37d7de4a245836f89c29cf4b638032efae31f))
- 登录页面H5 端排版更换 ([05ab89d](https://github.com/continew-org/continew-admin-ui/commit/05ab89d03fe6401994698ad9ecdeb8540ec49553))
- 优化 queryForm 的 Query 类型使用 ([5b71369](https://github.com/continew-org/continew-admin-ui/commit/5b713692516db586f2d401a163192c62a963137a))
### 🐛 问题修复
- 修复 Markdown 样式加载错误,改为全局统一加载 (GitHub#9) ([64648d0](https://github.com/continew-org/continew-admin-ui/commit/64648d0c1d897d6e426199e7924ede9dfb40e8b8))
- 修复由于文件组件名称错误导致的侧边栏筛选功能失效 ([81dbea8](https://github.com/continew-org/continew-admin-ui/commit/81dbea879377054e3646c2d07b51c3352501bbce))
- 修复文件管理数据不刷新和批量操作选中问题 (GitHub#13) ([724f60e](https://github.com/continew-org/continew-admin-ui/commit/724f60eaf6b076cfb165ca0b1028c461146495ad))
- 修复文件重命名时不能回显原值的问题 ([3dfa97e](https://github.com/continew-org/continew-admin-ui/commit/3dfa97e785acb42edd3798117f7e8eea326b4b64))
- 修复修改公告时保存按钮点击无效的问题 ([c0a5c2d](https://github.com/continew-org/continew-admin-ui/commit/c0a5c2dffe50905b8610fbd066b8eecd5a4cbe89))
- 修复账号管理、安全设置路由处理错误 ([c0c5ba8](https://github.com/continew-org/continew-admin-ui/commit/c0c5ba8efdab009e7e38ad9a8f68a655aba28718))
- 修复首页卡片显示问题 ([39465dc](https://github.com/continew-org/continew-admin-ui/commit/39465dcaa38c9d79c820583a1dd82978e5588dec))
- 修复 H5 下登录页面错位显示 ([9d570a8](https://github.com/continew-org/continew-admin-ui/commit/9d570a808ce1a15a1513eac0e9ec355d683febef))
## v3.0.0 (2024-04-27)
### ✨ 新特性
* 基于 Gi-Demo 前端模板开发的全新 3.0 前端,重新定义新 UI提供更为舒适的前端开发体验
- 个人中心:支持基础信息修改、安全设置(密码修改、邮箱绑定、手机号绑定(并提供行为验证码、短信限流等安全处理)、第三方账号绑定/解绑)、头像裁剪上传等能力
- 用户管理:提供系统用户的新增维护,支持禁用登录及重置指定用户密码
- 角色管理:对权限与菜单进行分配,可根据部门设置角色的数据权限
- 菜单管理:已实现菜单动态路由,后端可配置化,支持多级菜单
- 部门管理:可配置系统组织架构,以树形表格展示
- 公告管理:提供公告的发布、查看和删除等功能。管理员可以在后台发布公告,并可以设置公告的生效时间、终止时间,以 markdown-it 为内核渲染 Markdown 格式内容显示
- 消息管理提供消息查看、标记已读、全部已读、删除等功能适配对接导航栏站内信功能v3.1 重构v2.5 版可用)
- 字典管理:提供对系统公用数据字典的维护,例如:公告类型,支持字典标签背景色和排序等配置
- 文件管理:提供文件上传、下载、预览(目前支持图片、音视频)、重命名、切换视图(列表、网格)等功能
- 存储管理:提供文件存储库新增、编辑、删除等功能,支持本地存储、兼容 S3 协议存储
- 系统配置提供修改系统标题、Logo、favicon 等基础配置功能以方便用户系统与其自身品牌形象保持一致v3.1 支持邮件配置)
- 代码生成:提供根据数据库表自动生成相应的前后端 CRUD 代码的功能
- 在线用户:管理当前登录用户,可一键踢下线
- 系统日志:提供登录日志、操作日志管理功能,可查看指定日志的详细请求及响应信息

202
LICENSE Normal file
View File

@@ -0,0 +1,202 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright (c) 2022-present Charles7c Authors. All Rights Reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

386
README.md Normal file
View File

@@ -0,0 +1,386 @@
# ContiNew Admin UI
<a href="https://github.com/continew-org/continew-admin-ui" title="Release" target="_blank">
<img src="https://img.shields.io/badge/SNAPSHOT-v3.6.0-%23ff3f59.svg" alt="Release" />
</a>
<a href="https://vuejs.org/" title="Vue" target="_blank">
<img src="https://img.shields.io/badge/Vue-3.5.4-%236CB52D.svg?logo=Vue.js" alt="Vue" />
</a>
<a href="https://arco.design/vue/docs/start" title="Arco Design Vue" target="_blank">
<img src="https://img.shields.io/badge/Arco Design Vue-2.57.0-%236CB52D.svg" alt="Arco Design Vue" />
</a>
<a href="https://ts.nodejs.cn/" title="TypeScript" target="_blank">
<img src="https://img.shields.io/badge/TypeScript-5.0.4-%236CB52D.svg?logo=TypeScript&logoColor=FFF" alt="TypeScript" />
</a>
<a href="https://vite.dev/" title="Vite" target="_blank">
<img src="https://img.shields.io/badge/Vite-5.1.5-%236CB52D.svg?logo=Vite&logoColor=FFF" alt="Vite" />
</a>
<br />
<a href="https://github.com/continew-org/continew-admin-ui/blob/dev/LICENSE" title="License" target="_blank">
<img src="https://img.shields.io/badge/License-Apache--2.0-blue.svg" alt="License" />
</a>
<a href="https://github.com/continew-org/continew-admin" title="GitHub Stars" target="_blank">
<img src="https://img.shields.io/github/stars/continew-org/continew-admin?style=social" alt="GitHub Stars" />
</a>
<a href="https://github.com/continew-org/continew-admin" title="GitHub Forks" target="_blank">
<img src="https://img.shields.io/github/forks/continew-org/continew-admin?style=social" alt="GitHub Forks" />
</a>
<a href="https://gitee.com/continew/continew-admin" title="Gitee Stars" target="_blank">
<img src="https://gitee.com/continew/continew-admin/badge/star.svg?theme=dark" alt="Gitee Stars" />
</a>
<a href="https://gitee.com/continew/continew-admin" title="Gitee Forks" target="_blank">
<img src="https://gitee.com/continew/continew-admin/badge/fork.svg?theme=dark" alt="Gitee Forks" />
</a>
<a href="https://gitcode.com/continew/continew-admin" title="GitCode Stars" target="_blank">
<img src="https://gitcode.com/continew/continew-admin/star/badge.svg" alt="GitCode Stars" />
</a>
📚 [在线文档](https://continew.top) | 🚀 [演示地址](https://admin.continew.top)(账号/密码admin/admin123
## 简介
全新 3.0 版本,基于 Gi Demo 前端模板开发的 ContiNew Admin 前端适配项目。
ContiNew AdminContinue New Admin持续迭代优化的前后端分离中后台管理系统框架。开箱即用重视每一处代码规范重视每一种解决方案细节持续提供舒适的前、后端开发体验。
当前采用的技术栈Spring Boot3Java17、Vue3 & Arco Design & TS & Vite、Sa-Token、MyBatis Plus、Redisson、JetCache、JustAuth、Crane4j、EasyExcel、Liquibase、Hutool 等。
## 项目源码
| | 前端 | 后端 |
| :------ | :----------------------------------------------------------- | :----------------------------------------------------------- |
| Gitee | [continew/continew-admin-ui](https://gitee.com/continew/continew-admin-ui) | [continew/continew-admin](https://gitee.com/continew/continew-admin) |
| GitCode | [continew/continew-admin-ui](https://gitcode.com/continew/continew-admin-ui) | [continew/continew-admin](https://gitcode.com/continew/continew-admin) |
| GitHub | [continew-org/continew-admin-ui](https://github.com/continew-org/continew-admin-ui) | [continew-org/continew-admin](https://github.com/continew-org/continew-admin) |
## 项目起源
我热衷于做数据归档,归档后的数据可以提高学习/工作效率,为记忆“减负”,在持续的数据归档中,优质的“沉淀”会带来非匀速、跨越式的学习/工作体验。**数据归档是一件需要持续去做的事情**。
从接触程序代码的第一天,我的程序数据归档也随之开始了,刷过的算法题、笔记、对接各种组件的配置文件,甚至于一些亮眼的样式设计、“如诗”的代码片段。这些数据的沉淀丰富了我的解决方案,提高了我的编程效率,逐渐为各种场景落实成了一个个雏形程序。再后来,我意识到,我归档的这些雏形程序,有一个更为妥贴的名称:**程序框架/脚手架**。
技术的发展,导致这些雏形程序的生命周期很是短暂,它们有别于我归档的其他数据,有时由于工作的原因,没有时间很好的去沉淀它们,在使用时变得越来越不顺手。所以,某段时间,我放弃了维护,而是去采用一些更为成熟的框架。
不过,在陆续几年使用了一些成熟框架后,我前后遇到了一些困难:
1. 代码洁癖想要找到一个**扩展性佳,代码规范良好,开发体验舒适**的框架很不容易,总是差些什么
2. 项目上手困难或是基础版功能不全,需要的全在专业版,亦或者代码阅读性差,文档收费
3. 部分解决方案缺失,已有解决方案也过于偏向样板化,无法形成良好的逻辑闭环
4. 好不容易找到一些相较合适的,没过多久,部分作者可能暂时没法对外发“电”了,随着了解深入,很多 Bug 或新技术趋势还是需要自己研究解决
在工作中,很多想法/设计受限于客户需求、开发工期,必须优先以交付为导向,但一些优秀的实践需要花时间持续进行沉淀,只要我没跳出这个圈子,我还是需要一直去做好程序归档。“种一棵树最好的时间是十年前,其次是现在”,最终,我选择在业余时间更加正视这件事,从头归档沉淀,从添加每一个依赖开始,我希望它能持续的迭代优化、演进,所以我把它命名为 **ContiNewContinue New**。并且这次我选择了开源,我希望它不仅仅能吸收我的需求和沉淀,而是依托开源协作模式,及时发现更多的问题,接受更多的可能性,沉淀更优秀的思考,设计。
## 为什么选我们?
> [!TIP]
> 更为完整的图文描述请查阅[《在线文档》](https://continew.top/admin/intro/why.html)。
1.**甄选技术栈:** ContiNewContinue New 项目致力于持续迭代优化,让技术不掉队。在技术选型时,进行深度广泛地调研,从流行度、成熟度和发展潜力等多方面甄选技术栈。
2.**Starter 组件:** 从 v2.1.0 版本开始,抽取并封装后端基础组件及各框架集成配置到 ContiNew Starter 项目,且 **[已发布至 Maven 中央仓库](https://central.sonatype.com/search?q=continew-starter&namespace=top.continew)**,可在你的任意项目中直接引入所需依赖使用。即使你不用脚手架项目,难道能让你搭项目框架更快、更爽、更省力的 Starter 也要 Say No 吗?
3.**CRUD 套件:** 封装通用增删改查套件,适配后端各分层,几分钟即可提供一套 CRUD API包括新增、修改、批量删除、查询详情、分页列表查询、全部列表查询、树型列表查询、导出到 Excel且 API 支持按实际所需开放或扩展。
```java
@Tag(name = "部门管理 API")
@RestController
@CrudRequestMapping(value = "/system/dept", api = {Api.TREE, Api.DETAIL, Api.ADD, Api.UPDATE, Api.DELETE, Api.EXPORT})
public class DeptController extends BaseController<DeptService, DeptResp, DeptDetailResp, DeptQuery, DeptReq> {}
```
4.**代码生成器:** 提供代码生成器,已配套前、后端代码生成模板,数据表设计完之后,简单配置一下即可生成前、后端 80% 的代码,包含 CRUD API、权限控制、参数校验、接口文档等内容。如果业务不复杂也可能就是 95% 的代码。
5.**改善开发体验:** 持续优化及适配能改善开发体验的组件。
- 适配 ContiNew Starter 组件,针对多数框架进行了深度封装的 starter改善你在开发每个 Spring Boot Web 项目的体验。
- 适配 Crane4j 数据填充组件,减少因为一个用户名而产生的联表回填;
- 适配 P6Spy SQL 性能分析组件,开发期间方便监控 SQL 执行;
- 适配 TLog 链路追踪组件,方便在杂乱的日志文件中追踪你某次请求的日志记录;
- 适配 JetCache 缓存框架(比 Spring Cache 更强大易用),通过注解声明即可快速实现方法级缓存,极大改善编码式缓存体验,且支持灵活的二级缓存配置、分布式自动刷新等能力;
- 前端适配 Vue DevtoolsVue 官方提供的调试浏览器插件),极大提高 Vue 开发及调试效率
6.**Almost最佳后端规范** 后端严格遵循阿里巴巴 Java 编码规范,注释覆盖率 > 45%,接口参数示例 100%,代码分层使用体验佳,变量、方法命名清晰统一,前端代码也使用严格的 ESLint、StyleLint 等检查。良好的设计,代码复用率极高!写代码时,让你有一种无需多写,理应如此的感觉。我是代码洁癖,我实际写的时候很清楚这到底是不是乱吹。
7.**卓越工程:** 后端采用模块化工程结构,并适配了统一项目版本号、编译项目自动代码格式化、代码混淆等插件,提供了自定义打包部署结构配置(配置文件、三方依赖和主程序分离),提供全套环境及应用的 Docker Compose 部署脚本。为了减少您开发新项目时的改造耗时,项目品牌配置持续进行深度聚合,简单的配置和结构修改即可快速开始独属于你的新项目。
8.**业务脚手架:** 有颜有料,不止是说说而已,持续打磨 UI 设计与色彩主题。提供基于 RBAC 的权限控制、通用数据权限,包含丰富的通用业务功能:第三方登录,邮箱、短信(生产级炸弹漏洞处理方案),个人中心、用户管理、角色管理、部门管理、系统配置(基础站点配置、邮件配置、安全配置)、系统日志、消息中心、通知公告等,设计用心,逻辑合理闭环。
> 一个好的脚手架项目,不仅仅是提供一系列组件集成与配置,也不仅仅是封装一堆好用的工具,还更应该提供一系列通用基础业务解决方案及设计,为初创团队项目减负。
9.**质量与安全:** CI 已集成 Sonar、CodacyPush 即扫描代码质量,定期扫描 CVE 漏洞及时解决潜在问题。封装数据库字段加密、JSON 脱敏、XSS 过滤等工具,提供诸多安全解决方案。
由于篇幅有限,且项目正处于高速发展期,更多功能正在陆续上线(敬请关注仓库或群内动态)。另外像最基本的统一异常、错误处理,基础线程池等配置就不在此赘述,细节优化详情请 clone 代码查看。
> Talk is cheap, show the code.
## 系统功能
> [!TIP]
> 更多功能和优化正在赶来💦,最新项目计划、进展请进群或关注 [需求墙](https://continew.top/require.html) 和 [更新日志](https://continew.top/admin/other/changelog.html)。
- 仪表盘:提供工作台、分析页,工作台提供功能快捷导航入口、最新公告、动态;分析页提供全面数据可视化能力
- 个人中心:支持基础信息修改、密码修改、邮箱绑定、手机号绑定(并提供行为验证码、短信限流等安全处理)、第三方账号绑定/解绑、头像裁剪上传
- 消息中心:提供站内信消息统一查看、标记已读、全部已读、删除等功能(目前仅支持系统通知消息)
- 用户管理:管理系统用户,包含新增、修改、删除、导入、导出、重置密码、分配角色等功能
- 角色管理:管理系统用户的功能权限及数据权限,包含新增、修改、删除、分配角色等功能
- 菜单管理:管理系统菜单及按钮权限,支持多级菜单,动态路由,包含新增、修改、删除等功能
- 部门管理:管理系统组织架构,包含新增、修改、删除、导出等功能,以树形列表进行展示
- 字典管理:管理系统公用数据字典,例如:消息类型。支持字典标签背景色和排序等配置
- 通知公告:管理系统公告,支持设置公告的生效时间、终止时间、通知范围(所有人、指定用户)
- 文件管理管理系统文件支持上传、下载、预览目前支持图片、音视频、PDF、Word、Excel、PPT、重命名、切换视图列表、网格等功能
- 存储管理:管理文件存储配置,支持本地存储、兼容 S3 协议对象存储
- 终端管理:多端认证管理,可设置不同的 token 有效期
- 系统配置:
- 基础配置提供修改系统标题、Logo、favicon、版权信息等基础配置功能以方便用户系统与其自身品牌形象保持一致
- 邮件配置:提供系统发件箱配置,也支持通过配置文件指定
- 安全配置:提供密码策略修改,支持丰富的密码策略设定,包括但不限于 `密码有效期``密码重复次数``密码错误锁定账号次数、时间`
- 在线用户:管理当前登录用户,可一键踢除下线
- 日志管理:管理系统登录日志、操作日志,支持查看日志详情,包含请求头、响应头等报文信息
- 任务管理:管理系统定时任务,包含新增、修改、删除、执行功能,支持 Cron可配置式生成 Cron 表达式) 和固定频率
- 任务日志:管理定时任务执行日志,包含停止、重试指定批次,查询集群各节点的详细输出日志等功能
- 应用管理:管理第三方系统应用 AK、SK包含新增、修改、删除、查看密钥、重置密钥等功能支持设置密钥有效期
- 代码生成:提供根据数据库表自动生成相应的前后端 CRUD 代码的功能,支持同步最新表结构及代码生成预览
## 系统截图
> [!TIP]
> 受篇幅长度及功能更新频率影响,下方仅为系统 **部分** 功能于 **2024年11月18日** 进行的截图,更多新增功能及细节请登录演示环境或 clone 代码到本地启动查看。
<table border="1" cellpadding="1" cellspacing="1" style="width: 500px">
<tbody>
<tr>
<td><img src=".image/screenshot/000登录页面.png" alt="登录页面" width="1920" /></td>
<td><img src=".image/screenshot/000登录页面-H5.png" alt="登录页面-H5" width="1920" /></td>
</tr>
<tr>
<td><img src=".image/screenshot/001仪表盘.png" alt="仪表盘" width="1920" /></td>
<td><img src=".image/screenshot/002分析页.png" alt="分析页" width="1920" /></td>
</tr>
<tr>
<td><img src=".image/screenshot/010个人中心.png" alt="个人中心" width="1920" /></td>
<td><img src=".image/screenshot/013消息中心.png" alt="消息中心" width="1920" /></td>
</tr>
<tr>
<td><img src=".image/screenshot/011安全设置-修改邮箱.png" alt="安全设置-修改邮箱" width="1920" /></td>
<td><img src=".image/screenshot/012安全设置-修改邮箱-邮箱验证码.png" alt="安全设置-修改邮箱-邮箱验证码" width="1920" /></td>
</tr>
<tr>
<td><img src=".image/screenshot/060系统管理-系统配置.png" alt="系统管理-系统配置" width="1920" /></td>
<td><img src=".image/screenshot/061系统管理-安全配置.png" alt="系统管理-安全配置" width="1920" /></td>
</tr>
<tr>
<td><img src=".image/screenshot/020系统管理-用户管理-列表.png" alt="系统管理-用户管理-列表" width="1920" /></td>
<td><img src=".image/screenshot/021系统管理-用户管理-新增.png" alt="系统管理-用户管理-新增" width="1920" /></td>
</tr>
<tr>
<td><img src=".image/screenshot/025系统管理-角色管理-列表.png" alt="系统管理-角色管理-列表" width="1920" /></td>
<td><img src=".image/screenshot/026系统管理-角色管理-新增.png" alt="系统管理-角色管理-新增" width="1920" /></td>
</tr>
<tr>
<td><img src=".image/screenshot/030系统管理-菜单管理-列表.png" alt="系统管理-菜单管理-列表" width="1920" /></td>
<td><img src=".image/screenshot/031系统管理-菜单管理-新增.png" alt="系统管理-菜单管理-新增" width="1920" /></td>
</tr>
<tr>
<td><img src=".image/screenshot/045系统管理-公告管理-列表.png" alt="系统管理-公告管理-列表" width="1920" /></td>
<td><img src=".image/screenshot/046系统管理-公告管理-修改.png" alt="系统管理-公告管理-修改" width="1920" /></td>
</tr>
<tr>
<td><img src=".image/screenshot/040系统管理-字典管理-列表.png" alt="系统管理-字典管理-列表" width="1920" /></td>
<td><img src=".image/screenshot/041系统管理-字典项管理.png" alt="系统管理-字典项管理" width="1920" /></td>
</tr>
<tr>
<td><img src=".image/screenshot/051系统管理-文件管理-列表-2.png" alt="系统管理-文件管理-列表-2" width="1920" /></td>
<td><img src=".image/screenshot/052系统管理-文件管理-查看文档.png" alt="系统管理-文件管理-查看文档" width="1920" /></td>
</tr>
<tr>
<td><img src=".image/screenshot/301系统工具-代码生成-配置.png" alt="系统工具-代码生成-配置" width="1920" /></td>
<td><img src=".image/screenshot/302系统工具-代码生成-预览.png" alt="系统工具-代码生成-预览" width="1920" /></td>
</tr>
<tr>
<td><img src=".image/screenshot/100系统监控-在线用户.png" alt="系统监控-在线用户" width="1920" /></td>
<td><img src=".image/screenshot/101系统监控-系统日志-登录日志.png" alt="系统监控-系统日志-登录日志" width="1920" /></td>
</tr>
<tr>
<td><img src=".image/screenshot/102系统监控-系统日志-操作日志.png" alt="系统监控-系统日志-操作日志" width="1920" /></td>
<td><img src=".image/screenshot/103系统监控-系统日志-操作日志-详情.png" alt="系统监控-系统日志-操作日志-详情" width="1920" /></td>
</tr>
</tbody>
</table>
## 快速开始
> **Note**
> 更详细的流程,请查看在线文档[《快速开始》](https://continew.top/admin/intro/quick-start.html#%E5%89%8D%E7%AB%AF)。
```
# 1.克隆本项目
git clone https://github.com/charles7c/continew-admin-ui.git
git clone https://gitee.com/continew/continew-admin-ui.git
# 2.在 IDEVisual Studio Code/WebStorm中打开前端项目 continew-admin-ui
# 3.安装 pnpm
npm install -g pnpm
# 4.安装依赖
pnpm i
# 5.启动程序
# 5.1 启动成功:访问 http://localhost:5173/
pnpm dev
```
## 项目结构
```
continew-admin-ui
├─ config # Vite 插件配置
├─ public # 公共静态资源favicon.ico、logo.svg
├─ src
│ ├─ apis # 请求接口
│ │ ├─ auth # 认证模块
│ │ ├─ code # 代码生成模块
│ │ ├─ common # 公共模块
│ │ ├─ monitor # 系统监控模块
│ │ ├─ open # 能力开放模块
│ │ ├─ schedule # 任务调度模块
│ │ └─ system # 系统管理模块
│ ├─ assets # 静态资源
│ │ ├─ icons # 图标资源
│ │ ├─ images # 图片资源
│ │ └─ fonts # 字体资源
│ ├─ components # 通用业务组件
│ ├─ config # 全局配置(包含 echarts 主题)
│ │ └─ settings.json # 配置文件
│ ├─ directives # 指令集(如需,可自行补充)
│ ├─ hooks # 全局 hooks
│ ├─ layout # 布局
│ ├─ mock # 模拟数据
│ ├─ router # 路由配置
│ ├─ stores # 状态管理中心
│ ├─ types # TypeScript 类型
│ ├─ utils # 工具库mock 全局开启/关闭)
│ ├─ views # 页面
│ │ ├─ code # 代码生成
│ │ │ └─ generator # 代码生成
│ │ ├─ dashboard # 仪表盘
│ │ │ ├─ analysis # 分析页
│ │ │ └─ workplace # 工作台
│ │ ├─ default # 默认页面
│ │ ├─ login # 登录模块
│ │ ├─ monitor # 系统监控
│ │ │ ├─ log # 系统日志
│ │ │ │ ├─ login # 登录日志
│ │ │ │ └─ operation # 操作日志
│ │ │ └─ online # 在线用户
│ │ ├─ open # 能力开放
│ │ │ └─ user # 应用管理
│ │ ├─ setting # 设置
│ │ │ ├─ profile # 个人中心
│ │ │ └─ message # 消息中心
│ │ └─ system # 系统管理
│ │ ├─ config # 系统配置
│ │ ├─ dept # 部门管理
│ │ ├─ dict # 字典管理
│ │ ├─ file # 文件管理
│ │ ├─ menu # 菜单管理
│ │ ├─ notice # 通知公告
│ │ ├─ role # 角色管理
│ │ ├─ storage # 存储管理
│ │ └─ user # 用户管理
│ ├─ App.vue
│ └─ main.ts
├─ .env.development # 开发环境配置
├─ .env.production # 生产环境配置
├─ .env.test # 测试环境配置
├─ eslint.config.js # ESLint 配置
├─ index.html
├─ package.json
├─ package-lock.json
├─ pnpm-lock.yaml
├─ tsconfig.json
├─ vite.config.ts
├─ .gitignoreGit 忽略文件相关配置文件)
├─ .githubGitHub 相关配置目录,实际开发时直接删除)
├─ .idea
│ └─ icon.pngIDEA 项目图标,实际开发时直接删除)
├─ .image截图目录实际开发时直接删除
├─ .vscodeVSCode 配置目录)
├─ LICENSE开源协议文件
├─ CHANGELOG.md更新日志文件实际开发时直接删除
└─ README.md项目 README 文件,实际开发时替换为真实内容)
```
## 贡献指南
ContiNew Admin 致力于提供开箱即用持续舒适的开发体验。作为一个开源项目Creator 的初心是希望 ContiNew Admin 依托开源协作模式,提升技术透明度、放大集体智慧、共创优秀实践,源源不断地为企业级项目开发提供助力。
我们非常欢迎广大社区用户为 ContiNew Admin **贡献(开发,测试、文档、答疑等)** 或优化代码,欢迎各位感兴趣的小伙伴儿,[添加微信](https://continew.top/support.html) 讨论或认领任务。
### 分支说明
ContiNew Admin 的分支目前分为下个大版本的开发分支和上个大版本的维护分支PR 前请注意对应分支是否处于维护状态,版本支持情况请查看 [更新日志/版本支持](https://continew.top/admin/other/changelog.html#%E7%89%88%E6%9C%AC%E6%94%AF%E6%8C%81)。
| 分支 | 说明 |
| ----- | ------------------------------------------------------------ |
| dev | 开发分支,默认为下个大版本的 SNAPSHOT 版本,接受新功能或新功能优化 PR |
| x.x.x | 维护分支,在 vx.x.x 版本维护期终止前(一般为下个大版本发布前),用于修复上个版本的 Bug只接受已有功能修复不接受新功能 PR |
### 贡献代码
如果您想提交新功能或优化现有代码,可以按照以下步骤操作:
1. 首先,在 Gitee 或 GitHub 上将项目 fork 到您自己的仓库
2. 然后,将 fork 过来的项目(即您的项目)克隆到本地
3. 切换到当前仍在维护的分支(请务必充分了解分支使用说明,可进群联系维护者确认)
4. 开始修改代码,修改完成后,将代码 commit 并 push 到您的远程仓库
5. 在 Gitee 或 GitHub 上新建 pull requestpr选择好源和目标按模板要求填写说明信息后提交即可多多参考 [已批准合并的 pr 记录](https://github.com/Charles7c/continew-admin-ui/pulls?q=is%3Apr+is%3Amerged),会大大增加批准合并率)
6. 最后,耐心等待维护者合并您的请求即可
请记住,如果您有任何疑问或需要帮助,我们将随时提供支持。
> [!IMPORTANT]
> 欢迎大家为 ContiNew Admin 贡献代码,我们非常感谢您的支持!为了更好地管理项目,维护者有一些要求:
>
> 1. 请确保代码、配置文件的结构和命名规范良好,完善的代码注释
> 2. 在提交代码前,请按照 [Angular 提交规范](https://github.com/conventional-changelog/conventional-changelog/tree/master/packages/conventional-changelog-angular) 编写 commit 的 message
## 反馈交流
欢迎各位小伙伴儿扫描下方二维码加入项目交流群,与项目维护团队及其他大佬用户实时交流讨论。
<div align="left">
<img src=".image/qrcode.jpg" alt="二维码" height="230px" />
</div>
## 鸣谢
### 鸣谢
感谢参与贡献的每一位小伙伴🥰
<a href="https://github.com/Charles7c/continew-admin/graphs/contributors">
<img src="https://contrib.rocks/image?repo=Charles7c/continew-admin" />
</a>
### 特别鸣谢
- 感谢 <a href="https://www.jetbrains.com/" target="_blank">JetBrains</a> 提供的 <a href="https://jb.gg/OpenSourceSupport" target="_blank">非商业开源软件开发授权</a>
- 感谢 [Gi Demo ](https://gitee.com/lin0716/gi-demo) 开箱即用的 Vue 中后台管理系统前端模板
- 感谢项目使用或未使用到的每一款开源组件,致敬各位开源先驱 :fire:
## License
- 遵循 <a href="https://github.com/Charles7c/continew-admin-ui/blob/dev/LICENSE" target="_blank">Apache-2.0</a> 开源许可协议
- Copyright © 2022-present <a href="https://blog.charles7c.top" target="_blank">Charles7c</a>

View File

@@ -0,0 +1,25 @@
import boxen from 'boxen'
import picocolors from 'picocolors'
import type { Plugin } from 'vite'
export default function appInfo(): Plugin {
return {
name: 'appInfo',
apply: 'serve',
async buildStart() {
const { bold, green, cyan, bgGreen, underline } = picocolors
// eslint-disable-next-line no-console
console.log(
boxen(
`${bold(green(`${bgGreen('ContiNew Admin v3.6.0-SNAPSHOT')}`))}\n${cyan('在线文档:')}${underline('https://continew.top')}\n${cyan('常见问题:')}${underline('https://continew.top/faq.html')}\n${cyan('持续迭代优化的前后端分离中后台管理系统框架。')}`,
{
padding: 1,
margin: 1,
borderStyle: 'double',
textAlignment: 'center',
},
),
)
},
}
}

View File

@@ -0,0 +1,12 @@
import autoImport from 'unplugin-auto-import/vite'
export default function createAutoImport() {
return autoImport({
// 自动导入 vue 相关函数
imports: ['vue', 'vue-router', {
// vue 3.5.x
vue: ['useTemplateRef', 'onWatcherCleanup', 'useId'],
}],
dts: './src/types/auto-imports.d.ts',
})
}

View File

@@ -0,0 +1,11 @@
import components from 'unplugin-vue-components/vite'
export default function createComponents() {
return components({
// 指定组件位置,默认是 src/components 自动导入自定义组件
dirs: ['src/components'],
extensions: ['vue', 'tsx'],
// 配置文件生成位置
dts: './src/types/components.d.ts',
})
}

View File

@@ -0,0 +1,6 @@
import VueDevTools from 'vite-plugin-vue-devtools'
export default function createDevtools(env) {
const { VITE_OPEN_DEVTOOLS } = env
return VITE_OPEN_DEVTOOLS === 'true' && VueDevTools()
}

20
config/plugins/index.ts Normal file
View File

@@ -0,0 +1,20 @@
import type { PluginOption } from 'vite'
import vue from '@vitejs/plugin-vue'
import vueJsx from '@vitejs/plugin-vue-jsx'
import appInfo from './app-info'
import createDevtools from './devtools'
import createAutoImport from './auto-import'
import createComponents from './components'
import createSvgIcon from './svg-icon'
import createMock from './mock'
export default function createVitePlugins(viteEnv, isBuild = false) {
const vitePlugins: (PluginOption | PluginOption[])[] = [appInfo(), vue(), vueJsx()]
vitePlugins.push(createDevtools(viteEnv))
vitePlugins.push(createAutoImport())
vitePlugins.push(createComponents())
vitePlugins.push(createSvgIcon(isBuild))
vitePlugins.push(createMock(viteEnv, isBuild))
return vitePlugins
}

17
config/plugins/mock.ts Normal file
View File

@@ -0,0 +1,17 @@
import { viteMockServe } from 'vite-plugin-mock'
export default function createMock(env, isBuild) {
const { VITE_BUILD_MOCK } = env
return viteMockServe({
mockPath: 'src/mock', // 目录位置
logger: !isBuild, // 是否在控制台显示请求日志
supportTs: true, // 是否读取 ts 文件模块
localEnabled: true, // 设置是否启用本地mock文件
prodEnabled: isBuild && VITE_BUILD_MOCK === 'true', // 设置打包是否启用mock功能
// 这样可以控制关闭mock的时候不让mock打包到最终代码内
injectCode: `
import { setupProdMockServer } from '../src/mock/index';
setupProdMockServer();
`,
})
}

View File

@@ -0,0 +1,13 @@
import path from 'node:path'
import process from 'node:process'
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
export default function createSvgIcon(isBuild) {
return createSvgIconsPlugin({
// 指定需要缓存的图标文件夹
iconDirs: [path.resolve(process.cwd(), 'src/assets/icons')],
// 指定 symbolId 格式
symbolId: 'icon-[dir]-[name]',
svgoOptions: isBuild,
})
}

48
eslint.config.js Normal file
View File

@@ -0,0 +1,48 @@
import antfu from '@antfu/eslint-config'
// https://github.com/antfu/eslint-config
export default antfu(
{
vue: {
overrides: {
'vue/block-order': ['error', {
order: [['script', 'template'], 'style'],
}], // 强制组件顶级元素的顺序
'vue/define-macros-order': ['error', {
order: ['defineOptions', 'defineModel', 'defineProps', 'defineEmits', 'defineSlots'],
defineExposeLast: true,
}], // 强制执行定义限制和定义弹出编译器宏的顺序
'vue/singleline-html-element-content-newline': 'off', // 要求在单行元素的内容前后换行
'vue/html-self-closing': ['off', {
html: {
void: 'never',
normal: 'always',
component: 'never',
},
}], // 强制自结束样式
'vue/custom-event-name-casing': ['error', 'kebab-case'], // 对自定义事件名称强制使用特定大小写
},
},
typescript: true,
ignores: [
'**/*.md',
'.github',
'.image',
'src/types/shims-vue.d.ts',
],
},
{
rules: {
'curly': ['off', 'all'], // 对所有控制语句强制使用一致的大括号样式
'no-new': 'off', // 不允许在赋值或比较之外使用 new 运算符
// 'no-console': 'error', // 禁止使用 console
'style/arrow-parens': ['error', 'always'], // 箭头函数参数需要括号
'style/brace-style': ['error', '1tbs', { allowSingleLine: true }], // 对块执行一致的大括号样式
'regexp/no-unused-capturing-group': 'off',
'regexp/no-super-linear-backtracking': 'off',
'node/prefer-global/process': 'off',
'antfu/top-level-function': 'off',
'antfu/if-newline': 'off',
},
},
)

34
index.html Normal file
View File

@@ -0,0 +1,34 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<link rel="shortcut icon" href="/favicon.ico" />
<meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=0" />
<link rel="stylesheet" href="/static/css/loading.css" type="text/css" />
<title></title>
</head>
<body>
<div id="app">
<section class="init-box">
<div class="init-loading">
<div class="init-loading-rect"></div>
<div class="init-loading-rect"></div>
<div class="init-loading-rect"></div>
<div class="init-loading-rect"></div>
<div class="init-loading-rect"></div>
</div>
</section>
</div>
<script type="module" src="/src/main.ts"></script>
<script>
var _hmt = _hmt || [];
(function() {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?be968d539e394cf45975b5117965eb10";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
</script>
</body>
</html>

99
package.json Normal file
View File

@@ -0,0 +1,99 @@
{
"name": "ysoft-ui",
"type": "module",
"version": "3.6.0-SNAPSHOT",
"private": "true",
"scripts": {
"bootstrap": "pnpm install --registry=https://registry.npmmirror.com",
"dev": "vite --host",
"build": "vue-tsc --noEmit && vite build",
"build:test": "vue-tsc --noEmit && vite build --mode test",
"preview": "vite preview --port 5050",
"typecheck": "vue-tsc --noEmit",
"lint": "eslint .",
"lint:fix": "eslint . --fix"
},
"dependencies": {
"@amap/amap-jsapi-loader": "^1.0.1",
"@arco-design/color": "^0.4.0",
"@arco-themes/vue-gi-demo": "^0.0.51",
"@codemirror/lang-javascript": "^6.2.1",
"@codemirror/lang-vue": "^0.1.2",
"@codemirror/theme-one-dark": "^6.1.2",
"@ddietr/codemirror-themes": "^1.4.2",
"@vue-office/docx": "1.6.0",
"@vue-office/excel": "1.7.1",
"@vue-office/pdf": "1.6.4",
"@vueuse/components": "^10.5.0",
"@vueuse/core": "^10.5.0",
"aieditor": "^1.0.13",
"animate.css": "^4.1.1",
"ant-design-vue": "^4.2.6",
"axios": "^0.27.2",
"codemirror": "^6.0.1",
"cron-parser": "^4.9.0",
"crypto-js": "^4.2.0",
"dayjs": "^1.11.4",
"echarts": "^5.4.2",
"flv.js": "^1.6.2",
"hls.js": "^1.6.15",
"jsencrypt": "^3.3.2",
"lint-staged": "^15.2.10",
"lodash-es": "^4.17.21",
"mitt": "^3.0.0",
"mockjs": "^1.1.0",
"nprogress": "^0.2.0",
"pinia": "^2.0.16",
"pinia-plugin-persistedstate": "^3.1.0",
"qs": "^6.11.2",
"query-string": "^9.0.0",
"v-viewer": "^3.0.10",
"viewerjs": "^1.11.6",
"vite-plugin-vue-devtools": "^7.0.27",
"vue": "^3.5.4",
"vue-codemirror6": "^1.1.27",
"vue-color-kit": "^1.0.5",
"vue-cropper": "^1.1.1",
"vue-demi": "^0.14.10",
"vue-draggable-plus": "^0.3.5",
"vue-echarts": "^6.5.5",
"vue-json-pretty": "^2.4.0",
"vue-router": "^4.3.3",
"vue3-tree-org": "^4.2.2",
"xe-utils": "^3.5.7",
"xgplayer": "^3.0.23",
"xgplayer-flv": "^3.0.23"
},
"devDependencies": {
"@antfu/eslint-config": "^2.16.3",
"@arco-design/web-vue": "^2.57.0",
"@types/crypto-js": "^4.2.2",
"@types/lodash-es": "^4.17.12",
"@types/node": "^20.2.5",
"@types/query-string": "^6.3.0",
"@vitejs/plugin-vue": "^5.2.1",
"@vitejs/plugin-vue-jsx": "^3.1.0",
"@vue/tsconfig": "^0.1.3",
"boxen": "^7.1.1",
"eslint": "^9.0.0",
"less": "^4.1.3",
"less-loader": "^11.0.0",
"picocolors": "^1.0.0",
"sass": "^1.62.1",
"sass-loader": "^13.2.2",
"typescript": "~5.0.4",
"unplugin-auto-import": "^0.16.4",
"unplugin-vue-components": "^0.25.1",
"vite": "^5.1.5",
"vite-plugin-mock": "^2.9.8",
"vite-plugin-style-import": "^2.0.0",
"vite-plugin-svg-icons": "^2.0.1",
"vue-tsc": "2.0.19"
},
"simple-git-hooks": {
"pre-commit": "pnpm lint-staged"
},
"lint-staged": {
"*": "eslint --fix"
}
}

9795
pnpm-lock.yaml generated Normal file

File diff suppressed because it is too large Load Diff

BIN
public/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

9
public/logo.svg Normal file
View File

@@ -0,0 +1,9 @@
<svg width="33" height="33" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 174.8 204">
<path fill="#307AF2" d="M86.7,0l88,51v.2l-16.3,9.4v-.2L86.7,18.9Zm71.8,143.5,16.3,9.4v.2L86.8,204h0l-16.3-9.4,16.3-9.4h0l71.7-41.5v-.2Z"/>
<path fill="#12D2AC" d="M16.3,143.5v.2L58,167.8l-16.3,9.4L0,153.1v-.2Z"/>
<path fill="#12D2AC" d="M104.1,93,15.9,143.8l-.2-.1V124.9l.2.1L87.7,83.6,104.1,93Z"/>
<path fill="#0057FE" d="M88.1,0,.1,51v.2l16.3,9.4v-.2L88.1,18.9Z"/>
<path fill="#307AF2" d="M.1,50.9.2,152.6l.2.1,16.3-9.4-.2-.1-.1-82.9L.1,50.9Z"/>
<path fill="#0057FE" d="M174.7,50.9l-.1,101.7-.2.1-16.3-9.4.2-.1.1-82.9Z"/>
<path fill="#12D2AC" d="M41.7,158.5l16.1,9.4,100.6-58.7V90.4Z"/>
</svg>

After

Width:  |  Height:  |  Size: 683 B

View File

@@ -0,0 +1,49 @@
body {
overflow: hidden;
}
.init-box {
width: 100vw;
height: 100vh;
display: flex;
justify-content: center;
align-items: center;
}
.init-loading {
width: 40px;
height: 40px;
display: flex;
justify-content: space-between;
}
.init-loading-rect {
background-color: #007aff;
height: 100%;
width: 15%;
animation: init-wave 1.2s infinite ease-in-out;
}
.init-loading-rect:nth-child(1) {
animation-delay: -1.2s;
}
.init-loading-rect:nth-child(2) {
animation-delay: -1.1s;
}
.init-loading-rect:nth-child(3) {
animation-delay: -1s;
}
.init-loading-rect:nth-child(4) {
animation-delay: -0.9s;
}
.init-loading-rect:nth-child(5) {
animation-delay: -0.8s;
}
@keyframes init-wave {
0%,
40%,
100% {
transform: scaleY(0.4);
}
20% {
transform: scaleY(1);
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

42
src/App.vue Normal file

File diff suppressed because one or more lines are too long

9
src/apis/area/index.ts Normal file
View File

@@ -0,0 +1,9 @@
import type * as T from './type'
import http from '@/utils/http'
export type * from './type'
/** @desc 获取地区列表 */
export const getAreaList = (params: { type: 'province' | 'city' | 'area', code?: string }) => {
return http.get<T.AreaItem>('/area/list', params)
}

5
src/apis/area/type.ts Normal file
View File

@@ -0,0 +1,5 @@
export interface AreaItem {
label: string
code: string
children?: AreaItem[]
}

46
src/apis/auth/index.ts Normal file
View File

@@ -0,0 +1,46 @@
import type * as T from './type'
import http from '@/utils/http'
export type * from './type'
const BASE_URL = '/auth'
/** @desc 账号登录 */
export function accountLogin(req: T.AccountLoginReq) {
return http.post<T.LoginResp>(`${BASE_URL}/login`, req)
}
/** @desc 手机号登录 */
export function phoneLogin(req: T.PhoneLoginReq) {
return http.post<T.LoginResp>(`${BASE_URL}/login`, req)
}
/** @desc 邮箱登录 */
export function emailLogin(req: T.EmailLoginReq) {
return http.post<T.LoginResp>(`${BASE_URL}/login`, req)
}
/** @desc 三方账号登录 */
export function socialLogin(req: any) {
return http.post<T.LoginResp>(`${BASE_URL}/login`, req)
}
/** @desc 三方账号登录授权 */
export function socialAuth(source: string) {
return http.get<T.SocialAuthAuthorizeResp>(`${BASE_URL}/${source}`)
}
/** @desc 退出登录 */
export function logout() {
return http.post(`${BASE_URL}/logout`)
}
/** @desc 获取用户信息 */
export const getUserInfo = () => {
return http.get<T.UserInfo>(`${BASE_URL}/user/info`)
}
/** @desc 获取路由信息 */
export const getUserRoute = () => {
return http.get<T.RouteItem[]>(`${BASE_URL}/user/route`)
}

88
src/apis/auth/type.ts Normal file
View File

@@ -0,0 +1,88 @@
/** 用户类型 */
export interface UserInfo {
id: string
username: string
nickname: string
gender: 0 | 1 | 2
email: string
phone: string
avatar: string
pwdResetTime: string
pwdExpired: boolean
registrationDate: string
deptName: string
roles: string[]
permissions: string[]
}
/** 路由类型 */
export interface RouteItem {
id: string
title: string
parentId: string
type: 1 | 2 | 3
path: string
name: string
component: string
redirect: string
icon: string
isExternal: boolean
isHidden: boolean
isCache: boolean
permission: string
roles: string[]
sort: number
status: 0 | 1
children: RouteItem[]
activeMenu: string
alwaysShow: boolean
breadcrumb: boolean
showInTabs: boolean
affix: boolean
}
/** 认证类型 */
export type AuthType = 'ACCOUNT' | 'PHONE' | 'EMAIL' | 'SOCIAL'
export const AuthTypeConstants = {
ACCOUNT: 'ACCOUNT',
PHONE: 'PHONE',
EMAIL: 'EMAIL',
SOCIAL: 'SOCIAL',
} as const
/** 基础认证请求接口 */
export interface AuthReq {
clientId?: string
authType?: AuthType
}
/** 账号登录请求参数 */
export interface AccountLoginReq extends AuthReq {
username: string
password: string
captcha: string
uuid: string
}
/** 手机号登录请求参数 */
export interface PhoneLoginReq extends AuthReq {
phone: string
captcha: string
}
/** 邮箱登录请求参数 */
export interface EmailLoginReq extends AuthReq {
email: string
captcha: string
}
/** 登录响应类型 */
export interface LoginResp {
token: string
}
/** 第三方登录授权类型 */
export interface SocialAuthAuthorizeResp {
authorizeUrl: string
}

View File

@@ -0,0 +1,54 @@
import type * as T from './type'
import http from '@/utils/http'
import type { LabelValueState } from '@/types/global'
export type * from './type'
const BASE_URL = '/code/generator'
/** @desc 查询代码生成列表 */
export function listGenConfig(query: T.GenConfigPageQuery) {
return http.get<PageRes<T.GenConfigResp[]>>(`${BASE_URL}/config`, query)
}
/** @desc 查询生成配置信息 */
export function getGenConfig(tableName: string) {
return http.get<T.GenConfigResp>(`${BASE_URL}/config/${tableName}`)
}
/** @desc 查询字段配置列表 */
export function listFieldConfig(tableName: string, requireSync: boolean) {
return http.get<T.FieldConfigResp[]>(`${BASE_URL}/field/${tableName}?requireSync=${requireSync}`)
}
/** @desc 保存配置信息 */
export function saveGenConfig(tableName: string, req: T.GeneratorConfigResp) {
return http.post(`${BASE_URL}/config/${tableName}`, req)
}
/** @desc 生成预览 */
export function genPreview(tableNames: Array<string>) {
return http.get<T.GeneratePreviewResp[]>(`${BASE_URL}/preview/${tableNames}`)
}
/** @desc 生成代码 */
export function downloadCode(tableNames: Array<string>) {
return http.requestNative({
url: `${BASE_URL}/${tableNames}/download`,
method: 'post',
responseType: 'blob',
})
}
/** @desc 生成代码 */
export function generateCode(tableNames: Array<string>) {
return http.requestNative({
url: `${BASE_URL}/${tableNames}`,
method: 'post',
})
}
/** @desc 查询字典列表 */
export function listFieldConfigDict() {
return http.get<LabelValueState[]>(`${BASE_URL}/dict`)
}

1
src/apis/code/index.ts Normal file
View File

@@ -0,0 +1 @@
export * from './generator'

45
src/apis/code/type.ts Normal file
View File

@@ -0,0 +1,45 @@
/** 工具代码生成类型 */
export interface GenConfigResp {
tableName: string
comment: string
moduleName: string
packageName: string
businessName: string
author: string
tablePrefix: string
isOverride: boolean
createTime?: string
updateTime?: string
classNamePrefix?: string
}
export interface GenConfigQuery {
tableName?: string
}
export interface GenConfigPageQuery extends PageQuery, GenConfigQuery {}
export interface FieldConfigResp {
tableName: string
columnName: string
columnType: string
fieldName: string
fieldType: string
fieldSort: number
comment: string
isRequired: boolean
showInList: boolean
showInForm: boolean
showInQuery: boolean
formType: string
queryType: string
dictCode: string
createTime?: string
}
export interface GeneratorConfigResp {
genConfig: GenConfigResp
fieldConfigs: FieldConfigResp[]
}
export interface GeneratePreviewResp {
path: string
fileName: string
content: string
}

View File

@@ -0,0 +1,31 @@
import type * as T from './type'
import http from '@/utils/http'
export type * from './type'
const BASE_URL = '/captcha'
/** @desc 获取图片验证码 */
export function getImageCaptcha() {
return http.get<T.ImageCaptchaResp>(`${BASE_URL}/image`)
}
/** @desc 获取短信验证码 */
export function getSmsCaptcha(phone: string, captchaReq: T.BehaviorCaptchaReq) {
return http.get<boolean>(`${BASE_URL}/sms?phone=${phone}&captchaVerification=${encodeURIComponent(captchaReq.captchaVerification || '')}`)
}
/** @desc 获取邮箱验证码 */
export function getEmailCaptcha(email: string, captchaReq: T.BehaviorCaptchaReq) {
return http.get<boolean>(`${BASE_URL}/mail?email=${email}&captchaVerification=${encodeURIComponent(captchaReq.captchaVerification || '')}`)
}
/** @desc 获取行为验证码 */
export function getBehaviorCaptcha(req: any) {
return http.get<T.BehaviorCaptchaResp>(`${BASE_URL}/behavior`, req)
}
/** @desc 校验行为验证码 */
export function checkBehaviorCaptcha(req: any) {
return http.post<T.CheckBehaviorCaptchaResp>(`${BASE_URL}/behavior`, req)
}

65
src/apis/common/common.ts Normal file
View File

@@ -0,0 +1,65 @@
import type { TreeNodeData } from '@arco-design/web-vue'
import http from '@/utils/http'
import type { LabelValueState } from '@/types/global'
const BASE_URL = '/common'
/** @desc 查询部门树 */
export function listDeptTree(query: { description: string | unknown }) {
return http.get<TreeNodeData[]>(`${BASE_URL}/tree/dept`, query)
}
/** @desc 查询部门树 */
export function listBranchTree(query: { description: string | unknown }) {
return http.get<TreeNodeData[]>(`${BASE_URL}/tree/branch`, query)
}
/** @desc 查询空间树 */
export function listSpaceTree(query: { description: string | unknown }) {
return http.get<TreeNodeData[]>(`${BASE_URL}/tree/space`, query)
}
/** @desc 查询空间树 */
export function listPointTree(query: { description: string | unknown }) {
return http.get<TreeNodeData[]>(`${BASE_URL}/tree/point`, query)
}
/** @desc 查询菜单树 */
export function listMenuTree(query: { description: string }) {
return http.get<TreeNodeData[]>(`${BASE_URL}/tree/menu`, query)
}
/** @desc 查询用户列表 */
export function listUserDict(query?: { status: number }) {
return http.get<LabelValueState[]>(`${BASE_URL}/dict/user`, query)
}
/** @desc 查询角色列表 */
export function listRoleDict(query?: { name: string, status: number }) {
return http.get<LabelValueState[]>(`${BASE_URL}/dict/role`, query)
}
/** @desc 查询字典列表 */
export function listCommonDict(code: string) {
return http.get<LabelValueState[]>(`${BASE_URL}/dict/${code}`)
}
/** @desc 查询系统配置参数 */
export function listSiteOptionDict() {
return http.get<LabelValueState[]>(`${BASE_URL}/dict/option/site`)
}
/** @desc 上传文件 */
export function uploadFile(data: FormData) {
return http.post(`${BASE_URL}/file`, data)
}
/** @desc 上传文件 */
export function updateUpload(data: object) {
return http.post(`${BASE_URL}/updateUpload`, data)
}
/** @desc 上传人像 */
export function faceUpload(data: object) {
return http.post(`${BASE_URL}/faceUpload`, data)
}

View File

@@ -0,0 +1,51 @@
import type * as T from './type'
import http from '@/utils/http'
export type * from './type'
const BASE_URL = '/dashboard'
/** @desc 查询公告列表 */
export function listDashboardNotice() {
return http.get<T.DashboardNoticeResp[]>(`${BASE_URL}/notice`)
}
/** @desc 查询 PV 总览 */
export function getDashboardOverviewPv() {
return http.get<T.DashboardOverviewCommonResp>(`${BASE_URL}/analysis/overview/pv`)
}
/** @desc 查询 IP 总览 */
export function getDashboardOverviewIp() {
return http.get<T.DashboardOverviewCommonResp>(`${BASE_URL}/analysis/overview/ip`)
}
/** @desc 查询地域分析 */
export function getAnalysisGeo() {
return http.get<T.DashboardChartCommonResp[]>(`${BASE_URL}/analysis/geo`)
}
/** @desc 查询访问趋势 */
export function getDashboardAccessTrend(days: number) {
return http.get<T.DashboardAccessTrendResp[]>(`${BASE_URL}/access/trend/${days}`)
}
/** @desc 查询访问时段分析 */
export function getAnalysisTimeslot() {
return http.get<T.DashboardChartCommonResp[]>(`${BASE_URL}/analysis/timeslot`)
}
/** @desc 查询模块分析 */
export function getAnalysisModule() {
return http.get<T.DashboardChartCommonResp[]>(`${BASE_URL}/analysis/module`)
}
/** @desc 查询终端分析 */
export function getAnalysisOs() {
return http.get<T.DashboardChartCommonResp[]>(`${BASE_URL}/analysis/os`)
}
/** @desc 查询浏览器分析 */
export function getAnalysisBrowser() {
return http.get<T.DashboardChartCommonResp[]>(`${BASE_URL}/analysis/browser`)
}

3
src/apis/common/index.ts Normal file
View File

@@ -0,0 +1,3 @@
export * from './common'
export * from './captcha'
export * from './dashboard'

59
src/apis/common/type.ts Normal file
View File

@@ -0,0 +1,59 @@
/** 图形验证码类型 */
export interface ImageCaptchaResp {
uuid: string
img: string
expireTime: number
isEnabled: boolean
}
/** 仪表盘公告类型 */
export interface DashboardNoticeResp {
id: number
title: string
type: number
}
/** 仪表盘访问趋势类型 */
export interface DashboardAccessTrendResp {
date: string
pvCount: number
ipCount: number
}
/** 仪表盘通用总览类型 */
export interface DashboardOverviewCommonResp {
total: number
today: number
growth: number
dataList: DashboardChartCommonResp[]
}
/** 仪表盘通用图表类型 */
export interface DashboardChartCommonResp {
name: string
value: number
}
/* 行为验证码类型 */
export interface BehaviorCaptchaResp {
originalImageBase64: string
point: {
x: number
y: number
}
jigsawImageBase64: string
token: string
secretKey: string
wordList: string[]
}
export interface BehaviorCaptchaReq {
captchaType?: string
captchaVerification?: string
clientUid?: string
}
export interface CheckBehaviorCaptchaResp {
repCode: string
repMsg: string
}

15
src/apis/index.ts Normal file
View File

@@ -0,0 +1,15 @@
export * from './area'
export * from './auth'
export * from './common'
export * from './monitor'
export * from './system'
export * from './code'
export * from './schedule'
export * from './area/type'
export * from './auth/type'
export * from './common/type'
export * from './monitor/type'
export * from './system/type'
export * from './code/type'
export * from './schedule/type'

View File

@@ -0,0 +1,2 @@
export * from './online'
export * from './log'

26
src/apis/monitor/log.ts Normal file
View File

@@ -0,0 +1,26 @@
import type * as T from './type'
import http from '@/utils/http'
export type * from './type'
const BASE_URL = '/system/log'
/** @desc 查询日志列表 */
export function listLog(query: T.LogPageQuery) {
return http.get<PageRes<T.LogResp[]>>(`${BASE_URL}`, query)
}
/** @desc 查询日志详情 */
export function getLog(id: string) {
return http.get<T.LogDetailResp>(`${BASE_URL}/${id}`)
}
/** @desc 导出登录日志 */
export function exportLoginLog(query: T.LogQuery) {
return http.download<any>(`${BASE_URL}/export/login`, query)
}
/** @desc 导出操作日志 */
export function exportOperationLog(query: T.LogQuery) {
return http.download<any>(`${BASE_URL}/export/operation`, query)
}

View File

@@ -0,0 +1,16 @@
import type * as T from './type'
import http from '@/utils/http'
export type * from './type'
const BASE_URL = '/monitor/online'
/** @desc 查询在线用户列表 */
export function listOnlineUser(query: T.OnlineUserPageQuery) {
return http.get<PageRes<T.OnlineUserResp[]>>(`${BASE_URL}`, query)
}
/** @desc 强退在线用户 */
export function kickout(token: string) {
return http.del(`${BASE_URL}/${token}`)
}

57
src/apis/monitor/type.ts Normal file
View File

@@ -0,0 +1,57 @@
/** 在线用户类型 */
export interface OnlineUserResp {
id: string
description: string
module: string
timeTaken: number
ip: string
address: string
browser: string
os: string
status: number
errorMsg: string
createUserString: string
createTime: string
}
export interface OnlineUserQuery {
nickname?: string
loginTime?: string
sort: Array<string>
}
export interface OnlineUserPageQuery extends OnlineUserQuery, PageQuery {}
/** 系统日志类型 */
export interface LogResp {
id: string
description: string
module: string
timeTaken: number
ip: string
address: string
browser: string
os: string
status: number
errorMsg: string
createUserString: string
createTime: string
}
export interface LogDetailResp extends LogResp {
traceId: string
requestUrl: string
requestMethod: string
requestHeaders: string
requestBody: string
statusCode: number
responseHeaders: string
responseBody: string
}
export interface LogQuery {
description?: string
module?: string
ip?: string
createUserString?: string
createTime: Array<string>
status?: number
sort: Array<string>
}
export interface LogPageQuery extends LogQuery, PageQuery {}

46
src/apis/open/app.ts Normal file
View File

@@ -0,0 +1,46 @@
import type * as T from './type'
import http from '@/utils/http'
export type * from './type'
const BASE_URL = '/open/app'
/** @desc 查询应用列表 */
export function listApp(query: T.AppPageQuery) {
return http.get<PageRes<T.AppResp[]>>(`${BASE_URL}`, query)
}
/** @desc 查询应用详情 */
export function getApp(id: string) {
return http.get<T.AppResp>(`${BASE_URL}/${id}`)
}
/** @desc 新增应用 */
export function addApp(data: any) {
return http.post(`${BASE_URL}`, data)
}
/** @desc 修改应用 */
export function updateApp(data: any, id: string) {
return http.put(`${BASE_URL}/${id}`, data)
}
/** @desc 删除应用 */
export function deleteApp(id: string) {
return http.del(`${BASE_URL}/${id}`)
}
/** @desc 导出应用 */
export function exportApp(query: T.AppQuery) {
return http.download(`${BASE_URL}/export`, query)
}
/** @desc 获取密钥 */
export function getAppSecret(id: string) {
return http.get(`${BASE_URL}/${id}/secret`)
}
/** @desc 重置密钥 */
export function resetAppSecret(id: string) {
return http.patch(`${BASE_URL}/${id}/secret`)
}

21
src/apis/open/type.ts Normal file
View File

@@ -0,0 +1,21 @@
/** 应用类型 */
export interface AppResp {
id: string
name: string
accessKey: string
secretKey: string
expireTime: string
description: string
status: 1 | 2
createUserString: string
createTime: string
updateUserString: string
updateTime: string
}
export interface AppQuery {
description?: string
sort: Array<string>
}
export interface AppPageQuery extends AppQuery, PageQuery {}

View File

@@ -0,0 +1,2 @@
export * from '../schedule/job'
export * from '../schedule/log'

41
src/apis/schedule/job.ts Normal file
View File

@@ -0,0 +1,41 @@
import type * as T from './type'
import http from '@/utils/http'
export type * from './type'
const BASE_URL = '/schedule/job'
/** @desc 查询任务组列表 */
export function listGroup() {
return http.get(`${BASE_URL}/group`)
}
/** @desc 查询任务列表 */
export function listJob(query: T.JobPageQuery) {
return http.get<PageRes<T.JobResp[]>>(`${BASE_URL}`, query)
}
/** @desc 新增任务 */
export function addJob(data: any) {
return http.post(`${BASE_URL}`, data)
}
/** @desc 修改任务 */
export function updateJob(data: any, id: number) {
return http.put(`${BASE_URL}/${id}`, data)
}
/** @desc 修改任务状态 */
export function updateJobStatus(data: any, id: number) {
return http.patch(`${BASE_URL}/${id}/status`, data)
}
/** @desc 删除任务 */
export function deleteJob(id: number) {
return http.del(`${BASE_URL}/${id}`)
}
/** @desc 执行任务 */
export function triggerJob(id: number) {
return http.post(`${BASE_URL}/trigger/${id}`)
}

36
src/apis/schedule/log.ts Normal file
View File

@@ -0,0 +1,36 @@
import type * as T from './type'
import http from '@/utils/http'
export type * from './type'
const BASE_URL = '/schedule/log'
/** @desc 查询任务日志列表 */
export function listJobLog(query: T.JobLogPageQuery) {
return http.get<PageRes<T.JobLogResp[]>>(`${BASE_URL}`, query)
}
/** @desc 查询任务日志详情 */
export function getJobLogDetail(id: number) {
return http.get<boolean>(`${BASE_URL}/${id}`)
}
/** @desc 停止任务 */
export function stopJob(id: number) {
return http.post(`${BASE_URL}/stop/${id}`)
}
/** @desc 重试任务 */
export function retryJob(id: number) {
return http.post(`${BASE_URL}/retry/${id}`)
}
/** @desc 查询任务实例列表 */
export function listJobInstance(query: T.JobInstanceQuery) {
return http.get<T.JobInstanceResp[]>(`${BASE_URL}/instance`, query)
}
/** @desc 查询任务实例日志列表 */
export function listJobInstanceLog(query: T.JobInstanceLogQuery) {
return http.get<T.JobInstanceLogResp>(`${BASE_URL}/instance/log`, query)
}

85
src/apis/schedule/type.ts Normal file
View File

@@ -0,0 +1,85 @@
/** 任务类型 */
export interface JobResp {
id: number
groupName: string
jobName: string
description?: string
triggerType: number
triggerInterval: string | number
executorType: number
taskType: number
executorInfo: string
argsStr?: string
argsType?: string
routeKey: number
blockStrategy: number
executorTimeout: number
maxRetryTimes: number
retryInterval: number
parallelNum: number
jobStatus: number
nextTriggerAt?: Date
createDt?: Date
updateDt?: Date
}
export interface JobQuery {
groupName: string
jobName?: string
jobStatus?: number
}
export interface JobPageQuery extends JobQuery, PageQuery {}
/** 任务日志类型 */
export interface JobLogResp {
id: number
groupName: string
jobName: string
jobId: number
taskBatchStatus: number
operationReason: number
executorType: number
executorInfo: string
executionAt: string
createDt: string
}
export interface JobLogQuery {
jobId?: number
groupName?: string
jobName?: string
taskBatchStatus?: number
datetimeRange?: Array<string>
}
export interface JobLogPageQuery extends JobLogQuery, PageQuery {}
/** 任务实例类型 */
export interface JobInstanceResp {
id: number
groupName: string
jobId: number
taskBatchId: number
taskStatus: number
retryCount: number
resultMessage: string
clientInfo: string
}
export interface JobInstanceQuery {
jobId?: string | number
taskBatchId?: number | string
}
/** 任务实例日志类型 */
export interface JobInstanceLogResp {
id: number
message: any[]
finished: number
fromIndex: number
nextStartId: number
}
export interface JobInstanceLogQuery {
taskBatchId: number
jobId: number
taskId: number
startId: number
fromIndex: number
size: number
}

View File

@@ -0,0 +1,62 @@
import http from '@/utils/http'
const BASE_URL = '/sysPeople/branch'
export interface BranchResp {
id: string
name: string
leader: string
phone: string
parentId: string
ancestors: string
spaceId: string
remark: string
createBy: string
createTime: string
updateBy: string
updateTime: string
deptId: string
level: string
deptCode: string
ruleId: string
ladderRuleId: string
isExamine: string
createUserString: string
updateUserString: string
disabled: boolean
children: BranchResp[]
}
export interface BranchQuery {
name: string
leader: string
}
/** @desc 查询部门管理列表 */
export function listBranch(query: BranchQuery) {
return http.get<BranchResp[]>(`${BASE_URL}/tree`, query)
}
/** @desc 查询部门管理详情 */
export function getBranch(id: string) {
return http.get<BranchResp>(`${BASE_URL}/${id}`)
}
/** @desc 新增部门管理 */
export function addBranch(data: any) {
return http.post(`${BASE_URL}`, data)
}
/** @desc 修改部门管理 */
export function updateBranch(data: any, id: string) {
return http.put(`${BASE_URL}/${id}`, data)
}
/** @desc 删除部门管理 */
export function deleteBranch(id: string) {
return http.del(`${BASE_URL}/${id}`)
}
/** @desc 导出部门管理 */
export function exportBranch(query: BranchQuery) {
return http.download(`${BASE_URL}/export`, query)
}

View File

@@ -0,0 +1,172 @@
import http from '@/utils/http'
import type {LabelValueState} from "@/types/global";
const BASE_URL = '/sysPeople/people'
export type * from '../system/type'
export interface PeopleResp {
id: string
name: string
phone: string
sex: number
avatar: string
branchId: number
branchName: string
position: string
idcard: string
carNo: string
doorNo: string
guid: string
faceGuid: string
userId: number
userName: string
remark: string
createBy: string
createTime: string
updateBy: string
updateTime: string
gh: string
fingerprint: string
joinTime: string
down: number
delFlag: string
openid: string
createUserString: string
updateUserString: string
disabled: boolean
xfFlag: string
czje: string
btje: string
isConsume: number
freeze: number
xfje: string
xfcs: string
}
export interface PeopleDepositImportResp {
importKey: string
totalRows: number
validRows: number
duplicateUserRows: number
unEnabledRows: number
}
type Long = number
export interface PeopleQuery {
name: string | undefined
branchId: string | undefined
ids: Array<Long> | undefined
branchParentId: string | undefined
sort: Array<string>
}
export interface PeoplePageQuery extends PeopleQuery, PageQuery {}
/** @desc 查询人员管理列表 */
export function listPeople(query: PeoplePageQuery) {
return http.get<PageRes<PeopleResp[]>>(`${BASE_URL}`, query)
}
/** @desc 查询人员消费列表 */
export function pageConsume(query: PeoplePageQuery) {
return http.get<PageRes<PeopleResp[]>>(`${BASE_URL}/pageConsume`, query)
}
/** @desc 查询人员名称下拉数据 */
export function getPeopleNameList(query: PeopleQuery) {
return http.get(`${BASE_URL}/getPeopleNameList`, query)
}
/** @desc 查询人员管理详情 */
export function getPeople(id: string) {
return http.get<PeopleResp>(`${BASE_URL}/${id}`)
}
/** @desc 新增人员管理 */
export function addPeople(data: any) {
return http.post(`${BASE_URL}`, data)
}
/** @desc 修改人员管理 */
export function updatePeople(data: any, id: string) {
return http.put(`${BASE_URL}/${id}`, data)
}
/** @desc 删除人员管理 */
export function deletePeople(ids: Long | Array<Long>) {
return http.del(`${BASE_URL}/${ids}`)
}
/** @desc 导出人员管理 */
export function exportPeople(query: PeopleQuery) {
return http.download(`${BASE_URL}/export`, query)
}
/** @desc 导出模板 */
export function exportTemplate() {
return http.download(`${BASE_URL}/import/template`)
}
/** @desc 解析用户导入数据 */
export function parseImportUser(data: FormData) {
return http.post(`${BASE_URL}/import/parse`, data)
}
/** @desc 导入用户 */
export function importPeople(data: any) {
return http.post(`${BASE_URL}/import`, data)
}
export function downPeople(ids: Long | Array<Long>) {
return http.get(`${BASE_URL}/down/${ids}`)
}
/** @desc 导出消费人员充值 */
export function exportConsumePeople(query: PeopleQuery) {
return http.download(`${BASE_URL}/exportConsume`, query)
}
/** @desc 下载人员充值导入模板 */
export function downloadConsumeImportTemplate() {
return http.download(`${BASE_URL}/import/template`)
}
/** @desc 解析人员充值导入数据 */
export function parseConsumeImportUser(data: FormData) {
return http.post(`${BASE_URL}/consume/import/parse`, data)
}
/** @desc 导入人员充值 */
export function importConsumeUser(data: any) {
return http.post(`${BASE_URL}/consume/import`, data)
}
/** @desc 退款人员 */
export function refundPeople(data: any) {
return http.post(`${BASE_URL}/refund`, data)
}
/** @desc 充值人员 */
export function depositPeople(data: any) {
return http.post(`${BASE_URL}/deposit`, data)
}
/** @desc 补贴人员 */
export function subsidyPeople(data: any) {
return http.post(`${BASE_URL}/subsidy`, data)
}
/** @desc 补贴人员 */
export function freeze(ids: Long[]) {
return http.post(`${BASE_URL}/freeze`, ids)
}
/** @desc 补贴人员 */
export function unFreeze(ids: Long[]) {
return http.post(`${BASE_URL}/unFreeze`, ids)
}
/** @desc 补贴人员 */
export function resetMoney(data: any) {
return http.post(`${BASE_URL}/resetMoney`, data)
}

31
src/apis/system/client.ts Normal file
View File

@@ -0,0 +1,31 @@
import type * as T from './type'
import http from '@/utils/http'
export type * from './type'
const BASE_URL = '/system/client'
/** @desc 查询终端列表 */
export function listClient(query: T.ClientPageQuery) {
return http.get<PageRes<T.ClientResp[]>>(`${BASE_URL}`, query)
}
/** @desc 查询终端详情 */
export function getClient(id: string) {
return http.get<T.ClientDetailResp>(`${BASE_URL}/${id}`)
}
/** @desc 新增终端 */
export function addClient(data: any) {
return http.post(`${BASE_URL}`, data)
}
/** @desc 修改终端 */
export function updateClient(data: any, id: string) {
return http.put(`${BASE_URL}/${id}`, data)
}
/** @desc 删除终端 */
export function deleteClient(ids: string | Array<string>) {
return http.del(`${BASE_URL}/${ids}`)
}

36
src/apis/system/dept.ts Normal file
View File

@@ -0,0 +1,36 @@
import type * as T from './type'
import http from '@/utils/http'
export type * from './type'
const BASE_URL = '/system/dept'
/** @desc 查询部门列表 */
export function listDept(query: T.DeptQuery) {
return http.get<T.DeptResp[]>(`${BASE_URL}/tree`, query)
}
/** @desc 查询部门详情 */
export function getDept(id: string) {
return http.get<T.DeptResp>(`${BASE_URL}/${id}`)
}
/** @desc 新增部门 */
export function addDept(data: any) {
return http.post<boolean>(`${BASE_URL}`, data)
}
/** @desc 修改部门 */
export function updateDept(data: any, id: string) {
return http.put(`${BASE_URL}/${id}`, data)
}
/** @desc 删除部门 */
export function deleteDept(id: string) {
return http.del(`${BASE_URL}/${id}`)
}
/** @desc 导出部门 */
export function exportDept(query: T.DeptQuery) {
return http.download(`${BASE_URL}/export`, query)
}

61
src/apis/system/dict.ts Normal file
View File

@@ -0,0 +1,61 @@
import type * as T from './type'
import http from '@/utils/http'
export type * from './type'
const BASE_URL = '/system/dict'
/** @desc 查询字典列表 */
export function listDict(query?: T.DictQuery) {
return http.get<T.DictResp[]>(`${BASE_URL}/list`, query)
}
/** @desc 查询字典详情 */
export function getDict(id: string) {
return http.get<T.DictResp>(`${BASE_URL}/${id}`)
}
/** @desc 新增字典 */
export function addDict(data: any) {
return http.post(`${BASE_URL}`, data)
}
/** @desc 修改字典 */
export function updateDict(data: any, id: string) {
return http.put(`${BASE_URL}/${id}`, data)
}
/** @desc 删除字典 */
export function deleteDict(id: string) {
return http.del(`${BASE_URL}/${id}`)
}
/** @desc 清除字典缓存 */
export function clearDictCache(code: string) {
return http.del(`${BASE_URL}/cache/${code}`)
}
/** @desc 查询字典项列表 */
export function listDictItem(query: T.DictItemPageQuery) {
return http.get<PageRes<T.DictItemResp[]>>(`${BASE_URL}/item`, query)
}
/** @desc 查询字典项详情 */
export function getDictItem(id: string) {
return http.get<T.DictItemResp>(`${BASE_URL}/item/${id}`)
}
/** @desc 新增字典项 */
export function addDictItem(data: any) {
return http.post(`${BASE_URL}/item`, data)
}
/** @desc 修改字典项 */
export function updateDictItem(data: any, id: string) {
return http.put(`${BASE_URL}/item/${id}`, data)
}
/** @desc 删除字典项 */
export function deleteDictItem(id: string) {
return http.del(`${BASE_URL}/item/${id}`)
}

31
src/apis/system/file.ts Normal file
View File

@@ -0,0 +1,31 @@
import type * as T from './type'
import http from '@/utils/http'
export type * from './type'
const BASE_URL = '/system/file'
/** @desc 查询文件列表 */
export function listFile(query: T.FilePageQuery) {
return http.get<PageRes<T.FileItem[]>>(`${BASE_URL}`, query)
}
/** @desc 修改文件 */
export function updateFile(data: any, id: string) {
return http.put(`${BASE_URL}/${id}`, data)
}
/** @desc 删除文件 */
export function deleteFile(ids: string | Array<string>) {
return http.del(`${BASE_URL}/${ids}`)
}
/** @desc 删除文件 */
export function deleteByUrl(url: string) {
return http.del(`${BASE_URL}/deleteByUrl`, { url: url })
}
/** @desc 查询文件资源统计统计 */
export function getFileStatistics() {
return http.get<T.FileStatisticsResp>(`${BASE_URL}/statistics`)
}

11
src/apis/system/index.ts Normal file
View File

@@ -0,0 +1,11 @@
export * from './user'
export * from './role'
export * from './menu'
export * from './dept'
export * from './notice'
export * from './dict'
export * from './file'
export * from './storage'
export * from './option'
export * from './user-center'
export * from './message'

36
src/apis/system/menu.ts Normal file
View File

@@ -0,0 +1,36 @@
import type * as T from './type'
import http from '@/utils/http'
export type * from './type'
const BASE_URL = '/system/menu'
/** @desc 查询菜单列表 */
export function listMenu(query?: T.MenuQuery) {
return http.get<T.MenuResp[]>(`${BASE_URL}/tree`, query)
}
/** @desc 查询菜单详情 */
export function getMenu(id: string) {
return http.get<T.MenuResp>(`${BASE_URL}/${id}`)
}
/** @desc 新增菜单 */
export function addMenu(data: any) {
return http.post<boolean>(`${BASE_URL}`, data)
}
/** @desc 修改菜单 */
export function updateMenu(data: any, id: string) {
return http.put(`${BASE_URL}/${id}`, data)
}
/** @desc 删除菜单 */
export function deleteMenu(id: string) {
return http.del(`${BASE_URL}/${id}`)
}
/** @desc 清除菜单缓存 */
export function clearMenuCache() {
return http.del(`${BASE_URL}/cache`)
}

View File

@@ -0,0 +1,26 @@
import type * as T from './type'
import http from '@/utils/http'
export type * from './type'
const BASE_URL = '/system/message'
/** @desc 查询消息列表 */
export function listMessage(query: T.MessagePageQuery) {
return http.get<PageRes<T.MessageResp[]>>(`${BASE_URL}`, query)
}
/** @desc 删除消息 */
export function deleteMessage(ids: string | Array<string>) {
return http.del(`${BASE_URL}/${ids}`)
}
/** @desc 标记已读 */
export function readMessage(ids?: string | Array<string>) {
return http.patch(`${BASE_URL}/read`, ids)
}
/** @desc 查询未读消息数量 */
export function getUnreadMessageCount() {
return http.get(`${BASE_URL}/unread`)
}

31
src/apis/system/notice.ts Normal file
View File

@@ -0,0 +1,31 @@
import type * as T from './type'
import http from '@/utils/http'
export type * from './type'
const BASE_URL = '/system/notice'
/** @desc 查询公告列表 */
export function listNotice(query: T.NoticePageQuery) {
return http.get<PageRes<T.NoticeResp[]>>(`${BASE_URL}`, query)
}
/** @desc 查询公告详情 */
export function getNotice(id: string) {
return http.get<T.NoticeResp>(`${BASE_URL}/${id}`)
}
/** @desc 新增公告 */
export function addNotice(data: any) {
return http.post(BASE_URL, data)
}
/** @desc 修改公告 */
export function updateNotice(data: any, id: string) {
return http.put(`${BASE_URL}/${id}`, data)
}
/** @desc 删除公告 */
export function deleteNotice(ids: string | Array<number>) {
return http.del(`${BASE_URL}/${ids}`)
}

21
src/apis/system/option.ts Normal file
View File

@@ -0,0 +1,21 @@
import type * as T from './type'
import http from '@/utils/http'
export type * from './type'
const BASE_URL = '/system/option'
/** @desc 查询参数列表 */
export function listOption(query: T.OptionQuery) {
return http.get<T.OptionResp[]>(`${BASE_URL}`, query)
}
/** @desc 修改参数 */
export function updateOption(data: any) {
return http.put(`${BASE_URL}`, data)
}
/** @desc 重置参数 */
export function resetOptionValue(query: T.OptionQuery) {
return http.patch(`${BASE_URL}/value`, query)
}

Some files were not shown because too many files have changed in this diff Show More