前言
人类现已迈入二十一世纪,科学技术日新月异,经济、资讯等各方面都有了非常大的进步,尤其是资讯与网络技术的飞速发展,对政治、经济、军事、文化等各方面都有了极大的影响。
利用电脑网络的这些便利,发展一套小型企业工资管理系统,将会给用户带来更大的效益,而在管理效能上,也必然会有很大的方便!这样可以节省大量的时间和金钱。本系统在小型企业工资管理中不可或缺的一环。该系统主要完成了个人信息修改,对员工管理、部门信息管理、岗位信息管理、员工档案管理、请假信息管理、考勤信息管理、工资信息管理、系统公告管理等功能进行管理。方便了管理员随时随地,只要电脑联网,就能对小型企业工资进行管理。同时,还可以方便快捷查询自己的小型企业工资信息。
本篇论文对小型企业工资管理系统的需求分析、功能设计、系统设计进行了较为详尽的阐述,并对系统的整体设计进行了阐述,并对各功能的实现和主要功能进行了说明,并附上了相应的操作界面图。
系统效果
核心代码
import { Router } from 'express'
import { QueryTypes } from 'sequelize'
import toRes from '../lib/toRes'
import sequelize from '../models/sequelize'
import util from '../lib/util'
import ConfigModel from '../models/ConfigModel'
import https from 'https'
import qs from 'querystring'
import path from 'path'
import fs from 'fs'
import request from 'request'
import jwt from 'jsonwebtoken'
const process = require("child_process");
export default ({ config, db }) => {
let api = Router()
// 获取某表的某个字段列表接口
api.get('/option/:tableName/:columnName', async (req, res) => {
try {
let where = ' WHERE 1 = 1 '
if(req.query.conditionColumn != undefined && req.query.conditionValue != undefined) {
where += ` AND ${req.query.conditionColumn} = '${req.query.conditionValue}'`
}
const results = await sequelize.query(`SELECT ${req.params.columnName} FROM ${req.params.tableName} ${where}`, {
plain: false,
raw: true,
type: QueryTypes.SELECT
})
let result = []
if (results.length > 0) {
results.forEach(item => {
result.push(item[req.params.columnName])
})
}
toRes.record(res, 0, result)
} catch(err) {
toRes.session(res, 500, '服务器错误!', '', 500)
}
})
// 获取某表的单行记录接口
api.get('/follow/:tableName/:columnName', async (req, res) => {
try {
toRes.record(res, 0, await sequelize.query(`SELECT * FROM ${req.params.tableName} WHERE ${req.params.columnName} = '${req.query.columnValue}'`, {
plain: true,
raw: true,
type: QueryTypes.SELECT
}))
} catch(err) {
toRes.session(res, 500, '服务器错误!', '', 500)
}
})
// 修改某表的sfsh状态接口
api.get('/sh/:tableName', async (req, res) => {
try {
let sfsh = req.body.sfsh === '是' ? '否' : '是'
await sequelize.query(`UPDATE ${req.params.tableName} SET sfsh = ${sfsh} WHERE id = ${req.body.id}`)
toRes.session(res, 0, '编辑成功!')
} catch(err) {
toRes.session(res, 500, '服务器错误!', '', 500)
}
})
// 获取需要提醒的记录数接口
api.get('/remind/:tableName/:columnName/:type', async (req, res) => {
try {
let sql = 'SELECT 0 AS count'
if (req.params.type == 1) {
if (req.query.remindstart) sql = `SELECT COUNT(*) AS count FROM ${req.params.tableName} WHERE ${req.params.columnName} >= ${req.query.remindstart}`
if (req.query.remindend) sql = `SELECT COUNT(*) AS count FROM ${req.params.tableName} WHERE ${req.params.columnName} <= ${req.query.remindend}`
}
if (req.params.type == 2) {
if (req.query.remindstart) {
let remindStart = util.getDateTimeFormat(0 - req.query.remindstart, "yyyy-MM-dd")
sql = `SELECT COUNT(*) AS count FROM ${req.params.tableName} WHERE ${req.params.columnName} >= '${remindStart}'`
}
if (req.query.remindend) {
let remindEnd = util.getDateTimeFormat(req.query.remindend, "yyyy-MM-dd")
sql = `SELECT COUNT(*) AS count FROM ${req.params.tableName} WHERE ${req.params.columnName} <= '${remindEnd}'`
}
}
const results = await sequelize.query(sql, {
plain: true,
raw: true,
type: QueryTypes.SELECT
})
toRes.count(res, 0, results.count)
} catch(err) {
toRes.session(res, 500, '服务器错误!', '', 500)
}
})
// 计算规则接口
api.get('/cal/:tableName/:columnName', async (req, res) => {
try {
toRes.record(res, 0, await sequelize.query(`SELECT SUM(${req.params.columnName}) AS sum, MAX(${req.params.columnName}) AS max, MIN(${req.params.columnName}) AS min, AVG(${req.params.columnName}) AS avg FROM ${req.params.tableName}`, {
plain: true,
raw: true,
type: QueryTypes.SELECT
}))
} catch(err) {
toRes.session(res, 500, '服务器错误!', '', 500)
}
})
// 类别统计接口
api.get('/group/:tableName/:columnName', async (req, res) => {
try {
toRes.record(res, 0, await sequelize.query(`SELECT COUNT(*) AS total, ${req.params.columnName} FROM ${req.params.tableName} GROUP BY ${req.params.columnName}`, {
plain: false,
raw: true,
type: QueryTypes.SELECT
}))
} catch(err) {
toRes.session(res, 500, '服务器错误!', '', 500)
}
})
// 按值统计接口
api.get('/value/:tableName/:xColumnName/:yColumnName', async (req, res) => {
try {
let columns = await sequelize.query(`select group_concat(column_name) from information_schema.columns where table_name = '${req.params.tableName}'`, {
plain: false,
raw: true,
type: QueryTypes.SELECT
})
columns = columns[0]['group_concat(column_name)'].split(',')
let where = ' where 1=1 '
let userInfo = jwt.decode(req.headers.token)
if (userInfo.role != '管理员') {
columns.forEach(column => {
if (column == userInfo.loginUserColumn) {
where += ` and ${column} = '${userInfo.username}' `
}
})
}
toRes.record(res, 0, await sequelize.query(`SELECT ${req.params.xColumnName}, SUM(${req.params.yColumnName}) AS total FROM ${req.params.tableName} ${where} GROUP BY ${req.params.xColumnName}`, {
plain: false,
raw: true,
type: QueryTypes.SELECT
}))
} catch(err) {
toRes.session(res, 500, '服务器错误!', '', 500)
}
})
api.get('/value/:tableName/:xColumnName/:yColumnName/:timeStatType', async (req, res) => {
try {
let columns = await sequelize.query(`select group_concat(column_name) from information_schema.columns where table_name = '${req.params.tableName}'`, {
plain: false,
raw: true,
type: QueryTypes.SELECT
})
columns = columns[0]['group_concat(column_name)'].split(',')
let where = ' where 1=1 '
let userInfo = jwt.decode(req.headers.token)
if (userInfo.role != '管理员') {
columns.forEach(column => {
if (column == userInfo.loginUserColumn) {
where += ` and ${column} = '${userInfo.username}' `
}
})
}
let sql = ""
let tableName = req.params.tableName
let xColumnName = req.params.xColumnName
let yColumnName = req.params.yColumnName
let timeStatType = req.params.timeStatType
if (timeStatType == "日")
sql = "SELECT DATE_FORMAT(" + xColumnName + ", '%Y-%m-%d') " + xColumnName + ", sum(" + yColumnName + ") total FROM " + tableName + where + " GROUP BY DATE_FORMAT(" + xColumnName + ", '%Y-%m-%d')";
if (timeStatType == "月")
sql = "SELECT DATE_FORMAT(" + xColumnName + ", '%Y-%m') " + xColumnName + ", sum(" + yColumnName + ") total FROM " + tableName + where + " GROUP BY DATE_FORMAT(" + xColumnName + ", '%Y-%m')";
if (timeStatType == "年")
sql = "SELECT DATE_FORMAT(" + xColumnName + ", '%Y') " + xColumnName + ", sum(" + yColumnName + ") total FROM " + tableName + where + " GROUP BY DATE_FORMAT(" + xColumnName + ", '%Y')";
toRes.record(res, 0, await sequelize.query(sql, {
plain: false,
raw: true,
type: QueryTypes.SELECT
}))
} catch(err) {
toRes.session(res, 500, err, '', 500)
}
})
// 人脸对比
api.get('/matchFace', async (req, res) => {
try {
let APIKeyInfo = await ConfigModel.findOne({ where: { name: 'APIKey' } })
let SecretKeyInfo = await ConfigModel.findOne({ where: { name: 'SecretKey' } })
let APIKey = APIKeyInfo.dataValues.value
let SecretKey = SecretKeyInfo.dataValues.value
const param = qs.stringify({
'grant_type': 'client_credentials',
'client_id': APIKey,
'client_secret': SecretKey
});
let rawData = '';
https.get(
{
hostname: 'aip.baidubce.com',
path: '/oauth/2.0/token?' + param,
agent: false
},
function (resc) {
resc.on('data', (chunk)=>{
rawData += chunk;
});
resc.on('end',()=>{
let rawDataObj = JSON.parse(rawData);
let access_token = rawDataObj.access_token;
let face1 = path.join(__dirname,'..','views','upload', req.query.face1)
let face2 = path.join(__dirname,'..','views','upload', req.query.face2)
let bitmap = fs.readFileSync(face1);
let bitmap2 = fs.readFileSync(face2);
let base64str1 = Buffer.from(bitmap, 'binary').toString('base64');
let base64str2 = Buffer.from(bitmap2, 'binary').toString('base64');
let reqParams = [
{
"image": base64str1,
"image_type": "BASE64",
"face_type": "LIVE",
"quality_control": "LOW",
"liveness_control": "NONE"
},
{
"image": base64str2,
"image_type": "BASE64",
"face_type": "LIVE",
"quality_control": "LOW",
"liveness_control": "NONE"
}
];
request({
url: 'https://aip.baidubce.com/rest/2.0/face/v3/match?access_token=' + access_token,
method: "POST",
json: true,
headers: {
"content-type": "application/json",
},
body: reqParams
}, function(error, response, body) {
if (!error && response.statusCode == 200) {
res.status(200).json({
code: 0,
score: body.result ? body.result.score : 0
})
} else {
res.status(200).json({
code: -1,
score: 0
})
}
});
});
}
);
} catch(err) {
toRes.session(res, 500, '服务器错误!', '', 500)
}
})
return api
}