大学生信用评价系统分析与设计

第一章绪论

1.1 系统开发背景

随着中国社会蓬勃发展,社会不断地走向繁荣富强,经济活动也随之日益增长。在人民,毫无疑问在这些经济活动中扮演了重要的角色。很多中国人在乎的“成家立业”,在我们的眼中,家的前提,是有一个属于自己的房子,没有房子,在很多情况下一切免谈。但是很显然,能够用现金购买一套房子的人少之又少,贷款则成为很多家庭的第一选择。

一些专家对于信贷有专业的解释,“信贷”被理解为一种获取商品或服务的手段,该商品或服务面向预期的未来,这意味着它被积极看待[1]。银行可以通过央行的征信系统,进行查阅和调取个人资料。但是这套从上个世纪八十年代才开始起步的征信体系对于普通大众而言有一些遥远。首先,没有普通大众知道自己的央行信用分是多少,也鲜有人谈及此类话题。然而,我们还是有必要了解,信用分是怎么来的:

传统的信用评分是统计、运筹学和相关学科(如机器学习和数据挖掘)技术的一种应用,旨在预测与贷款相关的财务风险。它本质上是一种根据观察到的特征来区分一个群体中具有不同信用风险的群体的方法[2]。

那么在中国,有什么信用分值得国人常常提及又简单直观呢。

1.2 芝麻信用

1.2.1 芝麻信用分

很多时候,让普通百姓挂在嘴边的,往往是一月更新一次的芝麻信用分。这套阿里信用评价体系,背后的具体模型不得而知,但是由于更加贴近人的生活,同时背靠阿里这棵大树,收到了一定关注。截止到目前支付宝芝麻信用-信用生活页面,信用分大于 650 分,就可以试穿某些天猫服饰,绑定支付宝,用户也可以享受到免押金租用充电宝、雨伞、单车等等,给人们的生活带来了一定的便利。

图 1.1 芝麻信用分示意图

图 1.2 芝麻信用生活示意图

可以看到,阿里的芝麻信用分玩法还是很多的,可以给用户带来的福利也很多。

结合阿里的业务体系,芝麻信用分的来源可能包括如下三个维度[3]:

(1)阿里体系内数据。阿里巴巴体系内的数据包括电商平台,互联网金融以及娱乐业务这三块,电商平台数据来源主要为淘宝、天猫等电商平台拥有的用户信息,互联网金融数据为蚂蚁金服旗下的支付宝、余额宝、阿里小贷等金融产品所产生交易信息,娱乐业的数据则来自阿里巴巴旗下的游戏、音乐等业务。

(2)外部数据。外部数据是指与阿里巴巴达成合作协议的公共机构所提供的数据,以及一些与芝麻信用交换信息的国内主流 P2P 平台。

(3)用户提交的数据。用户可以在阿里巴巴官网、支付宝平台提交一些个人信息证明,包括实名认证、个人收入、资产和工作证明等等。

1.2.2 芝麻信用分的局限性

(1)信息壁垒

大部分国内外的征信体系最大的问题在于信息壁垒。数据的不完整对于整体信用评估是非常致命了,这会直接导致整套系统失去可行度。根据马太效应,如果这家信用评分机构数据越匮乏,愿意和它合作,开放自己的数据库的企业或政府机构也就越少。对于采用信用评分的放贷机构而言,如果不同征信机构对相同的用户评级结果不一致,市场销量无疑会降低。这可能造成的“多头借贷”现象,也使国家金融风险增加。

(2)信息安全

很多互联网巨头自嘲中国人是世界上最不注重个人信息隐私的群体。这点其实无可辩驳,大量用户面对《用户条例》,毫不犹豫地选择“我已阅读以上条例”,在毫不知情的情况下将个人信息提供给独角兽企业们。不过近几年,互联网的崛起,铺天盖地的新闻,让越来越多人意识到保护个人信息的重要性。但是不少国际黑客,依然试图攻破国内企业的数据库,从而获得个人信息,得到不菲的收入。一些企业将用户的重要信息明文保存在数据库中,从而导致了信息泄露。

(3)处罚力度

大部分用户只享受到了芝麻信用分给我们带来的便捷,没有意识到使用这款产品其实也是有相应责任的。信用机构往往只考虑了用好处吸引用户使用这款产品,而不强调或者建立相应的惩罚机制。部分用户为了提升自己的信用分,不停地互相转账,从而抬高自己的信用分。这些钻空子的行为缺乏监管和惩罚力度,必然导致信用分的局限性[4]。

除了国内的征信,我们也可以参考一下国外的征信情况。

1.3FICO 系统

1.3.1Fico 评分系统

美国作为全世界最发达的资本主义国家,也是最早的信用卡发源地,个人信用评估也很早地起步了。Fico 评分系统只要有 FairIsaacCompany 提出,由此得名。FairIsaac 前后提出来三套评分系统,三套系统分别由美国三大信用管理局使用。

同一个用户在三套系统中的得分可能不尽相同,但是相差无几。Fico 评分主要是用于贷款的发放。传统通过人工审核难以避免地会有个人偏见,比如性别,宗教,肤色,国籍等等。引入 Fico 系统后,系统可以客观公正的评价申请人的各项指标[6]。

1.3.2Fico 评分的模型

FICO 评分模型有五类主要因素组成,包括了客户信用偿还历史、信用账户数、客户使用信用的年限、正在使用信用类型、新开设的信用账户[1]。各部分的权重如图所示:

图 1.1Fico 模型个因素权重比例情况

可以看出,偿还历史对于 Fico 模型而言是最为重要的因素,如果一个人的历史信用不佳,那么他下一次得到贷款的可能性也就降低。另外年限也是一大考量元素之一[7]。

1.4 中国当前征信行业的机遇与挑战

1.4.1 互联网金融的机遇和挑战

对于 P2P 借贷行业,大学生无疑使一个非常庞大的经济群体,截止到 2014 年,我国的互联网金融消费市场已经达到了 96,9 亿元人民币。如果数字属实的话,那么截止到现在,这个数字应该已经超过 1000 亿元人民币大关[8]。同时,大学生也是思想最为前卫的群体,经济的发展和生活质量的提高都带动了年轻人的消费力,与之产生矛盾的是不匹配的消费能力,贷款则可以适当缓解这种尴尬的局面。但是事实上,一些自力雄厚的银行在很早之前就已经开始争夺大学生信用卡市场,但是由于过高的坏账率,不得不叫停。现在很多大学生信用卡美其名曰信用卡,其实额度为 0,没有提前消费的能力,终究还是和借记卡一样,需要先存钱。

如果有良好的信用评级机制,银行可以提供专业的服务,学生也可以得到合理的利率。

1.4.2 数据对人才市场的优势

领英(LinkedIn)作为世界数一数二的互联网职业招募平台和职业社交平台,通过互联网实名社交将人才与企业联系起来。如今的领英,不仅仅是一个让机构发布信息,展现自我的平台,也是行业精英寻觅属于自己的高薪职业的渠道,职场小白也可以在上面学习技能,拓展人脉,所谓‘networking’。在领英上,不仅仅是毕业之后的工作情况,即便是小小的志愿者经历,或者不知名的证书,都可以在领英上进行认证。虚拟的徽章和认证,仿佛是一针强心剂,促使大量用户在领英平台上展现自己。不难想象中国大学生,也会乐此不疲。况且,如果可以连接校内系统,展示学生每个学期,每个学年,每节课的表现,以及诚信情况,奖励情况,志愿者情况,这样的系统会非常有市场。

1.5 研究的目的和意义

1.5.1 研究目的

近期,大学生贷款的话题一直非常热议,很多人关注与大学生超前的消费意识和与之不匹配的偿还能力,也有人批评一些灰色的借贷机构,通过文字游戏,蒙蔽缺乏社会经验,手头又不宽裕的大学生。国家出台了相应的法律法规约束这些机构,但是凡事宜疏不宜堵,如果可以客观合理地提过一个第三方评级,让正规银行进行参考,放贷的时候就有参考价值,就可以达到多赢的局面。

另外,对于用人单位,校招的时候凭借一张简历很难对人才进行筛选,如果学校方面可以通过自己的数据库,开通可以让授权的用人单位实时查询,那么将极大地提高人才招募的效率。

1.5.2 研究意义

迎合 2013 年中国银行颁布的《征信业管理条例》(下文中简称《条例》)的精神,维护市场环境,保证大学生合法权益,开发一套完整可靠的信用评价体系非常重要。大学生信用评价系统可以通过学校的数据库,加上严格的审核制度,建立健全全面可执行的评价模型。该模型,可以提高大学生对于自己信用行为的积累意识。对于用人单位,可以通过最终的分值从不同角度了解大学生的在校行为,比简历更加全面可靠。同时,对于正规的借贷机构而言,也可以在此系统中判断是否可以发放贷款。

1.6 研究难点

获取学生各种校内信息的过程较为复杂,比如图书馆借阅信息,教超消费,志愿者经历等等。其中如果稍有不慎,就会有泄露个人信息的隐患,与征信的初衷背道而驰。

同时,中国教育界还没有完全脱离以分数看高低的模式,有些同学并不重视信用分的重要性,如何在征信的过程中严肃而不失乐趣,是吸引大学生关注征信业务的重要指标。有些论文中,推荐采用一定的宣传模式,比如通过校园广播,屏幕等传统手段,或者公众号,微博等新媒体工具;除了宣传,最好也将征信纳入大学生的各类活动中,比如新生欢迎会、培训、干部竞选、就业指导等等。

最困难的莫过于指标和权重的选择。对于招聘企业和贷款方向的指标是不一样的,就像 Fico 的三套系统一样,对于不同需求,采用的指标和权重应该是不一样的。笔者的构想是两个系统,一个针对用人单位的在校生校内表现得分,一个是正对大学生借贷的个人收入情况评分。这个系统有共同考量的因素,也有单独考量的因素。两者分开可以保证两个系统用户都可以得到最可靠的结果。

第二章开发方法和技术

2.1 开发方法理论

信息系统,即信息传递交流系统,信息系统通常解释为有目的、和谐地处理信息的主要工具,它对所有形式的信息进行收集、处理、存储、传输和输出。收集:获取和收集原始数据的活动,包括手动输入和自动输入;处理:对数据进行处理,使得获得新的结构与形态或产生新的数据;存储:采用信息存储技术,将有用的信息进行存储保管,以便系统随时调用;传输:把信息从一处传到另一处,不改变信息本身的内容;输出:将系统处理后获得的有用信息按照一定要求和形式输出到某种介质上。

信息系统具有以下特征:目的性、系统要素、相关性、结构层次性、整体性、环境适应性。现如今基本将组织中的信息系统分为四个层次:运行层系统、知识处理层系统、管路控制层系统、战略层系统。不同类型的信息系统彼此相互联系,负责信息系统各个过程的分工。一切都会产生、发展、成熟和消亡。施工企业信息系统项目在更新过程中也不例外。随着生活环境的变化,在使用过程中需要不断的维护。当它不再适应时,它将被消除并采用新的系统,而不是成为旧系统,这一周期被称为信息系统的生命周期。在信息系统中经常使用生命周期法将系统建设过程分解为五个阶段,并且对每个部分的目标、活动、内容制定具体规定。五个阶段分为以下:

(1)系统规划阶段:

对组织的环境、目标和现有体系的现状进行了初步调查。根据组织目标和发展战略,确定了信息系统的发展战略,并对新系统建设的需求进行了分析和预测。考虑到新系统建设的各种制约因素,研究了新系统建设的必要性和可能性,分析了替代方案的可行性。系统建设计划和实施计划编制成系统规划报告。

