Commit 72646b39 by chenjinjing

2025.02.20部署

parent 2ab94404
This source diff could not be displayed because it is too large. You can view the blob instead.
<config>
<port>40031</port>
<sign>xxx90909082fsdahfjosadjfpoiwausjorip2hjklrhn1ioud0u124rx0qwejfokasjfolksaujfoas</sign>
<dbServer>http://192.168.0.71:40031</dbServer>
<port>13275</port>
<sign></sign>
<dbServer>http://127.0.0.1:13275</dbServer>
<mysqldb>
<!-- 本地mysql配置 -->
<mysqlHost>192.168.0.71</mysqlHost>
......@@ -11,9 +11,9 @@
<dataBase>px_answer</dataBase>
<!-- 服务器mysql配置 -->
<!-- <mysqlHost>127.0.0.1</mysqlHost>
<mysqlPort>3306</mysqlPort>
<mysqlPort>13306</mysqlPort>
<mysqlUser>root</mysqlUser>
<mysqlPwd>Yfs123456_</mysqlPwd>
<dataBase>yfs</dataBase> -->
<mysqlPwd>root</mysqlPwd>
<dataBase>px_answer</dataBase> -->
</mysqldb>
</config>
import moment from "moment";
import { TABLENAME } from "../config/dbEnum";
import { selectDataCountByParam, selectDataListByParam, selectDataListToPageByParam, selectOneDataByParam } from "../data/findData";
import { CHAPTER, HLDTYPE, QUESTION, TESTTYPE } from "../config/enum";
import { changeEnumValue } from "../tools/eccEnum";
import { BizError } from "../util/bizError";
import { ERRORENUM } from "../config/errorEnum";
/**
* 登录
* @param username
* @param password
*/
export async function login(username, password) {
let findUserData = await selectOneDataByParam(TABLENAME.超级管理员表, {username, password}, []);
let findUser = findUserData.data;
if (!findUser || !findUser.username) throw new BizError(ERRORENUM.账号或密码错误);
if (findUser.password != password ) throw new BizError(ERRORENUM.账号或密码错误);
let dataInfo = {
username: findUser.username,
realName: findUser.real_name,
phone: findUser.phone,
sex: findUser.sex,
mail: findUser.mail,
remark: findUser.remark
};
return dataInfo;
}
/**
* 获取用户列表
* @param card
* @param createStartTime
* @param createEndTime
* @param area
* @param current
* @returns
*/
export async function getUserList(card, createStartTime, createEndTime, area, current) {
let selectParam = {"name":{"%ne%":"362527199309194932"}, "phone":{"%ne%":"17255558888"}};
if (card) selectParam["card"] = card;
if (createStartTime && createEndTime) selectParam["create_time"] = {"%between%":[createStartTime, createEndTime]};
if (area) selectParam["area"] = area;
let findData = await selectDataListToPageByParam(TABLENAME.测试信息表, selectParam, ["infoid", "name", "card", "phone", "email", "area", "create_time", "test_type"], current, 10);
let dataCount = await selectDataCountByParam(TABLENAME.测试信息表, selectParam);
let dataList = [];
findData.data.forEach( info => {
let {infoid, name, card, phone, email, area, create_time, test_type} = info;
dataList.push({
infoid, name, card, phone, email, area,
createTime: moment(create_time).format("YYYY-MM-DD"),
testType: test_type
})
})
return {dataList, dataCount:dataCount.data};
}
/**
* 查看列表详情
* @param infoid
* @param test_type
* @returns
*/
export async function getUserInfoById(infoid, test_type) {
let testReport = {};
if (test_type == TESTTYPE.创业) {
testReport = await getChuangYe(infoid);
} else if (test_type == TESTTYPE.霍兰德) {
testReport = await getHuoLanDe(infoid);
}
return testReport;
}
/**
* 创业答题详情
* @param infoid
* @returns
*/
async function getChuangYe(infoid) {
let findUserData = await selectOneDataByParam(TABLENAME.测试信息表, {infoid}, []);
let findData = await selectDataListByParam(TABLENAME.测试信息记录表, {infoid}, []);
let optionsInfo = [];
let score = 0;
for (let data = 0; data < findData.data.length; data++) {
let info = findData.data[data];
let {chapter, title_str, option_str} = info;
// optionsInfo[chapter] = {};
let title = JSON.parse(title_str);
let option = JSON.parse(option_str);
for (let i = 0; i < option.length; i++) {
let optionList = option[i];
let optionName = "";
for (let o = 0; o < optionList.length; o++) {
let findOption = await selectOneDataByParam(TABLENAME.题目选项表, {oid:optionList[o]}, []);
score += findOption.data["points"];
optionName = findOption.data["option_name"].slice(2);
}
optionsInfo.push({title:title[i], option:optionName});
}
}
let testReport = {
name:findUserData.data.name,
card:findUserData.data.card,
phone:findUserData.data.phone,
score,
time: moment(new Date()).format("YYYY年MM月DD日HH时mm分"),
report:optionsInfo,
};
return testReport;
}
/**
* 霍兰德详情
* @param infoid
* @returns
*/
async function getHuoLanDe(infoid) {
let findUserData = await selectOneDataByParam(TABLENAME.测试信息表, {infoid}, []);
let findData = await selectDataListByParam(TABLENAME.测试信息记录表, {infoid}, []);
let optionsInfo = {};
for (let data = 0; data < findData.data.length; data++) {
let info = findData.data[data];
let {chapter, title_str, option_str} = info;
optionsInfo[chapter] = {};
let title = JSON.parse(title_str);
let option = JSON.parse(option_str);
for (let i = 0; i < option.length; i++) {
let optionList = option[i];
let score = 0;
for (let o = 0; o < optionList.length; o++) {
let findOption = await selectOneDataByParam(TABLENAME.题目选项表, {oid:optionList[o]}, []);
score += findOption.data["points"];
}
optionsInfo[chapter][title[i]] = score;
}
}
let optionData = [];
let countInfo = {};
for (let key in optionsInfo) {
let maxKey = "";
let maxValue = 0;
for (let values in optionsInfo[key]) {
const value = optionsInfo[key][values];
if (value > maxValue) {
maxKey = values;
maxValue = value;
}
if(!countInfo[values]) countInfo[values] = 0
countInfo[values] += value;
}
let title = changeEnumValue(CHAPTER, parseInt(key));
let maxNum = HLDTYPE[maxKey];
optionData.push({key:title, value:maxKey, index:maxNum});
}
let countData = [];
for (let key in countInfo) {
let keyNum = HLDTYPE[key];
let keyName = changeEnumValue(QUESTION, keyNum);
countData.push({key:keyName, value:countInfo[key]});
}
let sortedEntries:any = Object.entries(countInfo);
sortedEntries.sort((a, b) => b[1] - a[1]);
let topThreeKeys = sortedEntries.slice(0, 3).map(entry => entry[0]);
let topThreeStr = topThreeKeys.join("");
let findCareer = await selectOneDataByParam(TABLENAME.职业对照表, {statistics:topThreeStr}, []);
let testReport = {
name:findUserData.data.name,
card:findUserData.data.card,
phone:findUserData.data.phone,
time: moment(new Date()).format("YYYY年MM月DD日HH时mm分"),
report1:optionData,
report2:countData,
statistics:topThreeStr,
recommend:findCareer.data.recommend
}
return testReport;
}
/**
* 数据导出
* @param card
* @param createStartTime
* @param createEndTime
* @param area
* @param current
* @returns
*/
export async function outPutData(card, createStartTime, createEndTime, area) {
let selectParam = {"name":{"%ne%":"362527199309194932"}, "phone":{"%ne%":"17255558888"}};
// let selectParam = {};
if (card) selectParam["card"] = card;
if (createStartTime && createEndTime) selectParam["create_time"] = {"%between%":[createStartTime, createEndTime]};
if (area) selectParam["area"] = area;
let findData = await selectDataListByParam(TABLENAME.测试信息表, selectParam, ["infoid", "name", "card", "phone", "email", "area", "create_time", "test_type"]);
let dataTitle = ["姓名", "身份证号", "联系方式", "电子邮箱", "所属区域", "测试日期", "测评类型"];
let dataList = [dataTitle];
findData.data.forEach( info => {
let {name, card, phone, email, area, create_time, test_type} = info;
let createTime = moment(create_time).format("YYYY-MM-DD");
let testType = changeEnumValue(TESTTYPE, test_type);
let subList = [
name || "",
card || "",
phone || "",
email || "",
area || "",
createTime || "",
testType || ""
];
dataList.push(subList);
})
return dataList;
}
......@@ -24,6 +24,10 @@ export enum TABLENAME {
题目表 = 'question',
题目选项表 = 'option',
测试信息表 = 'testinfo',
测试信息记录表 = 'inforecord',
演示版测试信息记录表 = 'inforecord_test',
职业对照表 = 'career_contrast',
超级管理员表 = 'sys_user',
}
......
......@@ -18,18 +18,34 @@ export enum FILETYPE {
}
export enum TESTTYPE {
"霍兰德" = 1,
"创业" = 2,
}
/**
* 题目大标题
*/
export enum TESTTYPE {
"一、我感兴趣的活动" = 1,
"二、我能完成的活动" = 2,
"三、我喜欢的职业" = 3,
"四、我的能力类型简评A" = 4,
"四、我的能力类型简评B" = 5,
export enum CHAPTER {
"一、我感兴趣的活动(多选)" = 1,
"二、我能完成的活动(多选)" = 2,
"三、我喜欢的职业(多选)" = 3,
"四、我的能力类型简评A(单选)" = 4,
"四、我的能力类型简评B(单选)" = 5,
"技能" = 6,
"经验" = 7,
"您开办的新创业组织" = 8,
"创办企业" = 9,
"符合你的特点" = 10
}
/**
* 题型
*/
......@@ -43,5 +59,66 @@ export enum QUESTIONTITLE {
}
// "R:实际型活动" = 1,
// "S:社会型活动" = 2,
// "I:研究型活动" = 3,
// "E:事业型活动" = 4,
// "A:艺术型活动" = 5,
// "C:常规型(传统型)活动" = 6,
// "R:实际型活动" = 7,
// "S:社会型活动" = 8,
// "I:研究型活动" = 9,
// "E:事业型活动" = 10,
// "A:艺术型活动" = 11,
// "C:常规型(传统型)活动" = 12,
// "R:实际型活动" = 13,
// "S:社会型活动" = 14,
// "I:研究型活动" = 15,
// "E:事业型活动" = 16,
// "A:艺术型活动" = 17,
// "C:常规型(传统型)活动" = 18,
// "R型:机械操作能力" = 19,
// "I型:科学研究能力" = 20,
// "A型:艺术创作能力" = 21,
// "S型:解释表达能力" = 22,
// "E型:商业洽谈能力" = 23,
// "C型:事务执行能力" = 24,
// "R型:体育技能" = 25,
// "I型:数学技能" = 26,
// "A型:音乐技能" = 27,
// "S型:交际技能" = 28,
// "E型:领导技能" = 29,
// "C型:办公技能" = 30,
/**
* 题型简称
*/
export enum HLDTYPE {
"R" = 1,
"S" = 2,
"I" = 3,
"E" = 4,
"A" = 5,
"C" = 6
}
/**
* 返回给前端题型
*/
export enum QUESTION {
"R型实际型" = 1,
"S型社会型" = 2,
"I型研究型" = 3,
"E型事业型" = 4,
"A型艺术型" = 5,
"C型常规型" = 6,
}
......@@ -16,7 +16,9 @@ export enum ERRORENUM {
数据联合查询失败,
INVALID_REQUEST,
INTERNAL_SERVER_ERROR,
文件不存在
文件不存在,
该身份证号码重复,
账号或密码错误
}
/**
......
......@@ -16,8 +16,7 @@ export async function initConfig() {
let {port, sign, dbServer, mysqldb } = configInfo.config;
systemConfig.port = parseInt(port[0]);
systemConfig.sign = sign[0];
systemConfig.sign = sign[0]
systemConfig.dbPath = dbServer[0]
......
......@@ -7,7 +7,7 @@ export class ServerConfig {
/**系统配置 */
port:number;
sign:string;
dbPath:String;
dbPath:string;
mysqldb:{
host:string,
......
......@@ -6,7 +6,8 @@ import { mysqlModelMap } from "../model/sqlModelBind";
* @param data
* @returns
*/
export async function addData(tableModel, data:any) {
export async function addData(tableName:string, data:any) {
let tableModel = mysqlModelMap[tableName];
let dataArray = [];
if (!Array.isArray(data)) {
dataArray.push(data);
......
......@@ -23,6 +23,7 @@ function analysisParamToWhere(param, column) {
let where = {};
let order = [];
let group = "";
let literal = "";
let limit = 0;
for (let key in param) {
if (typeof param[key] == "object") {
......@@ -56,6 +57,12 @@ function analysisParamToWhere(param, column) {
case "%notIn%":
where[key][Op.notIn] = param[key]["%notIn%"];
break;
case "%ne%":
where[key][Op.ne] = param[key]["%ne%"];
break;
case "%regexp%":
where[key][Op.regexp] = param[key]["%regexp%"];
break;
}
}
} else {
......@@ -72,6 +79,9 @@ function analysisParamToWhere(param, column) {
case "%group%":
group = param[key];
break;
case "%literal%":
literal = param["%literal%"];
break;
default: where[key] = param[key];
}
}
......@@ -82,6 +92,7 @@ function analysisParamToWhere(param, column) {
if (order && order.length) selectParam.order = order;
if (limit) selectParam.limit = limit;
if (group) selectParam.group = group;
if (literal) selectParam.where = Sequelize.literal(literal);
return selectParam;
}
......@@ -91,7 +102,8 @@ function analysisParamToWhere(param, column) {
* @param param
* @returns
*/
export async function selectOneDataByParam(tableModel, param, column) {
export async function selectOneDataByParam(tableName, param, column) {
let tableModel = mysqlModelMap[tableName];
let selectParam = analysisParamToWhere(param, column);
let data = await tableModel.findOne(selectParam);
data = data || {};
......@@ -105,7 +117,8 @@ export async function selectOneDataByParam(tableModel, param, column) {
* @param param
* @returns
*/
export async function selectDataListByParam(tableModel, param, column) {
export async function selectDataListByParam(tableName, param, column) {
let tableModel = mysqlModelMap[tableName];
let selectParam = analysisParamToWhere(param, column);
let data = await tableModel.findAll(selectParam);
return { data };
......@@ -120,7 +133,8 @@ export async function selectDataListByParam(tableModel, param, column) {
* @param pageSize
* @returns
*/
export async function selectDataListToPageByParam(tableModel, param, column, pageNumber: number, pageSize: number) {
export async function selectDataListToPageByParam(tableName, param, column, pageNumber: number, pageSize: number) {
let tableModel = mysqlModelMap[tableName];
let selectParam: any = analysisParamToWhere(param, column);
selectParam.limit = pageSize || 10;
selectParam.offset = (pageNumber - 1) * 10;
......@@ -128,7 +142,8 @@ export async function selectDataListToPageByParam(tableModel, param, column, pag
return { data };
}
export async function selectDataCountByParam(tableModel, param) {
export async function selectDataCountByParam(tableName, param) {
let tableModel = mysqlModelMap[tableName];
let selectParam: any = analysisParamToWhere(param, []);
let data = await tableModel.count(selectParam);
return { data };
......@@ -162,7 +177,8 @@ export async function associationSelect(tableName: string, param) {
* @returns
*/
// question
export async function selectDataToTableAssociation(tableModel, includeConf, param, column) {
export async function selectDataToTableAssociation(tableName, includeConf, param, column) {
let tableModel = mysqlModelMap[tableName];
let include = [];
for (let tableName in includeConf) {
if (!mysqlModelMap[tableName]) throw new BizError(ERRORENUM.不存在表, `尝试进行多表联查,但是不存在${tableName}`);
......@@ -171,7 +187,6 @@ export async function selectDataToTableAssociation(tableModel, includeConf, para
includeInfomation.model = mysqlModelMap[tableName];
include.push(includeInfomation);
}
let selectParam: any = analysisParamToWhere(param, column);
selectParam.include = include;
......@@ -189,7 +204,8 @@ export async function selectDataToTableAssociation(tableModel, includeConf, para
* @param column
* @returns
*/
export async function selectDataToTableAssociationToPage(tableModel, includeConf, param, column, pageNumber: number, pageSize: number) {
export async function selectDataToTableAssociationToPage(tableName, includeConf, param, column, pageNumber: number, pageSize: number) {
let tableModel = mysqlModelMap[tableName];
let include = [];
for (let tableName in includeConf) {
if (!mysqlModelMap[tableName]) throw new BizError(ERRORENUM.不存在表, `尝试进行多表联查,但是不存在${tableName}`);
......@@ -217,7 +233,8 @@ export async function selectDataToTableAssociationToPage(tableModel, includeConf
* @param column
* @returns
*/
export async function selectOneDataToTableAssociation(tableModel, includeConf, param, column) {
export async function selectOneDataToTableAssociation(tableName, includeConf, param, column) {
let tableModel = mysqlModelMap[tableName];
let include = [];
for (let tableName in includeConf) {
if (!mysqlModelMap[tableName]) throw new BizError(ERRORENUM.不存在表, `尝试进行多表联查,但是不存在${tableName}`);
......
import { Op, Sequelize } from "sequelize";
import { mysqlModelMap } from "../model/sqlModelBind";
/**
......@@ -77,7 +78,8 @@ function analysisParamToWhere(param) {
}
export async function updateManyData(tableModel, param:object, data:object) {
export async function updateManyData(tableName, param:object, data:object) {
let tableModel = mysqlModelMap[tableName];
let where = analysisParamToWhere(param);
await tableModel.update(data, where);
......
......@@ -18,7 +18,6 @@ async function lanuch() {
/**创建http服务 */
httpServer.createServer(systemConfig.port);
// await smsTask();
console.log('This indicates that the server is started successfully.');
}
......
import asyncHandler from 'express-async-handler';
import * as adminBiz from '../biz/admin';
// 霍兰德测试接口
export function setRouter(httpServer){
httpServer.post('/admin/login', asyncHandler(login));
httpServer.post('/admin/userlist', asyncHandler(getUserList));
httpServer.post('/admin/details', asyncHandler(getUserInfoById));
httpServer.post('/admin/output', asyncHandler(outPutData));
};
async function login(req, res) {
let {username, password} = req.body;
let result = await adminBiz.login(username, password);
res.success(result);
}
async function getUserList(req, res) {
let {card, createStartTime, createEndTime, area, current} = req.body;
let result = await adminBiz.getUserList(card, createStartTime, createEndTime, area, current);
res.success(result);
}
async function getUserInfoById(req, res) {
let {infoid, testType} = req.body;
let result = await adminBiz.getUserInfoById(infoid, testType);
res.success(result);
}
async function outPutData(req, res) {
let {card, createStartTime, createEndTime, area} = req.body;
let result = await adminBiz.outPutData(card, createStartTime, createEndTime, area);
res.success(result);
}
import * as asyncHandler from 'express-async-handler'
import { checkMySqlSign } from '../middleware/user';
import { eccReqParamater } from '../tools/eccParam';
import { BizError } from '../util/bizError';
import { ERRORENUM } from '../config/errorEnum';
import {calculateHollandScore} from '../biz/huolande';
import * as winston from 'winston';
import { error } from 'console';
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [
new winston.transports.File({ filename: 'error.log', level: 'error' }),
new winston.transports.File({ filename: 'combined.log' })
]
});
import asyncHandler from 'express-async-handler';
import * as huolandeBiz from '../biz/huolande';
// 霍兰德测试接口
export function setRouter(httpServer){
httpServer.post('/question/getarea', asyncHandler(getArea));
httpServer.post('/question/addusers', asyncHandler(addUsers));
httpServer.post('/question/question', asyncHandler(getQuestion));
httpServer.post('/question/addusersinfo', asyncHandler(addUsersInfo));
httpServer.post('/huolande/finalscore', asyncHandler(getFinalScore));
httpServer.post('/chuangye/finalscore', asyncHandler(getChuangYeScore));
};
async function addUsers(req, res) {
let {testType, name, card, phone, email, area} = req.body;
let result = await huolandeBiz.addUsers(testType, name, card, phone, area, email);
res.success(result);
}
httpServer.post('/api/test/submit', async (req, res) => {
try {
const { answers } = req.body; // 假设答案通过请求体传递
// 校验参数
if (!answers || !Array.isArray(answers)) {
return res.status(400).send({ error: '无效的答案格式' });
// throw new BizError(ERRORENUM.INVALID_REQUEST, '无效的答案格式');
}
// 计算霍兰德测试分数并获取最高三个字母
const result = calculateHollandScore(answers);
// 返回结果给客户端
return res.status(200).json({
message: '答题成功',
hollandResult: {
topThree: result.topThree,
scores: result.scores
}
});
} catch (error) {
console.error('答题提交失败:', error);
return res.status(500).send({ error: '服务器错误' });
// throw new BizError(ERRORENUM.INTERNAL_SERVER_ERROR, '服务器错误');
}
});
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [
new winston.transports.File({ filename: 'error.log', level: 'error' }),
new winston.transports.File({ filename: 'combined.log' })
]
});
logger.info('答题提交成功');
logger.error('答题提交失败:', { error });
async function getArea(req, res) {
let result = await huolandeBiz.getArea();
res.success(result);
}
// export function setRouter(httpServer){
// }
async function getQuestion(req, res) {
let { testType, chapter, isTest } = req.body;
let result = await huolandeBiz.getQuestion(testType, chapter, isTest);
res.success(result);
}
async function addUsersInfo(req, res) {
let {infoid, chapter, option, testType, isTest} = req.body;
let result = await huolandeBiz.addUsersInfo(infoid, chapter, option, testType, isTest);
res.success(result);
}
async function getFinalScore(req, res) {
let {infoid, isTest} = req.body;
let result = await huolandeBiz.getFinalScore(infoid, isTest);
res.success(result);
}
async function getChuangYeScore(req, res) {
let {infoid, isTest} = req.body;
let result = await huolandeBiz.getChuangYeScore(infoid, isTest);
res.success(result);
}
......@@ -3,7 +3,9 @@
*/
import * as huolandeRouter from './huolande';
import * as adminRouter from './admin';
export function setRouter(httpServer){
huolandeRouter.setRouter(httpServer);
adminRouter.setRouter(httpServer);
}
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