├── .dockerignore ├── .editorconfig ├── .eslintrc.json ├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request.md └── workflows │ ├── build-rc.yml │ └── build-stable.yml ├── .gitignore ├── .prettierrc.js ├── Dockerfile ├── LICENSE ├── README.md ├── bootstrap.js ├── docs ├── sample │ ├── config.local.ts │ └── docker-compose.yml ├── 权限管理数据库设计文档.md └── 通用协作规范.md ├── favicon.ico ├── package.json ├── sql └── init.sql ├── src ├── common │ ├── error_constants.ts │ └── utils.ts ├── config │ ├── config.default.ts │ ├── config.prod.ts │ ├── config.unittest.ts │ └── plugin.ts ├── configuration.ts ├── controller │ ├── admin │ │ ├── comm │ │ │ ├── account.ts │ │ │ └── login.ts │ │ ├── swagger.ts │ │ └── sys │ │ │ ├── dept.ts │ │ │ ├── log.ts │ │ │ ├── menu.ts │ │ │ ├── online.ts │ │ │ ├── role.ts │ │ │ ├── task.ts │ │ │ └── user.ts │ └── base.ts ├── dto │ ├── admin │ │ ├── file │ │ │ └── space.ts │ │ ├── sys │ │ │ ├── dept.ts │ │ │ ├── log.ts │ │ │ ├── menu.ts │ │ │ ├── online.ts │ │ │ ├── role.ts │ │ │ ├── task.ts │ │ │ └── user.ts │ │ └── verify.ts │ └── comm.ts ├── entity │ ├── admin │ │ └── sys │ │ │ ├── department.ts │ │ │ ├── login_log.ts │ │ │ ├── menu.ts │ │ │ ├── req_log.ts │ │ │ ├── role.ts │ │ │ ├── role_department.ts │ │ │ ├── role_menu.ts │ │ │ ├── task.ts │ │ │ ├── task_log.ts │ │ │ ├── user.ts │ │ │ └── user_role.ts │ └── base.ts ├── interface.ts ├── middleware │ ├── admin_auth.ts │ ├── admin_req_log.ts │ └── execption.ts ├── service │ ├── admin │ │ ├── comm │ │ │ └── verify.ts │ │ ├── interface.ts │ │ └── sys │ │ │ ├── dept.ts │ │ │ ├── login_log.ts │ │ │ ├── menu.ts │ │ │ ├── online.ts │ │ │ ├── req_log.ts │ │ │ ├── role.ts │ │ │ ├── task.ts │ │ │ ├── task_log.ts │ │ │ └── user.ts │ ├── base.ts │ ├── common │ │ ├── amap │ │ │ ├── interface.ts │ │ │ └── web.ts │ │ └── mailer │ │ │ └── nodemailer.ts │ └── subscribe │ │ ├── index.ts │ │ └── interface.ts └── task │ └── sys-task.ts ├── test └── controller │ └── api.test.ts └── tsconfig.json /.dockerignore: -------------------------------------------------------------------------------- 1 | logs/ 2 | npm-debug.log 3 | yarn-error.log 4 | node_modules/ 5 | package-lock.json 6 | yarn.lock 7 | coverage/ 8 | dist/ 9 | .idea/ 10 | run/ 11 | .DS_Store 12 | *.sw* 13 | *.un~ 14 | .tsbuildinfo 15 | .tsbuildinfo.* 16 | 17 | src/config/config.local.* 18 | 19 | typings/* 20 | 21 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # 🎨 editorconfig.org 2 | 3 | root = true 4 | 5 | [*] 6 | charset = utf-8 7 | end_of_line = lf 8 | indent_style = space 9 | indent_size = 2 10 | trim_trailing_whitespace = true 11 | insert_final_newline = true -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./node_modules/mwts/", 3 | "ignorePatterns": [ 4 | "node_modules", 5 | "dist", 6 | "test", 7 | "jest.config.js", 8 | "typings" 9 | ], 10 | "rules": { 11 | // disable the rule for all files 12 | // "@typescript-eslint/explicit-module-boundary-types": "off", 13 | "node/no-extraneous-import": "off" 14 | }, 15 | "env": { 16 | "jest": true 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report(报告问题) 3 | about: Create a report to help us improve 4 | --- 5 | 10 | 11 | 12 | ## Bug report(问题描述) 13 | 14 | #### Steps to reproduce(问题复现步骤) 15 | 20 | 21 | #### Screenshot or Gif(截图或动态图) 22 | 23 | 24 | #### Link to minimal reproduction(最小可在线还原demo) 25 | 26 | 29 | 30 | #### Other relevant information(格外信息) 31 | - Your OS: 32 | - Node.js version: 33 | - Mysql version: 34 | - Redis version: 35 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature Request(新功能建议) 3 | about: Suggest an idea for this project 4 | --- 5 | 6 | ## Feature request(新功能建议) 7 | 8 | -------------------------------------------------------------------------------- /.github/workflows/build-rc.yml: -------------------------------------------------------------------------------- 1 | name: Build RC Image 2 | 3 | on: 4 | create: 5 | tags: 6 | - '*' 7 | 8 | jobs: 9 | docker: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - 13 | name: Set up QEMU 14 | uses: docker/setup-qemu-action@v1 15 | - 16 | name: Set up Docker Buildx 17 | uses: docker/setup-buildx-action@v1 18 | - 19 | name: Login to DockerHub 20 | uses: docker/login-action@v1 21 | with: 22 | username: ${{ secrets.DOCKERHUB_USERNAME }} 23 | password: ${{ secrets.DOCKERHUB_TOKEN }} 24 | - 25 | name: Build and push 26 | id: docker_build 27 | uses: docker/build-push-action@v2 28 | with: 29 | push: true 30 | tags: ${{ secrets.DOCKERHUB_USERNAME }}/sfmidwayadmin:rc 31 | - 32 | name: Image digest 33 | run: echo ${{ steps.docker_build.outputs.digest }} 34 | -------------------------------------------------------------------------------- /.github/workflows/build-stable.yml: -------------------------------------------------------------------------------- 1 | name: Build Stable Image 2 | 3 | on: 4 | push: 5 | branches: 6 | - 'main' 7 | 8 | jobs: 9 | docker: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - 13 | name: Set up QEMU 14 | uses: docker/setup-qemu-action@v1 15 | - 16 | name: Set up Docker Buildx 17 | uses: docker/setup-buildx-action@v1 18 | - 19 | name: Login to DockerHub 20 | uses: docker/login-action@v1 21 | with: 22 | username: ${{ secrets.DOCKERHUB_USERNAME }} 23 | password: ${{ secrets.DOCKERHUB_TOKEN }} 24 | - 25 | name: Build and push 26 | id: docker_build 27 | uses: docker/build-push-action@v2 28 | with: 29 | push: true 30 | tags: ${{ secrets.DOCKERHUB_USERNAME }}/sfmidwayadmin:stable 31 | - 32 | name: Image digest 33 | run: echo ${{ steps.docker_build.outputs.digest }} 34 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | logs/ 2 | npm-debug.log 3 | yarn-error.log 4 | node_modules/ 5 | package-lock.json 6 | yarn.lock 7 | coverage/ 8 | dist/ 9 | .idea/ 10 | run/ 11 | .DS_Store 12 | *.sw* 13 | *.un~ 14 | .tsbuildinfo 15 | .tsbuildinfo.* 16 | 17 | src/config/config.local.* 18 | docs/sample/mysql/ 19 | 20 | typings/* 21 | 22 | -------------------------------------------------------------------------------- /.prettierrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | ...require('mwts/.prettierrc.json') 3 | } 4 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:lts-alpine as builder 2 | WORKDIR /sf-midway-admin 3 | # set timezone 4 | RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 5 | RUN echo 'Asia/Shanghai' > /etc/timezone 6 | 7 | # RUN npm set registry https://registry.npm.taobao.org 8 | # cache step 9 | COPY package.json /sf-midway-admin/package.json 10 | RUN npm install 11 | # build 12 | COPY ./ /sf-midway-admin 13 | RUN npm run build 14 | # clean dev dep 15 | RUN rm -rf node_modules && rm package-lock.json 16 | RUN npm install --production 17 | 18 | # bootstrap set port 19 | EXPOSE 7001 20 | 21 | CMD ["npm", "run", "start_no_daemon"] 22 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021-present Changyuan Yang 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # sf-midway-admin 2 | 3 | ![](https://img.shields.io/github/commit-activity/m/hackycy/sf-midway-admin) ![](https://img.shields.io/github/license/hackycy/sf-midway-admin) ![](https://img.shields.io/github/repo-size/hackycy/sf-midway-admin) ![](https://img.shields.io/github/languages/top/hackycy/sf-midway-admin) 4 | 5 | **基于MidwayJs + TypeScript + TypeORM + Redis + MySql + Vue + Element-UI编写的一款简单高效的前后端分离的权限管理系统。希望这个项目在全栈的路上能够帮助到你。** 6 | 7 | - 使用文档:[https://blog.si-yee.com/sf-admin-cli/](https://blog.si-yee.com/sf-admin-cli/) 8 | - 演示站点:[http://opensource.admin.si-yee.com](http://opensource.admin.si-yee.com/) 9 | 10 | 演示环境账号密码: 11 | 12 | | 账号 | 密码 | 权限 | 13 | | :----------: | :----: | :----------------------: | 14 | | openadmin | 123456 | 仅只有各个功能的查询权限 | 15 | | monitoradmin | 123456 | 系统监控页面及按钮权限 | 16 | 17 | > 所有新建的用户初始密码都为123456 18 | 19 | # 欢迎Star && PR 20 | 21 | **如果项目有帮助到你可以点个Star支持下。有更好的实现欢迎PR。** 22 | 23 | # LICENSE 24 | 25 | [MIT](LICENSE) 26 | -------------------------------------------------------------------------------- /bootstrap.js: -------------------------------------------------------------------------------- 1 | const WebFramework = require('@midwayjs/web').Framework; 2 | const web = new WebFramework().configure({ 3 | port: 7001, 4 | }); 5 | 6 | const { Bootstrap } = require('@midwayjs/bootstrap'); 7 | Bootstrap.load(web).run(); 8 | -------------------------------------------------------------------------------- /docs/sample/config.local.ts: -------------------------------------------------------------------------------- 1 | import { EggAppConfig, PowerPartial } from 'egg'; 2 | const redisStore = require('cache-manager-ioredis'); 3 | 4 | export default (): any => { 5 | const config: PowerPartial = {}; 6 | 7 | /** 8 | * 邮件推送配置 9 | */ 10 | config.mailer = { 11 | host: 'xxx host', 12 | port: 80, 13 | auth: { 14 | user: 'xxx@qq.com', 15 | pass: 'xxxxxxx', 16 | }, 17 | secure: false, 18 | }; 19 | 20 | // 高德开放平台应用Key 21 | config.amap = { 22 | key: 'xxxxxxxxxxxxxxxxxxxxx', 23 | }; 24 | 25 | // bull config 26 | config.bull = { 27 | default: { 28 | redis: { 29 | port: 6379, 30 | host: '127.0.0.1', 31 | password: '123456', 32 | db: 0, 33 | }, 34 | prefix: 'admin:task', 35 | }, 36 | }; 37 | 38 | // Root角色对应ID 39 | config.rootRoleId = 1; 40 | 41 | /** 42 | * typeorm 配置 43 | * 文档:https://www.yuque.com/midwayjs/midway_v2/orm#njH6J 44 | */ 45 | config.orm = { 46 | type: 'mysql', 47 | host: '127.0.0.1', 48 | port: 3306, 49 | username: 'root', 50 | password: '123456', 51 | database: 'sf-admin', 52 | synchronize: false, 53 | logging: true, 54 | // timezone: '+00:00', 55 | /** 56 | * JavaScript对数据库中int和bigint的区别对待: 57 | * 刚开始开发中,线下测试数据库id字段采用int,数据库SELECT操作返回的结果是Number,但是使用bigint,数据库返回的为String, 58 | * 初步猜想是因为bigint的值范围会超过Number,所以采用String。但是这样会对我们业务产生巨大影戏那个,一方面,DTO校验会无法通过,另一方面,问题1中的业务逻辑会受影响。 59 | * 经过查找各方文档,解决方案是在数据库连接配置中配置: 60 | * "supportBigNumbers": false 61 | * 可以配置这个的原因是我们的业务ID距离Number的上线远远达不到,所以可以用这种方式让 62 | * bigint也返回Number。 63 | * 但是这样配置,TypeOrm插入操作的返回值中的identifiers字段中的id还是String,所以问题1中的处理方式也要对String进行parseInt操作。 64 | */ 65 | // supportBigNumbers: false, 66 | }; 67 | 68 | // midway cache 69 | config.cache = { 70 | store: redisStore, 71 | options: { 72 | host: '127.0.0.1', // default value 73 | port: 6379, // default value 74 | password: '123456', 75 | db: 0, 76 | ttl: 60, 77 | }, 78 | }; 79 | 80 | return config; 81 | }; 82 | -------------------------------------------------------------------------------- /docs/sample/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "2.0" 2 | 3 | services: 4 | 5 | db: 6 | image: mysql:5.7.34 7 | command: --default-authentication-plugin=mysql_native_password 8 | restart: always 9 | volumes: 10 | - ./mysql:/var/lib/mysql/ # ./mysql路径可以替换成自己的路径 11 | - ../../sql/:/docker-entrypoint-initdb.d/ # 初始化的脚本 12 | ports: 13 | - 3306:3306 14 | environment: 15 | TZ: Asia/Shanghai 16 | MYSQL_ROOT_PASSWORD: 123456 17 | MYSQL_DATABASE: sf-admin 18 | MYSQL_USER: sf-admin 19 | MYSQL_PASSWORD: 123456 20 | 21 | redis: 22 | image: redis:alpine 23 | command: --requirepass "123456" 24 | restart: always 25 | ports: 26 | - 6379:6379 27 | environment: 28 | TZ: Asia/Shanghai 29 | 30 | sfserver: 31 | image: qa894178522/sfmidwayadmin:stable 32 | restart: always 33 | depends_on: 34 | - db 35 | - redis 36 | environment: 37 | MYSQL_HOST: db 38 | MYSQL_PORT: 3306 39 | MYSQL_USERNAME: sf-admin 40 | MYSQL_PASSWORD: 123456 41 | MYSQL_DATABASE: sf-admin 42 | REDIS_HOST: redis 43 | REDIS_PORT: 6379 44 | REDIS_PASSWORD: 123456 45 | # 可选 46 | MAILER_HOST: xxx 47 | MAILER_PORT: xxx 48 | MAILER_USER: xxx 49 | MAILER_PASS: xxx 50 | AMAP_KEY: xxx 51 | 52 | sfvue: 53 | image: qa894178522/sfvueadmin:midway 54 | restart: always 55 | environment: 56 | TZ: Asia/Shanghai 57 | depends_on: 58 | - sfserver 59 | ports: 60 | - 7002:80 61 | -------------------------------------------------------------------------------- /docs/权限管理数据库设计文档.md: -------------------------------------------------------------------------------- 1 | # 文档修订记录 2 | 3 | | 日期 | 版本 | 说明 | 作者 | 4 | | :--------- | :----- | :--- | :----- | 5 | | 2020-08-21 | v1.0.0 | 创建 | 杨长源 | 6 | 7 | # 参考文献 8 | 9 | https://blog.csdn.net/gglinux/article/details/68948901 10 | 11 | https://www.zybuluo.com/stonezhou/note/1292262 12 | 13 | http://www.csdeshang.com/home/dsmall/database.html 14 | 15 | # 数据模型实体属性 16 | 17 | ## sys_menu 18 | 19 | **表注释: 系统菜单** 20 | 21 | | 字段 | 类型 | 空 | 默认 | 注释 | 22 | | --------- | ------------ | ---- | ---- | ------------------------------- | 23 | | id | int(20) | 否 | | ID | 24 | | parent_id | int(20) | | | 父菜单ID | 25 | | name | varchar(255) | 否 | | 菜单名称 | 26 | | router | varchar(255) | | | 菜单地址 | 27 | | perms | varchar(255) | | | 权限标识 | 28 | | type | tinyint(4) | 否 | 0 | 类型,0:目录、1:菜单、2:按钮 | 29 | | icon | varchar(255) | | | 对应图标 | 30 | | order_num | int(11) | | 0 | 排序 | 31 | | view_path | varchar(255) | | | 视图地址,对应vue文件 | 32 | | keepalive | boolean | | true | 路由缓存 | 33 | | Is_show | boolean | | true | 是否显示在菜单栏 | 34 | 35 | **索引** 36 | 37 | | 键名 | 类型 | 唯一 | 紧凑 | 字段 | 基数 | 排序规则 | 空 | 注释 | 38 | | ------- | ----- | ---- | ---- | ------ | ---- | -------- | ---- | ---- | 39 | | PRIMARY | BTREE | 是 | 否 | id | 0 | A | 否 | | 40 | 41 | ## sys_department 42 | 43 | **表注释:系统部门** 44 | 45 | | 字段 | 类型 | 空 | 默认 | 注释 | 46 | | --------- | ------------ | ---- | ---- | ---------- | 47 | | id | int(20) | 否 | | ID | 48 | | parent_id | int(20) | | | 上级部门ID | 49 | | name | varchar(255) | 否 | | 部门名称 | 50 | | order_num | int(11) | | 0 | 排序 | 51 | 52 | **索引** 53 | 54 | | 键名 | 类型 | 唯一 | 紧凑 | 字段 | 基数 | 排序规则 | 空 | 注释 | 55 | | ------- | ----- | ---- | ---- | ---- | ---- | -------- | ---- | ---- | 56 | | PRIMARY | BTREE | 是 | 否 | id | 0 | A | 否 | | 57 | 58 | ## sys_user 59 | 60 | **表注释:系统用户** 61 | 62 | | 字段 | 类型 | 空 | 默认 | 注释 | 63 | | ------------- | ------------ | ---- | ---- | ------------------------------------------ | 64 | | id | int(20) | 否 | | ID | 65 | | department_id | int(20) | 否 | | 部门编号 | 66 | | name | varchar(255) | 否 | | 姓名 | 67 | | username | varchar(255) | 否 | | 登录账号 | 68 | | password | varchar(255) | 否 | | 密码 | 69 | | psalt | varchar(32) | 否 | | 密码盐值(随机生成,每个用户对应一个盐值) | 70 | | nick_name | varchar(255) | | | 昵称 | 71 | | head_img | varchar(255) | | | 头像 | 72 | | email | varchar(255) | | | 邮箱 | 73 | | phone | varchar(20) | | | 手机号 | 74 | | remark | varchar(255) | | | 备注 | 75 | | status | tinyint(4) | | 1 | 状态:0:禁用,1:启用 | 76 | 77 | **索引** 78 | 79 | | 键名 | 类型 | 唯一 | 紧凑 | 字段 | 基数 | 排序规则 | 空 | 注释 | 80 | | ------- | ----- | ---- | ---- | -------- | ---- | -------- | ---- | ---- | 81 | | PRIMARY | BTREE | 是 | 否 | id | 0 | A | 否 | | 82 | | UNIQUE | BTREE | 是 | 否 | username | | | 否 | | 83 | 84 | ## sys_role 85 | 86 | **表注释:系统角色** 87 | 88 | | 字段 | 类型 | 空 | 默认 | 注释 | 89 | | ------- | ------------ | ---- | ---- | ------ | 90 | | id | int(20) | 否 | | ID | 91 | | user_id | varchar(255) | 否 | | 创建人 | 92 | | name | varchar(255) | 否 | | 名称 | 93 | | label | varchar(50) | 否 | | 标签 | 94 | | remark | varchar(255) | | | 备注 | 95 | 96 | **索引** 97 | 98 | | 键名 | 类型 | 唯一 | 紧凑 | 字段 | 基数 | 排序规则 | 空 | 注释 | 99 | | ------- | ----- | ---- | ---- | ----- | ---- | -------- | ---- | ---- | 100 | | PRIMARY | BTREE | 是 | 否 | id | 0 | A | 否 | | 101 | | UNIQUE | BTREE | 是 | 否 | label | | A | 否 | | 102 | | UNIQUE | BTREE | 是 | 否 | name | | A | 否 | | 103 | 104 | ## sys_role_department 105 | 106 | **表注释:系统角色部门关系** 107 | 108 | | 字段 | 类型 | 空 | 默认 | 注释 | 109 | | ------------- | ------- | ---- | ---- | ------ | 110 | | id | int(20) | 否 | | ID | 111 | | role_id | int(20) | 否 | | 角色ID | 112 | | department_id | int(20) | 否 | | 部门ID | 113 | 114 | **索引** 115 | 116 | | 键名 | 类型 | 唯一 | 紧凑 | 字段 | 基数 | 排序规则 | 空 | 注释 | 117 | | ------- | ----- | ---- | ---- | ---- | ---- | -------- | ---- | ---- | 118 | | PRIMARY | BTREE | 是 | 否 | id | 0 | A | 否 | | 119 | 120 | ## sys_role_menu 121 | 122 | **表注释:系统角色菜单关系** 123 | 124 | | 字段 | 类型 | 空 | 默认 | 注释 | 125 | | ------- | ------- | ---- | ---- | ------ | 126 | | id | int(20) | 否 | | ID | 127 | | role_id | int(20) | 否 | | 角色ID | 128 | | menu_id | int(20) | 否 | | 菜单ID | 129 | 130 | **索引** 131 | 132 | | 键名 | 类型 | 唯一 | 紧凑 | 字段 | 基数 | 排序规则 | 空 | 注释 | 133 | | ------- | ----- | ---- | ---- | ---- | ---- | -------- | ---- | ---- | 134 | | PRIMARY | BTREE | 是 | 否 | id | 0 | A | 否 | | 135 | 136 | ## sys_user_role 137 | 138 | **表注释:系统用户角色关系** 139 | 140 | | 字段 | 类型 | 空 | 默认 | 注释 | 141 | | ------- | ------- | ---- | ---- | ------ | 142 | | id | int(20) | 否 | | ID | 143 | | user_id | int(20) | 否 | | 用户ID | 144 | | role_id | int(20) | 否 | | 角色ID | 145 | 146 | **索引** 147 | 148 | | 键名 | 类型 | 唯一 | 紧凑 | 字段 | 基数 | 排序规则 | 空 | 注释 | 149 | | ------- | ----- | ---- | ---- | ---- | ---- | -------- | ---- | ---- | 150 | | PRIMARY | BTREE | 是 | 否 | id | 0 | A | 否 | | 151 | 152 | ## sys_req_log 153 | 154 | **表注释:请求追踪日志表** 155 | 156 | | 字段 | 类型 | 空 | 默认 | 注释 | 157 | | ------------ | ------------ | ---- | ---- | ----------------------- | 158 | | id | int(20) | 否 | | ID | 159 | | ip | varchar(255) | | | ip | 160 | | user_id | int(20) | | | 请求用户的用户id | 161 | | params | varchar(255) | | | 参数 | 162 | | action | varchar(100) | | | 行为 | 163 | | method | varchar(15) | | | 请求方式,同http method | 164 | | status | int | | | 请求状态码 | 165 | | consume_time | int | | 0 | 响应时间 | 166 | 167 | **索引** 168 | 169 | | 键名 | 类型 | 唯一 | 紧凑 | 字段 | 基数 | 排序规则 | 空 | 注释 | 170 | | ------- | ----- | ---- | ---- | ---- | ---- | -------- | ---- | ---- | 171 | | PRIMARY | BTREE | 是 | 否 | id | 0 | A | 否 | | 172 | 173 | ## sys_login_log 174 | 175 | **表注释:登录日志表** 176 | 177 | | 字段 | 类型 | 空 | 默认 | 注释 | 178 | | ------- | ------------ | ---- | ---- | ---------------------------- | 179 | | id | int(20) | 否 | | ID | 180 | | user_id | int(20) | | | 登录的用户id | 181 | | ip | varchar(255) | | | 登录ip | 182 | | time | datetime | | | 登陆时间(未使用,保留字段) | 183 | | ua | varchar(500) | | | user-agent | 184 | 185 | **索引** 186 | 187 | | 键名 | 类型 | 唯一 | 紧凑 | 字段 | 基数 | 排序规则 | 空 | 注释 | 188 | | ------- | ----- | ---- | ---- | ---- | ---- | -------- | ---- | ---- | 189 | | PRIMARY | BTREE | 是 | 否 | id | 0 | A | 否 | | 190 | 191 | ## sys_task 192 | 193 | **表注释:系统任务表** 194 | 195 | | 字段 | 类型 | 空 | 默认 | 注释 | 196 | | ---------- | ------------ | ---- | ---- | ------------------------------------- | 197 | | id | int(20) | 否 | | ID | 198 | | name | varchar(50) | 否 | | 任务名称 | 199 | | service | varchar(255) | 否 | | 需要执行的service | 200 | | type | tinyint(4) | 否 | 0 | 任务模式:0为cron,1为时间间隔 | 201 | | status | tinyint(1) | | 0 | 任务状态:0为停止,1为运行 | 202 | | start_time | datetime | | | 任务开始时间,type为0时生效 | 203 | | end_time | datetime | | | 任务结束时间,type为0时生效 | 204 | | limit | int | | 0 | 最大执行次数,小于或者等于0则不限次数 | 205 | | cron | varchar(255) | | | cron表达式,type为0时生效 | 206 | | every | int | | | 执行间隔,type为1时生效 | 207 | | data | text | | | 传入数据 | 208 | | job_opts | text | | | bull job options | 209 | | remark | varchar(255) | | | 备注 | 210 | 211 | **索引** 212 | 213 | | 键名 | 类型 | 唯一 | 紧凑 | 字段 | 基数 | 排序规则 | 空 | 注释 | 214 | | ------- | ----- | ---- | ---- | ---- | ---- | -------- | ---- | ---- | 215 | | PRIMARY | BTREE | 是 | 否 | id | 0 | A | 否 | | 216 | | UNIQUE | BTREE | 是 | 否 | name | | A | 否 | | 217 | 218 | ## sys_task_log 219 | 220 | **表注释:任务日志表** 221 | 222 | | 字段 | 类型 | 空 | 默认 | 注释 | 223 | | ------- | ---------- | ---- | ---- | ------------------------------------- | 224 | | id | int(20) | 否 | | id | 225 | | task_id | int(20) | 否 | | 对应任务id | 226 | | status | Tinyint(4) | 否 | 0 | 任务状态:0为失败,1为成功 | 227 | | detail | Text | | | 任务详情 | 228 | | consume_time | int | | 0 | 任务完成耗时 (ms) | 229 | 230 | **索引** 231 | 232 | | 键名 | 类型 | 唯一 | 紧凑 | 字段 | 基数 | 排序规则 | 空 | 注释 | 233 | | ------- | ----- | ---- | ---- | ---- | ---- | -------- | ---- | ---- | 234 | | PRIMARY | BTREE | 是 | 否 | id | 0 | A | 否 | | 235 | 236 | 237 | -------------------------------------------------------------------------------- /docs/通用协作规范.md: -------------------------------------------------------------------------------- 1 | # 参考 2 | 3 | https://github.com/GDJiaMi/frontend-standards 4 | 5 | https://www.git-tower.com/learn/git/ebook/cn/command-line/advanced-topics/git-flow 6 | 7 | # 1、工作流规范(基于Git) 8 | 9 | ## 1.1、开发 10 | 11 | ### 1.1.1、[版本规范](https://semver.org/lang/zh-CN/) 12 | 13 | 版本格式:主版本号.次版本号.修订号,版本号递增规则如下: 14 | 15 | 1. 主版本号:当你做了不兼容的 API 修改, 16 | 2. 次版本号:当你做了向下兼容的功能性新增, 17 | 3. 修订号:当你做了向下兼容的问题修正。 18 | 19 | 先行版本号及版本编译元数据可以加到“主版本号.次版本号.修订号”的后面,作为延伸。 20 | 21 | ### 1.1.2、Git分支模型 22 | 23 | #### master分支 24 | 25 | master分支表示一个稳定的发布版本. 对应百宝袋的大版本. 26 | 27 | - 场景: 所有应用会跟随版本迭代, 在dev分支测试稳定后, 会合并到master分支, 并使用tag标记应用版本 28 | - tag规范: `v{version}`, 例如v0.1.0 29 | - 人员: 由项目负责人进行审核合并, 普通开发者没有权限 30 | 31 | #### dev分支 32 | 33 | 开发者主要工作的分支, 最新的特性或bug修复都会提交到这个分支. 开发者如果在该分支进行了提交,在push到远程之前应该先pull一下, 并尽量使用rebase模式,保证分支的简洁 34 | 35 | - 命名规范: dev 36 | - tag规范: 在dev分支中也可能会经历发布过程, 例如bug修复版本. 这里同样使用tag来标记这些发布. 例如v0.1.1 37 | - 提交规范:如果实在开发分支上进行开发,在推送到远程之前,应该使用`git rebase`形式更新本地分支。 38 | 39 | #### feature分支 40 | 41 | 涉及多人协作或者大功能的开发, 应该从dev分支checkout出独立的feature分支, 避免干扰dev分支 42 | 43 | - 场景: 44 | - 涉及多人协作: 团队多个成员在同一个项目下负责开发不同的功能, 这时候每个成员在自己的feature分支独立开发 45 | - 大功能开发: 大功能开发跨越周期比较长, 需要多次迭代才会稳定. 这时候应该在独立的分支上开发. 方便跟踪历史记录, 也免于干扰dev分支的迭代和发布 46 | - 命名规范 47 | - feature/name: name是功能名称 48 | - feature/version: 这也是团队常见的模式, 当无法使用一个功能名称来描述时, 可以使用版本号作为’功能’ 49 | - 合并时机 50 | 1. 当feature分支迭代稳定, 并通过测试后, 合并到dev分支. 合并到dev后, **feature分支的生命周期就结束了**. 后续bug修复和功能优化直接在dev开发 51 | 2. 当多个feature分支需要合并对外发布临时版本时. 合并到preview分支 . ⚠️这种情况不应该合并到dev分支, 因为feature分支可能还不稳定或未完成. 比如为了联调某些功能. 52 | - 合并方式 53 | - 不要使用fast-forward. 这样可以在分支图上查看到分支历史 54 | 55 | #### preview分支 56 | 57 | 临时的预览分支, preview分支用于临时合并feature分支, 这其中可能会修复某些bug或者冲突. 可以选择性地将这些提交cherrypick回feature分支. 当预览结束后就可以销毁preview分支 58 | 59 | #### release分支 60 | 61 | 遵循gitflow规范 62 | 63 | - 场景: 需要为某个正式版本修复bug(hotFix)时, 从master的对应tag中checkout release分支 64 | - 命名规范: release/{version} 65 | - 如何修复 66 | + 如果对应bug可以在dev分支直接被修复, 可以先提交到dev分支(或者已经修复了), 然后再cherrypick到release分支 67 | + 如果bug在新版本无法复现. 比如新版本升级了依赖. 那么在release分支直接修复即可 68 | 69 | ### 1.1.3、提交信息规范 70 | 71 | #### 格式 72 | 73 | 我们采用angular的提交规范, 在这个规范的基础上支持(可选)`emoji`进行修饰 74 | 75 | ``` 76 | (): 77 | 78 | 79 | 80 |