nodejs基于vue的小型企业工资管理系统

前言

人类现已迈入二十一世纪,科学技术日新月异,经济、资讯等各方面都有了非常大的进步,尤其是资讯与网络技术的飞速发展,对政治、经济、军事、文化等各方面都有了极大的影响。
利用电脑网络的这些便利,发展一套小型企业工资管理系统,将会给用户带来更大的效益,而在管理效能上,也必然会有很大的方便!这样可以节省大量的时间和金钱。本系统在小型企业工资管理中不可或缺的一环。该系统主要完成了个人信息修改,对员工管理、部门信息管理、岗位信息管理、员工档案管理、请假信息管理、考勤信息管理、工资信息管理、系统公告管理等功能进行管理。方便了管理员随时随地,只要电脑联网,就能对小型企业工资进行管理。同时,还可以方便快捷查询自己的小型企业工资信息。
本篇论文对小型企业工资管理系统的需求分析、功能设计、系统设计进行了较为详尽的阐述,并对系统的整体设计进行了阐述,并对各功能的实现和主要功能进行了说明,并附上了相应的操作界面图。

系统效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

核心代码

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
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

写JAVA代码的人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值