Commit 2ab94404 by zhangzhencai

no message

parent 9590623f
{
}
\ No newline at end of file
{"level":"info","message":"答题提交成功"}
{"level":"error","message":"答题提交失败:"}
{"level":"info","message":"答题提交成功"}
{"level":"error","message":"答题提交失败:"}
{"level":"info","message":"答题提交成功"}
{"level":"error","message":"答题提交失败:"}
{"level":"info","message":"答题提交成功"}
{"level":"error","message":"答题提交失败:"}
{"level":"info","message":"答题提交成功"}
{"level":"error","message":"答题提交失败:"}
{"level":"info","message":"答题提交成功"}
{"level":"error","message":"答题提交失败:"}
{"level":"info","message":"答题提交成功"}
{"level":"error","message":"答题提交失败:"}
{"level":"info","message":"答题提交成功"}
{"level":"error","message":"答题提交失败:"}
{"level":"info","message":"答题提交成功"}
{"level":"error","message":"答题提交失败:"}
{"level":"info","message":"答题提交成功"}
{"level":"error","message":"答题提交失败:"}
{"level":"info","message":"答题提交成功"}
{"level":"error","message":"答题提交失败:"}
{"level":"info","message":"答题提交成功"}
{"level":"error","message":"答题提交失败:"}
{"level":"info","message":"答题提交成功"}
{"level":"error","message":"答题提交失败:"}
{"level":"info","message":"答题提交成功"}
{"level":"error","message":"答题提交失败:"}
{"level":"info","message":"答题提交成功"}
{"level":"error","message":"答题提交失败:"}
{"level":"info","message":"答题提交成功"}
{"level":"error","message":"答题提交失败:"}
{"level":"info","message":"霍兰德测试API初始化完成"}
{"level":"info","message":"霍兰德测试API初始化完成"}
{"level":"info","message":"霍兰德测试API初始化完成"}
{"level":"info","message":"霍兰德测试API初始化完成"}
{"level":"info","message":"答题提交成功"}
{"level":"error","message":"答题提交失败:"}
{"level":"info","message":"答题提交成功"}
{"level":"error","message":"答题提交失败:"}
{"level":"info","message":"答题提交成功"}
{"level":"error","message":"答题提交失败:"}
{"level":"info","message":"答题提交成功"}
{"level":"error","message":"答题提交失败:"}
{"level":"info","message":"答题提交成功"}
{"level":"error","message":"答题提交失败:"}
{"level":"info","message":"答题提交成功"}
{"level":"error","message":"答题提交失败:"}
{"level":"info","message":"答题提交成功"}
{"level":"error","message":"答题提交失败:"}
{"level":"info","message":"答题提交成功"}
{"level":"error","message":"答题提交失败:"}
{"level":"info","message":"答题提交成功"}
{"level":"error","message":"答题提交失败:"}
{"level":"info","message":"答题提交成功"}
{"level":"error","message":"答题提交失败:"}
{"level":"info","message":"答题提交成功"}
{"level":"error","message":"答题提交失败:"}
{"level":"info","message":"答题提交成功"}
{"level":"error","message":"答题提交失败:"}
{"level":"info","message":"答题提交成功"}
{"level":"error","message":"答题提交失败:"}
{"level":"info","message":"答题提交成功"}
{"level":"error","message":"答题提交失败:"}
{"level":"info","message":"答题提交成功"}
{"level":"error","message":"答题提交失败:"}
{"level":"info","message":"答题提交成功"}
{"level":"error","message":"答题提交失败:"}
{"level":"error","message":"答题提交失败:"}
{"level":"error","message":"答题提交失败:"}
{"level":"error","message":"答题提交失败:"}
{"level":"error","message":"答题提交失败:"}
{"level":"error","message":"答题提交失败:"}
{"level":"error","message":"答题提交失败:"}
{"level":"error","message":"答题提交失败:"}
{"level":"error","message":"答题提交失败:"}
{"level":"error","message":"答题提交失败:"}
{"level":"error","message":"答题提交失败:"}
{"level":"error","message":"答题提交失败:"}
{"level":"error","message":"答题提交失败:"}
{"level":"error","message":"答题提交失败:"}
{"level":"error","message":"答题提交失败:"}
{"level":"error","message":"答题提交失败:"}
{"level":"error","message":"答题提交失败:"}
{"level":"error","message":"答题提交失败:"}
{"level":"error","message":"答题提交失败:"}
{"level":"error","message":"答题提交失败:"}
{"level":"error","message":"答题提交失败:"}
{"level":"error","message":"答题提交失败:"}
{"level":"error","message":"答题提交失败:"}
{"level":"error","message":"答题提交失败:"}
{"level":"error","message":"答题提交失败:"}
{"level":"error","message":"答题提交失败:"}
{"level":"error","message":"答题提交失败:"}
{"level":"error","message":"答题提交失败:"}
{"level":"error","message":"答题提交失败:"}
{"level":"error","message":"答题提交失败:"}
{"level":"error","message":"答题提交失败:"}
{"level":"error","message":"答题提交失败:"}
{"level":"error","message":"答题提交失败:"}
...@@ -8,7 +8,8 @@ ...@@ -8,7 +8,8 @@
"@types/node": "^10.12.18", "@types/node": "^10.12.18",
"bson": "^6.1.0", "bson": "^6.1.0",
"compression": "^1.7.4", "compression": "^1.7.4",
"express": "^4.17.1", "connect-history-api-fallback": "^2.0.0",
"express": "^4.21.2",
"express-async-handler": "^1.1.4", "express-async-handler": "^1.1.4",
"express-history-api-fallback": "^2.2.1", "express-history-api-fallback": "^2.2.1",
"formidable": "^1.2.1", "formidable": "^1.2.1",
...@@ -26,10 +27,13 @@ ...@@ -26,10 +27,13 @@
"sequelize": "^6.32.1", "sequelize": "^6.32.1",
"svg-captcha": "^1.3.12", "svg-captcha": "^1.3.12",
"tencentcloud-sdk-nodejs": "^4.0.562", "tencentcloud-sdk-nodejs": "^4.0.562",
"winston": "^3.17.0",
"ws": "^5.2.2", "ws": "^5.2.2",
"xml2js": "^0.4.23" "xml2js": "^0.4.23"
}, },
"devDependencies": {}, "devDependencies": {
"@types/express": "^5.0.0"
},
"scripts": { "scripts": {
"test": "echo \"Error: no test specified\" && exit 1" "test": "echo \"Error: no test specified\" && exit 1"
}, },
......
...@@ -12,24 +12,110 @@ import { eccEnumValue } from "../tools/eccEnum"; ...@@ -12,24 +12,110 @@ import { eccEnumValue } from "../tools/eccEnum";
* 获取题目 * 获取题目
* @param test_type 题目类型:1. 霍兰德 * @param test_type 题目类型:1. 霍兰德
* @param chapter 章节 * @param chapter 章节
* 1.霍兰德(一、我感兴趣的活动)2.霍兰德(二、我能完成的活动)3.霍兰德(三、我喜欢的职业)4.霍兰德(四、我的能力类型简评A)5.霍兰德(四、我的能力类型简评B) * 1.霍兰德(一、我感兴趣的活动)2.霍兰德(二、我能完成的活动)3.霍兰德(三、我喜欢的职业)
* 4.霍兰德(四、我的能力类型简评A)5.霍兰德(四、我的能力类型简评B)
* @returns * @returns
*/ */
export async function getQuestion(test_type, chapter) { export async function getQuestion(test_type, chapter) {
eccEnumValue("获取题目", "test_type", TESTTYPE, test_type); eccEnumValue("获取题目", "test_type", TESTTYPE, test_type);
eccEnumValue("获取题目", "chapter", QUESTIONTITLE, chapter); eccEnumValue("获取题目", "chapter", QUESTIONTITLE, chapter);
let selectParam:any = {is_del:0, test_type:1, chapter:1}; let selectParam:any = {is_del:0, test_type:1, chapter:1};
if (test_type) selectParam.test_type = test_type; if (test_type) selectParam.test_type = test_type;
if (chapter) selectParam.chapter = chapter; if (chapter) selectParam.chapter = chapter;
/** includeConf:关联表配置*/ /** includeConf:关联表配置*/
let includeConf = {}; let includeConf = {};
includeConf[TABLENAME.题目选项表] = {colum:["option_name", "points"], where:{is_del:0} }; // colum:关联表需要查询的字段,where:关联表查询条件 includeConf[TABLENAME.题目选项表] = {colum:["option_name", "points"], where:{is_del:0} }; // colum:关联表需要查询的字段,where:关联表查询条件
/** questionInfo:多表联查*/ /** questionInfo:多表联查*/
let questionInfo = await selectDataToTableAssociation(TABLENAME.题目表, includeConf, selectParam, ["chapter", "title"]); let questionInfo = await selectDataToTableAssociation(TABLENAME.题目表, includeConf, selectParam, ["chapter", "title"]);
// return {};
return questionInfo;
}
/**
* 计算霍兰德职业兴趣测试分数并汇总最高三个字母
* @param answers 用户的答案对象数组
* @returns 包含测试结果的对象
*/
export function calculateHollandScore(answers: any[]): { topThree: string; scores: Record<string, number> } {
//初始化分数统计对象
const scoreCounts = {
R: 0,// Realistic
I: 0, // Investigative
A: 0, // Artistic
S: 0, // Social
E: 0, // Enterprising
C: 0 // Conventional
};
return {}; // 遍历用户答案并累加相应类型的分数
for (const answer of answers) {
const points = answer.points;
switch (answer.title) {
case 'R:实际型活动':
scoreCounts.R += points;
break;
case 'S:社会型活动':
scoreCounts.S += points;
break;
case 'I:研究型活动':
scoreCounts.I += points;
break;
case 'E;事业型活动':
scoreCounts.E += points;
break;
case 'A:艺术型活动':
scoreCounts.A += points;
break;
case 'C:常规型(传统型)活动':
scoreCounts.C += points;
break;
default:
console.warn(`未知的霍兰德类型: ${answer.type}`);
}
}
//计算最高三个字母分数
const scoredArray = Object.entries(scoreCounts).map(([key, value]) => ({ type: key, score: value }));
scoredArray.sort((a, b) => b.score - a.score);
//获取最高三个字母
const topThree = scoredArray.slice(0, 3).map(item => item.type).join('');
//返回结果对象
return {
topThree,
scores: scoreCounts
};
} }
/**
* 统计并汇总最高三个字母
* @param scores 分数统计对象
* @returns 包含统计结果的对象
*/
export function summarizeScores(scores: Record<string, number>): { highestLetter: string; secondHighestLetter: string; thirdHighestLetter: string } {
const scoredArray = Object.entries(scores).map(([key, value]) => ({ type: key, score: value }));
scoredArray.sort((a, b) => b.score - a.score);
//获取最高三个字母
const highestLetter = scoredArray[0].type;
const secondHighestLetter = scoredArray[1]?.type || '';
const thirdHighestLetter = scoredArray[2]?.type || '';
return {
highestLetter,
secondHighestLetter,
thirdHighestLetter
};
}
...@@ -13,7 +13,10 @@ export enum ERRORENUM { ...@@ -13,7 +13,10 @@ export enum ERRORENUM {
分页请设置当前页数, 分页请设置当前页数,
数据查询失败, 数据查询失败,
该方法仅可进行联合查询操作, 该方法仅可进行联合查询操作,
数据联合查询失败 数据联合查询失败,
INVALID_REQUEST,
INTERNAL_SERVER_ERROR,
文件不存在
} }
/** /**
......
...@@ -24,60 +24,60 @@ function analysisParamToWhere(param, column) { ...@@ -24,60 +24,60 @@ function analysisParamToWhere(param, column) {
let order = []; let order = [];
let group = ""; let group = "";
let limit = 0; let limit = 0;
for (let key in param) { for (let key in param) {
if (typeof param[key] == "object") { if (typeof param[key] == "object") {
where[key] = {}; where[key] = {};
for (let whereKey in param[key]){ for (let whereKey in param[key]) {
switch(whereKey) { switch (whereKey) {
case "%like%": case "%like%":
where[key][Op.like] = `%${param[key]["%like%"]}%`; where[key][Op.like] = `%${param[key]["%like%"]}%`;
break; break;
case "%gt%": case "%gt%":
where[key][Op.gt] = param[key]["%gt%"]; where[key][Op.gt] = param[key]["%gt%"];
break; break;
case "%gte%": case "%gte%":
where[key][Op.gte] = param[key]["%gte%"]; where[key][Op.gte] = param[key]["%gte%"];
break; break;
case "%lt%": case "%lt%":
where[key][Op.lt] = param[key]["%lt%"]; where[key][Op.lt] = param[key]["%lt%"];
break; break;
case "%lte%": case "%lte%":
where[key][Op.lte] = param[key]["%lte%"]; where[key][Op.lte] = param[key]["%lte%"];
break; break;
case "%between%": case "%between%":
where[key][Op.between] = param[key]["%between%"]; where[key][Op.between] = param[key]["%between%"];
break; break;
case "%notBetween%": case "%notBetween%":
where[key][Op.notBetween] = param[key]["%notBetween%"]; where[key][Op.notBetween] = param[key]["%notBetween%"];
break; break;
case "%in%": case "%in%":
where[key][Op.in] = param[key]["%in%"]; where[key][Op.in] = param[key]["%in%"];
break; break;
case "%notIn%": case "%notIn%":
where[key][Op.notIn] = param[key]["%notIn%"]; where[key][Op.notIn] = param[key]["%notIn%"];
break; break;
} }
} }
}else { } else {
switch (key) { switch (key) {
case "%orderDesc%": case "%orderDesc%":
order = [[Sequelize.col(param[key]), "DESC"]]; order = [[Sequelize.col(param[key]), "DESC"]];
break; break;
case "%orderAsc%": case "%orderAsc%":
order = [[Sequelize.col(param[key]), "ASC"]]; order = [[Sequelize.col(param[key]), "ASC"]];
break; break;
case "%limit%": case "%limit%":
limit = param[key]; limit = param[key];
break; break;
case "%group%": case "%group%":
group = param[key]; group = param[key];
break; break;
default: where[key] = param[key]; default: where[key] = param[key];
} }
} }
} }
let selectParam:any = {where}; let selectParam: any = { where };
if (column && column.length) selectParam.attributes = column; if (column && column.length) selectParam.attributes = column;
if (order && order.length) selectParam.order = order; if (order && order.length) selectParam.order = order;
if (limit) selectParam.limit = limit; if (limit) selectParam.limit = limit;
...@@ -95,7 +95,7 @@ export async function selectOneDataByParam(tableModel, param, column) { ...@@ -95,7 +95,7 @@ export async function selectOneDataByParam(tableModel, param, column) {
let selectParam = analysisParamToWhere(param, column); let selectParam = analysisParamToWhere(param, column);
let data = await tableModel.findOne(selectParam); let data = await tableModel.findOne(selectParam);
data = data || {}; data = data || {};
return {data}; return { data };
} }
...@@ -108,7 +108,7 @@ export async function selectOneDataByParam(tableModel, param, column) { ...@@ -108,7 +108,7 @@ export async function selectOneDataByParam(tableModel, param, column) {
export async function selectDataListByParam(tableModel, param, column) { export async function selectDataListByParam(tableModel, param, column) {
let selectParam = analysisParamToWhere(param, column); let selectParam = analysisParamToWhere(param, column);
let data = await tableModel.findAll(selectParam); let data = await tableModel.findAll(selectParam);
return {data}; return { data };
} }
...@@ -120,31 +120,39 @@ export async function selectDataListByParam(tableModel, param, column) { ...@@ -120,31 +120,39 @@ export async function selectDataListByParam(tableModel, param, column) {
* @param pageSize * @param pageSize
* @returns * @returns
*/ */
export async function selectDataListToPageByParam(tableModel, param, column, pageNumber:number, pageSize:number) { export async function selectDataListToPageByParam(tableModel, param, column, pageNumber: number, pageSize: number) {
let selectParam:any = analysisParamToWhere(param, column); let selectParam: any = analysisParamToWhere(param, column);
selectParam.limit = pageSize || 10; selectParam.limit = pageSize || 10;
selectParam.offset = (pageNumber-1)*10; selectParam.offset = (pageNumber - 1) * 10;
let data = await tableModel.findAll(selectParam); let data = await tableModel.findAll(selectParam);
return {data}; return { data };
} }
export async function selectDataCountByParam(tableModel, param) { export async function selectDataCountByParam(tableModel, param) {
let selectParam:any = analysisParamToWhere(param, []); let selectParam: any = analysisParamToWhere(param, []);
let data = await tableModel.count(selectParam); let data = await tableModel.count(selectParam);
return {data}; return { data };
} }
export async function associationSelect(tableName:string, param) { export async function associationSelect(tableName: string, param) {
let model = mysqlModelMap[tableName]; let model = mysqlModelMap[tableName];
if (!model) throw new BizError(ERRORENUM.不存在表); if (!model) throw new BizError(ERRORENUM.不存在表);
let data = await model.aggragateData(param); let data = await model.aggragateData(param);
return {data}; return {data};
// try {
// let data = await model.aggragateData(param);
// return { data };
// } catch (error) {
// throw new BizError(ERRORENUM.数据查询失败, error.message);
// }
} }
/** /**
* 多表联查 列表 * 多表联查 列表
* @param tableModel * @param tableModel
...@@ -153,6 +161,7 @@ export async function associationSelect(tableName:string, param) { ...@@ -153,6 +161,7 @@ export async function associationSelect(tableName:string, param) {
* @param column * @param column
* @returns * @returns
*/ */
// question
export async function selectDataToTableAssociation(tableModel, includeConf, param, column) { export async function selectDataToTableAssociation(tableModel, includeConf, param, column) {
let include = []; let include = [];
for (let tableName in includeConf) { for (let tableName in includeConf) {
...@@ -163,11 +172,11 @@ export async function selectDataToTableAssociation(tableModel, includeConf, para ...@@ -163,11 +172,11 @@ export async function selectDataToTableAssociation(tableModel, includeConf, para
include.push(includeInfomation); include.push(includeInfomation);
} }
let selectParam:any = analysisParamToWhere(param, column); let selectParam: any = analysisParamToWhere(param, column);
selectParam.include = include; selectParam.include = include;
let data = await tableModel.findAll(selectParam); let data = await tableModel.findAll(selectParam);
return {data}; return { data };
} }
...@@ -180,23 +189,23 @@ export async function selectDataToTableAssociation(tableModel, includeConf, para ...@@ -180,23 +189,23 @@ export async function selectDataToTableAssociation(tableModel, includeConf, para
* @param column * @param column
* @returns * @returns
*/ */
export async function selectDataToTableAssociationToPage(tableModel, includeConf, param, column, pageNumber:number, pageSize:number) { export async function selectDataToTableAssociationToPage(tableModel, includeConf, param, column, pageNumber: number, pageSize: number) {
let include = []; let include = [];
for (let tableName in includeConf) { for (let tableName in includeConf) {
if (!mysqlModelMap[tableName]) throw new BizError(ERRORENUM.不存在表, `尝试进行多表联查,但是不存在${tableName}`); if (!mysqlModelMap[tableName]) throw new BizError(ERRORENUM.不存在表, `尝试进行多表联查,但是不存在${tableName}`);
let {where, column} = includeConf[tableName]; let { where, column } = includeConf[tableName];
let includeInfomation = analysisParamToWhere(where, column); let includeInfomation = analysisParamToWhere(where, column);
includeInfomation.model = mysqlModelMap[tableName]; includeInfomation.model = mysqlModelMap[tableName];
include.push(includeInfomation); include.push(includeInfomation);
} }
let selectParam:any = analysisParamToWhere(param, column); let selectParam: any = analysisParamToWhere(param, column);
selectParam.include = include; selectParam.include = include;
selectParam.limit = pageSize || 10; selectParam.limit = pageSize || 10;
selectParam.offset = (pageNumber-1)*10; selectParam.offset = (pageNumber - 1) * 10;
let data = await tableModel.findAll(selectParam); let data = await tableModel.findAll(selectParam);
return {data}; return { data };
} }
...@@ -212,16 +221,16 @@ export async function selectOneDataToTableAssociation(tableModel, includeConf, p ...@@ -212,16 +221,16 @@ export async function selectOneDataToTableAssociation(tableModel, includeConf, p
let include = []; let include = [];
for (let tableName in includeConf) { for (let tableName in includeConf) {
if (!mysqlModelMap[tableName]) throw new BizError(ERRORENUM.不存在表, `尝试进行多表联查,但是不存在${tableName}`); if (!mysqlModelMap[tableName]) throw new BizError(ERRORENUM.不存在表, `尝试进行多表联查,但是不存在${tableName}`);
let {where, column} = includeConf[tableName]; let { where, column } = includeConf[tableName];
let includeInfomation = analysisParamToWhere(where, column); let includeInfomation = analysisParamToWhere(where, column);
includeInfomation.model = mysqlModelMap[tableName]; includeInfomation.model = mysqlModelMap[tableName];
include.push(includeInfomation); include.push(includeInfomation);
} }
let selectParam:any = analysisParamToWhere(param, column); let selectParam: any = analysisParamToWhere(param, column);
selectParam.include = include; selectParam.include = include;
let data = await tableModel.findOne(selectParam); let data = await tableModel.findOne(selectParam);
data = data || {}; data = data || {};
return {data}; return { data };
} }
\ No newline at end of file
...@@ -3,6 +3,9 @@ import * as mysqlDB from "./db/mysqlInit"; ...@@ -3,6 +3,9 @@ import * as mysqlDB from "./db/mysqlInit";
import { initMysqlModel } from "./model/sqlModelBind"; import { initMysqlModel } from "./model/sqlModelBind";
import { httpServer } from "./net/http_server"; import { httpServer } from "./net/http_server";
async function lanuch() { async function lanuch() {
/**初始化配置解析 */ /**初始化配置解析 */
await initConfig(); await initConfig();
...@@ -22,5 +25,4 @@ async function lanuch() { ...@@ -22,5 +25,4 @@ async function lanuch() {
lanuch(); lanuch();
\ No newline at end of file
...@@ -21,7 +21,12 @@ export async function initMysqlModel() { ...@@ -21,7 +21,12 @@ export async function initMysqlModel() {
let model = mysqlDB.define( tableName, schema, schemaConf); let model = mysqlDB.define( tableName, schema, schemaConf);
mysqlModelMap[tableName] = await model.sync({}).then(); mysqlModelMap[tableName] = await model.sync({}).then();
// try {
// await model.sync({ force: false });
// mysqlModelMap[tableName] = model;
// } catch (error) {
// console.error(`同步表 ${tableName} 失败:`, error);
// }
} }
/**初始化表关联 */ /**初始化表关联 */
...@@ -36,6 +41,11 @@ export async function initMysqlModel() { ...@@ -36,6 +41,11 @@ export async function initMysqlModel() {
mysqlModelMap[tableName].hasMany(mysqlModelMap[check], {foreignKey}); mysqlModelMap[tableName].hasMany(mysqlModelMap[check], {foreignKey});
} }
mysqlModelMap[check].belongsTo(mysqlModelMap[tableName], {foreignKey}); mysqlModelMap[check].belongsTo(mysqlModelMap[tableName], {foreignKey});
// else if (type === "belongsTo") {
// mysqlModelMap[tableName].belongsTo(mysqlModelMap[check], { foreignKey });
// }
console.log("---->", mysqlModelMap[tableName].getTableName()); console.log("---->", mysqlModelMap[tableName].getTableName());
console.log("====>", mysqlModelMap[check].getTableName()); console.log("====>", mysqlModelMap[check].getTableName());
} }
......
...@@ -5,10 +5,11 @@ import compression = require('compression'); ...@@ -5,10 +5,11 @@ import compression = require('compression');
import { watch } from '../middleware/watch'; import { watch } from '../middleware/watch';
import { httpErrorHandler } from '../middleware/httpErrorHandler'; import { httpErrorHandler } from '../middleware/httpErrorHandler';
import * as path from "path"; import * as path from "path";
import * as fallback from 'express-history-api-fallback'; // import * as fallback from 'express-history-api-fallback';
import historyFallback from 'express-history-api-fallback'; // 正确导入默认导出的函数
export class httpServer { export class httpServer {
static createServer(port:number) { static createServer(port: number) {
var httpServer = express(); var httpServer = express();
httpServer.all('*', (req, res, next) => { httpServer.all('*', (req, res, next) => {
...@@ -16,27 +17,28 @@ export class httpServer { ...@@ -16,27 +17,28 @@ export class httpServer {
res.header("Access-Control-Allow-Headers", "X-Requested-With"); res.header("Access-Control-Allow-Headers", "X-Requested-With");
res.header('Access-Control-Allow-Headers', 'Content-Type,request-origin,userid,token'); res.header('Access-Control-Allow-Headers', 'Content-Type,request-origin,userid,token');
res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS"); res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
res.header('Access-Control-Allow-Credentials', true); res.header('Access-Control-Allow-Credentials', 'true');
res.header("X-Powered-By", ' 3.2.1'); res.header("X-Powered-By", ' 3.2.1');
next(); next();
}); });
httpServer.use(express.static('public') );
httpServer.use(express.static('img') );
httpServer.use(express.static('public'));
httpServer.use(express.static('img'));
httpServer.use(compression()); httpServer.use(compression());
httpServer.use(watch); httpServer.use(watch);
httpServer.use(bodyParser.json({limit:"500kb"})); httpServer.use(bodyParser.json({ limit: "500kb" }));
routers.setRouter(httpServer); routers.setRouter(httpServer);
httpServer.use(httpErrorHandler); httpServer.use(httpErrorHandler);
const root = path.join(__dirname, "../../public"); const root = path.join(__dirname, "../../public");
httpServer.use(express.static(root)) httpServer.use(express.static(root))
httpServer.use(fallback('index.html', { root })) // 使用 fallback 函数
console.log('web listen on port:'+port); // httpServer.use(fallback('index.html', { root }));
httpServer.use(historyFallback('index.html', { root }));
console.log('web listen on port:' + port);
httpServer.listen(port); httpServer.listen(port);
console.log('server listen on port:'+port); console.log('server listen on port:' + port);
return httpServer; return httpServer;
} }
} }
\ No newline at end of file
...@@ -5,7 +5,67 @@ import { eccReqParamater } from '../tools/eccParam'; ...@@ -5,7 +5,67 @@ import { eccReqParamater } from '../tools/eccParam';
import { BizError } from '../util/bizError'; import { BizError } from '../util/bizError';
import { ERRORENUM } from '../config/errorEnum'; 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' })
]
});
// 霍兰德测试接口
export function setRouter(httpServer){ export function setRouter(httpServer){
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 });
} }
// export function setRouter(httpServer){
// }
...@@ -19,7 +19,7 @@ export function eccEnumValue(name:string, key:string, enumConf, value:any) { ...@@ -19,7 +19,7 @@ export function eccEnumValue(name:string, key:string, enumConf, value:any) {
}); });
} }
if (!eccSuccess) throw new BizError(ERRORENUM.请完善信息, `${name} 下的 ${key} 字段值为 ${value} 不满足枚举范围`); if (!eccSuccess) throw new BizError(ERRORENUM.文件不存在, `${name} 下的 ${key} 字段值为 ${value} 不满足枚举范围`);
} }
......
...@@ -7,6 +7,9 @@ import { getBizMsg } from "../config/errorEnum"; ...@@ -7,6 +7,9 @@ import { getBizMsg } from "../config/errorEnum";
import { logError } from "./log"; import { logError } from "./log";
export class BizError extends Error { export class BizError extends Error {
statusCode(statusCode: any) {
throw new Error('Method not implemented.');
}
constructor(...msgs) { constructor(...msgs) {
let reqErrorMsg = ''; let reqErrorMsg = '';
let logErrorMsg = ''; let logErrorMsg = '';
...@@ -24,3 +27,5 @@ export class BizError extends Error { ...@@ -24,3 +27,5 @@ export class BizError extends Error {
super(reqErrorMsg); super(reqErrorMsg);
} }
} }
{ {
"compilerOptions": { "compilerOptions": {
"module": "commonjs", "module": "commonjs",
"target": "es2017", "target": "ES2017",
"sourceMap": true, "sourceMap": true,
"rootDir":"./src", "rootDir":"./src",
"outDir":"./out" "outDir":"./out",
"esModuleInterop": true,
// "strict": true,
}, },
"exclude": [ "exclude": [
"node_modules", "node_modules",
] ]
} }
\ No newline at end of file
// {
// "compilerOptions": {
// "target": "ES6",
// "module": "commonjs",
// "esModuleInterop": true,
// "outDir": "./dist",
// "strict": true
// },
// "include": ["src/**/*"]
// }
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