122 lines
4.0 KiB
JavaScript
122 lines
4.0 KiB
JavaScript
'use strict';
|
|
|
|
const http = require('node:http');
|
|
|
|
const host = '127.0.0.1';
|
|
const port = 3000;
|
|
const teacherPath = '/do/api/call/lxyxt_jzgjbxx';
|
|
const unitPath = '/do/api/call/lxyxt_dwxx';
|
|
const defaultPageSize = 20;
|
|
const pad = (number, length) => String(number).padStart(length, '0');
|
|
|
|
const colleges = ['文学院', '数学学院', '计算机学院', '外国语学院', '教育学院'].map((name, index) => ({
|
|
DWDM: 'MOCK-U' + pad(index + 1, 2),
|
|
DWMC: '模拟' + name,
|
|
DWJC: name,
|
|
DWCC: 1,
|
|
LSDWDM: '0',
|
|
DWLBDM: '01'
|
|
}));
|
|
|
|
const departments = colleges.map((college, index) => ({
|
|
DWDM: 'MOCK-U' + pad(index + 6, 2),
|
|
DWMC: college.DWMC + '教学系',
|
|
DWJC: college.DWJC + '教学系',
|
|
DWCC: 2,
|
|
LSDWDM: college.DWDM,
|
|
DWLBDM: '01'
|
|
}));
|
|
|
|
const units = [...colleges, ...departments];
|
|
const teachers = Array.from({ length: 100 }, (_, index) => {
|
|
const sequence = pad(index + 1, 3);
|
|
const unit = units[index % units.length];
|
|
const doctorate = index % 3 === 0;
|
|
return {
|
|
ZGH: 'MOCK-T' + sequence,
|
|
XM: '模拟教师' + sequence,
|
|
XBMC: Math.floor(index / units.length) % 2 === 0 ? '女' : '男',
|
|
CSRQ: (1975 + index % 23) + '-' + pad(index % 12 + 1, 2) + '-' + pad(index % 28 + 1, 2),
|
|
LXRQ: (2010 + index % 15) + '-' + pad(index % 12 + 1, 2) + '-01',
|
|
DQZTMC: '在岗',
|
|
YRFSDM: '教职工',
|
|
SZDWDM: unit.DWDM,
|
|
SZDW: unit.DWMC,
|
|
MZDM: '01',
|
|
ZGXLMC: doctorate ? '博士研究生' : '硕士研究生',
|
|
ZGXWMC: doctorate ? '博士' : '硕士',
|
|
ZYJSGWLBDMMC: '专业技术岗',
|
|
ZYJSZWDMMC: ['讲师', '副教授', '教授'][index % 3],
|
|
SFSJT: false
|
|
};
|
|
});
|
|
|
|
function sendJson(response, status, body) {
|
|
response.writeHead(status, { 'Content-Type': 'application/json; charset=utf-8' });
|
|
response.end(JSON.stringify(body));
|
|
}
|
|
|
|
function positiveInteger(value) {
|
|
const number = Number(value);
|
|
return (typeof value === 'number' || typeof value === 'string') && Number.isSafeInteger(number) && number > 0;
|
|
}
|
|
|
|
async function handleRequest(request, response) {
|
|
const path = request.url.split('?')[0];
|
|
if (path !== teacherPath && path !== unitPath) {
|
|
sendJson(response, 404, { returnStatus: 0, errorMsg: '接口不存在' });
|
|
return;
|
|
}
|
|
if (request.method !== 'POST') {
|
|
response.setHeader('Allow', 'POST');
|
|
sendJson(response, 405, { returnStatus: 0, errorMsg: '请使用 POST' });
|
|
return;
|
|
}
|
|
|
|
let params;
|
|
try {
|
|
let body = '';
|
|
request.setEncoding('utf8');
|
|
for await (const chunk of request) {
|
|
body += chunk;
|
|
}
|
|
params = body.trim() ? JSON.parse(body) : {};
|
|
if (!params || typeof params !== 'object' || Array.isArray(params)) {
|
|
throw new TypeError('请求体必须是 JSON 对象');
|
|
}
|
|
} catch {
|
|
sendJson(response, 400, { returnStatus: 0, errorMsg: '请求体必须是 JSON 对象' });
|
|
return;
|
|
}
|
|
|
|
const pageNum = params.pageNum ?? 1;
|
|
const pageSize = params.pageSize ?? defaultPageSize;
|
|
if (!positiveInteger(pageNum) || !positiveInteger(pageSize)) {
|
|
sendJson(response, 400, { returnStatus: 0, errorMsg: 'pageNum 和 pageSize 必须是正整数' });
|
|
return;
|
|
}
|
|
|
|
const jobNumber = String(params.zgh ?? '').trim();
|
|
const records = path === unitPath ? units
|
|
: jobNumber ? teachers.filter(teacher => teacher.ZGH === jobNumber) : teachers;
|
|
const start = (Number(pageNum) - 1) * Number(pageSize);
|
|
sendJson(response, 200, {
|
|
returnStatus: 1,
|
|
pageInfo: {
|
|
pageNum: Number(pageNum),
|
|
pageSize: Number(pageSize),
|
|
pages: Math.ceil(records.length / Number(pageSize)),
|
|
total: records.length
|
|
},
|
|
dataSet: records.slice(start, start + Number(pageSize))
|
|
});
|
|
}
|
|
|
|
if (require.main === module) {
|
|
http.createServer(handleRequest).listen(port, host, () => {
|
|
console.log('模拟数据接口 http://' + host + ':' + port);
|
|
});
|
|
}
|
|
|
|
module.exports = { handleRequest };
|