refactor: 根据发展需要,拆分前端项目 continew-admin-ui 到独立仓库
https://gitee.com/Charles7c/continew-admin-ui
| @@ -42,5 +42,5 @@ | ||||
|  | ||||
| <!-- 在提交 issue 之前,请确保执行过以下操作。 --> | ||||
|  | ||||
| - [ ] 阅读[文档](https://doc.charles7c.top/faq.html) | ||||
| - [ ] 阅读[文档](https://doc.charles7c.top/admin/other/faq.html) | ||||
| - [ ] 搜索是否有其他人提交过类似的 issue,如果对应 issue 尚未解决,您可以先订阅关注该 issue(为了方便后来者查找问题解决方法,请尽量避免创建重复的 issue) | ||||
							
								
								
									
										2
									
								
								.github/ISSUE_TEMPLATE/bug_report.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -49,7 +49,7 @@ body: | ||||
|       label: 确认 | ||||
|       description: 在提交 issue 之前,请确保执行过以下操作。 | ||||
|       options: | ||||
|         - label: 阅读[文档](https://doc.charles7c.top/faq.html) | ||||
|         - label: 阅读[文档](https://doc.charles7c.top/admin/other/faq.html) | ||||
|           required: true | ||||
|         - label: 根据报错信息百度或 Google 一下 | ||||
|           required: true | ||||
|   | ||||
							
								
								
									
										2
									
								
								.github/ISSUE_TEMPLATE/feature_request.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -36,7 +36,7 @@ body: | ||||
|       label: 确认 | ||||
|       description: 在提交 issue 之前,请确保执行过以下操作。 | ||||
|       options: | ||||
|         - label: 阅读[文档](https://doc.charles7c.top/faq.html) | ||||
|         - label: 阅读[文档](https://doc.charles7c.top/admin/intro/require.html) | ||||
|           required: true | ||||
|         - label: 搜索是否有其他人提交过类似的 issue,如果对应 issue 尚未解决,您可以先订阅关注该 issue(为了方便后来者查找问题解决方法,请尽量避免创建重复的 issue) | ||||
|           required: true | ||||
							
								
								
									
										51
									
								
								.github/workflows/deploy.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -8,7 +8,6 @@ on: | ||||
|   workflow_dispatch: | ||||
|  | ||||
| jobs: | ||||
|   # 部署后端服务 | ||||
|   deploy-server: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
| @@ -47,53 +46,3 @@ jobs: | ||||
|             cd /docker | ||||
|             docker-compose up --force-recreate --build -d continew-admin-server | ||||
|             docker images | grep none | awk '{print $3}' | xargs docker rmi | ||||
|  | ||||
|   # 部署前端 | ||||
|   deploy-web: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       # 1、检出源码 | ||||
|       - name: Checkout | ||||
|         uses: actions/checkout@master | ||||
|       # 2、安装 PNPM | ||||
|       - name: Setup PNPM | ||||
|         uses: pnpm/action-setup@v2 | ||||
|         with: | ||||
|           version: latest | ||||
|       # 3、安装 Node 环境 | ||||
|       - name: Setup Node | ||||
|         uses: actions/setup-node@v3 | ||||
|         with: | ||||
|           node-version: 16 | ||||
|           cache: pnpm | ||||
|           cache-dependency-path: ./continew-admin-ui/pnpm-lock.yaml | ||||
|       # 4、安装依赖 | ||||
|       - name: Install Dependencies | ||||
|         run: pnpm i --frozen-lockfile | ||||
|         working-directory: ./continew-admin-ui | ||||
|       # 5、打包 | ||||
|       - name: Build | ||||
|         run: pnpm build | ||||
|         working-directory: ./continew-admin-ui | ||||
|       # 6、拷贝到服务器 | ||||
|       - name: Copy | ||||
|         uses: garygrossgarten/github-action-scp@release | ||||
|         with: | ||||
|           host: ${{ secrets.SERVER_HOST }} | ||||
|           port: ${{ secrets.SERVER_PORT }} | ||||
|           username: ${{ secrets.SERVER_USERNAME }} | ||||
|           password: ${{ secrets.SERVER_PASSWORD }} | ||||
|           local: ./continew-admin-ui/dist | ||||
|           remote: /docker/continew-admin/tmp | ||||
|       # 7、重启 Nginx | ||||
|       - name: Restart | ||||
|         uses: appleboy/ssh-action@master | ||||
|         with: | ||||
|           host: ${{ secrets.SERVER_HOST }} | ||||
|           port: ${{ secrets.SERVER_PORT }} | ||||
|           username: ${{ secrets.SERVER_USERNAME }} | ||||
|           password: ${{ secrets.SERVER_PASSWORD }} | ||||
|           script: | | ||||
|             rm -rf /docker/continew-admin/html/* | ||||
|             mv /docker/continew-admin/tmp/* /docker/continew-admin/html | ||||
|             docker restart nginx | ||||
							
								
								
									
										108
									
								
								README.md
									
									
									
									
									
								
							
							
						
						| @@ -36,10 +36,10 @@ ContiNew Admin (Continue New Admin)中后台管理框架/脚手架,持续 | ||||
|  | ||||
| ## 项目源码 | ||||
|  | ||||
| | 开源平台      | 源码地址                                    | | ||||
| | ------------- | ------------------------------------------- | | ||||
| | GitHub        | https://github.com/Charles7c/continew-admin | | ||||
| | Gitee(码云) | https://gitee.com/Charles7c/continew-admin  | | ||||
| | 开源平台      | 后端源码地址                                | 前端源码地址                                   | | ||||
| | ------------- | ------------------------------------------- | ---------------------------------------------- | | ||||
| | GitHub        | https://github.com/Charles7c/continew-admin | https://github.com/Charles7c/continew-admin-ui | | ||||
| | Gitee(码云) | https://gitee.com/Charles7c/continew-admin  | https://gitee.com/Charles7c/continew-admin-ui  | | ||||
|  | ||||
| ## 主要特性 | ||||
|  | ||||
| @@ -156,8 +156,6 @@ ContiNew Admin (Continue New Admin)中后台管理框架/脚手架,持续 | ||||
| > **Note** | ||||
| > 更详细的流程,请查看在线文档[《快速开始》](https://doc.charles7c.top/admin/intro/quick-start.html)。 | ||||
|  | ||||
| ### 后端 | ||||
|  | ||||
| ```bash | ||||
| # 1.克隆本项目 | ||||
| git clone https://github.com/Charles7c/continew-admin.git | ||||
| @@ -181,43 +179,10 @@ git clone https://github.com/Charles7c/continew-admin.git | ||||
| # 5.2 其他方式部署 | ||||
| ``` | ||||
|  | ||||
| ### 前端 | ||||
|  | ||||
| ```bash | ||||
| # 1.克隆本项目 | ||||
| git clone https://github.com/Charles7c/continew-admin.git | ||||
|  | ||||
| # 2.在 IDE(Visual Studio Code/WebStorm)中打开前端项目 continew-admin-ui | ||||
|  | ||||
| # 3.安装 pnpm,配置淘宝源 | ||||
| npm install -g pnpm | ||||
| pnpm config set registry https://registry.npm.taobao.org | ||||
|  | ||||
| # 4.安装依赖 | ||||
| pnpm i | ||||
|  | ||||
| # 5.启动程序 | ||||
| # 5.1 启动成功:访问 http://localhost:5173/ | ||||
| pnpm dev | ||||
|  | ||||
| # 6.部署 | ||||
| # 6.1 Docker 部署 | ||||
| #   6.1.1 服务器安装好 docker 及 docker-compose(参考:https://blog.charles7c.top/categories/fragments/2022/10/31/CentOS%E5%AE%89%E8%A3%85Docker) | ||||
| #   6.1.2 执行 pnpm build 进行项目打包,将 dist 目录下的所有文件放到 /docker/continew-admin/html 目录下 | ||||
| #   6.1.3 将 docker 目录上传到服务器 / 目录下,并授权(chmod -R 777 /docker) | ||||
| #   6.1.4 修改 docker-compose.yml 中的 MySQL 配置、Redis 配置、continew-admin-server 配置、Nginx 配置 | ||||
| #   6.1.5 执行 docker-compose up -d 创建并后台运行所有容器 | ||||
| # 6.2 其他方式部署 | ||||
| ``` | ||||
|  | ||||
| ## 核心技术栈 | ||||
|  | ||||
| | 名称                                                         | 版本         | 简介                                                         | | ||||
| | :----------------------------------------------------------- | :----------- | :----------------------------------------------------------- | | ||||
| | <a href="https://cn.vuejs.org/" target="_blank">Vue</a>      | 3.3.7        | 渐进式 JavaScript 框架,易学易用,性能出色,适用场景丰富的 Web 前端框架。 | | ||||
| | <a href="https://arco.design/vue/docs/start" target="_blank">Arco Design</a> | 2.53.3       | 字节跳动推出的前端 UI 框架,年轻化的色彩和组件设计。         | | ||||
| | <a href="https://www.typescriptlang.org/zh/" target="_blank">TypeScript</a> | 5.3.3        | TypeScript 是微软开发的一个开源的编程语言,通过在 JavaScript 的基础上添加静态类型定义构建而成。 | | ||||
| | <a href="https://cn.vitejs.dev/" target="_blank">Vite</a>    | 4.5.1        | 下一代的前端工具链,为开发提供极速响应。                     | | ||||
| | [ContiNew Starter](https://github.com/Charles7c/continew-starter) | 1.1.0        | ContiNew Starter(Continue New Starter)是一种特殊类型的 Spring Boot Starter,其作用与常规的 Starter 类似,基于“约定优于配置”的理念,再次精简常规配置,提供一个更为完整的配置解决方案,帮助开发人员更加快速的集成常用第三方库或工具到 Spring Boot Web 应用程序中。 | | ||||
| | <a href="https://spring.io/projects/spring-boot" target="_blank">Spring Boot</a> | 3.1.7        | 简化 Spring 应用的初始搭建和开发过程,基于“约定优于配置”的理念,使开发人员不再需要定义样板化的配置。(Spring Boot 3.0 开始,要求 Java 17 作为最低版本) | | ||||
| | <a href="https://undertow.io/" target="_blank">Undertow</a>  | 2.3.10.Final | 采用 Java 开发的灵活的高性能 Web 服务器,提供包括阻塞和基于 NIO 的非堵塞机制。 | | ||||
| @@ -231,9 +196,11 @@ pnpm dev | ||||
| | <a href="https://github.com/liquibase/liquibase" target="_blank">Liquibase</a> | 4.20.0       | 用于管理数据库版本,跟踪、管理和应用数据库变化。             | | ||||
| | <a href="https://github.com/redisson/redisson/wiki/Redisson%E9%A1%B9%E7%9B%AE%E4%BB%8B%E7%BB%8D" target="_blank">Redisson</a> | 3.25.2       | 不仅仅是一个 Redis Java 客户端,Redisson 充分的利用了 Redis 键值数据库提供的一系列优势,为使用者提供了一系列具有分布式特性的常用工具:分布式锁、限流器等。 | | ||||
| | <a href="https://redis.io/" target="_blank">Redis</a>        | 7.2.3        | 高性能的 key-value 数据库。                                  | | ||||
| | [X File Storage](https://x-file-storage.xuyanwu.cn/#/)       | 2.0.0        | 一行代码将文件存储到本地、FTP、SFTP、WebDAV、阿里云 OSS、华为云 OBS...等其它兼容 S3 协议的存储平台。 | | ||||
| | <a href="https://sms4j.com/" target="_blank">SMS4J</a>       | 3.0.4        | 短信聚合框架,轻松集成多家短信服务,解决接入多个短信 SDK 的繁琐流程。 | | ||||
| | <a href="https://justauth.cn/" target="_blank">Just Auth</a> | 1.16.6       | 开箱即用的整合第三方登录的开源组件,脱离繁琐的第三方登录 SDK,让登录变得 So easy! | | ||||
| | <a href="https://easyexcel.opensource.alibaba.com/" target="_blank">Easy Excel</a> | 3.3.3        | 一个基于 Java 的、快速、简洁、解决大文件内存溢出的 Excel 处理工具。 | | ||||
| | [AJ-Captcha](https://ajcaptcha.beliefteam.cn/captcha-doc/)   | 1.3.0        | Java 行为验证码,包含滑动拼图、文字点选两种方式,UI支持弹出和嵌入两种方式。 | | ||||
| | Easy Captcha                                                 | 1.6.2        | Java 图形验证码,支持 gif、中文、算术等类型,可用于 Java Web、JavaSE 等项目。 | | ||||
| | <a href="https://doc.xiaominfo.com/" target="_blank">Knife4j</a> | 4.4.0        | 前身是 swagger-bootstrap-ui,集 Swagger2 和 OpenAPI3 为一体的增强解决方案。 | | ||||
| | <a href="https://www.hutool.cn/" target="_blank">Hutool</a>  | 5.8.24       | 小而全的 Java 工具类库,通过静态方法封装,降低相关 API 的学习成本,提高工作效率,使 Java 拥有函数式语言般的优雅,让 Java 语言也可以“甜甜的”。 | | ||||
| @@ -241,8 +208,6 @@ pnpm dev | ||||
|  | ||||
| ## 项目结构 | ||||
|  | ||||
| ### 后端 | ||||
|  | ||||
| 采用按功能拆分模块的开发方式,项目目录结构如下: | ||||
|  | ||||
| > **Note** | ||||
| @@ -379,66 +344,6 @@ continew-admin  # 全局通用项目配置及依赖版本管理 | ||||
|   │                    └─ holder        # 公共 Holder(持有者) | ||||
| ``` | ||||
|  | ||||
| ### 前端 | ||||
|  | ||||
| ```bash | ||||
| continew-admin | ||||
|   └─ continew-admin-ui      # 前端项目 | ||||
|     ├─ config               # 全局 Vite 配置 | ||||
|     ├─ public               # 公共静态资源(favicon.ico、logo.svg) | ||||
|     ├─ src | ||||
|     │  ├─ api               # 请求接口 | ||||
|     │  │  ├─ demo             # 示例模块 | ||||
|     │  │  ├─ auth             # 认证模块 | ||||
|     │  │  ├─ common           # 公共模块 | ||||
|     │  │  ├─ monitor          # 系统监控模块 | ||||
|     │  │  ├─ system           # 系统管理模块 | ||||
|     │  │  └─ tool             # 系统工具模块 | ||||
|     │  ├─ assets            # 静态资源 | ||||
|     │  │  ├─ icons            # 图标资源 | ||||
|     │  │  ├─ images           # 图片资源 | ||||
|     │  │  └─ style            # 样式资源 | ||||
|     │  ├─ components        # 通用业务组件 | ||||
|     │  ├─ config            # 全局配置(包含 echarts 主题) | ||||
|     │  │  └─ settings.json    # 配置文件 | ||||
|     │  ├─ directives        # 指令集(如需,可自行补充) | ||||
|     │  ├─ hooks             # 全局 hooks | ||||
|     │  ├─ layout            # 布局 | ||||
|     │  ├─ locale            # 国际化语言包 | ||||
|     │  ├─ mock              # 模拟数据 | ||||
|     │  ├─ router            # 路由配置 | ||||
|     │  ├─ store             # 状态管理中心 | ||||
|     │  ├─ types             # TypeScript 类型 | ||||
|     │  ├─ utils             # 工具库(mock 全局开启/关闭) | ||||
|     │  ├─ views             # 页面模板 | ||||
|     │  │  ├─ demo             # Arco Design 相关示例模块 | ||||
|     │  │  ├─ dashboard        # 仪表盘模块 | ||||
|     │  │  ├─ login            # 登录模块 | ||||
|     │  │  ├─ monitor          # 系统监控模块 | ||||
|     │  │  │  ├─ log              # 日志管理 | ||||
|     │  │  │  │  ├─ login            # 登录日志 | ||||
|     │  │  │  │  ├─ operation        # 操作日志 | ||||
|     │  │  │  │  └─ system           # 系统日志 | ||||
|     │  │  │  └─ online           # 在线用户 | ||||
|     │  │  └─ system           # 系统管理模块 | ||||
|     │  │    ├─ announcement     # 公告管理 | ||||
|     │  │    ├─ config           # 系统配置 | ||||
|     │  │    ├─ dept             # 部门管理 | ||||
|     │  │    ├─ dict             # 字典管理 | ||||
|     │  │    ├─ menu             # 菜单管理 | ||||
|     │  │    ├─ message          # 消息管理 | ||||
|     │  │    ├─ role             # 角色管理 | ||||
|     │  │    └─ user             # 用户模块 | ||||
|     │  │      └─ center           # 个人中心 | ||||
|     │  ├─ App.vue | ||||
|     │  └─ main.ts           # 入口文件 | ||||
|     ├─ .env.development | ||||
|     ├─ .env.production | ||||
|     ├─ index.html | ||||
|     ├─ package.json | ||||
|     └─ tsconfig.json | ||||
| ``` | ||||
|  | ||||
| ## 贡献指南 | ||||
|  | ||||
| ContiNew Admin 致力于持续以最新流行技术栈构建,拥抱变化,迭代优化。作为一个开源项目,Creator 的初心是希望 ContiNew Admin 依托开源协作模式,提升技术透明度、放大集体智慧、共创优秀实践,源源不断地为企业级项目开发提供助力。 | ||||
| @@ -506,7 +411,6 @@ ContiNew Admin 的分支目前分为下个大版本的开发分支和上个大 | ||||
| ### 特别鸣谢 | ||||
|  | ||||
| - 感谢 <a href="https://www.jetbrains.com/" target="_blank">JetBrains</a> 提供的 <a href="https://www.jetbrains.com/shop/eform/opensource" target="_blank">非商业开源软件开发授权</a>  | ||||
| - 感谢 <a href="http://pro.arco.design/" target="_blank">Arco Design Pro</a> 开箱即用的中后台前端解决方案 | ||||
| - 感谢 <a href="https://github.com/baomidou/mybatis-plus" target="_blank">MyBatis Plus</a>、<a href="https://github.com/dromara/sa-token" target="_blank">Sa-Token</a> 、<a href="https://github.com/alibaba/easyexcel" target="_blank">Easy Excel</a>、<a href="https://github.com/xiaoymin/knife4j" target="_blank">Knife4j</a>、<a href="https://github.com/dromara/hutool" target="_blank">Hutool</a> 等国产开源组件作者为国内开源世界作出的贡献 | ||||
| - 感谢项目使用或未使用到的每一款开源组件,致敬各位开源先驱 :fire: | ||||
|  | ||||
|   | ||||
| @@ -83,7 +83,7 @@ public class GenConfigDO implements Serializable { | ||||
|     /** | ||||
|      * 前端路径 | ||||
|      */ | ||||
|     @Schema(description = "前端路径", example = "D:/continew-admin/continew-admin-ui/src/views/system/user") | ||||
|     @Schema(description = "前端路径", example = "D:/continew-admin-ui/src/views/system/user") | ||||
|     @Length(max = 255, message = "前端路径不能超过 {max} 个字符") | ||||
|     private String frontendPath; | ||||
|  | ||||
|   | ||||
| @@ -307,10 +307,10 @@ public class GeneratorServiceImpl implements GeneratorService { | ||||
|             String apiModuleName = | ||||
|                 StrUtil.subSuf(packageName, StrUtil.lastIndexOfIgnoreCase(packageName, StringConstants.DOT) + 1); | ||||
|             GeneratePreviewResp apiCodePreview = frontendCodePreviewList.get(0); | ||||
|             // 例如:D:/continew-admin/continew-admin-ui | ||||
|             // 例如:D:/continew-admin-ui | ||||
|             List<String> frontendSubPathList = StrUtil.split(frontendPath, "src"); | ||||
|             String frontendModulePath = frontendSubPathList.get(0); | ||||
|             // 例如:D:/continew-admin/continew-admin-ui/src/api/tool/xxx.ts | ||||
|             // 例如:D:/continew-admin-ui/src/api/tool/xxx.ts | ||||
|             File apiParentFile = FileUtil.file(frontendModulePath, "src", "api", apiModuleName); | ||||
|             File apiFile = new File(apiParentFile, apiCodePreview.getFileName()); | ||||
|             if (apiFile.exists() && !isOverride) { | ||||
| @@ -319,7 +319,7 @@ public class GeneratorServiceImpl implements GeneratorService { | ||||
|             FileUtil.writeString(apiCodePreview.getContent(), apiFile, StandardCharsets.UTF_8); | ||||
|             // 2.生成 view 代码 | ||||
|             GeneratePreviewResp viewCodePreview = frontendCodePreviewList.get(1); | ||||
|             // 例如:D:/continew-admin/continew-admin-ui/src/views/tool/xxx/index.vue | ||||
|             // 例如:D:/continew-admin-ui/src/views/tool/xxx/index.vue | ||||
|             File indexFile = | ||||
|                 FileUtil.file(frontendPath, apiModuleName, StrUtil.lowerFirst(classNamePrefix), "index.vue"); | ||||
|             if (indexFile.exists() && !isOverride) { | ||||
|   | ||||
| @@ -1 +0,0 @@ | ||||
| VITE_API_BASE_URL= 'http://localhost:8000' | ||||
| @@ -1 +0,0 @@ | ||||
| VITE_API_BASE_URL= 'https://api.charles7c.top' | ||||
| @@ -1,3 +0,0 @@ | ||||
| /*.json | ||||
| /*.js | ||||
| dist | ||||
| @@ -1,72 +0,0 @@ | ||||
| // eslint-disable-next-line @typescript-eslint/no-var-requires | ||||
| const path = require('path'); | ||||
|  | ||||
| module.exports = { | ||||
|   root: true, | ||||
|   parser: 'vue-eslint-parser', | ||||
|   parserOptions: { | ||||
|     // Parser that checks the content of the <script> tag | ||||
|     parser: '@typescript-eslint/parser', | ||||
|     sourceType: 'module', | ||||
|     ecmaVersion: 2020, | ||||
|     ecmaFeatures: { | ||||
|       jsx: true, | ||||
|     }, | ||||
|   }, | ||||
|   env: { | ||||
|     'browser': true, | ||||
|     'node': true, | ||||
|     'vue/setup-compiler-macros': true, | ||||
|   }, | ||||
|   plugins: ['@typescript-eslint'], | ||||
|   extends: [ | ||||
|     // Airbnb JavaScript Style Guide https://github.com/airbnb/javascript | ||||
|     'airbnb-base', | ||||
|     'plugin:@typescript-eslint/recommended', | ||||
|     'plugin:import/recommended', | ||||
|     'plugin:import/typescript', | ||||
|     'plugin:vue/vue3-recommended', | ||||
|     'plugin:prettier/recommended', | ||||
|   ], | ||||
|   settings: { | ||||
|     'import/resolver': { | ||||
|       typescript: { | ||||
|         project: path.resolve(__dirname, './tsconfig.json'), | ||||
|       }, | ||||
|     }, | ||||
|   }, | ||||
|   rules: { | ||||
|     'import/prefer-default-export': 'off', | ||||
|     'prettier/prettier': 1, | ||||
|     // Vue: Recommended rules to be closed or modify | ||||
|     'vue/require-default-prop': 0, | ||||
|     'vue/singleline-html-element-content-newline': 0, | ||||
|     'vue/max-attributes-per-line': 0, | ||||
|     // Vue: Add extra rules | ||||
|     'vue/custom-event-name-casing': [2, 'camelCase'], | ||||
|     'vue/no-v-text': 1, | ||||
|     'vue/padding-line-between-blocks': 1, | ||||
|     'vue/require-direct-export': 1, | ||||
|     'vue/multi-word-component-names': 0, | ||||
|     // Allow @ts-ignore comment | ||||
|     '@typescript-eslint/ban-ts-comment': 0, | ||||
|     '@typescript-eslint/no-unused-vars': 1, | ||||
|     '@typescript-eslint/no-empty-function': 1, | ||||
|     '@typescript-eslint/no-explicit-any': 0, | ||||
|     'import/extensions': [ | ||||
|       2, | ||||
|       'ignorePackages', | ||||
|       { | ||||
|         js: 'never', | ||||
|         jsx: 'never', | ||||
|         ts: 'never', | ||||
|         tsx: 'never', | ||||
|       }, | ||||
|     ], | ||||
|     'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0, | ||||
|     'no-param-reassign': 0, | ||||
|     'prefer-regex-literals': 0, | ||||
|     'import/no-extraneous-dependencies': 0, | ||||
|     'camelcase': 'off', | ||||
|   }, | ||||
| }; | ||||
							
								
								
									
										22
									
								
								continew-admin-ui/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -1,22 +0,0 @@ | ||||
| .DS_Store | ||||
| node_modules/ | ||||
| dist/ | ||||
| npm-debug.log* | ||||
| yarn-debug.log* | ||||
| yarn-error.log* | ||||
| **/*.log | ||||
|  | ||||
| tests/**/coverage/ | ||||
| tests/e2e/reports | ||||
| selenium-debug.log | ||||
|  | ||||
| # Editor directories and files | ||||
| .idea | ||||
| .vscode | ||||
| *.suo | ||||
| *.ntvs* | ||||
| *.njsproj | ||||
| *.sln | ||||
| *.local | ||||
|  | ||||
| package-lock.json | ||||
| @@ -1,7 +0,0 @@ | ||||
| /dist/* | ||||
| .local | ||||
| .output.js | ||||
| /node_modules/** | ||||
|  | ||||
| **/*.svg | ||||
| **/*.sh | ||||
| @@ -1,10 +0,0 @@ | ||||
| module.exports = { | ||||
|   tabWidth: 2, | ||||
|   semi: true, | ||||
|   printWidth: 80, | ||||
|   singleQuote: true, | ||||
|   quoteProps: 'consistent', | ||||
|   htmlWhitespaceSensitivity: 'strict', | ||||
|   vueIndentScriptAndStyle: true, | ||||
|   endOfLine: 'auto', | ||||
| }; | ||||
| @@ -1,30 +0,0 @@ | ||||
| module.exports = { | ||||
|   extends: [ | ||||
|     'stylelint-config-standard', | ||||
|     'stylelint-config-rational-order', | ||||
|     'stylelint-config-prettier', | ||||
|     'stylelint-config-recommended-vue', | ||||
|   ], | ||||
|   defaultSeverity: 'warning', | ||||
|   plugins: ['stylelint-order'], | ||||
|   rules: { | ||||
|     'at-rule-no-unknown': [ | ||||
|       true, | ||||
|       { | ||||
|         ignoreAtRules: ['plugin'], | ||||
|       }, | ||||
|     ], | ||||
|     'rule-empty-line-before': [ | ||||
|       'always', | ||||
|       { | ||||
|         except: ['after-single-line-comment', 'first-nested'], | ||||
|       }, | ||||
|     ], | ||||
|     'selector-pseudo-class-no-unknown': [ | ||||
|       true, | ||||
|       { | ||||
|         ignorePseudoClasses: ['deep'], | ||||
|       }, | ||||
|     ], | ||||
|   }, | ||||
| }; | ||||
| @@ -1,3 +0,0 @@ | ||||
| module.exports = { | ||||
|   plugins: ['@vue/babel-plugin-jsx'], | ||||
| }; | ||||
| @@ -1,3 +0,0 @@ | ||||
| module.exports = { | ||||
|   extends: ['@commitlint/config-conventional'], | ||||
| }; | ||||
							
								
								
									
										15
									
								
								continew-admin-ui/components.d.ts
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -1,15 +0,0 @@ | ||||
| /* eslint-disable */ | ||||
| /* prettier-ignore */ | ||||
| // @ts-nocheck | ||||
| // Generated by unplugin-vue-components | ||||
| // Read more: https://github.com/vuejs/core/pull/3399 | ||||
| import '@vue/runtime-core' | ||||
|  | ||||
| export {} | ||||
|  | ||||
| declare module '@vue/runtime-core' { | ||||
|   export interface GlobalComponents { | ||||
|     RouterLink: typeof import('vue-router')['RouterLink'] | ||||
|     RouterView: typeof import('vue-router')['RouterView'] | ||||
|   } | ||||
| } | ||||
| @@ -1,19 +0,0 @@ | ||||
| /** | ||||
|  * If you use the template method for development, you can use the unplugin-vue-components plugin to enable on-demand loading support. | ||||
|  * 按需引入 | ||||
|  * https://github.com/antfu/unplugin-vue-components | ||||
|  * https://arco.design/vue/docs/start | ||||
|  * Although the Pro project is full of imported components, this plugin will be used by default. | ||||
|  * 虽然Pro项目中是全量引入组件,但此插件会默认使用。 | ||||
|  */ | ||||
| import Components from 'unplugin-vue-components/vite'; | ||||
| import { ArcoResolver } from 'unplugin-vue-components/resolvers'; | ||||
|  | ||||
| export default function configArcoResolverPlugin() { | ||||
|   const arcoResolverPlugin = Components({ | ||||
|     dirs: [], // Avoid parsing src/components.  避免解析到src/components | ||||
|     deep: false, | ||||
|     resolvers: [ArcoResolver()], | ||||
|   }); | ||||
|   return arcoResolverPlugin; | ||||
| } | ||||
| @@ -1,12 +0,0 @@ | ||||
| /** | ||||
|  * Theme import | ||||
|  * 样式按需引入 | ||||
|  * https://github.com/arco-design/arco-plugins/blob/main/packages/plugin-vite-vue/README.md | ||||
|  * https://arco.design/vue/docs/start | ||||
|  */ | ||||
| import { vitePluginForArco } from '@arco-plugins/vite-vue'; | ||||
|  | ||||
| export default function configArcoStyleImportPlugin() { | ||||
|   const arcoResolverPlugin = vitePluginForArco({}); | ||||
|   return arcoResolverPlugin; | ||||
| } | ||||
| @@ -1,34 +0,0 @@ | ||||
| /** | ||||
|  * Used to package and output gzip. Note that this does not work properly in Vite, the specific reason is still being investigated | ||||
|  * gzip压缩 | ||||
|  * https://github.com/anncwb/vite-plugin-compression | ||||
|  */ | ||||
| import type { Plugin } from 'vite'; | ||||
| import compressPlugin from 'vite-plugin-compression'; | ||||
|  | ||||
| export default function configCompressPlugin( | ||||
|   compress: 'gzip' | 'brotli', | ||||
|   deleteOriginFile = false | ||||
| ): Plugin | Plugin[] { | ||||
|   const plugins: Plugin[] = []; | ||||
|  | ||||
|   if (compress === 'gzip') { | ||||
|     plugins.push( | ||||
|       compressPlugin({ | ||||
|         ext: '.gz', | ||||
|         deleteOriginFile, | ||||
|       }) | ||||
|     ); | ||||
|   } | ||||
|  | ||||
|   if (compress === 'brotli') { | ||||
|     plugins.push( | ||||
|       compressPlugin({ | ||||
|         ext: '.br', | ||||
|         algorithm: 'brotliCompress', | ||||
|         deleteOriginFile, | ||||
|       }) | ||||
|     ); | ||||
|   } | ||||
|   return plugins; | ||||
| } | ||||
| @@ -1,37 +0,0 @@ | ||||
| /** | ||||
|  * Image resource files used to compress the output of the production environment | ||||
|  * 图片压缩 | ||||
|  * https://github.com/anncwb/vite-plugin-imagemin | ||||
|  */ | ||||
| import viteImagemin from 'vite-plugin-imagemin'; | ||||
|  | ||||
| export default function configImageminPlugin() { | ||||
|   const imageminPlugin = viteImagemin({ | ||||
|     gifsicle: { | ||||
|       optimizationLevel: 7, | ||||
|       interlaced: false, | ||||
|     }, | ||||
|     optipng: { | ||||
|       optimizationLevel: 7, | ||||
|     }, | ||||
|     mozjpeg: { | ||||
|       quality: 20, | ||||
|     }, | ||||
|     pngquant: { | ||||
|       quality: [0.8, 0.9], | ||||
|       speed: 4, | ||||
|     }, | ||||
|     svgo: { | ||||
|       plugins: [ | ||||
|         { | ||||
|           name: 'removeViewBox', | ||||
|         }, | ||||
|         { | ||||
|           name: 'removeEmptyAttrs', | ||||
|           active: false, | ||||
|         }, | ||||
|       ], | ||||
|     }, | ||||
|   }); | ||||
|   return imageminPlugin; | ||||
| } | ||||
| @@ -1,10 +0,0 @@ | ||||
| import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'; | ||||
| import path from 'path'; | ||||
|  | ||||
| export default function createSvgIcon(isBuild: boolean) { | ||||
|   return createSvgIconsPlugin({ | ||||
|     iconDirs: [path.resolve(process.cwd(), 'src/assets/icons/svg')], | ||||
|     symbolId: 'icon-[dir]-[name]', | ||||
|     svgoOptions: isBuild, | ||||
|   }); | ||||
| } | ||||
| @@ -1,18 +0,0 @@ | ||||
| /** | ||||
|  * Generation packaging analysis | ||||
|  * 生成打包分析 | ||||
|  */ | ||||
| import visualizer from 'rollup-plugin-visualizer'; | ||||
| import { isReportMode } from '../utils'; | ||||
|  | ||||
| export default function configVisualizerPlugin() { | ||||
|   if (isReportMode()) { | ||||
|     return visualizer({ | ||||
|       filename: './node_modules/.cache/visualizer/stats.html', | ||||
|       open: true, | ||||
|       gzipSize: true, | ||||
|       brotliSize: true, | ||||
|     }); | ||||
|   } | ||||
|   return []; | ||||
| } | ||||
| @@ -1,9 +0,0 @@ | ||||
| /** | ||||
|  * Whether to generate package preview | ||||
|  * 是否生成打包报告 | ||||
|  */ | ||||
| export default {}; | ||||
|  | ||||
| export function isReportMode(): boolean { | ||||
|   return process.env.REPORT === 'true'; | ||||
| } | ||||
| @@ -1,51 +0,0 @@ | ||||
| import { resolve } from 'path'; | ||||
| import { defineConfig } from 'vite'; | ||||
| import vue from '@vitejs/plugin-vue'; | ||||
| import vueJsx from '@vitejs/plugin-vue-jsx'; | ||||
| import svgLoader from 'vite-svg-loader'; | ||||
| // import configArcoStyleImportPlugin from './plugin/arcoStyleImport'; | ||||
|  | ||||
| export default defineConfig({ | ||||
|   plugins: [ | ||||
|     vue(), | ||||
|     vueJsx(), | ||||
|     svgLoader({ svgoConfig: {} }), | ||||
|     // configArcoStyleImportPlugin(), | ||||
|   ], | ||||
|   resolve: { | ||||
|     alias: [ | ||||
|       { | ||||
|         find: '@', | ||||
|         replacement: resolve(__dirname, '../src'), | ||||
|       }, | ||||
|       { | ||||
|         find: 'assets', | ||||
|         replacement: resolve(__dirname, '../src/assets'), | ||||
|       }, | ||||
|       { | ||||
|         find: 'vue-i18n', | ||||
|         replacement: 'vue-i18n/dist/vue-i18n.cjs.js', // Resolve the i18n warning issue | ||||
|       }, | ||||
|       { | ||||
|         find: 'vue', | ||||
|         replacement: 'vue/dist/vue.esm-bundler.js', // compile template | ||||
|       }, | ||||
|     ], | ||||
|     extensions: ['.ts', '.js'], | ||||
|   }, | ||||
|   define: { | ||||
|     'process.env': {}, | ||||
|   }, | ||||
|   css: { | ||||
|     preprocessorOptions: { | ||||
|       less: { | ||||
|         modifyVars: { | ||||
|           hack: `true; @import (reference) "${resolve( | ||||
|             'src/assets/style/breakpoint.less' | ||||
|           )}";`, | ||||
|         }, | ||||
|         javascriptEnabled: true, | ||||
|       }, | ||||
|     }, | ||||
|   }, | ||||
| }); | ||||
| @@ -1,25 +0,0 @@ | ||||
| import { mergeConfig } from 'vite'; | ||||
| import eslint from 'vite-plugin-eslint'; | ||||
| import baseConfig from './vite.config.base'; | ||||
| import createSvgIcon from './plugin/svg-icon'; | ||||
|  | ||||
| export default mergeConfig( | ||||
|   { | ||||
|     mode: 'development', | ||||
|     server: { | ||||
|       open: true, | ||||
|       fs: { | ||||
|         strict: true, | ||||
|       }, | ||||
|     }, | ||||
|     plugins: [ | ||||
|       eslint({ | ||||
|         cache: false, | ||||
|         include: ['src/**/*.ts', 'src/**/*.tsx', 'src/**/*.vue'], | ||||
|         exclude: ['node_modules'], | ||||
|       }), | ||||
|       createSvgIcon(false), | ||||
|     ], | ||||
|   }, | ||||
|   baseConfig | ||||
| ); | ||||
| @@ -1,33 +0,0 @@ | ||||
| import { mergeConfig } from 'vite'; | ||||
| import baseConfig from './vite.config.base'; | ||||
| import configCompressPlugin from './plugin/compress'; | ||||
| import configVisualizerPlugin from './plugin/visualizer'; | ||||
| // import configArcoResolverPlugin from './plugin/arcoResolver'; | ||||
| import configImageminPlugin from './plugin/imagemin'; | ||||
| import createSvgIcon from './plugin/svg-icon'; | ||||
|  | ||||
| export default mergeConfig( | ||||
|   { | ||||
|     mode: 'production', | ||||
|     plugins: [ | ||||
|       configCompressPlugin('gzip'), | ||||
|       configVisualizerPlugin(), | ||||
|       // configArcoResolverPlugin(), | ||||
|       configImageminPlugin(), | ||||
|       createSvgIcon(true), | ||||
|     ], | ||||
|     build: { | ||||
|       rollupOptions: { | ||||
|         output: { | ||||
|           manualChunks: { | ||||
|             arco: ['@arco-design/web-vue'], | ||||
|             chart: ['echarts', 'vue-echarts'], | ||||
|             vue: ['vue', 'vue-router', 'pinia', '@vueuse/core', 'vue-i18n'], | ||||
|           }, | ||||
|         }, | ||||
|       }, | ||||
|       chunkSizeWarningLimit: 2000, | ||||
|     }, | ||||
|   }, | ||||
|   baseConfig | ||||
| ); | ||||
| @@ -1,31 +0,0 @@ | ||||
| <!DOCTYPE html> | ||||
| <html lang="en"> | ||||
|   <head> | ||||
|     <meta charset="UTF-8" /> | ||||
|     <link rel="shortcut icon" type="image/x-icon" href="/favicon.ico"> | ||||
|     <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" /> | ||||
|     <title></title> | ||||
|   </head> | ||||
|   <body> | ||||
|     <div id="app"></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?b0d02b5db5f47cd1ecb885dd33781f21"; | ||||
|         var s = document.getElementsByTagName("script")[0]; | ||||
|         s.parentNode.insertBefore(hm, s); | ||||
|  | ||||
|         /* 百度统计 => 规则设置 => 单页设置 => 启用单页应用数据统计 */ | ||||
|         _hmt.push(['_requirePlugin', 'UrlChangeTracker', { | ||||
|           shouldTrackUrlChange: function (newPath, oldPath) { | ||||
|             return newPath && oldPath; | ||||
|           }} | ||||
|         ]); | ||||
|       })(); | ||||
|     </script> | ||||
|   </body> | ||||
| </html> | ||||
| @@ -1,113 +0,0 @@ | ||||
| { | ||||
|   "name": "continew-admin-ui", | ||||
|   "description": "ContiNew Admin 中后台管理框架,Continue New Admin,持续以最新流行技术栈构建,拥抱变化,迭代优化。", | ||||
|   "version": "2.2.0", | ||||
|   "private": true, | ||||
|   "author": "Charles7c", | ||||
|   "license": "Apache-2.0", | ||||
|   "scripts": { | ||||
|     "dev": "vite --host --config ./config/vite.config.dev.ts", | ||||
|     "build": "vue-tsc --noEmit && vite build --config ./config/vite.config.prod.ts", | ||||
|     "report": "cross-env REPORT=true npm run build", | ||||
|     "preview": "npm run build && vite preview --host", | ||||
|     "type:check": "vue-tsc --noEmit --skipLibCheck", | ||||
|     "lint": "eslint . --ext .vue,.js,.ts,.jsx,.tsx --fix", | ||||
|     "lint-staged": "npx lint-staged" | ||||
|   }, | ||||
|   "lint-staged": { | ||||
|     "*.{js,ts,jsx,tsx}": [ | ||||
|       "prettier --write", | ||||
|       "eslint --fix" | ||||
|     ], | ||||
|     "*.vue": [ | ||||
|       "stylelint --fix", | ||||
|       "prettier --write", | ||||
|       "eslint --fix" | ||||
|     ], | ||||
|     "*.{less,css}": [ | ||||
|       "stylelint --fix", | ||||
|       "prettier --write" | ||||
|     ] | ||||
|   }, | ||||
|   "dependencies": { | ||||
|     "@arco-design/web-vue": "^2.53.3", | ||||
|     "@codemirror/lang-java": "^6.0.1", | ||||
|     "@codemirror/lang-javascript": "^6.2.1", | ||||
|     "@kangc/v-md-editor": "^2.3.18", | ||||
|     "@vueuse/core": "^10.7.0", | ||||
|     "axios": "^0.24.0", | ||||
|     "codemirror": "^6.0.1", | ||||
|     "crypto-js": "^4.2.0", | ||||
|     "dayjs": "^1.11.10", | ||||
|     "echarts": "^5.4.3", | ||||
|     "highlight.js": "^11.9.0", | ||||
|     "jsencrypt": "^3.3.2", | ||||
|     "lodash": "^4.17.21", | ||||
|     "mitt": "^3.0.1", | ||||
|     "nprogress": "^0.2.0", | ||||
|     "pinia": "^2.1.7", | ||||
|     "query-string": "^8.1.0", | ||||
|     "sortablejs": "^1.15.1", | ||||
|     "v-viewer": "^3.0.10", | ||||
|     "viewerjs": "^1.11.6", | ||||
|     "vue": "3.3.7", | ||||
|     "vue-codemirror": "^6.1.1", | ||||
|     "vue-cropper": "^1.1.1", | ||||
|     "vue-echarts": "^6.6.5", | ||||
|     "vue-i18n": "^9.8.0", | ||||
|     "vue-json-pretty": "^2.3.0", | ||||
|     "vue-router": "^4.2.5", | ||||
|     "vue3-colorpicker": "^2.2.3", | ||||
|     "xgplayer": "^2.31.6" | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "@arco-plugins/vite-vue": "^1.4.5", | ||||
|     "@commitlint/cli": "^18.4.3", | ||||
|     "@commitlint/config-conventional": "^18.4.3", | ||||
|     "@types/crypto-js": "^4.2.1", | ||||
|     "@types/lodash": "^4.14.202", | ||||
|     "@types/mockjs": "^1.0.10", | ||||
|     "@types/nprogress": "^0.2.3", | ||||
|     "@types/sortablejs": "^1.15.7", | ||||
|     "@typescript-eslint/eslint-plugin": "^6.15.0", | ||||
|     "@typescript-eslint/parser": "^6.15.0", | ||||
|     "@vitejs/plugin-vue": "^4.5.2", | ||||
|     "@vitejs/plugin-vue-jsx": "^3.1.0", | ||||
|     "@vue/babel-plugin-jsx": "^1.1.5", | ||||
|     "consola": "^3.2.3", | ||||
|     "cross-env": "^7.0.3", | ||||
|     "eslint": "^8.56.0", | ||||
|     "eslint-config-airbnb-base": "^15.0.0", | ||||
|     "eslint-config-prettier": "^9.1.0", | ||||
|     "eslint-import-resolver-typescript": "^3.6.1", | ||||
|     "eslint-plugin-import": "^2.29.1", | ||||
|     "eslint-plugin-prettier": "^5.1.2", | ||||
|     "eslint-plugin-vue": "^9.19.2", | ||||
|     "less": "^4.2.0", | ||||
|     "lint-staged": "^15.2.0", | ||||
|     "mockjs": "^1.1.0", | ||||
|     "postcss-html": "^1.5.0", | ||||
|     "prettier": "^3.1.1", | ||||
|     "rollup": "^4.9.1", | ||||
|     "rollup-plugin-visualizer": "^5.11.0", | ||||
|     "sass": "^1.69.5", | ||||
|     "stylelint": "^16.0.2", | ||||
|     "stylelint-config-prettier": "^9.0.5", | ||||
|     "stylelint-config-rational-order": "^0.1.2", | ||||
|     "stylelint-config-recommended-vue": "^1.5.0", | ||||
|     "stylelint-config-standard": "^35.0.0", | ||||
|     "stylelint-order": "^6.0.4", | ||||
|     "typescript": "^5.3.3", | ||||
|     "unplugin-vue-components": "^0.26.0", | ||||
|     "vite": "^4.5.1", | ||||
|     "vite-plugin-compression": "^0.5.1", | ||||
|     "vite-plugin-eslint": "^1.8.1", | ||||
|     "vite-plugin-imagemin": "^0.6.1", | ||||
|     "vite-plugin-svg-icons": "^2.0.1", | ||||
|     "vite-svg-loader": "^4.0.0", | ||||
|     "vue-tsc": "^1.8.26" | ||||
|   }, | ||||
|   "engines": { | ||||
|     "node": ">=14.0.0" | ||||
|   } | ||||
| } | ||||
							
								
								
									
										10641
									
								
								continew-admin-ui/pnpm-lock.yaml
									
									
									
										generated
									
									
									
								
							
							
						
						| Before Width: | Height: | Size: 66 KiB | 
| @@ -1,9 +0,0 @@ | ||||
| <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> | ||||
| Before Width: | Height: | Size: 683 B | 
| @@ -1,2 +0,0 @@ | ||||
| User-agent: * | ||||
| Disallow: / | ||||
| @@ -1,26 +0,0 @@ | ||||
| <template> | ||||
|   <a-config-provider :locale="locale"> | ||||
|     <router-view /> | ||||
|     <global-setting /> | ||||
|   </a-config-provider> | ||||
| </template> | ||||
|  | ||||
| <script lang="ts" setup> | ||||
|   import { computed } from 'vue'; | ||||
|   import enUS from '@arco-design/web-vue/es/locale/lang/en-us'; | ||||
|   import zhCN from '@arco-design/web-vue/es/locale/lang/zh-cn'; | ||||
|   import GlobalSetting from '@/components/global-setting/index.vue'; | ||||
|   import useLocale from '@/hooks/locale'; | ||||
|  | ||||
|   const { currentLocale } = useLocale(); | ||||
|   const locale = computed(() => { | ||||
|     switch (currentLocale.value) { | ||||
|       case 'zh-CN': | ||||
|         return zhCN; | ||||
|       case 'en-US': | ||||
|         return enUS; | ||||
|       default: | ||||
|         return enUS; | ||||
|     } | ||||
|   }); | ||||
| </script> | ||||
| @@ -1,58 +0,0 @@ | ||||
| import axios from 'axios'; | ||||
| import type { RouteRecordNormalized } from 'vue-router'; | ||||
| import { UserState } from '@/store/modules/user/types'; | ||||
|  | ||||
| const BASE_URL = '/auth'; | ||||
|  | ||||
| export interface AccountLoginReq { | ||||
|   username?: string; | ||||
|   password?: string; | ||||
|   captcha: string; | ||||
|   uuid?: string; | ||||
| } | ||||
|  | ||||
| export interface LoginRes { | ||||
|   token: string; | ||||
| } | ||||
|  | ||||
| export function accountLogin(req: AccountLoginReq) { | ||||
|   return axios.post<LoginRes>(`${BASE_URL}/account`, req); | ||||
| } | ||||
|  | ||||
| export interface EmailLoginReq { | ||||
|   email: string; | ||||
|   captcha: string; | ||||
| } | ||||
|  | ||||
| export function emailLogin(req: EmailLoginReq) { | ||||
|   return axios.post<LoginRes>(`${BASE_URL}/email`, req); | ||||
| } | ||||
|  | ||||
| export interface PhoneLoginReq { | ||||
|   phone: string; | ||||
|   captcha: string; | ||||
| } | ||||
|  | ||||
| export function phoneLogin(req: PhoneLoginReq) { | ||||
|   return axios.post<LoginRes>(`${BASE_URL}/phone`, req); | ||||
| } | ||||
|  | ||||
| export function logout() { | ||||
|   return axios.post(`${BASE_URL}/logout`); | ||||
| } | ||||
|  | ||||
| export function getUserInfo() { | ||||
|   return axios.get<UserState>(`${BASE_URL}/user/info`); | ||||
| } | ||||
|  | ||||
| export function listRoute() { | ||||
|   return axios.get<RouteRecordNormalized[]>(`${BASE_URL}/route`); | ||||
| } | ||||
|  | ||||
| export function socialAuth(source: string) { | ||||
|   return axios.get<string>(`/oauth/${source}`); | ||||
| } | ||||
|  | ||||
| export function socialLogin(source: string, req: any) { | ||||
|   return axios.post<LoginRes>(`/oauth/${source}`, req); | ||||
| } | ||||
| @@ -1,63 +0,0 @@ | ||||
| import axios from 'axios'; | ||||
| import qs from 'query-string'; | ||||
|  | ||||
| const BASE_URL = '/captcha'; | ||||
|  | ||||
| export interface ImageCaptchaRes { | ||||
|   uuid: string; | ||||
|   img: string; | ||||
| } | ||||
|  | ||||
| export interface BehaviorCaptchaRes { | ||||
|   originalImageBase64: string; | ||||
|   point: { | ||||
|     x: number; | ||||
|     y: number; | ||||
|   }; | ||||
|   jigsawImageBase64: string; | ||||
|   token: string; | ||||
|   secretKey: string; | ||||
| } | ||||
|  | ||||
| export interface BehaviorCaptchaReq { | ||||
|   captchaType?: string; | ||||
|   captchaVerification?: string; | ||||
|   clientUid?: string; | ||||
| } | ||||
|  | ||||
| export interface CheckBehaviorCaptchaRes { | ||||
|   repCode: string; | ||||
|   repMsg: string; | ||||
| } | ||||
|  | ||||
| export function getImageCaptcha() { | ||||
|   return axios.get<ImageCaptchaRes>(`${BASE_URL}/img`); | ||||
| } | ||||
|  | ||||
| export function getMailCaptcha(email: string) { | ||||
|   return axios.get(`${BASE_URL}/mail?email=${email}`); | ||||
| } | ||||
|  | ||||
| export function getSmsCaptcha( | ||||
|   phone: string, | ||||
|   behaviorCaptcha: BehaviorCaptchaReq, | ||||
| ) { | ||||
|   return axios.get( | ||||
|     `${BASE_URL}/sms?phone=${phone}&captchaVerification=${encodeURIComponent( | ||||
|       behaviorCaptcha.captchaVerification || '', | ||||
|     )}`, | ||||
|   ); | ||||
| } | ||||
|  | ||||
| export function getBehaviorCaptcha(params: any) { | ||||
|   return axios.get<BehaviorCaptchaRes>(`${BASE_URL}/behavior`, { | ||||
|     params, | ||||
|     paramsSerializer: (obj) => { | ||||
|       return qs.stringify(obj); | ||||
|     }, | ||||
|   }); | ||||
| } | ||||
|  | ||||
| export function checkBehaviorCaptcha(params: any) { | ||||
|   return axios.post<CheckBehaviorCaptchaRes>(`${BASE_URL}/behavior`, params); | ||||
| } | ||||
| @@ -1,65 +0,0 @@ | ||||
| import axios from 'axios'; | ||||
|  | ||||
| const BASE_URL = '/dashboard'; | ||||
|  | ||||
| export interface DashboardTotalRecord { | ||||
|   pvCount: number; | ||||
|   ipCount: number; | ||||
|   todayPvCount: number; | ||||
|   newPvFromYesterday: number; | ||||
| } | ||||
|  | ||||
| export interface DashboardAccessTrendRecord { | ||||
|   date: string; | ||||
|   pvCount: number; | ||||
|   ipCount: number; | ||||
| } | ||||
|  | ||||
| export interface DashboardPopularModuleRecord { | ||||
|   module: string; | ||||
|   pvCount: number; | ||||
|   newPvFromYesterday: number; | ||||
| } | ||||
|  | ||||
| export interface DashboardGeoDistributionRecord { | ||||
|   locations: string[]; | ||||
|   locationIpStatistics: []; | ||||
| } | ||||
|  | ||||
| export interface DashboardAnnouncementRecord { | ||||
|   id: number; | ||||
|   title: string; | ||||
|   type: number; | ||||
| } | ||||
|  | ||||
| export interface DashboardRecentlyVisitedRecord { | ||||
|   title?: string; | ||||
|   path: string; | ||||
|   icon?: string; | ||||
| } | ||||
|  | ||||
| export function getTotal() { | ||||
|   return axios.get<DashboardTotalRecord>(`${BASE_URL}/total`); | ||||
| } | ||||
|  | ||||
| export function listAccessTrend(days: number) { | ||||
|   return axios.get<DashboardAccessTrendRecord[]>( | ||||
|     `${BASE_URL}/access/trend/${days}`, | ||||
|   ); | ||||
| } | ||||
|  | ||||
| export function listPopularModule() { | ||||
|   return axios.get<DashboardPopularModuleRecord[]>( | ||||
|     `${BASE_URL}/popular/module`, | ||||
|   ); | ||||
| } | ||||
|  | ||||
| export function getGeoDistribution() { | ||||
|   return axios.get<DashboardGeoDistributionRecord>( | ||||
|     `${BASE_URL}/geo/distribution`, | ||||
|   ); | ||||
| } | ||||
|  | ||||
| export function listAnnouncement() { | ||||
|   return axios.get<DashboardAnnouncementRecord[]>(`${BASE_URL}/announcement`); | ||||
| } | ||||
| @@ -1,54 +0,0 @@ | ||||
| import axios from 'axios'; | ||||
| import qs from 'query-string'; | ||||
| import { ListParam as DeptParam } from '@/api/system/dept'; | ||||
| import { ListParam as MenuParam } from '@/api/system/menu'; | ||||
| import { ListParam as RoleParam } from '@/api/system/role'; | ||||
| import { ListParam as OptionParam } from '@/api/system/config'; | ||||
| import { TreeNodeData } from '@arco-design/web-vue'; | ||||
| import { LabelValueState } from '@/store/modules/dict/types'; | ||||
|  | ||||
| const BASE_URL = '/common'; | ||||
|  | ||||
| export function listDeptTree(params: DeptParam) { | ||||
|   return axios.get<TreeNodeData[]>(`${BASE_URL}/tree/dept`, { | ||||
|     params, | ||||
|     paramsSerializer: (obj) => { | ||||
|       return qs.stringify(obj); | ||||
|     }, | ||||
|   }); | ||||
| } | ||||
|  | ||||
| export function listMenuTree(params: MenuParam) { | ||||
|   return axios.get<TreeNodeData[]>(`${BASE_URL}/tree/menu`, { | ||||
|     params, | ||||
|     paramsSerializer: (obj) => { | ||||
|       return qs.stringify(obj); | ||||
|     }, | ||||
|   }); | ||||
| } | ||||
|  | ||||
| export function listRoleDict(params: RoleParam) { | ||||
|   return axios.get<LabelValueState[]>(`${BASE_URL}/dict/role`, { | ||||
|     params, | ||||
|     paramsSerializer: (obj) => { | ||||
|       return qs.stringify(obj); | ||||
|     }, | ||||
|   }); | ||||
| } | ||||
|  | ||||
| export function listDict(code: string) { | ||||
|   return axios.get<LabelValueState[]>(`${BASE_URL}/dict/${code}`); | ||||
| } | ||||
|  | ||||
| export function listOption(params: OptionParam) { | ||||
|   return axios.get<LabelValueState[]>(`${BASE_URL}/option`, { | ||||
|     params, | ||||
|     paramsSerializer: (obj) => { | ||||
|       return qs.stringify(obj); | ||||
|     }, | ||||
|   }); | ||||
| } | ||||
|  | ||||
| export function upload(data: FormData) { | ||||
|   return axios.post(`${BASE_URL}/file`, data); | ||||
| } | ||||
| @@ -1,21 +0,0 @@ | ||||
| import axios from 'axios'; | ||||
|  | ||||
| export interface BaseInfoModel { | ||||
|   activityName: string; | ||||
|   channelType: string; | ||||
|   promotionTime: string[]; | ||||
|   promoteLink: string; | ||||
| } | ||||
| export interface ChannelInfoModel { | ||||
|   advertisingSource: string; | ||||
|   advertisingMedia: string; | ||||
|   keyword: string[]; | ||||
|   pushNotify: boolean; | ||||
|   advertisingContent: string; | ||||
| } | ||||
|  | ||||
| export type UnitChannelModel = BaseInfoModel & ChannelInfoModel; | ||||
|  | ||||
| export function submitChannelForm(data: UnitChannelModel) { | ||||
|   return axios.post('/api/channel-form/submit', { data }); | ||||
| } | ||||
| @@ -1,56 +0,0 @@ | ||||
| import axios from 'axios'; | ||||
| import qs from 'query-string'; | ||||
| import type { DescData } from '@arco-design/web-vue/es/descriptions/interface'; | ||||
|  | ||||
| export interface PolicyRecord { | ||||
|   id: string; | ||||
|   number: number; | ||||
|   name: string; | ||||
|   contentType: 'img' | 'horizontalVideo' | 'verticalVideo'; | ||||
|   filterType: 'artificial' | 'rules'; | ||||
|   count: number; | ||||
|   status: 'online' | 'offline'; | ||||
|   createdTime: string; | ||||
| } | ||||
|  | ||||
| export interface PolicyParams extends Partial<PolicyRecord> { | ||||
|   current: number; | ||||
|   pageSize: number; | ||||
| } | ||||
|  | ||||
| export interface PolicyListRes { | ||||
|   list: PolicyRecord[]; | ||||
|   total: number; | ||||
| } | ||||
|  | ||||
| export function queryPolicyList(params: PolicyParams) { | ||||
|   return axios.get<PolicyListRes>('/api/list/policy', { | ||||
|     params, | ||||
|     paramsSerializer: (obj) => { | ||||
|       return qs.stringify(obj); | ||||
|     }, | ||||
|   }); | ||||
| } | ||||
|  | ||||
| export interface ServiceRecord { | ||||
|   id: number; | ||||
|   title: string; | ||||
|   description: string; | ||||
|   name?: string; | ||||
|   actionType?: string; | ||||
|   icon?: string; | ||||
|   data?: DescData[]; | ||||
|   enable?: boolean; | ||||
|   expires?: boolean; | ||||
| } | ||||
| export function queryInspectionList() { | ||||
|   return axios.get('/api/list/quality-inspection'); | ||||
| } | ||||
|  | ||||
| export function queryTheServiceList() { | ||||
|   return axios.get('/api/list/the-service'); | ||||
| } | ||||
|  | ||||
| export function queryRulesPresetList() { | ||||
|   return axios.get('/api/list/rules-preset'); | ||||
| } | ||||
| @@ -1,38 +0,0 @@ | ||||
| import axios from 'axios'; | ||||
|  | ||||
| export interface MessageRecord { | ||||
|   id: number; | ||||
|   type: string; | ||||
|   title: string; | ||||
|   subTitle: string; | ||||
|   avatar?: string; | ||||
|   content: string; | ||||
|   time: string; | ||||
|   status: 0 | 1; | ||||
|   messageType?: number; | ||||
| } | ||||
| export type MessageListType = MessageRecord[]; | ||||
|  | ||||
| export function queryMessageList() { | ||||
|   return axios.get<MessageListType>('/api/message/list'); | ||||
| } | ||||
|  | ||||
| interface MessageStatus { | ||||
|   ids: number[]; | ||||
| } | ||||
|  | ||||
| export function setMessageStatus(data: MessageStatus) { | ||||
|   return axios.post<MessageListType>('/api/message/read', data); | ||||
| } | ||||
|  | ||||
| export interface ChatRecord { | ||||
|   id: number; | ||||
|   username: string; | ||||
|   content: string; | ||||
|   time: string; | ||||
|   isCollect: boolean; | ||||
| } | ||||
|  | ||||
| export function queryChatList() { | ||||
|   return axios.get<ChatRecord[]>('/api/chat/list'); | ||||
| } | ||||
| @@ -1,49 +0,0 @@ | ||||
| import axios from 'axios'; | ||||
|  | ||||
| export interface ProfileBasicRes { | ||||
|   status: number; | ||||
|   video: { | ||||
|     mode: string; | ||||
|     acquisition: { | ||||
|       resolution: string; | ||||
|       frameRate: number; | ||||
|     }; | ||||
|     encoding: { | ||||
|       resolution: string; | ||||
|       rate: { | ||||
|         min: number; | ||||
|         max: number; | ||||
|         default: number; | ||||
|       }; | ||||
|       frameRate: number; | ||||
|       profile: string; | ||||
|     }; | ||||
|   }; | ||||
|   audio: { | ||||
|     mode: string; | ||||
|     acquisition: { | ||||
|       channels: number; | ||||
|     }; | ||||
|     encoding: { | ||||
|       channels: number; | ||||
|       rate: number; | ||||
|       profile: string; | ||||
|     }; | ||||
|   }; | ||||
| } | ||||
|  | ||||
| export function queryProfileBasic() { | ||||
|   return axios.get<ProfileBasicRes>('/api/profile/basic'); | ||||
| } | ||||
|  | ||||
| export type operationLogRes = Array<{ | ||||
|   key: string; | ||||
|   contentNumber: string; | ||||
|   updateContent: string; | ||||
|   status: number; | ||||
|   updateTime: string; | ||||
| }>; | ||||
|  | ||||
| export function queryOperationLog() { | ||||
|   return axios.get<operationLogRes>('/api/operation/log'); | ||||
| } | ||||
| @@ -1,73 +0,0 @@ | ||||
| import axios from 'axios'; | ||||
| import { GeneralChart } from '@/types/global'; | ||||
|  | ||||
| export interface ChartDataRecord { | ||||
|   x: string; | ||||
|   y: number; | ||||
|   name: string; | ||||
| } | ||||
| export interface DataChainGrowth { | ||||
|   quota: string; | ||||
| } | ||||
|  | ||||
| export interface DataChainGrowthRes { | ||||
|   count: number; | ||||
|   growth: number; | ||||
|   chartData: { | ||||
|     xAxis: string[]; | ||||
|     data: { name: string; value: number[] }; | ||||
|   }; | ||||
| } | ||||
| export function queryDataChainGrowth(data: DataChainGrowth) { | ||||
|   return axios.post<DataChainGrowthRes>('/api/data-chain-growth', data); | ||||
| } | ||||
|  | ||||
| export interface PopularAuthorRes { | ||||
|   list: { | ||||
|     ranking: number; | ||||
|     author: string; | ||||
|     contentCount: number; | ||||
|     clickCount: number; | ||||
|   }[]; | ||||
| } | ||||
|  | ||||
| export function queryPopularAuthor() { | ||||
|   return axios.get<PopularAuthorRes>('/api/popular-author/list'); | ||||
| } | ||||
|  | ||||
| export interface ContentPublishRecord { | ||||
|   x: string[]; | ||||
|   y: number[]; | ||||
|   name: string; | ||||
| } | ||||
|  | ||||
| export function queryContentPublish() { | ||||
|   return axios.get<ContentPublishRecord[]>('/api/content-publish'); | ||||
| } | ||||
|  | ||||
| export function queryContentPeriodAnalysis() { | ||||
|   return axios.get<GeneralChart>('/api/content-period-analysis'); | ||||
| } | ||||
|  | ||||
| export interface PublicOpinionAnalysis { | ||||
|   quota: string; | ||||
| } | ||||
| export interface PublicOpinionAnalysisRes { | ||||
|   count: number; | ||||
|   growth: number; | ||||
|   chartData: ChartDataRecord[]; | ||||
| } | ||||
| export function queryPublicOpinionAnalysis(data: DataChainGrowth) { | ||||
|   return axios.post<PublicOpinionAnalysisRes>( | ||||
|     '/api/public-opinion-analysis', | ||||
|     data | ||||
|   ); | ||||
| } | ||||
| export interface DataOverviewRes { | ||||
|   xAxis: string[]; | ||||
|   data: Array<{ name: string; value: number[]; count: number }>; | ||||
| } | ||||
|  | ||||
| export function queryDataOverview() { | ||||
|   return axios.get<DataOverviewRes>('/api/data-overview'); | ||||
| } | ||||
| @@ -1,107 +0,0 @@ | ||||
| import axios from 'axios'; | ||||
| import qs from 'query-string'; | ||||
|  | ||||
| const BASE_URL = '/monitor/log'; | ||||
|  | ||||
| export interface LogRecord { | ||||
|   id?: number; | ||||
|   ip: string; | ||||
|   address: string; | ||||
|   browser: string; | ||||
|   os: string; | ||||
|   createTime: string; | ||||
| } | ||||
|  | ||||
| export interface LoginLogRecord extends LogRecord { | ||||
|   description: string; | ||||
|   status: number; | ||||
|   errorMsg: string; | ||||
|   createUserString: string; | ||||
| } | ||||
|  | ||||
| export interface OperationLogRecord extends LogRecord { | ||||
|   module: string; | ||||
|   description: string; | ||||
|   status: number; | ||||
|   errorMsgString: string; | ||||
|   createUserString: string; | ||||
| } | ||||
|  | ||||
| export interface SystemLogRecord extends LogRecord { | ||||
|   statusCode: number; | ||||
|   requestMethod: string; | ||||
|   requestUrl: string; | ||||
|   timeTaken: number; | ||||
| } | ||||
|  | ||||
| export interface SystemLogDetailRecord extends SystemLogRecord { | ||||
|   requestHeaders: string; | ||||
|   requestBody: string; | ||||
|   responseHeaders: string; | ||||
|   responseBody: string; | ||||
| } | ||||
|  | ||||
| export interface LoginLogParam extends Partial<LoginLogRecord> { | ||||
|   page: number; | ||||
|   size: number; | ||||
|   sort: Array<string>; | ||||
| } | ||||
|  | ||||
| export interface LoginLogListRes { | ||||
|   list: LoginLogRecord[]; | ||||
|   total: number; | ||||
| } | ||||
|  | ||||
| export function listLoginLog(params: LoginLogParam) { | ||||
|   return axios.get<LoginLogListRes>(`${BASE_URL}/login`, { | ||||
|     params, | ||||
|     paramsSerializer: (obj) => { | ||||
|       return qs.stringify(obj); | ||||
|     }, | ||||
|   }); | ||||
| } | ||||
|  | ||||
| export interface OperationLogParam extends Partial<OperationLogRecord> { | ||||
|   page: number; | ||||
|   size: number; | ||||
|   sort: Array<string>; | ||||
|   uid?: string; | ||||
| } | ||||
|  | ||||
| export interface OperationLogListRes { | ||||
|   list: OperationLogRecord[]; | ||||
|   total: number; | ||||
| } | ||||
|  | ||||
| export function listOperationLog(params: OperationLogParam) { | ||||
|   return axios.get<OperationLogListRes>(`${BASE_URL}/operation`, { | ||||
|     params, | ||||
|     paramsSerializer: (obj) => { | ||||
|       return qs.stringify(obj); | ||||
|     }, | ||||
|   }); | ||||
| } | ||||
|  | ||||
| export interface SystemLogParam extends Partial<SystemLogRecord> { | ||||
|   page: number; | ||||
|   size: number; | ||||
|   sort: Array<string>; | ||||
| } | ||||
|  | ||||
| export interface SystemLogListRes { | ||||
|   list: SystemLogRecord[]; | ||||
|   total: number; | ||||
| } | ||||
|  | ||||
| export function listSystemLog(params: SystemLogParam) { | ||||
|   return axios.get<SystemLogListRes>(`${BASE_URL}/system`, { | ||||
|     params, | ||||
|     paramsSerializer: (obj) => { | ||||
|       return qs.stringify(obj); | ||||
|     }, | ||||
|   }); | ||||
| } | ||||
|  | ||||
| export function getSystemLog(id: number) { | ||||
|   return axios.get<SystemLogDetailRecord>(`${BASE_URL}/system/${id}`); | ||||
| } | ||||
| @@ -1,39 +0,0 @@ | ||||
| import axios from 'axios'; | ||||
| import qs from 'query-string'; | ||||
|  | ||||
| const BASE_URL = '/monitor/online/user'; | ||||
|  | ||||
| export interface DataRecord { | ||||
|   token: string; | ||||
|   username: string; | ||||
|   nickname: string; | ||||
|   ip: string; | ||||
|   address: string; | ||||
|   browser: string; | ||||
|   os: string; | ||||
|   loginTime: string; | ||||
| } | ||||
|  | ||||
| export interface ListParam extends Partial<DataRecord> { | ||||
|   page: number; | ||||
|   size: number; | ||||
|   sort: Array<string>; | ||||
| } | ||||
|  | ||||
| export interface ListRes { | ||||
|   list: DataRecord[]; | ||||
|   total: number; | ||||
| } | ||||
|  | ||||
| export function list(params: ListParam) { | ||||
|   return axios.get<ListRes>(BASE_URL, { | ||||
|     params, | ||||
|     paramsSerializer: (obj) => { | ||||
|       return qs.stringify(obj); | ||||
|     }, | ||||
|   }); | ||||
| } | ||||
|  | ||||
| export function kickout(token: string) { | ||||
|   return axios.delete(`${BASE_URL}/${token}`); | ||||
| } | ||||
| @@ -1,59 +0,0 @@ | ||||
| import axios from 'axios'; | ||||
| import qs from 'query-string'; | ||||
|  | ||||
| const BASE_URL = '/system/announcement'; | ||||
|  | ||||
| export interface DataRecord { | ||||
|   id?: number; | ||||
|   title?: string; | ||||
|   content?: string; | ||||
|   status?: number; | ||||
|   type?: string; | ||||
|   effectiveTime?: string; | ||||
|   terminateTime?: string; | ||||
|   createUser?: string; | ||||
|   createTime?: string; | ||||
|   updateUser?: string; | ||||
|   updateTime?: string; | ||||
|   createUserString?: string; | ||||
|   updateUserString?: string; | ||||
| } | ||||
|  | ||||
| export interface ListParam { | ||||
|   title?: string; | ||||
|   status?: number; | ||||
|   type?: string; | ||||
|   page?: number; | ||||
|   size?: number; | ||||
|   sort?: Array<string>; | ||||
| } | ||||
|  | ||||
| export interface ListRes { | ||||
|   list: DataRecord[]; | ||||
|   total: number; | ||||
| } | ||||
|  | ||||
| export function list(params: ListParam) { | ||||
|   return axios.get<ListRes>(`${BASE_URL}`, { | ||||
|     params, | ||||
|     paramsSerializer: (obj) => { | ||||
|       return qs.stringify(obj); | ||||
|     }, | ||||
|   }); | ||||
| } | ||||
|  | ||||
| export function get(id: number) { | ||||
|   return axios.get<DataRecord>(`${BASE_URL}/${id}`); | ||||
| } | ||||
|  | ||||
| export function add(req: DataRecord) { | ||||
|   return axios.post(BASE_URL, req); | ||||
| } | ||||
|  | ||||
| export function update(req: DataRecord, id: number) { | ||||
|   return axios.put(`${BASE_URL}/${id}`, req); | ||||
| } | ||||
|  | ||||
| export function del(ids: number | Array<number>) { | ||||
|   return axios.delete(`${BASE_URL}/${ids}`); | ||||
| } | ||||
| @@ -1,39 +0,0 @@ | ||||
| import axios from 'axios'; | ||||
| import qs from 'query-string'; | ||||
|  | ||||
| const BASE_URL = '/system/option'; | ||||
|  | ||||
| export interface BasicConfigRecord { | ||||
|   site_title?: string; | ||||
|   site_copyright?: string; | ||||
|   site_logo?: string; | ||||
|   site_favicon?: string; | ||||
| } | ||||
|  | ||||
| export interface DataRecord { | ||||
|   name?: string; | ||||
|   code: string; | ||||
|   value: string; | ||||
|   description?: string; | ||||
| } | ||||
|  | ||||
| export interface ListParam { | ||||
|   code?: Array<string>; | ||||
| } | ||||
|  | ||||
| export function list(params: ListParam) { | ||||
|   return axios.get<DataRecord[]>(`${BASE_URL}`, { | ||||
|     params, | ||||
|     paramsSerializer: (obj) => { | ||||
|       return qs.stringify(obj); | ||||
|     }, | ||||
|   }); | ||||
| } | ||||
|  | ||||
| export function save(req: DataRecord[]) { | ||||
|   return axios.patch(`${BASE_URL}`, req); | ||||
| } | ||||
|  | ||||
| export function resetValue(params: ListParam) { | ||||
|   return axios.patch(`${BASE_URL}/value`, params); | ||||
| } | ||||
| @@ -1,51 +0,0 @@ | ||||
| import axios from 'axios'; | ||||
| import qs from 'query-string'; | ||||
|  | ||||
| const BASE_URL = '/system/dept'; | ||||
|  | ||||
| export interface DataRecord { | ||||
|   id?: number; | ||||
|   name?: string; | ||||
|   parentId?: number; | ||||
|   description?: string; | ||||
|   sort?: number; | ||||
|   status?: number; | ||||
|   isSystem?: boolean; | ||||
|   createUserString?: string; | ||||
|   createTime?: string; | ||||
|   updateUserString?: string; | ||||
|   updateTime?: string; | ||||
|   children?: Array<DataRecord>; | ||||
|   parentName?: string; | ||||
|   disabled?: boolean; | ||||
| } | ||||
|  | ||||
| export interface ListParam { | ||||
|   name?: string; | ||||
|   status?: number; | ||||
| } | ||||
|  | ||||
| export function list(params: ListParam) { | ||||
|   return axios.get<DataRecord[]>(`${BASE_URL}/tree`, { | ||||
|     params, | ||||
|     paramsSerializer: (obj) => { | ||||
|       return qs.stringify(obj); | ||||
|     }, | ||||
|   }); | ||||
| } | ||||
|  | ||||
| export function get(id: number) { | ||||
|   return axios.get<DataRecord>(`${BASE_URL}/${id}`); | ||||
| } | ||||
|  | ||||
| export function add(req: DataRecord) { | ||||
|   return axios.post(BASE_URL, req); | ||||
| } | ||||
|  | ||||
| export function update(req: DataRecord, id: number) { | ||||
|   return axios.put(`${BASE_URL}/${id}`, req); | ||||
| } | ||||
|  | ||||
| export function del(ids: number | Array<number>) { | ||||
|   return axios.delete(`${BASE_URL}/${ids}`); | ||||
| } | ||||
| @@ -1,57 +0,0 @@ | ||||
| import axios from 'axios'; | ||||
| import qs from 'query-string'; | ||||
|  | ||||
| const BASE_URL = '/system/dict/item'; | ||||
|  | ||||
| export interface DataRecord { | ||||
|   id?: number; | ||||
|   label?: string; | ||||
|   value?: string; | ||||
|   color?: string; | ||||
|   sort?: number; | ||||
|   description?: string; | ||||
|   dictId?: number; | ||||
|   createUser?: string; | ||||
|   createTime?: string; | ||||
|   updateUser?: string; | ||||
|   updateTime?: string; | ||||
|   createUserString?: string; | ||||
|   updateUserString?: string; | ||||
| } | ||||
|  | ||||
| export interface ListParam { | ||||
|   dictId?: number; | ||||
|   page?: number; | ||||
|   size?: number; | ||||
|   sort?: Array<string>; | ||||
| } | ||||
|  | ||||
| export interface ListRes { | ||||
|   list: DataRecord[]; | ||||
|   total: number; | ||||
| } | ||||
|  | ||||
| export function list(params: ListParam) { | ||||
|   return axios.get<ListRes>(`${BASE_URL}`, { | ||||
|     params, | ||||
|     paramsSerializer: (obj) => { | ||||
|       return qs.stringify(obj); | ||||
|     }, | ||||
|   }); | ||||
| } | ||||
|  | ||||
| export function get(id: number) { | ||||
|   return axios.get<DataRecord>(`${BASE_URL}/${id}`); | ||||
| } | ||||
|  | ||||
| export function add(req: DataRecord) { | ||||
|   return axios.post(BASE_URL, req); | ||||
| } | ||||
|  | ||||
| export function update(req: DataRecord, id: number) { | ||||
|   return axios.put(`${BASE_URL}/${id}`, req); | ||||
| } | ||||
|  | ||||
| export function del(ids: number | Array<number>) { | ||||
|   return axios.delete(`${BASE_URL}/${ids}`); | ||||
| } | ||||
| @@ -1,55 +0,0 @@ | ||||
| import axios from 'axios'; | ||||
| import qs from 'query-string'; | ||||
|  | ||||
| const BASE_URL = '/system/dict'; | ||||
|  | ||||
| export interface DataRecord { | ||||
|   id?: number; | ||||
|   name?: string; | ||||
|   code?: string; | ||||
|   description?: string; | ||||
|   isSystem?: boolean; | ||||
|   createUser?: string; | ||||
|   createTime?: string; | ||||
|   updateUser?: string; | ||||
|   updateTime?: string; | ||||
|   createUserString?: string; | ||||
|   updateUserString?: string; | ||||
| } | ||||
|  | ||||
| export interface ListParam { | ||||
|   name?: string; | ||||
|   page?: number; | ||||
|   size?: number; | ||||
|   sort?: Array<string>; | ||||
| } | ||||
|  | ||||
| export interface ListRes { | ||||
|   list: DataRecord[]; | ||||
|   total: number; | ||||
| } | ||||
|  | ||||
| export function list(params: ListParam) { | ||||
|   return axios.get<ListRes>(`${BASE_URL}`, { | ||||
|     params, | ||||
|     paramsSerializer: (obj) => { | ||||
|       return qs.stringify(obj); | ||||
|     }, | ||||
|   }); | ||||
| } | ||||
|  | ||||
| export function get(id: number) { | ||||
|   return axios.get<DataRecord>(`${BASE_URL}/${id}`); | ||||
| } | ||||
|  | ||||
| export function add(req: DataRecord) { | ||||
|   return axios.post(BASE_URL, req); | ||||
| } | ||||
|  | ||||
| export function update(req: DataRecord, id: number) { | ||||
|   return axios.put(`${BASE_URL}/${id}`, req); | ||||
| } | ||||
|  | ||||
| export function del(ids: number | Array<number>) { | ||||
|   return axios.delete(`${BASE_URL}/${ids}`); | ||||
| } | ||||
| @@ -1,47 +0,0 @@ | ||||
| import axios from 'axios'; | ||||
| import qs from 'query-string'; | ||||
|  | ||||
| const BASE_URL = '/system/file'; | ||||
|  | ||||
| export interface FileItem { | ||||
|   id: string; | ||||
|   name: string; | ||||
|   size: number; | ||||
|   url: string; | ||||
|   extension: string; | ||||
|   type?: string; | ||||
|   storageId?: string; | ||||
|   createUser?: string; | ||||
|   createTime?: string; | ||||
|   updateUser?: string; | ||||
|   updateTime: string; | ||||
|   createUserString?: string; | ||||
|   updateUserString?: string; | ||||
| } | ||||
|  | ||||
| export interface ListParam { | ||||
|   name?: string; | ||||
|   type?: string; | ||||
|   sort?: Array<string>; | ||||
| } | ||||
|  | ||||
| export function list(params: ListParam) { | ||||
|   return axios.get<FileItem[]>(`${BASE_URL}/list`, { | ||||
|     params, | ||||
|     paramsSerializer: (obj) => { | ||||
|       return qs.stringify(obj); | ||||
|     }, | ||||
|   }); | ||||
| } | ||||
|  | ||||
| export interface FileItemUpdate { | ||||
|   name: string; | ||||
| } | ||||
|  | ||||
| export function update(req: FileItemUpdate, id: string) { | ||||
|   return axios.put(`${BASE_URL}/${id}`, req); | ||||
| } | ||||
|  | ||||
| export function del(ids: string | Array<string>) { | ||||
|   return axios.delete(`${BASE_URL}/${ids}`); | ||||
| } | ||||
| @@ -1,57 +0,0 @@ | ||||
| import axios from 'axios'; | ||||
| import qs from 'query-string'; | ||||
|  | ||||
| const BASE_URL = '/system/menu'; | ||||
|  | ||||
| export interface DataRecord { | ||||
|   id?: number; | ||||
|   title?: string; | ||||
|   parentId?: number; | ||||
|   type?: number; | ||||
|   path?: string; | ||||
|   name?: string; | ||||
|   component?: string; | ||||
|   icon?: string; | ||||
|   isExternal?: boolean; | ||||
|   isCache?: boolean; | ||||
|   isHidden?: boolean; | ||||
|   permission?: string; | ||||
|   sort?: number; | ||||
|   status?: number; | ||||
|   createUserString?: string; | ||||
|   createTime?: string; | ||||
|   updateUserString?: string; | ||||
|   updateTime?: string; | ||||
|   children?: Array<DataRecord>; | ||||
|   parentName?: string; | ||||
| } | ||||
|  | ||||
| export interface ListParam { | ||||
|   name?: string; | ||||
|   status?: number; | ||||
| } | ||||
|  | ||||
| export function list(params: ListParam) { | ||||
|   return axios.get<DataRecord[]>(`${BASE_URL}/tree`, { | ||||
|     params, | ||||
|     paramsSerializer: (obj) => { | ||||
|       return qs.stringify(obj); | ||||
|     }, | ||||
|   }); | ||||
| } | ||||
|  | ||||
| export function get(id: number) { | ||||
|   return axios.get<DataRecord>(`${BASE_URL}/${id}`); | ||||
| } | ||||
|  | ||||
| export function add(req: DataRecord) { | ||||
|   return axios.post(BASE_URL, req); | ||||
| } | ||||
|  | ||||
| export function update(req: DataRecord, id: number) { | ||||
|   return axios.put(`${BASE_URL}/${id}`, req); | ||||
| } | ||||
|  | ||||
| export function del(ids: number | Array<number>) { | ||||
|   return axios.delete(`${BASE_URL}/${ids}`); | ||||
| } | ||||
| @@ -1,60 +0,0 @@ | ||||
| import axios from 'axios'; | ||||
| import qs from 'query-string'; | ||||
|  | ||||
| const BASE_URL = '/system/message'; | ||||
|  | ||||
| export interface DataRecord { | ||||
|   id: number; | ||||
|   title: string; | ||||
|   content: string; | ||||
|   type: number; | ||||
|   createUserString?: string; | ||||
|   createTime: string; | ||||
|   isRead: boolean; | ||||
|   readTime: string; | ||||
| } | ||||
|  | ||||
| export interface ListParam { | ||||
|   title?: string; | ||||
|   type?: number; | ||||
|   isRead?: boolean; | ||||
|   page?: number; | ||||
|   size?: number; | ||||
|   sort?: Array<string>; | ||||
| } | ||||
|  | ||||
| export interface ListRes { | ||||
|   list: DataRecord[]; | ||||
|   total: number; | ||||
| } | ||||
|  | ||||
| export function list(params: ListParam) { | ||||
|   return axios.get<ListRes>(`${BASE_URL}`, { | ||||
|     params, | ||||
|     paramsSerializer: (obj) => { | ||||
|       return qs.stringify(obj); | ||||
|     }, | ||||
|   }); | ||||
| } | ||||
|  | ||||
| export function del(ids: number | Array<number>) { | ||||
|   return axios.delete(`${BASE_URL}/${ids}`); | ||||
| } | ||||
|  | ||||
| export function read(ids: Array<number>) { | ||||
|   return axios.patch(`${BASE_URL}/read?ids=${ids}`); | ||||
| } | ||||
|  | ||||
| export interface MessageTypeUnreadRes { | ||||
|   type: number; | ||||
|   count: number; | ||||
| } | ||||
|  | ||||
| export interface MessageUnreadRes { | ||||
|   total: number; | ||||
|   details: MessageTypeUnreadRes[]; | ||||
| } | ||||
|  | ||||
| export function countUnread(detail: boolean) { | ||||
|   return axios.get<MessageUnreadRes>(`${BASE_URL}/unread?detail=${detail}`); | ||||
| } | ||||
| @@ -1,60 +0,0 @@ | ||||
| import axios from 'axios'; | ||||
| import qs from 'query-string'; | ||||
|  | ||||
| const BASE_URL = '/system/role'; | ||||
|  | ||||
| export interface DataRecord { | ||||
|   id?: number; | ||||
|   name?: string; | ||||
|   code?: string; | ||||
|   sort?: number; | ||||
|   description?: string; | ||||
|   menuIds?: Array<number>; | ||||
|   dataScope?: number; | ||||
|   deptIds?: Array<number>; | ||||
|   status?: number; | ||||
|   isSystem?: boolean; | ||||
|   createUserString?: string; | ||||
|   createTime?: string; | ||||
|   updateUserString?: string; | ||||
|   updateTime?: string; | ||||
|   disabled?: boolean; | ||||
| } | ||||
|  | ||||
| export interface ListParam { | ||||
|   name?: string; | ||||
|   status?: number; | ||||
|   page?: number; | ||||
|   size?: number; | ||||
|   sort?: Array<string>; | ||||
| } | ||||
|  | ||||
| export interface ListRes { | ||||
|   list: DataRecord[]; | ||||
|   total: number; | ||||
| } | ||||
|  | ||||
| export function list(params: ListParam) { | ||||
|   return axios.get<ListRes>(`${BASE_URL}`, { | ||||
|     params, | ||||
|     paramsSerializer: (obj) => { | ||||
|       return qs.stringify(obj); | ||||
|     }, | ||||
|   }); | ||||
| } | ||||
|  | ||||
| export function get(id: number) { | ||||
|   return axios.get<DataRecord>(`${BASE_URL}/${id}`); | ||||
| } | ||||
|  | ||||
| export function add(req: DataRecord) { | ||||
|   return axios.post(BASE_URL, req); | ||||
| } | ||||
|  | ||||
| export function update(req: DataRecord, id: number) { | ||||
|   return axios.put(`${BASE_URL}/${id}`, req); | ||||
| } | ||||
|  | ||||
| export function del(ids: number | Array<number>) { | ||||
|   return axios.delete(`${BASE_URL}/${ids}`); | ||||
| } | ||||
| @@ -1,64 +0,0 @@ | ||||
| import axios from 'axios'; | ||||
| import qs from 'query-string'; | ||||
|  | ||||
| const BASE_URL = '/system/storage'; | ||||
|  | ||||
| export interface DataRecord { | ||||
|   id?: number; | ||||
|   name?: string; | ||||
|   code?: string; | ||||
|   type?: number; | ||||
|   accessKey?: string; | ||||
|   secretKey?: string; | ||||
|   endpoint?: string; | ||||
|   bucketName?: string; | ||||
|   domain?: string; | ||||
|   description?: string; | ||||
|   isDefault?: boolean; | ||||
|   sort?: number; | ||||
|   status?: number; | ||||
|   createUser?: string; | ||||
|   createTime?: string; | ||||
|   updateUser?: string; | ||||
|   updateTime?: string; | ||||
|   createUserString?: string; | ||||
|   updateUserString?: string; | ||||
| } | ||||
|  | ||||
| export interface ListParam { | ||||
|   name?: string; | ||||
|   status?: string; | ||||
|   page?: number; | ||||
|   size?: number; | ||||
|   sort?: Array<string>; | ||||
| } | ||||
|  | ||||
| export interface PageRes<T> { | ||||
|   total: number; | ||||
|   list: T; | ||||
| } | ||||
|  | ||||
| export function list(params: ListParam) { | ||||
|   return axios.get<PageRes<DataRecord[]>>(`${BASE_URL}`, { | ||||
|     params, | ||||
|     paramsSerializer: (obj) => { | ||||
|       return qs.stringify(obj); | ||||
|     }, | ||||
|   }); | ||||
| } | ||||
|  | ||||
| export function get(id: number) { | ||||
|   return axios.get<DataRecord>(`${BASE_URL}/${id}`); | ||||
| } | ||||
|  | ||||
| export function add(req: DataRecord) { | ||||
|   return axios.post(BASE_URL, req); | ||||
| } | ||||
|  | ||||
| export function update(req: DataRecord, id: number) { | ||||
|   return axios.put(`${BASE_URL}/${id}`, req); | ||||
| } | ||||
|  | ||||
| export function del(ids: number | Array<number>) { | ||||
|   return axios.delete(`${BASE_URL}/${ids}`); | ||||
| } | ||||
| @@ -1,86 +0,0 @@ | ||||
| import axios from 'axios'; | ||||
|  | ||||
| const BASE_URL = '/system/user'; | ||||
|  | ||||
| export interface BasicInfoModel { | ||||
|   username: string; | ||||
|   nickname: string; | ||||
|   gender: number; | ||||
| } | ||||
|  | ||||
| export interface AvatarRes { | ||||
|   avatar: string; | ||||
| } | ||||
|  | ||||
| export interface cropperOptions { | ||||
|   autoCrop: boolean; // 是否默认生成截图框 | ||||
|   autoCropWidth: number; // 默认生成截图框宽度 | ||||
|   autoCropHeight: number; // 默认生成截图框高度 | ||||
|   canMove: boolean; // 上传图片是否可以移动  (默认:true) | ||||
|   centerBox: boolean; // 截图框是否被限制在图片里面  (默认:false) | ||||
|   full: boolean; // 是否输出原图比例的截图 选true生成的图片会非常大  (默认:false) | ||||
|   fixed: boolean; // 是否开启截图框宽高固定比例  (默认:false) | ||||
|   fixedBox: boolean; // 固定截图框大小 不允许改变 | ||||
|   img: string | ArrayBuffer | null; // 裁剪图片的地址 | ||||
|   outputSize: number; // 裁剪生成图片的质量  (默认:1) | ||||
|   outputType: string; // 默认生成截图为PNG格式 | ||||
| } | ||||
|  | ||||
| export function uploadAvatar(data: FormData) { | ||||
|   return axios.post<AvatarRes>(`${BASE_URL}/avatar`, data); | ||||
| } | ||||
|  | ||||
| export interface UserBasicInfoUpdateReq { | ||||
|   nickname: string; | ||||
|   gender: number; | ||||
| } | ||||
|  | ||||
| export function updateBasicInfo(req: UserBasicInfoUpdateReq) { | ||||
|   return axios.patch(`${BASE_URL}/basic/info`, req); | ||||
| } | ||||
|  | ||||
| export interface UserPasswordUpdateReq { | ||||
|   oldPassword: string; | ||||
|   newPassword: string; | ||||
| } | ||||
|  | ||||
| export function updatePassword(req: UserPasswordUpdateReq) { | ||||
|   return axios.patch(`${BASE_URL}/password`, req); | ||||
| } | ||||
|  | ||||
| export interface UserPhoneUpdateReq { | ||||
|   newPhone: string; | ||||
|   captcha: string; | ||||
|   currentPassword: string; | ||||
| } | ||||
|  | ||||
| export function updatePhone(req: UserPhoneUpdateReq) { | ||||
|   return axios.patch(`${BASE_URL}/phone`, req); | ||||
| } | ||||
|  | ||||
| export interface UserEmailUpdateReq { | ||||
|   newEmail: string; | ||||
|   captcha: string; | ||||
|   currentPassword: string; | ||||
| } | ||||
|  | ||||
| export function updateEmail(req: UserEmailUpdateReq) { | ||||
|   return axios.patch(`${BASE_URL}/email`, req); | ||||
| } | ||||
|  | ||||
| export interface UserSocialBindRecord { | ||||
|   source: string; | ||||
|   description: string; | ||||
| } | ||||
|  | ||||
| export function listSocial() { | ||||
|   return axios.get<UserSocialBindRecord[]>(`${BASE_URL}/social`); | ||||
| } | ||||
|  | ||||
| export function bindSocial(source: string, req: any) { | ||||
|   return axios.post(`${BASE_URL}/social/${source}`, req); | ||||
| } | ||||
|  | ||||
| export function unbindSocial(source: string) { | ||||
|   return axios.delete(`${BASE_URL}/social/${source}`); | ||||
| } | ||||
| @@ -1,77 +0,0 @@ | ||||
| import axios from 'axios'; | ||||
| import qs from 'query-string'; | ||||
|  | ||||
| const BASE_URL = '/system/user'; | ||||
|  | ||||
| export interface DataRecord { | ||||
|   id?: number; | ||||
|   username?: string; | ||||
|   nickname?: string; | ||||
|   gender?: number; | ||||
|   email?: string; | ||||
|   phone?: string; | ||||
|   description?: string; | ||||
|   status?: number; | ||||
|   isSystem?: boolean; | ||||
|   pwdResetTime?: string; | ||||
|   createUserString?: string; | ||||
|   createTime?: string; | ||||
|   updateUserString?: string; | ||||
|   updateTime?: string; | ||||
|   deptId?: number; | ||||
|   deptName?: string; | ||||
|   roleIds?: Array<number>; | ||||
|   roleNames?: Array<string>; | ||||
|   disabled?: boolean; | ||||
| } | ||||
|  | ||||
| export interface ListParam { | ||||
|   username?: string; | ||||
|   status?: number; | ||||
|   createTime?: Array<string>; | ||||
|   page?: number; | ||||
|   size?: number; | ||||
|   sort?: Array<string>; | ||||
| } | ||||
|  | ||||
| export interface ListRes { | ||||
|   list: DataRecord[]; | ||||
|   total: number; | ||||
| } | ||||
|  | ||||
| export function list(params: ListParam) { | ||||
|   return axios.get<ListRes>(`${BASE_URL}`, { | ||||
|     params, | ||||
|     paramsSerializer: (obj) => { | ||||
|       return qs.stringify(obj); | ||||
|     }, | ||||
|   }); | ||||
| } | ||||
|  | ||||
| export function get(id: number) { | ||||
|   return axios.get<DataRecord>(`${BASE_URL}/${id}`); | ||||
| } | ||||
|  | ||||
| export function add(req: DataRecord) { | ||||
|   return axios.post(BASE_URL, req); | ||||
| } | ||||
|  | ||||
| export function update(req: DataRecord, id: number) { | ||||
|   return axios.put(`${BASE_URL}/${id}`, req); | ||||
| } | ||||
|  | ||||
| export function del(ids: number | Array<number>) { | ||||
|   return axios.delete(`${BASE_URL}/${ids}`); | ||||
| } | ||||
|  | ||||
| export function resetPassword(id: number) { | ||||
|   return axios.patch(`${BASE_URL}/${id}/password`); | ||||
| } | ||||
|  | ||||
| export interface UpdateUserRoleReq { | ||||
|   roleIds?: Array<number>; | ||||
| } | ||||
|  | ||||
| export function updateUserRole(req: UpdateUserRoleReq, id: number) { | ||||
|   return axios.patch(`${BASE_URL}/${id}/role`, req); | ||||
| } | ||||
| @@ -1,92 +0,0 @@ | ||||
| import axios from 'axios'; | ||||
| import qs from 'query-string'; | ||||
|  | ||||
| const BASE_URL = '/tool/generator'; | ||||
|  | ||||
| export interface TableRecord { | ||||
|   tableName: string; | ||||
|   comment?: string; | ||||
|   engine: string; | ||||
|   charset: string; | ||||
|   createTime?: string; | ||||
|   isConfiged: boolean; | ||||
| } | ||||
|  | ||||
| export interface TableParam { | ||||
|   tableName?: string; | ||||
| } | ||||
|  | ||||
| export interface TableListRes { | ||||
|   list: TableRecord[]; | ||||
|   total: number; | ||||
| } | ||||
|  | ||||
| export function listTable(params: TableParam) { | ||||
|   return axios.get<TableListRes>(`${BASE_URL}/table`, { | ||||
|     params, | ||||
|     paramsSerializer: (obj) => { | ||||
|       return qs.stringify(obj); | ||||
|     }, | ||||
|   }); | ||||
| } | ||||
|  | ||||
| export interface FieldConfigRecord { | ||||
|   tableName: string; | ||||
|   columnName: string; | ||||
|   columnType: string; | ||||
|   fieldName: string; | ||||
|   fieldType: string; | ||||
|   comment: string; | ||||
|   isRequired: boolean; | ||||
|   showInList: boolean; | ||||
|   showInForm: boolean; | ||||
|   showInQuery: boolean; | ||||
|   formType: string; | ||||
|   queryType: string; | ||||
|   createTime?: string; | ||||
| } | ||||
|  | ||||
| export function listFieldConfig(tableName: string, requireSync: boolean) { | ||||
|   return axios.get<FieldConfigRecord[]>( | ||||
|     `${BASE_URL}/field/${tableName}?requireSync=${requireSync}`, | ||||
|   ); | ||||
| } | ||||
|  | ||||
| export interface GenConfigRecord { | ||||
|   tableName: string; | ||||
|   moduleName: string; | ||||
|   packageName: string; | ||||
|   frontendPath: string; | ||||
|   businessName: string; | ||||
|   author: string; | ||||
|   tablePrefix: string; | ||||
|   isOverride: boolean; | ||||
|   createTime?: string; | ||||
|   updateTime?: string; | ||||
| } | ||||
|  | ||||
| export function getGenConfig(tableName: string) { | ||||
|   return axios.get<GenConfigRecord>(`${BASE_URL}/config/${tableName}`); | ||||
| } | ||||
|  | ||||
| export interface GeneratorConfigRecord { | ||||
|   genConfig: GenConfigRecord; | ||||
|   fieldConfigs: FieldConfigRecord[]; | ||||
| } | ||||
|  | ||||
| export function saveConfig(tableName: string, req: GeneratorConfigRecord) { | ||||
|   return axios.post(`${BASE_URL}/config/${tableName}`, req); | ||||
| } | ||||
|  | ||||
| export interface GeneratePreviewRecord { | ||||
|   fileName: string; | ||||
|   content: string; | ||||
| } | ||||
|  | ||||
| export function preview(tableName: string) { | ||||
|   return axios.get<GeneratePreviewRecord[]>(`${BASE_URL}/preview/${tableName}`); | ||||
| } | ||||
|  | ||||
| export function generate(tableName: string) { | ||||
|   return axios.post(`${BASE_URL}/${tableName}`); | ||||
| } | ||||
| Before Width: | Height: | Size: 12 KiB | 
| Before Width: | Height: | Size: 8.8 KiB | 
| Before Width: | Height: | Size: 9.2 KiB | 
| Before Width: | Height: | Size: 13 KiB | 
| @@ -1 +0,0 @@ | ||||
| <svg width="24" height="24" viewBox="0 0 48 48" fill="none" stroke="currentColor"><path fill-rule="evenodd" clip-rule="evenodd" d="M43 42a1 1 0 011 1v2a1 1 0 01-1 1H29a1 1 0 01-1-1v-2a1 1 0 011-1h14zM24.05 26a1 1 0 01.993.883l.007.117v2a1 1 0 01-.884.993L24.05 30H16c-3.73 0-6.86 2.55-7.75 6a8.294 8.294 0 00-.24 1.588L8 38v2h16.05a1 1 0 01.993.883l.007.117v2a1 1 0 01-.884.993L24.05 44H6a2.003 2.003 0 01-1.994-1.85L4 42v-4c0-6.525 5.206-11.834 11.695-11.996L16 26h8.05zM43 34a1 1 0 011 1v2a1 1 0 01-1 1H29a1 1 0 01-1-1v-2a1 1 0 011-1h14zm0-8a1 1 0 011 1v2a1 1 0 01-1 1H29a1 1 0 01-1-1v-2a1 1 0 011-1h14zM21 3c5.52 0 10 4.477 10 10s-4.48 10-10 10-10-4.477-10-10S15.48 3 21 3zm0 4c-3.31 0-6 2.686-6 6s2.69 6 6 6 6-2.686 6-6-2.69-6-6-6z" fill="currentColor"/></svg> | ||||
| Before Width: | Height: | Size: 764 B | 
| @@ -1 +0,0 @@ | ||||
| <svg width="48" height="48" viewBox="0 0 32 32" fill="currentColor"><path fill-rule="evenodd" clip-rule="evenodd" d="M25.947 7.967a.835.835 0 00-1.17-.764L6.378 15.28a.665.665 0 01-.534-1.218l18.397-8.077a2.165 2.165 0 013.035 1.982v15.508a2.165 2.165 0 01-2.952 2.017L5.87 18.29a.665.665 0 01.484-1.239l18.455 7.202a.835.835 0 001.138-.778V7.967z" fill="currentColor"/><path fill-rule="evenodd" clip-rule="evenodd" d="M18.407 23.399a4.665 4.665 0 01-8.672-3.444l.038-.096a.665.665 0 111.236.491l-.038.096a3.335 3.335 0 006.2 2.462l.037-.096a.665.665 0 011.237.491l-.038.096zM5.734 11.306c.368 0 .665.297.665.665v8.5a.665.665 0 01-1.33 0v-8.5c0-.368.298-.665.665-.665z" fill="currentColor"/></svg> | ||||
| Before Width: | Height: | Size: 697 B | 
| @@ -1 +0,0 @@ | ||||
| <svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="4"><path d="M44 9H4m38 20H6m28-10H14m20 20H14"/></svg> | ||||
| Before Width: | Height: | Size: 127 B | 
| @@ -1 +0,0 @@ | ||||
| <svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="4"><path d="M44 9H4m36 20H4m21-10H4m21 20H4"/></svg> | ||||
| Before Width: | Height: | Size: 125 B | 
| @@ -1 +0,0 @@ | ||||
| <svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="4"><path d="M4 9h40M8 29h36M23 19h21M23 39h21"/></svg> | ||||
| Before Width: | Height: | Size: 127 B | 
| @@ -1 +0,0 @@ | ||||
| <svg width="48" height="48" viewBox="0 0 48 48" fill="currentColor"><path fill-rule="evenodd" clip-rule="evenodd" d="M25.657 3.69l.168.113L35.783 11H42a2 2 0 012 2v28a2 2 0 01-2 2H6a2 2 0 01-2-2V13a2 2 0 012-2h6.352l9.958-7.197a3 3 0 013.347-.114zM40 15H8v24h32V15zM25 30a1 1 0 00-1-1H13a1 1 0 00-1 1v2a1 1 0 001 1h11a1 1 0 001-1v-2zm10-9a1 1 0 011 1v2a1 1 0 01-1 1H13a1 1 0 01-1-1v-2a1 1 0 011-1h22zM19.18 11l4.888-3.532L28.954 11H19.18z" fill="currentColor"/></svg> | ||||
| Before Width: | Height: | Size: 467 B | 
| @@ -1 +0,0 @@ | ||||
| <svg width="48" height="48" viewBox="0 0 28 28" fill="currentColor"><path fill-rule="evenodd" clip-rule="evenodd" d="M16.333 5.333a6 6 0 00-3.246 11.047c-2.308.562-4.32 1.746-6.025 3.548a2.667 2.667 0 00-.729 1.832v1.073l.006.165a2.5 2.5 0 002.494 2.335h7.642l.099-.007A.667.667 0 0016.475 24H8.833l-.127-.007a1.167 1.167 0 01-1.04-1.16V21.76l.009-.145c.031-.287.156-.558.356-.77 2.217-2.346 4.988-3.512 8.354-3.512h.026a6 6 0 00-.078-12zm0 1.334a4.667 4.667 0 110 9.333 4.667 4.667 0 010-9.333zm8.714 12.214a.667.667 0 00-1.008-.868l-4.1 4.1-2.138-2.139-.075-.064a.667.667 0 00-.868 1.007l2.61 2.61a.667.667 0 00.943 0l4.571-4.571.065-.075z" fill="currentColor"/></svg> | ||||
| Before Width: | Height: | Size: 670 B | 
| @@ -1 +0,0 @@ | ||||
| <svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="4"><path stroke="#4E5969" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" d="M7 7h13v13H7zM28 7h13v13H28zM7 28h13v13H7zM28 28h13v13H28z"/></svg> | ||||
| Before Width: | Height: | Size: 233 B | 
| @@ -1 +0,0 @@ | ||||
| <svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="4"><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> | ||||
| Before Width: | Height: | Size: 217 B | 
| @@ -1 +0,0 @@ | ||||
| <svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="4"><path d="M11.27 27.728l12.728 12.728 12.728-12.728M24 5v34.295"/></svg> | ||||
| Before Width: | Height: | Size: 147 B | 
| @@ -1 +0,0 @@ | ||||
| <svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="4"><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="4" d="M22 6h4v26h-4z"/><path fill="#4E5969" d="M22 6h4v26h-4z"/></svg> | ||||
| Before Width: | Height: | Size: 351 B | 
| @@ -1 +0,0 @@ | ||||
| <svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="4"><path d="M20.272 11.27L7.544 23.998l12.728 12.728M43 24H8.705"/></svg> | ||||
| Before Width: | Height: | Size: 146 B | 
| @@ -1 +0,0 @@ | ||||
| <svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="4"><path d="M27.728 11.27l12.728 12.728-12.728 12.728M5 24h34.295"/></svg> | ||||
| Before Width: | Height: | Size: 147 B | 
| @@ -1 +0,0 @@ | ||||
| <svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="4"><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="4" d="M26 42h-4V16h4z"/><path fill="#4E5969" d="M26 42h-4V16h4z"/></svg> | ||||
| Before Width: | Height: | Size: 350 B | 
| @@ -1 +0,0 @@ | ||||
| <svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="4"><path d="M11.27 20.272L23.998 7.544l12.728 12.728M24 43V8.705"/></svg> | ||||
| Before Width: | Height: | Size: 146 B | 
| @@ -1 +0,0 @@ | ||||
| <svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="4"><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> | ||||
| Before Width: | Height: | Size: 261 B | 
| @@ -1 +0,0 @@ | ||||
| <svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="4"><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> | ||||
| Before Width: | Height: | Size: 402 B | 
| @@ -1 +0,0 @@ | ||||
| <svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="4"><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> | ||||
| Before Width: | Height: | Size: 335 B | 
| @@ -1 +0,0 @@ | ||||
| <svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="4"><path d="M41 7H29v34h12V7ZM29 18H18v23h11V18ZM18 29H7v12h11V29Z"></path></svg> | ||||
| Before Width: | Height: | Size: 154 B | 
| @@ -1 +0,0 @@ | ||||
| <svg width="24" height="24" viewBox="0 0 48 48" fill="currentColor"><path fill-rule="evenodd" clip-rule="evenodd" d="M23.5 5C33.717 5 42 13.283 42 23.5c0 4.388-1.528 8.42-4.08 11.59l5.808 5.81a1 1 0 010 1.414l-1.414 1.414a1 1 0 01-1.414 0l-5.81-5.808A18.422 18.422 0 0123.5 42C13.283 42 5 33.717 5 23.5S13.283 5 23.5 5zm0 4C15.492 9 9 15.492 9 23.5S15.492 38 23.5 38 38 31.508 38 23.5 31.508 9 23.5 9zm7.832 6.391l1.732 1a1 1 0 01.366 1.366l-5.5 9.526a1 1 0 01-1.261.419l-.105-.053-5.196-3-4 6.928a1 1 0 01-1.366.366l-1.732-1a1 1 0 01-.366-1.366l5.5-9.526a1 1 0 011.366-.366l5.196 3 4-6.928a1 1 0 011.366-.366z" fill="currentColor"/></svg> | ||||
| Before Width: | Height: | Size: 639 B | 
| @@ -1 +0,0 @@ | ||||
| <svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="4"><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> | ||||
| Before Width: | Height: | Size: 482 B | 
| @@ -1 +0,0 @@ | ||||
| <svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="4"><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> | ||||
| Before Width: | Height: | Size: 185 B | 
| @@ -1 +0,0 @@ | ||||
| <svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="4"><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="4" stroke-linejoin="round"/></svg> | ||||
| Before Width: | Height: | Size: 268 B | 
| @@ -1 +0,0 @@ | ||||
| <svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="4"><path d="M16 16h16M16 24h8"></path><path d="M24 41H8V6h32v17"></path><path d="M30 29h11v13l-5.5-3.5L30 42V29Z"/></svg> | ||||
| Before Width: | Height: | Size: 194 B | 
| @@ -1 +0,0 @@ | ||||
| <svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="4"><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> | ||||
| Before Width: | Height: | Size: 227 B | 
| @@ -1 +0,0 @@ | ||||
| <svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="4"><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> | ||||
| Before Width: | Height: | Size: 273 B | 
| @@ -1 +0,0 @@ | ||||
| <svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="4"><path d="M35 27h8M5 27h8m0-9h22v13c0 6.075-4.925 11-11 11s-11-4.925-11-11V18z" stroke="#4E5969" stroke-width="4" 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="4" stroke-linejoin="round"/></svg> | ||||
| Before Width: | Height: | Size: 428 B | 
| @@ -1 +0,0 @@ | ||||
| <svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="4"><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> | ||||
| Before Width: | Height: | Size: 329 B | 
| @@ -1 +0,0 @@ | ||||
| <svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="4"><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> | ||||
| Before Width: | Height: | Size: 183 B | 
| @@ -1 +0,0 @@ | ||||
| <svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="4"><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> | ||||
| Before Width: | Height: | Size: 297 B | 
| @@ -1 +0,0 @@ | ||||
| <svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="4"><path d="M6 13a1 1 0 011-1h34a1 1 0 011 1v26a1 1 0 01-1 1H7a1 1 0 01-1-1V13z"/><path d="M31 26a7 7 0 11-14 0 7 7 0 0114 0zM33 12l-1.862-3.724A.5.5 0 0030.691 8H17.309a.5.5 0 00-.447.276L15 12"/></svg> | ||||
| Before Width: | Height: | Size: 276 B | 
| @@ -1 +0,0 @@ | ||||
| <svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="4"><path d="M24.937 34.829a1.2 1.2 0 01-1.874 0L9.56 17.949C8.93 17.165 9.49 16 10.497 16h27.006c1.007 0 1.566 1.164.937 1.95L24.937 34.829z" fill="#4E5969"/></svg> | ||||
| Before Width: | Height: | Size: 237 B | 
| @@ -1 +0,0 @@ | ||||
| <svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="4"><path d="M13.171 24.937a1.2 1.2 0 010-1.874L30.051 9.56c.785-.629 1.949-.07 1.949.937v27.006c0 1.007-1.164 1.566-1.95.937L13.171 24.937z" fill="#4E5969"/></svg> | ||||
| Before Width: | Height: | Size: 236 B | 
| @@ -1 +0,0 @@ | ||||
| <svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="4"><path d="M34.829 23.063c.6.48.6 1.394 0 1.874L17.949 38.44c-.785.629-1.949.07-1.949-.937V10.497c0-1.006 1.164-1.566 1.95-.937l16.879 13.503z" fill="#4E5969"/></svg> | ||||
| Before Width: | Height: | Size: 240 B | 
| @@ -1 +0,0 @@ | ||||
| <svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="4"><path d="M23.063 13.171a1.2 1.2 0 011.874 0l13.503 16.88c.629.785.07 1.949-.937 1.949H10.497c-1.006 0-1.566-1.164-.937-1.95l13.503-16.879z" fill="#4E5969"/></svg> | ||||
| Before Width: | Height: | Size: 238 B | 
| @@ -1 +0,0 @@ | ||||
| <svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="4"><path d="M42 24c0 9.941-8.059 18-18 18S6 33.941 6 24 14.059 6 24 6s18 8.059 18 18z" fill="#4E5969"/><path d="M15 22l7 7 11.5-11.5" stroke="#fff" stroke-width="4"/></svg> | ||||
| Before Width: | Height: | Size: 245 B | 
| @@ -1 +0,0 @@ | ||||
| <svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="4"><path d="M42 24c0 9.941-8.059 18-18 18S6 33.941 6 24 14.059 6 24 6s18 8.059 18 18z"/><path d="M15 22l7 7 11.5-11.5"/></svg> | ||||
| Before Width: | Height: | Size: 199 B |