Commit d8b0caa2 by chenjinjing

通知管理、消息管理bug修复,http改成https

parent 3f98a3ae
......@@ -61,7 +61,7 @@ export async function blackList({name, joinStartTime, joinEndTime, memberType, m
let dbList = await findToPage(TABLEENUM.用户表, selectParam, SelectFiles, pageNumber);
let dataCount = await findCount(TABLEENUM.用户表, selectParam);
const DataFiles = ["userId", "memberState", "loginId", "phone", "joinTime", "memberLevel", "sheng", "shi", "qu", "name"];
const DataFiles = ["userId", "memberState", "loginId", "phone", "joinTime", "memberLevel", "sheng", "shi", "qu", "name", "memberType"];
let dataList = [];
dbList.forEach(info => {
let item:any = extractData(info, DataFiles);
......@@ -71,6 +71,7 @@ export async function blackList({name, joinStartTime, joinEndTime, memberType, m
item.memberState = changeEnumValue(MEMBERSTATE, item.memberState);
if (!item.memberLevel) item.memberLevel = "未选择";
else item.memberLevel = changeEnumValue(MEMBERLEVEL, item.memberLevel);
item.memberType = changeEnumValue(MEMBERTYPE, item.memberType);
item.joinTime = moment(item.joinTime).format("YYYY-MM-DD");
item.sheng = getCityNameByCode(item.sheng);
item.shi = getCityNameByCode(item.shi);
......@@ -114,4 +115,3 @@ export async function delBlackUser({id}) {
......@@ -12,7 +12,7 @@ import { generateSystemId, getTodayMs, successErrorResult, successResult } from
import { BizError } from "../../util/bizError";
import { extractData } from "../../util/piecemeal";
import { changeEnumValue } from "../../util/verificationEnum";
import { updateOneData } from "../../data/update";
import { updateManyData, updateOneData } from "../../data/update";
import { eccCityCode } from "../../config/cityConfig";
import { deleteOneData } from "../../data/delete";
......@@ -26,18 +26,18 @@ import { deleteOneData } from "../../data/delete";
*/
export async function getMessageList({msgTitle, effectiveStartTime, effectiveEndTime, pageNumber}) {
let selectParam:any = {};
if (msgTitle) selectParam.msgTitle = msgTitle;
if (msgTitle) selectParam.msgTitle = {"$regex":`${msgTitle}`};
if (effectiveStartTime) {
selectParam["effectiveTime"] = {"$gt":effectiveStartTime};
}
if (effectiveEndTime) {
if (!selectParam["effectiveTime"]) selectParam["joinTime"] = {};
if (!selectParam["effectiveTime"]) selectParam["effectiveTime"] = {};
selectParam["effectiveTime"]["$lt"] = effectiveEndTime;
}
const SelectFiles = ["msgId", "lableId", "msgTitle", "effectiveTime", "msgContent", "isPop"];
// let dbList = await findToSortToPage(TABLEENUM.消息通知表, selectParam, SelectFiles, {effectiveTime:-1}, pageNumber);
let dbList = await findToPage(TABLEENUM.消息通知表, selectParam, SelectFiles, pageNumber);
let dbList = await findToSortToPage(TABLEENUM.消息通知表, selectParam, SelectFiles, {createTime:-1}, pageNumber);
// let dbList = await findToPage(TABLEENUM.消息通知表, selectParam, SelectFiles, pageNumber);
let dataCount = await findCount(TABLEENUM.消息通知表, selectParam);
let dataList = [];
......@@ -89,6 +89,7 @@ export async function addMessage({userId, lableId, msgTitle, effectiveTime, msgC
msgId,
lableId,
msgTitle,
createTime:new Date().valueOf(),
effectiveTime,
msgContent
};
......@@ -177,6 +178,38 @@ export async function delMessage({msgId}) {
/**
* 游客消息通知
* @param userId 会员Id(请求头id)
* @returns
*/
export async function touristMessage() {
let selectParam:any = {"$or":[{ lableId:{"$in":CLIENTMSGLABLE.所有人} }]};
let dataList = [];
const SelectFiles = ["msgId", "msgTitle", "effectiveTime", "msgContent", "isPop"];
let msgInfo = await find(TABLEENUM.消息通知表, selectParam, SelectFiles);
// if (!msgInfo || !msgInfo.msgId) throw new BizError(ERRORENUM.目标数据不存在);
if (msgInfo) {
msgInfo.forEach( info => {
if (!info.msgId) return successErrorResult("暂无消息通知");
});
}
for(let i = 0; i < msgInfo.length; i++) {
let info = msgInfo[i];
let item:any = extractData(info, SelectFiles);
item.effectiveTime = moment(item.effectiveTime).format("YYYY-MM-DD");
item.readId = "";
item.isRead = 0;
dataList.push(item);
}
return {dataList};
}
/**
* 消息通知
* @param userId 会员Id(请求头id)
* @returns
......@@ -185,10 +218,9 @@ export async function noticeMessage({userId}) {
let selectParam:any = {"$or":[{ lableId:{"$in":CLIENTMSGLABLE.所有人} }]};
/**非游客用户通知消息条件 */
if (userId) {
let userInfo = await findOnce(TABLEENUM.用户表, {userId}, ["lableId", "memberType"]);
// if (!userInfo || !userInfo.lableId) throw new BizError(ERRORENUM.目标数据不存在);
if (!userInfo || !userInfo.lableId) return successErrorResult("该会员暂无消息通知标签分类");
if (!userInfo) throw new BizError(ERRORENUM.目标数据不存在);
// if (!userInfo || !userInfo.lableId) return successErrorResult("该会员暂无消息通知标签分类");
let nowDate = new Date().valueOf();
let memberType = userInfo.memberType.toString();
......@@ -199,7 +231,6 @@ export async function noticeMessage({userId}) {
effectiveTime:{"$gt":nowDate} //有效时间大于当前时间的消息发送通知
}
)
}
let dataList = [];
const SelectFiles = ["msgId", "msgTitle", "effectiveTime", "msgContent", "isPop"];
......@@ -207,20 +238,38 @@ export async function noticeMessage({userId}) {
// if (!msgInfo || !msgInfo.msgId) throw new BizError(ERRORENUM.目标数据不存在);
if (msgInfo) {
msgInfo.forEach( info => {
if (!info.msgId) return successErrorResult("暂无消息通知");
})
if (!info.msgId) return successErrorResult("该会员暂无消息通知标签分类");
});
}
for(let i = 0; i < msgInfo.length; i++) {
let info = msgInfo[i];
let item:any = extractData(info, SelectFiles);
item.effectiveTime = moment(item.effectiveTime).format("YYYY-MM-DD");
//会员的消息已读数据
let msgReadInfo = await findOnce(TABLEENUM.消息已读状态表, {userId, msgId:item.msgId}, ["readId", "isRead"]);
// if(!msgReadInfo) {
let selectMsgParam:any = {msgId:item.msgId, userId:userId};
// if (!userId) selectMsgParam.userId = userId;
let msgReadOldInfo = await findOnce(TABLEENUM.消息已读状态表, selectMsgParam, ["readId", "isRead"]);
let msgReadInfo:any = {};
/**没有已读状态的用户新建一条消息未读状态 */
if (!msgReadOldInfo) {
/**消息已读Id */
const readId = generateSystemId(TABLEENUM.消息已读状态表, userId);
let addReadInfo = {
readId,
msgId:item.msgId,
userId,
isRead:STATE.
}
await addOneData(TABLEENUM.消息已读状态表, addReadInfo);
msgReadInfo = await findOnce(TABLEENUM.消息已读状态表, selectMsgParam, ["readId", "isRead"]);
} else {
msgReadInfo = msgReadOldInfo;
}
// }
item.readId = msgReadInfo.readId;
item.isRead = msgReadInfo.isRead;
......@@ -233,10 +282,10 @@ export async function noticeMessage({userId}) {
/**
* 全部已读
* @param msgId 消息Id
* @param userId 会员Id
*/
export async function allMsgRead({userId, msgId}) {
await updateOneData(TABLEENUM.消息已读状态表, {userId, msgId}, {isRead: STATE.});
export async function allMsgRead({userId}) {
await updateManyData(TABLEENUM.消息已读状态表, {userId}, {isRead:STATE., readTime:new Date().valueOf()});
return successResult();
}
......@@ -268,17 +317,22 @@ export async function updateMsgRead({readId}) {
*/
export async function getActivityList({activityName, activityStartTime, activityEndTime, pageNumber}) {
let selectParam:any = {};
if (activityName) selectParam.activityName = activityName;
if (activityStartTime) {
selectParam["activityStartTime"] = {"$gt":activityStartTime};
}
if (activityEndTime) {
if (!selectParam["activityEndTime"]) selectParam["activityEndTime"] = {};
selectParam["activityEndTime"]["$lt"] = activityEndTime;
}
if (activityName) selectParam.activityName = {"$regex":`${activityName}`};
/**活动时间完全在查询时间段内 gt:大于、lt:小于 */
if (activityStartTime && activityEndTime) {
selectParam["activityStartTime"] = { "$lte": activityEndTime },
selectParam["activityEndTime"] = { "$gte": activityStartTime }
}
// if (activityStartTime) {
// selectParam["activityStartTime"] = {"$gt":activityStartTime};
// }
// if (activityEndTime) {
// if (!selectParam["activityEndTime"]) selectParam["activityEndTime"] = {};
// selectParam["activityEndTime"]["$lt"] = activityEndTime;
// }
const SelectFiles = ["activityId", "activityName", "activityType", "activityStartTime", "activityEndTime", "activityAdd", "enrollStartTime", "enrollEndTime", "lableId", "isTopUp"];
let dbList = await findToSortToPage(TABLEENUM.活动通知表, selectParam, SelectFiles, {activityStartTime:-1}, pageNumber);
let dbList = await findToSortToPage(TABLEENUM.活动通知表, selectParam, SelectFiles, {createTime:-1}, pageNumber);
let dataCount = await findCount(TABLEENUM.活动通知表, selectParam);
let dataList = [];
......@@ -333,6 +387,7 @@ export async function addActivity({userId, form}) {
let addInfo = form;
addInfo.activityId = activityId;
addInfo.createTime = new Date().valueOf();
await addOneData(TABLEENUM.活动通知表, addInfo);
......@@ -429,6 +484,8 @@ export async function enrollList({activityId}) {
}
if (!item.memberLevel) item.memberLevel = "未选择";
else item.memberLevel = changeEnumValue(MEMBERLEVEL, item.memberLevel);
item.memberType = changeEnumValue(MEMBERTYPE, userInfo.memberType);
dataList.push(item);
}
......@@ -440,11 +497,22 @@ export async function enrollList({activityId}) {
* 根据选择的会员下载报名表
* @param id 会员Id
*/
export async function getEnrollUrl({id}) {
let activityInfo = await find(TABLEENUM.活动报名表, {userId:id}, ["userId", "activityId", "enrollUrl"]);
if (!activityInfo || !activityInfo.enrollUrl) throw new BizError(ERRORENUM.目标数据不存在);
export async function getEnrollUrl({id, activityId}) {
let activityData = [];
for (let i = 0; i < id.length; i++) {
let activityInfo = await findOnce(TABLEENUM.活动报名表, {userId:id[i], activityId}, ["userId", "activityId", "enrollUrl"]);
if (!activityInfo) throw new BizError(ERRORENUM.目标数据不存在);
let item:any = extractData(activityInfo, ["userId", "activityId", "enrollUrl"]);
let userInfo = await findOnce(TABLEENUM.用户表, {userId:activityInfo.userId}, ["userName", "name", "memberType"]);
if (userInfo.memberType == MEMBERTYPE.个人会员) item.name = userInfo.name
else item.name = userInfo.userName
item.memberType = changeEnumValue(MEMBERTYPE, userInfo.memberType);
activityData.push(item);
}
return {activityInfo};
return {activityData};
}
......@@ -502,6 +570,9 @@ export async function activityEnroll({userId, activityId, enrollUrl}) {
})
}
let activityEnroll = await findOnce(TABLEENUM.活动报名表, {userId, activityId});
if (activityEnroll) return successErrorResult("已参加该活动,不能重复报名");
/**消息Id */
const enrollId = generateSystemId(TABLEENUM.活动报名表, userId);
......@@ -548,10 +619,11 @@ export async function seeActivity({userId}) {
let SelectFiles = ["activityId", "activityName", "activityStartTime", "activityEndTime"];
// let activityInfo = await find(TABLEENUM.活动通知表, selectParam, SelectFiles);
let activityInfo = await findToSort(TABLEENUM.活动通知表, selectParam, {activityStartTime:-1}, SelectFiles);
if (!activityInfo || !activityInfo.length) throw new BizError(ERRORENUM.目标数据不存在);
let activityInfo = await findToSort(TABLEENUM.活动通知表, selectParam, {createTime:-1}, SelectFiles);
// if (!activityInfo || !activityInfo.length) throw new BizError(ERRORENUM.目标数据不存在);
let dataList = [];
if (activityInfo) {
activityInfo.forEach( info => {
let item:any = extractData(info, SelectFiles);
// item.activityStartTime = moment(item.activityStartTime).format("YYYY-MM-DD");
......@@ -560,6 +632,7 @@ export async function seeActivity({userId}) {
if (item.activityEndTime) item.activityEndTime = moment(item.activityEndTime).format("YYYY-MM-DD");
dataList.push(item);
})
}
return {dataList};
}
......@@ -595,9 +668,9 @@ export async function homeActivityList({userId, activityState, pageNumber}) {
if (activityState == ACTIVITYSTATE.已结束) selectParam.activityState = activityState;
if (activityState == CLIENTACTIVITYSTATE.已参加) {
selectParam.activityId = [];
let activityInfo = await find(TABLEENUM.活动报名表, {userId}, ["activityId"]);
activityInfo.forEach( info => {
if (selectParam.activityId) selectParam = {activityId:[]};
selectParam.activityId.push(info.activityId);
})
}
......@@ -652,6 +725,7 @@ export async function homeActivityDetailed({activityId}) {
* 设置定时器,每一小时检查一次活动状态
*/
export async function initActivity() {
updateActivityState();
setInterval(async function () {
await updateActivityState();
}, 3600 * 1000);
......@@ -672,13 +746,13 @@ export async function updateActivityState() {
for (let i = 0; i < activityInfo.length; i++) {
let info = activityInfo[i];
if (info.activityType == ACTIVITYTYPE.线上活动) {
if (time > info.enrollTime) {
if (time > info.enrollEndTime) {
await updateOneData(TABLEENUM.活动通知表, {activityId:info.activityId}, formParam);
}
}
if (info.activityType == ACTIVITYTYPE.线下活动) {
if (time > info.activityTime) {
if (time > info.activityEndTime) {
await updateOneData(TABLEENUM.活动通知表, {activityId:info.activityId}, formParam);
}
}
......@@ -688,8 +762,3 @@ export async function updateActivityState() {
}
......@@ -24,7 +24,7 @@ export async function login({loginId, pwd}) {
let selectParam = { "$or":[{loginId:loginId}, {phone:loginId}] };
let userInfo = await findOnce(TABLEENUM.用户表, selectParam);
if (userInfo.isBlackUser == STATE.) throw new BizError(ERRORENUM.登录账号为黑名单用户);
if (userInfo.isBlackUser == STATE.) throw new BizError(ERRORENUM["您的会员服务已过期,如需恢复请联系秘书处:010-86208681"]);
if (!userInfo || !userInfo.userId) throw new BizError(ERRORENUM.账号或密码错误);
......@@ -129,3 +129,5 @@ export async function memberChangePwdSendCode({phone}) {
return {code:""};
}
......@@ -28,7 +28,7 @@ export function getOss({userId, type, fileName}) {
OSSAccessKeyId:OSSAccessKeyId,
dirName:`${userId}/${FirName}/${new Date().valueOf()}`,
policyBase64,
host:'http://wenhuabu-files.oss-cn-beijing.aliyuncs.com',
host:'https://wenhuabu-files.oss-cn-beijing.aliyuncs.com',
signature
};
}
\ No newline at end of file
......@@ -5,12 +5,12 @@
import { BANXUELEIXING, CODETYPE, DOCUMENTTYPE, INDIVIDUALMEMBERTYPE, MEMBERLEVEL, MEMBERTYPE, NATION, OPERATIONREHAVIOR, PROFCATEGORY, REGISTERFLOW, SEX, STATE, UNITMEMBERTYPE, USERREGISTERSTATE } from "../config/enum";
import { ERRORENUM } from "../config/errorEnum";
import { addManyData, addOneData } from "../data/add";
import { deleteManyData } from "../data/delete";
import { deleteManyData, deleteOneData } from "../data/delete";
import { TABLEENUM } from "../data/models/model";
import { find, findCount, findOnce, findOnceToSort } from "../data/select";
import { updateOneData } from "../data/update";
import * as sysTools from "../tools/system";
import { BizError } from "../util/bizError";
import { BizError, ConsoleError } from "../util/bizError";
import { extractData } from "../util/piecemeal";
import { changeEnumValue, eccEnumValue } from "../util/verificationEnum";
import { eccFormParam } from "../util/verificationParam";
......@@ -54,7 +54,9 @@ export async function memberRegister1({form}) {
loginId, mail, pwd, phone,
token,
individualMemberType:INDIVIDUALMEMBERTYPE.普通会员,
isBlackUser:STATE.
isBlackUser:STATE.,
saveUnsubmitted:STATE.,
firstStep:NowMs,
};
await addOneData(TABLEENUM.用户表, addInfo);
......@@ -100,6 +102,7 @@ export async function memberRegister2({form, id}) {
//更新注册流程
form.registerFlow = REGISTERFLOW.完成第二步;
form.askForTime = new Date().valueOf();
form.saveUnsubmitted = STATE.;
await updateOneData(TABLEENUM.用户表, {userId:id}, form);
/**提交审批历史信息 */
......@@ -155,7 +158,9 @@ export async function memberRegister2({form, id}) {
phone,
token,
unitMail:mail,
isBlackUser:STATE.
isBlackUser:STATE.,
saveUnsubmitted:STATE.,
firstStep:NowMs,
};
await addOneData(TABLEENUM.用户表, addInfo);
......@@ -197,7 +202,7 @@ export async function unitMemberRegister2({form, keyanForm, id}) {
eccEnumValue(EccFuncName, '单位会员类型', UNITMEMBERTYPE, form.unitMemberType);
form.registerFlow = REGISTERFLOW.完成第二步;
await updateOneData(TABLEENUM.用户表, {userId:id}, form);
await updateOneData(TABLEENUM.用户表, {userId:id, saveUnsubmitted:STATE.}, form);
/**注册提交单位科研成果信息 */
await deleteManyData(TABLEENUM.单位所获得科研成果表, {userId:id});
......@@ -239,7 +244,14 @@ export async function unitMemberRegister3({application, id}) {
remarks = "重新提交";
}
await updateOneData(TABLEENUM.用户表, {userId:id}, {userRegisterState, applicationForm:application, registerFlow:REGISTERFLOW.完成第三步, askForTime : new Date().valueOf()});
let updateForm = {
userRegisterState,
applicationForm:application,
registerFlow:REGISTERFLOW.完成第三步,
askForTime : new Date().valueOf(),
saveUnsubmitted:STATE.
};
await updateOneData(TABLEENUM.用户表, {userId:id}, updateForm);
/**提交审批历史信息 */
let addApprovalHistory = {
......@@ -378,4 +390,139 @@ export async function individualMemberDetails({id}) {
}
// 2.0 注册第二步保存功能
/**
* 会员注册【单位会员】【流程二】
* 注册第二步保存未提交
* @param form 表单
* @param keyanForm 科研表单
* @param userId
* @returns
*/
export async function unitMemberNotSaved({form, keyanForm, id}) {
const keyanFormItemConfig = {
startTime: {type:'Number'},
endTime: {type:'Number'},
describe: {type:'String'}
};
if (keyanForm) {
keyanForm.forEach(item => {
eccFormParam("注册单位会员第二步保存未提交", keyanFormItemConfig, item );
});
}
let selectUserFiles = ["userId", "registerFlow", "userRegisterState"];
let oldInfo = await findOnce(TABLEENUM.用户表, {userId:id, memberType:MEMBERTYPE.单位会员, isAdmin:STATE.}, selectUserFiles);
if (!oldInfo || !oldInfo.userId) throw new BizError(ERRORENUM.目标数据不存在);
if (oldInfo.registerFlow != REGISTERFLOW.完成第一步) throw new BizError(ERRORENUM.重复提交);
if (oldInfo.userRegisterState != USERREGISTERSTATE.待审核 && oldInfo.userRegisterState != USERREGISTERSTATE.驳回修改 ) {
throw new BizError(ERRORENUM.数据状态错误);
}
/**校验枚举 */
const EccFuncName = '注册单位会员流程第二步保存未提交';
eccEnumValue(EccFuncName, '专业类别', PROFCATEGORY, form.profCategory);
eccEnumValue(EccFuncName, '院校办学类型', BANXUELEIXING, form.yuanXiaoBanXueLeiXing);
eccEnumValue(EccFuncName, '单位会员类型', UNITMEMBERTYPE, form.unitMemberType);
form.saveUnsubmitted = STATE.;
await updateOneData(TABLEENUM.用户表, {userId:id, saveUnsubmitted:STATE.}, form);
return sysTools.successResult();
}
/**
* 会员注册【个人会员】【流程二】
* 注册第二步保存未提交
* @param form
* @param userId
* @returns
*/
export async function memberNotSaved({form, id}) {
/**校验用户是否存在 */
let selectUserFiles = ["userId", "registerFlow", "userRegisterState"];
let oldInfo = await findOnce(TABLEENUM.用户表, {userId:id, memberType:MEMBERTYPE.个人会员, isAdmin:STATE.}, selectUserFiles );
if (!oldInfo || !oldInfo.userId) throw new BizError(ERRORENUM.目标数据不存在);
if (oldInfo.registerFlow != REGISTERFLOW.完成第一步) throw new BizError(ERRORENUM.重复提交);
let operationBehavior = 0;
if (oldInfo.userRegisterState != USERREGISTERSTATE.待审核 && oldInfo.userRegisterState != USERREGISTERSTATE.驳回修改 ) {
throw new BizError(ERRORENUM.数据状态错误);
}
/**判断是否第一次提交审核 并更新状态*/
let remarks = "第一次提交";
if (oldInfo.userRegisterState == USERREGISTERSTATE.待审核) operationBehavior = OPERATIONREHAVIOR.用户提交
else {//驳回
operationBehavior = OPERATIONREHAVIOR.重新提交;
form.userRegisterState = USERREGISTERSTATE.重新提交;
remarks = "重新提交";
}
/**校验枚举 */
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.完成第一步;
form.saveUnsubmitted = STATE.;
form.askForTime = new Date().valueOf();
await updateOneData(TABLEENUM.用户表, {userId:id}, form);
return {userId:id};
}
/**
* 删除14天未注册成功的用户
* 设置定时器,一天检查一次是否注册成功
*/
export async function initSaveUnsubmitted() {
deleteSaveUnsubmitted();
setInterval(async function () {
await deleteSaveUnsubmitted();
}, 3600 * 1000 * 24);
}
export async function deleteSaveUnsubmitted() {
let time = sysTools.getTodayMs();
let oldInfo = await find(TABLEENUM.用户表, {saveUnsubmitted:STATE.}, ["userId", "firstStep"]);
if (!oldInfo || !oldInfo.length) return;
// 14天的时间间隔(毫秒)
const fourteenDays = 14 * 24 * 3600 * 1000;
for (let i = 0; i < oldInfo.length; i++) {
let info = oldInfo[i];
let futureDate = info.firstStep + fourteenDays; //计算第一步创建14天后时间戳
/**判断今天是否已经是14天后 */
if (time > futureDate) { //14天后,直接删除该用户信息
await deleteOneData(TABLEENUM.用户表, {userId:info.userId});
// throw new ConsoleError(`用户超出14天未提交注册,已删除改用户信息 userid:${info.userId}`);
}
}
}
......@@ -391,7 +391,7 @@ export enum USERREGISTERSTATE {
待审核 = 1,
重新提交,
驳回修改,
通过
通过,
}
......@@ -488,7 +488,8 @@ export enum REGISTERFLOW {
未注册 = 0,
完成第一步,
完成第二步,
完成第三步
完成第三步,
// 第二步保存,
}
......@@ -585,6 +586,7 @@ export enum ADMINLV {
会员管理,
管理设置 = 206,
标签系统,
通知管理 = 208,
}
......
......@@ -59,7 +59,7 @@ export enum ERRORENUM {
标签数据不存在,
线下活动的活动时间必填,
用户没有在此活动对象内,
登录账号为黑名单用户 = "您的会员服务已过期,如需恢复请联系秘书处:010-86208681",
"您的会员服务已过期,如需恢复请联系秘书处:010-86208681" = "您的会员服务已过期,如需恢复请联系秘书处:010-86208681",
}
export enum ERRORCODEENUM {
......
......@@ -93,7 +93,7 @@ enum TABLEENUM {
消息通知表 = "massageNotice",
消息已读状态表 = "massageReads",
活动通知表 = "activityNotice",
活动报名表 = "sctivityEnroll"
活动报名表 = "activityEnroll"
}
......@@ -442,6 +442,9 @@ const ModelArray = [
lableId:{type:'[String]', default:[]},//标签id 外键
/**黑名单 */
isBlackUser:{type:'Number', default:STATE.},//是否黑名单用户 0:否, 1:是
/**注册第二步保存未提交 */
saveUnsubmitted:{type:'Number', default:STATE.},//是否提交注册完成 0:否, 1:是
firstStep:'Number',//第一步完成时间
}
},
{
......@@ -526,6 +529,7 @@ const ModelArray = [
schema:{
msgId:{type:'String', index:true},//消息id
msgTitle:'String',//消息标题
createTime:'Number',//创建时间
effectiveTime:'Number',//有效时间
msgContent:'String',//消息内容
lableId:{type:'[String]', default:[]},//消息对象 标签id 外键
......@@ -559,6 +563,7 @@ const ModelArray = [
enrollStartTime:'Number',//报名开始时间
enrollEndTime:'Number',//报名结束时间
activityContent:'String',//详细内容
createTime:'Number',//创建时间
isTopUp:{type:'Number', default:STATE.},//是否置顶
}
},
......
......@@ -12,6 +12,7 @@ export async function findToPage(tableEnumValue:string, param:object, files:obje
export async function findToSortToPage(tableEnumValue:string, param:object, files:object, sortParam, pageNumber:number, pageSize?) {
pageSize = pageSize || 10;//默认每页10个
sortParam["_id"] = 1;
let data = await dataModels[tableEnumValue].find(param, files).sort(sortParam).skip((pageNumber - 1) *pageSize).limit(pageSize);
return data;
......
......@@ -13,7 +13,8 @@ export async function updateManyData(tableEnumValue:string, param:object, data:o
export async function updateOneData(tableEnumValue:string, param:object, data:object) {
await dataModels[tableEnumValue].updateOneData(param, data);
// await dataModels[tableEnumValue].updateOneData(param, data);
let row = await dataModels[tableEnumValue].updateOneData(param, data);
return {isSuccess:true};
}
\ No newline at end of file
import { TABLEENUM } from "./data/models/model";
import { find } from "./data/select";
import { updateOneData } from "./data/update";
export async function test() {
let conf = ["photoUrl", "cardUrlJust", "cardUrlBack", "academicCERTUrl", "professionalCERTUrl", "uusinessLicenseUrl", "applicationForm"];
for(let i = 0; i < conf.length; i++) {
let name = conf[i];
await updateHttps(name);
}
}
export async function updateHttps(name) {
// 查找并更新所有包含http的uusinessLicenseUrl
let selectParam = {};
selectParam[name] = {"$regex":"http"};
let userInfo = await find(TABLEENUM.用户表, selectParam);
for (let i = 0; i < userInfo.length; i++) {
let info:any = userInfo[i];
let str = info[name];
let newUrl = str.replace(/http:\/\//g, 'https://');
// 更新文档
if (newUrl) {
let selectParam = {userId:info.userId};
let formParam = {};
formParam[name] = newUrl;
await updateOneData(TABLEENUM.用户表, selectParam, formParam);
}
}
console.log();
}
......@@ -2,10 +2,12 @@
import { initActivity } from "./biz/member/msgActivity";
import { initAdmin } from "./biz/member/rightsMgmt";
import { t } from "./biz/provide";
import { initSaveUnsubmitted } from "./biz/register";
import { initSMS } from "./biz/sms";
import { initSystemTask } from "./biz/task";
import { initConfig, systemConfig} from "./config/serverConfig";
import { initDataBaseModel } from "./data/db/db";
import { test } from "./httpTOhttps";
import { httpServer } from "./net/http_server";
async function lanuch() {
......@@ -20,11 +22,15 @@ async function lanuch() {
await initAdmin();
await initSystemTask();
await initActivity();
await initSaveUnsubmitted();
// await test1();
// await inputData(); 20240520日导入数据
// await t();
// await test();
console.log("服务初始化成功");
}
lanuch();
......@@ -209,7 +209,99 @@ export const Config = {
}
],
bindBiz:registerBiz.individualMemberDetails
},
{
apiName:"单位入会流程2保存未提交",
notMiddleware:false,
subUrl:'/memberdb/unitmembernotsaved',
param:[
{
key:"form", type:"Object", sub:
{
unitName:{type:'String', desc:'单位名称', notMustHave:true},
sheng:{type:'String', desc:'省', notMustHave:true},
shi:{type:'String', desc:'市', notMustHave:true},
qu:{type:'String', desc:'区', notMustHave:true},
addres:{type:'String', desc:'通信地址', notMustHave:true},
uscc:{type:'String', desc:'单位信用代码', notMustHave:true},
legalPerson:{type:'String', desc:'法人代表', notMustHave:true},
legalPersonPhone:{type:'String', desc:'法人联系电话', notMustHave:true},
legalPersonMail:{type:'String', desc:'法人邮箱', notMustHave:true},
contactPerson:{type:'String', desc:'日常联系人', notMustHave:true},
contactPersonDuties:{type:'String', desc:'日常联系人职务', notMustHave:true},
contactPersonPhone:{type:'String', desc:'日常联系人手机', notMustHave:true},
uusinessLicenseUrl:{type:'String', desc:'营业执照复印件', notMustHave:true},
/**单位信息 */
unitMemberType:{type:'Number', desc:'单位信息类型,枚举', notMustHave:true},
yuanXiaoBanXueLeiXing:{type:'Number', desc:'院校办学类型,枚举', notMustHave:true},
yuanXiaoZhuGuanBuMen:{type:'String', desc:'院校主管部门', notMustHave:true},
yuanXiaoFuZeRen:{type:'String', desc:'院校主要负责人', notMustHave:true},
yuanXiaoFuZeRenZhiWu:{type:'String', desc:'院校主要负责人职务', notMustHave:true},
yuanXiaoFuZeRenDianHua:{type:'String', desc:'院校主要负责人电话', notMustHave:true},
yuanXiaoBanGongFuZeRen:{type:'String', desc:'院校办公负责人', notMustHave:true},
yuanXiaoBanGongFuZeRenDianHua:{type:'String', desc:'院校办公负责人电话', notMustHave:true},
ZhuYaoFuZeRenYouXiang:{type:'String', desc:'主要负责人邮箱', notMustHave:true},
yuanXiaoKeYanFuZeRen:{type:'String', desc:'院校科研负责人', notMustHave:true},
yuanXiaoKeYanFuZeRenDianHua:{type:'String', desc:'院校科研负责人电话', notMustHave:true},
jiaoXueFuZeRenXinMing:{type:'String', desc:'教学负责人姓名', notMustHave:true},
yuanXiaoXueShengZongRenShu:{type:'Number', desc:'院校学生总人数', notMustHave:true},
yuanXiaoJiaoZhiGongZongRenShu:{type:'Number', desc:'院校教职工总人数', notMustHave:true},
jiaoXueFuZeRenDianHua:{type:'String', desc:'教学负责人电话', notMustHave:true},
kaishezhuanYe:{type:'String', desc:'开设专业', notMustHave:true},
danWeiJianJie:{type:'String', desc:'单位简介', notMustHave:true},
}
},
{
key:"keyanForm", type:"[Object]", desc:"单位所获得科研成果表单", isNull:true
},
{
key:"id", type:"String", desc:"会员id"
}
],
bindBiz:registerBiz.unitMemberNotSaved
},
{
apiName:"个人入会流程2保存未提交",
notMiddleware:false,
subUrl:'/memberdb/membernotsaved',
param:[
{
key:"form", type:"Object", sub:
{
name:{type:'String', desc:'真实姓名', notMustHave:true},
sex:{type:'Number', desc:'性别', notMustHave:true},
documentType:{type:'Number', desc:'证件类型', notMustHave:true},
documentId:{type:'String', desc:'证件号码', notMustHave:true},
birth:{type:'Number', desc:'出生年月', notMustHave:true},
nation:{type:'Number', desc:'民族', notMustHave:true},
sheng:{type:'String', desc:'省', notMustHave:true},
shi:{type:'String', desc:'市', notMustHave:true},
qu:{type:'String', desc:'区', notMustHave:true},
addres:{type:'String', desc:'通信地址', notMustHave:true},
education:{type:'Number', desc:'学历', notMustHave:true},
photoUrl:{type:'String', desc:'蓝底证件照', notMustHave:true},
unitName:{type:'String', desc:'工作单位', notMustHave:true},
duties:{type:'String', desc:'职务', notMustHave:true},
workTitle:{type:'String', desc:'职称', notMustHave:true},
profCategory:{type:'[Number]', desc:'专业类别', notMustHave:true},
studyResume:{type:'String', desc:'学习简历', notMustHave:true},
workResume:{type:'String', desc:'工作简历', notMustHave:true},
profAchievement:{type:'String', desc:'专业成果', notMustHave:true},
otherEMP:{type:'String', desc:'在其他社会组织任职情况', notMustHave:true},
otherPROF:{type:'String', desc:'其他与本学会专业有关的情况', notMustHave:true},
cardUrlJust:{type:'String', desc:'个人身份证扫描件正面', notMustHave:true},
cardUrlBack:{type:'String', desc:'个人身份证扫描件反面', notMustHave:true},
academicCERTUrl:{type:'String', desc:'个人学历证明扫描件', notMustHave:true},
professionalCERTUrl:{type:'String', desc:'个人工作证明扫描件', notMustHave:true},
auxiliaryMaterial:{type:'[String]', desc:'论文发表等证明工作成果或成绩的材料', notMustHave:true},
}
},
{
key:"id", type:"String", desc:"会员id"
}
],
bindBiz:registerBiz.memberNotSaved
},
],
"登陆相关":[
{
......
......@@ -68,27 +68,25 @@ export const Config = {
bindBiz:msgActivityBiz.delMessage
},
{
apiName:"消息通知",
subUrl:'/msgdb/noticemessage',
param:[],
bindBiz:msgActivityBiz.noticeMessage
},
{
apiName:"全部已读",
subUrl:'/msgdb/allmsgread',
param:[
{key:"msgId", type:"String", desc:"消息Id"},
],
param:[],
bindBiz:msgActivityBiz.allMsgRead
},
{
apiName:"修改消息为已读",
subUrl:'/msgdb/allmsgread',
subUrl:'/msgdb/updatamsgread',
param:[
{key:"readId", type:"String", desc:"消息已读Id"},
],
bindBiz:msgActivityBiz.updateMsgRead
},
{
apiName:"消息通知",
subUrl:'/msgdb/noticemessage',
param:[],
bindBiz:msgActivityBiz.noticeMessage,
},
],
"活动通知":[
{
......@@ -207,7 +205,8 @@ export const Config = {
apiName:"根据选择的会员下载报名表",
subUrl:'/activitydb/enrollurl',
param:[
{key:"id", type:"String", desc:"用户id"}
{key:"id", type:"[String]", desc:"用户id"},
{key:"activityId", type:"String", desc:"活动Id"},
],
bindBiz:msgActivityBiz.getEnrollUrl
}
......
import * as officialWebsiteBiz from "../../biz/officialWebsite";
import * as msgActivityBiz from "../../biz/member/msgActivity";
export const FirstName = '官网路由';
export const FirstRouter = '/officialwebsite';
......@@ -248,5 +249,14 @@ export const Config = {
bindBiz:officialWebsiteBiz.zhengShuChaXun
},
],
"消息通知":[
{
apiName:"游客消息通知",
notMiddleware:true,
subUrl:'/touristmessage',
param:[],
bindBiz:msgActivityBiz.touristMessage,
},
]
}
\ No newline at end of file
import * as publicBiz from '../../biz/public';
import * as enumConfig from '../../config/enum';
import * as outPutConfig from '../../config/outPutConfig';
import * as msgActivityBiz from "../../biz/member/msgActivity";
export const FirstName = '公共接口';
export const FirstRouter = '/public';
......@@ -296,4 +297,5 @@ export const Config = {
},
],
}
......@@ -22,7 +22,7 @@ import * as asyncHandler from 'express-async-handler';
import { payCallback } from "../biz/member/cost";
import { checkUser } from "../middleware/user";
const Look = true;//true更新文档
const Look = false;//true更新文档
export async function setRouter(httpServer){
if (Look) {
......@@ -30,7 +30,7 @@ export async function setRouter(httpServer){
// await initDoc(portalRouter.FirstName, portalRouter.Config, portalRouter.FirstRouter);//网站编辑
await initDoc(publicRouter.FirstName, publicRouter.Config, publicRouter.FirstRouter);//公用组件
// await initDoc(memberRouter.FirstName, memberRouter.Config, memberRouter.FirstRouter);//用户路由
// await initDoc(officalWebsiteRouter.FirstName, officalWebsiteRouter.Config, officalWebsiteRouter.FirstRouter);//官网路由
await initDoc(officalWebsiteRouter.FirstName, officalWebsiteRouter.Config, officalWebsiteRouter.FirstRouter);//官网路由
// await initDoc(orderRouter.FirstName, orderRouter.Config, orderRouter.FirstRouter);//会费相关
// await initDoc(costRouter.FirstName, costRouter.Config, costRouter.FirstRouter);//支付
// await initDoc(outPutRouter.FirstName, outPutRouter.Config, outPutRouter.FirstRouter);//导出路由
......@@ -56,7 +56,7 @@ function analysisRouter(httpServer, config, firstRouter, haveMiddleware) {
for (let modelKey in config) {
config[modelKey].forEach(info => {
let {apiName, defaultParam, subUrl, param, bindBiz, notMiddleware} = info;
if (haveMiddleware && !notMiddleware) httpServer.post(firstRouter+subUrl, checkUser , asyncHandler(routerFun(apiName, defaultParam, subUrl, param, bindBiz, notMiddleware)));
if (haveMiddleware && !notMiddleware) httpServer.post(firstRouter+subUrl, checkUser, asyncHandler(routerFun(apiName, defaultParam, subUrl, param, bindBiz, notMiddleware)));
else httpServer.post(firstRouter+subUrl, asyncHandler(routerFun(apiName, defaultParam, subUrl, param, bindBiz, notMiddleware)));
});
}
......
......@@ -4,7 +4,7 @@
*/
import { getBizMsg } from "../config/errorEnum";
import { logError } from "./log";
import { logConsole, logError } from "./log";
export class BizError extends Error {
constructor(...msgs) {
......@@ -24,3 +24,27 @@ export class BizError extends Error {
super(reqErrorMsg);
}
}
export class ConsoleError extends Error {
constructor(...msgs) {
let reqErrorMsg = '';
let logErrorMsg = '';
for (let i = 0; i <msgs.length; i++) {
if (!i) {
let msg = getBizMsg(msgs[i]);
reqErrorMsg = msg;
logErrorMsg = msg;
} else {
logErrorMsg += ` | ${msgs[i]} `;
}
}
logConsole(logErrorMsg);
super(reqErrorMsg);
}
}
......@@ -12,7 +12,9 @@ export const systemLogPath = {
errorLogFile:"error",
errorLogDir:"error",
handleLogFile:"handle",
handleLogDir:"handle"
handleLogDir:"handle",
recordLogFile:"record",
recordLogDir:"record",
}
//日志根目录
......@@ -20,6 +22,7 @@ export const systemLogPath = {
let baseLogPath = path.resolve('./', 'logs');
let errFile = path.resolve(baseLogPath, systemLogPath.errorLogDir, systemLogPath.errorLogFile);
let handFile =path.resolve(baseLogPath, systemLogPath.handleLogDir, systemLogPath.handleLogFile);
let recordFile =path.resolve(baseLogPath, systemLogPath.recordLogDir, systemLogPath.recordLogFile);
let config = {
appenders:
{
......@@ -43,13 +46,24 @@ let config = {
"maxLogSize": 1000,
"numBackups": 3,
"path": `/${systemLogPath.handleLogDir}`
},
"recordLogger": {
"type": "dateFile",
"filename": recordFile,
"pattern": "yyyy-MM-dd.log",
"alwaysIncludePattern": true,
"encoding": "utf-8",
"maxLogSize": 1000,
"numBackups": 3,
"path": `/${systemLogPath.recordLogDir}`
}
},
categories: {
"default": {"appenders": ["rule-console"], "level": "all"}, //这个配置一定要有
"errorLogger": {"appenders": ["errorLogger"], "level": "error"},
"handleLogger": {"appenders": ["handleLogger"], "level": "all"}
"handleLogger": {"appenders": ["handleLogger"], "level": "all"},
"recordLogger": {"appenders": ["recordLogger"], "level": "info"},
},
"baseLogPath": path.resolve(baseLogPath, systemLogPath.handleLogDir, systemLogPath.handleLogFile)
};
......@@ -60,6 +74,7 @@ log4js.configure(config); //加载配置文件
let errorLogger = log4js.getLogger("errorLogger");
let handleLogger = log4js.getLogger("handleLogger");
let consoleLogger = log4js.getLogger("rule-console");
let recordLogger = log4js.getLogger("recordLogger");
//错误日志
export function logError(...errStrs) {
......
This source diff could not be displayed because it is too large. You can view the blob instead.
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