(2)系统分析阶段:

根据系统规划报告确定的范围,对当前系统进行了详细的研究,描述了当前系统的业务流程,指出了当前系统的局限性和不足,确定了新系统的基本目标和逻辑功能要求,即提出了新系统的逻辑模型。系统分析阶段的成果体现在系统分析说明中。

(3)系统设计阶段:

系统设计阶段的任务是根据系统规范中规定的功能要求,结合实际情况,设计实现逻辑模型的技术方案,即设计新系统的物理模型。本阶段的技术文档是系统设计规范。

(4)系统实施阶段:

根据系统设计规范的要求,系统设计实施阶段具有多个相互关联、相互制约的任务同时进行的特点。系统的实施必须根据实施计划,认真安排,合理组织,分阶段实施。各阶段应编写实施进度报告。系统测试结束后,编写系统测试分析报告。

(5)系统运行和维护阶段:

系统投入运行后,需要定期进行维护和评估,记录系统运行情况,根据一定的规则对系统进行必要的修改,并对系统的质量和取得的效益进行评价。对于不能修改或难以修改的问题,将其记录并定期编制成新的需求建议,从而为新的信息系统项目规划做准备。

信息系统的开发是一项复杂的系统工程。它不仅涉及计算机技术,还涉及管理业务、组织和行为。这就加大了开发一个信息系统的工作量和工作难度。而掌握合适的系统开发方法对有效实现信息系统的开发会很有帮助。需要解决的问题不同,对应的信息系统规模与技术复杂度也会不同。不同类别的信息系统各有其适合的开发方法,常用的开发方法有:

2.1.1 原型法

原型法是一种基于 4GL 的快速模拟方法,多被用于小型局部系统或处理过程比较简单的系统设计到实现的环节。原型开发信息系统的基本思想是首先总结用户提出的初始要求,然后构造一个合适的原型并运行它。之后,通过系统开发人员和用户对原型操作的不断分析,修改和讨论,不断扩展和改进系统的结构和功能,直到获得满足用户要求的系统。

2.1.2 面向对象开发方法

面向对象的方法侧重于围绕对象的系统分析和系统设计,然后使用面向对象的工具来构建系统。这种方法可以普遍应用于各种类型的信息系统开发,但它不能参与以前的系统分析开发。面向对象的开发过程包括五个阶段:系统调查和需求分析,问题的性质和问题分析,详细的设计问题,编程和系统测试。

2.1.3 结构化开发方法

结构化开发方法又称为 SSA&D,是自顶向下的结构化方法、工程化的系统开发和生命周期方法结合的产物,是至今为止所有开发方法中应用最广泛、最成熟的系统开发技术。宠物店系统的开发也应用了这种开发方法。

结构化系统开发方法擅长发现和整理系统调查、分析中的问题及疏漏,便于开发人员准确地了解业务处理过程,有利于与用户一起分析新系统中适合企业业务特点的的新方法和新模型。

结构化系统开发方法的基本思想是利用系统工程思想和工程方法,根据用户至上,结构化,模块化和自上而下的原则对系统进行分析和设计。具体而言,整个信息系统开发过程首先分为几个相对独立的阶段,如系统规划,系统分析,系统设计和系统实现。每个阶段都有明确的任务和目标,每个阶段可以分为几个任务和步骤,逐个完成任务,以达到预期目标。

结构化方法的突出优点是,它强调系统开发过程的完整性和整体性,强调在整体优化的前提下考虑具体的分析设计问题,即自上而下的视角,减少失误和失败系统开发可能性。同时,随着计算机应用的深入和计算机软硬件的快速发展,系统开发的周期要求越来越高,短时间和低成本成为系统开发的基本要求。面对这一新趋势,强调标准化和标准化的标准化系统开发过程逐渐暴露出缺点和不足,如开发周期过长,难以适应快速变化的环境,所使用的工具落后。

毫无疑问,结构化系统开发方法存在不可避免的缺点,然而这种开发方式其严密的理论基础和系统工程方法,依然被广泛使用,且仍然是系统开发中不可缺少的一部分。结构化系统开发方法经常应用在大型、复杂的影响企业整体运作的信息系统的开发项目中,也经常应用在政府项目中。目前它仍然是一种被广泛采用的系统开发方法。

2.2 开发环境

Python:3.7.2

Django:2.1.0

Mysql:5.7

2.2.1Python

Python 是一种计算机程序设计语言,是一种动态的,面向对象的脚本语言,最初设计用于编写自动脚本(shell),随着版本的不断更新和新的语言功能的增加,这些脚本越来越多地用于独立的大型项目的开发和维护。如今,随着人工智能进入国家的视野,Python 在程序时间的地位进一步提高。由于 Python 社区贡献了大量高质量的人工智能和机器学习代码,越来越多的人加入了人工智能的大军,也就是 Python 的学习。同时,大数据为更多的商家提供商机,数据分析的能力,如 Scipy,Numpy,Pandas,Tensorflow 等等包变得耳熟能详。这些都促使了 Python 不仅仅好用,而且有人用,马太效应之下,Python 正在变得语法流行。

本次开发使用的是 Python3.7.2,最新版本。基于 anaconda 的最新版本,优点在于 anaconda 可以更好的管理 Python 封装问题。

2.2.2Django

Django 是一个用 Python 编写的开源 Web 应用程序框架。采用 MVC 的框架模式,即模型 M,视图 V 和控制器 C.最初开发用于管理劳伦斯出版集团的一些基于新闻内容的网站,即 CMS(内容管理系统)软件。它于 2005 年 7 月在 BSD 许可下发布。该框架以比利时的 Gypsy 爵士吉他手 DjangoReinhardt 命名。

Django 是一个基于 MVC 结构的框架。但在 Django 中,接受用户输入的控制器部分由框架本身处理,因此 Django 更关注模型,模板和视图,称为 MTV 模式。各自的职责如下:

表 2.1DjangoMVC 模式图
层次 职责
模型(Model),即数据存取层 处理与数据相关的所有事务:如何存取、如何验证有效性、包含哪些行为以及数据之间的关系等。
模板(Template),即表现层 处理与表现相关的决定:如何在页面或其他类型文档中进行显示。
视图(View),即业务逻辑层 存取模型及调取恰当模板的相关逻辑。模型与模板的桥梁。

从上面的语句中可以看出,Django 视图不处理用户输入,这部分由 JavaScript 和 HTML 完成,而只决定向用户显示哪些数据。Django 模板仅确定如何呈现 Django 视图指定的数据。或者说,Django 进一步将 MVC 中的视图分解为两部分:Django 视图(对于 views.py)和 Django 模板(对于 templates 文件夹下的 HTML 文件),它们确定“要显示的数据”和“如何显示”,以便 Django 的模板可以根据需要进行替换,而不仅仅是内置模板。

至于 MVC 控制器部分,它由 Django 框架的 URLconf 实现。URLconf 机制使用正则表达式匹配 URL,然后调用适当的 Python 函数。URLconf 对 URL 规则没有限制。任何用户都可以将它们设计为任何 URL 样式,无论是传统的,RESTFul 的还是替代的。框架封装了控制层,没有其他任何东西与数据交互。该层是数据库表的读取,写入,删除和更新操作。在编写程序时,只需调用相应的方法,与一些传统的框架相比可以说非常简便了。程序员自动将控制层交给 Django。只写很少的代码来做很多事情。因此,它比 MVC 框架考虑的更深一步,因为我们的大多数程序员都在编写控制层程序。现在这项工作被移交给框架,只需要少量的调用代码,这大大提高了工作效率。

在美国,很多知名的初创企业在一开始,都是用 Django 作为框架。由于依附于 Python,Django 有很强的后台数据处理能力。例如著名社交网站 Instagram(照片墙)。

图 2.1Instagram 首页

以及美国的大众点评 Yelp。

图 2.2Yelp 首页

本次使用的 django 版本是 django2.1.1 版本。通过在 anaconda 中输入 pipinstallDjango,就可以下载并安装最新的 django 包,可以直接调用。

2.2.3MySQL

MySQL 是最受欢迎的关系数据库管理系统。MySQL 是 Web 应用程序中最好的 RDBMS(关系数据库管理系统)应用程序之一。MySQL 是一个真正的多用户,多线程 SQL 数据库服务器。SQL(结构化查询语言)是世界上最流行和标准化的数据库语言,可以更轻松地存储,更新和访问信息。MySQL 是一种客户端/服务器体系结构实现,由服务器守护程序,mysqld 和许多不同的客户端程序和库组成。

MySQL 的主要目标是快速,健壮且易于使用。最初是因为 MySQL 的创始人需要这样一个 SQL 服务器,它可以处理大型数据库,供应商在任何廉价的硬件平台上提供数据库,但是以更快的速度开发了 MySQL。

MySQL 提供 C,C++,Java(JDBC),Perl,Python,PHP 和 TCLAPI 接口;多平台支持,包括 Solaris,SunOS,BSDI,SGIIRIX,AIX,DECUNIX,Linux,FreeBSD,SCOOpenServer,NetBSD,OpenBSD,HPUX,Win9x 和 NT;各种数据类型,包括/unsigned1,2,3,4,8 字节整数,FLOAT,DOUBLE,CHAR,VARCHAR,TEXT,BLOB,DATE,DATETIME,YEAR,SET,ENUM;非常灵活安全的权限系统,密码加密;用于 Windows 的 ODBC 接口,可以通过 Access 连接,而第三方开发人员提供各种 ODBC 驱动程序。但是,为了速度,健壮性和易用性,MySQL 必须牺牲一些灵活和强大的功能,如子查询,存储过程和触发器,外键,事务处理等。因此,MySQL 在某些应用程序中缺乏灵活性,但它也使其比其他数据库服务器快 2 到 3 倍。发器,外键,事物处理等。因而,MySQL 在某些应用中缺乏灵活性,但这也使它对数据的处理速度较其它数据库服务器至少快 23 倍。

在 MySQL 官网,可以看到使用 MySQL 服务的知名企业不计其数:

图 2.3Mysql 首页

里面包含了不少耳熟能详的企业,如 GitHub,Facebook,NASA,JPMorgan 等企业。

本次使用的 MySQL 是 Mysql5.7。

第三章大学生信用评估系统规划

3.1 大学生信息评估系统需求分析

3.1.1 需求分析

既然是以大学生信用为主题的系统,大学生就是避不开的话题。虽然现在唯分数论的思想已经不再可靠了,但是学习成绩的好坏依然在一定程度上反应了一个人的信用程度,所以成绩毫无疑问是必须纳入考虑的一大因素之一。为了便于查询成绩的来源,可靠地反应学生的学术水平,该系统也会包含一套简易的选课系统。教师可以为学生打分,每个学期的算术平均绩点就是奖学金的依据。辅导员可以根据学生每个学期的绩点,决定奖学金名单,学生在系统中确认申请。这套流程是模仿了上海理工大学的奖学金申请流程。

同时,为了倡导环保和循环利用,加入了二手商品交易这个子系统。旨在倡导学生,热心环保,注意回收,也可以为学生提供一个收回部分成本的机会。如今国内教材的价格远远低于国外,但是对于学生而言,能够循环利用书籍,收回一部分成本,总是一件值得庆幸的事情。更加重要的是,在这个过程中,学生会因为商品相符程度,回复态度,回复速度,交易的便捷性等等得到买家相应的分数,这些分数会相应计入人才招募和贷款发放的信用分中[9]。

