Repository: hackycy/sf-nest-admin Branch: dev Commit: d28a8b19abf5 Files: 139 Total size: 260.7 KB Directory structure: gitextract_j_pyb6i1/ ├── .dockerignore ├── .eslintrc.js ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.md │ │ └── feature_request.md │ └── workflows/ │ ├── build-rc.yml │ └── build-stable.yml ├── .gitignore ├── .prettierrc ├── Dockerfile ├── LICENSE ├── README.md ├── docs/ │ ├── sample/ │ │ ├── config.development.ts │ │ └── docker-compose.yml │ ├── 权限管理数据库设计文档.md │ └── 通用协作规范.md ├── nest-cli.json ├── package.json ├── sql/ │ ├── init.sql │ ├── upgrade_20210508.sql │ ├── upgrade_20210914.sql.migrate │ └── upgrade_20210927.sql ├── src/ │ ├── app.module.ts │ ├── common/ │ │ ├── class/ │ │ │ └── res.class.ts │ │ ├── contants/ │ │ │ ├── decorator.contants.ts │ │ │ ├── error-code.contants.ts │ │ │ └── param-config.contants.ts │ │ ├── decorators/ │ │ │ └── keep.decorator.ts │ │ ├── dto/ │ │ │ └── page.dto.ts │ │ ├── exceptions/ │ │ │ ├── api.exception.ts │ │ │ └── socket.exception.ts │ │ ├── filters/ │ │ │ └── api-exception.filter.ts │ │ └── interceptors/ │ │ └── api-transform.interceptor.ts │ ├── config/ │ │ ├── config.default.ts │ │ ├── config.production.ts │ │ ├── configuration.ts │ │ ├── defineConfig.ts │ │ └── env.ts │ ├── entities/ │ │ ├── admin/ │ │ │ ├── sys-config.entity.ts │ │ │ ├── sys-department.entity.ts │ │ │ ├── sys-login-log.entity.ts │ │ │ ├── sys-menu.entity.ts │ │ │ ├── sys-role-department.entity.ts │ │ │ ├── sys-role-menu.entity.ts │ │ │ ├── sys-role.entity.ts │ │ │ ├── sys-task-log.entity.ts │ │ │ ├── sys-task.entity.ts │ │ │ ├── sys-user-role.entity.ts │ │ │ └── sys-user.entity.ts │ │ └── base.entity.ts │ ├── main.ts │ ├── mission/ │ │ ├── README.md │ │ ├── jobs/ │ │ │ ├── http-request.job.ts │ │ │ └── sys-log-clear.job.ts │ │ ├── mission.decorator.ts │ │ └── mission.module.ts │ ├── modules/ │ │ ├── admin/ │ │ │ ├── account/ │ │ │ │ ├── account.controller.ts │ │ │ │ ├── account.dto.ts │ │ │ │ └── account.module.ts │ │ │ ├── admin.constants.ts │ │ │ ├── admin.interface.ts │ │ │ ├── admin.module.ts │ │ │ ├── core/ │ │ │ │ ├── decorators/ │ │ │ │ │ ├── admin-user.decorator.ts │ │ │ │ │ ├── authorize.decorator.ts │ │ │ │ │ ├── log-disabled.decorator.ts │ │ │ │ │ └── permission-optional.decorator.ts │ │ │ │ ├── guards/ │ │ │ │ │ └── auth.guard.ts │ │ │ │ └── provider/ │ │ │ │ ├── qiniu.provider.ts │ │ │ │ └── root-role-id.provider.ts │ │ │ ├── login/ │ │ │ │ ├── login.class.ts │ │ │ │ ├── login.controller.ts │ │ │ │ ├── login.dto.ts │ │ │ │ ├── login.module.ts │ │ │ │ └── login.service.ts │ │ │ ├── netdisk/ │ │ │ │ ├── manager/ │ │ │ │ │ ├── manage.class.ts │ │ │ │ │ ├── manage.controller.ts │ │ │ │ │ ├── manage.dto.ts │ │ │ │ │ └── manage.service.ts │ │ │ │ ├── netdisk.module.ts │ │ │ │ └── overview/ │ │ │ │ ├── overview.class.ts │ │ │ │ ├── overview.controller.ts │ │ │ │ └── overview.service.ts │ │ │ └── system/ │ │ │ ├── dept/ │ │ │ │ ├── dept.class.ts │ │ │ │ ├── dept.controller.ts │ │ │ │ ├── dept.dto.ts │ │ │ │ └── dept.service.ts │ │ │ ├── log/ │ │ │ │ ├── log.class.ts │ │ │ │ ├── log.controller.ts │ │ │ │ └── log.service.ts │ │ │ ├── menu/ │ │ │ │ ├── menu.class.ts │ │ │ │ ├── menu.controller.ts │ │ │ │ ├── menu.dto.ts │ │ │ │ └── menu.service.ts │ │ │ ├── online/ │ │ │ │ ├── online.class.ts │ │ │ │ ├── online.controller.ts │ │ │ │ ├── online.dto.ts │ │ │ │ └── online.service.ts │ │ │ ├── param-config/ │ │ │ │ ├── param-config.controller.ts │ │ │ │ ├── param-config.dto.ts │ │ │ │ └── param-config.service.ts │ │ │ ├── role/ │ │ │ │ ├── role.class.ts │ │ │ │ ├── role.controller.ts │ │ │ │ ├── role.dto.ts │ │ │ │ └── role.service.ts │ │ │ ├── serve/ │ │ │ │ ├── serve.class.ts │ │ │ │ ├── serve.controller.ts │ │ │ │ └── serve.service.ts │ │ │ ├── system.module.ts │ │ │ ├── task/ │ │ │ │ ├── task.controller.ts │ │ │ │ ├── task.dto.ts │ │ │ │ ├── task.processor.ts │ │ │ │ └── task.service.ts │ │ │ └── user/ │ │ │ ├── user.class.ts │ │ │ ├── user.controller.ts │ │ │ ├── user.dto.ts │ │ │ └── user.service.ts │ │ └── ws/ │ │ ├── admin-ws.gateway.ts │ │ ├── admin-ws.guard.ts │ │ ├── auth.service.ts │ │ ├── ws.event.ts │ │ └── ws.module.ts │ ├── polyfill.ts │ ├── setup-swagger.ts │ └── shared/ │ ├── logger/ │ │ ├── logger.constants.ts │ │ ├── logger.interface.ts │ │ ├── logger.module.ts │ │ ├── logger.service.ts │ │ ├── typeorm-logger.service.ts │ │ └── utils/ │ │ ├── app-root-path.util.ts │ │ └── home-dir.ts │ ├── redis/ │ │ ├── redis.constants.ts │ │ ├── redis.interface.ts │ │ └── redis.module.ts │ ├── services/ │ │ ├── redis.service.ts │ │ └── util.service.ts │ └── shared.module.ts ├── test/ │ ├── app.e2e-spec.ts │ └── jest-e2e.json ├── tsconfig.build.json └── tsconfig.json ================================================ FILE CONTENTS ================================================ ================================================ FILE: .dockerignore ================================================ # compiled output /dist /node_modules package-lock.json yarn.lock # Logs logs *.log npm-debug.log* yarn-debug.log* yarn-error.log* lerna-debug.log* # OS .DS_Store # Tests /coverage /.nyc_output # IDEs and editors /.idea .project .classpath .c9/ *.launch .settings/ *.sublime-workspace # IDE - VSCode .vscode/* !.vscode/settings.json !.vscode/tasks.json !.vscode/launch.json !.vscode/extensions.json # Code src/config/config.development.* docs/* sql/* test/* README.md ================================================ FILE: .eslintrc.js ================================================ module.exports = { parser: '@typescript-eslint/parser', parserOptions: { project: 'tsconfig.json', sourceType: 'module', }, plugins: ['@typescript-eslint/eslint-plugin'], extends: [ 'plugin:@typescript-eslint/recommended', 'plugin:prettier/recommended', ], root: true, env: { node: true, jest: true, }, ignorePatterns: ['.eslintrc.js'], rules: { '@typescript-eslint/interface-name-prefix': 'off', '@typescript-eslint/explicit-function-return-type': 'off', '@typescript-eslint/explicit-module-boundary-types': 'off', '@typescript-eslint/no-explicit-any': 'off', }, }; ================================================ FILE: .github/ISSUE_TEMPLATE/bug_report.md ================================================ --- name: Bug report(报告问题) about: Create a report to help us improve --- ## Bug report(问题描述) #### Steps to reproduce(问题复现步骤) #### Screenshot or Gif(截图或动态图) #### Link to minimal reproduction(最小可在线还原demo) #### Other relevant information(格外信息) - Your OS: - Node.js version: - Mysql version: - Redis version: ================================================ FILE: .github/ISSUE_TEMPLATE/feature_request.md ================================================ --- name: Feature Request(新功能建议) about: Suggest an idea for this project --- ## Feature request(新功能建议) ================================================ FILE: .github/workflows/build-rc.yml ================================================ name: Build RC Image on: create: tags: - '*' jobs: docker: runs-on: ubuntu-latest steps: - name: Set up QEMU uses: docker/setup-qemu-action@v1 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v1 - name: Login to DockerHub uses: docker/login-action@v1 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Build and push id: docker_build uses: docker/build-push-action@v2 with: push: true tags: ${{ secrets.DOCKERHUB_USERNAME }}/sfnestadmin:rc - name: Image digest run: echo ${{ steps.docker_build.outputs.digest }} ================================================ FILE: .github/workflows/build-stable.yml ================================================ name: Build Stable Image on: push: branches: - 'main' jobs: docker: runs-on: ubuntu-latest steps: - name: Set up QEMU uses: docker/setup-qemu-action@v1 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v1 - name: Login to DockerHub uses: docker/login-action@v1 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Build and push id: docker_build uses: docker/build-push-action@v2 with: push: true tags: ${{ secrets.DOCKERHUB_USERNAME }}/sfnestadmin:stable - name: Image digest run: echo ${{ steps.docker_build.outputs.digest }} ================================================ FILE: .gitignore ================================================ # compiled output /dist /node_modules package-lock.json yarn.lock # Logs logs *.log npm-debug.log* yarn-debug.log* yarn-error.log* lerna-debug.log* # OS .DS_Store # Tests /coverage /.nyc_output # IDEs and editors /.idea .project .classpath .c9/ *.launch .settings/ *.sublime-workspace # IDE - VSCode .vscode/* !.vscode/settings.json !.vscode/tasks.json !.vscode/launch.json !.vscode/extensions.json # Code src/config/config.development.* docs/sample/mysql/ ================================================ FILE: .prettierrc ================================================ { "tabWidth": 2, "singleQuote": true, "trailingComma": "all" } ================================================ FILE: Dockerfile ================================================ FROM node:lts-alpine as builder WORKDIR /sf-nest-admin # set timezone RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime RUN echo 'Asia/Shanghai' > /etc/timezone # RUN npm set registry https://registry.npm.taobao.org # cache step COPY package.json /sf-nest-admin/package.json RUN yarn install # build COPY ./ /sf-nest-admin RUN yarn build # clean dev dep RUN rm -rf node_modules RUN yarn install --production # httpserver set port EXPOSE 7001 # websokcet set port EXPOSE 7002 CMD ["yarn", "start:prod"] ================================================ FILE: LICENSE ================================================ MIT License Copyright (c) 2021-present Changyuan Yang Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: README.md ================================================ # sf-nest-admin ![](https://img.shields.io/github/commit-activity/m/hackycy/sf-nest-admin) ![](https://img.shields.io/github/license/hackycy/sf-nest-admin) ![](https://img.shields.io/github/repo-size/hackycy/sf-nest-admin) ![](https://img.shields.io/github/languages/top/hackycy/sf-nest-admin) **基于NestJs + TypeScript + TypeORM + Redis + MySql + Vue + Element-UI编写的一款简单高效的前后端分离的权限管理系统。希望这个项目在全栈的路上能够帮助到你。** - 使用文档:[https://blog.si-yee.com/sf-admin-cli/](https://blog.si-yee.com/sf-admin-cli/) - 演示站点:[http://opensource.admin.si-yee.com](http://opensource.admin.si-yee.com/) - **Vue3版请移步:**[https://github.com/arklnk/ark-admin-nest](https://github.com/arklnk/ark-admin-nest) - Swagger Api文档:[http://opensource.admin.si-yee.com/api/doc/admin/swagger-api/static/index.html](http://opensource.admin.si-yee.com/api/doc/admin/swagger-api/static/index.html) 演示环境账号密码: | 账号 | 密码 | 权限 | | :----------: | :----: | :----------------------: | | openadmin | 123456 | 仅只有各个功能的查询权限 | | monitoradmin | 123456 | 系统监控页面及按钮权限 | > 所有新建的用户初始密码都为123456 # 欢迎Star && PR **如果项目有帮助到你可以点个Star支持下。有更好的实现欢迎PR。** # LICENSE [MIT](LICENSE) ================================================ FILE: docs/sample/config.development.ts ================================================ import * as qiniu from 'qiniu'; export default { rootRoleId: 1, // jwt sign secret jwt: { secret: process.env.JWT_SECRET || '123456', }, // typeorm config database: { type: 'mysql', host: '127.0.0.1', port: 3306, username: 'root', password: '123456', database: 'sf-admin', synchronize: false, logging: false, }, redis: { host: '127.0.0.1', // default value port: 6379, // default value password: '123456', db: 0, }, // qiniu config qiniu: { accessKey: 'xxx', secretKey: 'xxx', domain: 'xxx', bucket: 'xxx', zone: qiniu.zone.Zone_z0, access: 'public', }, }; ================================================ FILE: docs/sample/docker-compose.yml ================================================ version: "2.0" services: db: image: mysql:5.7.34 command: --default-authentication-plugin=mysql_native_password restart: always volumes: - ./mysql:/var/lib/mysql/ # ./mysql路径可以替换成自己的路径 - ../../sql/:/docker-entrypoint-initdb.d/ # 初始化的脚本 ports: - 3306:3306 environment: TZ: Asia/Shanghai MYSQL_ROOT_PASSWORD: 123456 MYSQL_DATABASE: sf-admin MYSQL_USER: sf-admin MYSQL_PASSWORD: 123456 redis: image: redis:alpine command: --requirepass "123456" restart: always ports: - 6379:6379 environment: TZ: Asia/Shanghai sfserver: image: qa894178522/sfnestadmin:stable restart: always depends_on: - db - redis environment: MYSQL_HOST: db MYSQL_PORT: 3306 MYSQL_USERNAME: sf-admin MYSQL_PASSWORD: 123456 MYSQL_DATABASE: sf-admin REDIS_HOST: redis REDIS_PORT: 6379 REDIS_PASSWORD: 123456 # 可选 MAILER_HOST: xxx MAILER_PORT: xxx MAILER_USER: xxx MAILER_PASS: xxx AMAP_KEY: xxx QINIU_ACCESSKEY: xxx QINIU_SECRETKEY: xxx QINIU_DOMAIN: xxx QINIU_BUCKET: xxx QINIU_ZONE: xxx # Zone_as0 | Zone_na0 | Zone_z0 | Zone_z1 | Zone_z2 QINIU_ACCESS_TYPE: public # or private sfvue: image: qa894178522/sfvueadmin:nest restart: always environment: TZ: Asia/Shanghai depends_on: - sfserver ports: - 7002:80 ================================================ FILE: docs/权限管理数据库设计文档.md ================================================ # 文档修订记录 | 日期 | 版本 | 说明 | 作者 | | :--------- | :----- | :--------------- | :------ | | 2020-08-21 | v1.0.0 | 创建 | hackycy | | 2021-09-27 | v2.0.0 | 增加sys_config表 | hackycy | # 参考文献 https://blog.csdn.net/gglinux/article/details/68948901 https://www.zybuluo.com/stonezhou/note/1292262 http://www.csdeshang.com/home/dsmall/database.html # 数据模型实体属性 ## sys_menu **表注释: 系统菜单** | 字段 | 类型 | 空 | 默认 | 注释 | | --------- | ------------ | ---- | ---- | ------------------------------- | | id | int(20) | 否 | | ID | | parent_id | int(20) | | | 父菜单ID | | name | varchar(255) | 否 | | 菜单名称 | | router | varchar(255) | | | 菜单地址 | | perms | varchar(255) | | | 权限标识 | | type | tinyint(4) | 否 | 0 | 类型,0:目录、1:菜单、2:按钮 | | icon | varchar(255) | | | 对应图标 | | order_num | int(11) | | 0 | 排序 | | view_path | varchar(255) | | | 视图地址,对应vue文件 | | keepalive | boolean | | true | 路由缓存 | | Is_show | boolean | | true | 是否显示在菜单栏 | **索引** | 键名 | 类型 | 唯一 | 紧凑 | 字段 | 基数 | 排序规则 | 空 | 注释 | | ------- | ----- | ---- | ---- | ------ | ---- | -------- | ---- | ---- | | PRIMARY | BTREE | 是 | 否 | id | 0 | A | 否 | | ## sys_department **表注释:系统部门** | 字段 | 类型 | 空 | 默认 | 注释 | | --------- | ------------ | ---- | ---- | ---------- | | id | int(20) | 否 | | ID | | parent_id | int(20) | | | 上级部门ID | | name | varchar(255) | 否 | | 部门名称 | | order_num | int(11) | | 0 | 排序 | **索引** | 键名 | 类型 | 唯一 | 紧凑 | 字段 | 基数 | 排序规则 | 空 | 注释 | | ------- | ----- | ---- | ---- | ---- | ---- | -------- | ---- | ---- | | PRIMARY | BTREE | 是 | 否 | id | 0 | A | 否 | | ## sys_user **表注释:系统用户** | 字段 | 类型 | 空 | 默认 | 注释 | | ------------- | ------------ | ---- | ---- | ------------------------------------------ | | id | int(20) | 否 | | ID | | department_id | int(20) | 否 | | 部门编号 | | name | varchar(255) | 否 | | 姓名 | | username | varchar(255) | 否 | | 登录账号 | | password | varchar(255) | 否 | | 密码 | | psalt | varchar(32) | 否 | | 密码盐值(随机生成,每个用户对应一个盐值) | | nick_name | varchar(255) | | | 昵称 | | head_img | varchar(255) | | | 头像 | | email | varchar(255) | | | 邮箱 | | phone | varchar(20) | | | 手机号 | | remark | varchar(255) | | | 备注 | | status | tinyint(4) | | 1 | 状态:0:禁用,1:启用 | **索引** | 键名 | 类型 | 唯一 | 紧凑 | 字段 | 基数 | 排序规则 | 空 | 注释 | | ------- | ----- | ---- | ---- | -------- | ---- | -------- | ---- | ---- | | PRIMARY | BTREE | 是 | 否 | id | 0 | A | 否 | | | UNIQUE | BTREE | 是 | 否 | username | | | 否 | | ## sys_role **表注释:系统角色** | 字段 | 类型 | 空 | 默认 | 注释 | | ------- | ------------ | ---- | ---- | ------ | | id | int(20) | 否 | | ID | | user_id | varchar(255) | 否 | | 创建人 | | name | varchar(255) | 否 | | 名称 | | label | varchar(50) | 否 | | 标签 | | remark | varchar(255) | | | 备注 | **索引** | 键名 | 类型 | 唯一 | 紧凑 | 字段 | 基数 | 排序规则 | 空 | 注释 | | ------- | ----- | ---- | ---- | ----- | ---- | -------- | ---- | ---- | | PRIMARY | BTREE | 是 | 否 | id | 0 | A | 否 | | | UNIQUE | BTREE | 是 | 否 | label | | A | 否 | | | UNIQUE | BTREE | 是 | 否 | name | | A | 否 | | ## sys_role_department **表注释:系统角色部门关系** | 字段 | 类型 | 空 | 默认 | 注释 | | ------------- | ------- | ---- | ---- | ------ | | id | int(20) | 否 | | ID | | role_id | int(20) | 否 | | 角色ID | | department_id | int(20) | 否 | | 部门ID | **索引** | 键名 | 类型 | 唯一 | 紧凑 | 字段 | 基数 | 排序规则 | 空 | 注释 | | ------- | ----- | ---- | ---- | ---- | ---- | -------- | ---- | ---- | | PRIMARY | BTREE | 是 | 否 | id | 0 | A | 否 | | ## sys_role_menu **表注释:系统角色菜单关系** | 字段 | 类型 | 空 | 默认 | 注释 | | ------- | ------- | ---- | ---- | ------ | | id | int(20) | 否 | | ID | | role_id | int(20) | 否 | | 角色ID | | menu_id | int(20) | 否 | | 菜单ID | **索引** | 键名 | 类型 | 唯一 | 紧凑 | 字段 | 基数 | 排序规则 | 空 | 注释 | | ------- | ----- | ---- | ---- | ---- | ---- | -------- | ---- | ---- | | PRIMARY | BTREE | 是 | 否 | id | 0 | A | 否 | | ## sys_user_role **表注释:系统用户角色关系** | 字段 | 类型 | 空 | 默认 | 注释 | | ------- | ------- | ---- | ---- | ------ | | id | int(20) | 否 | | ID | | user_id | int(20) | 否 | | 用户ID | | role_id | int(20) | 否 | | 角色ID | **索引** | 键名 | 类型 | 唯一 | 紧凑 | 字段 | 基数 | 排序规则 | 空 | 注释 | | ------- | ----- | ---- | ---- | ---- | ---- | -------- | ---- | ---- | | PRIMARY | BTREE | 是 | 否 | id | 0 | A | 否 | | ## sys_login_log **表注释:登录日志表** | 字段 | 类型 | 空 | 默认 | 注释 | | ------- | ------------ | ---- | ---- | ---------------------------- | | id | int(20) | 否 | | ID | | user_id | int(20) | | | 登录的用户id | | ip | varchar(255) | | | 登录ip | | time | datetime | | | 登陆时间(未使用,保留字段) | | ua | varchar(500) | | | user-agent | **索引** | 键名 | 类型 | 唯一 | 紧凑 | 字段 | 基数 | 排序规则 | 空 | 注释 | | ------- | ----- | ---- | ---- | ---- | ---- | -------- | ---- | ---- | | PRIMARY | BTREE | 是 | 否 | id | 0 | A | 否 | | ## sys_task **表注释:系统任务表** | 字段 | 类型 | 空 | 默认 | 注释 | | ---------- | ------------ | ---- | ---- | ------------------------------------- | | id | int(20) | 否 | | ID | | name | varchar(50) | 否 | | 任务名称 | | service | varchar(255) | 否 | | 需要执行的service | | type | tinyint(4) | 否 | 0 | 任务模式:0为cron,1为时间间隔 | | status | tinyint(1) | | 0 | 任务状态:0为停止,1为运行 | | start_time | datetime | | | 任务开始时间,type为0时生效 | | end_time | datetime | | | 任务结束时间,type为0时生效 | | limit | int | | 0 | 最大执行次数,小于或者等于0则不限次数 | | cron | varchar(255) | | | cron表达式,type为0时生效 | | every | int | | | 执行间隔,type为1时生效 | | data | text | | | 传入数据 | | job_opts | text | | | bull job options | | remark | varchar(255) | | | 备注 | **索引** | 键名 | 类型 | 唯一 | 紧凑 | 字段 | 基数 | 排序规则 | 空 | 注释 | | ------- | ----- | ---- | ---- | ---- | ---- | -------- | ---- | ---- | | PRIMARY | BTREE | 是 | 否 | id | 0 | A | 否 | | | UNIQUE | BTREE | 是 | 否 | name | | A | 否 | | ## sys_task_log **表注释:任务日志表** | 字段 | 类型 | 空 | 默认 | 注释 | | ------- | ---------- | ---- | ---- | ------------------------------------- | | id | int(20) | 否 | | id | | task_id | int(20) | 否 | | 对应任务id | | status | Tinyint(4) | 否 | 0 | 任务状态:0为失败,1为成功 | | detail | Text | | | 任务详情 | | consume_time | int(20) | | 0 | 任务完成耗时 (ms) | **索引** | 键名 | 类型 | 唯一 | 紧凑 | 字段 | 基数 | 排序规则 | 空 | 注释 | | ------- | ----- | ---- | ---- | ---- | ---- | -------- | ---- | ---- | | PRIMARY | BTREE | 是 | 否 | id | 0 | A | 否 | | ## sys_config **表注释:系统参数配置表** | 字段 | 类型 | 空 | 默认 | 注释 | | ------ | ------------ | ---- | ---- | ------------ | | id | int(20) | 否 | | id | | key | varchar(50) | 否 | | 参数配置键 | | value | varchar(255) | 是 | | 参数配置值 | | name | varchar(50) | 否 | | 参数配置名称 | | remark | varchar(255) | 是 | | 参数配置备注 | **索引** | 键名 | 类型 | 唯一 | 紧凑 | 字段 | 基数 | 排序规则 | 空 | 注释 | | ------- | ----- | ---- | ---- | ---- | ---- | -------- | ---- | ---- | | PRIMARY | BTREE | 是 | 否 | id | 0 | A | 否 | | | UNIQUE | BTREE | 是 | 否 | key | | A | 否 | | ================================================ FILE: docs/通用协作规范.md ================================================ # 参考 https://github.com/GDJiaMi/frontend-standards https://www.git-tower.com/learn/git/ebook/cn/command-line/advanced-topics/git-flow # 1、工作流规范(基于Git) ## 1.1、开发 ### 1.1.1、[版本规范](https://semver.org/lang/zh-CN/) 版本格式:主版本号.次版本号.修订号,版本号递增规则如下: 1. 主版本号:当你做了不兼容的 API 修改, 2. 次版本号:当你做了向下兼容的功能性新增, 3. 修订号:当你做了向下兼容的问题修正。 先行版本号及版本编译元数据可以加到“主版本号.次版本号.修订号”的后面,作为延伸。 ### 1.1.2、Git分支模型 #### master分支 master分支表示一个稳定的发布版本. 对应百宝袋的大版本. - 场景: 所有应用会跟随版本迭代, 在dev分支测试稳定后, 会合并到master分支, 并使用tag标记应用版本 - tag规范: `v{version}`, 例如v0.1.0 - 人员: 由项目负责人进行审核合并, 普通开发者没有权限 #### dev分支 开发者主要工作的分支, 最新的特性或bug修复都会提交到这个分支. 开发者如果在该分支进行了提交,在push到远程之前应该先pull一下, 并尽量使用rebase模式,保证分支的简洁 - 命名规范: dev - tag规范: 在dev分支中也可能会经历发布过程, 例如bug修复版本. 这里同样使用tag来标记这些发布. 例如v0.1.1 - 提交规范:如果实在开发分支上进行开发,在推送到远程之前,应该使用`git rebase`形式更新本地分支。 #### feature分支 涉及多人协作或者大功能的开发, 应该从dev分支checkout出独立的feature分支, 避免干扰dev分支 - 场景: - 涉及多人协作: 团队多个成员在同一个项目下负责开发不同的功能, 这时候每个成员在自己的feature分支独立开发 - 大功能开发: 大功能开发跨越周期比较长, 需要多次迭代才会稳定. 这时候应该在独立的分支上开发. 方便跟踪历史记录, 也免于干扰dev分支的迭代和发布 - 命名规范 - feature/name: name是功能名称 - feature/version: 这也是团队常见的模式, 当无法使用一个功能名称来描述时, 可以使用版本号作为’功能’ - 合并时机 1. 当feature分支迭代稳定, 并通过测试后, 合并到dev分支. 合并到dev后, **feature分支的生命周期就结束了**. 后续bug修复和功能优化直接在dev开发 2. 当多个feature分支需要合并对外发布临时版本时. 合并到preview分支 . ⚠️这种情况不应该合并到dev分支, 因为feature分支可能还不稳定或未完成. 比如为了联调某些功能. - 合并方式 - 不要使用fast-forward. 这样可以在分支图上查看到分支历史 #### preview分支 临时的预览分支, preview分支用于临时合并feature分支, 这其中可能会修复某些bug或者冲突. 可以选择性地将这些提交cherrypick回feature分支. 当预览结束后就可以销毁preview分支 #### release分支 遵循gitflow规范 - 场景: 需要为某个正式版本修复bug(hotFix)时, 从master的对应tag中checkout release分支 - 命名规范: release/{version} - 如何修复 + 如果对应bug可以在dev分支直接被修复, 可以先提交到dev分支(或者已经修复了), 然后再cherrypick到release分支 + 如果bug在新版本无法复现. 比如新版本升级了依赖. 那么在release分支直接修复即可 ### 1.1.3、提交信息规范 #### 格式 我们采用angular的提交规范, 在这个规范的基础上支持(可选)`emoji`进行修饰 ``` ():