002.nestjs后台管理项目-数据库之prisma(上)

数据库 - prisma

本章学习一下prisma,贴一下prisma的官方文档地址 www.prisma.io/

本章版本号 6.18 ,本章sql类型:mysql

1.安装包和初始化

css 复制代码
pnpm i prisma  @prisma/client  -D

npx prisma init

初始化文件之后 生成了 schema.prisma,和 prisma.config.ts

2.修改配置

prisma.config.ts

php 复制代码
import path from "path";
import { defineConfig, env } from "prisma/config";

export default defineConfig({
  schema: path.join("prisma"),
  migrations: {
    path: "prisma/migrations",
  },
  engine: "classic",
  datasource: {
    url: env("DATABASE_URL"),
  },
});

schema.prisma

ini 复制代码
datasource db {
  provider = "mysql"
  url      = env("DATABASE_URL")
}

.env 添加 DATABASE_URL 配置

ini 复制代码
mysql://USER:PASSWORD@HOST:PORT/DATABASE?connection_limit=5&socket_timeout=3

3.配置数据库文件

参考目录如下

user.prisma

tsx 复制代码
model User {
  id       Int        @id @default(autoincrement())
  userCode String     @unique @map("user_code") @db.VarChar(32)
  userName String     @map("user_name")
  email    String
  password String     @db.VarChar(255)
  avatar   String?
  status   UserStatus @default(ACTIVE)

  deleted   Boolean   @default(false)
  createdAt DateTime  @default(now()) @map("created_at")
  createdBy String?   @map("created_by") @db.VarChar(32)
  updatedAt DateTime? @map("updated_at")
  updatedBy String?   @map("updated_by") @db.VarChar(32)
  deletedAt DateTime? @map("deleted_at")
  deletedBy String?   @map("deleted_by") @db.VarChar(32)

  roles UserRole[]

  @@index([deleted])
  @@map("users")
}

enum UserStatus {
  ACTIVE
  INACTIVE
}

类型

参考链接:www.prisma.io/docs/orm/ov...

Prisma ORM Mysql 备注
String VARCHAR(192)
Boolean BOOLEAN 其实就是 TINYINT(1)
Int INT
BigInt BIGINT
Float DOUBLE
Decimal DECIMAL(65,30)
DateTime DATETIME(3) 不支持0000-00-00
Json JSON 支持MySQL5.7+
Bytes LONGLOB
enum Enum

属性

参考链接:www.prisma.io/docs/orm/pr...

标识 说明
@id @default(autoincrement()) id 列
@default(false) 默认值
@db.VarChar(31) string值
@unique 唯一索引
@map("created_at") 列别名
@@unique([authorId, title]) 联合唯一索引
@@index([deleted]) 表索引
@@map("users") 表别名

4.命令修改

修改package.json

没有安装dotent-cli的安装一下

pnpm i tsx -D

参考链接 : www.prisma.io/docs/orm/mo...

json 复制代码
{
    "prisma:dev": "dotenv -e .env.development -- npx prisma migrate dev",
    "prisma:reset": "dotenv -e .env.development -- npx prisma migrate reset",
    "prisma:init": "dotenv -e .env.development  -- npx tsx prisma/seed.ts"
}

直接 npm run prisma:dev

5.添加小测

添加seed.ts文件

javascript 复制代码
import { PrismaClient } from "generated/prisma/client";
import {
  PermissionCreateManyInput,
  UserCreateManyInput,
} from "generated/prisma/models";
import bcrypt from "bcrypt";