信用的另一个维度是履约能力。在校园内,能够非常显著表现履约能力的就是图书馆借阅归还情况。在图书馆借书,可以体现一个学生对于知识的渴望,及时归还则反应了该学生履约的能力。对于不及时归还的,按照一定的规则进行扣分和罚款;对于长期不归还的,则当作丢书处理;如果主动承认丢书,则可以相应减免责罚。当然,对于一些学生因为客观原因不能及时归还的情况,向老师发起申诉,只要老师认可,则可以不予惩罚。这样也体现了客观公正,又不失人情[10]。

在国际知名招聘和职业社交网站 LinkedIn 中,技能认证是一项非常有趣的功能。在敬佩产品经理才思敏捷的同时,本系统也可以加入类似的功能。在领英中,技能认证是通过个人发布,得到上下级或者同事的认可,技能旁边的数字就会相应加一。在学校中,想要获得同学之间的认可太过简单,结果也有失公允。而且根据马太效应,一些朋友比较多的同学认可也比较多,因此认可的来源不太应该源自于学生之间。根据学校的课程,不难发现有些课程比较简单,但是有些课程可以扎扎实实学到有用的知识。有些同学也会抱怨在学校里没法集中注意力,没有学习的动力,学的东西得不到相应的证明,那么如果根据课程的不同,学生学习的结果不同,在征信平台上进行认证,那么无疑会使多赢的局面。例如,对于某些课程,如数据库。如果学生的成绩大于 90 分,则可以申请数据库技术认证。得到对应教师批准之后,相应的得到加分。

除了校内的成绩外,学生多半会参与一些课外活动丰富自己的课余生活。为了鼓励大家多参与志愿者活动和学校学生会工作[11],将这两项加入模型中,是无可厚非的。当然这两项每种活动会有对应的分数,参与的次数也有限制,否则分值就会失去可信度。另外,很多学生对于学术研究有独到的兴趣,发表的论文数量和对于期刊的质量都会纳入信用分的考量。另外如果学生获得一些国家国际奖项,也可以进行申报,从而获得一些分数上的奖励[12]。

所得到的奖学金可以算入学生收入,从而让第三方贷款方得到学生的收支情况。当然只有收肯定不可靠的,所以比如从银行账户的调取学生每个学期的银行流水。

实习往往是学生通向职场的第一步,学生在实习期间的情况和收入情况也可以纳入其中。人才招募的信用分可以将实习的工种纳入考量,贷款发放的时候收入的水平可以视作贷款发放的重要水平。例如,一个有技术含量的实习得到的分数要比没有技术含量的得到的分数要高;实习超过一年的实习生,肯定要比刚刚开始实习的实习生要高;单日收入税后达到 180 元的学生得到的分数也要比日收 100 元的学生得分要高。

为了避免学生在考试中违纪,很多学校实行严格的校纪校规,对于严重违纪的学生不惜开除也要显示考试违纪是学生不可逾越的红线[13]。然而,不到毕业很多用人单位并不会调用学生档案,对于学生这方面的成绩了解不少非常透彻,因此可以在评分系统中体现出来。

3.1.2 公式

本着避免重复计算的原则,削弱马太效应对于分值的影响,人才招募和贷款发放的函数如下:

y_人才招募=F(学生年级,绩点,二手商品交易历史,技能,学生工作&论文,学生罚款清单,学生违纪情况)

y_贷款发放=G(学生年级,奖学金,银行流水,二手商品交易历史,校外工作证明,学生罚款清单,学生违纪情况)

3.1.3 分值对照

为了更好地明确每个指标衡量的标准和对应的分值,本文将使用 Excel 表格,对分支进行详细的描述。

(1)学生年级:

不同的年级可以得到的加分不同,越接近毕业,分数越高。但是在工作和放贷两种不同的场景中,各自的加分应当是不同的。

(2)绩点:

学习成绩体现了学生的学习能力,在工作中,学习能力也是极其重要的因素,但是在贷款方面似乎没有那么要紧,所以在贷款申请评分的时候,权重相应降低。

表 2.3 绩点加分对应表
人才招募 贷款发放
绩点 >4.0 10 5
>3.8 8 3
>3.5 6
>3.0 4 1
❤️.0 2

(3)技能:

技能体现了学生在大学期间对于技术性课程的重视程度,不仅仅是学习能力的体现,也是考验学生在有限时间里如何对课程进行取舍。

表 2.4 技能加分对应表
人才招募 贷款发放
技能 >3 10 5
>1 5 2
0 0 0

(4)银行流水

银行流水查看学生的消费能力和生活水平,在发放贷款是非常必要。同时,很多现实中的场合都需要查看银行流水,房贷车贷,办理护照签证等。对于学生而言,生活费是非常常见的资金来源,可以以此作为银行流水的参考,结合大学生每月生活费的水平,得到如下表:

表 2.5 银行流水加分对照表
人才招募 贷款发放
银行平均流水 >2500 25
>2000 20
>1500 15
>1000 10
<500 5

(5)学生工作/论文/校外奖励:

学生工作和奖励非常多而复杂,经过一系列资料的查阅,考虑到某些奖励高不可及,也进行了一些整理和合并。同时也考虑到越是接触的人越多的学生,越是讲究自己的信用,所以曝光度是贷款发放考量的因素之一,相应的分值与人才招募相比也会增涨。

表 2.5 学生工作/论文/校外奖励加分对照表
人才招募 贷款发放
学生工作 学生会干事 5 5
学生主席 10 10
学生副主席 8 8
志愿者每小时 1 0
A 类期刊 30 5
B 类期刊 25 3
国际期刊 50 10
市级奖励 10 10
国家级奖励 15 15

(6)学生罚款清单:

表 2.6 学分罚款规则对照表
人才招募 贷款发放
学生罚款清单 逾期一次 10 20
丢书一次 15 25

所谓有赏必有罚,赏罚分明的制度才是最能让人信服的制度。人才招募的过程中要了解大学生在校的守信情况,从而对人才做出判断。贷款涉及真金白银,更加不能儿戏,因此贷款的扣分幅度更大。

(7)奖学金:

奖学金也是一个衡量学生经济水平的要素。很多学生可以通过一年的学习得到不菲的奖学金,以一定的比例算入大学生借贷评价体系很有必要。

表 2.7 奖学金奖励规则对照表
人才招募 贷款发放
学生罚款清单 累计每 100 元 1

(7)二手商品交易历史:

上手商品交易的评价是由两个维度组成的,分别是卖家维度和买家维度。这里的考虑方式是卖家维度较为重要因为很多情况下只有买家会为卖家打分,卖家不愿意在打分,而必须有一个默认分值。因此初步结果如下表:

表 2.8 二手交易评价规则对照表
人才招募 贷款发放
二手商品交易 买家评价 1 2
卖家评价 2 4

(8)校外工作:

校外工作主要就是实习工作,公司的大小固然由一定的关系但是非常难以统计,这里暂时用工作年限为考量依据。为了避免重复计算,贷款发放的时候相应分值会略有下降。

表 2.9 校外工作加分对照表
人才招募 贷款发放
学生校外工作 累计工作 12 个月 20 10
累计工作 9 个月 15 8
累计工作 6 个月 10 6
累计工作 3 个月 5 4

(9)违纪

考试违纪作弊是绝对不可以容忍的问题,因此必须通过为了让用人单位及时知晓相关的情况[14]。

表 2.10 违纪作弊扣分对照表
人才招募 贷款发放
学生校外工作 夹带旁抄 100 100
偷看 80 80
协助作弊 120 120

为了得到一个完整的分数,用思维导图的方式展示每个维度在所占的百分比:

图 2.1 信用评级思维导图

表 2.11 信用评级规则对照表
信用评级 贷款发放 学生年级 10%
奖学金 15%
银行流水 45%
二手商品 10%
学生工作 20%
学生罚款情况 -20%
学生违纪情况 -40%
人才招募 学生年级 25%
绩点 20%
二手商品交易 10%
技能 25%
学生工作 20%
学生罚款清单 -20%
学生违纪情况 -40%

3.2 大学生信用评价体系 UC 矩阵

图 3.1 大学生信用评级体系 UC 矩阵

从 UC 矩阵可以看出,整个系统根据需求分析被划分为 5 个部分,分别是教务子系统,二手商品交易子系统,学生个人认证子系统,图书子馆系统,信用评分子系统。

3.2.1 教务子系统

教务系统是每一个涉及学生的系统不可避免的部分。教务处方面讲学生的各项信息录入数据库,包括编号、姓名、密码、入学年份等等。学生通过账号密码登录后可以进行一系列操作。

首先是教务处对培养计划进行修改,看看是否需要修改开课数量,如果需要则更新有关课程上限。

之后教师进行选课。教师根据培养计划,选择课程同时生产教师选课表。每节课都会有相应的教师选课上限,如果高于这个上限,教师则不可选课。学生根据教师选课的情况自行选择课程。教务处根据每节课的选择情况安排教室,如果选课的人过少,则取消该课程。通过教务处确认的课程,学生可以查看到自己的课程安排情况,在何处上课,什么时候上课等等。每个学期中期,教务处会提醒任课教师安排期末考核方式,例如上传试卷,随后进行审卷等操作,最后安排考试教室。教务处会根据教室考试学生的容量安排教师,保证学生与学生之间的间隔。

考试期间,如果有学生违纪作弊,一经发现,教师通过系统上传相应原因,取消其资格等等操作。

考试结束之后,教师根据一定的规则打分,输入学生选课表,生成成绩单。对于成绩大于 90 分且课程可以参与技能认证的课程,学生可以进行技能申请。如果教师同意了,那么可以得到相应的标识和加分。

下个学期开始时候,辅导员根据学生绩点的算术平均数对学生的成绩进行排名,一定比例的学生获得奖学金申请资格。学生点击申请之后,可以获得相应的记录和金额,金额会在学生账户中体现。

3.2.2 二手商品交易子系统

电子商务在中国迅速发展,网络将商品和顾客快速简单的联系起来。更加重要的就是提供了一个交换的平台。那么在校园内,提供一个交换的平台,可以极大的促进循环利用,降低学生开销。如果可以进一步开发和畅想的话,完全可以像早期的 Facebook 一样做成校内网,帮助同学间互相了解,互相认识,甚至共同创业。

学生可以发布商品,例如书籍,将部分页拍照时上传,让对方判断新旧以及是否有笔记,这是模仿先咸鱼的流程。辅导员则扮演了审核的角色,如果照片和商品实际不符合,贩卖商品违法违规,及时阻止。作为买家的学生,可以浏览被辅导员审核过的商品,根据预定的交易地点进行交易。之后改变各自账户中的金额。买家卖家的评价默认值为满分,用户选择的评价会是最终的结果,计入交易记录。

3.2.3 学生个人认证子系统

奖学金申请是辅导员发起的,所以不会放在学生申请子系统中。该系统包括学生技能认证的申请与批准,校外工作证明的申请与批准,学生工作、论文发表证明的申请与批准。

学生根据自己的实际情况发起申请,附上相关证明的电子版或者书面版本当面认证。认证之后可以该项加分可以算入总分当中。以技能认证为例,学生可以在自己的界面中看到分数大于 90 分,且可以参与认证的项目。提交申请后,教师可以根据该学生的表现选择是否通过申请。申请通过后,学生会得到相应的认证。

3.2.4 图书子馆系统

