Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wenHuaBu_adminServer
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
node_server
wenHuaBu_adminServer
Commits
cbbc26e6
Commit
cbbc26e6
authored
May 12, 2025
by
chenjinjing
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
no message
parent
3b98ca75
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
141 additions
and
13 deletions
+141
-13
mail.ts
src/biz/mail.ts
+41
-7
user.ts
src/biz/member/user.ts
+82
-1
enum.ts
src/config/enum.ts
+2
-1
errorEnum.ts
src/config/errorEnum.ts
+4
-1
outPutConfig.ts
src/config/outPutConfig.ts
+2
-1
router.ts
src/routers/member/router.ts
+10
-2
No files found.
src/biz/mail.ts
View file @
cbbc26e6
...
...
@@ -3,7 +3,7 @@ import { ERRORENUM } from "../config/errorEnum";
import
{
CLIENTMAILTYPE
}
from
"../config/outPutConfig"
;
import
{
TABLEENUM
}
from
"../data/models/model"
;
import
{
findOnce
}
from
"../data/select"
;
import
{
successErrorResult
,
successResult
}
from
"../tools/system"
;
import
{
generateSMSCode
,
successErrorResult
,
successResult
}
from
"../tools/system"
;
import
{
BizError
}
from
"../util/bizError"
;
import
{
eccEnumValue
}
from
"../util/verificationEnum"
;
...
...
@@ -33,8 +33,8 @@ let transporter = nodemailer.createTransport({
async
function
send
(
toMail
,
name
,
type
)
{
let
{
title
,
mailStr
}
=
getModel
(
name
,
type
);
async
function
send
(
toMail
,
name
,
type
,
code
?
)
{
let
{
title
,
mailStr
}
=
getModel
(
name
,
type
,
code
);
// 设置邮件选项
let
mailOptions
=
{
from
:
'学会办公室 <cefa_office@163.com>'
,
// 发送者地址
...
...
@@ -63,7 +63,7 @@ await systemSendMail(userInfo.userId, MAILTYPE.审核期间驳回通知 );
*/
function
getModel
(
name
,
type
)
{
function
getModel
(
name
,
type
,
code
?
)
{
let
str
=
""
;
let
title
=
""
;
switch
(
type
)
{
...
...
@@ -119,6 +119,10 @@ function getModel(name, type) {
str
=
"您的会费退款已处理,请登陆会员网站重新缴纳会费。"
;
title
=
"退款处理"
;
break
;
case
MAILTYPE
.
邮箱获取验证码
:
str
=
`您的验证码为:
${
code
}
,请勿泄露于他人!`
;
title
=
"验证码"
;
break
;
}
let
mailStr
=
""
...
...
@@ -145,7 +149,7 @@ function getModel(name, type) {
* @returns
*/
export
async
function
sendMail
({
id
,
type
})
{
return
;
//
return;
eccEnumValue
(
"发送邮件"
,
"邮件类型"
,
CLIENTMAILTYPE
,
type
);
let
userInfo
=
await
findOnce
(
TABLEENUM
.
用户表
,
{
userId
:
id
},
[
"userId"
,
"name"
,
"unitName"
,
"memberType"
,
"mail"
]);
...
...
@@ -178,4 +182,35 @@ export async function systemSendMail(userId, type) {
}
return
successResult
();
}
\ No newline at end of file
}
/**
* 发送验证码邮件
* @param param0
* @returns
*/
export
async
function
sendVerificationCode
(
userId
,
mail
,
type
,
code
)
{
let
userInfo
=
await
findOnce
(
TABLEENUM
.
用户表
,
{
userId
:
userId
,
mail
},
[
"userId"
,
"name"
,
"unitName"
,
"memberType"
,
"mail"
]);
if
(
!
userInfo
||
!
userInfo
.
userId
)
throw
new
BizError
(
ERRORENUM
.
用户不存在
);
if
(
!
userInfo
.
mail
)
{
new
BizError
(
ERRORENUM
.
该用户邮箱为空
,
userId
,
userInfo
.
name
||
userId
.
unitName
);
}
else
{
if
(
userInfo
.
mail
!=
mail
)
{
new
BizError
(
ERRORENUM
.
该用户邮箱与输入邮箱不匹配
,
userId
,
userInfo
.
name
||
userId
.
unitName
);
}
let
nameStr
=
userInfo
.
memberType
==
MEMBERTYPE
.
个人会员
?
userInfo
.
name
:
userInfo
.
unitName
;
let
result
=
await
send
(
mail
,
nameStr
,
type
,
code
);
}
return
successResult
();
}
src/biz/member/user.ts
View file @
cbbc26e6
...
...
@@ -2,7 +2,7 @@
* 用户逻辑
*/
import
{
ADMINTYPE
,
CODETYPE
,
MEMBERSTATE
,
MEMBERTYPE
,
REGISTERSTART
,
STATE
,
UNITMEMBERTYPE
,
USERREGISTERSTATE
}
from
"../../config/enum"
;
import
{
ADMINTYPE
,
CODETYPE
,
M
AILTYPE
,
M
EMBERSTATE
,
MEMBERTYPE
,
REGISTERSTART
,
STATE
,
UNITMEMBERTYPE
,
USERREGISTERSTATE
}
from
"../../config/enum"
;
import
{
ERRORENUM
}
from
"../../config/errorEnum"
;
import
{
addOneData
}
from
"../../data/add"
;
import
{
TABLEENUM
}
from
"../../data/models/model"
;
...
...
@@ -11,6 +11,7 @@ import { updateOneData } from "../../data/update";
import
{
generateSMSCode
,
generateToken
,
getTodayMs
,
successResult
}
from
"../../tools/system"
;
import
{
BizError
}
from
"../../util/bizError"
;
import
{
changeEnumValue
}
from
"../../util/verificationEnum"
;
import
{
sendMail
,
sendVerificationCode
}
from
"../mail"
;
import
{
sendALSMS
}
from
"../sms"
;
...
...
@@ -215,3 +216,83 @@ export async function memberChangePwdSendCode({userId, phone}) {
}
/**
* 修改密码【邮箱验证码】 success
* @param userId
* @param phone
* @returns
*/
export
async
function
memberMailChangePwdSendCode
({
userId
,
mail
})
{
if
(
!
userId
)
{
let
userInfo
=
await
findOnce
(
TABLEENUM
.
用户表
,
{
mail
},
[
"userId"
,
"name"
,
"unitName"
,
"mail"
]);
if
(
!
userInfo
||
!
userInfo
.
userId
)
throw
new
BizError
(
ERRORENUM
.
不存在该邮箱的账号
);
const
NowMs
=
new
Date
().
valueOf
();
let
codeSelectParam
=
{
mail
,
isUse
:
false
,
type
:
CODETYPE
.
修改密码
,
sendMs
:{
"$gt"
:
getTodayMs
()}
}
let
lastCodeInfo
=
await
findOnceToSort
(
TABLEENUM
.
验证码表
,
codeSelectParam
,
{
sendMs
:
-
1
});
if
(
lastCodeInfo
&&
lastCodeInfo
.
codeNum
)
{
if
(
(
lastCodeInfo
.
sendMs
+
(
60
*
1000
))
>
NowMs
)
throw
new
BizError
(
ERRORENUM
.
频繁操作请稍后再试
);
/**校验今日同类型验证码次数 */
let
todayNotUseCount
=
await
findCount
(
TABLEENUM
.
验证码表
,
codeSelectParam
);
if
(
todayNotUseCount
>=
4
)
throw
new
BizError
(
ERRORENUM
.
发送验证码次数超限制
,
`
${
mail
}
注册验证码超过限制3`
);
}
const
Code
=
generateSMSCode
();
//生成短信验证码
/**发送邮件验证码模块 */
await
sendVerificationCode
(
userId
,
mail
,
MAILTYPE
.
邮箱获取验证码
,
Code
);
// await sendALSMS(Code, mail);
let
addInfo
=
{
codeNum
:
Code
,
mail
,
sendMs
:
NowMs
,
type
:
CODETYPE
.
修改密码
,
isUse
:
false
};
await
addOneData
(
TABLEENUM
.
验证码表
,
addInfo
);
return
{
code
:
""
};
}
let
userInfo
=
await
findOnce
(
TABLEENUM
.
用户表
,
{
userId
},
[
"userId"
,
"isInput"
,
"inputUserChangePwd"
,
"phone"
,
"memberType"
,
"unitMemberType"
,
"mail"
]);
if
(
!
userInfo
.
userId
)
{
throw
new
BizError
(
ERRORENUM
.
账号不存在
)
}
if
(
userInfo
.
isInput
&&
userInfo
.
inputUserChangePwd
==
false
&&
userInfo
.
memberType
==
MEMBERTYPE
.
单位会员
&&
userInfo
.
unitMemberType
==
UNITMEMBERTYPE
.
院校
)
{
//首次修改密码
const
NowMs
=
new
Date
().
valueOf
();
let
codeSelectParam
=
{
mail
,
isUse
:
false
,
type
:
CODETYPE
.
修改密码
,
sendMs
:{
"$gt"
:
getTodayMs
()}
};
let
lastCodeInfo
=
await
findOnceToSort
(
TABLEENUM
.
验证码表
,
codeSelectParam
,
{
sendMs
:
-
1
});
if
(
lastCodeInfo
&&
lastCodeInfo
.
codeNum
)
{
if
(
(
lastCodeInfo
.
sendMs
+
(
60
*
1000
))
>
NowMs
)
throw
new
BizError
(
ERRORENUM
.
频繁操作请稍后再试
);
/**校验今日同类型验证码次数 */
let
todayNotUseCount
=
await
findCount
(
TABLEENUM
.
验证码表
,
codeSelectParam
);
if
(
todayNotUseCount
>=
4
)
throw
new
BizError
(
ERRORENUM
.
发送验证码次数超限制
,
`
${
mail
}
注册验证码超过限制3`
);
}
const
Code
=
generateSMSCode
();
//生成短信验证码
/**发送短信模块 */
await
sendVerificationCode
(
userId
,
mail
,
MAILTYPE
.
邮箱获取验证码
,
Code
);
let
addInfo
=
{
codeNum
:
Code
,
mail
,
sendMs
:
NowMs
,
type
:
CODETYPE
.
修改密码
,
isUse
:
false
};
await
addOneData
(
TABLEENUM
.
验证码表
,
addInfo
);
return
{
code
:
""
};
}
else
{
//非导入用户
if
(
mail
!=
userInfo
.
mail
)
throw
new
BizError
(
ERRORENUM
.
与预览邮箱不一致
);
const
NowMs
=
new
Date
().
valueOf
();
let
codeSelectParam
=
{
mail
,
isUse
:
false
,
type
:
CODETYPE
.
修改密码
,
sendMs
:{
"$gt"
:
getTodayMs
()}
};
let
lastCodeInfo
=
await
findOnceToSort
(
TABLEENUM
.
验证码表
,
codeSelectParam
,
{
sendMs
:
-
1
});
if
(
lastCodeInfo
&&
lastCodeInfo
.
codeNum
)
{
if
(
(
lastCodeInfo
.
sendMs
+
(
60
*
1000
))
>
NowMs
)
throw
new
BizError
(
ERRORENUM
.
频繁操作请稍后再试
);
/**校验今日同类型验证码次数 */
let
todayNotUseCount
=
await
findCount
(
TABLEENUM
.
验证码表
,
codeSelectParam
);
if
(
todayNotUseCount
>=
4
)
throw
new
BizError
(
ERRORENUM
.
发送验证码次数超限制
,
`
${
mail
}
注册验证码超过限制3`
);
}
const
Code
=
generateSMSCode
();
//生成邮件验证码
/**发送邮件验证码模块 */
await
sendVerificationCode
(
userId
,
mail
,
MAILTYPE
.
邮箱获取验证码
,
Code
);
let
addInfo
=
{
codeNum
:
Code
,
mail
,
sendMs
:
NowMs
,
type
:
CODETYPE
.
修改密码
,
isUse
:
false
};
await
addOneData
(
TABLEENUM
.
验证码表
,
addInfo
);
return
{
code
:
""
};
}
}
src/config/enum.ts
View file @
cbbc26e6
...
...
@@ -882,7 +882,8 @@ export enum MAILTYPE {
变更驳回
,
变更已通过
,
会员活动
or
会议通知
,
财务退款通知
财务退款通知
,
邮箱获取验证码
}
...
...
src/config/errorEnum.ts
View file @
cbbc26e6
...
...
@@ -80,7 +80,10 @@ export enum ERRORENUM {
请先付款后进行发票操作
,
短信发送失败
,
用户不存在
,
该用户邮箱为空
该用户邮箱为空
,
该用户邮箱与输入邮箱不匹配
,
与预览邮箱不一致
,
不存在该邮箱的账号
}
export
enum
ERRORCODEENUM
{
...
...
src/config/outPutConfig.ts
View file @
cbbc26e6
...
...
@@ -263,6 +263,7 @@ export enum MEMBERPAYMENTCOLUMNS {
export
enum
CLIENTMAILTYPE
{
会员会费到期缴费通知
=
6
,
会员催缴通知提前开发票
=
7
,
会员活动
or
会议通知
=
12
会员活动
or
会议通知
=
12
,
会员修改密码
=
15
,
}
src/routers/member/router.ts
View file @
cbbc26e6
...
...
@@ -470,8 +470,16 @@ export const Config = {
{
key
:
"phone"
,
type
:
"String"
,
desc
:
"绑定手机号"
}
],
bindBiz
:
userBiz
.
memberChangePwdSendCode
},
{
},{
apiName
:
"修改密码用邮件验证码"
,
subUrl
:
'/getmailchangepwdcode'
,
notMiddleware
:
true
,
param
:[
{
key
:
"userId"
,
type
:
"String"
,
desc
:
"userId"
,
isNull
:
true
},
{
key
:
"mail"
,
type
:
"String"
,
desc
:
"绑定邮箱"
}
],
bindBiz
:
userBiz
.
memberMailChangePwdSendCode
},{
apiName
:
"获取个人基础信息"
,
subUrl
:
'/memberdb/systembase'
,
param
:[],
...
...
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