nestjs版若依全栈管理平台开源了

打印 上一主题 下一主题

主题 850|帖子 850|积分 2550

Hello,大家好,我是Carole。本日给大家分享一下我开源的一个项目carole-admin。一款Nestjs+Prisma+Vue3前后端分离的快速开发平台。(前端基于若依)
平台简介

carole-admin 是一款Nestjs+Prisma+Vue+Vite前后端分离的全栈快速开发平台, 前端基于若依。


  • 前端采用Vue3、Element-Plus、Vite。
  • 后端采用Nest、Prisma、ioredis & Jwt。
  • 权限认证使用Jwt,支持多终端认证系统。
  • 支持加载动态权限菜单,多方式轻松权限控制。
  • 支持接口限流
  • 高服从开发,使用代码天生器可以一键天生前后端代码。
项目

   演示地址:https://carole.top
  默认有两个用户: admin的暗码为carole test的暗码为123456
  github: https://github.com/Carole007/carole-admin
  gitee: https://gitee.com/Carole007/carole-admin
  情况



  • nodejs: v20.12.0
  • mysql: 8.0.12
  • redis
开始

  1. # 克隆项目
  2. git clone https://github.com/Carole007/carole-admin.git
  3. # 导入sql
  4. # 启动redis
  5. # 进入项目目录
  6. cd carole-admin/server
  7. # 安装依赖
  8. npm i  
  9. # 生生当前平台的引擎 生成失败多试几次,或者换个网络
  10. npx prisma generate
  11. # 修改server/src/里面的.env数据库连接配置,以及config.ts里面的redis连接配置,文件上传路径。
  12. # 启动服务
  13. npm run start:dev
  14. # 前台
  15. cd carole-admin/front
  16. npm i
  17. npm run dev
复制代码
内置功能


  • 用户管理:用户是系统操纵者,该功能主要完成系统用户配置。
  • 部分管理:配置系统组织机构。
  • 岗位管理:配置系统用户所属担当职务。
  • 菜单管理:配置系统菜单,操纵权限,按钮权限标识等。
  • 角色管理:角色菜单权限分配、设置角色按机构举行数据范围权限分别。
  • 字典管理:对系统中经常使用的一些较为固定的数据举行维护。
  • 参数管理:对系统动态配置常用参数。
  • 关照公告:系统关照公告信息发布维护。
  • 登录日志:系统登录日志记录查询包罗登录非常。
  • 代码天生:前后端代码的天生(js、vue、sql)支持CRUD下载 。
  • 系统接口:根据业务代码主动天生相关的api接口文档。
  • 在线用户:当前系统中活泼用户状态监控。
  • 服务监控:监督当前系统CPU、内存、磁盘、堆栈等相关信息。
  • 缓存监控:对系统的缓存信息查询,命令统计等。
演示图

文档

主要文件布局

  1. server   #系统后端
  2. front    #系统前端
  3. server/src目录
  4.            ├─admin                 #系统管理模块
  5.            │  ├─gen                #代码生成
  6.            │  └─system             #系统代码
  7.            │  └─admin.module.ts    #系统模块配置
  8.            
  9.            ├─common                #工具类
  10.            │  ├─decorator          #自定义注解   
  11.            │  ├─filter             #异常处理
  12.            │  ├─guard
  13.            │  │  ├─permission      #权限校验
  14.            │  ├─middleware         #中间件
  15.            │  │  └─auth                      #身份校验
  16.            │  ├─pipe                       #自定义管道
  17.            │  ├─prisma-client            #prisma客户端
  18.            │  ├─result                       #返回对象
  19.            │  ├─service
  20.            │  │  ├─auth                      #身份相关处理逻辑
  21.            │  │  ├─gen                       #代码生成逻辑
  22.            │  │  │  └─gen-template #代码模板
  23.            │  └─utils                       #通用工具
  24.            
  25.            ├─prisma
  26.            │  └─schema                      #数据库模型定义
  27.            │  └─schema.prisma      #prisma主文件
  28.            
  29.            ├─schedule                       #定时任务
  30.            
  31.            ├─ │  ├─.env                      #环境变量配置, 密码
  32.            ├─ │  ├─main.ts              #主文件
  33.            ├─ │  ├─config.ts            #系统配置文件
  34.            ├─ │  ├─app.module.ts   #系统主模块
