文章目录
项目介绍
人事管理系统的目的是让使用者可以更方便的将人、设备和场景更立体的连接在一起。能让用户以更科幻的方式使用产品,体验高科技时代带给人们的方便,同时也能让用户体会到与以往常规产品不同的体验风格。
与安卓,iOS相比较起来,人事管理系统在流畅性,续航能力,等方方面面都有着很大的优势。这就意味着人事管理系统的设计可以比其他系统更为出色的能力,可以更高效的完成最新公司信息、招聘信息、培训信息等管理功能。
此系统设计主要采用的是Python语言来进行开发,采用Django框架技术,对于各个模块设计制作有一定的安全性;数据库方面主要采用的是MySQL来进行开发,其特点是稳定性好,数据库存储容量大,处理能力快等优势;服务器采用的是jdango服务,能够提供稳固的运行平台,确保系统稳定运行。通过人事管理系统来提升本课题的各项功能的工作效率,提供了一个多样功能,具有良好实用性的人事管理系统。
技术介绍
开发语言:Python
python框架:Django
软件版本:python3.7/python3.8
数据库:mysql 5.7或更高版本
数据库工具:Navicat11
开发软件:PyCharm/vs code
前端框架:vue.js
功能介绍
(1)鉴于该系统是一款面向全体使用者的系统,管理者需要录入使用者的个人信息、给予使用者应有的权限,让使用者可以更加自由的使用系统。
(2)要给予用户更高的查询权限,让用户可以全方位的了解本课题,让用户可以查询到公司信息、招聘信息、培训信息等。
(3)要提升用户的使用效率,让用户可以更加快捷的查询自己想要查询的东西。同时,还要做到同步性,在用户查询信息或者修改信息的同时,系统可以及时反馈到数据库上,进行及时更新和修复[9]。
系统结构图可以把杂乱无章的模块按照设计者的思维方式进行调整排序,可以让设计者在之后的添加,修改程序内容的过程中有一个很明显的思维方向。同时结构图还可以让设计者以外的其他人更直观的看出整个系统的设计理论和设计过程。让系统的设计变的更直观。该系统的功能架构图如图3-1所示:
核心代码
# 数据爬取文件
import scrapy
import pymysql
import pymssql
from ..items import LvyoujingdianItem
import time
import re
import random
import platform
import json
import os
import urllib
from urllib.parse import urlparse
import requests
import emoji
# 旅游景点
class LvyoujingdianSpider(scrapy.Spider):
name = 'lvyoujingdianSpider'
spiderUrl = 'https://you.ctrip.com/sight/lanzhou231/s0-p{}.html'
start_urls = spiderUrl.split(";")
protocol = ''
hostname = ''
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
def start_requests(self):
plat = platform.system().lower()
if plat == 'linux' or plat == 'windows':
connect = self.db_connect()
cursor = connect.cursor()
if self.table_exists(cursor, '5295r_lvyoujingdian') == 1:
cursor.close()
connect.close()
self.temp_data()
return
pageNum = 1 + 1
for url in self.start_urls:
if '{}' in url:
for page in range(1, pageNum):
next_link = url.format(page)
yield scrapy.Request(
url=next_link,
callback=self.parse
)
else:
yield scrapy.Request(
url=url,
callback=self.parse
)
# 列表解析
def parse(self, response):
_url = urlparse(self.spiderUrl)
self.protocol = _url.scheme
self.hostname = _url.netloc
plat = platform.system().lower()
if plat == 'windows_bak':
pass
elif plat == 'linux' or plat == 'windows':
connect = self.db_connect()
cursor = connect.cursor()
if self.table_exists(cursor, '5295r_lvyoujingdian') == 1:
cursor.close()
connect.close()
self.temp_data()
return
list = response.css('div.list_wide_mod2 div.list_mod2')
for item in list:
fields = LvyoujingdianItem()
if '(.*?)' in '''dt a::attr(href)''':
fields["laiyuan"] = re.findall(r'''dt a::attr(href)''', response.text, re.DOTALL)[0].strip()
else:
fields["laiyuan"] = self.remove_html(item.css('dt a::attr(href)').extract_first())
if '(.*?)' in '''div.leftimg a img::attr(src)''':
fields["fengmian"] = re.findall(r'''div.leftimg a img::attr(src)''', response.text, re.DOTALL)[0].strip()
else:
fields["fengmian"] = self.remove_html(item.css('div.leftimg a img::attr(src)').extract_first())
if '(.*?)' in '''div.rdetailbox dl dt a::text''':
fields["biaoti"] = re.findall(r'''div.rdetailbox dl dt a::text''', response.text, re.DOTALL)[0].strip()
else:
fields["biaoti"] = self.remove_html(item.css('div.rdetailbox dl dt a::text').extract_first())
if '(.*?)' in '''b.hot_score_number::text''':
fields["redu"] = re.findall(r'''b.hot_score_number::text''', response.text, re.DOTALL)[0].strip()
else:
fields["redu"] = self.remove_html(item.css('b.hot_score_number::text').extract_first())
if '(.*?)' in '''dd.ellipsis::text''':
fields["dizhi"] = re.findall(r'''dd.ellipsis::text''', response.text, re.DOTALL)[0].strip()
else:
fields["dizhi"] = self.remove_html(item.css('dd.ellipsis::text').extract_first())
if '(.*?)' in '''a.score strong::text''':
fields["pingfen"] = re.findall(r'''a.score strong::text''', response.text, re.DOTALL)[0].strip()
else:
fields["pingfen"] = self.remove_html(item.css('a.score strong::text').extract_first())
if '(.*?)' in '''a.recomment::text''':
fields["pinglun"] = re.findall(r'''a.recomment::text''', response.text, re.DOTALL)[0].strip()
else:
fields["pinglun"] = self.remove_html(item.css('a.recomment::text').extract_first())
if '(.*?)' in '''p[class="bottomcomment ellipsis open_popupbox_a"]''':
fields["dianping"] = re.findall(r'''p[class="bottomcomment ellipsis open_popupbox_a"]''', response.text, re.DOTALL)[0].strip()
else:
fields["dianping"] = self.remove_html(item.css('p[class="bottomcomment ellipsis open_popupbox_a"]').extract_first())
detailUrlRule = item.css('dt a::attr(href)').extract_first()
if self.protocol in detailUrlRule:
pass
elif detailUrlRule.startswith('//'):
detailUrlRule = self.protocol + ':' + detailUrlRule
else:
detailUrlRule = self.protocol + '://' + self.hostname + detailUrlRule
fields["laiyuan"] = detailUrlRule
yield scrapy.Request(url=detailUrlRule, meta={'fields': fields}, callback=self.detail_parse, dont_filter=True)
# 详情解析
def detail_parse(self, response):
fields = response.meta['fields']
try:
if '(.*?)' in '''<div class="baseInfoItem"><p class="baseInfoTitle">官方电话</p><p class="baseInfoText">(.*?)</p></div>''':
fields["gfdh"] = re.findall(r'''<div class="baseInfoItem"><p class="baseInfoTitle">官方电话</p><p class="baseInfoText">(.*?)</p></div>''', response.text, re.S)[0].strip()
else:
if 'gfdh' != 'xiangqing' and 'gfdh' != 'detail' and 'gfdh' != 'pinglun' and 'gfdh' != 'zuofa':
fields["gfdh"] = self.remove_html(response.css('''<div class="baseInfoItem"><p class="baseInfoTitle">官方电话</p><p class="baseInfoText">(.*?)</p></div>''').extract_first())
else:
fields["gfdh"] = emoji.demojize(response.css('''<div class="baseInfoItem"><p class="baseInfoTitle">官方电话</p><p class="baseInfoText">(.*?)</p></div>''').extract_first())
except:
pass
try:
if '(.*?)' in '''div[class="detailModule normalModule"]''':
fields["detail"] = re.findall(r'''div[class="detailModule normalModule"]''', response.text, re.S)[0].strip()
else:
if 'detail' != 'xiangqing' and 'detail' != 'detail' and 'detail' != 'pinglun' and 'detail' != 'zuofa':
fields["detail"] = self.remove_html(response.css('''div[class="detailModule normalModule"]''').extract_first())
else:
fields["detail"] = emoji.demojize(response.css('''div[class="detailModule normalModule"]''').extract_first())
except:
pass
return fields
# 去除多余html标签
def remove_html(self, html):
if html == None:
return ''
pattern = re.compile(r'<[^>]+>', re.S)
return pattern.sub('', html).strip()
# 数据库连接
def db_connect(self):
type = self.settings.get('TYPE', 'mysql')
host = self.settings.get('HOST', 'localhost')
port = int(self.settings.get('PORT', 3306))
user = self.settings.get('USER', 'root')
password = self.settings.get('PASSWORD', '123456')
try:
database = self.databaseName
except:
database = self.settings.get('DATABASE', '')
if type == 'mysql':
connect = pymysql.connect(host=host, port=port, db=database, user=user, passwd=password, charset='utf8')
else:
connect = pymssql.connect(host=host, user=user, password=password, database=database)
return connect
# 断表是否存在
def table_exists(self, cursor, table_name):
cursor.execute("show tables;")
tables = [cursor.fetchall()]
table_list = re.findall('(\'.*?\')',str(tables))
table_list = [re.sub("'",'',each) for each in table_list]
if table_name in table_list:
return 1
else:
return 0
# 数据缓存源
def temp_data(self):
connect = self.db_connect()
cursor = connect.cursor()
sql = '''
insert into `lvyoujingdian`(
id
,laiyuan
,fengmian
,biaoti
,redu
,dizhi
,pingfen
,pinglun
,dianping
,gfdh
,detail
)
select
id
,laiyuan
,fengmian
,biaoti
,redu
,dizhi
,pingfen
,pinglun
,dianping
,gfdh
,detail
from `5295r_lvyoujingdian`
where(not exists (select
id
,laiyuan
,fengmian
,biaoti
,redu
,dizhi
,pingfen
,pinglun
,dianping
,gfdh
,detail
from `lvyoujingdian` where
`lvyoujingdian`.id=`5295r_lvyoujingdian`.id
))
limit {0}
'''.format(random.randint(10,15))
cursor.execute(sql)
connect.commit()
connect.close()
数据库参考
--
-- Current Database: `django5b4s4i1s`
--
/*!40000 DROP DATABASE IF EXISTS `django5b4s4i1s`*/;
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `django5b4s4i1s` /*!40100 DEFAULT CHARACTER SET utf8mb4 */;
USE `django5b4s4i1s`;
--
-- Table structure for table `aboutus`
--
DROP TABLE IF EXISTS `aboutus`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `aboutus` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
`addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`title` varchar(200) NOT NULL COMMENT '标题',
`subtitle` varchar(200) DEFAULT NULL COMMENT '副标题',
`content` longtext NOT NULL COMMENT '内容',
`picture1` longtext COMMENT '图片1',
`picture2` longtext COMMENT '图片2',
`picture3` longtext COMMENT '图片3',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='关于我们';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `aboutus`
--
LOCK TABLES `aboutus` WRITE;
/*!40000 ALTER TABLE `aboutus` DISABLE KEYS */;
INSERT INTO `aboutus` VALUES (1,'2024-01-30 06:07:56','关于我们','ABOUT US','当你设想门外是寒冷可怕的世界时,你还应该开门出去看看,是否真的如此。如果你有信心,你对前途就不犹豫了。如果你有勇气,你就不怕前途是否有困难或危险了每个人心中都应有两盏灯,一盏是希望的灯,一盏是勇气的灯。有了这两盏灯,我们就不怕海上的黑暗和风涛的险恶了。人的一生很像是在雾中行走。远远望去,只是迷蒙一片,辨不出方向和吉凶。可是,当你鼓起勇气,放下恐惧和怀疑,一步一步向前走去的时候,你就会发现,每走一步,你都能把下一步路看得清楚一点。“往前走,别站在远远的地方观望!”你就可以找到你的方向。','upload/aboutus_picture1.jpg','upload/aboutus_picture2.jpg','upload/aboutus_picture3.jpg');
/*!40000 ALTER TABLE `aboutus` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `canjiapeixun`
--
DROP TABLE IF EXISTS `canjiapeixun`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `canjiapeixun` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
`addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`peixunbiaoti` varchar(200) NOT NULL COMMENT '培训标题',
`neirong` longtext NOT NULL COMMENT '内容',
`fengmian` longtext COMMENT '封面',
`bumen` varchar(200) DEFAULT NULL COMMENT '部门',
`gangweimingcheng` varchar(200) DEFAULT NULL COMMENT '岗位名称',
`peixundidian` varchar(200) DEFAULT NULL COMMENT '培训地点',
`peixunjihua` longtext COMMENT '培训计划',
`peixunxiangqing` longtext COMMENT '培训详情',
`yonghuzhanghao` varchar(200) DEFAULT NULL COMMENT '用户账号',
`yonghuxingming` varchar(200) DEFAULT NULL COMMENT '用户姓名',
`yuangongzhanghao` varchar(200) DEFAULT NULL COMMENT '员工账号',
`yuangongxingming` varchar(200) DEFAULT NULL COMMENT '员工姓名',
`peixunshijian` datetime DEFAULT NULL COMMENT '培训时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=89 DEFAULT CHARSET=utf8 COMMENT='参加培训';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `canjiapeixun`
--
LOCK TABLES `canjiapeixun` WRITE;
/*!40000 ALTER TABLE `canjiapeixun` DISABLE KEYS */;
INSERT INTO `canjiapeixun` VALUES (81,'2024-01-30 06:07:56','培训标题1','内容1','upload/canjiapeixun_fengmian1.jpg,upload/canjiapeixun_fengmian2.jpg,upload/canjiapeixun_fengmian3.jpg','部门1','岗位名称1','培训地点1','','培训详情1','用户账号1','用户姓名1','员工账号1','员工姓名1','2024-01-30 14:07:56'),(82,'2024-01-30 06:07:56','培训标题2','内容2','upload/canjiapeixun_fengmian2.jpg,upload/canjiapeixun_fengmian3.jpg,upload/canjiapeixun_fengmian4.jpg','部门2','岗位名称2','培训地点2','','培训详情2','用户账号2','用户姓名2','员工账号2','员工姓名2','2024-01-30 14:07:56'),(83,'2024-01-30 06:07:56','培训标题3','内容3','upload/canjiapeixun_fengmian3.jpg,upload/canjiapeixun_fengmian4.jpg,upload/canjiapeixun_fengmian5.jpg','部门3','岗位名称3','培训地点3','','培训详情3','用户账号3','用户姓名3','员工账号3','员工姓名3','2024-01-30 14:07:56'),(84,'2024-01-30 06:07:56','培训标题4','内容4','upload/canjiapeixun_fengmian4.jpg,upload/canjiapeixun_fengmian5.jpg,upload/canjiapeixun_fengmian6.jpg','部门4','岗位名称4','培训地点4','','培训详情4','用户账号4','用户姓名4','员工账号4','员工姓名4','2024-01-30 14:07:56'),(85,'2024-01-30 06:07:56','培训标题5','内容5','upload/canjiapeixun_fengmian5.jpg,upload/canjiapeixun_fengmian6.jpg,upload/canjiapeixun_fengmian7.jpg','部门5','岗位名称5','培训地点5','','培训详情5','用户账号5','用户姓名5','员工账号5','员工姓名5','2024-01-30 14:07:56'),(86,'2024-01-30 06:07:56','培训标题6','内容6','upload/canjiapeixun_fengmian6.jpg,upload/canjiapeixun_fengmian7.jpg,upload/canjiapeixun_fengmian8.jpg','部门6','岗位名称6','培训地点6','','培训详情6','用户账号6','用户姓名6','员工账号6','员工姓名6','2024-01-30 14:07:56'),(87,'2024-01-30 06:07:56','培训标题7','内容7','upload/canjiapeixun_fengmian7.jpg,upload/canjiapeixun_fengmian8.jpg,upload/canjiapeixun_fengmian9.jpg','部门7','岗位名称7','培训地点7','','培训详情7','用户账号7','用户姓名7','员工账号7','员工姓名7','2024-01-30 14:07:56'),(88,'2024-01-30 06:07:56','培训标题8','内容8','upload/canjiapeixun_fengmian8.jpg,upload/canjiapeixun_fengmian9.jpg,upload/canjiapeixun_fengmian10.jpg','部门8','岗位名称8','培训地点8','','培训详情8','用户账号8','用户姓名8','员工账号8','员工姓名8','2024-01-30 14:07:56');
/*!40000 ALTER TABLE `canjiapeixun` ENABLE KEYS */;
UNLOCK TABLES;
系统效果图
文章目录
目 录
第1章 绪 论 4
1.1 课题的研究背景 4
1.2 课题研究目的 4
1.3 课题的研究意义 4
1.4 研究现状 5
第2章 相关技术 6
2.1 Python简介 6
2.2 Django框架 6
2.3 PyCharm简介 7
2.4 MySQL简介 8
第3章 系统分析 2
3.1 技术可行性分析 2
3.2 操作可行性分析 2
3.3 需求分析 2
3.4 项目设计目标 2
3.4.1 关于系统的基本要求 3
3.4.2开发目标 3
3.5 系统流程分析 3
3.6 本章小结 6
第4章 系统设计 7
4.1 系统体系结构 7
4.2 开发流程设计 8
4.3 数据库设计原则 9
4.4 数据表信息 11
第5章 系统实现 16
5.1系统前台功能实现 16
5.2后台模块实现 20
5.2.1管理员模块实现 20
5.2.2 企业模块实现 20
5.3 本章小结 23
第6章 系统测试 24
6.1 系统测试的目的 24
6.2 系统测试方法 24
6.3 功能测试 24
6.4 本章小结 25
结 论 26
参考文献 27
致 谢 28