🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。
- 代码可以私聊博主获取。🌹
- 赠送计算机毕业设计600个选题excel文件,帮助大学选题。
- 赠送开题报告模板,帮助书写开题报告。
作者完整代码目录供你选择:
- 《Springboot网站项目》400套
- 《ssm网站项目》800套
- 《小程序项目》300套
- 《App项目》500套
- 《python网站项目》600套
⚡感兴趣大家可以点点关注收藏,后续更新更多项目资料。⚡
项目演示
摘 要
信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古以来的短板,有效的提升管理的效率和业务水平。传统的管理模式,时间越久管理的内容越多,也需要更多的人来对数据进行整理,并且数据的汇总查询方面效率也是极其的低下,并且数据安全方面永远不会保证安全性能。结合数据内容管理的种种缺点,在互联网时代都可以得到有效的补充。结合先进的互联网技术,开发符合需求的软件,让数据内容管理不管是从录入的及时性,查看的及时性还是汇总分析的及时性,都能让正确率达到最高,管理更加的科学和便捷。本次开发的客户关系管理系统实现了商机,客户,联系人,,,客户需求,操作日志等功能。系统用到了关系型数据库中王者MySql作为系统的数据库,有效的对数据进行安全的存储,有效的备份,对数据可靠性方面得到了保证。并且程序也具备程序需求的所有功能,使得操作性还是安全性都大大提高,让客户关系管理系统更能从理念走到现实,确确实实的让人们提升信息处理效率。
关键字:信息管理,时效性,安全性,MySql
第1章 绪论
1.1 研究背景
互联网概念的产生到如今的蓬勃发展,用了短短的几十年时间就风靡全球,使得全球各个行业都进行了互联网的改造升级,标志着互联网浪潮的来临。在这个新的时代,各行各业都充分考虑互联网是否能与本行业进行结合,是否能解决本行业或者本行业中某些方面的自古以来的痛点。长期以来,数据内容,数据传播,数据储存等都是一门门专业的内容,因为需要记住的内容很多,造成古人的言简意赅,如今互联网的到来让数据更加的清晰好认不复杂,一目了然不出错,毕竟在整个历史上数据的丢失,传承的断代,都是因为数据不能好好的保存,不能好好的流传。当年的年代用互联网思维和互联网技术,对大量数据的录入更新,存储汇总,备份分析方面,使得远远的超过传统的数据管理技术。在这样的时代潮流下,采用新技术开发新软件,对传统行业进行革命性的改造成为了当今的主流。本次开发客户关系管理系统,解决了客户信息管理关于数据方面的管理分析,存储传输的痛点,不仅仅对管理员提供了便利,还能提高用户的满意度。
1.2目的和意义
此次客户关系管理系统的开发,需要用到的知识不仅涉及到界面设计与功能设计方面的知识,还需要涉及到数据库与编程语言上面的知识,这些知识点对于一个即将毕业的学生来说,一是为了巩固在校所学相关专业知识;二是为了让学生学会如何将专业理论知识运用于现实软件的开发过程;三是让学生明白知识是无穷无尽的,要时刻明白活到老学到老的真正含义,让学生要养成时刻学习的习惯,同时也要相信通过此次程序的开发,会让学生对于专业知识的理解与软件开发水平的提高有着极大的帮助。
1.3 论文研究内容
论文设计的结构也是依照程序开发的流程进展的,也涉及到功能需求分析,功能设计与实现,程序测试等流程。
绪论:讲解课题的背景与意义,展示论文结构。
程序开发技术:讲解程序运用到的工具与技术知识。
系统分析:讲解程序的功能需求与开发可行性问题。
系统设计:讲解程序的功能与数据库的设计。
系统实现:讲解程序功能与界面实现。
系统测试:讲解程序的功能测试。
第2章 程序开发技术
2.1 Mysql数据库
开发的程序面向用户的只是程序的功能界面,让用户操作程序界面的各个功能,那么很多人就会问,用户使用程序功能生成的数据信息放在哪里的?这个就需要涉及到数据库的知识了,一般来说,程序开发通常就会对常用数据存储工具的特点进行分析比对,比如Mysql数据库的特点与优势,Access数据库的特点与优势,Sqlserver数据库的特点与优势等,最终看哪个数据库与需要开发的程序比较匹配,也符合程序功能运行需要的数据存储要求,比如,需要开发商业级别的程序,存储的数据对数据库要求较高,可以选用Oracle,如果只是比较简单的程序,对数据存储没有过多要求,可以选用微软旗下的Access,当开发程序要求数据库占用空间小,并能满足程序数据存储要求时,就可以考虑Oracle公司从瑞典MySQL AB公司在很早之前就收购过一个关系型数据库,它是现在的Mysql数据库。
为了更容易理解Mysql数据库,接下来就对其具备的主要特征进行描述。
(1)首选Mysql数据库也是为了节省开发资金,因为网络上对Mysql的源码都已进行了公开展示,开发者根据程序开发需要可以进行下载,并做一些改动就可以使用在程序中,可以推动开发者开发此程序的开发进度。
(2)SQL数据语言在Mysql里面也同样适用
(3)Mysql不仅可以支持多种编程语言,比如在校期间学到的C语言,Java语言,以及课后接触的PHP语言,C++语言等编程语言,它都能很好的支持,而且Mysql的安装与使用还不挑剔使用平台。
(4)Mysql可以支持具有千万条数据记录的数据库,电脑操作系统在进行首次安装或者是重装时,可以根据需要选择安装32位或64位操作系统,这两种操作系统对表文件的支持力度不一样,32位的操作系统最多可以存放4GB的表文件,64位操作系统最多可以存放8TB的表文件。
(5)Mysql数据库可以通过GPL协议进行个性化定制,需要开发者自己对数据库的源代码进行修改,以此开发出属于自己的Mysql。
2.2 Java语言
程序开发语言有很多,但是截至目前,Java语言在IT领域内,仍然是最被认可,以及被广泛运用的编写语言之一,因此在选择此程序的编写语言上,果断选择这门编程语言进行程序开发。可以说经过了这么多年的发展,Java语言不仅在Web开发领域有了突出性贡献,而且在大数据开发领域以及Android开发领域都得到了广泛运用。由于Java语言拥有较强的扩展性能,并且表现出的稳定性能,让其成为大型后端系统开发语言首选,现如今,Java语言也成为了一种常用的互联网平台的解决方案。
作为一种源码在网络上开源的面向对象的程序开发Java语言,由它开发完成的程序是不可能直接运行在各大平台的,Java程序的运行,需要在操作平台上配置其运行的环境,包括数据库软件与Java程序开发软件等工具的安装与配置。在Win7,Win10或其它操作平台上配置Java程序运行环境,只要环境配置成功,Java程序都可以运行起来。
第3章 系统分析
在进行系统分析之前,需要从网络上或者是图书馆的开发类书籍中收集大量的资料,因为这个环节也是帮助即将开发的程序软件制定一套最优的方案,一旦确定了程序软件需要具备的功能,就意味着接下来的工作和任务都是围绕着这个方案执行的,所以系统分析需要对程序功能反复进行思考和研究。
3.1可行性分析
开发一款系统软件之前,用户都会思考这个软件程序值不值得去开发,把开发软件过程中可能涉及到的问题罗列出来,并一个个分析解决,以此来确定开发这款程序软件是否有必要,这样的分析方法也能帮助用户降低损失,不至于开发者开发进度进行到一半之后,突然遇到问题就放弃对软件的开发,到那时,资金损失,人力投入等方面就损耗太大了。
3.1.1技术可行性分析
此次开发程序使用到的开发工具有:Eclipse,Mysql等工具,使用的开发语言是Java,选择的开发工具和开发语言都是在大学课堂接触并学习过,后期因为自己也比较感兴趣,所以也通过网络渠道,或借助图书馆的开发类书籍进行过软件开发知识的系统学习,让自己有了一定的知识积累,加上自己在校期间也独立开发过一些软件作品,也积累了一定的开发经验,所以这次毕设作品的制作在技术上无须担忧过多。
3.1.2经济可行性分析
目前的信息时代,对信息的管理趋于高效化,便捷化,这也是计算机大力普及所带来的便利,此程序软件在设备选用上,依靠的是比较大众的电脑设备,对电脑的配置没有过多要求,一般学校的计算机机房的电脑都可以满足程序开发需求,另外,开发出此款程序,让信息处理变得高效率,其所带来的高效益是远超程序开发的低成本的,因此程序开发的资金投入是可以忽略不计的。
3.1.3操作可行性分析
程序软件的操作界面是符合大众审美的需求,功能模块的布局也是类似于社会上同种类型的软件,因此使用者操作该软件可以无需培训就上手。加上现在计算机入驻各家各户,大部分人的计算机操作水平都比较高,这样的局面也表明开发出来的程序在操作性问题上也是不用担心的。
综合上面的可行性论证,基本可以确定程序开发完全可行。
3.2系统运行环境
程序经过编码可以实现对程序设计的功能。但是编码实现时需要一定的配置环境,包括了电脑上的硬件环境,也包括在电脑操作系统上安装的软件环境。
硬件环境:一台可以正常使用并能够上网的笔记本或者是电脑,电脑内存最低要求4个G,电脑的中央处理器可以配置i5CPU。
软件环境:运用的微软操作系统是比较稳定的win7旗舰版系统,采用比较熟练360安全浏览器,并在此系统上通过浏览器下载安装好Eclipse软件,下载安装好MYSQL软件等。
3.3系统流程分析
分析程序的流程,涉及到程序的整体操作流程,通过分析与设计,绘制的程序操作流程图见下图。此程序为了确保安全,会让使用者通过登录模块验证信息,符合要求的使用者才有权限操作程序。
图3-1 程序操作流程图
程序处理数据会涉及到数据的录入环节,绘制的添加流程见下图。程序录入数据过程中,始终与数据库保持同步。
图3-2 信息添加流程图
程序里面的数据也会出现错误,因此就有相应的修改数据的功能,绘制的程序修改流程见下图。此过程也是跟后台数据库进行数据同步显示。
图3-3信息修改流程图
程序数据存放于数据仓库,有时也会涉及到数据删除,此过程对应的流程图见下图。数据信息被删除之后,数据库里面也就没有了该数据信息了。
图3-4 信息删除流程图
第4章 系统设计
4.1 系统设计的原则
在系统设计过程中,也需要遵循相应的设计原则,这些设计原则可以帮助设计者在短时间内设计出符合设计规范的设计方案。设计原则主要有可靠性,安全性,可定制化,可扩展性,可维护性,可升级性以及客户体验等原则。下面就对这些原则进行简要阐述。
可靠性:一个软件是否可靠决定了其是否被用户使用,设计不可靠的软件,用户很容易就遗弃;
安全性:程序软件承担了信息的保存与管理等事务,安全性不足的软件会导致使用者承担巨大的损失;所以系统安全也是需要考虑进入的;
可定制化:市场环境从来都不是一直固定不变,面对客户群体的改变,以及使用环境的改变,市场需求的改变等因素,程序软件也要易于调整以适应各种变化;
可扩展性:程序软件在运行使用期间,也需要及时引进当下的新技术来进行系统优化,主要就是在系统功能层面,系统性能层面上进行相应的扩展,只有这样才能让系统在实际生活中继续占有市场;
可维护性:程序软件的维护需要一定量的资金,不管是排除现有程序错误,还是变更软件的现有需求,都需要在软件技术上投入一定资金,所以易于维护的软件程序就可以降低技术层面的资金消耗;
可升级性:程序软件的投入使用,会面临用户数量增多的情况,用户对软件的使用率也会提升,所以系统面临这种情况,仍然需要通过升级保持性能的合理,这样才能够适应市场;
客户体验:设计出来的程序软件在界面上不能够太复杂,要遵循界面设计的原理设计出简单,方便操作的功能操作界面,让用户易于接受软件,并乐于使用软件提供的功能。
4.2 系统结构设计
在系统结构设计上,经综合考虑还是选择比js更加简洁的vue框架,现如今浏览器已经实现了普及,并在技术上逐渐完善和成熟,它在节约软件开发成本的基础上,还能实现原本用专业软件操作才能实现的强大功能。总之,小程序架构是当下全新的,认可度高的系统构造技术。系统结构设计图通过绘制,效果展示如下:
图4-1 系统结构设计图
4.3功能结构设计
在管理员功能模块确定下来的基础上,对管理员各个功能进行设计,确定管理员功能的详细模块。绘制的管理员功能结构见下图。
图4.3 管理员功能结构图
4.4数据库设计
与功能结构设计一样,数据库设计也是程序开发不可避免的设计环节,数据库设计最主要的目的就是帮助运行程序存储相应的数据信息。数据库设计包含的内容有数据表结构的设计,也包含了数据库E-R图的设计。
4.4.1 数据库E-R图
在绘制E-R图之前,先要找出数据库的实体,明确各个实体具有的属性,比如用户信息这个实体,它具备的属性包括了用户的姓名属性,用户的密码属性,用户的创建时间属性等,所以明确了用户这个实体,以及用户实体具备的属性之后,就需要根据这些信息绘制用户实体对应的实体属性图了。绘制软件选用当下认可度高,使用范围广,操作便利的微软旗下的Visio工具。
(1)下图是联系人实体和其具备的属性。
联系人实体属性图
(2)下图是员工实体和其具备的属性。
员工实体属性图
(3)下图是操作日志实体和其具备的属性。
操作日志实体属性图
(4)下图是菜单实体和其具备的属性。
菜单实体属性图
(5)下图是客户服务实体和其具备的属性。
客户服务实体属性图
(6)下图是客户需求实体和其具备的属性。
客户需求实体属性图
(7)下图是客户实体和其具备的属性。
客户实体属性图
(8)下图是商机实体和其具备的属性。
商机实体属性图
4.4.2 数据库表结构
在进行这部分设计之前,需要明白和掌握数据类型以及各个数据类型的长度范围等知识,因为在一张具体的数据表中,为了方便理解,这里就举个简单的例子。比如用户信息表,这个表格的字段就是用户这个实体具备的属性,这时就需要对字段进行数据类型,以及字段长度的设置,也要设置一个主键来作为用户信息表的唯一标识。这些都是数据库表结构设计需要完成的内容。根据客户关系管理系统的功能设计以及数据库设计要求,展示该系统的数据表结构。
表4.1操作日志表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
1 | Id | Int | id | 否 |
2 | caozuorizhi_this_biao | String | 操作人所在表 | 是 |
3 | caozuorizhi_caozuobiao | String | 操作表 | 是 |
4 | caozuorizhi_caozuozhanghu | String | 操作账户 | 是 |
5 | caozuorizhi_caozuoleixing | String | 操作类型 | 是 |
6 | caozuorizhi_text | String | 操作内容 | 是 |
7 | insert_time | Date | 操作时间 | 是 |
8 | create_time | Date | 创建时间 | 是 |
表4.2字典表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
1 | Id | Int | id | 否 |
2 | dic_code | String | 字段 | 是 |
3 | dic_name | String | 字段名 | 是 |
4 | code_index | Integer | 编码 | 是 |
5 | index_name | String | 编码名字 | 是 |
6 | super_id | Integer | 父字段id | 是 |
7 | beizhu | String | 备注 | 是 |
8 | create_time | Date | 创建时间 | 是 |
表4.3客户表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
1 | Id | Int | id | 否 |
2 | yuangong_id | Integer | 员工 | 是 |
3 | kehu_uuid_number | String | 客户编号 | 是 |
4 | kehu_name | String | 客户姓名 | 是 |
5 | kehu_phone | String | 客户手机号 | 是 |
6 | kehu_id_number | String | 客户身份证号 | 是 |
7 | kehu_photo | String | 客户照片 | 是 |
8 | sex_types | Integer | 性别 | 是 |
9 | kehu_email | String | 客户邮箱 | 是 |
10 | kehu_address | String | 住址 | 是 |
11 | hangye_types | Integer | 行业 | 是 |
12 | zhiwei_types | Integer | 职位 | 是 |
13 | diqu_types | Integer | 地区 | 是 |
14 | create_time | Date | 创建时间 | 是 |
表4.4客户服务表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
1 | Id | Int | id | 否 |
2 | kehu_id | Integer | 客户 | 是 |
3 | yuangong_id | Integer | 员工 | 是 |
4 | kehu_fuwu_uuid_number | String | 客户服务编号 | 是 |
5 | kehu_fuwu_name | String | 客户服务标题 | 是 |
6 | kehu_fuwu_file | String | 服务附件 | 是 |
7 | kehu_fuwu_types | Integer | 客户服务类型 | 是 |
8 | fuwu_time | Date | 客户服务时间 | 是 |
9 | kehu_fuwu_content | String | 客户服务内容 | 是 |
10 | insert_time | Date | 录入时间 | 是 |
11 | create_time | Date | 创建时间 | 是 |
表4.5客户需求表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
1 | Id | Int | id | 否 |
2 | kehu_id | Integer | 客户 | 是 |
3 | yuangong_id | Integer | 员工 | 是 |
4 | kehu_xuqiu_uuid_number | String | 客户需求编号 | 是 |
5 | kehu_xuqiu_name | String | 客户需求名称 | 是 |
6 | kehu_xuqiu_types | Integer | 客户需求类型 | 是 |
7 | xuqiu_time | Date | 客户需求时间 | 是 |
8 | kehu_xuqiu_content | String | 客户需求内容 | 是 |
9 | insert_time | Date | 录入时间 | 是 |
10 | create_time | Date | 创建时间 | 是 |
表4.6联系人表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
1 | Id | Int | id | 否 |
2 | kehu_id | Integer | 客户 | 是 |
3 | lianxiren_uuid_number | String | 联系人编号 | 是 |
4 | lianxiren_name | String | 联系人姓名 | 是 |
5 | lianxiren_phone | String | 联系人手机号 | 是 |
6 | lianxiren_id_number | String | 联系人身份证号 | 是 |
7 | lianxiren_photo | String | 联系人照片 | 是 |
8 | sex_types | Integer | 性别 | 是 |
9 | lianxiren_email | String | 联系人邮箱 | 是 |
10 | insert_time | Date | 录入时间 | 是 |
11 | update_time | Date | 最后更新时间 | 是 |
12 | create_time | Date | 创建时间 | 是 |
表4.7菜单表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
1 | Id | Int | id | 否 |
2 | role_zh_name | String | 角色汉字 | 是 |
3 | role_en_name | String | 角色表名 | 是 |
4 | direction | String | 使用方向 | 是 |
5 | yiji_menu_name | String | 一级菜单名称 | 是 |
6 | yiji_menu_icon | String | 一级菜单图标 | 是 |
7 | erji_menu | String | 二级菜单 | 是 |
8 | beizhu | String | 备注 | 是 |
9 | insert_time | Date | 添加时间 | 是 |
10 | update_time | Date | 更新时间 | 是 |
11 | create_time | Date | 创建时间 | 是 |
表4.8商机表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
1 | Id | Int | id | 否 |
2 | yuangong_id | Integer | 员工 | 是 |
3 | shangji_uuid_number | String | 商机编号 | 是 |
4 | shangji_name | String | 商机标题 | 是 |
5 | shangji_types | Integer | 商机类型 | 是 |
6 | shangji_file | String | 商机附件 | 是 |
7 | fuwu_time | Date | 发现时间 | 是 |
8 | shangji_content | String | 商机内容 | 是 |
9 | insert_time | Date | 录入时间 | 是 |
10 | create_time | Date | 创建时间 | 是 |
表4.9员工表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
1 | Id | Int | id | 否 |
2 | yuangong_name | String | 员工姓名 | 是 |
3 | yuangong_phone | String | 员工手机号 | 是 |
4 | yuangong_id_number | String | 员工身份证号 | 是 |
5 | yuangong_photo | String | 员工头像 | 是 |
6 | yuangong_email | String | 员工邮箱 | 是 |
7 | create_time | Date | 创建时间 | 是 |
表4.10管理员表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
1 | Id | Int | id | 否 |
2 | username | String | 学生名 | 是 |
3 | password | String | 密码 | 是 |
4 | role | String | 角色 | 是 |
5 | addtime | Date | 新增时间 | 是 |
系统实现这个章节的内容主要还是展示系统的功能界面设计效果,在实现系统基本功能,比如修改,比如添加,比如删除等管理功能的同时,也显示出系统各个功能的界面实现效果,该部分内容一方面与前面提到的系统分析,系统设计的内容相呼应,另一方面也是一个实际成果的展示。
5.1管理员功能实现
5.1.1 客户管理
此页面让管理员管理客户的数据,客户管理页面见下图。此页面主要实现客户的增加、修改、删除、查看的功能。
图5-1 客户管理页面
5.1.2 客户需求信息管理
客户需求信息管理页面提供的功能操作有:新增客户需求,修改客户需求,删除客户需求操作。下图就是客户需求信息管理页面。
图5.3 客户需求信息管理页面
5.1.3客户需求类型管理
客户需求类型管理页面显示所有客户需求类型,在此页面既可以让管理员添加新的客户需求信息类型,也能对已有的客户需求类型信息执行编辑更新,失效的客户需求类型信息也能让管理员快速删除。下图就是客户需求类型管理页面。
图5.4 客户需求类型列表页面
5.1.4 客户服务管理
如图5.4显示的就是客户服务管理页面,此页面提供给管理员的功能有:新增客户服务,修改客户服务,删除客户服务。
图5.4客户服务管理页面
5.1.5 客户服务类型管理
如图5.5显示的就是客户服务类型管理页面,此页面提供给管理员的功能有:新增客户服务类型,修改客户服务类型,删除客户服务类型。
图5.5 客户服务类型管理页面
第6章 系统测试
程序软件的开发阶段也包括了系统测试,这个部分就是程序质量评定的一个重要环节,如果说程序通过编码实现功能之后,不通过测试检查程序中出现的错误,那么程序一旦投入生活中运行使用时,就会产生许多大大小小的错误,这个时候去解决问题已经晚了,所以一个程序在被交付给使用者使用之前,开发者就需要使用多种测试方法反复进行测试,也是对程序的一个负责表现。程序进入系统测试阶段,在讲究策略进行测试时,也需要对时效性进行把控。当开发者测试完程序,并解决完测试期间程序产生的各种错误时,就需要程序的验收方来对程序进行验收测试,这也是程序测试的最后一个操作步骤。验收测试也是对程序的质量以及可交付性方面起到关键的作用。
6.1系统测试方法
程序软件进入到系统测试这一个环节时,也需要根据测试的方法进行规范化测试操作,测试方法以及使用顺序分别是:首先是单元测试,接着是集成测试和系统测试,最后才是验收测试,下面将描述系统测试方法。
单元测试:这个部分需要涉及到程序的代码方面的知识,这个操作环节是程序的开发者进行的,当程序开发者通过代码编写程序的子功能模块时,就会进行单元级别的测试,通常这个环节的测试也会被称作是白盒测试。
集成测试:这个步骤的前提是程序的所有功能模块都已完成开发,这个时候需要把程序所有的子功能模块集成到一起,形成一个完整的系统,此测试的主要目的就是检查这些功能模块集成在一起时的兼容性,也就是检测它们是否按照预期正常运行。
系统测试:当程序测试进入到这个环节时,就意味着程序测试工作已经进行到一半了,这个部分的测试也有另外一个名字,称作是黑盒测试,主要用于测试系统的功能是否按照预期进行运行。
验收测试:开发的程序已经通过了前面的单元测试,集成测试,以及系统测试环节时,就需要进行验收了,这个环节的操作用户就是程序面临的最终用户或者是客户。测试主要目的就是验证开发完成的程序是不是能够符合用户对其的期望,以及程序的所有功能是否符合用户的真正需求。
6.2 系统功能测试
6.2.1 用户登录测试
登录模块主要还是验证使用者的信息,判断使用者是否具备使用权限。测试的数据见下表,这里主要针对管理员进行测试。
表6-1 管理员登录测试数据表
选取的功能 | 具体步骤 | 填写的数据 | 预测结果 | 最终结果 |
管理员登录 | 依照页面提示依次填写账号,密码,然后点击登录按钮 | 保持账号与密码这两项数据,其中一个有误,另一个正确,进行测试 | 失败 | 失败 |
保持账号与密码都正确 | 成功 | 成功 |
6.2.2 添加账户功能测试
此部分主要测试程序的“添加账户”功能。测试信息使用数据表展示。
表6-2 添加客户服务功能测试数据表
选取的功能 | 具体步骤 | 填写的数据 | 预测结果 | 最终结果 |
添加账户功能 | 管理员在添加账户页面根据提示填写数据并提交 | 标题和内容为null或数据格式有误 | 失败 | 失败 |
标题和内容填写无误 | 成功 |
6.3 系统测试分析
客户关系管理系统在经历了一系列测试步骤之后,可以确定该系统可以交付给使用者进行使用了,在系统的功能主界面上可以清晰展示各个功能,并且各个功能的超链接也是正常跳转,能够实现用户要求的功能。在程序的稳定性,可靠性,验证逻辑以及操作流程方面跟需求文档很贴合。所以,开发完成的客户关系管理系统符合用户需求,它在用户电脑上运行使用带给用户的便利是显而易见的。
结 论
客户关系管理系统的开发制作,从题目确定到成品完成,自己投入的精力与心血是非常多的。从客户关系管理系统的前台页面实现,到客户关系管理系统的后台代码的编辑,我用到的软件包括了数据库软件Mysql,Java开发工具IDEA,办公软件Office,浏览器软件Fireworks,图像处理软件Photoshop等,这也是我第一次使用Java语言,开发的这个比较简单的客户关系管理系统。
客户关系管理系统开发过程中,自己之前觉得比较抽象的许多门课程,例如数据库原理,软件工程,动态网站开发等课程开始变得很清晰,只有自己独立开发程序,才会觉得这些开发类的课程在实践中具有的重要作用。为了让自己设计的作品能够顺利的完成,我把所学知识全部运用在程序的开发流程中,包括了程序的需求分析环节,程序的编码环节,程序的测试环节等,让程序软件在开发周期内完成制作,并能够保证程序质量达标,力求程序开发流程规范化,程序对应的配套文档标准化。
本次开发的系统整体界面还是比较清晰简明,功能上面考虑得比较全,几乎可以满足用户使用要求。尽管我对这次的毕设付出了许多的努力,但是程序还是有很多不足的地方,系统界面整体感觉还行,但是字体字号的选取上面还是有些不符合现实审美,在程序的CSS样式编码上面,我还有许多不熟悉的地方,虽然经过反复的测试与调试选中了现在这样的程序界面,但是我还是明显感觉到自己对一些常用CSS样式的不熟悉,编码过程中,我还要多次进行资料查看才知道。另外我编写的代码写作不是很规范,可读性比较差,幸运的是,我最终还是实现了系统中所要求的功能。
独立开发程序期间,才会发现有许多知识都是现学现用得来的,毕竟大学期间所学知识比较有限,专业知识掌握得比较浅显,这也给自己制造了许多麻烦,比如程序开发期间遇到的中文乱码问题,程序对应数据库的数据安全问题,程序开发中框架的使用问题等,这些问题都需要随时去翻阅书籍,或通过百度浏览器等方式寻找解决办法,这也耽误了许多程序开发的宝贵时间,后期我也通过对周边同学的请教,以及指导老师的悉心指导,让我找到了程序开发的相关技巧,也积累了一定的知识量,慢慢地纠正了许多不该犯的错误。也推动了我的程序开发进程。
客户关系管理系统现已完成了开发,除了基本功能可以符合用户需求外,在页面设计层面上没有融入更多的设计元素,需要从美学角度进行优化,另外在程序的代码层面,也有许多重合部分,需要进行整理归类,让代码变得更加的简洁。
实践出真知,但是知识也是通过实践变得更加深刻,这次作品制作,让自己的专业知识水平与解决问题的能力得到了提高。也让自己更加明白活到老学到老的真正含义。
总的说来,这次编写毕业设计作品,我真正锻炼了自己的实际操作能力,以前只知道理论知识,现在通过实践,我对理论知识的认识变得更加深刻,由于编写程序时间比较短暂,程序开发期间遇到过很多坎坷,但最后都通过老师还有同学帮忙解决了,可以说这次的毕设作品进展得还算顺利。
致 谢
大学几年下来,我不仅学到了计算机方面的专业知识,也学会了许多有关做人,有关做事的道理。在现在这个紧张而又重要的时刻,我要向我的大学老师们表示由衷的感谢,也需要向我的论文指导老师表达我最真挚的谢意。指导老师在我论文指导期间一直都是不厌其烦的进行指导,包括论文的题目选择,论文文章的结构,以及系统开发的功能设计等问题,都是指导老师的及时帮助,才让我有解决问题的信心与解决思路,正因为如此,我才可以在短时间内得到成长,并成功完成毕业设计的作品制作与论文编写。短短几个月时间,指导老师的无私的奉献精神,以及指导老师的爱岗敬业的教学态度,让我也开始重新认识所学的专业知识,并有信心将所学知识与现实问题相结合,并提供一个可靠有效的解决方案。大学校园是温暖而又美好的,大学同学的无私帮助与建议,也让我的论文写作有了更多的思路,在此,我对我的大学同学一并表示感谢。我的成长与宝贵的学习机会也离不开大学校园这个平台,感谢大学校园给了我更多学习的机会,让我结识到许多大学同学和优秀的校园老师,让我的大学生活变得如此丰富多彩!
参考文献
[1]任华新.网络系统的设计与实现[J].电子商务,2016(10):58-59.
[2]周全,杨指敏,常静静.管理系统的设计与实现[J].电子世界,2019(24):147-148.
[3]兰旭辉,熊家军,邓刚.基于MySQL的应用程序设计[J].计算机工程与设计,2018(03):442-443+468.
[4]张伟丽,江春华,魏劲超.MySQL复制技术的研究及应用[J].计算机科学,2015,39(S3):168-170.
[5]刘学芬,孙荣辛,夏鲁宁,李伟.面向MySQL的安全隐患检测方法研究[J].信息网络安全,2016(09):1-5.
[6]孙志锋,徐镜春,厉小润.数据结构与数据库技术[M].浙江大学出版社,2016.
[7]刘明清.Java语言的特点与C++语言的比较[J].信息技术与信息化,2018(11):151-153.
[8]田智.基于计算机软件开发的JAVA编程语言分析[J].硅谷,2017,7(19):59+37.
[9]孙磊,贾宝强,曾翠翠.浅议Java软件开发中几种误区[J].网络与信息,2018,26(07):52.
[10]付博文.计算机软件开发的JAVA编程语言及其实际应用[J].南方农机,2018,49(23):158.
[11]张剑.JSP开发中三种包含方式的异同分析[J].机械工程与自动化,2017(04):56-57.
[12]王景.JSP动态网站的技术开发分析[J].赤峰学院学报(自然科学版),2018,29(20):24-26.
[13]周江,李月.一种基于JSP技术的网页表格组件的设计与实现[J].现代计算机(专业版),2017(21):48-51.
[14]李俊.基于jsp的数据库开发技术研究[J].才智,2017(20):265.
[15]胡君.高职《JSP编程及应用》课程开发研究[J].淮南职业技术学院学报,2017,17(06):103-105.
[16]Fuad,Ammar,Erwin,Alva,Ipung,Heru Purnomo et al.Processing performance on Apache Pig,Apache Hive and MySQL cluster[C].//2014 International conference on information,communication technology and system:ICTS 2014,24 September 2014,Surabaya,Indonesia.2018:297-302.
[17]Narayanan Venkateswaran,Suvamoy Changder.Building a Pluggable Sharding Subsystem For MySQL[C].//22nd International conference on software engineering and data engineering:SEDE-2013,Los Angeles,California,USA,25-27 September 2013.2013:85-90.
[18]Konstantins Gusarovs.An Analysis on Java Programming Language Decompiler Capabilities[J].Applied Computer Systems,2018,23(2).
核心代码展示
/**
* 公告通知
* 后端接口
* @author
* @email
* @date 2021-03-09 11:33:59
*/
@RestController
@RequestMapping("/news")
public class NewsController {
@Autowired
private NewsService newsService;
/**
* 后端列表
*/
@RequestMapping("/page")
public R page(@RequestParam Map<String, Object> params,NewsEntity news, HttpServletRequest request){
EntityWrapper<NewsEntity> ew = new EntityWrapper<NewsEntity>();
PageUtils page = newsService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, news), params), params));
return R.ok().put("data", page);
}
/**
* 前端列表
*/
@IgnoreAuth
@RequestMapping("/list")
public R list(@RequestParam Map<String, Object> params,NewsEntity news, HttpServletRequest request){
EntityWrapper<NewsEntity> ew = new EntityWrapper<NewsEntity>();
PageUtils page = newsService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, news), params), params));
return R.ok().put("data", page);
}
/**
* 列表
*/
@RequestMapping("/lists")
public R list( NewsEntity news){
EntityWrapper<NewsEntity> ew = new EntityWrapper<NewsEntity>();
ew.allEq(MPUtil.allEQMapPre( news, "news"));
return R.ok().put("data", newsService.selectListView(ew));
}
/**
* 查询
*/
@RequestMapping("/query")
public R query(NewsEntity news){
EntityWrapper< NewsEntity> ew = new EntityWrapper< NewsEntity>();
ew.allEq(MPUtil.allEQMapPre( news, "news"));
NewsView newsView = newsService.selectView(ew);
return R.ok("查询公告通知成功").put("data", newsView);
}
/**
* 后端详情
*/
@RequestMapping("/info/{id}")
public R info(@PathVariable("id") Long id){
NewsEntity news = newsService.selectById(id);
return R.ok().put("data", news);
}
/**
* 前端详情
*/
@IgnoreAuth
@RequestMapping("/detail/{id}")
public R detail(@PathVariable("id") Long id){
NewsEntity news = newsService.selectById(id);
return R.ok().put("data", news);
}
/**
* 后端保存
*/
@RequestMapping("/save")
public R save(@RequestBody NewsEntity news, HttpServletRequest request){
news.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
//ValidatorUtils.validateEntity(news);
newsService.insert(news);
return R.ok();
}
/**
* 前端保存
*/
@RequestMapping("/add")
public R add(@RequestBody NewsEntity news, HttpServletRequest request){
news.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
//ValidatorUtils.validateEntity(news);
newsService.insert(news);
return R.ok();
}
/**
* 修改
*/
@RequestMapping("/update")
public R update(@RequestBody NewsEntity news, HttpServletRequest request){
//ValidatorUtils.validateEntity(news);
newsService.updateById(news);//全部更新
return R.ok();
}
/**
* 删除
*/
@RequestMapping("/delete")
public R delete(@RequestBody Long[] ids){
newsService.deleteBatchIds(Arrays.asList(ids));
return R.ok();
}
/**
* 提醒接口
*/
@RequestMapping("/remind/{columnName}/{type}")
public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request,
@PathVariable("type") String type,@RequestParam Map<String, Object> map) {
map.put("column", columnName);
map.put("type", type);
if(type.equals("2")) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar c = Calendar.getInstance();
Date remindStartDate = null;
Date remindEndDate = null;
if(map.get("remindstart")!=null) {
Integer remindStart = Integer.parseInt(map.get("remindstart").toString());
c.setTime(new Date());
c.add(Calendar.DAY_OF_MONTH,remindStart);
remindStartDate = c.getTime();
map.put("remindstart", sdf.format(remindStartDate));
}
if(map.get("remindend")!=null) {
Integer remindEnd = Integer.parseInt(map.get("remindend").toString());
c.setTime(new Date());
c.add(Calendar.DAY_OF_MONTH,remindEnd);
remindEndDate = c.getTime();
map.put("remindend", sdf.format(remindEndDate));
}
}
Wrapper<NewsEntity> wrapper = new EntityWrapper<NewsEntity>();
if(map.get("remindstart")!=null) {
wrapper.ge(columnName, map.get("remindstart"));
}
if(map.get("remindend")!=null) {
wrapper.le(columnName, map.get("remindend"));
}
int count = newsService.selectCount(wrapper);
return R.ok().put("count", count);
}
}