首页 > 编程语言 >Python毕业设计基于Python+Django的人事管理系统

Python毕业设计基于Python+Django的人事管理系统

时间:2024-10-30 12:16:20浏览次数:7  
标签:canjiapeixun Python fields self upload jpg Django re 毕业设计

文章目录


项目介绍

  人事管理系统的目的是让使用者可以更方便的将人、设备和场景更立体的连接在一起。能让用户以更科幻的方式使用产品,体验高科技时代带给人们的方便,同时也能让用户体会到与以往常规产品不同的体验风格。
与安卓,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

标签:canjiapeixun,Python,fields,self,upload,jpg,Django,re,毕业设计
From: https://blog.csdn.net/QQ2083558048/article/details/143331780

相关文章

  • (开题报告)django+vue小红书App论文+源码
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容选题背景关于django和vue在社交类App开发中的应用研究,现有研究主要集中在电商、在线教育等领域。专门针对构建类似小红书App这种以用户分享、社区......
  • 基于node.js+vue基于android的医院导航系统后(开题+程序+论文)计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景在现代医疗体系中,医院的规模不断扩大,科室分布日益复杂,患者在就医过程中寻找科室、医生等目标往往面临诸多困难。关于医院导航问题的研究,现有研究主要以......
  • 基于node.js+vue基于Android的智慧社区物业服务系统后(开题+程序+论文)计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景随着城市化进程的加快,社区物业管理面临着越来越大的挑战。关于智慧社区物业服务系统的研究,现有研究主要集中在传统物业管理模式的改进上,专门针对基于And......
  • 基于node.js+vue基于B_S的停车管理系统的设计与实现(开题+程序+论文)计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景随着城市交通压力的增大,停车难问题日益凸显。关于停车管理系统的研究,现有研究主要集中在传统的停车场管理方式上,专门针对基于B/S架构的停车管理系统的研......
  • 基于node.js+vue基于Android的“养身坊”APP的设计后(开题+程序+论文)计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容选题背景随着人们生活水平的提高和健康意识的增强,养生保健逐渐成为大众关注的热点。然而,市面上的养生信息繁杂,质量参差不齐,缺乏一个系统化、专业化的平台来提供科学......
  • Python基础16_数据结构:队列&树
    一、队列队列(Queue),它是一种运算受限的线性表,先进先出(FIFOFirstInFirstOut)-队列是一种受限的线性结构-受限之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作Python标准库中的queue模块提供了多种队列实现,包括普通队列、双端队列、......
  • python之Requests模块
    python中文官方文档:https://docs.python.org/zh-cn/3/Requests中文官方文档地址:https://requests.readthedocs.io/projects/cn/zh_CN/latest/1.Requests模块快速入门requests库的基本使用详解1.Requests模块作用:发送http请求,获取响应数据2.Requests模块是第三方模块,需要......
  • Python表格格式转换模块:tablib
    文章目录安装创建表格导出数据读写安装Tablib是Python的表格转换插件,支持不同格式表格之间的转换,其推荐的安装方式为pipinstall"tablib[all]"其中,all等同于html,pandas,ods,xls,xlsx,yaml,表示在安装tablib的基础上,同时对这些不同的文件格式提供支持。如果......
  • 【一分钟配置Python环境变量
    配置Python环境变量可以帮助系统找到Python解释器和相关工具。下面是如何在不同操作系统上配置Python环境变量的步骤:Windows 1.安装Python:在官方网站下载并安装Python,安装过程中选择“AddPythontoPATH”选项。手动配置环境变量:右击“此电脑”或“计算机”,选择“属性......
  • 采用线性回归实现训练和预测(Python)
    已知测得某块地,当温度处于15至40度之间时,数得某块草地上小花朵的数量和温度值的数据如下表所示。现在要来找出这些数据中蕴含的规律,用来预测其它未测温度时的小花朵的数量。测得数据如下图所示:importnumpyasnpimportmatplotlib.pyplotaspltfromsklearn.linear_model......