From 2e9dadbfaf2d1c16dad32384ee780608d1cb9cab Mon Sep 17 00:00:00 2001 From: dylan_xm Date: Wed, 19 Jun 2024 23:26:17 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E8=A7=A3=E6=9E=90?= =?UTF-8?q?=E5=8E=86=E5=8F=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .DS_Store | Bin 10244 -> 10244 bytes service/src/app.module.ts | 2 + service/src/modules/chatgpt/chatgpt.module.ts | 7 +- .../src/modules/chatgpt/chatgpt.service.ts | 13 +- .../modules/parse/parse.controller.spec.ts | 20 +++ service/src/modules/parse/parse.controller.ts | 7 + service/src/modules/parse/parse.entity.ts | 25 ++++ service/src/modules/parse/parse.module.ts | 9 ++ .../src/modules/parse/parse.service.spec.ts | 18 +++ service/src/modules/parse/parse.service.ts | 9 ++ service/src/modules/user/user.entity.ts | 138 +++++++++--------- 11 files changed, 176 insertions(+), 72 deletions(-) create mode 100644 service/src/modules/parse/parse.controller.spec.ts create mode 100644 service/src/modules/parse/parse.controller.ts create mode 100644 service/src/modules/parse/parse.entity.ts create mode 100644 service/src/modules/parse/parse.module.ts create mode 100644 service/src/modules/parse/parse.service.spec.ts create mode 100644 service/src/modules/parse/parse.service.ts diff --git a/.DS_Store b/.DS_Store index a1c772974b270d6d24a6501e79473625c6d030f5..ee10d1c6501082f5f4c889c279d9a57ca3ef1de2 100755 GIT binary patch delta 82 zcmV-Y0ImOoP=rvhI1!VK7ApZ6leiYdlPD4xlav=z22^fuZeF@E2#~mwP7X=LHm{mSv`v zM`Qxo!I@R5lcR;yn3WwICszx}ad9d;1TcWX1D23aT#r5KAh{}y88-OR4=i)HgS5oTrp4EiH! diff --git a/service/src/app.module.ts b/service/src/app.module.ts index 686bfb5..4f05205 100755 --- a/service/src/app.module.ts +++ b/service/src/app.module.ts @@ -37,6 +37,7 @@ import { SalesModule } from './modules/sales/sales.module'; import { SigninModule } from './modules/signin/signin.module'; import { MenuModule } from './modules/menu/menu.module'; import { ModelsModule } from './modules/models/models.module'; +import { ParseModule } from './modules/parse/parse.module'; @Global() @Module({ @@ -75,6 +76,7 @@ import { ModelsModule } from './modules/models/models.module'; SigninModule, MenuModule, ModelsModule, + ParseModule, ], providers: [ { diff --git a/service/src/modules/chatgpt/chatgpt.module.ts b/service/src/modules/chatgpt/chatgpt.module.ts index 951d765..58262e3 100755 --- a/service/src/modules/chatgpt/chatgpt.module.ts +++ b/service/src/modules/chatgpt/chatgpt.module.ts @@ -27,6 +27,8 @@ import { ChatBoxTypeEntity } from './chatBoxType.entity'; import { ChatBoxEntity } from './chatBox.entity'; import { ChatPreTypeEntity } from './chatPreType.entity'; import { ChatPreEntity } from './chatPre.entity'; +import { ParseEntity } from '../parse/parse.entity'; + @Global() @Module({ imports: [ @@ -50,11 +52,12 @@ import { ChatPreEntity } from './chatPre.entity'; ChatBoxTypeEntity, ChatBoxEntity, ChatPreTypeEntity, - ChatPreEntity + ChatPreEntity, + ParseEntity, ]), ], controllers: [ChatgptController], providers: [ChatgptService, UserBalanceService, UserService, VerificationService, ChatLogService, RedisCacheService], - exports: [ChatgptService] + exports: [ChatgptService], }) export class ChatgptModule {} diff --git a/service/src/modules/chatgpt/chatgpt.service.ts b/service/src/modules/chatgpt/chatgpt.service.ts index 2caa569..7872f7f 100755 --- a/service/src/modules/chatgpt/chatgpt.service.ts +++ b/service/src/modules/chatgpt/chatgpt.service.ts @@ -46,6 +46,7 @@ import { ChatPreTypeEntity } from './chatPreType.entity'; import { sendMessageFromKimi } from './kimi'; import { drawImageFromGlm, sendMessageFromGlm } from './glm'; import { parse } from './parse'; +import { ParseEntity } from '../parse/parse.entity'; interface Key { id: number; @@ -75,6 +76,8 @@ export class ChatgptService implements OnModuleInit { private readonly chatPreTypeEntity: Repository, @InjectRepository(ChatPreEntity) private readonly chatPreEntity: Repository, + @InjectRepository(ParseEntity) + private readonly parseRepository: Repository, private readonly configService: ConfigService, private readonly userBalanceService: UserBalanceService, private readonly chatLogService: ChatLogService, @@ -1056,7 +1059,7 @@ export class ChatgptService implements OnModuleInit { async contentParse(body: any, req: Request) { await this.userService.checkUserStatus(req.user); const money = 10; - await this.userBalanceService.validateBalance(req, 'model3Count', money); + await this.userBalanceService.validateBalance(req, 'model3', money); /* 从glm的卡池随机拿一个key */ const detailKeyInfo = await this.modelsService.getGlmKey(); const keyId = detailKeyInfo?.id; @@ -1064,6 +1067,14 @@ export class ChatgptService implements OnModuleInit { console.log('keyId: ', keyId, proxyResUrl, key); const res = await parse(body.messagesHistory, { key, proxyResUrl, keyId }); await this.userBalanceService.deductFromBalance(req.user.id, 'model3', 10, money); + // todo 存入数据库 + const { model } = detailKeyInfo; + await this.parseRepository.save({ + userId: req.user.id, + model, + messages: JSON.stringify(body.messagesHistory), + result: JSON.stringify(res), + }); return res; } } diff --git a/service/src/modules/parse/parse.controller.spec.ts b/service/src/modules/parse/parse.controller.spec.ts new file mode 100644 index 0000000..290bebb --- /dev/null +++ b/service/src/modules/parse/parse.controller.spec.ts @@ -0,0 +1,20 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { ParseController } from './parse.controller'; +import { ParseService } from './parse.service'; + +describe('ParseController', () => { + let controller: ParseController; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + controllers: [ParseController], + providers: [ParseService], + }).compile(); + + controller = module.get(ParseController); + }); + + it('should be defined', () => { + expect(controller).toBeDefined(); + }); +}); diff --git a/service/src/modules/parse/parse.controller.ts b/service/src/modules/parse/parse.controller.ts new file mode 100644 index 0000000..c44004a --- /dev/null +++ b/service/src/modules/parse/parse.controller.ts @@ -0,0 +1,7 @@ +import { Controller } from '@nestjs/common'; +import { ParseService } from './parse.service'; + +@Controller('parse') +export class ParseController { + constructor(private readonly parseService: ParseService) {} +} diff --git a/service/src/modules/parse/parse.entity.ts b/service/src/modules/parse/parse.entity.ts new file mode 100644 index 0000000..44c2ee8 --- /dev/null +++ b/service/src/modules/parse/parse.entity.ts @@ -0,0 +1,25 @@ +import { BaseEntity, Column, Entity, PrimaryColumn } from 'typeorm'; + +@Entity({ name: 'parse_log' }) +export class ParseEntity extends BaseEntity { + @Column({ unique: true, comment: '解析ID', nullable: true }) + id: number; + + @Column({ comment: '请求消息', nullable: true }) + messages: string; + + @Column({ comment: '解析结果' }) + result: string; + + @Column({ comment: '模型', nullable: true }) + model: string; + + @Column({ comment: '用户ID', nullable: true }) + userId: number; + + @Column({ comment: '创建时间' }) + createdAt: Date; + + @Column({ comment: '更新时间' }) + updatedAt: Date; +} diff --git a/service/src/modules/parse/parse.module.ts b/service/src/modules/parse/parse.module.ts new file mode 100644 index 0000000..2de5ea6 --- /dev/null +++ b/service/src/modules/parse/parse.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { ParseService } from './parse.service'; +import { ParseController } from './parse.controller'; + +@Module({ + controllers: [ParseController], + providers: [ParseService] +}) +export class ParseModule {} diff --git a/service/src/modules/parse/parse.service.spec.ts b/service/src/modules/parse/parse.service.spec.ts new file mode 100644 index 0000000..5bbcd2f --- /dev/null +++ b/service/src/modules/parse/parse.service.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { ParseService } from './parse.service'; + +describe('ParseService', () => { + let service: ParseService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [ParseService], + }).compile(); + + service = module.get(ParseService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/service/src/modules/parse/parse.service.ts b/service/src/modules/parse/parse.service.ts new file mode 100644 index 0000000..9dcd0e1 --- /dev/null +++ b/service/src/modules/parse/parse.service.ts @@ -0,0 +1,9 @@ +import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +import { ParseEntity } from './parse.entity'; + +@Injectable() +export class ParseService { + constructor() {} +} diff --git a/service/src/modules/user/user.entity.ts b/service/src/modules/user/user.entity.ts index a490e58..33592fb 100755 --- a/service/src/modules/user/user.entity.ts +++ b/service/src/modules/user/user.entity.ts @@ -1,69 +1,69 @@ -import { Check, Column, Entity, JoinColumn, OneToMany, OneToOne } from 'typeorm'; -import { BaseEntity } from 'src/common/entity/baseEntity'; - -@Entity({ name: 'users' }) -export class UserEntity extends BaseEntity { - @Column({ length: 12, comment: '用户昵称' }) - username: string; - - @Column({ length: 64, comment: '用户密码', nullable: true }) - password: string; - - @Column({ default: 0, comment: '用户状态' }) - status: number; - - @Column({ default: 1, comment: '用户性别' }) - sex: number; - - @Column({ length: 64, unique: true, comment: '用户邮箱' }) - email: string; - - @Column({ length: 64, nullable: true, comment: '用户手机号' }) - phone: string; - - @Column({ - length: 300, - nullable: true, - default: 'https://public-1300678944.cos.ap-shanghai.myqcloud.com/ai/7f042f63f.png', - comment: '用户头像', - }) - avatar: string; - - @Column({ - length: 300, - nullable: true, - default: '我是一台基于深度学习和自然语言处理技术的 AI 机器人,旨在为用户提供高效、精准、个性化的智能服务。', - comment: '用户签名', - }) - sign: string; - - @Column({ length: 64, default: '', comment: '注册IP', nullable: true }) - registerIp: string; - - @Column({ length: 64, default: '', comment: '最后一次登录IP', nullable: true }) - lastLoginIp: string; - - @Column({ length: 10, default: '', comment: '用户邀请码' }) - inviteCode: string; - - @Column({ length: 10, default: '', comment: '用户填写的别人的邀请码' }) - invitedBy: string; - - @Column({ length: 10, default: 'viewer', comment: '用户角色' }) - role: string; - - @Column({ length: 64, default: '', comment: '微信openId', nullable: true }) - openId: string; - - @Column({ length: 64, comment: '用户注册来源', nullable: true }) - client: string; - - @Column({ comment: '用户邀请链接被点击次数', default: 0 }) - inviteLinkCount: number; - - @Column({ comment: '用户连续签到天数', default: 0 }) - consecutiveDays: number; - - @Column({ comment: '用户违规记录次数', default: 0 }) - violationCount: number; -} +import { Check, Column, Entity, JoinColumn, OneToMany, OneToOne } from 'typeorm'; +import { BaseEntity } from 'src/common/entity/baseEntity'; + +@Entity({ name: 'users' }) +export class UserEntity extends BaseEntity { + @Column({ length: 12, comment: '用户昵称' }) + username: string; + + @Column({ length: 64, comment: '用户密码', nullable: true }) + password: string; + + @Column({ default: 0, comment: '用户状态' }) + status: number; + + @Column({ default: 1, comment: '用户性别' }) + sex: number; + + @Column({ length: 64, unique: true, comment: '用户邮箱' }) + email: string; + + @Column({ length: 64, nullable: true, comment: '用户手机号' }) + phone: string; + + @Column({ + length: 300, + nullable: true, + default: 'https://public-1300678944.cos.ap-shanghai.myqcloud.com/ai/7f042f63f.png', + comment: '用户头像', + }) + avatar: string; + + @Column({ + length: 300, + nullable: true, + default: '我是一台基于深度学习和自然语言处理技术的 AI 机器人,旨在为用户提供高效、精准、个性化的智能服务。', + comment: '用户签名', + }) + sign: string; + + @Column({ length: 64, default: '', comment: '注册IP', nullable: true }) + registerIp: string; + + @Column({ length: 64, default: '', comment: '最后一次登录IP', nullable: true }) + lastLoginIp: string; + + @Column({ length: 10, default: '', comment: '用户邀请码' }) + inviteCode: string; + + @Column({ length: 10, default: '', comment: '用户填写的别人的邀请码' }) + invitedBy: string; + + @Column({ length: 10, default: 'viewer', comment: '用户角色' }) + role: string; + + @Column({ length: 64, default: '', comment: '微信openId', nullable: true }) + openId: string; + + @Column({ length: 64, comment: '用户注册来源', nullable: true }) + client: string; + + @Column({ comment: '用户邀请链接被点击次数', default: 0 }) + inviteLinkCount: number; + + @Column({ comment: '用户连续签到天数', default: 0 }) + consecutiveDays: number; + + @Column({ comment: '用户违规记录次数', default: 0 }) + violationCount: number; +}