From b064e704f38751f69947daba8848627f8ce253df Mon Sep 17 00:00:00 2001 From: archer <545436317@qq.com> Date: Mon, 17 Apr 2023 18:42:56 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=E9=82=AE=E7=AE=B1?= =?UTF-8?q?=E5=92=8C=E6=89=8B=E6=9C=BA=E5=8F=B7=E5=90=8C=E6=97=B6=E6=B3=A8?= =?UTF-8?q?=E5=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/user.ts | 6 ++--- src/pages/api/openapi/chat/lafGpt.ts | 13 ++++++++-- src/pages/api/user/register.ts | 22 ++++++----------- src/pages/login/components/RegisterForm.tsx | 27 +++++++++++---------- src/service/errorCode.ts | 3 ++- src/service/events/generateQA.ts | 21 +++++++--------- src/service/events/generateVector.ts | 7 ++---- 7 files changed, 49 insertions(+), 50 deletions(-) diff --git a/src/api/user.ts b/src/api/user.ts index f8a94a4f9..e88dba03b 100644 --- a/src/api/user.ts +++ b/src/api/user.ts @@ -18,18 +18,18 @@ export const sendAuthCode = ({ export const getTokenLogin = () => GET('/user/tokenLogin'); export const postRegister = ({ - phone, + username, password, code, inviterId }: { - phone: string; + username: string; code: string; password: string; inviterId: string; }) => POST('/user/register', { - phone, + username, code, inviterId, password: createHashPassword(password) diff --git a/src/pages/api/openapi/chat/lafGpt.ts b/src/pages/api/openapi/chat/lafGpt.ts index c8d6486a4..715297e41 100644 --- a/src/pages/api/openapi/chat/lafGpt.ts +++ b/src/pages/api/openapi/chat/lafGpt.ts @@ -79,15 +79,24 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) messages: [ { role: 'system', - content: `服务端逻辑生成器.根据用户输入的需求,拆解成代码实现的步骤,并按格式返回: 1.\n2.\n3.\n ...... + content: `服务端逻辑生成器.根据用户输入的需求,拆解成 laf 云函数实现的步骤,按格式返回: 1.\n2.\n3.\n ...... 下面是一些例子: +一个 hello world 例子 +1. 返回字符串: "hello world" + +计算圆的面积 +1. 从 body 中获取半径 radius. +2. 校验 radius 是否为有效的数字. +3. 计算圆的面积. +4. 返回圆的面积: {area} + 实现一个手机号发生注册验证码方法. 1. 从 query 中获取 phone. 2. 校验手机号格式是否正确,不正确则返回错误原因:手机号格式错误. 3. 给 phone 发送一个短信验证码,验证码长度为6位字符串,内容为:你正在注册laf,验证码为:code. 4. 数据库添加数据,表为"codes",内容为 {phone, code}. -实现根据手机号注册账号,需要验证手机验证码. +实现一个云函数,使用手机号注册账号,需要验证手机验证码. 1. 从 body 中获取 phone 和 code. 2. 校验手机号格式是否正确,不正确则返回错误原因:手机号格式错误. 2. 获取数据库数据,表为"codes",查找是否有符合 phone, code 等于body参数的记录,没有的话返回错误原因:验证码不正确. diff --git a/src/pages/api/user/register.ts b/src/pages/api/user/register.ts index 135f3fb60..b440cecfb 100644 --- a/src/pages/api/user/register.ts +++ b/src/pages/api/user/register.ts @@ -9,23 +9,17 @@ import { UserAuthTypeEnum } from '@/constants/common'; export default async function handler(req: NextApiRequest, res: NextApiResponse) { try { - const { phone, code, password, inviterId } = req.body; + const { username, code, password, inviterId } = req.body; - if (!phone || !code || !password) { + if (!username || !code || !password) { throw new Error('缺少参数'); } - const reg = /^1[3456789]\d{9}$/; - - if (!reg.test(phone)) { - throw new Error('手机号格式错误'); - } - await connectToDatabase(); - // 验证码校验. 注册只接收手机号 + // 验证码校验 const authCode = await AuthCode.findOne({ - username: phone, + username, code, type: UserAuthTypeEnum.register, expiredTime: { $gte: Date.now() } @@ -37,15 +31,15 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse< // 重名校验 const authRepeat = await User.findOne({ - username: phone + username }); if (authRepeat) { - throw new Error('手机号已被注册'); + throw new Error('该用户已被注册'); } const response = await User.create({ - username: phone, + username, password, inviterId: inviterId ? inviterId : undefined }); @@ -59,7 +53,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse< // 删除验证码记录 await AuthCode.deleteMany({ - username: phone + username }); jsonRes(res, { diff --git a/src/pages/login/components/RegisterForm.tsx b/src/pages/login/components/RegisterForm.tsx index 4c6e2dc95..1d04da2f5 100644 --- a/src/pages/login/components/RegisterForm.tsx +++ b/src/pages/login/components/RegisterForm.tsx @@ -15,7 +15,7 @@ interface Props { } interface RegisterType { - phone: string; + username: string; password: string; password2: string; code: string; @@ -38,10 +38,10 @@ const RegisterForm = ({ setPageType, loginSuccess }: Props) => { const { codeSending, sendCodeText, sendCode, codeCountDown } = useSendCode(); const onclickSendCode = useCallback(async () => { - const check = await trigger('phone'); + const check = await trigger('username'); if (!check) return; sendCode({ - username: getValues('phone'), + username: getValues('username'), type: 'register' }); }, [getValues, sendCode, trigger]); @@ -49,12 +49,12 @@ const RegisterForm = ({ setPageType, loginSuccess }: Props) => { const [requesting, setRequesting] = useState(false); const onclickRegister = useCallback( - async ({ phone, password, code }: RegisterType) => { + async ({ username, password, code }: RegisterType) => { setRequesting(true); try { loginSuccess( await postRegister({ - phone, + username, code, password, inviterId @@ -81,23 +81,24 @@ const RegisterForm = ({ setPageType, loginSuccess }: Props) => { 注册 FastGPT 账号
- + - {!!errors.phone && errors.phone.message} + {!!errors.username && errors.username.message} - + = { }; export const openaiError2: Record = { insufficient_quota: 'API 余额不足', - invalid_request_error: 'openai 接口异常' + billing_not_active: 'openai 账号异常', + invalid_request_error: '无效的 openai 请求' }; export const proxyError: Record = { ECONNABORTED: true, diff --git a/src/service/events/generateQA.ts b/src/service/events/generateQA.ts index 69b20bb06..eaac435a4 100644 --- a/src/service/events/generateQA.ts +++ b/src/service/events/generateQA.ts @@ -9,6 +9,7 @@ import { generateVector } from './generateVector'; import { connectRedis } from '../redis'; import { VecModelDataPrefix } from '@/constants/redis'; import { customAlphabet } from 'nanoid'; +import { openaiError2 } from '../errorCode'; import { ModelSplitDataSchema } from '@/types/mongoSchema'; const nanoid = customAlphabet('abcdefghijklmnopqrstuvwxyz1234567890', 12); @@ -102,6 +103,7 @@ export async function generateQA(next = false): Promise { .then((res) => { const rawContent = res?.data.choices[0].message?.content || ''; // chatgpt 原本的回复 const result = splitText(res?.data.choices[0].message?.content || ''); // 格式化后的QA对 + console.log(`split result length: `, result.length); // 计费 pushSplitDataBill({ isPay: !userApiKey && result.length > 0, @@ -115,6 +117,10 @@ export async function generateQA(next = false): Promise { result }; }) + .catch((err) => { + console.log('QA 拆分错误'); + return Promise.reject(err); + }) ) ); @@ -152,12 +158,7 @@ export async function generateQA(next = false): Promise { }) ]); - console.log( - '生成QA成功,time:', - `${(Date.now() - startTime) / 1000}s`, - 'QA数量:', - resultList.length - ); + console.log('生成QA成功,time:', `${(Date.now() - startTime) / 1000}s`); generateQA(true); generateVector(); @@ -171,12 +172,8 @@ export async function generateQA(next = false): Promise { } // 没有余额或者凭证错误时,拒绝任务 - if ( - dataId && - (+error.response?.status === 401 || - error?.response?.data?.error?.type === 'insufficient_quota') - ) { - console.log('api 异常,删除QA任务'); + if (dataId && openaiError2[error?.response?.data?.error?.type]) { + console.log(openaiError2[error?.response?.data?.error?.type], '删除QA任务'); await SplitData.findByIdAndUpdate(dataId, { textList: [], diff --git a/src/service/events/generateVector.ts b/src/service/events/generateVector.ts index 0c9cff5cc..776b3e3c1 100644 --- a/src/service/events/generateVector.ts +++ b/src/service/events/generateVector.ts @@ -3,6 +3,7 @@ import { VecModelDataIdx } from '@/constants/redis'; import { vectorToBuffer } from '@/utils/tools'; import { ModelDataStatusEnum } from '@/constants/redis'; import { openaiCreateEmbedding, getOpenApiKey } from '../utils/openai'; +import { openaiError2 } from '../errorCode'; export async function generateVector(next = false): Promise { if (process.env.queueTask !== '1') { @@ -91,11 +92,7 @@ export async function generateVector(next = false): Promise { } // 没有余额或者凭证错误时,拒绝任务 - if ( - dataId && - (+error.response?.status === 401 || - error?.response?.data?.error?.type === 'insufficient_quota') - ) { + if (dataId && openaiError2[error?.response?.data?.error?.type]) { console.log('删除向量生成任务记录'); const redis = await connectRedis(); redis.del(dataId);