图书借阅是学生授信模块分数的主要来源,如果做好这块的系统尤为关键。学生可以通过系统查看到可以借阅的书籍,点击借阅后,改变这条书籍的属性为不可借阅。同时生成根据学生的学历,在借阅历史中插入一条借阅数据。例如本科生的借阅时长为 3 个月,研究生可以达到 5 个月。在借阅期限之内,学生可以前往图书馆,由图书馆管理员进行归还操作。但是如果没有按时归还,则会在罚款系统中生成一条记录,如果超过双倍的期限内没有归还,则强制执行罚款。当然考虑到学生对书籍的需求可能是长期的,也有可能是暂时遗忘,并非故意,所以可以想老师提出申请,如果认可老师同意了,则不用执行该罚款。学生也可以主动表示自己丢书了,进行相应的惩罚。

3.2.5 信用评分子系统

由上文可知,评分系统是由人才招募评分系统和银行放贷系统组成。在每个学期结算的时候,由辅导员发起,结算该学期所有相应的分数模块,得到最终的分数。以人才招募为例,

y_人才招募=F(学生年级,绩点,二手商品交易历史,技能,学生工作&论文,学生罚款清单,学生违纪情况)

在学期结束,辅导员发起结算,调用学生信息表,学生选课表,二手商品信息评价,技能认证表,学生工作和学生论文发表情况表,学生罚款清单,学生违纪情况,学生违法情况表数张表,根据上文中所描述的比例每个学生会得到一个分数。校外的社团体,可以通过一定的验证过程,得到查看学生分数的权限,从而做出判断。这个权限也可以当作营收的一部分,在未来,企业也可以通过支付一定的广告费用,增长曝光度,增加学生投递的比例。

3.2.6 其他

受到数据来源的限制,学生的银行流水和公安违法记录暂时无法获取,本系统中将这两块部分直接按照满分计算,但是接口依然会留给后面的同学进行开发。

第四章大学生信用评分系统业务流程分析

4.1 泳道图

泳道图是将模型中的活动按照职责组织起来。这种分配可以通过将活动组织成用线分开的不同区域来表示。由于它们的外观的缘故,这些区域被称作泳道。它可以方便的描述企业的各种业务流程,能够直观地描述系统的各活动之间的逻辑关系,利于用户理解业务逻辑。

4.2 图例

图 4.1 开始图例

表示开始和结束

图 4.2 文件图例

表示文件

图 4.3 动作图例

表示动作

图 4.4 业务流图例

表示业务流

4.3 子系统业务流程图

4.3.1 教务系统流程图

图 4.5 教务子系统泳道图

系统从教务处开始。教务处根据实际情况,选择是否要增开课程,如果需要就改变课程数量,则可以改变培养计划中各项课程的上限,从而限制教师选课。教师选课的时候,则根据培养计划和培养计划课程相对于的数量进行选择,如果当前数量已经等于上限,则教师页面将不会看到可选课程。教师课程选择完毕后,学生可以通过查看教师选课的结果从而生成学生选课表。但是由于教室尚未安排,所以教室这个属性是 null。教务处根据教室表,即教室的容量,安排教室。安排完成后改变教室的可用属性。如果选课人数过少,则取消这节课。

学期中旬,教务处安排教师上传考卷。教师上传试卷后,教务处会进行试卷审核。审核通过之后,安排学生进行考试。根据选课的人数安排考试教室,由于考试的座位和普通上课的作为有所不同,调用教室表属性的时候也不是同一个属性。安排妥当之后学生可以查看到自己的考试安排。

考试结束后,教师可以录入成绩。如果考试期间学生有作弊行为,老师也可以录入学生的作弊记录,记录在案。相应地,这么门课的成绩会变成 0 分。

学期结束之后,辅导员根据奖学金规则表对优秀学生进行评比。学生可以在自己的界面查看自己是否可以申请奖学金。点击确定后,奖学金会发放到各自的学生账户。

4.3.2 二手商品子系统业务流程图

图 4.6 二手商品子系统业务流程图

二手商品子系统是一个别具一格的创新设计,考虑到学生偶尔会冲动消费,通过类似于咸鱼的二手平台收回一定的成本,一定程度上缓和“剁手”带来的不利影响,同时,对于教科书之类的商品,循环利用,促进绿色发展。

从流程上,作为卖方的学生,发布商品,发布的内容包括但不限于商品名称,商品名称,商品原价(标明的价格),商品现价,交易地点,交易时间,联系方式,商品照片等等。为了保证商品的合法有效,必须通过辅导员审核这一环节。辅导员需要审核商品是否合法,时间是否合理,交易地点是否安全等操作,辅导员审核通过之后,方可交易。

作为买方的学生,在自己的界面可以看到被辅导员审核过的商品。点击相应的按钮后,款项从自己的金额中扣除。但是相应的款项不会直接打到卖方的账户。只有在交易按照原定计划进行的情况下,买房再次点击完成交易后,款项才会相应出现在卖方账户。之后,双方需要进行打分操作。卖方买方都需要为对方的行为进行评价,且短时间内互相不知道对方的打分。

交易结束之后,作为卖方和买方的评分都会计入各自的个人信用评级中。

4.3.3 学生个人申请子系统业务流程图

图 4.7 学生个人申请子系统业务流程图

从流程上而言,个人申请系统是比较简单的,不外乎调用规则表,申请,批准申请而言,但是犹豫申请的种类繁多,信息入口也比较繁杂,所以被单独做成一个子系统。

学生可以在自己的选课记录中,选择分数大于 90 分且在在培养计划中可以被认证的课程。选择后,在教室界面会出现相应的记录。教师可以根据对学生的印象进行确认或取消。教师确认之后,学生可以在自己的个人界面看到有关的记录。在加分系统中也会有所体现。

外校工作申请,需要外部文件的输入,例如实习证明。同时调用申请规则表,辅导员会对该条记录进行审核。审核通过后,学生也会获得相应的加分。如果审核不通过,学生也可以对该记录进行修改。

校内工作和论文发表同样调取相应的规则表,上传有关证明。这里的规则表可能比较复杂,例如学生会会长需要院团委的证明,A 级论文则需要出版社的有关证明。同样都交给辅导员进行审核。审核通过后,学生也会获得相应的加分[15]。

4.3.4 图书馆子系统业务流程图

图 4.8 图书馆子系统业务流程图

图书馆系统,作为整套系统中最为关键的部分,是信用分的主要来源。良好的读书习惯可以增强人的涵养,但是忘记归还或者丢书,就是非常不应该的事情了。

图书管理子系统从学生调用可借图书表单开始,生成借阅历史。如果学生在规定日期内归还,则仅仅修改可借书单中的属性,从而结束该条记录。如果学生逾期归还,同样修改可借书单中的属性,但同时生成一张罚款单。

学生也可以主动承认错误,比如书丢了。那么不再修改可借书单的属性因为该书已经无法再次借阅。同时,生成一张罚款清单。如果学生选择缴纳罚款,则扣除学生名下账户相应的金额。

当然我们也要考虑到有些学生没有归还书籍是因为教学用途,这种情况下可以申请向老师申请。只要得到老师的批准,就可以免去罚款。

4.3.5 信用评分子系统业务流程图

图 4.9 信用评分子系统业务流程图 1

图 4.10 信用评分子系统业务流程图 2

和奖学金一样,信用评分每个学期评价一次。综合每个学期、每个学年的表现,根据相应的规则给与评分。介于图中已经很清晰的表面需要调取的表单和生成的表单,在此不多做赘述。不过值得注意的是,两个评价体系所用的表不完全相同,在系统编写中,需要特别注意。

第五章大学生信用评分系统数据流程分析

5.1 数据流程图

5.1.1 数据流图图例

图 5.1 外部实体

表示外部实体

图 5.2 加工过程

表示加工过程

图 5.3 数据表单

表示数据表单

图 5.4 数据流

表示数据流

5.2 数据流程图

5.2.1 教务子系统数据流程图

图 5.5 教务子系统数据流程图

整套系统从教务处输入学生的信息开始。教务处方面,将学生信息输入数据库,包括学生姓名,密码,专业,辅导员等。教师在本系统中暂时不设计注册问题,因为这是一个信用系统,教师注册也应当属于教务处方面管辖,再次不多做重复。教师根据培养计划进行选课,教师选课完成后,轮到学生选课。学生通过账号密码登录后,根据教师选课表进行选课。选课之后生成学生选课表,当然学生选课表中,成绩一栏是空着的。学期结束后,教师对学生进行打分。如果考试期间有作弊行为,则学生成绩变为 0 分,并且将违纪记录计入考试违纪表。学期结束后,辅导员根据学生该学期的绩点的加权平均数,前 10% 的同学可以获得奖学金申请资格。学生可以点击申请,随后资金会注入学生的个人账户中。奖学金申请记录就会保留下来。

5.2.2 个人申请子系统数据流程图

图 5.6 个人申请子系统数据流程图

个人申请子系统就相对比较简单。技能申请子系统,根据学生的实际得分情况和课程技能申请情况,向老师发起个人技能申请。老师可以根据实际对于学生的了解,确认学生的申请。学生可以在个人界面看到自己技能的标签。

学生工作和校内工作,学生根据规则表选择自己的加分项目,生成论/学规则表。辅导员则要调用对应的表,根据实际情况,选择是否通过。

校外工作申请,则需要学生提交电子版的实习证明,填写对应的时间。辅导员判断两者是否相符,如果符合就点击确定。

这三大部分都会作为信用评分的重要组成部分,但是具体的得分情况还需要通过实际的数据再做打算。

5.2.3 二手商品子系统数据流程图

图 5.7 二手商品子系统数据流程图

二手商品子系统参照了著名二手商品交易平台咸鱼的运作模式。卖家上传商品,上传的时候进行,对于商品进行限制,从而达到商品合法合理的目的。在此系统内中,辅导员代替了其中审核的机制。首先作为卖家的学生发布自己的商品,当然也需要填写自己的联系方式,交易地点,原价和现价等等。等到辅导员审核之后,作为买家的用户可以看到可以购买的商品。点击购买后,买房的金额会减少,但是卖方的金额不会改变。等买方确认收货后,卖方才会收到相应的款项。完成支付后,买卖双方可以互相评价,如果不评价,分值则默认为 5 分。如果评价,则相应改变对应的分值。在此系统中,暂时不考虑交易不成功的可能性。

5.2.4 图书馆子系统数据流程图

图 5.8 图书馆子系统数据流程图

图书馆子系统的难点在于书籍归还的时候有不同的情况。

图书馆子系统从书籍的借阅开始。学生根据自己的学历调用借阅规则和可以借阅的书籍,点击借阅后,改变改书籍的状态同时生成借阅记录。

这其中有对于的开始借阅时间和最后归还时间。如果在最后归还日期之前前往图书馆归还,则改变对于借阅记录的归还情况,然后将可借阅数据的属性相应变为可借。

但是如果学生没有在规定的时间内还书,则使用逾期归还功能,生成学生罚款清单。同时,既然书籍已经归还,则改变书籍借阅历史中的相关属性,将书籍变为可借。当然学生可以对于逾期有异议,比如由于使用时间过长,只要向自己的认可老师,例如这里调用学生选课表中的老师,向他进行申诉。如果申诉通过,则不需要缴纳罚款,如果申诉不通过,依然不得不缴纳罚款。

如果逾期时间过长,或者学生主动承认,可以将书籍变为丢书。丢书之后,书籍属性不改变,借阅历史更变为已还。

如果书籍判定为丢书,则会直接扣除学生的金额。如果判定为逾期,由于还需要进行申诉,所以不会立即扣除。

5.2.5 信用评分子系统数据流程图

图 5.9 信用评分子系统数据流程图

最后,是信用评分子系统数据流程图,不过这部分的图是最为简单的。九张表,对应不同的维度,通过辅导员,生成贷款发放信用评分和人才招募信用评分。

5.3 第二层数据流程图

图 5.10 大学生信用评估系统第二层数据流程图