复制代码
配置文件



  • 主要配置 src/config.ts
  1. import * as dotenv from "dotenv";
  2. import { join } from "path";
  3. import { config } from "./common/types/config";
  4. dotenv.config({ path: join(__dirname, ".env") })
  5. export const Config: config = {
  6.   //服务器的HTTP端口,默认为3000
  7.   port: 3000,
  8.   //# 应用的访问路径前缀
  9.   contextPath: "/v1",
  10.   swagger: {
  11.     //是否启用swagger
  12.     enable: true,
  13.     //接口文档路径
  14.     prefix: "/api"
  15.   },
  16.   captcha: {
  17.     //验证码类型 math或text
  18.     mode: "math",
  19.     //验证码过期时间
  20.     expiresIn: 60 * 2,
  21.   },
  22.   //接口限流 2分钟内同一个接口允许60次请求
  23.   rateLimit: {
  24.     ttl: 2 * 60 * 1000,
  25.     limit: 60,
  26.   },
  27.   crypto: {
  28.     //密码加密秘钥
  29.     psdSecret: process.env.psdSecret || "carole123456",
  30.   },
  31.   token: {
  32.     // token加密秘钥
  33.     secret: process.env.tokenSecret || "carole123456",
  34.     //过期时间秒
  35.     expiresIn: 60 * 60 * 24
  36.   },
  37.   prisma: {
  38.     //是否显示执行的sql指令
  39.     logEnable: false,
  40.     //显示那些日志
  41.     log: ['query', 'info', 'warn', 'error']
  42.   },
  43.   //redis连接配置
  44.   redis: {
  45.     //主机地址
  46.     host: '127.0.0.1',
  47.     //端口
  48.     port: 6379,
  49.     //数据库
  50.     db: 5,
  51.     //密码
  52.     //password:""
  53.   },
  54.   upload: {
  55.     //上传文件存储基目录 请设置一个绝对路径
  56.     path: "d:/uploads",
  57.     config: {
  58.       img: {
  59.         fileSize: 2 * 1024 * 1024,
  60.         files: 1,
  61.         fieldSize: 0.5 * 1024 * 1024,
  62.         fields: 100,
  63.         fieldNameSize: 100,
  64.         parts: 100,
  65.         headerPairs: 100,
  66.       },
  67.       file: {
  68.         fileSize: 100 * 1024 * 1024,
  69.         files: 10,
  70.         fieldSize: 0.5 * 1024 * 1024,
  71.         fields: 100,
  72.         fieldNameSize: 100,
  73.         parts: 100,
  74.         headerPairs: 100,
  75.       },
  76.     },
  77.   },
  78.   //生成配置
  79.   gen: {
  80.     //作者
  81.     author: "carole",
  82.     //默认生成模块
  83.     packageName: "admin",
  84.     //子模块目录
  85.     moduleName: "system",
  86.     //是否去除表前缀,默认是false
  87.     autoRemovePre: false,
  88.     //表前缀(生成类名不会包含表前缀,多个用逗号分隔)
  89.     tablePrefix: ["sys_"]
  90.   },
  91.   //邮件发送配置
  92.   mail: {
  93.     //是否启用邮箱
  94.     enable: false,
  95.     //超时设置, 30秒未发送邮件,则返回失败
  96.     timeout: 30 * 1000,
  97.     config: {
  98.       //邮箱服务器 qq:smtp.qq.com 网易: smtp.163.com
  99.       host: process.env.mailHost,
  100.       //端口
  101.       port: 465,
  102.       auth: {
  103.         //用户名
  104.         user: process.env.mailUser,
  105.         //密码
  106.         pass: process.env.mailPass,
  107.       },
  108.       // 端口465设置true, 其他false
  109.       secure: true,
  110.       tls: {
  111.         //建立 TLS 连接时是否应该拒绝未经授权的服务器证书
  112.         rejectUnauthorized: false,
  113.       },
  114.     },
  115.   },
  116. };
复制代码


  • 情况变量配置 src/.env文件
    1. DATABASE_URL="mysql://root:123456@localhost:3306/carole" #url格式  mysql://用户名:密码@ip:端口/数据库?参数charset=utf8mb4
    2. psdSecret = "carole123456"#密码加密秘钥 加密算法:HmacSHA256
    3. tokenSecret = "carole123456" #token加密秘钥
    4. mailHost = ""#邮箱服务器 qq:smtp.qq.com 网易: smtp.163.com
    5. mailUser = "" #发件邮箱账号
    6. mailPass = "" #发件邮箱密码
    复制代码
配置注意点

   数据库中的用户暗码使用默认秘钥加密,假如你修改了暗码加密秘钥,请手动实行 server\test\password.js获取新暗码,并手动更新数据库。
  权限注解

注解权限控制


  • @RequirePermission当前用户必要拥有特定的权限时,才能实行被该注解标注的方法。假如当前用户不具有这样的权限,则方法不会被实行。
  • @RequireRole当前用户必须拥有所有指定的角色时,才能访问被该注解标注的方法。假如当前用户不拥有指定的角色,则方法不会实行。
@RequireRole

@RequireRole注解用于配置接口要求用户拥有指定角色才可访问
参数类型形貌valueString角色 示例:以下代码表示必须拥有admin角色才可访问
  1. @RequireRole("admin")
  2. async test() {
  3.     return Result.ok()
  4. }
复制代码
@RequirePermission

@RequirePermission注解用于配置接口要求用户拥有指定权限才可访问
参数类型形貌valueString权限 示例:以下代码表示必须拥有system:user:remove角色才可访问
  1. @RequirePermission("system:user:remove")
  2. async test() {
  3.     return Result.ok()
  4. }
复制代码
Prisma相关

prisma官方文档
server目录下的两个Prisma的bat脚本功能解释

