From 14572ce6fac139a7520d8cdefebb27ca6006ae6b Mon Sep 17 00:00:00 2001 From: xion Date: Thu, 20 Feb 2025 11:51:43 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BF=AE=E6=94=B9=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E9=83=A8=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/models/user.ts | 33 ++++++++++++++++++++--- src/routes/user/index.ts | 2 ++ src/routes/user/update.ts | 56 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 87 insertions(+), 4 deletions(-) create mode 100644 src/routes/user/update.ts diff --git a/src/models/user.ts b/src/models/user.ts index c4bbf73..e953871 100644 --- a/src/models/user.ts +++ b/src/models/user.ts @@ -1,7 +1,7 @@ import { useConfig } from '@kevisual/use-config'; import { sequelize } from '@/modules/sequelize.ts'; import { DataTypes, Model, Op } from 'sequelize'; -import { createToken, checkToken } from '@kevisual/auth/token'; +import { createToken, checkToken } from '@kevisual/auth'; import { cryptPwd } from '@kevisual/auth'; import { nanoid } from 'nanoid'; import { CustomError } from '@kevisual/router'; @@ -36,11 +36,22 @@ export class User extends Model { * @param uid * @returns */ - async createToken(uid?: string, loginType?: 'default' | 'plugin') { + async createToken(uid?: string, loginType?: 'default' | 'plugin' | 'month' | 'season' | 'year' ) { const { id, username, type } = this; let expireTime = 60 * 60 * 24 * 7; // 7 days - if (loginType === 'plugin') { - expireTime = 60 * 60 * 24 * 30; // 30 days + switch (loginType) { + case 'plugin': + expireTime = 60 * 60 * 24 * 30 * 12; // 365 days + break; + case 'month': + expireTime = 60 * 60 * 24 * 30; // 30 days + break; + case 'season': + expireTime = 60 * 60 * 24 * 30 * 3; // 90 days + break; + case 'year': + expireTime = 60 * 60 * 24 * 30 * 12; // 365 days + break; } const now = new Date().getTime(); const token = await createToken({ id, username, uid, type }, config.tokenSecret); @@ -96,6 +107,7 @@ export class User extends Model { return { id: this.id, username: this.username, + nickname: this.nickname, description: this.description, needChangePassword: this.needChangePassword, type: this.type, @@ -243,3 +255,16 @@ export const CreateDemoUser = async () => { } }; // initializeUser(); + +export class UserServices extends User { + static async loginByPhone(phone: string) { + let user = await User.findOne({ where: { username: phone } }); + let isNew = false; + if (!user) { + user = await User.createUser(phone, phone.slice(-6)); + isNew = true; + } + const token = await user.createToken(null, 'season'); + return { ...token, isNew }; + } +} diff --git a/src/routes/user/index.ts b/src/routes/user/index.ts index 36ee905..dc57b21 100644 --- a/src/routes/user/index.ts +++ b/src/routes/user/index.ts @@ -2,3 +2,5 @@ import './list.ts'; import './org.ts'; import './me.ts'; + +import './update.ts' diff --git a/src/routes/user/update.ts b/src/routes/user/update.ts new file mode 100644 index 0000000..1664acc --- /dev/null +++ b/src/routes/user/update.ts @@ -0,0 +1,56 @@ +import { app } from '@/app.ts' +import { User } from '@/models/user.ts' + +app + .route({ + path: 'user', + key: 'getUpdateInfo', + middleware: ['auth'] + }) + .define(async (ctx) => { + const tokenUser = ctx.state?.tokenUser || {} + const user = await User.findByPk(tokenUser.id) + if (!user) { + ctx.throw(500, 'user not found') + } + ctx.body = { + nickname: user.nickname, + avatar: user.avatar, + data: user.data + } + }) + .addTo(app) +app + .route('user', 'updateInfo', { + middleware: ['auth'] + }) + .define(async (ctx) => { + const { nickname, avatar, data } = ctx.query.data || {} + const tokenUser = ctx.state?.tokenUser || {} + const { id } = tokenUser + const user = await User.findByPk(id) + let updateData: any = {} + if (!user) { + ctx.throw(500, 'user not found') + } + if (nickname) { + updateData.nickname = nickname + } + if (avatar) { + updateData.avatar = avatar + } + await user.update( + { + ...updateData, + data: { + ...user.data, + ...data + } + }, + { + fields: ['nickname', 'avatar', 'data'] + } + ) + ctx.body = await user.getInfo() + }) + .addTo(app)