第二层数据流程图和可以体现子系统之间互相的关系,清楚这几者之间的关系有助于我们理清整套系统的合理性。

第六章大学生信用评估系统 ER 图

6.1ER 图

6.1.1 教务系统

图 6.1 教务系统 ER 图

一个辅导员对应多个学生,一个学生可以学习多门课程,一个老师教授多门课程,一个老师给予多个分数,一个学生获得多个分数。一个辅导员可以发起多个奖学金申请,一个学生只能通过一个奖学金申请。

6.1.2 二手商品交易

图 6.2 二手商品交易 ER 图

作为卖家的学生可以发布多个商品,一个辅导员可以审核多个商品,一个商品可以产生一条记录,作为买方的学生可以购买多个商品,购买之后,学生可以评价多条购买记录。

6.1.3 个人申请子系统

图 6.3 个人申请子系统 ER 图

一个学生对应多条学生选课记录,一个学生可以申请多个技能申请,一个老师可以批准多条技能申请。同样,一个学生可以进行多条论文学生工作申请和校外工作申请,一个辅导员可以进行多个申请的批准。

6.1.4 图书馆子系统

图 6.4 图书馆子系统 ER 图

这里都是一对多的关系。学生可以选择多本图书,可以归还多本图书,可以逾期归还多本图书,也可以承认丢失多本图书。一个学生可以根据借阅情况,生成多个借书记录。学生会因为逾期而提出多个申诉。一个教师也可以通过多个申诉。

6.1.5 信用评分子系统

图 6.6 信用评分子系统 ER 图

信用评分子系统的 ER 图相对比较简单,一个学生对应一个人才招募的信用评分,一个学生也对应这一个贷款方法的信用评分。一个辅导员可以发起多个信用评分。

第七章大学生信用评估系统实践

7.1 基础界面

图 7.1 基础界面

这是系统的 index 界面,在这里可以选择登录的身份。

图 7.2 学生登录界面

图 7.3 教师登录界面

图 7.3 辅导员登录界面

学生、老师、辅导员可以输入编号和密码进行登录。

图 7.4 学习登录后界面

学生登录后的页面

图 7.5 教师登录后界面

图 7.6 辅导员登录后的界面

辅导员登录后的界面。

图 7.7 教务处首页

教务处首页。

7.2 教务子系统实操界面

图 7.8 学生信息录入界面

教务处进行学生信息录入的工作,输入学生的姓名,专业,入学年份,密码,学历等等。学生金额默认为 100 元。

图 7.9 教师选课界面

在教师选课界面,教师可以点击选择,进行选课,如果超过上限,就不会出现在选课界面。可以看到这位老师只剩下一门课可以选择。

图 7.10 学生选课界面

学生选课界面,学生可以通过选择和取消进行选课。

图 7.11 录入学生成绩界面

教师录入学生成绩界面。教师可以根据学生的选课编号,对学生进行打分。

图 7.12 奖学金申请界面

学期结束后,辅导员会触发奖学金更新表的程序,随后学生会在自己的界面看到奖学金申领提示。

图 7.13 违纪上报界面

教师可以在这个界面中上报学生考试中的违纪情况

7.3 图书馆子系统界面实操

图 7.14 学生借阅界面

学生可以点击借阅,对书籍进行借阅。

图 7.15 图书归还界面

为了保证客观性,所以归还不能通过学生界面进行。因为图书归还在图书馆界面,这里为了便于设置权限,放在教务处类目下。

如果图书逾期,归还后,则会相应记录则会出现在对应学生的逾期罚款清单界面中。

图 7.16 逾期罚款界面

罚款金额和逾期天数有关。

学生可以点击罚款,随后金额会相应从自己的账户中扣除。当然也可以选择向老师进行申诉。

图 7.17 学生申诉界面

图 7.18 教师申诉界面

教师也可以看到相应的申诉。

图 7.19 学生丢书界面

学生可以承认自己丢书,点击丢失,自动扣除相应的价格,书籍不再出现在借阅界面。

7.4 二手商品交易子系统

图 7.20 学生商品发布界面

发布商品界面,学生可以发布商品名称,价格,原价,交易地点。

图 7.21 辅导员商品审核界面

辅导员商品审核界面中,辅导员点击确认,则商品可以被购买。

图 7.22 商品交易界面

在交易界面,作为买方的学生可以查看到辅导员审核之后的商品,点击购买,则商品变为售罄。

图 7.23 确认收货界面

在线下交易后,买方点击确认收货,金额才可以打入卖方账户。

图 7.24 买方评价

交易结束之后,买方可以对已经支付的订单进行评价。

图 7.25 卖方评价

交易结束之后,卖方可以对已经支付的订单进行评价。

7.5 个人申请子系统实操

图 7.26 学生申请技能界面

学生可以发起自己的技能申请,前提是分数大于 90 分,且该课程可以被申请。

图 7.27 学生申请技能界面

在教师界面,教师可以对发起的申请进行确认。

图 7.28 学生论文和学生工作认证清单

论文和学生校内工作认证,需要学生从加分规则表中选择。

图 7.29 学生论文和学生工作认证界面

学生可以发布自己的工作情况,等待辅导员确认。

图 7.30 学生工作通过界面

辅导员论文、学生工作申请批准界面,辅导员点击确定就可以更新确认属性。

图 7.31 论文和学生校内工作通过界面

学生工作审核清单,只有点击确认之后,相应的分数才会计入最后的评价。

7.6 信用评级子系统实操

图 7.32 信用评级子系统实操 1

如果改变该学生的某项得分,学期结束通过验证后,相应的数据和排名也会改变。

图 7.32 信用评级子系统实操 2

对于非学生而言,即需要查看学生成绩的用人单位和贷款发放机构,他们看到的界面是这样的:

图 7.33 信用评级子系统实操 3

考虑到实际的效果,笔者将学生的总分归类放在一个界面,供校外人员参考和使用,并且在学生界面加入雷达图,便于学生理解和弥补自身的不足,同时,在 5 月 1 日期间,笔者修改了网站的菜单栏,用 dropdown 样式,将不同的内容归类起来,便于操作,也更加有利于理解网站逻辑。

图 7.34 信用评级子系统实操 4

可以看到学生 2,xxc 同学在绩点和学生罚款情况方面表现良好,但是校外工作等方面需要加强。如此,学生就比较容易理解。

同时,辅导员触发学期信用分结算的按钮也加入了辅导员界面。

图 7.35 信用评级子系统实操 5

辅导员可以发起总体评价、奖学金申请、人才招募信用分、贷款发放信用分这四种。

图 7.36 信用评级子系统实操 6

其他四类界面相同,在此就不再重复了。

外部人员看到的界面,则是如下。

图 7.37 信用评级子系统实操 7

图 7.38 信用评级子系统实操 8

可以发现,这两个维度中,同一个学生的得分都是不同的。这是因为,这其中的计算逻辑有所不同。在上文第三章已经讲述了详细的算分逻辑,但是由于实际操作难度极大,偏离了系统的本质,所以提出以下的算法。

图 7.39 实际分数分布

每个小维度都是 200 分的总分,每个维度可以被学生个人查看,但是不能被校外的人查看,是为了保护学生的隐私。

两侧的百分比,则是在总分中占据的百分比,在人才招募评分中(左),奖学金不计入评分,历史工作的占比达到 20%,诚信也是最为重要的维度。

第八章总结与展望

虽然完成了整套系统的设计与实施,但是值得改进的地方还很多。例如以蚂蚁花呗为参考,整套信用评分的关键还只是集中在信息收集方面,例如教务子系统,图书管理子系统等等,但是学生能够通过信用评分子系统具体得到什么好处,还尚未可知。蚂蚁花呗可以信用借伞,租车,然而笔者的系统却无法有类似的功能。在未来,这个系统可以往实用性的角度发展。

所以,我认为,未来蚂蚁花呗可以大肆进入校园,和学生的校内表现结合起来。当然笔者也很希望看到专业的征信公司,将目标瞄向在校大学生,不仅可以提升大学生的授信意识,更重要的是让大学生可以从较高的信用分中得到乐趣,得到一定的便利。否则,枯燥的征信体系往往不能达到想要的效果。

参考文献

杜淼淼.美国个人信用评分系统及其启示[J].南方金融,2008(08):63-66.

姜琳.美国 FICO 评分系统述评[J].商业研究,2006(20):81-84.

鞠传霄.互联网时代的个人信用评估机制研究——以芝麻信用为例[J].现代管理科学,2018(05):109-111.

阮玉芳.个人信用报告展示问题研究——对《征信业管理条例》的思考[J].征信,2018,36(09):28-31.

钱颖懿,钮珏,金妍乐,田益坤.松江大学城学生个人信用系统设计与实现[J].科技创新导报,2018,15(11):136-142.

None.EconomicAnthropology[J].2018,5(1):2-5.

DeyS.Creditlimitmanagementusingaction-effectmodels[C]//FinancialTheoryandEngineering(ICFTE),2010InternationalConferenceon.IEEE,2010.

刘新海,丁伟.大数据征信应用与启示——以美国互联网金融公司 ZestFinance 为例[J].清华金融评论,2014(10):93-98.

沈小袷.论胜任力理论在大学生综合素质评价中的应用[J].湘潮(下半月)(理论),2008(06):12-13.

范君晖.应用型高校大学生学习动力激励机制[J].高教论坛,2012(09):77-78+100.

杨一,李梦雪,朱沛东,高翔.大学生理财认知及行为的调查分析——以南京大学生为例[J].新经济,2014(17):17-18.

何绚.关于大学生义工活动的思考[J].科教文汇(上旬刊),2013(09):177-178.

赵晓兵,刘京娟.开展网络运用道德教育培养大学生守法精神[J].才智,2011(31):288.

陆建香,张文元.高校个人信用档案建立及管理[J].档案时空(业务版),2006(10):38-39.

杨秀春.浅谈建立个人信用档案的紧迫性[J].内蒙古师范大学学报(哲学社会科学版),2002(S2):164-168.

致谢

感谢这几个月内朱小栋副教授对我的悉心指导和帮助,提供了之前研究的方法。同时,该项研究其实从上个学期就开始了,我与吴靓学长一起完成的对于南航和上理部分学生的信用评分可视化操作,包括了雷达图,各自排名等等。

图 9.1 之前的研究成果 1

图 9.2 之前的研究成果 2

图 9.3 之前的研究成果 3

图 9.4 之前的研究成果 4

可以看出,研究的维度还是很多的,但是由于这是 Django 框架的系统,所以有些无法快速的、实现。如果有机会,那么还是会把该系统更加的完善。

附录

下述代码为 views.py 文件,即方法文件中的完整代码:

