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...

相关推荐
米诺zuo3 小时前
react 中的useContext和Provider实践
前端·react.js
asdfsdgss3 小时前
Angular CDK 自适应布局技巧:响应式工具实操手册
前端·javascript·angular.js
袁煦丞3 小时前
【私人导航员+内网穿透神器】Sun-Panel × cpolar让NAS变身你的数字管家:cpolar内网穿透实验室第564个成功挑战
前端·程序员·远程工作
爱吃的强哥3 小时前
Electron_Vue3 自定义系统托盘及退出二次确认
前端·javascript·electron
袁煦丞3 小时前
开启SSH后,你的NAS竟成私有云“变形金刚”:cpolar内网穿透实验室第645个成功挑战
前端·程序员·远程工作
IT_陈寒3 小时前
SpringBoot 3.2新特性实战:这5个隐藏功能让我开发效率提升50%
前端·人工智能·后端
申阳4 小时前
2小时个人公司:一个全栈开发的精益创业之路
前端·后端·程序员
用户9873824581014 小时前
5. view component
前端
技术小丁4 小时前
零依赖!教你用原生 JS 把 JSON 数组秒变 CSV 文件
前端·javascript