const client = new PrismaClient();
async function main() {
  // 首先删除所有现有数据,注意删除顺序以避免外键约束冲突
  await client.rolePermission.deleteMany({});
  await client.userRole.deleteMany({});
  await client.permission.deleteMany({});
  await client.role.deleteMany({});
  await client.user.deleteMany({});

  // 定义权限菜单项
  const permissions = [
    // 一级菜单
    {
      permissionName: "系统管理",
      permissionCode: "p-system-manage",
      path: "/system",
      action: "manage",
      resourceType: "MENU",
      level: 1,
    },

    // 二级菜单 - 用户管理
    {
      permissionName: "用户管理",
      permissionCode: "p-user-manage",
      path: "/system/user",
      action: "manage",
      resourceType: "MENU",
      level: 2,
      parentPermissionCode: "p-system-manage",
    },
    // 用户管理相关API权限
    {
      permissionName: "用户查询",
      permissionCode: "p-user-query",
      path: "/api/users",
      action: "read",
      resourceType: "API",
      level: 3,
      parentPermissionCode: "p-user-manage",
    },
    {
      permissionName: "用户创建",
      permissionCode: "p-user-create",
      path: "/api/users",
      action: "create",
      resourceType: "API",
      level: 3,
      parentPermissionCode: "p-user-manage",
    },
    {
      permissionName: "用户编辑",
      permissionCode: "p-user-update",
      path: "/api/users/*",
      action: "update",
      resourceType: "API",
      level: 3,
      parentPermissionCode: "p-user-manage",
    },
    {
      permissionName: "用户删除",
      permissionCode: "p-user-delete",
      path: "/api/users/*",
      action: "delete",
      resourceType: "API",
      level: 3,
      parentPermissionCode: "p-user-manage",
    },

    // 二级菜单 - 角色管理
    {
      permissionName: "角色管理",
      permissionCode: "p-role-manage",
      path: "/system/role",
      action: "manage",
      resourceType: "MENU",
      level: 2,
      parentPermissionCode: "p-system-manage",
    },
    // 角色管理相关API权限
    {
      permissionName: "角色查询",
      permissionCode: "p-role-query",
      path: "/api/roles",
      action: "read",
      resourceType: "API",
      level: 3,
      parentPermissionCode: "p-role-manage",
    },
    {
      permissionName: "角色创建",
      permissionCode: "p-role-create",
      path: "/api/roles",
      action: "create",
      resourceType: "API",
      level: 3,
      parentPermissionCode: "p-role-manage",
    },
    {
      permissionName: "角色编辑",
      permissionCode: "p-role-update",
      path: "/api/roles/*",
      action: "update",
      resourceType: "API",
      level: 3,
      parentPermissionCode: "p-role-manage",
    },
    {
      permissionName: "角色删除",
      permissionCode: "p-role-delete",
      path: "/api/roles/*",
      action: "delete",
      resourceType: "API",
      level: 3,
      parentPermissionCode: "p-role-manage",
    },

    // 二级菜单 - 权限管理
    {
      permissionName: "权限管理",
      permissionCode: "p-permission-manage",
      path: "/system/permission",
      action: "manage",
      resourceType: "MENU",
      level: 2,
      parentPermissionCode: "p-system-manage",
    },
    // 权限管理相关API权限
    {
      permissionName: "权限查询",
      permissionCode: "p-permission-query",
      path: "/api/permissions",
      action: "read",
      resourceType: "API",
      level: 3,
      parentPermissionCode: "p-permission-manage",
    },
    {
      permissionName: "权限创建",
      permissionCode: "p-permission-create",
      path: "/api/permissions",
      action: "create",
      resourceType: "API",
      level: 3,
      parentPermissionCode: "p-permission-manage",
    },
    {
      permissionName: "权限编辑",
      permissionCode: "p-permission-update",
      path: "/api/permissions/*",
      action: "update",
      resourceType: "API",
      level: 3,
      parentPermissionCode: "p-permission-manage",
    },
    {
      permissionName: "权限删除",
      permissionCode: "p-permission-delete",
      path: "/api/permissions/*",
      action: "delete",
      resourceType: "API",
      level: 3,
      parentPermissionCode: "p-permission-manage",
    },
  ] as PermissionCreateManyInput[];

  // 加密密码
  const saltRounds = 10;
  const adminPassword = await bcrypt.hash("admin@123", saltRounds);
  const userPassword = await bcrypt.hash("user@123", saltRounds);

  // 定义角色
  const roles = [
    {
      roleName: "超级管理员",
      roleCode: "r-super-admin",
    },
    {
      roleName: "普通用户",
      roleCode: "r-user",
    },
  ];

  // 定义用户
  const users = [
    {
      userCode: "admin",
      userName: "管理员",
      email: "admin@example.com",
      password: adminPassword,
    },
    {
      userCode: "user",
      userName: "普通用户",
      email: "user@example.com",
      password: userPassword,
    },
  ] as UserCreateManyInput[];

  // 创建用户
  await client.user.createMany({
    data: users,
  });

  // 创建权限
  await client.permission.createMany({
    data: permissions,
  });

  // 创建角色
  await client.role.createMany({
    data: roles,
  });

  // 用户角色关联
  const userRoles = [
    {
      userCode: "admin",
      roleCode: "r-super-admin",
    },
    {
      userCode: "user",
      roleCode: "r-user",
    },
  ];

  await client.userRole.createMany({
    data: userRoles,
  });

  // 角色权限关联
  const rolePermissions = [
    // 超级管理员拥有所有权限
    ...permissions.map((permission) => ({
      roleCode: "r-super-admin",
      permissionCode: permission.permissionCode,
    })),
  ];

  await client.rolePermission.createMany({
    data: rolePermissions,
  });
}

main().then(() => {
  client.$disconnect();
});

直接 npm run prisma:init


这样初始化的一个项目的prisma就好了

项目地址 :github.com/shenbo1/nes...

相关推荐
q***31145 小时前
【Springboot3+vue3】从零到一搭建Springboot3+vue3前后端分离项目之后端环境搭建
android·前端·后端
q***12536 小时前
Plugin ‘org.springframework.bootspring-boot-maven-plugin‘ not found(已解决)
java·前端·maven
攻城狮CSU6 小时前
C# 异步方法
开发语言·前端·c#
tyro曹仓舒6 小时前
干了10年前端,才学会使用IntersectionObserver
前端·javascript
S***y3966 小时前
前端微前端框架对比,qiankun与icestark
前端·前端框架
Wect6 小时前
学习React-DnD:实现多任务项拖拽-useDrop处理
前端·react.js
Mintopia6 小时前
Trae Coding - 「Excel 秒变海报」—— 上传 CSV,一句话生成可打印信息图。
前端·人工智能·trae
晴殇i7 小时前
CSS 相对颜色:告别 180 个颜色变量的设计系统噩梦
前端·css
MegatronKing7 小时前
Reqable 3.0版本云同步的实践过程
前端·后端·测试
李剑一7 小时前
我用Trae生成了一个Echarts 3D柱状图的Demo
前端·vue.js·trae