from django.shortcuts import render,redirect,HttpResponse
from mybishe import models
from django.db.models import F
import datetime
from django.db.models import Sum,Count,Max,Min,Avg
import matplotlib.pyplot as plt
import numpy as np
def stu_info(request):if request.method == 'GET':majors = models.Major.objects.all()educations = models.BorrowRule.objects.all()instructors = models.Instructor.objects.all()return render(request,'jwc/stu_info.html',{'majors' : majors,'educations': educations,'instructors': instructors})if request.method == 'POST':majors = models.Major.objects.all()educations = models.BorrowRule.objects.all()instructors = models.Instructor.objects.all()stu_pwd = request.POST.get('stu_pwd')stu_name = request.POST.get('stu_name')year = request.POST.get('year')major_name = request.POST.get('major_id')money = 100stu_edu = request.POST.get('stu_edu')instructor_id = request.POST.get('instructor_id')students = models.Student(stu_pwd = stu_pwd,stu_name=stu_name,stu_year=year,major_name=major_name,stu_edu=stu_edu,instructor_id=instructor_id,money = money)students.save()return render(request,'jwc/stu_info.html',{'majors' : majors,'educations': educations,'instructors': instructors})def stu_login(request):if request.method == 'GET':return render(request, 'student/stu_login.html')if request.method == 'POST':user = models.Student.objects.get(stu_id = request.POST['stu_id'])request.session['stu_name'] = user.stu_namerequest.session['stu_id'] = user.stu_idreturn redirect('/stu_index/')def stu_library_borrow(request):borrows = models.Borrow.objects.filter(status ='0')return render(request,'student/stu_library_borrow.html',{'borrows':borrows})def stu_borrow_order(request):mybook = models.Borrow.objects.get(book_id = request.GET.get('book_id',None))stu_id = request.session.get('stu_id',None)book_id = request.GET.get('book_id',None)now = datetime.datetime.now()delta = datetime.timedelta(days=90)n_days = now + deltaprice = mybook.priceborrow_order = models.BorrowOrder(stu_id = stu_id,book_id=book_id,startdate=now,supposedate = n_days,return_status = 0,price = price)mybook.status = '1'mybook.save()borrow_order.save()borrows = models.Borrow.objects.filter(status ='0')return render(request,'student/stu_library_borrow.html',{'borrows':borrows})def library_return(request):orders = models.BorrowOrder.objects.filter(return_status = '0')return render(request,'jwc/library_return.html',{'orders':orders})def stu_book_return(request):book_id = request.GET.get('book_id',None)borrow_order = models.BorrowOrder.objects.get(return_status = '0', book_id = book_id)models.Borrow.objects.filter(book_id = book_id).update(status = '0')now = datetime.datetime.now()borrow_order.return_status = 1borrow_order.actdate = datetime.datetime.now()if datetime.datetime.now() > borrow_order.supposedate:pen_money = (datetime.datetime.now() - borrow_order.supposedate).daysborrow_id = borrow_order.borrow_idstu_id = request.session.get('stu_id')penatly = models.Penalty(borrow_id = borrow_id,pen_money = pen_money,stu_id = stu_id,pen_type="逾期",paid = 0, appeal = 0)penatly.save()else:passborrow_order.save()orders = models.BorrowOrder.objects.filter(return_status = '0')return render(request,'jwc/library_return.html',{'orders':orders,'now':now})def stu_sp_certification(request):if request.method =='GET':certifications = models.Rules.objects.all()return render(request,'student/stu_sp_certification.html',{'certifications':certifications})if request.method =='POST':rule_name = request.POST.get('rule_name')print(rule_name)stu_id = request.session.get('stu_id')comment = request.POST.get('comments')print(comment)getrule = models.Rules.objects.get(rule_name = rule_name)rule_id = getrule.rule_idscore = getrule.scoreaddorder = models.AddCreditOrder(stu_id = stu_id,rule_id = rule_id,rule_name = rule_name,score = score,status = 0,comment = comment)addorder.save()certifications = models.Rules.objects.all()return render(request,'student/stu_sp_certification.html',{'certifications':certifications})      def stu_products(request):if request.method =='POST':pro_name = request.POST.get('product_name')price_org = request.POST.get('price_org')price_cur = request.POST.get('price_cur')location = request.POST.get('location')seller_id = request.session.get('stu_id',None)status = 0products = models.Products(pro_name = pro_name,price_org = price_org,price_cur = price_cur,seller_id = seller_id,location = location,status = status,paid =0)products.save()return render(request,'student/stu_products.html')if request.method =="GET":return render(request,'student/stu_products.html')def instructor_pro_review(request):products = models.Products.objects.filter(status=0)return render(request,'instructor/instructor_pro_review.html',{'products':products})def stu_pro_purchase(request):products = models.Products.objects.filter(status=1)return render(request,'student/stu_pro_purchase.html',{'products':products})def buy_products(request):pro_id = request.GET.get('pro_id',None)buyer_id = request.session.get('stu_id')myproduct = models.Products.objects.get(pro_id = pro_id)price_cur = myproduct.price_curseller_id = myproduct.seller_idmyproduct.paid = 1myproduct.save()moneychange = models.Student.objects.get(stu_id= buyer_id)moneychange.money -= price_curmoneychange.save()addproduct = models.Orders(product_id = pro_id,buyer_id = buyer_id,price = price_cur,received = 0,seller_id = seller_id)addproduct.save()products = models.Products.objects.filter(status=1)return render(request,'student/stu_pro_purchase.html',{'products':products})def teacher_choose_course(request):courses = models.CultivatePlan.objects.filter(class_field__lt=F('limit'))return render(request,'teacher/teacher_choose_course.html',{'courses':courses})def stu_choose_course(request):students = models.StudentChoice.objects.filter(stu_id=request.session.get("stu_id"))stu_list = []for student in students:stu_list.append(student.course_id)courses = models.TeacherChoice.objects.all()return render(request,'student/stu_choose_course.html',{'courses':courses,'stu_list':stu_list})def stu_book_lost(request):books = models.BorrowOrder.objects.filter(stu_id = request.session.get('stu_id'),return_status = 0)return render(request,'student/stu_book_lost.html',{'books':books})def book_lost(request):borrow_id = request.GET.get('borrow_id',None)mybook = models.BorrowOrder.objects.get(borrow_id=borrow_id)mybook.actdate = datetime.datetime.now()mybook.return_status = 1stu_id = mybook.stu_idstudents = models.Student.objects.get(stu_id = stu_id)price = mybook.pricestudents.money = students.money - pricepenatly = models.Penalty(borrow_id = borrow_id,stu_id = stu_id, pen_money = price,pen_type = "丢书")mybook.save()penatly.save()students.save()books = models.BorrowOrder.objects.filter(stu_id = request.session.get('stu_id'),return_status = 0)return render(request,'student/stu_book_lost.html',{'books':books})def teacher_give_score(request):if request.method == 'GET':students = models.StudentChoice.objects.filter(score__isnull=True)return render(request,'teacher/teacher_give_score.html',{'students':students})if request.method =='POST':student_choice_id = request.POST.get('student_choice_id')print(student_choice_id)score = request.POST.get('score')print(score)addscore = models.StudentChoice.objects.get(student_choice_id=student_choice_id)addscore.score = scoreaddscore.save()students = models.StudentChoice.objects.filter(score__isnull=True)return render(request,'teacher/teacher_give_score.html',{'students':students})def stu_skills_order(request):courses = models.StudentChoice.objects.filter(score__gte=90, stu_id = request.session.get('stu_id'),status = 0)return render(request,'student/stu_skills_order.html',{'courses':courses})def instructor_sp_confirm(request):rules = models.AddCreditOrder.objects.filter(status = 0)return render(request,'instructor/instructor_sp_confirm.html',{"rules":rules})def add_review(request):add_id = request.GET.get('add_id')c_order = models.AddCreditOrder.objects.get(add_id=add_id)c_order.status = 1c_order.save()rules = models.AddCreditOrder.objects.filter(status = 0)return render(request,'instructor/instructor_sp_confirm.html',{"rules":rules})def teacher_login(request):if request.method == 'GET':return render(request, 'teacher/teacher_login.html')if request.method == 'POST':user = models.Teacher.objects.get(tea_id = request.POST['teacher_id'])request.session['teacher_name'] = user.teacher_namerequest.session['teacher_id'] = user.tea_idreturn render(request,'teacher/teacher_index.html')def teacher_index(request):return render(request,'teacher/teacher_index.html')def jwc_index(request):return render(request,'jwc/jwc_index.html')def index(request):return render(request,'index.html')def instructor_login(request):if request.method == 'GET':return render(request, 'instructor/instructor_login.html')if request.method == 'POST':user = models.Instructor.objects.get(instructor_id = request.POST['instructor_id'])request.session['instructor_name'] = user.instructor_namerequest.session['instructor_id'] = user.instructor_idreturn render(request,'instructor/instructor_pro_review.html')def teacher_choose_order(request):cultivate = models.CultivatePlan.objects.get(course_id = request.GET.get('course_id',None))cultivate.class_field += 1status = 0time = cultivate.timeteacher_id = request.session.get('teacher_id',None)certification = cultivate.certificationyear = 2019teacher_choose = models.TeacherChoice(course_year = year,status = status,time = time,certification = certification,teacher_id = teacher_id,course_id = request.GET.get('course_id'))teacher_choose.save()cultivate.save()courses = models.CultivatePlan.objects.filter(class_field__lt=F('limit'))return render(request,'teacher/teacher_choose_course.html',{'courses':courses})def stu_choose_order(request):teacher_course = models.TeacherChoice.objects.get(teacher_choice_id = request.GET.get('teacher_choice_id',None))teacher_choice_id = request.GET.get('teacher_choice_id',None)stu_id = request.session.get("stu_id")course_id = teacher_course.course_idsave_course = models.StudentChoice(teacher_choice_id= teacher_choice_id,stu_id = stu_id, course_id =course_id, status=0)save_course.save()students = models.StudentChoice.objects.filter(stu_id=request.session.get("stu_id"))stu_list = []for student in students:stu_list.append(student.course_id)courses = models.TeacherChoice.objects.all()return render(request,'student/stu_choose_course.html',{'courses':courses,'stu_list':stu_list})def stu_job_certification(request):if request.method == 'GET':return render(request,'student/stu_job_certification.html')if request.method == 'POST':stu_id = request.session.get('stu_id')job_name = request.POST.get("job_name")days = request.POST.get("days")jobs = models.JobCertification(stu_id = stu_id,job_name = job_name,days=days,status = 0)jobs.save()return render(request,'student/stu_job_certification.html')def job_review(request):job_id = request.GET.get('job_id')thisjob = models.JobCertification.objects.get(job_id = job_id)thisjob.status = 1thisjob.save()jobs = models.JobCertification.objects.all()return render(request,'instructor/instructor_job_review.html',{'jobs':jobs})def instructor_job_review(request):jobs = models.JobCertification.objects.all()return render(request,'instructor/instructor_job_review.html',{'jobs':jobs})def received_products(request):product_id = request.GET.get('product_id')myproduct = models.Orders.objects.get(product_id = product_id)myproduct.received = 1price = myproduct.priceseller_id = myproduct.seller_idmyproduct.save()stu_id = request.session.get('stu_id')moneychange = models.Student.objects.get(stu_id= seller_id)moneychange.money += pricemoneychange.save()products = models.Orders.objects.filter(buyer_id =stu_id)return render(request,'student/stu_cart.html',{'products':products})def stu_cart(request):stu_id = request.session.get('stu_id')products = models.Orders.objects.filter(buyer_id =stu_id)return render(request,'student/stu_cart.html',{'products':products})def stu_pay_penalty(request):stu_id = request.session.get('stu_id')penaltys = models.Penalty.objects.filter(paid = 0, appeal = 0, stu_id = stu_id)return render(request,'student/stu_pay_penalty.html',{'penaltys':penaltys})def pay_penalty(request):stu_id = request.session.get('stu_id')stu_pen_id = request.GET.get('stu_pen_id')mypen = models.Penalty.objects.get(stu_pen_id=stu_pen_id)price = mypen.pen_moneymypen.paid = 1mypen.save()moneylose = models.Student.objects.get(stu_id = stu_id)moneylose.money = moneylose.money-pricemoneylose.save()penaltys = models.Penalty.objects.filter(paid = 0, appeal = 0, stu_id = stu_id)return render(request,'student/stu_pay_penalty.html',{'penaltys':penaltys})    def stu_course(request):stu_id = request.session.get('stu_id')courses = models.StudentChoice.objects.filter(stu_id = stu_id)return render(request,'student/stu_course.html',{'courses':courses})def stu_course_delete(request):models.StudentChoice.objects.get(student_choice_id = request.GET.get('student_choice_id',None)).delete()stu_id = request.session.get('stu_id')courses = models.StudentChoice.objects.filter(stu_id = stu_id)return render(request,'student/stu_course.html',{'courses':courses})def teacher_course(request):teacher_id = request.session.get('teacher_id')courses = models.TeacherChoice.objects.filter(teacher_id = teacher_id)return render(request,'teacher/teacher_course.html',{'courses':courses})def stu_buyer_comment(request):stu_id =request.session.get('stu_id')if request.method == 'GET':buyers = models.Orders.objects.filter(buyer_comm__isnull=True,buyer_id = stu_id)return render(request,'student/stu_buyer_comment.html',{'buyers':buyers})if  request.method == 'POST':order_id = request.POST.get('order_id')score = request.POST.get('score')addscore = models.Orders.objects.get(order_id = order_id)addscore.buyer_comm = scoreaddscore.save()buyers = models.Orders.objects.filter(buyer_comm__isnull=True,buyer_id = stu_id)return render(request,'student/stu_buyer_comment.html',{'buyers':buyers})def stu_seller_comment(request):stu_id =request.session.get('stu_id')if request.method == 'GET':buyers = models.Orders.objects.filter(seller_comm__isnull=True,seller_id = stu_id)return render(request,'student/stu_seller_comment.html',{'buyers':buyers})if  request.method == 'POST':order_id = request.POST.get('order_id')score = request.POST.get('score')addscore = models.Orders.objects.get(order_id = order_id)addscore.seller_comm = scoreaddscore.save()buyers = models.Orders.objects.filter(seller_comm__isnull=True,seller_id = stu_id)return render(request,'student/stu_seller_comment.html',{'buyers':buyers})def pro_review(request):pro_id = request.GET.get('pro_id')changestatus = models.Products.objects.get(pro_id = pro_id)changestatus.status =1changestatus.save()products = models.Products.objects.filter(status = 0)return render(request,'instructor/instructor_pro_review.html',{'products':products})def skills_order(request):student_choice_id = request.GET.get('student_choice_id')changestatus = models.StudentChoice.objects.get(student_choice_id=student_choice_id)changestatus.status = 1changestatus.save()score = 100year = 2019stu_id = request.session.get('stu_id')status = 0addcredit = models.Credit(stu_id = stu_id,year =year,score = score, status =status)addcredit.save()courses = models.StudentChoice.objects.filter(score__gte=90, stu_id = request.session.get('stu_id'),status = 0)return render(request,'student/stu_skills_order.html',{'courses':courses})def teacher_skills_review(request):credits = models.Credit.objects.filter(status = 0)return render(request,'teacher/teacher_skills_review.html',{'credits':credits})def skills_review(request):credit_id = request.GET.get('credit_id')changestatus = models.Credit.objects.get(credit_id = credit_id)changestatus.status = 1changestatus.save()credits = models.Credit.objects.filter(status = 0)return render(request,'teacher/teacher_skills_review.html',{'credits':credits})def instructor_index(request):losts = models.BorrowOrder.objects.filter(return_status = 0)counts = 0for lost in losts:if (datetime.datetime.now()-lost.supposedate).days >180:lost.actdate = datetime.datetime.now()lost.return_status = 1price = lost.priceborrow_id =lost.borrow_idstu_id = lost.stu_idaddlost = model.Penalty(stu_id = stu_id,pen_money = price,type = '丢书')student = model.Student.objects.get(stu_id = stu_id)student.money -= pricestudent.save()lost.save()addlost.save()counts = count+1message = "有{}个借阅被判定为自动丢书".format(counts)return render(request,'instructor/instructor_index.html',{'message':message})def stu_appeal(request):if request.method == 'GET':teachers =models.Teacher.objects.all()appeals =models.Penalty.objects.filter(stu_id = request.session.get('stu_id'),paid =0)return render(request,'student/stu_appeal.html',{'teachers':teachers,'appeals':appeals})if request.method == 'POST':order_id = request.POST.get('order_id')teacher_id = request.POST.get('tea_id')addpen = models.PenAppeal(stu_pen_id = order_id,status = 0, teacher_id = teacher_id)changestatus = models.Penalty.objects.get(stu_pen_id = order_id)changestatus.appeal = 1changestatus.save()       addpen.save()teachers =models.Teacher.objects.all()appeals =models.Penalty.objects.filter(stu_id = request.session.get('stu_id'),paid =0)return render(request,'student/stu_appeal.html',{'teachers':teachers,'appeals':appeals})def teacher_pen_review(request):pens = models.PenAppeal.objects.filter(teacher_id = request.session.get('teacher_id'),status =0)return render(request,'teacher/teacher_pen_review.html',{'pens':pens})def pen_review(request):pen_id =request.GET.get('pen_id')changestatus = models.PenAppeal.objects.get(pen_appeal_id = pen_id)changestatus.status = 1changestatus.save()pens = models.PenAppeal.objects.filter(teacher_id = request.session.get('teacher_id'),status =0)return render(request,'teacher/teacher_pen_review.html',{'pens':pens})def teacher_cheat(request):if request.method == 'GET':students = models.StudentChoice.objects.filter(score__isnull=True)return render(request,'teacher/teacher_cheat.html',{'students':students})if request.method == 'POST':student_choice_id = request.POST.get('student_choice_id')student =models.StudentChoice.objects.get(student_choice_id=student_choice_id)student.score =0stu_id = student.stu_idstudent.save()addcheat = models.Cheat(stu_id = stu_id,student_choice_id = student_choice_id)addcheat.save()students = models.StudentChoice.objects.filter(score__isnull=True)return render(request,'teacher/teacher_cheat.html',{'students':students})def scholarship(request):if request.method == 'GET':return render(request,'instructor/scholarship.html')if request.method == 'POST':cleartable = models.Scholarship.objects.all()cleartable.delete()students = models.Student.objects.all()stu_id_list = []scholarship_list=[]basic_money = 1000i = 0for student in students:stu_id_list.append(student.stu_id)print(stu_id_list)for stu_id in stu_id_list:find_student = models.StudentChoice.objects.filter(score__isnull=False,stu_id = stu_id).aggregate(Avg("score"))scholarship_list.append([stu_id,find_student['score__avg']])print(scholarship_list)new_scholarship_list=sorted(scholarship_list, key=lambda x:x[1], reverse = True )print(new_scholarship_list)for _list in new_scholarship_list:if i < 3:addscholarship = models.Scholarship(stu_id = _list[0],status = 0, money = basic_money)addscholarship.save()print(_list)print(basic_money)basic_money -= 300i +=1 else:breakreturn render(request,'instructor/scholarship.html')def stu_scholarship(request):scholarships = models.Scholarship.objects.filter(stu_id = request.session.get('stu_id'),status =0)return render(request,'student/stu_scholarship.html',{'scholarships':scholarships})def sch_order(request):sch_id = request.GET.get('sch_id')mysch = models.Scholarship.objects.get(sch_id = sch_id)mysch.status = 1stu_id = mysch.stu_idmoney = mysch.moneyaddmoney = models.Student.objects.get(stu_id = stu_id)addmoney.money += moneyaddmoney.save()mysch.save()scholarships = models.Scholarship.objects.filter(stu_id = request.session.get('stu_id'),status =0)return render(request,'student/stu_scholarship.html',{'scholarships':scholarships})def test_grade(year):if datetime.datetime.now().month in [1,2,3,4,5,6,7,8]:i = 1else:i = 0return (datetime.datetime.now().year-year)-i+1def credit_score(request):if request.method == 'GET':return render(request,'instructor/credit_score.html')if request.method =='POST':cleartable = models.SepScore.objects.all()cleartable.delete()stu_scholarship = []stu_gpa = []stu_paper = []stu_job =[]stu_cheat = []stu_c =[]stu_credit=[]stu_penalty=[]stu_total_labor = []stu_total_debt =[]students = models.Student.objects.all()for student in students:stu_id = student.stu_idthisstu = models.Student.objects.get(stu_id = stu_id)grade = test_grade(int(thisstu.stu_year))scholarship = test_none(models.Scholarship.objects.filter(status =1, stu_id = stu_id).aggregate(Sum("money"))['money__sum'])if scholarship == 0:scholarship = 100else:scholarship = scholarship/10 +100if scholarship>200:scholarship =200stu_scholarship.append([stu_id,scholarship])gpa = test_none(models.StudentChoice.objects.filter(score__isnull=False,stu_id = stu_id).aggregate(Avg("score"))['score__avg'])stu_gpa.append([stu_id,gpa*2])paper = test_none(models.AddCreditOrder.objects.filter(status =1, stu_id = stu_id).aggregate(Sum("score"))['score__sum'])if paper == 0:paper = 100else:paper = 100+paperif paper > 200:paper =200stu_paper.append([stu_id,paper])cheat = models.Cheat.objects.filter(stu_id = stu_id).count()if cheat > 0:cheat = 0else:cheat =200     stu_cheat.append([stu_id,cheat])credit= models.Credit.objects.filter(stu_id = stu_id,status = 1).count()if credit ==0:credit =100else:credit = 100+20*creditif credit > 200:credit = 200stu_credit.append([stu_id,credit])job = test_none(models.JobCertification.objects.filter(stu_id = stu_id,status = 1).aggregate(Sum('days'))['days__sum'])    if job == 0:job = 50else:job = 50+jobif job > 200:job =200stu_job.append([stu_id,job])s_c = models.Orders.objects.filter(buyer_id = stu_id,seller_comm__isnull=False).aggregate(Avg('seller_comm'))['seller_comm__avg']     b_c = models.Orders.objects.filter(seller_id = stu_id,buyer_comm__isnull=False).aggregate(Avg('buyer_comm'))['buyer_comm__avg']s_c = test_none(s_c)b_c = test_none(b_c)if (s_c+b_c) == 0:s_b = 200else:s_b = s_c+b_cstu_c.append([stu_id,s_b])penatly = test_none(models.Penalty.objects.filter(stu_id = stu_id,paid =1).aggregate(Sum('pen_money'))['pen_money__sum'])yourpen = penatlyif penatly == 0:newscore =200else:newscore = 200-yourpen*5if newscore <0:newscore =0stu_penalty.append([stu_id,newscore])stu_scholarship = sorted_rank(stu_scholarship)score_type = 'stu_scholarship'savedata(stu_scholarship,score_type)stu_gpa = sorted_rank(stu_gpa)savedata(stu_gpa,'stu_gpa')stu_paper = sorted_rank(stu_paper)savedata(stu_paper,'stu_paper')stu_job = sorted_rank(stu_job)savedata(stu_job,'stu_job')stu_cheat = sorted_rank(stu_cheat)savedata(stu_cheat,'stu_cheat')stu_c = sorted_rank(stu_c)savedata(stu_c,'stu_c')stu_credit = sorted_rank(stu_credit)savedata(stu_credit,'stu_credit')stu_penalty = sorted_rank(stu_penalty)savedata(stu_penalty,'stu_penalty')print(stu_scholarship,stu_gpa,stu_paper,stu_job,stu_cheat,stu_c,stu_credit,stu_penalty,sep ='\n')return render(request,'instructor/credit_score.html')def savedata(yourlist,score_type):for ylist in yourlist:savedata = models.SepScore(score_type =score_type ,stu_id = ylist[0],score =ylist[1],rank = ylist[2])savedata.save()    def test_none(number):if number == None:number = 0else:number = numberreturn numberdef stu_index(request):stu_id = request.session.get('stu_id')student = models.Student.objects.get(stu_id = stu_id)money = student.moneygrade = test_grade(int(student.stu_year))name = student.stu_namescholarship = models.SepScore.objects.get(score_type='stu_scholarship',stu_id=stu_id)gpa = models.SepScore.objects.get(score_type = 'stu_gpa',stu_id = stu_id)paper = models.SepScore.objects.get(score_type = 'stu_paper',stu_id = stu_id)job =  models.SepScore.objects.get(score_type = 'stu_job',stu_id = stu_id)cheat = models.SepScore.objects.get(score_type = 'stu_cheat',stu_id = stu_id)c = models.SepScore.objects.get(score_type = 'stu_c',stu_id = stu_id)credit = models.SepScore.objects.get(score_type = 'stu_credit',stu_id = stu_id)penalty = models.SepScore.objects.get(score_type = 'stu_penalty',stu_id = stu_id)print(stu_id,money,grade,name)data = np.array([scholarship.score,gpa.score,paper.score,job.score,cheat.score,c.score,credit.score,penalty.score])dataLenth = 8labels = np.array(['奖学金','绩点','学生工作','校外工作','校内纪律','二手商品','技能','罚款情况'])print(data)angles = np.linspace(0, 2*np.pi, dataLenth, endpoint=False)data = np.concatenate((data, [data[0]]))angles = np.concatenate((angles, [angles[0]]))fig = plt.figure()ax = fig.add_subplot(111, polar=True)ax.set_rlim(0,200)ax.plot(angles, data,'bo-', linewidth=2)ax.fill(angles, data, facecolor='r', alpha=0.25)ax.set_thetagrids(angles * 180/np.pi, labels, fontproperties="SimHei")ax.set_title("{}的雷达图".format(student.stu_name), va='bottom', fontproperties="SimHei")ax.grid(True)plt.savefig('C:/Users/16437/Desktop/毕设/bishe/static/img/test1.jpg')return render(request,'student/stu_index.html',{'grade':grade,'money':money,'name':name,'scholarship':scholarship,'gpa':gpa,'paper':paper,'job':job,'cheat':cheat,'c':c,'credit':credit,'penalty':penalty})def sorted_rank(yourlist):newlist = sorted(yourlist,key = lambda x:x[1],reverse =True)for i in range(len(yourlist)):newlist[i].append(i+1)return newlistdef labor_score(request):if request.method == 'GET':labors = models.LaborScore.objects.all()return render(request,'instructor/labor_score.html')if request.method =='POST':students = models.Student.objects.all()score_list = []for student in students:stu_id = student.stu_idstu_name = student.stu_namethisstu = models.Student.objects.get(stu_id = stu_id)grade = test_grade(int(thisstu.stu_year)) stu_scholarship = models.SepScore.objects.get(stu_id = stu_id,score_type = 'stu_scholarship').scorestu_gpa = models.SepScore.objects.get(stu_id = stu_id,score_type = 'stu_gpa').scorestu_paper = models.SepScore.objects.get(stu_id = stu_id,score_type = 'stu_paper').scorestu_job = models.SepScore.objects.get(stu_id = stu_id,score_type = 'stu_job').scorestu_cheat = models.SepScore.objects.get(stu_id = stu_id,score_type = 'stu_cheat').scorestu_c = models.SepScore.objects.get(stu_id = stu_id,score_type = 'stu_c').scorestu_credit = models.SepScore.objects.get(stu_id = stu_id,score_type = 'stu_credit').scorestu_penalty = models.SepScore.objects.get(stu_id = stu_id,score_type = 'stu_penalty').scorestu_score = 0.05*grade*50+0*stu_scholarship+0.1*stu_gpa+0.05*stu_paper+0.2*stu_job+0.2*stu_cheat+0*stu_c+0.2*stu_credit+0.2*stu_penaltyscore_list.append([stu_id,stu_name,stu_score])print(score_list)newlist = sorted(score_list,key = lambda x:x[2],reverse = True)for i in range(len(newlist)):newlist[i].append(i+1)add_labor_score(newlist)return render(request,'instructor/labor_score.html')def labor_index(request):labors = models.LaborScore.objects.all()return render(request,'labor_index.html',{'labors':labors})def add_labor_score(yourlists):cleartable = models.LaborScore.objects.all()cleartable.delete()for yourlist in yourlists:savedata = models.LaborScore(stu_id = yourlist[0],stu_name = yourlist[1],score = yourlist[2],rank = yourlist[3])savedata.save()def debt_score(request):if request.method == 'GET':labors = models.DebtScore.objects.all()return render(request,'instructor/debt_score.html')if request.method =='POST':students = models.Student.objects.all()score_list = []for student in students:stu_id = student.stu_idstu_name = student.stu_namethisstu = models.Student.objects.get(stu_id = stu_id)grade = test_grade(int(thisstu.stu_year)) stu_scholarship = models.SepScore.objects.get(stu_id = stu_id,score_type = 'stu_scholarship').scorestu_gpa = models.SepScore.objects.get(stu_id = stu_id,score_type = 'stu_gpa').scorestu_paper = models.SepScore.objects.get(stu_id = stu_id,score_type = 'stu_paper').scorestu_job = models.SepScore.objects.get(stu_id = stu_id,score_type = 'stu_job').scorestu_cheat = models.SepScore.objects.get(stu_id = stu_id,score_type = 'stu_cheat').scorestu_c = models.SepScore.objects.get(stu_id = stu_id,score_type = 'stu_c').scorestu_credit = models.SepScore.objects.get(stu_id = stu_id,score_type = 'stu_credit').scorestu_penalty = models.SepScore.objects.get(stu_id = stu_id,score_type = 'stu_penalty').scorestu_score = 0.1*grade*50+0.15*stu_scholarship+0*stu_gpa+0.1*stu_paper+0.1*stu_job+0.25*stu_cheat+0.05*stu_c+0*stu_credit+0.25*stu_penaltyscore_list.append([stu_id,stu_name,stu_score])print(score_list)newlist = sorted(score_list,key = lambda x:x[2],reverse = True)for i in range(len(newlist)):newlist[i].append(i+1)add_debt_score(newlist)return render(request,'instructor/debt_score.html')def add_debt_score(yourlists):cleartable = models.DebtScore.objects.all()cleartable.delete()for yourlist in yourlists:savedata = models.DebtScore(stu_id = yourlist[0],stu_name = yourlist[1],score = yourlist[2],rank = yourlist[3])savedata.save()def debt_index(request):debts =  models.DebtScore.objects.all()return render(request,'debt_index.html',{'debts':debts})

