From 741fde2d1f916124c07d7f72839ccb73d39ae532 Mon Sep 17 00:00:00 2001 From: expressgy Date: Tue, 25 Mar 2025 11:59:24 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 1 + src/entities/schema.js | 255 ++++++++++++++++++++++++++++++++--- src/plugins/swagger/index.js | 1 + src/routes/index.js | 22 +++ src/routes/user.route.js | 54 ++++++++ src/schema/user.schema.js | 3 + src/services/user.service.js | 36 +---- 7 files changed, 323 insertions(+), 49 deletions(-) create mode 100644 src/routes/user.route.js create mode 100644 src/schema/user.schema.js diff --git a/package.json b/package.json index c6e5cfa..89f9a1e 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "#config/*": "./config/*.js", "#start": "./src/utils/start.js", "#plugins/*": "./src/plugins/*.js", + "#routes/*": "./src/routes/*.js", "#src/*": "./src/*.js" }, "engines": { diff --git a/src/entities/schema.js b/src/entities/schema.js index 7c3240e..73f4ba9 100644 --- a/src/entities/schema.js +++ b/src/entities/schema.js @@ -1,17 +1,242 @@ -/** - * @typedef {import('drizzle-orm/mysql-core').MySqlTable} MySqlTable - * @typedef {import('drizzle-orm/mysql-core').varchar} varchar - * @typedef {import('drizzle-orm/mysql-core').int} int - */ +import { mysqlTable, mysqlSchema, AnyMySqlColumn, primaryKey, unique, bigint, int, tinyint, varchar, datetime } from "drizzle-orm/mysql-core" +import { sql } from "drizzle-orm" -import { mysqlTable, varchar, int } from 'drizzle-orm/mysql-core'; +export const sysDict = mysqlTable("sys_dict", { + id: bigint({ mode: "number" }).autoincrement().notNull(), + version: int().default(0).notNull(), + pid: bigint({ mode: "number" }).notNull(), + module: tinyint(), + dictKey: varchar("dict_key", { length: 255 }), + value: varchar({ length: 255 }), + description: varchar({ length: 255 }), + sort: int().default(0).notNull(), + status: int().notNull(), + createdBy: bigint("created_by", { mode: "number" }).notNull(), + updatedBy: bigint("updated_by", { mode: "number" }).notNull(), + createdAt: datetime("created_at", { mode: 'string'}).default(sql`(CURRENT_TIMESTAMP)`).notNull(), + updatedAt: datetime("updated_at", { mode: 'string'}).default(sql`(CURRENT_TIMESTAMP)`).notNull(), +}, +(table) => [ + primaryKey({ columns: [table.id], name: "sys_dict_id"}), + unique("uniq_dict_key").on(table.dictKey, table.pid), +]); -/** - * 用户模型 - * @type {MySqlTable} - */ -export const users = mysqlTable('users', { - id: int('id').primaryKey(), - name: varchar('name', { length: 255 }), - email: varchar('email', { length: 255 }).unique(), -}); +export const sysOrganization = mysqlTable("sys_organization", { + orgId: bigint("org_id", { mode: "number" }).autoincrement().notNull(), + pid: bigint({ mode: "number" }).notNull(), + orgName: varchar("org_name", { length: 255 }), + orgCode: varchar("org_code", { length: 128 }), + orgType: int("org_type").notNull(), + description: varchar({ length: 255 }), + sort: int().default(0).notNull(), + status: int().notNull(), + createdBy: bigint("created_by", { mode: "number" }).notNull(), + updatedBy: bigint("updated_by", { mode: "number" }).notNull(), + createdAt: datetime("created_at", { mode: 'string'}).default(sql`(CURRENT_TIMESTAMP)`).notNull(), + updatedAt: datetime("updated_at", { mode: 'string'}).default(sql`(CURRENT_TIMESTAMP)`).notNull(), +}, +(table) => [ + primaryKey({ columns: [table.orgId], name: "sys_organization_org_id"}), + unique("uniq_org_code").on(table.orgCode, table.pid), + unique("uniq_org_name").on(table.orgName, table.pid), +]); + +export const sysOrganizationManager = mysqlTable("sys_organization_manager", { + id: bigint({ mode: "number" }).autoincrement().notNull(), + version: int().default(0).notNull(), + orgId: bigint("org_id", { mode: "number" }).notNull(), + userId: bigint("user_id", { mode: "number" }).notNull(), + rank: int().notNull(), + description: varchar({ length: 255 }), + createdBy: bigint("created_by", { mode: "number" }).notNull(), + updatedBy: bigint("updated_by", { mode: "number" }).notNull(), + createdAt: datetime("created_at", { mode: 'string'}).default(sql`(CURRENT_TIMESTAMP)`).notNull(), + updatedAt: datetime("updated_at", { mode: 'string'}).default(sql`(CURRENT_TIMESTAMP)`).notNull(), +}, +(table) => [ + primaryKey({ columns: [table.id], name: "sys_organization_manager_id"}), + unique("uniq_org_user").on(table.orgId, table.userId), +]); + +export const sysPermission = mysqlTable("sys_permission", { + permId: bigint("perm_id", { mode: "number" }).autoincrement().notNull(), + pid: bigint({ mode: "number" }).notNull(), + permName: varchar("perm_name", { length: 255 }).notNull(), + permKey: varchar("perm_key", { length: 255 }).notNull(), + url: varchar({ length: 255 }), + avatarUrl: varchar("avatar_url", { length: 255 }), + description: varchar({ length: 255 }), + permType: int("perm_type").notNull(), + isVisible: int("is_visible").default(0).notNull(), + version: int().default(0).notNull(), + sort: int().default(0).notNull(), + status: int().notNull(), + createdBy: bigint("created_by", { mode: "number" }).notNull(), + updatedBy: bigint("updated_by", { mode: "number" }).notNull(), + createdAt: datetime("created_at", { mode: 'string'}).default(sql`(CURRENT_TIMESTAMP)`).notNull(), + updatedAt: datetime("updated_at", { mode: 'string'}).default(sql`(CURRENT_TIMESTAMP)`).notNull(), +}, +(table) => [ + primaryKey({ columns: [table.permId], name: "sys_permission_perm_id"}), + unique("uniq_pid_name").on(table.permName, table.pid), + unique("uniq_perm_key").on(table.permKey), +]); + +export const sysReRolePermission = mysqlTable("sys_re_role_permission", { + id: bigint({ mode: "number" }).autoincrement().notNull(), + roleId: bigint("role_id", { mode: "number" }).notNull(), + permId: bigint("perm_id", { mode: "number" }).notNull(), + createdBy: bigint("created_by", { mode: "number" }).notNull(), + updatedBy: bigint("updated_by", { mode: "number" }).notNull(), + createdAt: datetime("created_at", { mode: 'string'}).default(sql`(CURRENT_TIMESTAMP)`).notNull(), + updatedAt: datetime("updated_at", { mode: 'string'}).default(sql`(CURRENT_TIMESTAMP)`).notNull(), +}, +(table) => [ + primaryKey({ columns: [table.id], name: "sys_re_role_permission_id"}), + unique("uniq_perm_role").on(table.roleId, table.permId), +]); + +export const sysReUserOrganization = mysqlTable("sys_re_user_organization", { + id: bigint({ mode: "number" }).autoincrement().notNull(), + userId: bigint("user_id", { mode: "number" }).notNull(), + orgId: bigint("org_id", { mode: "number" }).notNull(), + version: int().default(0).notNull(), + createdBy: bigint("created_by", { mode: "number" }).notNull(), + updatedBy: bigint("updated_by", { mode: "number" }).notNull(), + createdAt: datetime("created_at", { mode: 'string'}).default(sql`(CURRENT_TIMESTAMP)`).notNull(), + updatedAt: datetime("updated_at", { mode: 'string'}).default(sql`(CURRENT_TIMESTAMP)`).notNull(), +}, +(table) => [ + primaryKey({ columns: [table.id], name: "sys_re_user_organization_id"}), + unique("uniq_user_org").on(table.userId, table.orgId), +]); + +export const sysReUserRole = mysqlTable("sys_re_user_role", { + id: bigint({ mode: "number" }).autoincrement().notNull(), + userId: bigint("user_id", { mode: "number" }).notNull(), + roleId: bigint("role_id", { mode: "number" }).notNull(), + version: int().default(0).notNull(), + createdBy: bigint("created_by", { mode: "number" }).notNull(), + updatedBy: bigint("updated_by", { mode: "number" }).notNull(), + createdAt: datetime("created_at", { mode: 'string'}).default(sql`(CURRENT_TIMESTAMP)`).notNull(), + updatedAt: datetime("updated_at", { mode: 'string'}).default(sql`(CURRENT_TIMESTAMP)`).notNull(), +}, +(table) => [ + primaryKey({ columns: [table.id], name: "sys_re_user_role_id"}), + unique("uniq_user_role").on(table.userId, table.roleId), +]); + +export const sysRole = mysqlTable("sys_role", { + roleId: bigint("role_id", { mode: "number" }).autoincrement().notNull(), + pid: bigint({ mode: "number" }).notNull(), + roleName: varchar("role_name", { length: 255 }).notNull(), + roleKey: varchar("role_key", { length: 255 }).notNull(), + description: varchar({ length: 255 }), + status: int().notNull(), + createdBy: bigint("created_by", { mode: "number" }).notNull(), + updatedBy: bigint("updated_by", { mode: "number" }).notNull(), + createdAt: datetime("created_at", { mode: 'string'}).default(sql`(CURRENT_TIMESTAMP)`).notNull(), + updatedAt: datetime("updated_at", { mode: 'string'}).default(sql`(CURRENT_TIMESTAMP)`).notNull(), +}, +(table) => [ + primaryKey({ columns: [table.roleId], name: "sys_role_role_id"}), + unique("uniq_role_pid").on(table.roleName, table.pid), +]); + +export const sysUser = mysqlTable("sys_user", { + userId: bigint("user_id", { mode: "number" }).notNull(), + pid: bigint({ mode: "number" }).notNull(), + username: varchar({ length: 255 }).notNull(), + email: varchar({ length: 255 }).notNull(), + phone: varchar({ length: 255 }), + avatarUrl: varchar("avatar_url", { length: 255 }), + userType: tinyint("user_type"), + status: tinyint().default(0).notNull(), + createdBy: bigint("created_by", { mode: "number" }).notNull(), + updatedBy: bigint("updated_by", { mode: "number" }).notNull(), + createdAt: datetime("created_at", { mode: 'string'}).default(sql`(CURRENT_TIMESTAMP)`).notNull(), + updatedAt: datetime("updated_at", { mode: 'string'}).default(sql`(CURRENT_TIMESTAMP)`).notNull(), +}, +(table) => [ + primaryKey({ columns: [table.userId], name: "sys_user_user_id"}), + unique("uniq_username").on(table.username), + unique("uniq_email").on(table.email), +]); + +export const sysUserAuth = mysqlTable("sys_user_auth", { + userId: bigint("user_id", { mode: "number" }).notNull(), + passwordHash: varchar("password_hash", { length: 255 }).notNull(), + passwordModified: datetime("password_modified", { mode: 'string'}).notNull(), + passwordExpire: datetime("password_expire", { mode: 'string'}), +}, +(table) => [ + primaryKey({ columns: [table.userId], name: "sys_user_auth_user_id"}), +]); + +export const sysUserAuthHistory = mysqlTable("sys_user_auth_history", { + id: bigint({ mode: "number" }).autoincrement().notNull(), + userId: bigint("user_id", { mode: "number" }).notNull(), + passwordHash: varchar("password_hash", { length: 255 }).notNull(), + modifiedAt: varchar("modified_at", { length: 255 }).notNull(), +}, +(table) => [ + primaryKey({ columns: [table.id], name: "sys_user_auth_history_id"}), +]); + +export const sysUserFieldDefinition = mysqlTable("sys_user_field_definition", { + fieldId: bigint("field_id", { mode: "number" }).autoincrement().notNull(), + version: int().default(0).notNull(), + fieldName: varchar("field_name", { length: 255 }).notNull(), + fieldKey: varchar("field_key", { length: 255 }).notNull(), + fieldType: tinyint("field_type").notNull(), + dictModule: int("dict_module"), + isRequired: tinyint("is_required").default(0).notNull(), + limit: int(), + description: varchar({ length: 255 }), + defaultValue: varchar("default_value", { length: 255 }), + defaultOptions: varchar("default_options", { length: 255 }), + sort: int().default(0).notNull(), + status: int().notNull(), + createdBy: bigint("created_by", { mode: "number" }).notNull(), + updatedBy: bigint("updated_by", { mode: "number" }).notNull(), + createdAt: datetime("created_at", { mode: 'string'}).default(sql`(CURRENT_TIMESTAMP)`).notNull(), + updatedAt: datetime("updated_at", { mode: 'string'}).default(sql`(CURRENT_TIMESTAMP)`).notNull(), +}, +(table) => [ + primaryKey({ columns: [table.fieldId], name: "sys_user_field_definition_field_id"}), + unique("uniq_field_name").on(table.fieldName), + unique("uniq_field_key").on(table.fieldKey), +]); + +export const sysUserFieldValue = mysqlTable("sys_user_field_value", { + id: bigint({ mode: "number" }).autoincrement().notNull(), + userId: bigint("user_id", { mode: "number" }).notNull(), + fieldId: int("field_id").notNull(), + value: varchar({ length: 4096 }), + createdBy: bigint("created_by", { mode: "number" }).notNull(), + updatedBy: bigint("updated_by", { mode: "number" }).notNull(), + createdAt: datetime("created_at", { mode: 'string'}).default(sql`(CURRENT_TIMESTAMP)`).notNull(), + updatedAt: datetime("updated_at", { mode: 'string'}).default(sql`(CURRENT_TIMESTAMP)`).notNull(), +}, +(table) => [ + primaryKey({ columns: [table.id], name: "sys_user_field_value_id"}), + unique("uniq_user_field").on(table.userId, table.fieldId), +]); + +export const sysUserProfile = mysqlTable("sys_user_profile", { + id: bigint({ mode: "number" }).autoincrement().notNull(), + version: int().default(0).notNull(), + name: varchar({ length: 32 }).notNull(), + profileKey: varchar("profile_key", { length: 255 }).notNull(), + description: varchar({ length: 255 }), + content: varchar({ length: 255 }), + createdBy: bigint("created_by", { mode: "number" }).notNull(), + updatedBy: bigint("updated_by", { mode: "number" }).notNull(), + createdAt: datetime("created_at", { mode: 'string'}).default(sql`(CURRENT_TIMESTAMP)`).notNull(), + updatedAt: datetime("updated_at", { mode: 'string'}).default(sql`(CURRENT_TIMESTAMP)`).notNull(), +}, +(table) => [ + primaryKey({ columns: [table.id], name: "sys_user_profile_id"}), + unique("uniq_name").on(table.name), + unique("uniq_profile_key").on(table.profileKey), +]); diff --git a/src/plugins/swagger/index.js b/src/plugins/swagger/index.js index ebe3fb2..ca420ed 100644 --- a/src/plugins/swagger/index.js +++ b/src/plugins/swagger/index.js @@ -20,6 +20,7 @@ async function swagger(fastify, options) { routePrefix: '/docs', }); fastify.log.warn('Register Swagger complete!'); + fastify.log.info(`Swagger documentation available at http://127.0.0.1:${fastify.config.server.port}/docs`); } export default fastifyPlugin(swagger); \ No newline at end of file diff --git a/src/routes/index.js b/src/routes/index.js index 6097694..fdda2bd 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -1,5 +1,6 @@ import { testSchema } from "#src/schema/test.schema"; import { testService } from "#src/services/test.service"; +import userRoute from "#routes/user.route"; export default async function routes(fastify, options) { // 定义一个GET请求的路由,路径为根路径 @@ -8,6 +9,21 @@ export default async function routes(fastify, options) { return fastify.config; }); fastify.get('/test', testSchema , testService); + + + // 注册子路由 + fastify.register(userRoute, { prefix: '/user' }); + + + + + + + + + + + fastify.route({ method: 'POST', url: '/login', @@ -48,4 +64,10 @@ export default async function routes(fastify, options) { // ...业务逻辑... } }); + + // 输出路由树 + fastify.ready(() => { + fastify.log.info('Routes Registered!'); + fastify.log.info('\n' + fastify.printRoutes()); + }); } diff --git a/src/routes/user.route.js b/src/routes/user.route.js new file mode 100644 index 0000000..c183ccf --- /dev/null +++ b/src/routes/user.route.js @@ -0,0 +1,54 @@ +import { userDefaultSchema } from "#src/schema/user.schema"; +import { userDefaultService } from "#src/services/user.service"; + +export default async function userRoute(fastify, options) { + fastify.get('/', userDefaultSchema, userDefaultService); +/** + * + * 个人接口 + * +*/ + // 注册 + fastify.post('/register', userDefaultSchema, userDefaultService); + // 登录 + fastify.post('/login', userDefaultSchema, userDefaultService); + // 退出登录 + fastify.post('/logout', userDefaultSchema, userDefaultService); + // 修改密码 + fastify.post('/changePassword', userDefaultSchema, userDefaultService); + // 获取当前用户信息 + fastify.get('/getUserInfo', userDefaultSchema, userDefaultService); + // 修改当前用户信息 + fastify.post('/updateUserInfo', userDefaultSchema, userDefaultService); +/** + * + * 管理接口 + * +*/ + + // 获取用户列表 + + // 获取用户详细信息 + + // 创建用户 + + // 更新用户信息 + + // 批量删除用户 + + // 批量重置用户密码 + + // 批量启用用户 + + // 批量禁用用户 + +/** + * + * 拓展字段 + * +*/ + + // 获取拓展字段列表 + + +} \ No newline at end of file diff --git a/src/schema/user.schema.js b/src/schema/user.schema.js new file mode 100644 index 0000000..942a6a2 --- /dev/null +++ b/src/schema/user.schema.js @@ -0,0 +1,3 @@ +export const userDefaultSchema = { + +} \ No newline at end of file diff --git a/src/services/user.service.js b/src/services/user.service.js index 3d09096..d1b566c 100644 --- a/src/services/user.service.js +++ b/src/services/user.service.js @@ -1,35 +1,3 @@ -import { eq } from 'drizzle-orm'; -import { users } from '#db/schema'; - -/** - * 用户服务模块 - * @param {object} fastify - Fastify实例 - */ -export default async function userService(fastify) { - const { db } = fastify; - - return { - /** - * 根据ID获取用户 - * @param {number} userId - 用户ID - * @returns {Promise} 用户对象 - */ - async getUserById(userId) { - return db - .select() - .from(users) - .where(eq(users.id, userId)) - .limit(1) - .then(res => res[0]); - }, - - /** - * 创建新用户 - * @param {object} userData - 用户数据 - * @returns {Promise} 创建的用户记录 - */ - async createUser(userData) { - return db.insert(users).values(userData).returning(); - }, - }; +export async function userDefaultService() { + return 'user service'; }