Commit 76f7a4ee by lixinming

no message

parent 94a62cc6
......@@ -4,6 +4,7 @@
"description": "",
"main": "main.ts",
"dependencies": {
"@alicloud/dypnsapi20170525": "^1.2.1",
"@alicloud/sms-sdk": "^1.1.6",
"@types/node": "^10.12.18",
"compression": "^1.7.4",
......@@ -25,7 +26,6 @@
"request": "^2.88.0",
"sequelize": "^6.35.2",
"svg-captcha": "^1.3.12",
"tencentcloud-sdk-nodejs": "^4.0.821",
"wechatpay-node-v3": "^2.2.0",
"ws": "^5.2.2",
"xml2js": "^0.4.23"
......
......@@ -109,8 +109,8 @@ export async function memberChangePwdSendCode({phone}) {
const NowMs = new Date().valueOf();
let codeSelectParam = { phone, isUse:false, type:CODETYPE.修改密码, sendMs:{"$gt":getTodayMs()} }
let lastCodeInfo = await findOnceToSort(TABLEENUM.验证码表, codeSelectParam, {sendMs:-1});
let codeNum = lastCodeInfo.codeNum;
if (codeNum) {
if (lastCodeInfo && lastCodeInfo.codeNum) {
if ( (lastCodeInfo.sendMs + (60*1000)) > NowMs ) throw new BizError(ERRORENUM.频繁操作请稍后再试);
/**校验今日同类型验证码次数 */
let todayNotUseCount = await findCount(TABLEENUM.验证码表, codeSelectParam);
......
......@@ -33,12 +33,17 @@ export async function list({userId, type}) {
await addManyData(TABLEENUM.文字资料, addList);
}
dataList.sort((a:any, b:any) => {return a.rank - b.rank });
dbList.forEach(info => {
for (let i =0; i < dbList.length; i++) {
let info= dbList[i];
let item:any = extractData(info, ["id", "title", "rank", "position", "articleTitle" ]);
if (!item.position) item.position = "未选择";
else item.position = changeEnumValue(ARTICLEPOSITION, item.position);
let articleInfo = await findOnce(TABLEENUM.文章管理, {id:item.articleTitle}, ["id", "title"]);
item.articleTitle = articleInfo && articleInfo.id ? articleInfo.title : '';
dataList.push(item);
});
}
return {dataList};
}
......
......@@ -123,3 +123,9 @@ export async function getTitleList({type}) {
});
return {dataList}
}
//todo
export async function statsWenZhangCount(type:number) {
}
\ No newline at end of file
......@@ -31,13 +31,19 @@ export async function list({userId}) {
}
await addManyData(TABLEENUM.专题系列, addList);
}
dataList.sort((a:any, b:any) => {return a.rank - b.rank });
dbList.forEach(info => {
dbList.sort((a:any, b:any) => {return a.rank - b.rank });
for (let i= 0; i < dbList.length; i++) {
let info = dbList[i];
let item:any = extractData(info, ["id", "title", "articleUrl", "position", "articleTitle", "imgUrl"]);
if (!item.position) item.position = "未选择";
else item.position = changeEnumValue(ARTICLEPOSITION, item.position);
let articleInfo = await findOnce(TABLEENUM.文章管理, {id:item.articleTitle}, ["id", "title"]);
item.articleTitle = articleInfo && articleInfo.id ? articleInfo.title : '';
dataList.push(item);
});
}
return {dataList};
}
......
......@@ -274,8 +274,8 @@ export async function memberRegisterSendCode({phone}) {
const NowMs = new Date().valueOf();
let codeSelectParam = { phone, isUse:false, type:CODETYPE.用户注册, sendMs:{"$gt":sysTools.getTodayMs()} }
let lastCodeInfo = await findOnceToSort(TABLEENUM.验证码表, codeSelectParam, {sendMs:-1});
let codeNum = lastCodeInfo.codeNum;
if (codeNum) {
if (lastCodeInfo && lastCodeInfo.codeNum) {
if ( (lastCodeInfo.sendMs + (60*1000)) > NowMs ) throw new BizError(ERRORENUM.频繁操作请稍后再试);
/**校验今日同类型验证码次数 */
let todayNotUseCount = await findCount(TABLEENUM.验证码表, codeSelectParam);
......
/**
* 短信主要逻辑
*/
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}`);
// This file is auto-generated, don't edit it
// 依赖的模块可通过下载工程中的模块依赖文件或右上角的获取 SDK 依赖信息查看
const Dypnsapi20170525 = require('@alicloud/dypnsapi20170525');
const OpenApi = require('@alicloud/openapi-client');
const Util = require('@alicloud/tea-util');
const Tea = require('@alicloud/tea-typescript');
let smsClient;
function initSMS() {}
class Client {
/**
* 使用AK&SK初始化账号Client
* @param accessKeyId
* @param accessKeySecret
* @return Client
* @throws Exception
*/
static createClient() {
// 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考。
// 建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378664.html。
let config = new OpenApi.Config({
// 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。
accessKeyId: 'LTAI5tD7Finu3fxFMCi3415S',
// 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
accessKeySecret: 'sbPR0AdDPfjm7v2NSffk5apPm6UClV',
});
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});
});
})
}
// Endpoint 请参考 https://api.aliyun.com/product/Dypnsapi
config.endpoint = `dypnsapi.aliyuncs.com`;
return new Dypnsapi20170525.default(config);
}
static async main(args) {
let client = Client.createClient();
let sendSmsVerifyCodeRequest = new Dypnsapi20170525.SendSmsVerifyCodeRequest({ });
let runtime = new Util.RuntimeOptions({ });
try {
// 复制代码运行请自行打印 API 的返回值
await client.sendSmsVerifyCodeWithOptions(sendSmsVerifyCodeRequest, runtime);
} catch (error) {
// 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
// 错误 message
console.log(error.message);
// 诊断地址
console.log(error.data["Recommend"]);
}
}
/**
* 发送单位会员注册的短信验证码
* @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;
}
exports.Client = Client;
Client.main(process.argv.slice(2));
\ No newline at end of file
......@@ -346,7 +346,7 @@ const ModelArray = [
session:'Number',//届次
paymentStatus:'Number',//支付状态 PAYMENTSTATUS
isInput:{type:'Boolean', default:false},//是否是导入用户
inputUserChangePwd:{type:'Boolean', default:false},//导入账号修改密码
inputUserChangePwd:{type:'Boolean', default:false},
/**管理员字段 */
adminType:{type:'Number'},//管理员类别 ADMINTYPE
adminLv:"[Number]",//管理员等级 多选 ADMINLV
......@@ -424,7 +424,6 @@ const ModelArray = [
jiaoXueFuZeRenDianHua:'String',//教学负责人电话
/**第三步流程表单(单位)【申请表上传】 */
applicationForm:'String',//入会申请表
}
},
{
......
......@@ -42,4 +42,21 @@ export async function findToSort(tableEnumValue:string, param, sortParam, files?
files = files || [];
let data = await dataModels[tableEnumValue].find(param, files).sort(sortParam);
return data;
}
/**
* 统计数据
* @param tableEnumValue
* @param param
* @param group
* @returns
*/
export async function statsData(tableEnumValue:string, param, group) {
let dataList = await dataModels[tableEnumValue].aggregate([
{"$match":param},
{"$group":group}
]);
return dataList;
}
\ No newline at end of file
import { bizlive } from "tencentcloud-sdk-nodejs";
import { ERRORCODEENUM } from "../config/errorEnum";
/**
......
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