♻️ 资源

大小: 16.5MB
➡️ 资源下载:https://download.csdn.net/download/s1t16/87377752

基于Python(Django)+MySQL实现(Web)大学生信用评价系统分析与设计【100010400】相关推荐

  1. 基于Python+Django+MYSQL的ERP管理系统的设计与实现

    基于Python+Django+MYSQL的ERP管理系统的设计与实现  源码获取:https://www.bilibili.com/video/BV1Ne4y1g7dC/ ERP管理系统是商业信息管 ...

  2. 基于Python + Django + mysql的协同推荐算法的电影推荐系统

    基于Python + Django + mysql的协同推荐算法的电影推荐系统 本系统一共分为前台系统功能和后台系统功能两个模块,两个模块之间虽然在表面上是相互独立的,但是在对数据库的访问上是紧密相连 ...

  3. 基于Python+Django+MySQL的大学生信用评估系统

    全套资料下载地址:https://download.csdn.net/download/sheziqiong/85585110?spm=1001.2014.3001.5503 摘 要 在国内,有很大一 ...

  4. 基于Python Django Mysql 开发的宠物用品商城

    最近做的一个程序设计,核心是基于django做一个商城,功能包含登录.注册.商品浏览.购物车.支付模块(支付宝沙箱支付).评价.轮播图. 开发环境 Python版本:3.8.7 Django版本:3. ...

  5. 基于Python+Django+MYSQL的校园食堂点餐管理系统

    项目介绍: 食堂管理.商户管理.菜品管理.订单管理.用户管理 页面效果:

  6. 基于Python+Django+Mysql的图书管理系统

    系统实体对象: 图书类型:图书类别,类别名称,可借阅天数 图书:图书条形码,图书名称,图书所在类别,图书价格,库存,出版日期,出版社,图书图片,图书简介,图书文件 页面效果:

  7. 基于Python+Django+Mysql的蔬菜水果在线购物商城

    功能描述: 1 用户模块 1)注册页 注册时校验用户名是否已被注册. 完成用户信息的注册. 给用户的注册邮箱发送邮件,用户点击邮件中的激活链接完成用户账户的激活. 2)登录页 实现用户的登录功能. 3 ...

  8. python django mysql web页面多级联动_Python Web实战:Python+Django+MySQL实现基于Web版的增删改查...

    前言 本篇使用Python Web框架Django连接和操作MySQL数据库学生信息管理系统(SMS),主要包含对学生信息增删改查功能,旨在快速入门Python Web,少走弯路.效果演示在项目实战最 ...

  9. Python+Django+Mysql个性化图书推荐系统 图书在线推荐系统 基于用户、项目、内容的协同过滤推荐算法(带设计报告)

    Python+Django+Mysql个性化图书推荐系统 图书在线推荐系统 基于用户.项目.内容的协同过滤推荐算法 WebBookRSM.Python python实现协同过滤推荐算法实现 源代码下载 ...

