增加项目
|
@ -0,0 +1,393 @@
|
|||
## [v3.7.0](https://github.com/continew-org/continew-admin-ui/compare/v3.6.0...v3.7.0) (2025-06-13)
|
||||
|
||||
### ✨ 新特性
|
||||
|
||||
- 文件管理支持目录层级 (GitHub#60@luoqiz) ([70e2de3](https://github.com/continew-org/continew-admin-ui/commit/70e2de3250f887fedbc75b73b1822e666b8a5001))
|
||||
- 添加消息中心入口 ([dd15042](https://github.com/continew-org/continew-admin-ui/commit/dd1504204c649a36b1266bd46c68d0ad3007e315))
|
||||
- 短信渠道支持数据字典配置 (GitHub#62@Top2Hub) ([55ce849](https://github.com/continew-org/continew-admin-ui/commit/55ce849b2eb95639e1096d5bc2f78a7e410c11b1))
|
||||
- 短信配置新增设为默认功能 ([b05ec99](https://github.com/continew-org/continew-admin-ui/commit/b05ec99d35b7491310a74d3d04751eed292a61b2))
|
||||
- 新增文件夹导航、计算文件夹大小功能 ([abdd773](https://github.com/continew-org/continew-admin-ui/commit/abdd773886f216ea8de19e78b89b12ac99743d41))
|
||||
- 重构公告及消息,公告支持系统消息推送提醒、定时发布、置顶、记录读取状态 ([abf3f13](https://github.com/continew-org/continew-admin-ui/commit/abf3f130416c7eb512851ccf9d68191faef938ee)) ([e2d436f](https://github.com/continew-org/continew-admin-ui/commit/e2d436fb3083652dda1ba0c4e05ee47f4536ac9b))
|
||||
|
||||
### 💎 功能优化
|
||||
|
||||
- 还原 终端 => 客户端(终端容易被误解) ([471f30e](https://github.com/continew-org/continew-admin-ui/commit/471f30e1e7464f32157b70c3cbd964d5c8286306))
|
||||
- 统一部分搜索栏 ([d927d8f](https://github.com/continew-org/continew-admin-ui/commit/d927d8f58a536c8b30629c556e592b7fa2d28b38))
|
||||
- 短信配置、客户端配置状态表单项调整为统一风格 ([5768d55](https://github.com/continew-org/continew-admin-ui/commit/5768d556546853e43c92360ca1fed7c3a3d2d013)) ([c9fe54c](https://github.com/continew-org/continew-admin-ui/commit/c9fe54c2d65d86fde45d8d073ea00c160c84460b))
|
||||
- 调整 GiCellTags 折叠项水平居中样式 (Gitee#59@lzzz0359) ([1940f6a](https://github.com/continew-org/continew-admin-ui/commit/1940f6aaa179014c604e902331b24b0ef35f4c65))
|
||||
- 重构文件管理相关代码 ([b680ee3](https://github.com/continew-org/continew-admin-ui/commit/b680ee3fac93224b46effecf5d3e25d778d2ec16)) ([5511c87](https://github.com/continew-org/continew-admin-ui/commit/5511c877731ea6868d4eaa324efe5f1252855143)) ([2018cf0](https://github.com/continew-org/continew-admin-ui/commit/2018cf0eade0e906532d08fe4344950dd297e97e))
|
||||
- 调整接口文档菜单图标 ([9faee31](https://github.com/continew-org/continew-admin-ui/commit/9faee319dd2814b8e7ad600f2ecfe1cb782fd2c0))
|
||||
|
||||
### 🐛 问题修复
|
||||
|
||||
- 修复消息中心已读计数更新问题 ([50cd13e](https://github.com/continew-org/continew-admin-ui/commit/50cd13e2e54b50e88339164707d1bdcdd5716946))
|
||||
- 修复全部已读调用接口错误 ([cd1b0b8](https://github.com/continew-org/continew-admin-ui/commit/cd1b0b8c0922d19072c677c8e60205a984c58605))
|
||||
- 修复GiForm中DateRangePicker无法正确赋值 (Gitee#58@chengangi) ([a8986b9](https://github.com/continew-org/continew-admin-ui/commit/a8986b93a8e4327dad3bd3171fc76dde1a761d43))
|
||||
- 修复字典项如果不选择颜色,就不会显示标签的问题 ([70e3b6d](https://github.com/continew-org/continew-admin-ui/commit/70e3b6dace0de619a86242d741e3ec9c04e5b863))
|
||||
- 修复文件批量删除接口传参错误 ([dc66e9e](https://github.com/continew-org/continew-admin-ui/commit/dc66e9e62cf644309cddccb7757fd12a6450b25b))
|
||||
- 修复导入用户上传组件button拼写错误 (Gitee#60@lzzz0359) ([86fb09e](https://github.com/continew-org/continew-admin-ui/commit/86fb09efaaa88299a72c62dd7a1587c918bb2e90))
|
||||
- 修复菜单快捷搜索问题 (GitHub#67@oldR) ([f66f80f](https://github.com/continew-org/continew-admin-ui/commit/f66f80fc56de84bc846a068736d11849bd210163))
|
||||
- 修复全选时一级菜单未提交服务端的问题 (GitHub#68@oldR) ([aa14c41](https://github.com/continew-org/continew-admin-ui/commit/aa14c41df05d702cd62a4e84cf69319a4f76d685))
|
||||
- 修复加载图标样式错乱 ([47f4ca6](https://github.com/continew-org/continew-admin-ui/commit/47f4ca611e398bc860b4eaf8ab5d2ed0e1c10521))
|
||||
- 修复部分行为验证码使用错误 ([8c100e5](https://github.com/continew-org/continew-admin-ui/commit/8c100e5753778b78a7cad03da06e59bafb4dbcee))
|
||||
- 修复消息已读后计数未更新的问题 ([fa1291b](https://github.com/continew-org/continew-admin-ui/commit/fa1291bda2d43f3692dc1f441f4d4b3934d620f4))
|
||||
|
||||
|
||||
## [v3.6.0](https://github.com/continew-org/continew-admin-ui/compare/v3.5.0...v3.6.0) (2025-04-13)
|
||||
|
||||
### ✨ 新特性
|
||||
|
||||
* 添加字典和菜单缓存清除功能 ([13a7262](https://github.com/continew-org/continew-admin-ui/commit/13a7262172d3e48cb26989b7dfa5b453664f5dde))
|
||||
- 新增短信配置 (GitHub#54@luoqiz) ([bb1a66f](https://github.com/continew-org/continew-admin-ui/commit/bb1a66f74073303df37c241e82366ff044f10660)) ([470b0d5](https://github.com/continew-org/continew-admin-ui/commit/470b0d56f93dbb8a2117f4da507861f102a937a3))
|
||||
- 优化 GiTable(同步 GiDemo 更新) ([eaabe47](https://github.com/continew-org/continew-admin-ui/commit/eaabe47546db19ba602a7a959e5a98fe2119c4cb)) ([7d4beb0](https://github.com/continew-org/continew-admin-ui/commit/7d4beb028321766af0fff3c85c72f220b1467fd5)) ([cb297d2](https://github.com/continew-org/continew-admin-ui/commit/cb297d2b9f932e23a923d029c916fe0992234328))
|
||||
- 增强列设置功能 (Gitee#52@ki1373639299) ([11d5457](https://github.com/continew-org/continew-admin-ui/commit/11d54572e934197d333feaa33579c773ebcf0c1a))
|
||||
- 为定时任务添加内置 Cron 表达式(优化了用户输入体验,提供了常用的定时任务执行周期模板) ([1be5d97](https://github.com/continew-org/continew-admin-ui/commit/1be5d97fa22010e039cdff35810eae80e4d8e18c))
|
||||
- 为 dayjs 添加中文语言包,以支持中文显示 ([e1fe183](https://github.com/continew-org/continew-admin-ui/commit/e1fe1835899275dfbdedb21597154cb79b2d5ff8))
|
||||
- 新增折叠侧边栏功能,并使用 GiPageLayout 优化用户、角色、字典管理 ([32c6c16](https://github.com/continew-org/continew-admin-ui/commit/32c6c1636202a9c38cc68b093eafc0d9b3786157))
|
||||
- 重构个人消息中心,支持展示个人公告,并优化相关地址 ([89d0d9e](https://github.com/continew-org/continew-admin-ui/commit/89d0d9ebb1d8aae705baf4f1805a1d3fb0cff5cc))
|
||||
- add collapse mask and remove animation (GitHub#58@ppxb) ([576faac](https://github.com/continew-org/continew-admin-ui/commit/576faac21bf731461bc596513f34d64b13ed9377))
|
||||
|
||||
### 💎 功能优化
|
||||
|
||||
- 添加文件路径和md5值 (GitHub#52@luoqiz) ([30821b5](https://github.com/continew-org/continew-admin-ui/commit/30821b551ca21c6bd13b2e1e0efdefd098ded099))
|
||||
- 优化角色权限节点关联及独立切换效果 ([657c83b](https://github.com/continew-org/continew-admin-ui/commit/657c83bf19b7d2997ddaf7466203441d56041765))
|
||||
- 优化表单组件的字数限制逻辑 ([348c497](https://github.com/continew-org/continew-admin-ui/commit/348c49787618fabd23a040c77c4db53e4301bc61))
|
||||
- 优化 GiForm、GiEditTable(同步 GiDemo 更新) ([436cc6b](https://github.com/continew-org/continew-admin-ui/commit/436cc6bdfc2d4389b60181cadf6faf3c5a49cf7c))
|
||||
- 优化字典项颜色选择功能 ([2af9195](https://github.com/continew-org/continew-admin-ui/commit/2af9195081dd183a9548c6e77f9405f499b49ae1))
|
||||
- 适配后端权限码调整 ([b135b49](https://github.com/continew-org/continew-admin-ui/commit/b135b49a8796d54f861ca411b0e0428fe0ce11b4))
|
||||
- 优化 HTTP 错误提示显示时长 ([4b1486a](https://github.com/continew-org/continew-admin-ui/commit/4b1486a158866cfb76eed1c6d48e8b505ac9b95f))
|
||||
- 使用 GiPageLayout 组件替换 gi_table_page 样式 ([db79f8c](https://github.com/continew-org/continew-admin-ui/commit/db79f8c15fb206e7df059147d181b30339a84599))
|
||||
- 优化是否默认操作禁用逻辑 ([ec43ba4](https://github.com/continew-org/continew-admin-ui/commit/ec43ba4c8fd39ddae440447f0fc5ae1cb76c694b))
|
||||
- 修改头像接口调整为 Patch 请求方式 (Gitee#56@httpsjt) ([40280da](https://github.com/continew-org/continew-admin-ui/commit/40280da314710e2b7f17d7bc5d66cded0048d507))
|
||||
- 优化 GiPageLayout 组件布局 header 移动端适配 ([0c77f52](https://github.com/continew-org/continew-admin-ui/commit/0c77f52edaec02fae4aea5f43b9f34722358ae8f))
|
||||
- 重构系统配置布局,融合存储、短信、终端等配置 ([f77f714](https://github.com/continew-org/continew-admin-ui/commit/f77f714bc099bb503f8ca9c60d749b42697d32d3))
|
||||
- 移除终端部分配置字段 ([987dddf](https://github.com/continew-org/continew-admin-ui/commit/987dddf55af3c0d5e3cb25209fdafa3ea6baec79))
|
||||
- 适配后端删除接口重构,由 URL 传参重构为请求体传参 ([62a4f5f](https://github.com/continew-org/continew-admin-ui/commit/62a4f5faf46c5304504b659ad83bb15087a7680c))
|
||||
|
||||
- 调整表单项在不同屏幕下的布局方式 ([11800f0](https://github.com/continew-org/continew-admin-ui/commit/11800f02eec85d640229a87babf4a53b25041d60))
|
||||
- 去除字典管理误输入的特殊字符 ([53d0fb9](https://github.com/continew-org/continew-admin-ui/commit/53d0fb91cb4d20159250f630569810c56b8b8dc9))
|
||||
- 优化用户管理查询表单 ([4b073ef](https://github.com/continew-org/continew-admin-ui/commit/4b073ef5aab24cbb3afc4c340730cdbc6c803c95))
|
||||
- 优化消息页面移动端样式 ([0289b6b](https://github.com/continew-org/continew-admin-ui/commit/0289b6b25de67ed4f940f4fb669226e2c4ae40f3))
|
||||
- 修复消息列表列定义拼写错误 ([25bec61](https://github.com/continew-org/continew-admin-ui/commit/25bec617c071caf78c8e7279971322d44de5f3d1))
|
||||
- vite代理调整 ([9f5845e](https://github.com/continew-org/continew-admin-ui/commit/9f5845e3b34801cca0fd83bc7e6c7b5bc57c361e))
|
||||
- 将硬编码的 API 接口文档地址替换为环境变量 ([55e36d3](https://github.com/continew-org/continew-admin-ui/commit/55e36d345996b2a5f44ef8d04bb7a5b6e1ef8ad3))
|
||||
- 优化通知公告跳转消息中心的方式 (Gitee#57@ki1373639299) ([e8bbfcc](https://github.com/continew-org/continew-admin-ui/commit/e8bbfcc402d4a61e51a99245ac72761101257b00))
|
||||
- change tab pane style (GitHub#58@ppxb) ([3159e2c](https://github.com/continew-org/continew-admin-ui/commit/3159e2ce04c61e44d6c52795ebc40e59ca599f7d))
|
||||
- 调整默认布局为混合布局 ([8ad0886](https://github.com/continew-org/continew-admin-ui/commit/8ad088615ffd5eb85a872da4757231d7a31230c2))
|
||||
|
||||
### 🐛 问题修复
|
||||
|
||||
- 还原深浅主题切换 ([be7c310](https://github.com/continew-org/continew-admin-ui/commit/be7c310f72d714c18d35d3866850ed0be7928558))
|
||||
- 修复账号登录记住我不起作用 (GitHub#51@Acyco) ([7bb46a4](https://github.com/continew-org/continew-admin-ui/commit/7bb46a424c6870fe8d673e26ceafb39f88ac53a7))
|
||||
- 添加快速操作权限控制 ([6e9884e](https://github.com/continew-org/continew-admin-ui/commit/6e9884eabcca0119d8b0c2374859c12ed1af25a8))
|
||||
- 修复导出文件后台抛出异常仍继续下载文件,不进行通知提示 (GitHub#53@Acyco) ([0f8c9ae](https://github.com/continew-org/continew-admin-ui/commit/0f8c9aec2503dcbe1828ab9b54ab07e31baee45e))
|
||||
- 修复客户端添加表单布局 ([43b9793](https://github.com/continew-org/continew-admin-ui/commit/43b9793d0e1a489306b8daf3ff51b31f1ee995fc))
|
||||
- 修复菜单栏上方的系统名称包含 j、g 等,字母底部显示不全的问题 ([f0ba88e](https://github.com/continew-org/continew-admin-ui/commit/f0ba88eb54a20b3e39e302662d83ab60b6f3e337))
|
||||
- 菜单类型添加权限标识字段 ([4bd083e](https://github.com/continew-org/continew-admin-ui/commit/4bd083eb91f8ad05b1b41d22f289f50dc35cf3af))
|
||||
- 修复清空最后一页数据后列表空白,分页条消失的问题 ([4a3b5f7](https://github.com/continew-org/continew-admin-ui/commit/4a3b5f7eda6f659d4b9f57658b97c2588db6347a))
|
||||
- 修复角色权限禁用逻辑 ([c0623ab](https://github.com/continew-org/continew-admin-ui/commit/c0623abba813f12117add08a908e40f5c4f541d1))
|
||||
- pnpm v10 approve-builds issue (GitHub#58@ppxb) ([b944a73](https://github.com/continew-org/continew-admin-ui/commit/b944a73cecd2ae64605077cebd284dc6443f89a4))
|
||||
- blocks missing gap (GitHub#58@ppxb) ([c457883](https://github.com/continew-org/continew-admin-ui/commit/c457883ac17d95d8f6906dcc9a3036ae37be636a))
|
||||
- double click search inpurt cause error issue (GitHub#59@ppxb) ([8e6dd50](https://github.com/continew-org/continew-admin-ui/commit/8e6dd50f2f6305de1b25523e8d7b7936917ac780))
|
||||
- 修复文件管理数量刷新问题 ([de44df6](https://github.com/continew-org/continew-admin-ui/commit/de44df6a5c84e90a5cfebf447ad21ca47c3a805e))
|
||||
|
||||
### 📦 依赖升级
|
||||
|
||||
- Arco Design Vue 2.56.0 => 2.57.0 ([bf3fa91](https://github.com/continew-org/continew-admin-ui/commit/bf3fa919fe0da2701bafa30724a9cc2f83fc5087))
|
||||
|
||||
## [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 代码的功能
|
||||
- 在线用户:管理当前登录用户,可一键踢下线
|
||||
- 系统日志:提供登录日志、操作日志管理功能,可查看指定日志的详细请求及响应信息
|
||||
|
|
@ -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.
|
|
@ -0,0 +1,171 @@
|
|||
# 新用户管理界面
|
||||
|
||||
## 概述
|
||||
|
||||
已成功创建新的用户管理界面,对接了所有新的用户API接口,支持完整的用户信息管理功能。
|
||||
|
||||
## 文件结构
|
||||
|
||||
```
|
||||
src/views/system/user/
|
||||
├── index-new.vue # 新用户管理主页面
|
||||
├── components/
|
||||
│ ├── UserFormModal.vue # 用户表单弹窗(新增/编辑)
|
||||
│ ├── UserDetailModal.vue # 用户详情弹窗
|
||||
│ └── UserRoleModal.vue # 用户角色分配弹窗
|
||||
└── dept/
|
||||
└── index.vue # 部门树组件(复用原有)
|
||||
```
|
||||
|
||||
## 功能特性
|
||||
|
||||
### 🏢 左侧部门树
|
||||
- 展示部门层级结构
|
||||
- 支持搜索部门
|
||||
- 点击部门筛选该部门下的用户
|
||||
|
||||
### 👥 右侧用户管理
|
||||
- **搜索功能**:支持按账号、姓名、手机号、在职状态、员工性质搜索
|
||||
- **用户列表**:展示用户完整信息,包括新字段
|
||||
- **操作功能**:查看详情、编辑、分配角色、删除
|
||||
|
||||
### 🆕 新字段支持
|
||||
- **员工编码** (userCode)
|
||||
- **在职状态** (userStatus): 在职/离职
|
||||
- **员工性质** (userType): 正式员工/兼职员工/实习生/外包员工
|
||||
- **入职日期** (hiredate)
|
||||
- **出生日期** (birthdate)
|
||||
- **学历** (education)
|
||||
- **专业** (majorField)
|
||||
- **工作方向** (workField)
|
||||
- **身份证** (identityCard)
|
||||
|
||||
## API 对接
|
||||
|
||||
### 使用的新API接口
|
||||
```typescript
|
||||
import {
|
||||
pageUserNew, // 分页查询用户列表
|
||||
addUserNew, // 新增用户
|
||||
updateUserNew, // 更新用户
|
||||
deleteUserNew, // 删除用户
|
||||
bindUserRole // 绑定角色
|
||||
} from '@/apis/system/user-new'
|
||||
```
|
||||
|
||||
### 数据类型
|
||||
```typescript
|
||||
import type {
|
||||
UserNewResp, // 用户响应类型
|
||||
UserNewAddReq, // 新增用户请求类型
|
||||
UserNewUpdateReq, // 更新用户请求类型
|
||||
UserBindRoleReq // 绑定角色请求类型
|
||||
} from '@/apis/system/type'
|
||||
```
|
||||
|
||||
## 组件功能详解
|
||||
|
||||
### 1. UserFormModal.vue - 用户表单弹窗
|
||||
**功能**:
|
||||
- 新增用户
|
||||
- 编辑用户信息
|
||||
- 表单验证
|
||||
|
||||
**字段**:
|
||||
- 基础信息:账号、姓名、手机号、邮箱
|
||||
- 个人信息:性别、员工编码、身份证
|
||||
- 职业信息:在职状态、员工性质、部门
|
||||
- 教育信息:学历、专业、工作方向
|
||||
- 时间信息:入职日期、出生日期
|
||||
|
||||
### 2. UserDetailModal.vue - 用户详情弹窗
|
||||
**功能**:
|
||||
- 查看用户完整信息
|
||||
- 美观的描述列表展示
|
||||
- 状态和类型的标签显示
|
||||
|
||||
### 3. UserRoleModal.vue - 角色分配弹窗
|
||||
**功能**:
|
||||
- 分配/取消分配用户角色
|
||||
- 多选角色支持
|
||||
- 角色描述展示
|
||||
|
||||
## 页面布局
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────┐
|
||||
│ 用户管理 │
|
||||
├───────────────┬─────────────────────────────┤
|
||||
│ │ 搜索表单 │
|
||||
│ 部门树 ├─────────────────────────────┤
|
||||
│ │ 操作按钮 │
|
||||
│ ├─────────────────────────────┤
|
||||
│ │ 用户表格 │
|
||||
│ │ │
|
||||
│ │ │
|
||||
└───────────────┴─────────────────────────────┘
|
||||
```
|
||||
|
||||
## 使用方法
|
||||
|
||||
### 1. 启用新界面
|
||||
将路由配置指向新的用户管理页面:
|
||||
```typescript
|
||||
// router配置
|
||||
{
|
||||
path: '/system/user',
|
||||
component: () => import('@/views/system/user/index-new.vue')
|
||||
}
|
||||
```
|
||||
|
||||
### 2. 功能操作
|
||||
1. **部门筛选**:点击左侧部门树节点
|
||||
2. **搜索用户**:在搜索表单中输入条件
|
||||
3. **新增用户**:点击"新增用户"按钮
|
||||
4. **编辑用户**:点击表格中的"编辑"按钮
|
||||
5. **查看详情**:点击表格中的"详情"按钮
|
||||
6. **分配角色**:点击表格中的"分配角色"按钮
|
||||
7. **删除用户**:点击表格中的"删除"按钮
|
||||
|
||||
## 数据映射
|
||||
|
||||
### 新旧字段对应关系
|
||||
| 新字段 | 原字段 | 说明 |
|
||||
|--------|--------|------|
|
||||
| userId | id | 用户ID |
|
||||
| account | username | 账号 |
|
||||
| name | nickname | 姓名 |
|
||||
| mobile | phone | 手机号 |
|
||||
| userStatus | status | 在职状态(新增) |
|
||||
| userType | - | 员工性质(新增) |
|
||||
| userCode | - | 员工编码(新增) |
|
||||
| hiredate | - | 入职日期(新增) |
|
||||
| birthdate | - | 出生日期(新增) |
|
||||
| education | - | 学历(新增) |
|
||||
| majorField | - | 专业(新增) |
|
||||
| workField | - | 工作方向(新增) |
|
||||
| identityCard | - | 身份证(新增) |
|
||||
|
||||
## 样式特点
|
||||
|
||||
- **现代化UI**:使用Arco Design组件库
|
||||
- **响应式布局**:适配不同屏幕尺寸
|
||||
- **清晰的视觉层次**:合理的间距和颜色搭配
|
||||
- **状态标识**:使用标签显示不同状态
|
||||
- **操作便捷**:快捷的按钮和弹窗操作
|
||||
|
||||
## 注意事项
|
||||
|
||||
1. **兼容性**:新界面与原有接口并存,不影响原有功能
|
||||
2. **权限控制**:保持与原有权限系统的兼容
|
||||
3. **数据验证**:严格的表单验证确保数据质量
|
||||
4. **错误处理**:友好的错误提示和异常处理
|
||||
5. **性能优化**:合理的分页和懒加载
|
||||
|
||||
## 后续扩展
|
||||
|
||||
- [ ] 添加用户导入/导出功能
|
||||
- [ ] 集成文件上传(头像)
|
||||
- [ ] 添加用户操作日志
|
||||
- [ ] 支持批量操作
|
||||
- [ ] 添加高级搜索功能
|
36
README.en.md
|
@ -1,36 +0,0 @@
|
|||
# 工业图像管理系统Web
|
||||
|
||||
#### Description
|
||||
{**When you're done, you can delete the content in this README and update the file with details for others getting started with your repository**}
|
||||
|
||||
#### Software Architecture
|
||||
Software architecture description
|
||||
|
||||
#### Installation
|
||||
|
||||
1. xxxx
|
||||
2. xxxx
|
||||
3. xxxx
|
||||
|
||||
#### Instructions
|
||||
|
||||
1. xxxx
|
||||
2. xxxx
|
||||
3. xxxx
|
||||
|
||||
#### Contribution
|
||||
|
||||
1. Fork the repository
|
||||
2. Create Feat_xxx branch
|
||||
3. Commit your code
|
||||
4. Create Pull Request
|
||||
|
||||
|
||||
#### Gitee Feature
|
||||
|
||||
1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md
|
||||
2. Gitee blog [blog.gitee.com](https://blog.gitee.com)
|
||||
3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore)
|
||||
4. The most valuable open source project [GVP](https://gitee.com/gvp)
|
||||
5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help)
|
||||
6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)
|
389
README.md
|
@ -1,39 +1,374 @@
|
|||
# 工业图像管理系统Web
|
||||
# ContiNew Admin UI
|
||||
|
||||
#### 介绍
|
||||
{**以下是 Gitee 平台说明,您可以替换此简介**
|
||||
Gitee 是 OSCHINA 推出的基于 Git 的代码托管平台(同时支持 SVN)。专为开发者提供稳定、高效、安全的云端软件开发协作平台
|
||||
无论是个人、团队、或是企业,都能够用 Gitee 实现代码托管、项目管理、协作开发。企业项目请看 [https://gitee.com/enterprises](https://gitee.com/enterprises)}
|
||||
<a href="https://github.com/continew-org/continew-admin-ui" title="Release" target="_blank">
|
||||
<img src="https://img.shields.io/badge/SNAPSHOT-v4.0.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://continew.top/admin/guide/demo.html)
|
||||
|
||||
## 简介
|
||||
|
||||
#### 安装教程
|
||||
全新 3.0 版本,基于 Gi Demo 前端模板开发的 ContiNew Admin 前端适配项目。
|
||||
|
||||
1. xxxx
|
||||
2. xxxx
|
||||
3. xxxx
|
||||
ContiNew Admin(Continue New Admin)持续迭代优化的前后端分离中后台管理系统框架。开箱即用,重视每一处代码规范,重视每一种解决方案细节,持续提供舒适的前、后端开发体验。
|
||||
|
||||
#### 使用说明
|
||||
当前采用的技术栈:Spring Boot3(Java17)、Vue3 & Arco Design & TS & Vite、Sa-Token、MyBatis Plus、Redisson、JetCache、JustAuth、Crane4j、EasyExcel、Liquibase、Hutool 等。
|
||||
|
||||
1. xxxx
|
||||
2. xxxx
|
||||
3. xxxx
|
||||
## 项目源码
|
||||
|
||||
#### 参与贡献
|
||||
| | 前端 | 后端 |
|
||||
| :------ | :----------------------------------------------------------- | :----------------------------------------------------------- |
|
||||
| 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. Fork 本仓库
|
||||
2. 新建 Feat_xxx 分支
|
||||
3. 提交代码
|
||||
4. 新建 Pull Request
|
||||
## 项目起源
|
||||
|
||||
我热衷于做数据归档,归档后的数据可以提高学习/工作效率,为记忆“减负”,在持续的数据归档中,优质的“沉淀”会带来非匀速、跨越式的学习/工作体验。**数据归档是一件需要持续去做的事情**。
|
||||
|
||||
#### 特技
|
||||
从接触程序代码的第一天,我的程序数据归档也随之开始了,刷过的算法题、笔记、对接各种组件的配置文件,甚至于一些亮眼的样式设计、“如诗”的代码片段。这些数据的沉淀丰富了我的解决方案,提高了我的编程效率,逐渐为各种场景落实成了一个个雏形程序。再后来,我意识到,我归档的这些雏形程序,有一个更为妥贴的名称:**程序框架/脚手架**。
|
||||
|
||||
1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md
|
||||
2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com)
|
||||
3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目
|
||||
4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目
|
||||
5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help)
|
||||
6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)
|
||||
技术的发展,导致这些雏形程序的生命周期很是短暂,它们有别于我归档的其他数据,有时由于工作的原因,没有时间很好的去沉淀它们,在使用时变得越来越不顺手。所以,某段时间,我放弃了维护,而是去采用一些更为成熟的框架。
|
||||
|
||||
不过,在陆续几年使用了一些成熟框架后,我前后遇到了一些困难:
|
||||
|
||||
1. 代码洁癖想要找到一个**扩展性佳,代码规范良好,开发体验舒适**的框架很不容易,总是差些什么
|
||||
2. 项目上手困难或是基础版功能不全,需要的全在专业版,亦或者代码阅读性差,文档收费
|
||||
3. 部分解决方案缺失,已有解决方案也过于偏向样板化,无法形成良好的逻辑闭环
|
||||
4. 好不容易找到一些相较合适的,没过多久,部分作者可能暂时没法对外发“电”了,随着了解深入,很多 Bug 或新技术趋势还是需要自己研究解决
|
||||
|
||||
在工作中,很多想法/设计受限于客户需求、开发工期,必须优先以交付为导向,但一些优秀的实践需要花时间持续进行沉淀,只要我没跳出这个圈子,我还是需要一直去做好程序归档。“种一棵树最好的时间是十年前,其次是现在”,最终,我选择在业余时间更加正视这件事,从头归档沉淀,从添加每一个依赖开始,我希望它能持续的迭代优化、演进,所以我把它命名为 **ContiNew(Continue New)**。并且这次我选择了开源,我希望它不仅仅能吸收我的需求和沉淀,而是依托开源协作模式,及时发现更多的问题,接受更多的可能性,沉淀更优秀的思考,设计。
|
||||
|
||||
## 为什么选我们?
|
||||
|
||||
> [!TIP]
|
||||
> 更为完整的图文描述请查阅[《在线文档》](https://continew.top/admin/guide/why-choose-us.html)。
|
||||
|
||||
1.**甄选技术栈:** ContiNew(Continue 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.GET, Api.CREATE, 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 Devtools(Vue 官方提供的调试浏览器插件),极大提高 Vue 开发及调试效率
|
||||
|
||||
6.**Almost最佳后端规范:** 后端严格遵循阿里巴巴 Java 编码规范,注释覆盖率 > 45%,接口参数示例 100%,代码分层使用体验佳,变量、方法命名清晰统一,前端代码也使用严格的 ESLint、StyleLint 等检查。良好的设计,代码复用率极高!写代码时,让你有一种无需多写,理应如此的感觉。我是代码洁癖,我实际写的时候很清楚这到底是不是乱吹。
|
||||
|
||||
7.**卓越工程:** 后端采用模块化工程结构,并适配了统一项目版本号、编译项目自动代码格式化、代码混淆等插件,提供了自定义打包部署结构配置(配置文件、三方依赖和主程序分离),提供全套环境及应用的 Docker Compose 部署脚本。为了减少您开发新项目时的改造耗时,项目品牌配置持续进行深度聚合,简单的配置和结构修改即可快速开始独属于你的新项目。
|
||||
|
||||
8.**业务脚手架:** 有颜有料,不止是说说而已,持续打磨 UI 设计与色彩主题。提供基于 RBAC 的权限控制、通用数据权限,包含丰富的通用业务功能:第三方登录,邮箱、短信(生产级炸弹漏洞处理方案),个人中心、用户管理、角色管理、部门管理、系统配置(基础站点配置、邮件配置、安全配置)、系统日志、消息中心、通知公告等,设计用心,逻辑合理闭环。
|
||||
> 一个好的脚手架项目,不仅仅是提供一系列组件集成与配置,也不仅仅是封装一堆好用的工具,还更应该提供一系列通用基础业务解决方案及设计,为初创团队项目减负。
|
||||
|
||||
9.**质量与安全:** CI 已集成 Sonar、Codacy,Push 即扫描代码质量,定期扫描 CVE 漏洞,及时解决潜在问题。封装数据库字段加密、JSON 脱敏、XSS 过滤等工具,提供诸多安全解决方案。
|
||||
|
||||
由于篇幅有限,且项目正处于高速发展期,更多功能正在陆续上线(敬请关注仓库或群内动态)。另外像最基本的统一异常、错误处理,基础线程池等配置就不在此赘述,细节优化详情请 clone 代码查看。
|
||||
> Talk is cheap, show the code.
|
||||
|
||||
## 系统功能
|
||||
|
||||
> [!TIP]
|
||||
> 更多功能和优化正在赶来💦,最新项目计划、进展请进群或关注 [需求墙](https://continew.top/admin/other/feature.html) 和 [更新日志](https://continew.top/admin/other/changelog.html)。
|
||||
|
||||
- 仪表盘:提供工作台、分析页,工作台提供功能快捷导航入口、最新公告、动态;分析页提供全面数据可视化能力
|
||||
- 个人中心:支持基础信息修改、密码修改、邮箱绑定、手机号绑定(并提供行为验证码、短信限流等安全处理)、第三方账号绑定/解绑、头像裁剪上传
|
||||
- 消息中心:提供站内信消息统一查看、标记已读、全部已读、删除等功能(目前仅支持系统通知消息)、提供个人公告查看
|
||||
- 用户管理:管理系统用户,包含新增、修改、删除、导入、导出、重置密码、分配角色等功能
|
||||
- 角色管理:管理系统用户的功能权限及数据权限,包含新增、修改、删除、分配角色等功能
|
||||
- 菜单管理:管理系统菜单及按钮权限,支持多级菜单,动态路由,包含新增、修改、删除等功能
|
||||
- 部门管理:管理系统组织架构,包含新增、修改、删除、导出等功能,以树形列表进行展示
|
||||
- 通知公告:管理系统公告,支持通知范围(所有人、指定用户)、通知方式(系统消息、登录弹窗)、定时发送、置顶设置
|
||||
- 文件管理:管理系统文件及文件夹,支持上传、下载、预览(目前支持图片、音视频、PDF、Word、Excel、PPT)、重命名、切换视图(列表、网格)等功能
|
||||
- 字典管理:管理系统公用数据字典,例如:消息类型。支持字典标签背景色和排序等配置
|
||||
- 系统配置:
|
||||
- 网站配置:提供修改系统标题、Logo、favicon、版权信息等基础配置功能,以方便用户系统与其自身品牌形象保持一致
|
||||
- 安全配置:提供密码策略修改,支持丰富的密码策略设定,包括但不限于 `密码有效期`、`密码重复次数`、`密码错误锁定账号次数、时间` 等
|
||||
- 登录配置:提供验证码开关等登录相关配置
|
||||
- 邮件配置:提供系统发件箱配置,也支持通过配置文件指定
|
||||
- 短信配置:提供系统短信服务配置,也支持通过配置文件指定
|
||||
- 存储配置:管理文件存储配置,支持本地存储、兼容 S3 协议对象存储
|
||||
- 客户端配置:多客户端(PC端、小程序端等)认证管理,可设置不同的 token 有效期
|
||||
- 在线用户:管理当前登录用户,可一键踢除下线
|
||||
- 日志管理:管理系统登录日志、操作日志,支持查看日志详情,包含请求头、响应头等报文信息
|
||||
- 短信日志:管理系统短信发送日志,支持删除、导出
|
||||
- 任务管理:管理系统定时任务,包含新增、修改、删除、执行功能,支持 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/guide/quick-start.html)。
|
||||
|
||||
```
|
||||
# 1.克隆本项目
|
||||
git clone https://github.com/charles7c/continew-admin-ui.git
|
||||
git clone https://gitee.com/continew/continew-admin-ui.git
|
||||
|
||||
# 2.在 IDE(Visual 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
|
||||
├─ .gitignore(Git 忽略文件相关配置文件)
|
||||
├─ .github(GitHub 相关配置目录,实际开发时直接删除)
|
||||
├─ .idea
|
||||
│ └─ icon.png(IDEA 项目图标,实际开发时直接删除)
|
||||
├─ .image(截图目录,实际开发时直接删除)
|
||||
├─ .vscode(VSCode 配置目录)
|
||||
├─ LICENSE(开源协议文件)
|
||||
├─ CHANGELOG.md(更新日志文件,实际开发时直接删除)
|
||||
└─ README.md(项目 README 文件,实际开发时替换为真实内容)
|
||||
```
|
||||
|
||||
## 贡献指南
|
||||
|
||||
ContiNew Admin 致力于提供开箱即用,持续舒适的开发体验。作为一个开源项目,Creator 的初心是希望 ContiNew Admin 依托开源协作模式,提升技术透明度、放大集体智慧、共创优秀实践,源源不断地为企业级项目开发提供助力。
|
||||
|
||||
我们非常欢迎广大社区用户为 ContiNew Admin **贡献(开发,测试、文档、答疑等)** 或优化代码,欢迎各位感兴趣的小伙伴儿,[添加微信](https://continew.top/discussion.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 request(pr),选择好源和目标,按模板要求填写说明信息后提交即可(多多参考 [已批准合并的 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>
|
||||
|
|
|
@ -0,0 +1,165 @@
|
|||
# 用户信息相关 API 接口对接说明
|
||||
|
||||
## 概述
|
||||
|
||||
已完成对接新的用户信息相关 API 接口,新接口路径为 `/user`,与原有的 `/system/user` 接口并行存在。
|
||||
|
||||
## 新增文件
|
||||
|
||||
### 1. 类型定义 (`src/apis/system/type.ts`)
|
||||
|
||||
添加了以下新的类型定义:
|
||||
|
||||
- `UserNewResp` - 新用户信息响应类型
|
||||
- `UserNewAddReq` - 新用户信息请求类型
|
||||
- `UserNewUpdateReq` - 新用户信息修改请求类型
|
||||
- `UserBindRoleReq` - 用户绑定角色请求类型
|
||||
- `UserNewQuery` - 新用户查询参数
|
||||
- `UserNewPageQuery` - 新用户分页查询参数
|
||||
|
||||
### 2. API 接口 (`src/apis/system/user-new.ts`)
|
||||
|
||||
实现了以下 API 接口:
|
||||
|
||||
#### 新增用户信息
|
||||
```typescript
|
||||
addUserNew(data: UserNewAddReq): Promise<ApiRes<UserNewResp>>
|
||||
```
|
||||
- 方法:POST
|
||||
- 路径:`/user`
|
||||
|
||||
#### 绑定角色
|
||||
```typescript
|
||||
bindUserRole(data: UserBindRoleReq): Promise<ApiRes<any>>
|
||||
```
|
||||
- 方法:PUT
|
||||
- 路径:`/user/bind-role`
|
||||
|
||||
#### 根据用户信息Id获取详细信息
|
||||
```typescript
|
||||
getUserDetailNew(userId: string): Promise<ApiRes<UserNewResp>>
|
||||
```
|
||||
- 方法:GET
|
||||
- 路径:`/user/detail/{userId}`
|
||||
|
||||
#### 查询用户信息列表
|
||||
```typescript
|
||||
listUserNew(query: UserNewQuery): Promise<ApiRes<UserNewResp[]>>
|
||||
```
|
||||
- 方法:GET
|
||||
- 路径:`/user/list`
|
||||
|
||||
#### 分页查询用户信息列表
|
||||
```typescript
|
||||
pageUserNew(query: UserNewPageQuery): Promise<ApiRes<PageRes<UserNewResp[]>>>
|
||||
```
|
||||
- 方法:GET
|
||||
- 路径:`/user/page`
|
||||
|
||||
#### 修改用户信息
|
||||
```typescript
|
||||
updateUserNew(userId: string, data: UserNewUpdateReq): Promise<ApiRes<any>>
|
||||
```
|
||||
- 方法:PUT
|
||||
- 路径:`/user/{userId}`
|
||||
|
||||
#### 删除用户信息
|
||||
```typescript
|
||||
deleteUserNew(userId: string): Promise<ApiRes<any>>
|
||||
```
|
||||
- 方法:DELETE
|
||||
- 路径:`/user/{userId}`
|
||||
|
||||
## 使用方式
|
||||
|
||||
### 1. 导入接口
|
||||
|
||||
```typescript
|
||||
import {
|
||||
addUserNew,
|
||||
bindUserRole,
|
||||
getUserDetailNew,
|
||||
listUserNew,
|
||||
pageUserNew,
|
||||
updateUserNew,
|
||||
deleteUserNew
|
||||
} from '@/apis/system'
|
||||
```
|
||||
|
||||
### 2. 导入类型
|
||||
|
||||
```typescript
|
||||
import type {
|
||||
UserNewAddReq,
|
||||
UserBindRoleReq,
|
||||
UserNewQuery,
|
||||
UserNewPageQuery,
|
||||
UserNewUpdateReq
|
||||
} from '@/apis/system'
|
||||
```
|
||||
|
||||
### 3. 使用示例
|
||||
|
||||
```typescript
|
||||
// 新增用户
|
||||
const userData: UserNewAddReq = {
|
||||
account: 'testuser',
|
||||
name: '测试用户',
|
||||
email: 'test@example.com',
|
||||
mobile: '13800138000',
|
||||
gender: '1',
|
||||
deptId: '1',
|
||||
userType: 'EMPLOYEE',
|
||||
userStatus: 'ENABLED',
|
||||
status: 1
|
||||
}
|
||||
const result = await addUserNew(userData)
|
||||
|
||||
// 绑定角色
|
||||
await bindUserRole({
|
||||
userId: 'user123',
|
||||
roleIds: ['role1', 'role2']
|
||||
})
|
||||
|
||||
// 查询用户列表
|
||||
const userList = await listUserNew({ account: 'test' })
|
||||
|
||||
// 分页查询
|
||||
const userPage = await pageUserNew({
|
||||
page: 1,
|
||||
size: 10,
|
||||
account: 'test'
|
||||
})
|
||||
```
|
||||
|
||||
## 字段说明
|
||||
|
||||
### 用户信息字段
|
||||
|
||||
| 字段名 | 类型 | 说明 | 是否必填 |
|
||||
|--------|------|------|----------|
|
||||
| account | string | 账号 | 是 |
|
||||
| avatar | string | 头像地址 | 否 |
|
||||
| birthdate | string | 出生日期 | 否 |
|
||||
| deptId | string | 所属部门ID | 否 |
|
||||
| education | string | 学历 | 否 |
|
||||
| email | string | 邮箱 | 否 |
|
||||
| gender | string | 性别 | 否 |
|
||||
| hiredate | string | 入职日期 | 否 |
|
||||
| identityCard | string | 身份证 | 否 |
|
||||
| majorField | string | 专业 | 否 |
|
||||
| mobile | string | 手机号码 | 否 |
|
||||
| name | string | 姓名 | 否 |
|
||||
| postIds | string[] | 岗位 | 否 |
|
||||
| roleIds | string[] | 角色 | 否 |
|
||||
| status | number | 0正常1禁用 | 否 |
|
||||
| userStatus | string | 在职状态 | 否 |
|
||||
| userType | string | 员工性质 | 否 |
|
||||
| workField | string | 工作方向 | 否 |
|
||||
|
||||
## 注意事项
|
||||
|
||||
1. 新接口与原有 `/system/user` 接口并行存在,不会影响现有功能
|
||||
2. 所有接口都已在 `src/apis/system/index.ts` 中导出,可直接使用
|
||||
3. 请根据实际业务需求选择合适的接口进行调用
|
||||
4. 建议在使用前先通过 API 文档确认字段格式和枚举值
|
|
@ -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 v4.0.0-SNAPSHOT')}`))}\n${cyan('在线文档:')}${underline('https://continew.top')}\n${cyan('常见问题:')}${underline('https://continew.top/admin/faq.html')}\n${cyan('持续迭代优化的前后端分离中后台管理系统框架。')}`,
|
||||
{
|
||||
padding: 1,
|
||||
margin: 1,
|
||||
borderStyle: 'double',
|
||||
textAlignment: 'center',
|
||||
},
|
||||
),
|
||||
)
|
||||
},
|
||||
}
|
||||
}
|
|
@ -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',
|
||||
})
|
||||
}
|
|
@ -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',
|
||||
})
|
||||
}
|
|
@ -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()
|
||||
}
|
|
@ -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
|
||||
}
|
|
@ -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();
|
||||
`,
|
||||
})
|
||||
}
|
|
@ -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,
|
||||
})
|
||||
}
|
|
@ -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',
|
||||
},
|
||||
},
|
||||
)
|
|
@ -0,0 +1,30 @@
|
|||
<!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">
|
||||
<img src="/static/images/loading.svg" class="init-loading-icon" alt="loading" />
|
||||
</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?246a935992138d6770cabe711402315c";
|
||||
var s = document.getElementsByTagName("script")[0];
|
||||
s.parentNode.insertBefore(hm, s);
|
||||
})();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,107 @@
|
|||
{
|
||||
"name": "continew-admin-ui",
|
||||
"type": "module",
|
||||
"version": "4.0.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",
|
||||
"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",
|
||||
"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": "^2.31.6"
|
||||
},
|
||||
"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"
|
||||
},
|
||||
"pnpm": {
|
||||
"onlyBuiltDependencies": [
|
||||
"@vue-office/docx",
|
||||
"@vue-office/excel",
|
||||
"@vue-office/pdf",
|
||||
"core-js",
|
||||
"es5-ext",
|
||||
"esbuild",
|
||||
"vue-demi",
|
||||
"vue-echarts"
|
||||
]
|
||||
},
|
||||
"simple-git-hooks": {
|
||||
"pre-commit": "pnpm lint-staged"
|
||||
},
|
||||
"lint-staged": {
|
||||
"*": "eslint --fix"
|
||||
}
|
||||
}
|
After Width: | Height: | Size: 66 KiB |
|
@ -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 |
|
@ -0,0 +1,27 @@
|
|||
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;
|
||||
}
|
||||
@keyframes arco-loading-circle {
|
||||
from {
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
to {
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
.init-loading-icon {
|
||||
animation: arco-loading-circle 1s infinite cubic-bezier(0,0,1,1);
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
<svg class="force-icon force-icon-loading arco-icon-loading" width="1em" height="1em" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" style="font-size: 40px;"><path fill-rule="evenodd" clip-rule="evenodd" d="M13.7998 5.85002C12.4998 5.45002 11.0998 5.50002 9.79984 6.00002C8.49984 6.50002 7.39984 7.35002 6.64984 8.50002C5.89984 9.65002 5.54984 11 5.59984 12.4C5.64984 13.8 6.19984 15.1 7.09984 16.15C7.99984 17.2 9.19984 17.95 10.5498 18.25C11.8998 18.55 13.2998 18.45 14.5498 17.85C15.4498 17.45 16.4998 17.85 16.8998 18.75C17.2998 19.65 16.8998 20.7 15.9998 21.1C14.0498 21.95 11.8498 22.2 9.74984 21.7C7.64984 21.2 5.74984 20.05 4.34984 18.45C2.99984 16.85 2.14984 14.8 1.99984 12.65C1.89984 10.5 2.44984 8.35002 3.59984 6.55002C4.79984 4.75002 6.49984 3.35002 8.54984 2.65002C10.5498 1.90002 12.7998 1.85002 14.8498 2.45002C16.8998 3.05002 18.7498 4.30002 19.9998 6.00002C21.2998 7.75002 21.9998 9.80002 21.9998 12C21.9998 13 21.1998 13.8 20.1998 13.8C19.1998 13.8 18.3998 13 18.3998 12C18.3998 10.6 17.9498 9.30002 17.1498 8.15002C16.2998 7.05002 15.1498 6.25002 13.7998 5.85002Z" fill="url(#svg_2fc1cd5fdf__paint0_linear_118545_226288)"></path><path fill-rule="evenodd" clip-rule="evenodd" d="M13.7998 5.85002C12.4998 5.45002 11.0998 5.50002 9.79984 6.00002C8.49984 6.50002 7.39984 7.35002 6.64984 8.50002C5.89984 9.65002 5.54984 11 5.59984 12.4C5.64984 13.8 6.19984 15.1 7.09984 16.15C7.99984 17.2 9.19984 17.95 10.5498 18.25C11.8998 18.55 13.2998 18.45 14.5498 17.85C15.4498 17.45 16.4998 17.85 16.8998 18.75C17.2998 19.65 16.8998 20.7 15.9998 21.1C14.0498 21.95 11.8498 22.2 9.74984 21.7C7.64984 21.2 5.74984 20.05 4.34984 18.45C2.99984 16.85 2.14984 14.8 1.99984 12.65C1.89984 10.5 2.44984 8.35002 3.59984 6.55002C4.79984 4.75002 6.49984 3.35002 8.54984 2.65002C10.5498 1.90002 12.7998 1.85002 14.8498 2.45002C16.8998 3.05002 18.7498 4.30002 19.9998 6.00002C21.2998 7.75002 21.9998 9.80002 21.9998 12C21.9998 13 21.1998 13.8 20.1998 13.8C19.1998 13.8 18.3998 13 18.3998 12C18.3998 10.6 17.9498 9.30002 17.1498 8.15002C16.2998 7.05002 15.1498 6.25002 13.7998 5.85002Z" fill="url(#svg_2fc1cd5fdf__paint1_linear_118545_226288)"></path><defs><linearGradient id="svg_2fc1cd5fdf__paint0_linear_118545_226288" x1="13.215" y1="6.907" x2="10.715" y2="16.282" gradientUnits="userSpaceOnUse"><stop stop-color="#1765FF"></stop><stop offset=".031" stop-color="#1765FF" stop-opacity=".969"></stop><stop offset="1" stop-color="#1765FF" stop-opacity="0"></stop></linearGradient><linearGradient id="svg_2fc1cd5fdf__paint1_linear_118545_226288" x1="-.574" y1="9.566" x2="18.802" y2="13.316" gradientUnits="userSpaceOnUse"><stop stop-color="#ADC9FF"></stop><stop offset="1" stop-color="#8AB1FF" stop-opacity="0"></stop></linearGradient></defs></svg>
|
After Width: | Height: | Size: 2.7 KiB |
|
@ -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)
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
export interface AreaItem {
|
||||
label: string
|
||||
code: string
|
||||
children?: AreaItem[]
|
||||
}
|
|
@ -0,0 +1,55 @@
|
|||
import type * as T from './type'
|
||||
import http from '@/utils/http'
|
||||
import { convertMenuData, type ApiMenuItem } from '@/utils/menuConverter'
|
||||
|
||||
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.UserInfoResponse>(`${BASE_URL}/userInfo`)
|
||||
}
|
||||
|
||||
/** @desc 获取路由信息 */
|
||||
export const getUserRoute = () => {
|
||||
return http.get<T.RouteItem[]>(`${BASE_URL}/menu`)
|
||||
}
|
||||
|
||||
/** @desc 获取路由信息并转换格式 */
|
||||
export const getUserRouteWithAdapter = async () => {
|
||||
const response = await http.get<ApiMenuItem[]>(`${BASE_URL}/menu`)
|
||||
// 使用menuConverter转换API返回的菜单数据
|
||||
const convertedData = convertMenuData(response.data)
|
||||
return { data: convertedData }
|
||||
}
|
|
@ -0,0 +1,134 @@
|
|||
/** 用户信息响应类型 */
|
||||
export interface UserInfoResponse {
|
||||
code: number;
|
||||
status: number;
|
||||
success: boolean;
|
||||
msg: string;
|
||||
data: {
|
||||
user: UserDetail;
|
||||
dept: DeptDetail;
|
||||
roles: RoleDetail[];
|
||||
posts: any[];
|
||||
};
|
||||
}
|
||||
|
||||
/** 用户详细信息 */
|
||||
export interface UserDetail {
|
||||
userId: string;
|
||||
account: string;
|
||||
name: string;
|
||||
status: number;
|
||||
userCode: string;
|
||||
userStatus: string;
|
||||
userType: string;
|
||||
mobile: string;
|
||||
createTime: string;
|
||||
avatar?: string;
|
||||
}
|
||||
|
||||
/** 部门详细信息 */
|
||||
export interface DeptDetail {
|
||||
deptId: string;
|
||||
deptName: string;
|
||||
parentId: string;
|
||||
orderNum: number;
|
||||
leaderId: string;
|
||||
status: string;
|
||||
}
|
||||
|
||||
/** 角色详细信息 */
|
||||
export interface RoleDetail {
|
||||
roleId: string;
|
||||
roleName: string;
|
||||
roleCode: string | null;
|
||||
roleKey: string;
|
||||
}
|
||||
|
||||
/** 用户类型 - 兼容旧版本 */
|
||||
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
|
||||
}
|
|
@ -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`)
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
export * from './generator'
|
|
@ -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
|
||||
}
|
|
@ -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)
|
||||
}
|
|
@ -0,0 +1,42 @@
|
|||
import type { TreeNodeData } from '@arco-design/web-vue'
|
||||
import http from '@/utils/http'
|
||||
import type { LabelValueState } from '@/types/global'
|
||||
import { getDeptTree } from '@/apis/system/dept'
|
||||
|
||||
const BASE_URL = '/common'
|
||||
|
||||
/** @desc 查询部门树 */
|
||||
export function listDeptTree(query: { description?: string | unknown }) {
|
||||
// 兼容旧接口,将description映射为deptName
|
||||
return getDeptTree({ deptName: query.description as string })
|
||||
}
|
||||
|
||||
/** @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[]>(`/role/list`, 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)
|
||||
}
|
|
@ -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`)
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
export * from './common'
|
||||
export * from './captcha'
|
||||
export * from './dashboard'
|
|
@ -0,0 +1,60 @@
|
|||
/** 图形验证码类型 */
|
||||
export interface ImageCaptchaResp {
|
||||
uuid: string
|
||||
img: string
|
||||
expireTime: number
|
||||
isEnabled: boolean
|
||||
}
|
||||
|
||||
/** 仪表盘公告类型 */
|
||||
export interface DashboardNoticeResp {
|
||||
id: number
|
||||
title: string
|
||||
type: number
|
||||
isTop: boolean
|
||||
}
|
||||
|
||||
/** 仪表盘访问趋势类型 */
|
||||
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
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
export * from './area'
|
||||
export * from './auth'
|
||||
export * from './common'
|
||||
export * from './monitor'
|
||||
export * from './system'
|
||||
export * from './code'
|
||||
export * from './schedule'
|
||||
export * from './project'
|
||||
export * from './project/task'
|
||||
|
||||
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'
|
||||
export * from './project/type'
|
|
@ -0,0 +1,2 @@
|
|||
export * from './online'
|
||||
export * from './log'
|
|
@ -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)
|
||||
}
|
|
@ -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}`)
|
||||
}
|
|
@ -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 {}
|
|
@ -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}`, { ids: [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`)
|
||||
}
|
|
@ -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 {}
|
|
@ -0,0 +1,52 @@
|
|||
import type * as T from './type'
|
||||
import http from '@/utils/http'
|
||||
|
||||
export type * from './type'
|
||||
|
||||
const BASE_URL = '/project'
|
||||
|
||||
/** @desc 查询项目列表 */
|
||||
export function listProject(query: T.ProjectPageQuery) {
|
||||
return http.get<PageRes<T.ProjectResp[]>>(`${BASE_URL}`, query)
|
||||
}
|
||||
|
||||
/** @desc 获取项目详情 */
|
||||
export function getProject(id: number) {
|
||||
return http.get<T.ProjectResp>(`${BASE_URL}/${id}`)
|
||||
}
|
||||
|
||||
/** @desc 新增项目 */
|
||||
export function addProject(data: any) {
|
||||
return http.post(`${BASE_URL}`, data)
|
||||
}
|
||||
|
||||
/** @desc 修改项目 */
|
||||
export function updateProject(data: any, id: number) {
|
||||
return http.put(`${BASE_URL}/${id}`, data)
|
||||
}
|
||||
|
||||
/** @desc 修改项目状态 */
|
||||
export function updateProjectStatus(data: any, id: number) {
|
||||
return http.patch(`${BASE_URL}/${id}/status`, data)
|
||||
}
|
||||
|
||||
/** @desc 删除项目 */
|
||||
export function deleteProject(id: number) {
|
||||
return http.del(`${BASE_URL}/${id}`)
|
||||
}
|
||||
|
||||
/** @desc 导入项目 */
|
||||
export function importProject(file: File) {
|
||||
const formData = new FormData()
|
||||
formData.append('file', file)
|
||||
return http.post(`${BASE_URL}/import`, formData, {
|
||||
headers: {
|
||||
'Content-Type': 'multipart/form-data'
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
/** @desc 导出项目 */
|
||||
export function exportProject(query: T.ProjectQuery) {
|
||||
return http.download(`${BASE_URL}/export`, query)
|
||||
}
|
|
@ -0,0 +1,71 @@
|
|||
import type * as T from './type'
|
||||
import http from '@/utils/http'
|
||||
|
||||
const BASE_URL = '/project/task'
|
||||
|
||||
/** @desc 查询任务组列表 */
|
||||
export function listTaskGroup(projectId: number) {
|
||||
return http.get(`${BASE_URL}/group`, { projectId })
|
||||
}
|
||||
|
||||
/** @desc 新增任务组 */
|
||||
export function addTaskGroup(data: any) {
|
||||
return http.post(`${BASE_URL}/group`, data)
|
||||
}
|
||||
|
||||
/** @desc 修改任务组 */
|
||||
export function updateTaskGroup(data: any, id: number) {
|
||||
return http.put(`${BASE_URL}/group/${id}`, data)
|
||||
}
|
||||
|
||||
/** @desc 删除任务组 */
|
||||
export function deleteTaskGroup(id: number) {
|
||||
return http.del(`${BASE_URL}/group/${id}`)
|
||||
}
|
||||
|
||||
/** @desc 查询任务列表 */
|
||||
export function listTask(query: T.TaskPageQuery) {
|
||||
return http.get<PageRes<T.TaskResp[]>>(`${BASE_URL}`, query)
|
||||
}
|
||||
|
||||
/** @desc 获取任务详情 */
|
||||
export function getTask(id: number) {
|
||||
return http.get<T.TaskResp>(`${BASE_URL}/${id}`)
|
||||
}
|
||||
|
||||
/** @desc 新增任务 */
|
||||
export function addTask(data: any) {
|
||||
return http.post(`${BASE_URL}`, data)
|
||||
}
|
||||
|
||||
/** @desc 修改任务 */
|
||||
export function updateTask(data: any, id: number) {
|
||||
return http.put(`${BASE_URL}/${id}`, data)
|
||||
}
|
||||
|
||||
/** @desc 更新任务状态 */
|
||||
export function updateTaskStatus(data: any, id: number) {
|
||||
return http.patch(`${BASE_URL}/${id}/status`, data)
|
||||
}
|
||||
|
||||
/** @desc 更新任务进度 */
|
||||
export function updateTaskProgress(data: any, id: number) {
|
||||
return http.patch(`${BASE_URL}/${id}/progress`, data)
|
||||
}
|
||||
|
||||
/** @desc 删除任务 */
|
||||
export function deleteTask(id: number) {
|
||||
return http.del(`${BASE_URL}/${id}`)
|
||||
}
|
||||
|
||||
/** @desc 导入任务 */
|
||||
export function importTask(file: File, projectId: number) {
|
||||
const formData = new FormData()
|
||||
formData.append('file', file)
|
||||
formData.append('projectId', projectId.toString())
|
||||
return http.post(`${BASE_URL}/import`, formData, {
|
||||
headers: {
|
||||
'Content-Type': 'multipart/form-data'
|
||||
}
|
||||
})
|
||||
}
|
|
@ -0,0 +1,70 @@
|
|||
/** 项目类型 */
|
||||
export interface ProjectResp {
|
||||
id: number
|
||||
projectCode: string // 项目编号
|
||||
projectName: string // 项目名称
|
||||
projectIntro?: string // 项目简介
|
||||
fieldName: string // 风场名称
|
||||
fieldLocation: string // 风场地址
|
||||
commissionUnit: string // 委托单位
|
||||
commissionContact: string // 委托单位联系人
|
||||
commissionPhone: string // 委托单位联系电话
|
||||
inspectionUnit: string // 检查单位
|
||||
inspectionContact: string // 检查单位联系人
|
||||
inspectionPhone: string // 检查单位联系电话
|
||||
projectScale: string // 项目规模
|
||||
orgNumber: string // 机组型号
|
||||
projectCategory: string // 项目类型/服务
|
||||
projectManager: string // 项目经理
|
||||
projectStaff: string[] // 施工人员
|
||||
projectPeriod: [string, string] // 项目周期
|
||||
status: string // 状态
|
||||
createDt?: Date
|
||||
updateDt?: Date
|
||||
}
|
||||
|
||||
export interface ProjectQuery {
|
||||
projectName?: string
|
||||
projectCode?: string
|
||||
status?: string
|
||||
fieldName?: string
|
||||
}
|
||||
|
||||
export interface ProjectPageQuery extends ProjectQuery, PageQuery {}
|
||||
|
||||
/** 任务组类型 */
|
||||
export interface TaskGroupResp {
|
||||
id: number
|
||||
groupName: string
|
||||
projectId: number
|
||||
createDt?: Date
|
||||
}
|
||||
|
||||
/** 任务类型 */
|
||||
export interface TaskResp {
|
||||
id: number
|
||||
taskName: string
|
||||
taskCode: string
|
||||
projectId: number
|
||||
groupId?: number
|
||||
responsiblePerson: string
|
||||
participants: string[]
|
||||
taskPeriod: [string, string]
|
||||
superior?: number
|
||||
project?: string
|
||||
plannedHours: number
|
||||
status: string
|
||||
progress: number
|
||||
description?: string
|
||||
createDt?: Date
|
||||
updateDt?: Date
|
||||
}
|
||||
|
||||
export interface TaskQuery {
|
||||
projectId?: number
|
||||
groupId?: number
|
||||
taskName?: string
|
||||
status?: string
|
||||
}
|
||||
|
||||
export interface TaskPageQuery extends TaskQuery, PageQuery {}
|
|
@ -0,0 +1,2 @@
|
|||
export * from '../schedule/job'
|
||||
export * from '../schedule/log'
|
|
@ -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}`)
|
||||
}
|
|
@ -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)
|
||||
}
|
|
@ -0,0 +1,85 @@
|
|||
/** 任务类型 */
|
||||
export interface JobResp {
|
||||
id: number
|
||||
groupName: string
|
||||
jobName: string
|
||||
description?: string
|
||||
triggerType: number
|
||||
triggerInterval: string
|
||||
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
|
||||
}
|
|
@ -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(id: string) {
|
||||
return http.del(`${BASE_URL}`, { ids: [id] })
|
||||
}
|
|
@ -0,0 +1,31 @@
|
|||
import type * as T from './type'
|
||||
import http from '@/utils/http'
|
||||
|
||||
export type * from './type'
|
||||
|
||||
const BASE_URL = '/dept'
|
||||
|
||||
/** @desc 新增部门信息 */
|
||||
export function addDept(data: T.DeptAddReq) {
|
||||
return http.post(`${BASE_URL}`, data)
|
||||
}
|
||||
|
||||
/** @desc 查询部门信息详情 */
|
||||
export function getDeptDetail(deptId: string) {
|
||||
return http.get<T.DeptDetailResp>(`${BASE_URL}/detail/${deptId}`)
|
||||
}
|
||||
|
||||
/** @desc 查询部门树 */
|
||||
export function getDeptTree(query?: T.DeptQuery) {
|
||||
return http.get(`${BASE_URL}/tree`, query)
|
||||
}
|
||||
|
||||
/** @desc 修改部门信息 */
|
||||
export function updateDept(deptId: string, data: T.DeptUpdateReq) {
|
||||
return http.put(`${BASE_URL}/${deptId}`, data)
|
||||
}
|
||||
|
||||
/** @desc 删除部门信息 */
|
||||
export function deleteDept(deptId: string) {
|
||||
return http.del(`${BASE_URL}/${deptId}`)
|
||||
}
|
|
@ -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}`, { ids: [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`, { ids: [id] })
|
||||
}
|
|
@ -0,0 +1,46 @@
|
|||
import type * as T from './type'
|
||||
import http from '@/utils/http'
|
||||
|
||||
export type * from './type'
|
||||
|
||||
const BASE_URL = '/system/file'
|
||||
|
||||
/** @desc 上传文件 */
|
||||
export function uploadFile(data: FormData) {
|
||||
return http.post(`${BASE_URL}/upload`, data)
|
||||
}
|
||||
|
||||
/** @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[]) {
|
||||
return http.del(`${BASE_URL}`, { ids })
|
||||
}
|
||||
|
||||
/** @desc 查询文件资源统计统计 */
|
||||
export function getFileStatistics() {
|
||||
return http.get<T.FileStatisticsResp>(`${BASE_URL}/statistics`)
|
||||
}
|
||||
|
||||
/** @desc 根据sha256检测文件是否已经在服务器存在 */
|
||||
export function checkFile(sha256: string) {
|
||||
return http.get<T.FileItem>(`${BASE_URL}/check`, { fileHash: sha256 })
|
||||
}
|
||||
|
||||
/** @desc 创建文件夹 */
|
||||
export function createDir(parentPath: string, name: string) {
|
||||
return http.post<T.FileItem>(`${BASE_URL}/dir`, { parentPath, originalName: name })
|
||||
}
|
||||
|
||||
/** @desc 查询文件夹大小 */
|
||||
export function calcDirSize(id: string) {
|
||||
return http.get<T.FileDirCalcSizeResp>(`${BASE_URL}/dir/${id}/size`)
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
export * from './user'
|
||||
export * from './user-new'
|
||||
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 './smsConfig'
|
||||
export * from './smsLog'
|
||||
export * from './user-profile'
|
||||
export * from './user-message'
|
||||
export * from './post'
|
|
@ -0,0 +1,61 @@
|
|||
import type * as T from './type'
|
||||
import http from '@/utils/http'
|
||||
import { convertMenuData } from '@/utils/menuConverter'
|
||||
|
||||
/**
|
||||
* 从新的API获取菜单树形数据,并转换为角色管理所需的格式
|
||||
*/
|
||||
export function getMenuTreeForRole(query?: { terminalType?: string }) {
|
||||
return http.get<any[]>('/menu/tree', query).then(res => {
|
||||
// 假设响应格式为 { data: [...菜单数据], success: true, msg: "", code: 200 }
|
||||
const data = res.data || [];
|
||||
// 转换菜单数据为角色管理组件需要的格式
|
||||
const convertedData = convertMenuData(data);
|
||||
return convertedData;
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 转换菜单数据为带权限的树形结构
|
||||
* @param menus 转换后的菜单数据
|
||||
* @param selectedMenuIds 已选中的菜单ID集合
|
||||
* @returns 带权限标记的菜单树
|
||||
*/
|
||||
export function transformMenusWithPermissions(menus: any[], selectedMenuIds: string[] = []) {
|
||||
// 深拷贝菜单数据,避免修改原始数据
|
||||
const result = JSON.parse(JSON.stringify(menus));
|
||||
|
||||
// 递归处理菜单树,添加权限标记
|
||||
const processMenus = (items: any[]) => {
|
||||
return items.map(item => {
|
||||
// 设置选中状态
|
||||
item.isChecked = selectedMenuIds.includes(item.id.toString());
|
||||
|
||||
// 如果有子菜单,递归处理
|
||||
if (item.children && item.children.length > 0) {
|
||||
item.children = processMenus(item.children);
|
||||
}
|
||||
|
||||
return item;
|
||||
});
|
||||
};
|
||||
|
||||
return processMenus(result);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取角色已分配的菜单ID列表
|
||||
*/
|
||||
export function getRoleMenuIds(roleId: string) {
|
||||
return http.get<string[]>(`/role/get-menus/${roleId}`);
|
||||
}
|
||||
|
||||
/**
|
||||
* 为角色分配菜单权限
|
||||
*/
|
||||
export function assignRoleMenus(roleId: string, menuIds: string[]) {
|
||||
return http.post('/role/bind-menu', {
|
||||
roleId,
|
||||
menuIds
|
||||
});
|
||||
}
|
|
@ -0,0 +1,51 @@
|
|||
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 getMenuTree(query?: T.MenuTreeQuery) {
|
||||
return http.get<T.MenuResp[]>('/menu/tree', query)
|
||||
}
|
||||
|
||||
/** @desc 查询菜单详情(已废弃) */
|
||||
export function getMenu(id: string) {
|
||||
return http.get<T.MenuResp>(`${BASE_URL}/${id}`)
|
||||
}
|
||||
|
||||
/** @desc 查询菜单详情(新接口) */
|
||||
export function getMenuDetail(menuId: string) {
|
||||
return http.get<T.MenuDetailResp>(`/menu/detail/${menuId}`)
|
||||
}
|
||||
|
||||
/** @desc 新增菜单 */
|
||||
export function addMenu(data: T.MenuAddReq) {
|
||||
return http.post<boolean>('/menu', data)
|
||||
}
|
||||
|
||||
/** @desc 修改菜单(已废弃) */
|
||||
export function updateMenu(data: any, id: string) {
|
||||
return http.put(`${BASE_URL}/${id}`, data)
|
||||
}
|
||||
|
||||
/** @desc 修改菜单(新接口) */
|
||||
export function updateMenuNew(menuId: string, data: T.MenuUpdateReq) {
|
||||
return http.put<boolean>(`/menu/${menuId}`, data)
|
||||
}
|
||||
|
||||
/** @desc 删除菜单 */
|
||||
export function deleteMenu(id: string) {
|
||||
return http.del(`/menu/${id}`)
|
||||
}
|
||||
|
||||
/** @desc 清除菜单缓存 */
|
||||
export function clearMenuCache() {
|
||||
return http.del(`${BASE_URL}/cache`)
|
||||
}
|
|
@ -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.NoticeDetailResp>(`${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(id: string) {
|
||||
return http.del(`${BASE_URL}`, { ids: [id] })
|
||||
}
|
|
@ -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)
|
||||
}
|
|
@ -0,0 +1,46 @@
|
|||
import type * as T from './type';
|
||||
import http from '@/utils/http';
|
||||
|
||||
const BASE_URL = '/post';
|
||||
|
||||
/**
|
||||
* 添加岗位
|
||||
*/
|
||||
export function addPost(data: T.PostAddReq) {
|
||||
return http.post<any>(BASE_URL, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询岗位详情
|
||||
*/
|
||||
export function getPostDetail(postId: string) {
|
||||
return http.get<T.PostVO>(`${BASE_URL}/detail/${postId}`);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询岗位列表
|
||||
*/
|
||||
export function listPost(params?: T.PostPageQuery) {
|
||||
return http.get<T.PostVO[]>(`${BASE_URL}/list`, params);
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页查询岗位列表
|
||||
*/
|
||||
export function pagePost(params?: T.PostPageQuery) {
|
||||
return http.get<PageRes<T.PostVO[]>>(`${BASE_URL}/page`, params);
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改岗位
|
||||
*/
|
||||
export function updatePost(postId: string, data: T.PostUpdateReq) {
|
||||
return http.put<any>(`${BASE_URL}/${postId}`, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除岗位
|
||||
*/
|
||||
export function deletePost(postId: string) {
|
||||
return http.del<any>(`${BASE_URL}/${postId}`);
|
||||
}
|
|
@ -0,0 +1,91 @@
|
|||
import type * as T from './type'
|
||||
import http from '@/utils/http'
|
||||
|
||||
export type * from './type'
|
||||
|
||||
const BASE_URL = '/system/role'
|
||||
|
||||
/** @desc 查询角色列表(已废弃) */
|
||||
export function listRole(query: T.RoleQuery) {
|
||||
return http.get<T.RoleResp[]>(`${BASE_URL}/list`, query)
|
||||
}
|
||||
|
||||
/** @desc 查询角色列表(新接口) */
|
||||
export function getRoleList(query?: T.RoleNewQuery) {
|
||||
return http.get<T.RoleNewResp[]>('/role/list', query)
|
||||
}
|
||||
|
||||
/** @desc 分页查询角色列表(新接口) */
|
||||
export function getRolePage(query?: T.RoleNewQuery) {
|
||||
return http.get<PageRes<T.RoleNewResp[]>>('/role/page', query)
|
||||
}
|
||||
|
||||
/** @desc 查询角色详情(已废弃) */
|
||||
export function getRole(id: string) {
|
||||
return http.get<T.RoleDetailResp>(`${BASE_URL}/${id}`)
|
||||
}
|
||||
|
||||
/** @desc 查询角色详情(新接口) */
|
||||
export function getRoleDetail(roleId: string) {
|
||||
return http.get<T.RoleNewResp>(`/role/detail/${roleId}`)
|
||||
}
|
||||
|
||||
/** @desc 新增角色(已废弃) */
|
||||
export function addRole(data: any) {
|
||||
return http.post(`${BASE_URL}`, data)
|
||||
}
|
||||
|
||||
/** @desc 新增角色(新接口) */
|
||||
export function addRoleNew(data: T.RoleAddReq) {
|
||||
return http.post<boolean>('/role', data)
|
||||
}
|
||||
|
||||
/** @desc 修改角色(已废弃) */
|
||||
export function updateRole(data: any, id: string) {
|
||||
return http.put(`${BASE_URL}/${id}`, data)
|
||||
}
|
||||
|
||||
/** @desc 修改角色(新接口) */
|
||||
export function updateRoleNew(roleId: string, data: T.RoleUpdateReq) {
|
||||
return http.put<boolean>(`/role/${roleId}`, data)
|
||||
}
|
||||
|
||||
/** @desc 删除角色(已废弃) */
|
||||
export function deleteRole(id: string) {
|
||||
return http.del(`${BASE_URL}`, { ids: [id] })
|
||||
}
|
||||
|
||||
/** @desc 删除角色(新接口) */
|
||||
export function deleteRoleNew(roleId: string) {
|
||||
return http.del<boolean>(`/role/${roleId}`)
|
||||
}
|
||||
|
||||
/** @desc 绑定菜单(新接口) */
|
||||
export function bindRoleMenu(data: T.RoleBindMenuReq) {
|
||||
return http.put<boolean>('/role/bind-menu', data)
|
||||
}
|
||||
|
||||
/** @desc 修改角色权限(已废弃) */
|
||||
export function updateRolePermission(id: string, data: any) {
|
||||
return http.put(`${BASE_URL}/${id}/permission`, data)
|
||||
}
|
||||
|
||||
/** @desc 查询角色关联用户 */
|
||||
export function listRoleUser(id: string, query: T.RoleUserPageQuery) {
|
||||
return http.get<PageRes<T.RoleUserResp[]>>(`${BASE_URL}/${id}/user`, query)
|
||||
}
|
||||
|
||||
/** @desc 分配角色给用户 */
|
||||
export function assignToUsers(id: string, userIds: Array<string>) {
|
||||
return http.post(`${BASE_URL}/${id}/user`, userIds)
|
||||
}
|
||||
|
||||
/** @desc 取消分配角色给用户 */
|
||||
export function unassignFromUsers(userRoleIds: Array<string | number>) {
|
||||
return http.del(`${BASE_URL}/user`, userRoleIds)
|
||||
}
|
||||
|
||||
/** @desc 查询角色关联用户 ID */
|
||||
export function listRoleUserId(id: string) {
|
||||
return http.get(`${BASE_URL}/${id}/user/id`)
|
||||
}
|
|
@ -0,0 +1,36 @@
|
|||
import type * as T from './type'
|
||||
import http from '@/utils/http'
|
||||
|
||||
export type * from './type'
|
||||
|
||||
const BASE_URL = '/system/smsConfig'
|
||||
|
||||
/** @desc 查询短信配置列表 */
|
||||
export function listSmsConfig(query: T.SmsConfigPageQuery) {
|
||||
return http.get<PageRes<T.SmsConfigResp[]>>(`${BASE_URL}`, query)
|
||||
}
|
||||
|
||||
/** @desc 查询短信配置详情 */
|
||||
export function getSmsConfig(id: string) {
|
||||
return http.get<T.SmsConfigResp>(`${BASE_URL}/${id}`)
|
||||
}
|
||||
|
||||
/** @desc 新增短信配置 */
|
||||
export function addSmsConfig(data: any) {
|
||||
return http.post(`${BASE_URL}`, data)
|
||||
}
|
||||
|
||||
/** @desc 修改短信配置 */
|
||||
export function updateSmsConfig(data: any, id: string) {
|
||||
return http.put(`${BASE_URL}/${id}`, data)
|
||||
}
|
||||
|
||||
/** @desc 删除短信配置 */
|
||||
export function deleteSmsConfig(id: string) {
|
||||
return http.del(`${BASE_URL}`, { ids: [id] })
|
||||
}
|
||||
|
||||
/** @desc 设置默认配置 */
|
||||
export function setDefaultSmsConfig(id: string) {
|
||||
return http.put(`${BASE_URL}/${id}/default`)
|
||||
}
|
|
@ -0,0 +1,26 @@
|
|||
import type * as T from './type'
|
||||
import http from '@/utils/http'
|
||||
|
||||
export type * from './type'
|
||||
|
||||
const BASE_URL = '/system/smsLog'
|
||||
|
||||
/** @desc 查询短信日志列表 */
|
||||
export function listSmsLog(query: T.SmsLogPageQuery) {
|
||||
return http.get<PageRes<T.SmsLogResp[]>>(`${BASE_URL}`, query)
|
||||
}
|
||||
|
||||
/** @desc 查询短信日志详情 */
|
||||
export function getSmsLog(id: string) {
|
||||
return http.get<T.SmsLogResp>(`${BASE_URL}/${id}`)
|
||||
}
|
||||
|
||||
/** @desc 删除短信日志 */
|
||||
export function deleteSmsLog(id: string) {
|
||||
return http.del(`${BASE_URL}`, { ids: [id] })
|
||||
}
|
||||
|
||||
/** @desc 导出短信日志 */
|
||||
export function exportSmsLog(query: T.SmsLogQuery) {
|
||||
return http.download(`${BASE_URL}/export`, query)
|
||||
}
|
|
@ -0,0 +1,41 @@
|
|||
import type * as T from './type'
|
||||
import http from '@/utils/http'
|
||||
|
||||
export type * from './type'
|
||||
|
||||
const BASE_URL = '/system/storage'
|
||||
|
||||
/** @desc 查询存储列表 */
|
||||
export function listStorage(query: T.StorageQuery) {
|
||||
return http.get<T.StorageResp[]>(`${BASE_URL}/list`, query)
|
||||
}
|
||||
|
||||
/** @desc 查询存储详情 */
|
||||
export function getStorage(id: string) {
|
||||
return http.get<T.StorageResp>(`${BASE_URL}/${id}`)
|
||||
}
|
||||
|
||||
/** @desc 新增存储 */
|
||||
export function addStorage(data: any) {
|
||||
return http.post(`${BASE_URL}`, data)
|
||||
}
|
||||
|
||||
/** @desc 修改存储 */
|
||||
export function updateStorage(data: any, id: string) {
|
||||
return http.put(`${BASE_URL}/${id}`, data)
|
||||
}
|
||||
|
||||
/** @desc 删除存储 */
|
||||
export function deleteStorage(id: string) {
|
||||
return http.del(`${BASE_URL}`, { ids: [id] })
|
||||
}
|
||||
|
||||
/** @desc 修改存储状态 */
|
||||
export function updateStorageStatus(data: any, id: string) {
|
||||
return http.put(`${BASE_URL}/${id}/status`, data)
|
||||
}
|
||||
|
||||
/** @desc 设置默认存储 */
|
||||
export function setDefaultStorage(id: string) {
|
||||
return http.put(`${BASE_URL}/${id}/default`)
|
||||
}
|
|
@ -0,0 +1,676 @@
|
|||
/** 用户类型 */
|
||||
export interface UserResp {
|
||||
id: string
|
||||
username: string
|
||||
nickname: string
|
||||
avatar: string
|
||||
gender: number
|
||||
email: string
|
||||
phone: string
|
||||
description: string
|
||||
status: 1 | 2
|
||||
isSystem?: boolean
|
||||
createUserString: string
|
||||
createTime: string
|
||||
updateUserString: string
|
||||
updateTime: string
|
||||
deptId: string
|
||||
deptName: string
|
||||
roleIds: Array<number>
|
||||
roleNames: Array<string>
|
||||
disabled: boolean
|
||||
}
|
||||
|
||||
/** 新用户信息响应类型 */
|
||||
export interface UserNewResp {
|
||||
userId: string
|
||||
account: string
|
||||
avatar: string
|
||||
birthdate: string
|
||||
deptId: string
|
||||
deptName: string
|
||||
education: string
|
||||
educationLabel: string
|
||||
email: string
|
||||
gender: string
|
||||
hiredate: string
|
||||
identityCard: string
|
||||
majorField: string
|
||||
mobile: string
|
||||
name: string
|
||||
postIds: string[]
|
||||
postName: string
|
||||
roleIds: string[]
|
||||
roleName: string
|
||||
status: number
|
||||
userCode: string
|
||||
userStatus: string
|
||||
userStatusLabel: string
|
||||
userType: string
|
||||
userTypeLabel: string
|
||||
workField: string
|
||||
msg: string
|
||||
success: boolean
|
||||
}
|
||||
|
||||
/** 新用户信息请求类型 */
|
||||
export interface UserNewAddReq {
|
||||
account: string
|
||||
avatar?: string
|
||||
birthdate?: string
|
||||
deptId?: string
|
||||
education?: string
|
||||
email?: string
|
||||
gender?: string
|
||||
hiredate?: string
|
||||
identityCard?: string
|
||||
majorField?: string
|
||||
mobile?: string
|
||||
name?: string
|
||||
postIds?: string[]
|
||||
roleIds?: string[]
|
||||
status?: number
|
||||
userStatus?: string
|
||||
userType?: string
|
||||
workField?: string
|
||||
}
|
||||
|
||||
/** 新用户信息修改请求类型 */
|
||||
export interface UserNewUpdateReq extends UserNewAddReq {}
|
||||
|
||||
/** 新用户绑定角色请求类型 */
|
||||
export interface UserBindRoleReq {
|
||||
roleIds: string[]
|
||||
userId: string
|
||||
}
|
||||
|
||||
/** 新用户查询参数 */
|
||||
export interface UserNewQuery {
|
||||
account?: string
|
||||
deptId?: string
|
||||
mobile?: string
|
||||
name?: string
|
||||
userCode?: string
|
||||
userStatus?: string
|
||||
userType?: string
|
||||
}
|
||||
|
||||
/** 新用户分页查询参数 */
|
||||
export interface UserNewPageQuery extends UserNewQuery, PageQuery {}
|
||||
|
||||
export type UserDetailResp = UserResp & {
|
||||
pwdResetTime?: string
|
||||
}
|
||||
|
||||
export interface UserImportResp {
|
||||
importKey: string
|
||||
totalRows: number
|
||||
validRows: number
|
||||
duplicateUserRows: number
|
||||
duplicateEmailRows: number
|
||||
duplicatePhoneRows: number
|
||||
}
|
||||
export interface UserQuery {
|
||||
description?: string
|
||||
status?: number
|
||||
createTime?: Array<string>
|
||||
deptId?: string
|
||||
sort: Array<string>
|
||||
userIds?: Array<string>
|
||||
roleId?: string
|
||||
}
|
||||
export interface UserPageQuery extends UserQuery, PageQuery {}
|
||||
|
||||
/** 角色类型 */
|
||||
export interface RoleResp {
|
||||
id: string
|
||||
name: string
|
||||
code: string
|
||||
sort: number
|
||||
description: string
|
||||
dataScope: number
|
||||
isSystem: boolean
|
||||
createUserString: string
|
||||
createTime: string
|
||||
updateUserString: string
|
||||
updateTime: string
|
||||
disabled: boolean
|
||||
}
|
||||
export type RoleDetailResp = RoleResp & {
|
||||
menuIds: Array<number>
|
||||
deptIds: Array<number>
|
||||
menuCheckStrictly: boolean
|
||||
deptCheckStrictly: boolean
|
||||
}
|
||||
export interface RoleUserResp {
|
||||
id: string
|
||||
username: string
|
||||
nickname: string
|
||||
gender: number
|
||||
description: string
|
||||
status: 1 | 2
|
||||
isSystem?: boolean
|
||||
deptId: string
|
||||
deptName: string
|
||||
roleIds: Array<number>
|
||||
roleNames: Array<string>
|
||||
disabled: boolean
|
||||
}
|
||||
export interface RoleQuery {
|
||||
description?: string
|
||||
sort: Array<string>
|
||||
}
|
||||
export interface RoleUserQuery {
|
||||
description?: string
|
||||
sort: Array<string>
|
||||
}
|
||||
export interface RoleUserPageQuery extends RoleUserQuery, PageQuery {}
|
||||
|
||||
/** 菜单类型 */
|
||||
export interface MenuResp {
|
||||
id: string
|
||||
title: string
|
||||
parentId: string
|
||||
type: 1 | 2 | 3
|
||||
path: string
|
||||
name: string
|
||||
component: string
|
||||
redirect: string
|
||||
icon: string
|
||||
isExternal: boolean
|
||||
isCache: boolean
|
||||
isHidden: boolean
|
||||
permission: string
|
||||
sort: number
|
||||
status: 1 | 2
|
||||
createUserString: string
|
||||
createTime: string
|
||||
updateUserString: string
|
||||
updateTime: string
|
||||
children: MenuResp[]
|
||||
}
|
||||
export interface MenuQuery {
|
||||
title?: string
|
||||
status?: number
|
||||
}
|
||||
|
||||
/** 部门类型 */
|
||||
export interface DeptResp {
|
||||
deptId: string
|
||||
deptName: string
|
||||
leaderId: string
|
||||
orderNum: number
|
||||
parentId: string
|
||||
status: string
|
||||
children?: DeptResp[]
|
||||
}
|
||||
|
||||
/** 部门查询参数 */
|
||||
export interface DeptQuery {
|
||||
deptName?: string
|
||||
}
|
||||
|
||||
/** 部门新增请求参数 */
|
||||
export interface DeptAddReq {
|
||||
deptName: string
|
||||
leaderId?: string
|
||||
orderNum: number
|
||||
parentId?: string
|
||||
status: number
|
||||
}
|
||||
|
||||
/** 部门修改请求参数 */
|
||||
export interface DeptUpdateReq {
|
||||
deptName: string
|
||||
leaderId?: string
|
||||
orderNum: number
|
||||
parentId?: string
|
||||
status: number
|
||||
}
|
||||
|
||||
/** 部门详情响应类型 */
|
||||
export interface DeptDetailResp {
|
||||
deptId: string
|
||||
deptName: string
|
||||
leaderId: string
|
||||
orderNum: number
|
||||
parentId: string
|
||||
status: string
|
||||
}
|
||||
|
||||
/** 字典类型 */
|
||||
export interface DictResp {
|
||||
id: string
|
||||
name: string
|
||||
code: string
|
||||
isSystem: boolean
|
||||
description: string
|
||||
createUserString: string
|
||||
createTime: string
|
||||
updateUserString: string
|
||||
updateTime: string
|
||||
}
|
||||
export interface DictQuery {
|
||||
description?: string
|
||||
sort: Array<string>
|
||||
}
|
||||
export interface DictItemResp {
|
||||
id: string
|
||||
label: string
|
||||
value: string
|
||||
color: string
|
||||
sort: number
|
||||
description: string
|
||||
status: 1 | 2
|
||||
dictId: number
|
||||
createUserString: string
|
||||
createTime: string
|
||||
updateUserString: string
|
||||
updateTime: string
|
||||
}
|
||||
export interface DictItemQuery {
|
||||
description?: string
|
||||
status?: number
|
||||
sort: Array<string>
|
||||
dictId: string
|
||||
}
|
||||
export interface DictItemPageQuery extends DictItemQuery, PageQuery {
|
||||
}
|
||||
|
||||
/** 公告类型 */
|
||||
export interface NoticeResp {
|
||||
id?: string
|
||||
title?: string
|
||||
type: string
|
||||
noticeScope: number
|
||||
noticeMethods?: Array<number>
|
||||
isTiming: boolean
|
||||
publishTime?: string
|
||||
isTop: boolean
|
||||
status?: number
|
||||
}
|
||||
export type NoticeDetailResp = NoticeResp & {
|
||||
createUserString: string
|
||||
createTime: string
|
||||
updateUserString: string
|
||||
updateTime: string
|
||||
}
|
||||
export type NoticePreviewResp = NoticeDetailResp & {
|
||||
content: string
|
||||
}
|
||||
export interface NoticeQuery {
|
||||
title?: string
|
||||
type?: string
|
||||
sort: Array<string>
|
||||
}
|
||||
export interface NoticePageQuery extends NoticeQuery, PageQuery {
|
||||
}
|
||||
|
||||
/** 文件类型 */
|
||||
export interface FileItem {
|
||||
id: string
|
||||
name: string
|
||||
originalName: string
|
||||
size: number
|
||||
url: string
|
||||
parentPath: string
|
||||
path: string
|
||||
sha256: string
|
||||
contentType: string
|
||||
metadata: string
|
||||
thumbnailSize: number
|
||||
thumbnailName: string
|
||||
thumbnailMetadata: string
|
||||
thumbnailUrl: string
|
||||
extension: string
|
||||
type: number
|
||||
storageId: string
|
||||
storageName: string
|
||||
createUserString: string
|
||||
createTime: string
|
||||
updateUserString?: string
|
||||
updateTime?: string
|
||||
}
|
||||
/** 文件资源统计信息 */
|
||||
export interface FileStatisticsResp {
|
||||
type: string
|
||||
size: any
|
||||
number: number
|
||||
unit: string
|
||||
data: Array<FileStatisticsResp>
|
||||
}
|
||||
/** 文件夹计算大小信息 */
|
||||
export interface FileDirCalcSizeResp {
|
||||
size: number
|
||||
}
|
||||
export interface FileQuery {
|
||||
originalName?: string
|
||||
type?: string
|
||||
parentPath?: string
|
||||
sort: Array<string>
|
||||
}
|
||||
export interface FilePageQuery extends FileQuery, PageQuery {
|
||||
}
|
||||
|
||||
/** 存储类型 */
|
||||
export interface StorageResp {
|
||||
id: string
|
||||
name: string
|
||||
code: string
|
||||
type: number
|
||||
accessKey: string
|
||||
secretKey: string
|
||||
endpoint: string
|
||||
bucketName: string
|
||||
domain: string
|
||||
description: string
|
||||
isDefault: boolean
|
||||
sort: number
|
||||
status: number
|
||||
createUserString: string
|
||||
createTime: string
|
||||
updateUserString: string
|
||||
updateTime: string
|
||||
}
|
||||
export interface StorageQuery {
|
||||
description?: string
|
||||
type?: number
|
||||
sort: Array<string>
|
||||
}
|
||||
|
||||
/** 客户端类型 */
|
||||
export interface ClientResp {
|
||||
id: string
|
||||
clientId: string
|
||||
clientType: string
|
||||
authType: string
|
||||
activeTimeout: string
|
||||
timeout: string
|
||||
status: string
|
||||
createUser: string
|
||||
createTime: string
|
||||
updateUser: string
|
||||
updateTime: string
|
||||
createUserString: string
|
||||
updateUserString: string
|
||||
}
|
||||
export interface ClientDetailResp {
|
||||
id: string
|
||||
clientId: string
|
||||
clientType: string
|
||||
authType: string
|
||||
activeTimeout: string
|
||||
timeout: string
|
||||
status: string
|
||||
createUser: string
|
||||
createTime: string
|
||||
updateUser: string
|
||||
updateTime: string
|
||||
createUserString: string
|
||||
updateUserString: string
|
||||
}
|
||||
export interface ClientQuery {
|
||||
clientType: string
|
||||
authType: string[]
|
||||
status: string
|
||||
sort: Array<string>
|
||||
}
|
||||
export interface ClientPageQuery extends ClientQuery, PageQuery {}
|
||||
|
||||
/** 系统参数类型 */
|
||||
export interface OptionResp {
|
||||
id: string
|
||||
name: string
|
||||
code: string
|
||||
value: string
|
||||
description: string
|
||||
}
|
||||
|
||||
export interface OptionQuery {
|
||||
code?: Array<string>
|
||||
category?: string
|
||||
}
|
||||
|
||||
/** 基础配置类型 */
|
||||
export interface BasicConfig {
|
||||
SITE_FAVICON: string
|
||||
SITE_LOGO: string
|
||||
SITE_TITLE: string
|
||||
SITE_COPYRIGHT: string
|
||||
SITE_BEIAN: string
|
||||
}
|
||||
|
||||
/** 基础配置类型 */
|
||||
export interface SiteConfig {
|
||||
SITE_FAVICON: OptionResp
|
||||
SITE_LOGO: OptionResp
|
||||
SITE_TITLE: OptionResp
|
||||
SITE_DESCRIPTION: OptionResp
|
||||
SITE_COPYRIGHT: OptionResp
|
||||
SITE_BEIAN: OptionResp
|
||||
}
|
||||
|
||||
/** 安全配置类型 */
|
||||
export interface SecurityConfig {
|
||||
PASSWORD_ERROR_LOCK_COUNT: OptionResp
|
||||
PASSWORD_ERROR_LOCK_MINUTES: OptionResp
|
||||
PASSWORD_EXPIRATION_DAYS: OptionResp
|
||||
PASSWORD_EXPIRATION_WARNING_DAYS: OptionResp
|
||||
PASSWORD_REPETITION_TIMES: OptionResp
|
||||
PASSWORD_MIN_LENGTH: OptionResp
|
||||
PASSWORD_ALLOW_CONTAIN_USERNAME: OptionResp
|
||||
PASSWORD_REQUIRE_SYMBOLS: OptionResp
|
||||
}
|
||||
|
||||
/** 邮箱配置类型 */
|
||||
export interface MailConfig {
|
||||
MAIL_PROTOCOL: OptionResp
|
||||
MAIL_HOST: OptionResp
|
||||
MAIL_PORT: OptionResp
|
||||
MAIL_USERNAME: OptionResp
|
||||
MAIL_PASSWORD: OptionResp
|
||||
MAIL_SSL_ENABLED: OptionResp
|
||||
MAIL_SSL_PORT: OptionResp
|
||||
}
|
||||
|
||||
/** 登录配置类型 */
|
||||
export interface LoginConfig {
|
||||
LOGIN_CAPTCHA_ENABLED: OptionResp
|
||||
}
|
||||
|
||||
/** 短信配置类型 */
|
||||
export interface SmsConfigResp {
|
||||
id: string
|
||||
name: string
|
||||
supplier: string
|
||||
accessKey: string
|
||||
secretKey: string
|
||||
signature: string
|
||||
templateId: string
|
||||
weight: string
|
||||
retryInterval: string
|
||||
maxRetries: string
|
||||
maximum: string
|
||||
supplierConfig: string
|
||||
status: number
|
||||
isDefault: boolean
|
||||
createUser: string
|
||||
createTime: string
|
||||
updateUser: string
|
||||
updateTime: string
|
||||
createUserString: string
|
||||
updateUserString: string
|
||||
disabled: boolean
|
||||
}
|
||||
export interface SmsConfigQuery {
|
||||
name: string | undefined
|
||||
supplier: string | undefined
|
||||
accessKey: string | undefined
|
||||
sort: Array<string>
|
||||
}
|
||||
export interface SmsConfigPageQuery extends SmsConfigQuery, PageQuery {}
|
||||
|
||||
/** 短信日志类型 */
|
||||
export interface SmsLogResp {
|
||||
id: string
|
||||
configId: string
|
||||
phone: string
|
||||
params: string
|
||||
status: number
|
||||
resMsg: string
|
||||
createUser: string
|
||||
createTime: string
|
||||
updateUser: string
|
||||
updateTime: string
|
||||
createUserString: string
|
||||
updateUserString: string
|
||||
}
|
||||
export interface SmsLogQuery {
|
||||
configId: string | undefined
|
||||
phone: string | undefined
|
||||
status: number | undefined
|
||||
sort: Array<string>
|
||||
}
|
||||
export interface SmsLogPageQuery extends SmsLogQuery, PageQuery {}
|
||||
|
||||
/** 绑定三方账号信息 */
|
||||
export interface BindSocialAccountRes {
|
||||
source: string
|
||||
description: string
|
||||
}
|
||||
|
||||
/** 系统消息类型 */
|
||||
export interface MessageResp {
|
||||
id: string
|
||||
title: string
|
||||
content: string
|
||||
type: number
|
||||
path: string
|
||||
isRead: boolean
|
||||
readTime?: string
|
||||
createUserString?: string
|
||||
createTime: string
|
||||
}
|
||||
|
||||
export interface MessageQuery {
|
||||
title?: string
|
||||
type?: number
|
||||
isRead?: boolean
|
||||
sort: Array<string>
|
||||
}
|
||||
|
||||
export interface MessagePageQuery extends MessageQuery, PageQuery {
|
||||
}
|
||||
|
||||
/** 新增菜单请求参数 */
|
||||
export interface MenuAddReq {
|
||||
menuName: string;
|
||||
menuType: string;
|
||||
orderNum: number;
|
||||
parentId: string;
|
||||
perms: string;
|
||||
terminalType: string;
|
||||
url: string;
|
||||
visible: string;
|
||||
}
|
||||
|
||||
/** 新菜单树查询参数 */
|
||||
export interface MenuTreeQuery {
|
||||
menuName?: string;
|
||||
terminalType?: string;
|
||||
}
|
||||
|
||||
/** 新菜单详情响应类型 */
|
||||
export interface MenuDetailResp {
|
||||
menuId: string;
|
||||
menuName: string;
|
||||
menuType: string;
|
||||
orderNum: number;
|
||||
parentId: string;
|
||||
perms: string;
|
||||
url: string;
|
||||
visible: string;
|
||||
}
|
||||
|
||||
/** 菜单更新请求参数 */
|
||||
export interface MenuUpdateReq {
|
||||
menuName: string;
|
||||
menuType: string;
|
||||
orderNum: number;
|
||||
parentId: string;
|
||||
perms: string;
|
||||
terminalType: string;
|
||||
url: string;
|
||||
visible: string;
|
||||
}
|
||||
|
||||
/** 新角色信息请求实体 */
|
||||
export interface RoleAddReq {
|
||||
remark: string;
|
||||
roleCode: string;
|
||||
roleKey: string;
|
||||
roleName: string;
|
||||
status: number;
|
||||
}
|
||||
|
||||
/** 角色信息更新请求实体 */
|
||||
export interface RoleUpdateReq {
|
||||
remark: string;
|
||||
roleCode: string;
|
||||
roleKey: string;
|
||||
roleName: string;
|
||||
status: number;
|
||||
}
|
||||
|
||||
/** 新角色信息响应实体 */
|
||||
export interface RoleNewResp {
|
||||
remark: string;
|
||||
roleCode: string;
|
||||
roleId: string;
|
||||
roleKey: string;
|
||||
roleName: string;
|
||||
status: string;
|
||||
isSystem?: boolean;
|
||||
}
|
||||
|
||||
/** 角色菜单绑定请求 */
|
||||
export interface RoleBindMenuReq {
|
||||
menuIds: string[];
|
||||
roleId: string;
|
||||
}
|
||||
|
||||
/** 角色查询参数(新接口) */
|
||||
export interface RoleNewQuery {
|
||||
roleName?: string;
|
||||
}
|
||||
|
||||
// 岗位相关类型定义
|
||||
export interface PostVO {
|
||||
postId: string;
|
||||
postName: string;
|
||||
postSort: number;
|
||||
remark: string;
|
||||
status: string | number;
|
||||
createTime?: string;
|
||||
updateTime?: string;
|
||||
}
|
||||
|
||||
export interface PostPageQuery {
|
||||
postName?: string;
|
||||
page?: number;
|
||||
size?: number;
|
||||
}
|
||||
|
||||
export interface PostAddReq {
|
||||
postName: string;
|
||||
postSort: number;
|
||||
remark: string;
|
||||
status: number;
|
||||
}
|
||||
|
||||
export interface PostUpdateReq {
|
||||
postName: string;
|
||||
postSort: number;
|
||||
remark: string;
|
||||
status: number;
|
||||
}
|
|
@ -0,0 +1,56 @@
|
|||
import type * as T from './type'
|
||||
import http from '@/utils/http'
|
||||
|
||||
export type * from './type'
|
||||
|
||||
const BASE_URL = '/user/message'
|
||||
|
||||
/** @desc 查询未读消息数量 */
|
||||
export function getUnreadMessageCount() {
|
||||
return http.get(`${BASE_URL}/unread`)
|
||||
}
|
||||
|
||||
/** @desc 查询消息列表 */
|
||||
export function listMessage(query: T.MessagePageQuery) {
|
||||
return http.get<PageRes<T.MessageResp[]>>(`${BASE_URL}`, query)
|
||||
}
|
||||
|
||||
/** @desc 获取用户消息详情 */
|
||||
export function getUserMessage(id: number) {
|
||||
return http.get<T.MessageResp>(`${BASE_URL}/${id}`)
|
||||
}
|
||||
|
||||
/** @desc 删除消息 */
|
||||
export function deleteMessage(ids: Array<string>) {
|
||||
return http.del(`${BASE_URL}`, { ids })
|
||||
}
|
||||
|
||||
/** @desc 标记已读 */
|
||||
export function readMessage(ids: Array<string>) {
|
||||
return http.patch(`${BASE_URL}/read`, { ids })
|
||||
}
|
||||
|
||||
/** @desc 全部已读 */
|
||||
export function readAllMessage() {
|
||||
return http.patch(`${BASE_URL}/readAll`)
|
||||
}
|
||||
|
||||
/** @desc 查询未读公告数量 */
|
||||
export function getUnreadNoticeCount() {
|
||||
return http.get(`${BASE_URL}/notice/unread`)
|
||||
}
|
||||
|
||||
/** @desc 查询未读公告 ID 列表 */
|
||||
export function getUnreadNoticeIds(method: string) {
|
||||
return http.get<number[]>(`${BASE_URL}/notice/unread/${method}`)
|
||||
}
|
||||
|
||||
/** @desc 分页查询用户公告 */
|
||||
export function listUserNotice(query: T.NoticePageQuery) {
|
||||
return http.get<PageRes<T.NoticeResp[]>>(`${BASE_URL}/notice`, query)
|
||||
}
|
||||
|
||||
/** @desc 获取用户公告详情 */
|
||||
export function getUserNotice(id: number) {
|
||||
return http.get<T.NoticeResp>(`${BASE_URL}/notice/${id}`)
|
||||
}
|
|
@ -0,0 +1,39 @@
|
|||
import type * as T from './type'
|
||||
import http from '@/utils/http'
|
||||
|
||||
const BASE_URL = '/user'
|
||||
|
||||
/** @desc 新增用户信息 */
|
||||
export function addUserNew(data: T.UserNewAddReq) {
|
||||
return http.post<T.UserNewResp>(`${BASE_URL}`, data)
|
||||
}
|
||||
|
||||
/** @desc 绑定角色 */
|
||||
export function bindUserRole(data: T.UserBindRoleReq) {
|
||||
return http.put(`${BASE_URL}/bind-role`, data)
|
||||
}
|
||||
|
||||
/** @desc 根据用户信息Id获取详细信息 */
|
||||
export function getUserDetailNew(userId: string) {
|
||||
return http.get<T.UserNewResp>(`${BASE_URL}/detail/${userId}`)
|
||||
}
|
||||
|
||||
/** @desc 查询用户信息列表 */
|
||||
export function listUserNew(query: T.UserNewQuery) {
|
||||
return http.get<T.UserNewResp[]>(`${BASE_URL}/list`, query)
|
||||
}
|
||||
|
||||
/** @desc 分页查询用户信息列表 */
|
||||
export function pageUserNew(query: T.UserNewPageQuery) {
|
||||
return http.get<PageRes<T.UserNewResp[]>>(`${BASE_URL}/page`, query)
|
||||
}
|
||||
|
||||
/** @desc 修改用户信息 */
|
||||
export function updateUserNew(userId: string, data: T.UserNewUpdateReq) {
|
||||
return http.put(`${BASE_URL}/${userId}`, data)
|
||||
}
|
||||
|
||||
/** @desc 删除用户信息 */
|
||||
export function deleteUserNew(userId: string) {
|
||||
return http.del(`${BASE_URL}/${userId}`)
|
||||
}
|
|
@ -0,0 +1,44 @@
|
|||
import type * as T from './type'
|
||||
import http from '@/utils/http'
|
||||
|
||||
const BASE_URL = '/user/profile'
|
||||
|
||||
/** @desc 上传头像 */
|
||||
export function uploadAvatar(data: FormData) {
|
||||
return http.patch(`${BASE_URL}/avatar`, data)
|
||||
}
|
||||
|
||||
/** @desc 修改用户基本信息 */
|
||||
export function updateUserBaseInfo(data: { nickname: string, gender: number }) {
|
||||
return http.patch(`${BASE_URL}/basic/info`, data)
|
||||
}
|
||||
|
||||
/** @desc 修改密码 */
|
||||
export function updateUserPassword(data: { oldPassword: string, newPassword: string }) {
|
||||
return http.patch(`${BASE_URL}/password`, data)
|
||||
}
|
||||
|
||||
/** @desc 修改手机号 */
|
||||
export function updateUserPhone(data: { phone: string, captcha: string, oldPassword: string }) {
|
||||
return http.patch(`${BASE_URL}/phone`, data)
|
||||
}
|
||||
|
||||
/** @desc 修改邮箱 */
|
||||
export function updateUserEmail(data: { email: string, captcha: string, oldPassword: string }) {
|
||||
return http.patch(`${BASE_URL}/email`, data)
|
||||
}
|
||||
|
||||
/** @desc 获取绑定的三方账号 */
|
||||
export function listUserSocial() {
|
||||
return http.get<T.BindSocialAccountRes[]>(`${BASE_URL}/social`)
|
||||
}
|
||||
|
||||
/** @desc 绑定三方账号 */
|
||||
export function bindSocialAccount(source: string, data: any) {
|
||||
return http.post(`${BASE_URL}/social/${source}`, data)
|
||||
}
|
||||
|
||||
/** @desc 解绑三方账号 */
|
||||
export function unbindSocialAccount(source: string) {
|
||||
return http.del(`${BASE_URL}/social/${source}`)
|
||||
}
|
|
@ -0,0 +1,64 @@
|
|||
import type * as T from './type'
|
||||
import http from '@/utils/http'
|
||||
|
||||
const BASE_URL = '/user'
|
||||
|
||||
/** @desc 查询用户列表 */
|
||||
export function listUser(query: T.UserPageQuery) {
|
||||
return http.get<PageRes<T.UserResp[]>>(`${BASE_URL}`, query)
|
||||
}
|
||||
|
||||
/** @desc 查询所有用户列表 */
|
||||
export function listAllUser(query: Partial<T.UserPageQuery>) {
|
||||
return http.get<T.UserResp[]>(`${BASE_URL}/list`, query)
|
||||
}
|
||||
|
||||
/** @desc 查询用户详情 */
|
||||
export function getUser(id: string) {
|
||||
return http.get<T.UserDetailResp>(`${BASE_URL}/detail/${id}`)
|
||||
}
|
||||
|
||||
/** @desc 新增用户 */
|
||||
export function addUser(data: any) {
|
||||
return http.post(`${BASE_URL}`, data)
|
||||
}
|
||||
|
||||
/** @desc 修改用户 */
|
||||
export function updateUser(data: any, id: string) {
|
||||
return http.put(`${BASE_URL}/${id}`, data)
|
||||
}
|
||||
|
||||
/** @desc 删除用户 */
|
||||
export function deleteUser(id: string) {
|
||||
return http.del(`${BASE_URL}`, { ids: [id] })
|
||||
}
|
||||
|
||||
/** @desc 导出用户 */
|
||||
export function exportUser(query: T.UserQuery) {
|
||||
return http.download(`${BASE_URL}/export`, query)
|
||||
}
|
||||
|
||||
/** @desc 下载用户导入模板 */
|
||||
export function downloadUserImportTemplate() {
|
||||
return http.download(`${BASE_URL}/import/template`)
|
||||
}
|
||||
|
||||
/** @desc 解析用户导入数据 */
|
||||
export function parseImportUser(data: FormData) {
|
||||
return http.post(`${BASE_URL}/import/parse`, data)
|
||||
}
|
||||
|
||||
/** @desc 导入用户 */
|
||||
export function importUser(data: any) {
|
||||
return http.post(`${BASE_URL}/import`, data)
|
||||
}
|
||||
|
||||
/** @desc 重置密码 */
|
||||
export function resetUserPwd(data: any, id: string) {
|
||||
return http.patch(`${BASE_URL}/${id}/password`, data)
|
||||
}
|
||||
|
||||
/** @desc 分配角色 */
|
||||
export function updateUserRole(data: { roleIds: string[] }, id: string) {
|
||||
return http.patch(`${BASE_URL}/${id}/role`, data)
|
||||
}
|
|
@ -0,0 +1,20 @@
|
|||
@font-face {
|
||||
font-family: 'DINPro-Bold';
|
||||
src: url('./DINPro-Bold.otf');
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'DINPro-Medium';
|
||||
src: url('./DINPro-Medium.otf');
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'DINPro-Regular';
|
||||
src: url('./DINPro-Regular.otf');
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
<svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="butt" stroke-linejoin="miter"><path d="M44 9H4m38 20H6m28-10H14m20 20H14" /></svg>
|
After Width: | Height: | Size: 174 B |
|
@ -0,0 +1 @@
|
|||
<svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="butt" stroke-linejoin="miter"><path d="M44 9H4m36 20H4m21-10H4m21 20H4" /></svg>
|
After Width: | Height: | Size: 172 B |
|
@ -0,0 +1 @@
|
|||
<svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="butt" stroke-linejoin="miter"><path d="M4 9h40M8 29h36M23 19h21M23 39h21" /></svg>
|
After Width: | Height: | Size: 174 B |
|
@ -0,0 +1 @@
|
|||
<svg width="24" height="24" viewBox="0 0 48 48" fill="currentColor"><path fill-rule="evenodd" clip-rule="evenodd" d="M4 15a1 1 0 001 1h2a1 1 0 001-1V8h7a1 1 0 001-1V5a1 1 0 00-1-1H6a2 2 0 00-2 2v9zm4 18a1 1 0 00-1-1H5a1 1 0 00-1 1v9a2 2 0 002 2h9a1 1 0 001-1v-2a1 1 0 00-1-1H8v-7zm35-17a1 1 0 001-1V6a2 2 0 00-2-2h-9a1 1 0 00-1 1v2a1 1 0 001 1h7v7a1 1 0 001 1h2zm1 17a1 1 0 00-1-1h-2a1 1 0 00-1 1v7h-7a1 1 0 00-1 1v2a1 1 0 001 1h9a2 2 0 002-2v-9zM32.835 11h-6.108c-6.512 0-11.882 4.804-12.636 11h-1.992c-.382 0-.52.046-.66.134a.855.855 0 00-.325.378c-.074.162-.114.324-.114.77v1.436c0 .446.04.608.114.77.075.163.185.291.324.378.14.088.279.134.66.134h2.157c1.179 5.706 6.315 10 12.472 10h6.108c.405 0 .552-.041.7-.12a.819.819 0 00.344-.337c.079-.145.121-.29.121-.688V31h.901c.382 0 .52-.046.66-.134a.855.855 0 00.325-.378c.074-.162.114-.324.114-.77v-1.436c0-.446-.04-.608-.114-.77a.855.855 0 00-.325-.378c-.14-.088-.278-.134-.66-.134H34v-7h.901c.382 0 .52-.046.66-.134a.855.855 0 00.325-.378c.074-.162.114-.324.114-.77v-1.436c0-.446-.04-.608-.114-.77a.855.855 0 00-.325-.378c-.14-.088-.278-.134-.66-.134H34v-3.855c0-.398-.042-.543-.121-.688a.819.819 0 00-.344-.338c-.148-.078-.295-.119-.7-.119zm-2.744 3.571h-3.637c-5.02 0-9.09 3.998-9.09 8.929s4.07 8.929 9.09 8.929h3.637V14.57z" fill="currentColor"/></svg>
|
After Width: | Height: | Size: 1.3 KiB |
|
@ -0,0 +1 @@
|
|||
<svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="butt" stroke-linejoin="miter"><path d="M7 7h13v13H7zM28 7h13v13H28zM7 28h13v13H7zM28 28h13v13H28z"/></svg>
|
After Width: | Height: | Size: 198 B |
|
@ -0,0 +1 @@
|
|||
<svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="butt" stroke-linejoin="miter"><rect x="9" y="18" width="30" height="22" rx="1" /><path d="M6 9a1 1 0 011-1h34a1 1 0 011 1v8a1 1 0 01-1 1H7a1 1 0 01-1-1V9zM19 27h10" /></svg>
|
After Width: | Height: | Size: 265 B |
|
@ -0,0 +1,5 @@
|
|||
<svg width="48" height="48" viewBox="0 0 22 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M2.72938 13.2709C1.31587 11.8234 1.31587 9.51246 2.72938 8.06503L7.9367 2.73274C9.39842 1.23594 11.8058 1.23594 13.2675 2.73274C14.681 4.18017 14.681 6.49116 13.2675 7.93859L8.06017 13.2709C6.59845 14.7677 4.19111 14.7677 2.72938 13.2709Z" fill="#12D2AC"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M7.94084 2.7323C9.40256 1.23549 11.8099 1.23549 13.2716 2.7323L18.4789 8.06459C19.8925 9.51202 19.8925 11.823 18.4789 13.2704C17.0172 14.7672 14.6099 14.7672 13.1482 13.2704L7.94084 7.93815C6.52733 6.49071 6.52733 4.17973 7.94084 2.7323Z" fill="#307AF2"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M7.7384 2.93044C9.30781 1.32337 11.8925 1.32337 13.4619 2.93045L15.8075 5.33229L10.6002 10.6646L5.39285 5.33229L7.7384 2.93044Z" fill="#0057FE"/>
|
||||
</svg>
|
After Width: | Height: | Size: 909 B |
|
@ -0,0 +1 @@
|
|||
<svg width="24" height="24" viewBox="0 0 48 48" fill="currentColor"><path fill-rule="evenodd" clip-rule="evenodd" d="M7 4a1 1 0 011 1v35h35a1 1 0 011 1v2a1 1 0 01-1 1H4V5a1 1 0 011-1h2zm35.727 4.633A1 1 0 0143 9.32V36a1 1 0 01-1 1H12a1 1 0 01-1-1V23l11.324-10.38a1 1 0 011.352 0l6.787 6.22 10.85-10.247a1 1 0 011.414.04zM39 16.28l-8.497 8.024L23 17.426l-8 7.334V33h24V16.28z" fill="currentColor"/></svg>
|
After Width: | Height: | Size: 403 B |
|
@ -0,0 +1 @@
|
|||
<svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="butt" stroke-linejoin="miter"><path d="M11.27 27.728l12.728 12.728 12.728-12.728M24 5v34.295" /></svg>
|
After Width: | Height: | Size: 194 B |
|
@ -0,0 +1 @@
|
|||
<svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="butt" stroke-linejoin="miter"><path d="M24.008 41.99a.01.01 0 01-.016 0l-9.978-11.974A.01.01 0 0114.02 30H33.98a.01.01 0 01.007.016l-9.978 11.975z" /><path d="M24 42L14 30h20L24 42z" fill="#4E5969"/><path stroke="#4E5969" stroke-width="2" d="M22 6h4v26h-4z"/><path fill="#4E5969" d="M22 6h4v26h-4z"/></svg>
|
After Width: | Height: | Size: 398 B |
|
@ -0,0 +1 @@
|
|||
<svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="butt" stroke-linejoin="miter"><path d="M20.272 11.27L7.544 23.998l12.728 12.728M43 24H8.705" /></svg>
|
After Width: | Height: | Size: 193 B |
|
@ -0,0 +1 @@
|
|||
<svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="butt" stroke-linejoin="miter"><path d="M27.728 11.27l12.728 12.728-12.728 12.728M5 24h34.295" /></svg>
|
After Width: | Height: | Size: 194 B |
|
@ -0,0 +1 @@
|
|||
<svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="butt" stroke-linejoin="miter"><path d="M23.992 6.01a.01.01 0 01.016 0l9.978 11.974a.01.01 0 01-.007.016H14.02a.01.01 0 01-.007-.016l9.978-11.975z" /><path d="M24 6l10 12H14L24 6z" fill="#4E5969"/><path stroke="#4E5969" stroke-width="2" d="M26 42h-4V16h4z"/><path fill="#4E5969" d="M26 42h-4V16h4z"/></svg>
|
After Width: | Height: | Size: 397 B |
|
@ -0,0 +1 @@
|
|||
<svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="butt" stroke-linejoin="miter"><path d="M11.27 20.272L23.998 7.544l12.728 12.728M24 43V8.705" /></svg>
|
After Width: | Height: | Size: 193 B |
|
@ -0,0 +1 @@
|
|||
<svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="butt" stroke-linejoin="miter"><path d="M31 23a7 7 0 11-14 0 7 7 0 0114 0zm0 0c0 3.038 2.462 6.5 5.5 6.5A5.5 5.5 0 0042 24c0-9.941-8.059-18-18-18S6 14.059 6 24s8.059 18 18 18c4.244 0 8.145-1.469 11.222-3.925" /></svg>
|
After Width: | Height: | Size: 308 B |
|
@ -0,0 +1 @@
|
|||
<svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="butt" stroke-linejoin="miter"><path d="M29.037 15.236s-9.174 9.267-11.48 11.594c-2.305 2.327-1.646 4.987-.329 6.316 1.317 1.33 3.994 1.953 6.258-.332L37.32 18.851c3.623-3.657 2.092-8.492 0-10.639-2.093-2.147-6.916-3.657-10.54 0L11.3 23.838c-3.623 3.657-3.953 10.638.329 14.96 4.282 4.322 11.115 4.105 14.821.333 3.706-3.773 8.74-8.822 11.224-11.33" /></svg>
|
After Width: | Height: | Size: 449 B |
|
@ -0,0 +1 @@
|
|||
<svg t="1658914025483" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3426" width="200" height="200"><path d="M390 679.988v-35.864c0-111.8-70.278-134.488-70.278-134.488S250 534.068 250 644.126v35.864h140z" fill="#4988FD" p-id="3427"></path><path d="M390 699.988h-140c-11.046 0-20-8.956-20-20v-35.864c0-122.828 79.714-152.174 83.108-153.364a20.012 20.012 0 0 1 12.758-0.158c3.434 1.11 84.132 28.598 84.132 153.522v35.864c0.002 11.046-8.952 20-19.998 20z m-120-40h100v-15.864c0-76.286-35.178-104.09-49.982-112.408-14.948 8.808-50.018 37.46-50.018 112.41v15.862z" fill="#4988FD" p-id="3428"></path><path d="M776 679.988v-35.864c0-111.8-70.278-134.488-70.278-134.488S636 534.068 636 644.126v35.864h140z" fill="#4988FD" p-id="3429"></path><path d="M776 699.988h-140c-11.044 0-20-8.956-20-20v-35.864c0-122.828 79.714-152.174 83.11-153.364a20.026 20.026 0 0 1 12.758-0.158c3.436 1.11 84.132 28.598 84.132 153.522v35.864c0 11.046-8.956 20-20 20z m-120-40h100v-15.864c0-76.286-35.178-104.09-49.982-112.408-14.948 8.808-50.018 37.46-50.018 112.41v15.862z" fill="#4988FD" p-id="3430"></path><path d="M693.146 651.988v-92.516c0-288.398-181.292-346.924-181.292-346.924S332 275.57 332 559.476c0.012 56.328 0 92.514 0 92.514l361.146-0.002z" fill="#4988FD" p-id="3431"></path><path d="M332 671.99a19.996 19.996 0 0 1-20-20.006c0-0.004 0.012-36.184 0-92.504 0-152.884 51.604-243.788 94.894-293.124 47.876-54.564 96.308-71.968 98.346-72.684a20.012 20.012 0 0 1 12.758-0.158c2.06 0.666 51.034 16.918 99.41 71.014 43.676 48.838 95.738 139.654 95.738 294.944v92.516c0 11.044-8.956 20-20 20L332 671.99z m180.098-437.812c-13.256 6.236-45.196 23.814-76.73 60.39C380.828 357.83 352 449.434 352 559.476c0.006 31.314 0.006 56.404 0.004 72.514l321.142-0.002v-72.516c0-111.762-29.016-203.89-83.91-266.424-31.678-36.086-63.762-52.93-77.138-58.87z" fill="#4988FD" p-id="3432"></path><path d="M497.858 864.994l-42.426-42.426c-31.244-31.244-31.244-81.894 0-113.138 31.242-31.242 81.894-31.242 113.136 0 31.242 31.24 31.244 81.894 0 113.138l-42.426 42.426c-7.81 7.81-20.474 7.81-28.284 0z" fill="#DFECFD" p-id="3433"></path><path d="M512 870.852a19.868 19.868 0 0 1-14.142-5.86l-42.426-42.424c-15.11-15.11-23.432-35.2-23.432-56.57s8.322-41.46 23.432-56.568S490.632 686 512 685.996c21.37 0.002 41.46 8.324 56.568 23.434S592 744.63 592 766s-8.322 41.46-23.432 56.57l-42.428 42.428a19.864 19.864 0 0 1-14.14 5.856zM512 688c-20.832-0.002-40.42 8.112-55.154 22.844S434 745.164 434 766c0 20.834 8.112 40.422 22.846 55.156l42.426 42.426a17.88 17.88 0 0 0 12.728 5.272 17.88 17.88 0 0 0 12.726-5.27l42.428-42.428c14.732-14.732 22.846-34.32 22.846-55.156 0-20.834-8.114-40.42-22.846-55.154S532.834 688 512 688z" fill="#DFECFD" p-id="3434"></path><path d="M312.576 803.972l-22.274-22.274c-16.402-16.402-16.402-42.996 0-59.398 16.4-16.4 42.994-16.4 59.396 0 16.402 16.402 16.404 42.996 0 59.398l-22.272 22.274a10.5 10.5 0 0 1-14.85 0z" fill="#DFECFD" p-id="3435"></path><path d="M320 806.896a10.784 10.784 0 0 1-7.68-3.18l-22.02-22.02c-16.374-16.374-16.374-43.02 0-59.396A41.728 41.728 0 0 1 320 710c11.22 0 21.764 4.366 29.7 12.3 16.374 16.376 16.374 43.022 0 59.398l-22.02 22.02a10.784 10.784 0 0 1-7.68 3.178zM320 712a39.744 39.744 0 0 0-28.284 11.714c-15.596 15.596-15.596 40.974 0 56.57l22.02 22.02c1.674 1.674 3.898 2.594 6.264 2.592s4.59-0.92 6.264-2.594l22.02-22.02c15.596-15.594 15.596-40.972 0-56.568A39.744 39.744 0 0 0 320 712z" fill="#DFECFD" p-id="3436"></path><path d="M698.576 803.972l-22.274-22.274c-16.4-16.4-16.4-42.994 0-59.398 16.4-16.4 42.994-16.4 59.396 0 16.402 16.402 16.4 42.996 0 59.398l-22.274 22.274a10.498 10.498 0 0 1-14.848 0z" fill="#DFECFD" p-id="3437"></path><path d="M706 806.896a10.784 10.784 0 0 1-7.68-3.18l-22.02-22.02c-16.37-16.374-16.37-43.02 0-59.396 7.936-7.934 18.482-12.3 29.7-12.3s21.764 4.366 29.7 12.3c16.374 16.376 16.372 43.02 0 59.398l-22.02 22.02a10.784 10.784 0 0 1-7.68 3.178zM706 712a39.736 39.736 0 0 0-28.284 11.714c-15.594 15.596-15.594 40.974 0 56.57l22.02 22.02c1.672 1.672 3.896 2.592 6.264 2.592s4.592-0.92 6.264-2.594l22.02-22.02c15.596-15.594 15.594-40.972 0-56.568A39.736 39.736 0 0 0 706 712z" fill="#DFECFD" p-id="3438"></path><path d="M512 352c22.092 0 40 17.908 40 40v80c0 22.092-17.908 40-40 40s-40-17.908-40-40v-80c0-22.092 17.908-40 40-40z" fill="#DFECFD" p-id="3439"></path><path d="M512 512c-22.056 0-40-17.944-40-40v-80c0-22.056 17.944-40 40-40s40 17.944 40 40v80c0 22.056-17.944 40-40 40z m0-158c-20.954 0-38 17.046-38 38v80c0 20.954 17.046 38 38 38s38-17.046 38-38v-80c0-20.954-17.046-38-38-38z" fill="#DFECFD" p-id="3440"></path></svg>
|
After Width: | Height: | Size: 4.5 KiB |
|
@ -0,0 +1 @@
|
|||
<svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="butt" stroke-linejoin="miter"><path d="M38.293 36.293L26.707 24.707a1 1 0 010-1.414l11.586-11.586c.63-.63 1.707-.184 1.707.707v23.172c0 .89-1.077 1.337-1.707.707zM21 12.414v23.172c0 .89-1.077 1.337-1.707.707L7.707 24.707a1 1 0 010-1.414l11.586-11.586c.63-.63 1.707-.184 1.707.707z" /></svg>
|
After Width: | Height: | Size: 382 B |
|
@ -0,0 +1 @@
|
|||
<svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="butt" stroke-linejoin="miter"><path d="M19 5.25L22.75 9m0 0l12.043 12.043a1 1 0 010 1.414L32 25.25 21.221 36.029a1 1 0 01-1.428-.014L9.443 25.25l-.763-.793a1 1 0 01.013-1.4L22.75 9zM6 42h36" /><path d="M11.791 25.25c-.881 0-1.332 1.058-.72 1.693l8.722 9.072a1 1 0 001.428.014L32 25.25H11.791z" fill="#4E5969" /><path fill-rule="evenodd" clip-rule="evenodd" d="M40.013 29.812L37.201 27l-2.812 2.812a4 4 0 105.624 0z" fill="#4E5969"/></svg>
|
After Width: | Height: | Size: 530 B |
|
@ -0,0 +1 @@
|
|||
<svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="butt" stroke-linejoin="miter"><path d="M13 24h12a8 8 0 100-16H13.2a.2.2 0 00-.2.2V24zm0 0h16a8 8 0 110 16H13.2a.2.2 0 01-.2-.2V24z" /></svg>
|
After Width: | Height: | Size: 232 B |
|
@ -0,0 +1 @@
|
|||
<svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="butt" stroke-linejoin="miter"><path d="M24 13L7 7v28l17 6 17-6V7l-17 6zm0 0v27.5M19 18l-7-2.5M19 25l-7-2.5M19 32l-7-2.5M29 18l7-2.5M29 25l7-2.5M29 32l7-2.5" stroke="#4E5969" stroke-width="2" stroke-linejoin="round"/></svg>
|
After Width: | Height: | Size: 314 B |
|
@ -0,0 +1 @@
|
|||
<svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="butt" stroke-linejoin="miter"><path d="M16 16h16M16 24h8" /><path d="M24 41H8V6h32v17" /><path d="M30 29h11v13l-5.5-3.5L30 42V29Z" /></svg>
|
After Width: | Height: | Size: 231 B |
|
@ -0,0 +1 @@
|
|||
<svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="butt" stroke-linejoin="miter"><path d="M19 10a4 4 0 11-8 0 4 4 0 018 0zM38 10a4 4 0 11-8 0 4 4 0 018 0zM19 38a4 4 0 11-8 0 4 4 0 018 0zM15 15v15m0 3.5V30m0 0c0-5 19-7 19-15" /></svg>
|
After Width: | Height: | Size: 274 B |
|
@ -0,0 +1 @@
|
|||
<svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="butt" stroke-linejoin="miter"><path d="M33 13h7a1 1 0 011 1v12.14a1 1 0 01-.85.99l-21.3 3.24a1 1 0 00-.85.99V43" /><path d="M7 18V8c0-.552.444-1 .997-1H32.01c.552 0 .99.447.99 1v10.002A.998.998 0 0132 19H8a1 1 0 01-1-1z" /></svg>
|
After Width: | Height: | Size: 321 B |
|
@ -0,0 +1 @@
|
|||
<svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="butt" stroke-linejoin="miter"><path d="M35 27h8M5 27h8m0-9h22v13c0 6.075-4.925 11-11 11s-11-4.925-11-11V18z" stroke="#4E5969" stroke-width="2" stroke-linejoin="round"/><path d="M7 42v-.5a6.5 6.5 0 016.5-6.5M7 42v-.5M41 42v-.5a6.5 6.5 0 00-6.5-6.5M13 18h22M7 14a4 4 0 004 4h26a4 4 0 004-4M24 42V23M17 14a7 7 0 1114 0" stroke="#4E5969" stroke-width="2" stroke-linejoin="round"/></svg>
|
After Width: | Height: | Size: 474 B |
|
@ -0,0 +1 @@
|
|||
<svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="butt" stroke-linejoin="miter"><path d="M30.8 32.465c.585-2.576 2.231-4.75 3.77-6.897A12.94 12.94 0 0037 18c0-7.18-5.82-13-13-13s-13 5.82-13 13c0 2.823.9 5.437 2.43 7.568 1.539 2.147 3.185 4.32 3.77 6.897l.623 2.756A1 1 0 0018.8 36H29.2a1 1 0 00.976-.779l.624-2.756zM17 42h14" /></svg>
|
After Width: | Height: | Size: 376 B |
|
@ -0,0 +1 @@
|
|||
<svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="butt" stroke-linejoin="miter"><path d="M7 22h34M8 41h32a1 1 0 001-1V10a1 1 0 00-1-1H8a1 1 0 00-1 1v30a1 1 0 001 1zM34 5v8M14 5v8" /></svg>
|
After Width: | Height: | Size: 230 B |
|
@ -0,0 +1 @@
|
|||
<svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="butt" stroke-linejoin="miter"><path d="M7 22h34V10a1 1 0 00-1-1H8a1 1 0 00-1 1v30a1 1 0 001 1h18M34 5v8M14 5v8" /><path fill-rule="evenodd" clip-rule="evenodd" d="M36 44a9 9 0 100-18 9 9 0 000 18zm1.5-9.75V29h-3v8.25H42v-3h-4.5z" fill="#4E5969"/></svg>
|
After Width: | Height: | Size: 344 B |