更新prisma的model.bat



  • 此脚本用于当你已经编写好Prisma的model文件,但数据库布局发生了更改时。它可以同步数据库的最新布局到Prisma的schema文件中。
    相当于实行 npx prisma db pull && npx prisma generate
驼峰天生prisma的model.bat



  • 此脚本用于从数据库中天生Prisma的model定义,适用于数据库表没有在Prisma中的model定义过。(代码天生模板会使用驼峰定名法,并主动添加字段和表的map映射关系。)
    相当于实行 npx prisma db pull 然后把天生Model字段名改为驼峰 实行 npx prisma generate
  • 天生之后会在src/prisma目录中有个introspected.prisma文件,可以更改名字并移动到 src/prisma/schema里面。
   固然,你也可以手动实行Prisma指令之后修改Model。
  注意



  • 实行时,确保model都写好表和字段的映射关系了 @@map映射表 @Map映射字段
    model名称使用PascalCase定名 好比: test -> Test, sys_config -> SysConfig, 假如你不使用代码天生器,无需这样。
​ 示例:
  1. model SysConfig {
  2.   configId    Int     @id @default(autoincrement()) @map("config_id")
  3.   configName  String? @default("") @map("config_name") @db.VarChar(100)
  4.   configKey   String? @default("") @map("config_key") @db.VarChar(100)
  5.   configValue String? @default("") @map("config_value") @db.VarChar(500)
  6.   configType  String? @default("N") @map("config_type") @db.Char(1)
  7.   createBy    String? @default("") @map("create_by") @db.VarChar(64)
  8.   createTime  String? @map("create_time") @db.VarChar(25)
  9.   updateBy    String? @default("") @map("update_by") @db.VarChar(64)
  10.   updateTime  String? @map("update_time") @db.VarChar(25)
  11.   remark      String? @map("remark") @db.VarChar(500)
  12.   @@map("sys_config")
  13. }
复制代码


  • prisma中日期类型字段插入时存在时差问题
           办理办法:把sql中的日期类型改成字符串,插入更新时手动设置时间
  • 当数据库使用 long 类型时,查询出来的数据会主动转换为 bigint。在将这些数据转换为 JSON 时大概会出现问题。可以转换为字符串返回前端,但前端传来数据后端也必要转换为long才能正常使用。
    当数字超出±(2^53 - 1)转换为Number也会出现问题

    1. BigInt.prototype.toJSON = function(){
    2.         return this.toString()
    3. }
    复制代码
          假如您考虑更改数据类型,以下是两种大概的办理方案: 1.使用Int 无符号最大可以存4,294,967,295多条数据,作为主键一般场景完全够用了 2.使用字符串,存uuid (无穷制)
代码天生使用

1、在prisma\schema写好对应表的Model,字段名驼峰映射
2、登录系统(系统工具 -> 代码天生 -> 导入对应表)
3、代码天生列表中找到必要表(可预览、编辑、同步、删除天生配置)
4、点击天生代码会得到一个carole.zip实行sql文件天生菜单权限,按照包内目录布局复制到本身的项目中
5、修改对应模块的module.ts文件,在providers中注册天生的Service,controllers注册天生的Controller类
   代码天生支持编辑、预览、同步
  预览:对天生的代码提前预览,防止出现一些不符合预期的情况。
  同步:对原表的字段举行同步,包括新增、删除、修改的字段处理。
  修改:对天生的代码基本信息、字段信息、天生信息做一系列的调整。
  定时任务

@nestjs/schedule文档
   使用定时任务非常轻易,只需在 server\src\schedule\index.ts中添加添加必要实行的方法并加上@Cron注解并携带cron表达式即可
  示例:
  1. //cron任务,每隔两秒执行一次
  2.   @Cron('*/2 * * * * *')
  3.   testCron() {
  4.     console.log("cron excute...")
  5.   }
复制代码
接口限流

@nestjs/throttler文档
   默认所有接口2分钟内都只答应60次请求,可以在config.ts里面配置rateLimit, 单独定义某个接口,只需加上@Throttle根据本身必要配置即可
  示例:
  1. //1个小时之内只能请求8次  
  2. @Throttle({
  3.     default: {
  4.       limit: 8,
  5.       ttl: 1000 * 60 * 60
  6.     }
  7.   })
  8.   async test1() {
  9.     return Result.ok()
  10.   }
  11. //5s内只能请求一次
  12. @Throttle({
  13.     default: {
  14.       limit: 1,
  15.       ttl: 1000 * 5
  16.     }
  17.   })
  18.   async test2() {
  19.     return Result.ok()
  20.   }
复制代码
发送邮件


  • 修改.env里面的 邮箱毗连账号暗码,和服务器地址
  • 按需修改config.ts的mail配置项,enable为true
  • 参考server\src\common\utils\emial.ts文件使用
部署

  1. #后端
  2. cd server && npm run build
  3. # 把package.json移动到dist目录,上传dist目录到服务器,修改配置
  4. node main.js
  5. #前端
  6. npm run build:prod
复制代码
求Star!!!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

渣渣兔

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表