最新文章

  1. js实现页面跳转的几种方式
  2. AAAI | 深度生成模型—NEVAE
  3. Nginx的安装配置
  4. Android什么是函数,什么是函数响应式编程(JavaAndroid版本)
  5. [Java基础]反射获取成员变量并使用练习
  6. C8-2 圆的周长和面积 (100/100 分数)
  7. php iframe js加载不上,js iframe的onload事件不去作用的原因及解决办法
  8. 《Python编程从入门到实践》记录之将Python函数存储在模块中(import、import*)
  9. Ubuntu安装ASIO开发库
  10. mac如何禁止adobe creative cloud开机自启?
  11. 让MacOS废纸篓中超过30 天的文件自动清除
  12. 65.邮件服务器:Postfix
  13. 让VIM支持Python2 by update-alternatives
  14. Python机器学习库sklearn自动特征选择(训练集)
  15. android+汉王手写引擎,汉王 从手写专家到输入法专家
  16. win10系统可以登录微信,但浏览器不能打开网页
  17. 让 GitHub 上这几个小游戏帮你找回童真
  18. The Sandbox 市场平台将上线 Isla Obscura 第五期 NFT 作品集
  19. cognos java_Cognos第三方用户认证(CustomJavaProvider)
  20. 3800hk 黑鹰大米被抓视频报道

热门文章

  1. c语言求矩阵特征值的程序,如何用C语言编写求对称矩阵的特征值和特征向量的程序编写对称矩阵的特征值和特征向量,其中矩阵用二维数组保存.特征向量要求有大到小放到数组里....
  2. 如何在10分钟内开始使用MongoDB
  3. Sqlserver 修改字段长度
  4. linux检查是否安装了rzsz,linux安装rzsz(lrzsz)
  5. Python:30行代码,使用POST登录山大的教务处系统(附完整源码)
  6. Alertmanager 报警规则
  7. AI全自动车辆外观视觉检测
  8. Cadence Allegro PCB 切换上次视图的方法图文教程及视频演示
  9. 使用PLSQL文本导入器导入文本数据
  10. Silverlight技术研讨(1):WebClient, 文件下载利器