Commit b328c2eb by lixinming

no message

parents
.idea
/out
/node_modules
/test
/public
/logs
/video
*.logs
*.zip
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "启动程序",
"program": "${workspaceFolder}/src/main.ts",
"outFiles": [
"${workspaceFolder}/**/*.js"
]
}
]
}
\ No newline at end of file
{
"name": "screen",
"version": "1.0.0",
"description": "",
"main": "main.ts",
"dependencies": {
"@alicloud/sms-sdk": "^1.1.6",
"@types/node": "^10.12.18",
"compression": "^1.7.4",
"express": "^4.17.1",
"express-async-handler": "^1.1.4",
"express-history-api-fallback": "^2.2.1",
"formidable": "^1.2.1",
"log4js": "^6.6.1",
"lru-cache": "^4.1.5",
"md5": "^2.2.1",
"moment": "^2.24.0",
"mongoose": "^5.4.0",
"mysql": "^2.18.1",
"node-xlsx": "^0.16.1",
"nodemailer": "^6.1.1",
"officegen": "^0.6.5",
"qs": "^6.11.0",
"request": "^2.88.0",
"svg-captcha": "^1.3.12",
"tencentcloud-sdk-nodejs": "^4.0.562",
"ws": "^5.2.2",
"xml2js": "^0.4.23"
},
"devDependencies": {},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "cjj",
"license": "ISC",
"bin": "./out/main.js",
"pkg": {
"scripts": "out/**/*.js",
"assets": [
"public/**/*",
"res/**/*",
"images/**/*",
"video/**/*"
],
"outputPath": "dist"
}
}
This diff is collapsed. Click to expand it.
This source diff could not be displayed because it is too large. You can view the blob instead.
File added
<config>
<port>9099</port>
<sign>xxx90909082fsdahfjosadjfpoiwausjorip2hjklrhn1ioud0u124rx0qwejfokasjfolksaujfoas</sign>
<dbServer>http://192.168.0.105:40012</dbServer>
</config>
\ No newline at end of file
/**
* 企业基础信息
*/
\ No newline at end of file
import { TABLEID, TABLENAME } from "../config/enum/dbEnum";
import { randomId } from "../tools/system";
/**
* 文件上传
*/
const fs = require('fs');
const path = require('path');
/**
* 上传文件
* @param files
* @param type
* @returns
*/
export async function upFile(files, type) {
let pngId = randomId(TABLEID.图片存储);
let upUrl = path.join(__dirname.substring(0,__dirname.indexOf("out")), 'files', 'honor');
let stats = fs.existsSync(upUrl);
if (!stats) fs.mkdirSync(upUrl);
let fileName = `${pngId}${type}`;
fs.renameSync(files.file.path, path.join(upUrl, `${fileName}` ));
return {isSuccess:true, url:`/honor/${fileName}`, fileName};
}
\ No newline at end of file
/**
* 校验表单参数配置 【小程序】
* 使用场景: 验证客户端请求参数
* 限制: 1.使用端不同不能共用一份配置
* 2.需要搭配 util/verificationParam -> eccFormParam() 方法使用
* 说明: notMustHave = true 时说明该字段是非必填的;不配该字段说明是必填的
*/
export const EnterpriseInfomationUpdateConfig = {
tongXinDiZhi:{type:"Address"},//通信地址
industry:{type:"[Number]"},//领域
mail:{type:"String"},//邮箱
liaison:{type:"String"},//联系人
liaisonPhone:{type:"String"},//联系电话
gengDuoDianHua:{type:"String"},//更多电话
jianJie:{type:"String"},//简介
mainBusiness:{type:"String"},//主营业务
}
export const EnterpriseFaRenInfoUpdateConfig = {
name:{type:"String"}, //姓名
idCard:{type:"String"}, //身份证
domicile:{type:"String"}, //户籍
degree:{type:"Number"}, //学历
politicalStatus:{type:"Number"}, //政治面貌
phone:{type:"String"}, //手机号码
}
export const EnterpriseIPRUpdateConfig = {
year:{type:"Number"}, //年度
number:{type:"Number"}, //个数
}
export const EnterprisePatentUpdateConfig = {
year:{type:"Number"}, //年度
alienPatent:{type:"Number"},//海外专利个数
classIPatent:{type:"Number"},//一类专利个数
secondClassPatent:{type:"Number"},//二级专利个数
thirdPentent:{type:"Number"},//三级专利个数
}
export const EnterpriseQualificationUpdateConfig = {
kxTime:{key:"Number"},//科小认定时间
zjtxTime:{key:"Number"},//专精特新认定时间
xjrTime:{key:"Number"},//小巨人认定时间
xjrPyTime:{key:"Number"},//小巨人培育认定时间
goPublicTime:{key:"Number"},//上市时间
goPublicSector:{key:"[Number]"},//上市板块
}
export const EnterpriseAwardUpdateConfig = {
awardName:{key:"String"},//奖项名称
awardingUnit:{key:"String"},//颁奖单位
awardTime:{key:"Number"},//获奖日期
awardLevel:{key:"Number"},//奖项等级
awardImg:{key:"[String]"}//关联图片
}
export const EnterpriseTeamUpdateConfig = {
name:{key:"String"},//姓名
sex:{key:"Number"},//性别
birth:{key:"Number"},//出生年月
degree:{key:"Number"},//最高学历
graduationSchool:{key:"String"},//毕业学校
talentType:{key:"Number"},//人才类型
des:{key:"String"},//履历描述
}
export const EnterpriseCanBaoUpdateConfig = {
annual:{key:"Number"},//所属年报
zhuanKe:{key:"Number"},//专科
benKe:{key:"Number"},//本科
yanJiuSheng:{key:"Number"},//研究生
boShi:{key:"Number"},//博士
qiTa:{key:"Number"},//其他
}
export const EnterpriseFinancingUpdateConfig = {
financingAmount:{key:"Number"},//融资金额(万元)
financingRounds:{key:"Number"},//融资轮次【枚举】
fuHuaQiInvestment:{key:"Number"},//孵化器是否参与投资【枚举】
fuHuaQiInvestmentStyle:{key:"String"},//孵化器投资方式
fuHuaQiInvestmentAmount:{key:"Number"},//孵化器投资金额
investmentDate:{key:"Number"},//获得投资时间
investmentInstitutionsName:{key:"String"},//投资机构名称
valuation:{key:"String"},//估值
}
export const EnterpriseServiceUpdateConfig = {
needCategory:{key:"Number"},//需求类别
needContent:{key:"String"},//需求内容
}
/**
* 请求数据中心类型
*/
export enum OPERATIONALDATATYPE {
增加='/yuyi/dataserver/mysql/table/add',
修改='/yuyi/dataserver/mysql/table/update',
删除='/yuyi/dataserver/mysql/table/delete',
查询单个='/yuyi/dataserver/mysql/table/find/one',
查询多个='/yuyi/dataserver/mysql/table/find/many',
分页查询='/yuyi/dataserver/mysql/table/find/manytopage',
查询数据量='/yuyi/dataserver/mysql/table/find/count',
多表联查='/yuyi/dataserver/mysql/table/find/aggragate',
多表分页='/yuyi/dataserver/mysql/table/find/aggragatetopage',
多表单个='/yuyi/dataserver/mysql/table/find/aggragateone'
}
/**
* 表名
*/
export enum TABLENAME {
企业孵化信息='enterprise_fuhua',
租赁信息='enterprise_lease',
企业用户表='enterprise_user',
企业融资='enterprise_financing',
企业荣誉='enterprise_honor',
企业经营信息='enterprise_manage',
企业资质 ='enterprise_qualification',
参保记录 ='enterprise_canbao',
创业团队 ='enterprise_team',
知识产权 ='enterprise_ipr',
法人信息表 ='enterprise_legal_person',
企业专利表 ='enterprise_patent',
园区通知表 ='garden_notice',
园区活动表 ='garden_activity',
企业服务表 ='enterprise_service',
企业基础信息表 ='enterprise',
政策表 = 'policy'
}
export enum TABLEID {
企业孵化信息='fh',
租赁信息='le',
企业用户表='ur',
企业融资='fi',
企业荣誉='ho',
企业经营信息='ma',
企业资质 ='qu',
参保记录 ='cb',
创业团队 ='te',
知识产权 ='ipr',
法人信息表 ='ps',
企业专利表 ='pe',
园区通知表 ='nt',
园区活动表 ='ac',
企业服务表 ='es',
企业基础信息表 ='e',
图片存储='img',
}
\ No newline at end of file
/**
* 行业领域
*/
export enum INDUSTRY{
集成电路 = 1,
生物医药,
人工智能及智能制造,
航空航天,
汽车产业,
软件和信息服务业,
低碳环保及新材料,
综合,
文化创意
}
/**
* 最高学历
*/
export enum DEGREE {
专科 = 1,
本科,
硕士,
博士
}
/**
* 政治面貌
*/
export enum ZZMM {
中共党员 = 1,
共青团员,
民主党派成员,
无党派人士,
群众,
预备党员,
正式党员,
党员发展对象,
入党积极分子,
少先队员,
其他
}
/**
* 孵化状态
*/
export enum FUHUASTATE {
实体孵化 = 2,
虚拟孵化 = 3,
迁出= 4
}
/**
* 上市情况
*/
export enum LISTINGSITUATION {
A = 1,
科创板,
海外,
}
/**
* 奖项等级
*/
export enum AWARDLEVEL {
国家级 = 1,
省级,
市级,
区级,
街道办,
其他
}
/**
* 性别
*/
export enum SEX {
= 1,
}
/**
* 创始团队
*/
export enum ENTERPRISETEAM {
国际一流人才=2,
国内一流人才
}
//企业服务受理
export enum FOLLOWUPSTATUS {
未受理 = 1,
受理中,
已完成
}
/**
* 服务类别
*/
export enum NEEDCATEGORY {
物业服务 = 1,
贷款服务,
法律服务,
知识产权,
工商服务,
融资服务
}
/**
* 孵化器投资方式
*/
export enum FUHUAQILNVESTMENTSTYLE {
自有资金 = 1,
自有基金,
参与基金
}
/**
* 融资轮次
*/
export enum FINANCINGROUNDS {
种子轮 = 1,
天使投资,
A,
B,
C,
C轮以上,
}
export enum ERRORENUM {
未找到数据,
参数错误,
身份验证失败,
非法登录,
身份验证过期,
code无效,
频繁操作请稍后再试,
高风险等级用户,
系统繁忙,//===系统code除外
该方法仅可进行查询操作,
数据操作失败,
该方法仅可进行数据操作,
数据查询失败,
分页请设置当前页数,
该方法仅可进行联合查询操作,
数据联合查询失败,
参数校验失败,
数据无更新,
当前数据不存在,
地址数据不完整,
只能上传pngjpg图片,
文件上传失败,
账号或密码错误,
不可重复添加同一年度数据,
数据不存在,
不可重复提交
}
export enum ERRORCODEENUM {
身份验证失败 = 401,
非法登录 = 402,
身份验证过期 = 403,
code无效 = 40029,
频繁操作请稍后再试 = 45011,
高风险等级用户 = 40226,
系统繁忙 = 40227
}
let bizErrorMsgMap = {};
for (let key in ERRORENUM) {
bizErrorMsgMap[ERRORENUM[key]] = key;
}
export function getBizMsg(param) {
return bizErrorMsgMap[param];
}
\ No newline at end of file
const path = require('path');
import * as fs from "fs";
import { BizError } from "../util/bizError";
import { analysisXml } from "../util/myXML";
import { ServerConfig } from "../config/systemClass";
const os = require('os');
export let systemConfig = new ServerConfig;
const ConfigName = "serverConfig.xml";
export async function initConfig() {
try {
let buff = fs.readFileSync(path.join(__dirname.substring(0,__dirname.indexOf("out")), ConfigName));
let configStr = buff.toString();
let configInfo:any = await analysisXml(configStr);
if (!configInfo || !configInfo.config) throw new BizError('xml中无配置');
else {
let {port, sign, dbServer } = configInfo.config;
systemConfig.port = parseInt(port[0]);
systemConfig.dbSign = sign[0]
systemConfig.dbPath = dbServer[0]
}
console.log("config init success");
} catch(err) {
console.log('ERROR => 服务器配置解析错误 请检查根目录下 serverConfig.xml 文件是否正确');
console.log(err);
throw new BizError("服务器配置解析错误 请检查根目录下 serverConfig.xml 文件是否正确");
}
}
function analysisMongoConnectStr(path, port, dataBase, w, timeOutMs) {
return `mongodb://${path}:${port}/${dataBase}?w=${w}&wtimeoutMS=${timeOutMs}`
}
\ No newline at end of file
/**
* 拆分返回结果配置 【小程序端】
* 使用场景:逻辑层中需要返回数据给客户端的地方
* 限制:使用端不同不能共用一份配置
*/
import * as enumConfig from "../enum/enum"
export const EnterpriseBaseResConfig = {
uscc:{key:"统一信用代码"},
enterpriseName:{key:"企业名称"},
logonTime:{key:"注册日期"},
logonAddress:{key:"注册地址", isAdd:true},
operatingAddress:{key:"经营地址"},
oldLogonAddress:{key:"迁入前注册地址", isAdd:true},
zhuCeHao:{key:"注册号"},
zuZhiJiGouDaiMa:{key:"组织机构代码"},
dengJiJiGuan:{key:"登记机关"},
}
export const EnterpriseInfomationResConfig = {
tongXinDiZhi:{key:"通信地址", },
industry:{key:"领域"},
mail:{key:"邮箱"},
liaison:{key:"联系人"},
liaisonPhone:{key:"联系电话"},
gengDuoDianHua:{key:"更多电话"},
jianJie:{key:"简介"},
mainBusiness:{key:"主营业务"}
}
export const EnterpriseFaRenInfoResConfig = {
name:{key:"姓名"},
idCard:{key:"身份证"},
domicile:{key:"户籍"},
degree:{key:"学历"},
politicalStatus:{key:"政治面貌"},
phone:{key:"手机号码"},
}
export const EnterpriseLeaseInfoResConfig = {
area:{key:"租赁面积"},
unitPrice:{key:"出租单价"},
roomNumber:{key:"室号"},
rent:{key:"每月租金"}
}
export const EnterpriseQualificationInfoResConfig = {
kxTime:{key:"科小认定时间"},
zjtxTime:{key:"专精特新认定时间"},
xjrTime:{key:"小巨人认定时间"},
xjrPyTime:{key:"小巨人培育认定时间"},
goPublicTime:{key:"上市时间"},
goPublicSector:{key:"上市板块"},
}
/**
* 系统配置类
*
*/
export class ServerConfig {
/**系统配置 */
port:number;
dbSign:String;
dbPath:String;
}
\ No newline at end of file
import { OPERATIONALDATATYPE } from "../config/enum/dbEnum";
import { ERRORENUM } from "../config/enum/errorEnum";
import { systemConfig } from "../config/serverConfig";
import { BizError } from "../util/bizError";
import { post } from "../util/request";
/**
* 操作数据库 新增 修改 删除
* @param url url地址 根据枚举获取值
* @param tableName 表名
* @param data 数据
* @param param 条件
*/
export async function operationalData(url:string, tableName:string, data, param) {
let header = {table:tableName, sign:systemConfig.dbSign};
let queray:any = {};
if (url == OPERATIONALDATATYPE.增加) {
queray.data = data;
} else if (url == OPERATIONALDATATYPE.修改) {
queray.data = data;
queray.param = param;
} else if (url == OPERATIONALDATATYPE.删除) {
queray.param = param;
} else {
throw new BizError(ERRORENUM.该方法仅可进行数据操作, '使用操作数据库的方法进行查询调用');
}
let result:any = await post(`${systemConfig.dbPath}${url}`, queray, header );
if (result.code != 200) throw new BizError(ERRORENUM.数据操作失败, result.code);
if (!result.data || !result.data.isSuccess) throw new BizError(ERRORENUM.数据操作失败, JSON.stringify(result.data));
return true;
}
/**
* 查询
* @param url url地址 根据枚举获取值
* @param tableName 表名
* @param param 条件
* @param pageNumber 分页传入的页数 非分页可不传
* @param pageSize 分页传入的单页大小 非分页可不传
*/
export async function selectData(url, tableName, param, column, pageNumber?, pageSize?) {
if (url != OPERATIONALDATATYPE.查询单个 && url != OPERATIONALDATATYPE.查询多个 && url != OPERATIONALDATATYPE.查询数据量 && url != OPERATIONALDATATYPE.分页查询) {
throw new BizError(ERRORENUM.该方法仅可进行查询操作, '该方法仅可进行查询操作');
}
let header = {table:tableName, sign:systemConfig.dbSign};
let queray:any = {param};
if (column && column.length) {
queray.column = column;
}
if (url == OPERATIONALDATATYPE.分页查询) {
if (!pageNumber) throw new BizError(ERRORENUM.分页请设置当前页数, `pageNumber:${pageNumber};pageSize:${pageSize}`);
queray.pageNumber = pageNumber;
queray.pageSize = pageSize || 10;
}
let result:any = await post(`${systemConfig.dbPath}${url}`, queray, header );
if (result.code != 200) throw new BizError(ERRORENUM.数据查询失败, result.code);
if (!result.data || result.data.data == null || result.data.data == undefined) throw new BizError(ERRORENUM.数据查询失败, JSON.stringify(result.data));
return result.data.data;
}
/**
* 多表联查
* @param url
* @param tableName
* @param param
* @param column
* @param includeConf
* @param pageNumber
* @param pageSize
* @returns
*/
export async function selectManyTableData(url, tableName, param, column, includeConf, pageNumber?, pageSize?) {
if (url != OPERATIONALDATATYPE.多表联查 && url != OPERATIONALDATATYPE.多表分页 && url != OPERATIONALDATATYPE.多表单个) {
throw new BizError(ERRORENUM.该方法仅可进行联合查询操作, '该方法仅可进行联合查询操作');
}
let header = {table:tableName, sign:systemConfig.dbSign};
let queray:any = {param, includeConf};
if (column && column.length) {
queray.column = column;
}
if (url == OPERATIONALDATATYPE.多表分页) {
if (!pageNumber) throw new BizError(ERRORENUM.分页请设置当前页数, `pageNumber:${pageNumber};pageSize:${pageSize}`);
queray.pageNumber = pageNumber;
queray.pageSize = pageSize || 10;
}
let result:any = await post(`${systemConfig.dbPath}${url}`, queray, header );
if (result.code != 200) throw new BizError(ERRORENUM.数据联合查询失败, result.code);
if (!result.data || !result.data.data) throw new BizError(ERRORENUM.数据联合查询失败, JSON.stringify(result.data));
return result.data.data;
}
\ No newline at end of file
import { initConfig, systemConfig } from "./config/serverConfig";
import { httpServer } from "./net/http_server";
async function lanuch() {
await initConfig();
httpServer.createServer(systemConfig.port);
console.log('This indicates that the server is started successfully.');
}
lanuch();
\ No newline at end of file
import { ERRORENUM } from "../config/enum/errorEnum";
import { BizError } from "../util/bizError";
var formidable = require("formidable");
const path = require('path');
export async function parseFormParam(req, res, next) {
var form = new formidable.IncomingForm();
form.uploadDir = path.join(__dirname.substring(0,__dirname.indexOf("out")), 'files');
form.parse(req, (err, fields, files)=>{
if (err) {
next(err)
}
else {
req.fields = fields;
req.files = files;
if (!files.file) {
return next(new BizError(ERRORENUM.文件上传失败) )
}
if ( files.file.type == 'image/png') {
req.fileType = '.png';
next();
} else if (files.file.type == 'image/jpg' || files.file.type == 'image/jpeg') {
req.fileType = '.jpg';
next();
} else {
return next(new BizError(ERRORENUM.只能上传pngjpg图片) )
}
}
})
}
import { bizlive } from "tencentcloud-sdk-nodejs";
import { ERRORCODEENUM } from "../config/enum/errorEnum";
/**
* 中间件 错误返回
* @param err
* @param req
* @param res
* @param next
*/
export function httpErrorHandler(err, req, res, next) {
// console.log("in httpErrorHandler");
console.log(err);
//todo 自定义错误编码
if (err) {
if ( ERRORCODEENUM[err.message] ) {
res.success({success:false, msg:err.message, code:ERRORCODEENUM[err.message]});
next();
}
else {
console.log(req.ip, err.message);
res.send({success:false, msg:err.message, code:500});
// res.success({success:false, msg:err.message, code:500});
next();
}
}
}
\ No newline at end of file
import { OPERATIONALDATATYPE, TABLENAME } from "../config/enum/dbEnum";
import { ERRORENUM } from "../config/enum/errorEnum";
import { operationalData, selectData } from "../data/operationalData";
import { BizError } from "../util/bizError";
/**
* 小程序中间件
* @param req
* @param res
* @param next
* @returns
*/
export async function checkUser(req, res, next) {
if (!req.headers) req.headers = {};
const reqToken = req.headers.token;
const userId = req.headers.userid || "";
if (!userId) return next(new BizError(ERRORENUM.身份验证失败, `userId:${userId} token:${reqToken}`));
let userInfo:any = await selectData(OPERATIONALDATATYPE.查询单个, TABLENAME.企业用户表, {uId:userId}, ["token", "uId", "eId"]);
if (!userInfo || !userInfo.uId) return next(new BizError(ERRORENUM.非法登录, `userId:${userId} token:${reqToken}`));
if (userInfo.token != reqToken ) return next(new BizError(ERRORENUM.身份验证过期, `userId:${userId} token:${reqToken}`));
req.headers.uscc = req.headers.userid;
req.userInfo = {
uId:userInfo.uId,
eId:userInfo.eId
}
next();
}
/**
* 中间件 数据维护接口
* @param req
* @param res
* @param next
* @returns
*/
export async function checkInterior(req, res, next) {
if (!req.headers) req.headers = {};
const Sign = req.headers.sign;
let sysSign = 'sadfjslakdfjlksadjffujisdaiofjsajl09092302'
if (!Sign || Sign != sysSign) return next(new BizError(ERRORENUM.非法登录, `内部接口非法调用 ${Sign}`));
next();
}
\ No newline at end of file
export function watch(req, res, next) {
res.success = success.bind({res:res, req:req});
return next();
}
/**
* 中间件正确返回方法
* @param data
*/
function success(data) {
let resultPack;
if (data ) {
if ( data.success === undefined || data.success === true ) {
resultPack = {data, success:true, code:200};
}
else {
resultPack = data;
}
}else {
resultPack = {code:500, success:false, msg:'result is null'};
}
this.res.send(resultPack);
}
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
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