Commit 0639bc24 by lixinming

Merge branch 'master' of http://123.207.147.179:8888/node_server/wenHuaBu_adminServer

# Conflicts:
#	src/config/enum.ts
#	src/data/models/model.ts
#	src/routers/public/router.ts
#	src/tools/system.ts
parents 22c214ef 38965cfe
......@@ -18,4 +18,14 @@
<mysqlPwd>123456</mysqlPwd>
<dataBase>xuehui</dataBase>
</mysqldb>
<!-- 短信相关配置 -->
<sms>
<sdkAppId>1400799515</sdkAppId>
<appKey>a36634bd106ee72eeea4a4bb4e62a03b</appKey>
<smsSign>会员注册</smsSign>
<!-- 填报提示 -->
<pointOut>1729286</pointOut>
<!-- 单位会员注册 -->
<unitMemberRegister>1729288</unitMemberRegister>
</sms>
</config>
......@@ -2,22 +2,26 @@
* 会员逻辑
*/
import { MEMBERSTATE, MEMBERLEVEL, DOCUMENTTYPE, NATION, PROFCATEGORY } from "../../config/enum";
import { MEMBERSTATE, MEMBERLEVEL, DOCUMENTTYPE, NATION, PROFCATEGORY, CODETYPE, UNITINFOTYPE, MEMBERTYPE, REGISTERFLOW, SEX } from "../../config/enum";
import { ERRORENUM } from "../../config/errorEnum";
import { TABLEENUM } from "../../data/models/model";
import { find, findOnce } from "../../data/select";
import { find, findCount, findOnce, findToPage } from "../../data/select";
import { updateOneData } from "../../data/update";
import { generateSystemId, successResult } from "../../tools/system";
import { BizError } from "../../util/bizError";
import { extractData } from "../../util/piecemeal";
import { changeEnumValue } from "../../util/verificationEnum";
import { changeEnumValue, eccEnumValue } from "../../util/verificationEnum";
import * as sysTools from "../../tools/system";
import { sendRegisterCode } from "../sms";
import { addManyData, addOneData } from "../../data/add";
import { deleteManyData, deleteOneData } from "../../data/delete";
/**
* 单位会员列表
* @param param0
*/
export async function unitMemberList({unitName, joinTime, unitMemberType, workDuties, session, sheng, shi, qu}) {
export async function unitMemberList({unitName, joinTime, unitMemberType, workDuties, session, sheng, shi, qu, pageNumber}) {
let selectParam:any = {};
if (unitName) selectParam.unitName = unitName;
if (joinTime) selectParam.joinTime = joinTime;
......@@ -28,7 +32,9 @@ export async function unitMemberList({unitName, joinTime, unitMemberType, workDu
if (shi) selectParam.shi = shi;
if (qu) selectParam.qu = qu;
let dbList = await find(TABLEENUM.用户表, selectParam);
let dbList = await findToPage(TABLEENUM.用户表, selectParam, [], pageNumber);
let dataCount = await findCount(TABLEENUM.用户表, selectParam);
let dataList = [];
dbList.forEach(info => {
let item:any = extractData(info, ["userId", "memberState", "unitName", "loginId", "phone", "joinTime", "unitMemberLevel", "sheng", "shi", "qu"]);
......@@ -38,7 +44,7 @@ export async function unitMemberList({unitName, joinTime, unitMemberType, workDu
dataList.push(item);
});
return {dataList};
return {dataList, dataCount};
}
......@@ -64,51 +70,97 @@ export async function unitMemberDetails({userId}) {
let unitInfo = extractData(oldInfo, UnitConfig);
let oldKeYanInfo = await findOnce(TABLEENUM.单位所获得科研成果表, {userId});
let scientificResearch = extractData(oldKeYanInfo, ["startTime", "endTime", "describe"]);
let scientificResearch = extractData(oldKeYanInfo, ["id", "startTime", "endTime", "describe"]);
return {topInfo, basicInfo, unitInfo, scientificResearch};
}
/**
* 单位会员 修改
* @param userId
* @param form
* @returns
*/
export async function unitMemberUpdate(secureArgs:any) {
let {userId, form, keyanForm} = secureArgs;
export async function unitMemberUpdate({form, keyanForm, userId}) {
let oldInfo = await findOnce(TABLEENUM.用户表, {userId});
if (!oldInfo || !oldInfo.userId) throw new BizError(ERRORENUM.目标数据不存在);
await updateOneData(TABLEENUM.用户表, {userId}, form);
return successResult();
}
/**校验枚举 */
changeEnumValue(UNITINFOTYPE, form.unitInfoType);
changeEnumValue(UNITINFOTYPE, form.unitInfoType);
if (!oldInfo || !oldInfo.userId) throw new BizError(ERRORENUM.目标数据不存在);
await updateOneData(TABLEENUM.用户表, {userId}, form);
/**删除对应userId科研成果 */
let oldKeYanInfo = await find(TABLEENUM.单位所获得科研成果表, {userId});
if (!oldKeYanInfo || !oldKeYanInfo.id) throw new BizError(ERRORENUM.目标数据不存在);
await deleteManyData(TABLEENUM.单位所获得科研成果表, {userId});
let addList = [];
for (let i = 0; i < keyanForm.length; i++) {
keyanForm[i].id = generateSystemId(TABLEENUM.单位所获得科研成果表, userId);
keyanForm[i].userId = userId;
addList.push(keyanForm);
}
await addManyData(TABLEENUM.单位所获得科研成果表, addList);
return successResult();
}
/**
* 删除单位所获得科研成果
* @param param0
* @returns
*/
export async function delResearch({id}) {
let dataInfo = await findOnce(TABLEENUM.单位所获得科研成果表, {id});
if (!dataInfo || !dataInfo.id) throw new BizError(ERRORENUM.目标数据不存在);
await deleteOneData(TABLEENUM.单位所获得科研成果表, {id});
return successResult();
}
/**
* 会员注册的短信验证码
* @param userId
* @param phone
* @returns
*/
export async function memberRegisterSendCode({loginId, phone, codeType}) {
let todayMs = sysTools.getTodayMs();
let todayCodeList = await find(TABLEENUM.验证码表, {phone}) || [];
// if (todayCodeList.length >= 4) throw new BizError(ERRORENUM.发送验证码次数超限制, `${loginId} 修改密码发送验证码次数超限制4`);
let sendMs = todayMs;
todayCodeList.forEach(info => {
sendMs = Math.max(sendMs, info.sendMs);
});
let now = new Date().valueOf();
if ((now - sendMs) <= (60 * 1000) ) throw new BizError(ERRORENUM.发送验证码频率过快, `${loginId}`);
let codeId = sysTools.getSMSCodeId(loginId, todayCodeList.length||0);
let code = sysTools.getSMSCode();
//await sendRegisterCode(phone, code, codeType); //todo 发送短信
now = new Date().valueOf();
await addOneData(TABLEENUM.验证码表, {codeId, codeNum:code, sendMs:now, phone, type:codeType, isUse:true});
let dataList = {codeId}
return dataList;
}
/**
* 个人会员列表
* @param param0
*/
export async function individualMemberList({name, documentId, phone, memberLevel, workDuties, session, joinTime, auditTime, memberState}) {
export async function individualMemberList({name, documentId, phone, memberLevel, workDuties, session, joinTime, auditTime, memberState, pageNumber}) {
let selectParam:any = {};
if (name) selectParam.name = name;
if (documentId) selectParam.documentId = documentId;
......@@ -120,17 +172,20 @@ export async function individualMemberList({name, documentId, phone, memberLevel
if (auditTime) selectParam.auditTime = auditTime;
if (memberState) selectParam.memberState = memberState;
let dbList = await find(TABLEENUM.用户表, selectParam);
let selectConf = ["userId", "memberState", "unitName", "name", "sex", "nation", "loginId", "phone", "joinTime", "memberLevel", "sheng", "shi", "qu"];
let dbList = await findToPage(TABLEENUM.用户表, selectParam, selectConf, pageNumber, 10);
let dataCount = await findCount(TABLEENUM.用户表, selectParam);
let dataList = [];
dbList.forEach(info => {
let item:any = extractData(info, ["userId", "memberState", "unitName", "name", "sex", "nation", "loginId", "phone", "joinTime", "memberLevel", "sheng", "shi", "qu"]);
let item:any = extractData(info, selectConf);
changeEnumValue(MEMBERSTATE, item.memberState);
if (!item.memberLevel) item.memberLevel = "未选择";
else changeEnumValue(MEMBERLEVEL, item.memberLevel);
dataList.push(item);
});
return {dataList};
return {dataList, dataCount};
}
......@@ -163,7 +218,161 @@ export async function individualMemberDetails({userId}) {
}
/**
* 个人会员 修改
* @param userId
* @param form
* @returns
*/
export async function individualMemberUpdate({form, userId}) {
let oldInfo = await findOnce(TABLEENUM.用户表, {userId});
if (!oldInfo || !oldInfo.userId) throw new BizError(ERRORENUM.目标数据不存在);
await updateOneData(TABLEENUM.用户表, {userId}, form);
return successResult();
}
/**
* 个人入会流程1
* @param secureArgs
*/
export async function memberRegister1({form, codeId}) {
let oldData = await findOnce(TABLEENUM.用户表, {"$or":[{loginId:form.loginId}, {phone:form.phone}, {mail:form.mail}] });
if (oldData && oldData.userId) {
if (oldData.loginId == form.loginId) throw new BizError(ERRORENUM.用户名重复, form.loginId );
if (oldData.phone == form.phone) throw new BizError(ERRORENUM.联系人手机号重复, form.phone );
if (oldData.mail == form.mail) throw new BizError(ERRORENUM.邮箱重复, form.loginId );
}
/**校验密码 */
if (form.pwd.search(/^[A-Za-z0-9]{6,18}$/) < 0) throw new BizError(ERRORENUM.密码只能由618位字符和数字组成);
if (form.pwd != form.confirmation) throw new BizError(ERRORENUM.两次密码不一致);
form.userId = sysTools.generateUserId();
form.memberType = MEMBERTYPE.个人会员;
form.isAdmin = 0;
form.registerFlow = REGISTERFLOW.个人会员注册1;
// let todayMs = sysTools.getTodayMs();
let codeList = await findOnce(TABLEENUM.验证码表, {codeId});
let now = new Date().valueOf();
let msg = ERRORENUM.验证码错误;
if (codeList.codeNum == form.codeNum) {
if (codeList.isUse) msg = ERRORENUM.验证码失效;
else if ( (now - codeList.sendMs) > (30 * 60 * 1000) ) msg = ERRORENUM.验证码过期
}
if (!codeId) throw new BizError(msg, `userId:${form.userId}个人入会注册流程1的code:${form.code}`);
/**修改验证码状态为已使用 */
await updateOneData(TABLEENUM.验证码表, {codeId}, {isUse:true});
await addOneData(TABLEENUM.用户表, form);
/**注册成功,返回userId和会员注册流程字段 */
let oldInfo = await findOnce(TABLEENUM.用户表, {userId:form.userId});
let dataList = extractData(oldInfo, ["userId", "registerFlow"]);
return dataList;
}
/**
* 个人入会流程2
* @param userId
* @param secureArgs
* @returns
*/
export async function memberRegister2({form, userId}) {
let oldInfo = await findOnce(TABLEENUM.用户表, {userId});
if (!oldInfo || !oldInfo.userId) throw new BizError(ERRORENUM.目标数据不存在);
/**校验枚举 */
const EccFuncName = '注册个人会员';
eccEnumValue(EccFuncName, '性别', SEX, form.sex);
eccEnumValue(EccFuncName, '证件类型', DOCUMENTTYPE, form.documentType);
eccEnumValue(EccFuncName, '民族', NATION, form.nation);
eccEnumValue(EccFuncName, '专业类别', PROFCATEGORY, form.profCategory);
form.registerFlow = REGISTERFLOW.个人会员注册2;
await updateOneData(TABLEENUM.用户表, {userId}, form);
let unitInfo = await findOnce(TABLEENUM.用户表, {userId});
let dataList = extractData(unitInfo, ["userId", "registerFlow"]);
return dataList;
}
/**
* 单位入会流程1
* @param secureArgs
*/
export async function unitMemberRegister1({form, codeId}) {
let oldData = await findOnce(TABLEENUM.用户表, {"$or":[{loginId:form.loginId}, {phone:form.phone}, {mail:form.mail}] });
if (oldData && oldData.userId) {
if (oldData.loginId == form.loginId) throw new BizError(ERRORENUM.用户名重复, form.loginId );
if (oldData.phone == form.phone) throw new BizError(ERRORENUM.联系人手机号重复, form.phone );
if (oldData.mail == form.mail) throw new BizError(ERRORENUM.邮箱重复, form.loginId );
}
/**校验密码 */
if (form.pwd.search(/^[A-Za-z0-9]{6,18}$/) < 0) throw new BizError(ERRORENUM.密码只能由618位字符和数字组成);
if (form.pwd != form.confirmation) throw new BizError(ERRORENUM.两次密码不一致);
form.userId = sysTools.generateUserId();
form.memberType = MEMBERTYPE.单位会员;
form.isAdmin = 0;
form.registerFlow = REGISTERFLOW.单位会员注册1;
// let todayMs = sysTools.getTodayMs();
let codeList = await findOnce(TABLEENUM.验证码表, {codeId});
let now = new Date().valueOf();
let msg = ERRORENUM.验证码错误;
if (codeList.codeNum == form.codeNum) {
if (codeList.isUse) msg = ERRORENUM.验证码失效;
else if ( (now - codeList.sendMs) > (30 * 60 * 1000) ) msg = ERRORENUM.验证码过期
}
if (!codeId) throw new BizError(msg, `userId:${form.userId}单位入会注册流程1的code:${form.code}`);
/**修改验证码状态为已使用 */
await updateOneData(TABLEENUM.验证码表, {codeId}, {isUse:true});
await addOneData(TABLEENUM.用户表, form);
/**注册成功,返回userId和会员注册流程字段 */
let oldInfo = await findOnce(TABLEENUM.用户表, {userId:form.userId});
let dataList = extractData(oldInfo, ["userId", "registerFlow"]);
return dataList;
}
/**
* 单位入会流程2
* @param userId
* @param secureArgs
* @returns
*/
export async function unitMemberRegister2({form, keyanForm, userId}) {
let oldInfo = await findOnce(TABLEENUM.用户表, {userId});
if (!oldInfo || !oldInfo.userId) throw new BizError(ERRORENUM.目标数据不存在);
form.registerFlow = REGISTERFLOW.单位会员注册2;
await updateOneData(TABLEENUM.用户表, {userId}, form);
let unitInfo = await findOnce(TABLEENUM.用户表, {userId});
let dataList = extractData(unitInfo, ["userId", "registerFlow"]);
return dataList;
}
......
/**
* 短信主要逻辑
*/
const tencentcloud = require("tencentcloud-sdk-nodejs");
const smsClient = tencentcloud.sms.v20210111.Client;
import { SMSTYPE } from "../config/enum";
import { ERRORENUM } from "../config/errorEnum";
import { systemConfig } from "../config/serverConfig";
import { BizError } from "../util/bizError";
var client;
export function initSMS() {
client = new smsClient({
credential: {
/* 必填:腾讯云账户密钥对secretId,secretKey。
* 这里采用的是从环境变量读取的方式,需要在环境变量中先设置这两个值。
* 你也可以直接在代码中写死密钥对,但是小心不要将代码复制、上传或者分享给他人,
* 以免泄露密钥对危及你的财产安全。
* SecretId、SecretKey 查询: https://console.cloud.tencent.com/cam/capi */
secretId: "AKIDHUYO0Xq0wc1DD2e1CJ1xpuqYIxQo0yrd",
secretKey: "zl01oOkswmXJ4apnaUJsCW5PivudLtFP",
},
/* 必填:地域信息,可以直接填写字符串ap-guangzhou,支持的地域列表参考 https://cloud.tencent.com/document/api/382/52071#.E5.9C.B0.E5.9F.9F.E5.88.97.E8.A1.A8 */
region: "ap-guangzhou",
/* 非必填:
* 客户端配置对象,可以指定超时时间等配置 */
profile: {
/* SDK默认用TC3-HMAC-SHA256进行签名,非必要请不要修改这个字段 */
signMethod: "HmacSHA256",
httpProfile: {
/* SDK默认使用POST方法。
* 如果你一定要使用GET方法,可以在这里设置。GET方法无法处理一些较大的请求 */
reqMethod: "POST",
/* SDK有默认的超时时间,非必要请不要进行调整
* 如有需要请在代码中查阅以获取最新的默认值 */
reqTimeout: 30,
/**
* 指定接入地域域名,默认就近地域接入域名为 sms.tencentcloudapi.com ,也支持指定地域域名访问,例如广州地域的域名为 sms.ap-guangzhou.tencentcloudapi.com
*/
endpoint: "sms.tencentcloudapi.com"
},
},
})
}
/**
* 给特定账号发送信息
* @param phone 需要发送的电话数组
* @param type 类别
* @param params 参数数组
*/
function sendMsmToPhoneNumber(phone, type:number, params) {
let phoneAreaList = [];
phone.forEach(info => {
phoneAreaList.push(`+86${info}`);
});
let templateId = -1;
if (type == SMSTYPE.单位会员注册) templateId = systemConfig.smsUnitMemberRegister;
const sendParam = {
/* 短信应用ID: 短信SmsSdkAppId在 [短信控制台] 添加应用后生成的实际SmsSdkAppId,示例如1400006666 */
// 应用 ID 可前往 [短信控制台](https://console.cloud.tencent.com/smsv2/app-manage) 查看
SmsSdkAppId: systemConfig.smsSDKId,
/* 短信签名内容: 使用 UTF-8 编码,必须填写已审核通过的签名 */
// 签名信息可前往 [国内短信](https://console.cloud.tencent.com/smsv2/csms-sign) 或 [国际/港澳台短信](https://console.cloud.tencent.com/smsv2/isms-sign) 的签名管理查看
SignName: systemConfig.smsSign,
/* 模板 ID: 必须填写已审核通过的模板 ID */
// 模板 ID 可前往 [国内短信](https://console.cloud.tencent.com/smsv2/csms-template) 或 [国际/港澳台短信](https://console.cloud.tencent.com/smsv2/isms-template) 的正文模板管理查看
TemplateId: templateId,
/* 模板参数: 模板参数的个数需要与 TemplateId 对应模板的变量个数保持一致,若无模板参数,则设置为空 */
TemplateParamSet: params,
/* 下发手机号码,采用 e.164 标准,+[国家或地区码][手机号]
/* 用户的 session 内容(无需要可忽略): 可以携带用户侧 ID 等上下文信息,server 会原样返回 */
SessionContext: "",
PhoneNumberSet: phoneAreaList,
/* 短信码号扩展号(无需要可忽略): 默认未开通,如需开通请联系 [腾讯云短信小助手] */
ExtendCode: "",
/* 国际/港澳台短信 senderid(无需要可忽略): 国内短信填空,默认未开通,如需开通请联系 [腾讯云短信小助手] */
SenderId: "",
}
return new Promise( (resolve, reject) => {
client.SendSms(sendParam, function (err, response) {
let isError = false;
let msg = "";
if (err) {
msg = err;
isError = true;
}
resolve({isError, msg});
});
})
}
/**
* 发送单位会员注册的短信验证码
* @param phone
* @param code
*/
export async function sendRegisterCode(phone:string, code:string, codeType) {
let sendPhoneList = [phone];
let params = [code];
let sendRes:any = await sendMsmToPhoneNumber(sendPhoneList, codeType, params);
return sendRes.isError;
}
......@@ -375,6 +375,15 @@ export enum ORDERSTATE {
}
/*
* 验证码类型
*/
export enum CODETYPE {
单位会员注册 = 1,
个人会员注册,
}
/**
* 会费类别
*/
......@@ -394,6 +403,28 @@ export enum INVOICESTATUS{
已开发票
}
/*
* 短信类型
*/
export enum SMSTYPE {
单位会员注册 = 1,
信息填报提醒,
}
/**
* 会员注册流程
*/
export enum REGISTERFLOW {
单位会员注册1 = 1,
单位会员注册2,
单位会员注册3,
个人会员注册1,
个人会员注册2
}
/**
* 支付方式
*/
......
......@@ -19,7 +19,12 @@ export enum ERRORENUM {
联系人手机号重复,
邮箱重复,
两次密码不一致,
密码只能由618位字符和数字组成
密码只能由618位字符和数字组成,
发送验证码次数超限制,
发送验证码频率过快,
验证码错误,
验证码失效,
验证码过期
}
export enum ERRORCODEENUM {
......
......@@ -14,5 +14,10 @@ export class ServerConfig {
user:string,
pwd:string,
dataBase:string
}
};
/**短信相关配置 */
smsSDKId:number;
smsAppKey:string;
smsSign:string;
smsUnitMemberRegister:number;
}
\ No newline at end of file
......@@ -53,7 +53,7 @@
},
*/
import { MEMBERSTATE, USERREGISTERSTATE } from "../../config/enum";
import { MEMBERSTATE, REGISTERFLOW, USERREGISTERSTATE } from "../../config/enum";
......@@ -84,6 +84,7 @@ enum TABLEENUM {
文字资料 = 'wenZiZiLiao',
订单表 = 'order',
单位所获得科研成果表 = "scientificResearch",
验证码表 = "code",
}
const ModelArray = [
......@@ -338,8 +339,8 @@ const ModelArray = [
pwd:{ type:'String'},//密码
token:{type:'String', default:''},//token
tokenMs:{type:'Number', default:0},//token过期时间
phone:{type:'String', index:true},//登陆手机号
mail:{type:'String', index:true},
phone:{type:'String', index:true},//联系电话 登陆手机号
mail:{type:'String', index:true},//邮箱
sex:'Number',//性别 枚举
documentType:'Number',//证件类型 枚举
documentId:'String',//证件id 身份证
......@@ -349,11 +350,12 @@ const ModelArray = [
shi:'String',//市
qu:'String',//区
addres:'String',//通信地址
photoUrl:'String',//证件照图片地址
photoUrl:'String',//证件照图片地址 蓝底证件照
workUnit:'String',//工作单位
workDuties:'String',//职务
workTitle:'String',//职称
userRegisterState:{type:'Number', default:USERREGISTERSTATE.待审核, index:true},//用户注册状态 枚举
registerFlow:'Number',//会员注册流程 枚举
auditTime:'Number',//审核时间
memberState:{type:'Number', default:MEMBERSTATE.正常, index:true},//会员状态 枚举
joinTime:'Number',//入会时间
......@@ -444,6 +446,18 @@ const ModelArray = [
invoiceStatus:{type:'Number', index:true},//发票状态
}
},
{
tableName:TABLEENUM.验证码表,
source:TABLESOURCEENUM.mongo,
schema:{
codeId:{type:'String', index:true},
codeNum:'String',
sendMs:'Number',//下发时间 时间戳
phone:{type:'String', index:true},//用户电话
type:'Number',//验证码类型
isUse:{type:'Boolean', default:false},//是否使用 默认false
}
},
];
......
......@@ -122,7 +122,8 @@ export const Config = {
{key:"session", type:"String", desc:"届次", isNull:true}, //todo
{key:"sheng", type:"String", desc:"省", isNull:true},
{key:"shi", type:"String", desc:"市", isNull:true},
{key:"qu", type:"String", desc:"区", isNull:true}
{key:"qu", type:"String", desc:"区", isNull:true},
{key:"pageNumber", type:"Number", desc:"当前页"}
],
bindBiz:memberBiz.unitMemberList
},
......@@ -133,12 +134,13 @@ export const Config = {
{key:"name", type:"String", desc:"姓名", isNull:true},
{key:"documentId", type:"String", desc:"身份证", isNull:true},
{key:"phone", type:"String", desc:"手机号", isNull:true},
{key:"memberLevel", type:"String", desc:"级别", isNull:true},
{key:"memberLevel", type:"Number", desc:"会员等级", isNull:true},
{key:"workDuties", type:"String", desc:"职务", isNull:true},
{key:"session", type:"String", desc:"届次", isNull:true},
{key:"joinTime", type:"String", desc:"入会时间", isNull:true},
{key:"auditTime", type:"String", desc:"审核时间", isNull:true},
{key:"memberState", type:"String", desc:"状态", isNull:true},
{key:"joinTime", type:"Number", desc:"入会时间", isNull:true},
{key:"auditTime", type:"Number", desc:"审核时间", isNull:true},
{key:"memberState", type:"Number", desc:"状态", isNull:true},
{key:"pageNumber", type:"Number", desc:"当前页"}
],
bindBiz:memberBiz.individualMemberList
},
......@@ -148,7 +150,7 @@ export const Config = {
param:[
{key:"userId", type:"String", desc:"用户id"}
],
binBiz:memberBiz.unitMemberDetails
bindBiz:memberBiz.unitMemberDetails
},
{
apiName:"个人会员详情",
......@@ -156,7 +158,15 @@ export const Config = {
param:[
{key:"userId", type:"String", desc:"用户id"}
],
binBiz:memberBiz.individualMemberDetails
bindBiz:memberBiz.individualMemberDetails
},
{
apiName:"删除单位所获得科研成果",
subUrl:'/memberdb/delresearch',
param:[
{key:"id", type:"String", desc:"单位会员列表下发的标识"}
],
bindBiz:memberBiz.delResearch
},
{
apiName:"单位会员修改",
......@@ -167,55 +177,242 @@ export const Config = {
{
/**基本信息 */
unitName:{type:'String', desc:'单位名称'},
addres:{type:'String', desc:''},
officialWebsite:{type:'String', desc:''},
uscc:{type:'String', desc:''},
legalPerson:{type:'String', desc:''},
legalPersonPhone:{type:'String', desc:''},
gongZhongHao:{type:'String', desc:''},
unitPhone:{type:'String', desc:''},
contactPerson:{type:'String', desc:''},
contactPersonDuties:{type:'String', desc:''},
sheng:{type:'String', desc:''},
shi:{type:'String', desc:''},
qu:{type:'String', desc:''},
uusinessLicenseUrl:{type:'String', desc:''},
personInChargeDesc:{type:'String', desc:''},
addres:{type:'String', desc:'通信地址'},
officialWebsite:{type:'String', desc:'单位网站'},
uscc:{type:'String', desc:'单位信用代码'},
legalPerson:{type:'String', desc:'法人代表'},
legalPersonPhone:{type:'String', desc:'法人联系电话'},
gongZhongHao:{type:'String', desc:'单位公众号'},
unitPhone:{type:'Number', desc:'单位电话'},
contactPerson:{type:'String', desc:'日常联系人'},
contactPersonDuties:{type:'String', desc:'日常联系人职务'},
sheng:{type:'String', desc:''},
shi:{type:'String', desc:''},
qu:{type:'String', desc:''},
uusinessLicenseUrl:{type:'String', desc:'营业执照'},
personInChargeDesc:{type:'String', desc:'单位主要负责人或集体简介'},
/**单位信息 */
unitInfoType:{type:'String', desc:''},
yuanXiaoBanXueLeiXing:{type:'String', desc:''},
yuanXiaoZhuGuanBuMen:{type:'String', desc:''},
yuanXiaoFuZeRen:{type:'String', desc:''},
yuanXiaoFuZeRenZhiWu:{type:'String', desc:''},
yuanXiaoFuZeRenDianHua:{type:'String', desc:''},
yuanXiaoBanGongFuZeRen:{type:'String', desc:''},
yuanXiaoBanGongFuZeRenZhiWu:{type:'String', desc:''},
yuanXiaoBanGongFuZeRenDianHua:{type:'String', desc:''},
yuanXiaoKeYanFuZeRen:{type:'String', desc:''},
yuanXiaoKeYanFuZeRenZhiWu:{type:'String', desc:''},
yuanXiaoKeYanFuZeRenDianHua:{type:'String', desc:''},
yuanXiaoXueShengZongRenShu:{type:'String', desc:''},
yuanXiaoJiaoZhiGongZongRenShu:{type:'String', desc:''},
yuanXiaoJianZhuMianJi:{type:'String', desc:''},
yuanXiaoGaoJiZhiCheng:{type:'String', desc:''},
yuanXiaoKaiSheZhuanYe:{type:'String', desc:''},
unitInfoType:{type:'Number', desc:'单位信息类型'},
yuanXiaoBanXueLeiXing:{type:'String', desc:'院校办学类型'},
yuanXiaoZhuGuanBuMen:{type:'String', desc:'院校主管部门'},
yuanXiaoFuZeRen:{type:'String', desc:'院校主要负责人'},
yuanXiaoFuZeRenZhiWu:{type:'String', desc:'院校主要负责人职位'},
yuanXiaoFuZeRenDianHua:{type:'String', desc:'院校主要负责人电话'},
yuanXiaoBanGongFuZeRen:{type:'String', desc:'院校办公负责人'},
yuanXiaoBanGongFuZeRenZhiWu:{type:'String', desc:'院校办公负责人职位'},
yuanXiaoBanGongFuZeRenDianHua:{type:'String', desc:'院校办公负责人电话'},
yuanXiaoKeYanFuZeRen:{type:'String', desc:'院校科研负责人'},
yuanXiaoKeYanFuZeRenZhiWu:{type:'String', desc:'院校科研负责人职位'},
yuanXiaoKeYanFuZeRenDianHua:{type:'String', desc:'院校科研负责人电话'},
yuanXiaoXueShengZongRenShu:{type:'String', desc:'院校学生总数'},
yuanXiaoJiaoZhiGongZongRenShu:{type:'String', desc:'院校教职工总人数'},
yuanXiaoJianZhuMianJi:{type:'String', desc:'院校建筑总面积'},
yuanXiaoGaoJiZhiCheng:{type:'String', desc:'院校高级职称人数'},
yuanXiaoKaiSheZhuanYe:{type:'String', desc:'院校专业总数'},
},
desc:"表单"
},
{
key:"form", type:"Object", sub:
key:"keyanForm", type:"Object", sub:
{
startTime:{type:'String', desc:''},
endTime:{type:'String', desc:''},
describe:{type:'String', desc:''},
startTime:{type:'Number', desc:'开始时间'},
endTime:{type:'Number', desc:'结束时间'},
describe:{type:'String', desc:'科研描述'},
},
desc:"表单"
desc:"单位所获得科研成果表单"
},
{
key:"userId", type:"String", desc:"用户id"
}
],
bindBiz:memberBiz.unitMemberUpdate
},
{
apiName:"个人会员修改",
subUrl:'',
param:[
{
key:"form", type:"Object", sub:
{
/**基本信息 */
name:{type:'String', desc:'真实姓名'},
sex:{type:'Number', desc:'性别'},
nation:{type:'Number', desc:'民族'},
birth:{type:'Number', desc:'出身年月'},
documentType:{type:'Number', desc:'证件类型'},
documentId:{type:'String', desc:'证件号码'},
sheng:{type:'String', desc:'省'},
shi:{type:'String', desc:'市'},
qu:{type:'String', desc:'区'},
addres:{type:'String', desc:'通信地址'},
photoUrl:{type:'String', desc:'蓝底证件照'},
/**专业信息 */
workUnit:{type:'String', desc:'工作单位'},
workDuties:{type:'String', desc:'职务'},
workTitle:{type:'String', desc:'职称'},
profCategory:{type:'Number', desc:'专业类别'},
studyResume:{type:'String', desc:'学习简历'},
workResume:{type:'String', desc:'工作简历'},
profAchievement:{type:'String', desc:'教研成果'},
otherEMP:{type:'String', desc:'其他组织任职情况'},
otherPROF:{type:'String', desc:'其他情况'},
/**其他附件 */
cardUrl:{type:'[String]', desc:'个人身份扫描件'},
academicCERTUrl:{type:'String', desc:'个人学历证明扫描件'},
professionalCERTUrl:{type:'String', desc:'个人工作证明扫描件'},
auxiliaryMaterial:{type:'[String]', desc:'论文发表或成绩材料'},
}
},
{
key:"userId", type:"String", desc:"用户id"
}
],
bindBiz:memberBiz.individualMemberUpdate
},
{
apiName:"发送短信验证码",
subUrl:'/memberdb/registersendcode',
param:[
{key:"loginId", type:"String", desc:"用户名"},
{key:"phone", type:"String", desc:"联系人手机号"},
{key:"codeType", type:"Number", desc:"验证码类型枚举"}
],
bindBiz:memberBiz.memberRegisterSendCode
},
{
apiName:"个人入会流程1",
subUrl:'/memberdb/memberregister1',
param:[
{
key:"form", type:"Object", sub:
{
loginId:{type:'String', desc:'用户名'},
mail:{type:'String', desc:'邮箱'},
pwd:{type:'String', desc:'密码'},
confirmation:{type:'String', desc:'确认密码'},
phone:{type:'String', desc:'联系人手机号'},
codeNum:{type:'String', desc:'验证码'},
}
},
{key:"codeId", type:"String", desc:"验证码Id"}
],
bindBiz:memberBiz.memberRegister1
},
{
apiName:"个人入会流程2",
subUrl:'/memberdb/memberregister2',
param:[
{
key:"form", type:"Object", sub:
{
name:{type:'String', desc:'真实姓名'},
sex:{type:'Number', desc:'性别'},
documentType:{type:'Number', desc:'证件类型'},
documentId:{type:'String', desc:'证件号码'},
birth:{type:'Number', desc:'出生年月'},
nation:{type:'Number', desc:'民族'},
sheng:{type:'String', desc:'省'},
shi:{type:'String', desc:'市'},
qu:{type:'String', desc:'区'},
addres:{type:'String', desc:'通信地址'},
photoUrl:{type:'String', desc:'蓝底证件照'},
workUnit:{type:'String', desc:'工作单位'},
workDuties:{type:'String', desc:'职务'},
workTitle:{type:'String', desc:'职称'},
profCategory:{type:'Number', desc:'专业类别'},
studyResume:{type:'String', desc:'学习简历'},
workResume:{type:'String', desc:'工作简历'},
profAchievement:{type:'String', desc:'专业成果'},
otherEMP:{type:'String', desc:'在其他社会组织任职情况'},
otherPROF:{type:'String', desc:'其他与本学会专业有关的情况'},
cardUrl:{type:'[String]', desc:'个人身份证扫描件'},
academicCERTUrl:{type:'String', desc:'个人学历证明扫描件'},
professionalCERTUrl:{type:'String', desc:'个人工作证明扫描件'},
auxiliaryMaterial:{type:'[String]', desc:'论文发表等证明工作成果或成绩的材料'},
}
},
{
key:"userId", type:"String", desc:"用户id"
}
],
binBiz:memberBiz.unitMemberUpdate
bindBiz:memberBiz.memberRegister2
},
{
apiName:"单位入会流程1",
subUrl:'/memberdb/unitmemberregister1',
param:[
{
key:"form", type:"Object", sub:
{
loginId:{type:'String', desc:'用户名'},
mail:{type:'String', desc:'邮箱'},
pwd:{type:'String', desc:'密码'},
confirmation:{type:'String', desc:'确认密码'},
phone:{type:'String', desc:'联系人手机号'},
codeNum:{type:'String', desc:'验证码'},
}
},
{key:"codeId", type:"String", desc:"验证码Id"}
],
bindBiz:memberBiz.unitMemberRegister1
},
{
apiName:"单位入会流程2",
subUrl:'/memberdb/unitmemberregister2',
param:[
{
key:"form", type:"Object", sub:
{
unitName:{type:'String', desc:'单位名称'},
addres:{type:'String', desc:'通信地址'},
officialWebsite:{type:'String', desc:'单位网站'},
uscc:{type:'String', desc:'单位信用代码'},
legalPerson:{type:'String', desc:'法人代表'},
legalPersonPhone:{type:'String', desc:'法人联系电话'},
sheng:{type:'String', desc:'省'},
shi:{type:'String', desc:'市'},
qu:{type:'String', desc:'区'},
gongZhongHao:{type:'String', desc:'单位公众号'},
unitPhone:{type:'String', desc:'单位电话'},
contactPerson:{type:'String', desc:'日常联系人'},
contactPersonDuties:{type:'String', desc:'日常联系人职务'},
uusinessLicenseUrl:{type:'String', desc:'营业执照复印件'},
personInChargeDesc:{type:'String', desc:'单位主要负责人简介'},
/**单位信息 */
unitInfoType:{type:'Number', desc:'单位信息类型'},
yuanXiaoBanXueLeiXing:{type:'String', desc:'院校办学类型'},
yuanXiaoZhuGuanBuMen:{type:'String', desc:'院校主管部门'},
yuanXiaoFuZeRen:{type:'String', desc:'院校主要负责人'},
yuanXiaoFuZeRenZhiWu:{type:'String', desc:'院校主要负责人职务'},
yuanXiaoFuZeRenDianHua:{type:'String', desc:'院校主要负责人电话'},
yuanXiaoBanGongFuZeRen:{type:'String', desc:'院校办公负责人'},
yuanXiaoBanGongFuZeRenZhiWu:{type:'String', desc:'院校办公负责人职务'},
yuanXiaoBanGongFuZeRenDianHua:{type:'String', desc:'院校办公负责人电话'},
yuanXiaoKeYanFuZeRen:{type:'String', desc:'院校科研负责人'},
yuanXiaoKeYanFuZeRenZhiWu:{type:'String', desc:'院校科研负责人职务'},
yuanXiaoKeYanFuZeRenDianHua:{type:'String', desc:'院校科研负责人电话'},
yuanXiaoXueShengZongRenShu:{type:'String', desc:'院校学生总人数'},
yuanXiaoJiaoZhiGongZongRenShu:{type:'String', desc:'院校教职工总人数'},
yuanXiaoJianZhuMianJi:{type:'String', desc:'院校建筑总面积'},
yuanXiaoGaoJiZhiCheng:{type:'String', desc:'院校高级职称人数'},
yuanXiaoKaiSheZhuanYe:{type:'String', desc:'院校开设专业'},
}
},
{
key:"keyanForm", type:"Object", sub:
{
startTime:{type:'Number', desc:'开始时间'},
endTime:{type:'Number', desc:'结束时间'},
describe:{type:'String', desc:'科研描述'},
},
desc:"单位所获得科研成果表单"
},
{
key:"userId", type:"String", desc:"用户id"
}
],
bindBiz:memberBiz.unitMemberRegister2
}
]
}
\ No newline at end of file
}
......@@ -119,7 +119,13 @@ export const Config = {
subUrl:'/tongzhigonggaotype',
param:[],
bindBiz:setEnumInterface(enumConfig.TONGZHIGONGGAO)
}
},
{
apiName:"验证码类型",
subUrl:'/codetype',
param:[],
bindBiz:setEnumInterface(enumConfig.CODETYPE)
},
],
}
......
......@@ -14,7 +14,7 @@ import * as memberRouter from "./member/router";
import * as officalWebsiteRouter from "./officalWebsite/router";
import * as asyncHandler from 'express-async-handler';
const Look = true;//true更新文档
const Look = false;//true更新文档
export async function setRouter(httpServer){
if (Look) {
......
......@@ -41,10 +41,45 @@ export function generateUserId() {
return md5(`${Math.random() * 100}${new Date().valueOf()}${Math.floor(Math.random() * 10000)}`);
}
/**
* 获取code的id
* @param loginId 用户Id
* @param todaySendCount 今日发送次数
* @returns ''
*/
export function getSMSCodeId(loginId:string, todaySendCount:number) {
return md5(`${loginId}${todaySendCount}${new Date().valueOf()}`);
}
/**
* 获取一个随机6位数的验证码
* @returns
*/
export function getSMSCode() {
let code = ``;
for (let i =0; i < 6; i++) {
code += Math.floor(Math.random() * 10)
}
return code;
}
/**
* 生成唯一订单id
*/
export function generateOrderId(userId:string) {
return md5(`${userId}${Math.random() * 100}${new Date().valueOf()}${Math.floor(Math.random() * 1000)}`);
}
\ No newline at end of file
}
/*
* 获取今天开始时刻的时间戳 0时0分
* @returns
*/
export function getTodayMs() {
let t =`${ moment().format("YYYY-MM-DD")} 00:00:00`;
return new Date(t).valueOf();
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment