Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
赵月辉
/
fastgpt-migrated
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Unverified
Commit
b064e704
authored
Apr 17, 2023
by
archer
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feat: 支持邮箱和手机号同时注册
parent
7e544211
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
49 additions
and
50 deletions
+49
-50
src/api/user.ts
+3
-3
src/pages/api/openapi/chat/lafGpt.ts
+11
-2
src/pages/api/user/register.ts
+8
-14
src/pages/login/components/RegisterForm.tsx
+14
-13
src/service/errorCode.ts
+2
-1
src/service/events/generateQA.ts
+9
-12
src/service/events/generateVector.ts
+2
-5
No files found.
src/api/user.ts
View file @
b064e704
...
...
@@ -18,18 +18,18 @@ export const sendAuthCode = ({
export
const
getTokenLogin
=
()
=>
GET
<
UserType
>
(
'/user/tokenLogin'
);
export
const
postRegister
=
({
phon
e
,
usernam
e
,
password
,
code
,
inviterId
}:
{
phon
e
:
string
;
usernam
e
:
string
;
code
:
string
;
password
:
string
;
inviterId
:
string
;
})
=>
POST
<
ResLogin
>
(
'/user/register'
,
{
phon
e
,
usernam
e
,
code
,
inviterId
,
password
:
createHashPassword
(
password
)
...
...
src/pages/api/openapi/chat/lafGpt.ts
View file @
b064e704
...
...
@@ -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参数的记录,没有的话返回错误原因:验证码不正确.
...
...
src/pages/api/user/register.ts
View file @
b064e704
...
...
@@ -9,23 +9,17 @@ import { UserAuthTypeEnum } from '@/constants/common';
export
default
async
function
handler
(
req
:
NextApiRequest
,
res
:
NextApiResponse
<
any
>
)
{
try
{
const
{
phon
e
,
code
,
password
,
inviterId
}
=
req
.
body
;
const
{
usernam
e
,
code
,
password
,
inviterId
}
=
req
.
body
;
if
(
!
phon
e
||
!
code
||
!
password
)
{
if
(
!
usernam
e
||
!
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
,
{
...
...
src/pages/login/components/RegisterForm.tsx
View file @
b064e704
...
...
@@ -15,7 +15,7 @@ interface Props {
}
interface
RegisterType
{
phon
e
:
string
;
usernam
e
:
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
(
'
phon
e'
);
const
check
=
await
trigger
(
'
usernam
e'
);
if
(
!
check
)
return
;
sendCode
({
username
:
getValues
(
'
phon
e'
),
username
:
getValues
(
'
usernam
e'
),
type
:
'register'
});
},
[
getValues
,
sendCode
,
trigger
]);
...
...
@@ -49,12 +49,12 @@ const RegisterForm = ({ setPageType, loginSuccess }: Props) => {
const
[
requesting
,
setRequesting
]
=
useState
(
false
);
const
onclickRegister
=
useCallback
(
async
({
phon
e
,
password
,
code
}:
RegisterType
)
=>
{
async
({
usernam
e
,
password
,
code
}:
RegisterType
)
=>
{
setRequesting
(
true
);
try
{
loginSuccess
(
await
postRegister
({
phon
e
,
usernam
e
,
code
,
password
,
inviterId
...
...
@@ -81,23 +81,24 @@ const RegisterForm = ({ setPageType, loginSuccess }: Props) => {
注册 FastGPT 账号
</
Box
>
<
form
onSubmit=
{
handleSubmit
(
onclickRegister
)
}
>
<
FormControl
mt=
{
8
}
isInvalid=
{
!!
errors
.
phon
e
}
>
<
FormControl
mt=
{
8
}
isInvalid=
{
!!
errors
.
usernam
e
}
>
<
Input
placeholder=
"手机号"
placeholder=
"
邮箱/
手机号"
size=
{
mediaLgMd
}
{
...
register
('
phon
e
',
{
required
:
'手机号不能为空',
{
...
register
('
usernam
e
',
{
required
:
'
邮箱/
手机号不能为空',
pattern
:
{
value
:
/^1[3456789]\
d
{9}
$
/,
message
:
'手机号格式错误'
value
:
/(^1[3456789]\
d
{9}
$
)|(^[
A
-
Za
-
z0
-9]+([
_
\
.
][
A
-
Za
-
z0
-9]+)*@([
A
-
Za
-
z0
-9\-]+\
.
)+[
A
-
Za
-
z
]{2,6}
$
)/,
message
:
'邮箱/手机号格式错误'
}
})}
></
Input
>
<
FormErrorMessage
position=
{
'absolute'
}
fontSize=
"xs"
>
{
!!
errors
.
phone
&&
errors
.
phon
e
.
message
}
{
!!
errors
.
username
&&
errors
.
usernam
e
.
message
}
</
FormErrorMessage
>
</
FormControl
>
<
FormControl
mt=
{
8
}
isInvalid=
{
!!
errors
.
phon
e
}
>
<
FormControl
mt=
{
8
}
isInvalid=
{
!!
errors
.
usernam
e
}
>
<
Flex
>
<
Input
flex=
{
1
}
...
...
src/service/errorCode.ts
View file @
b064e704
...
...
@@ -8,7 +8,8 @@ export const openaiError: Record<string, string> = {
};
export
const
openaiError2
:
Record
<
string
,
string
>
=
{
insufficient_quota
:
'API 余额不足'
,
invalid_request_error
:
'openai 接口异常'
billing_not_active
:
'openai 账号异常'
,
invalid_request_error
:
'无效的 openai 请求'
};
export
const
proxyError
:
Record
<
string
,
boolean
>
=
{
ECONNABORTED
:
true
,
...
...
src/service/events/generateQA.ts
View file @
b064e704
...
...
@@ -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<any> {
.
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<any> {
result
};
})
.
catch
((
err
)
=>
{
console
.
log
(
'QA 拆分错误'
);
return
Promise
.
reject
(
err
);
})
)
);
...
...
@@ -152,12 +158,7 @@ export async function generateQA(next = false): Promise<any> {
})
]);
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<any> {
}
// 没有余额或者凭证错误时,拒绝任务
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
:
[],
...
...
src/service/events/generateVector.ts
View file @
b064e704
...
...
@@ -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
<
any
>
{
if
(
process
.
env
.
queueTask
!==
'1'
)
{
...
...
@@ -91,11 +92,7 @@ export async function generateVector(next = false): Promise<any> {
}
// 没有余额或者凭证错误时,拒绝任务
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
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment