@TOC
ssm718个人日常事务管理系统+vue
研究背景
自计算机发展以来给人们的生活带来了改变。第一代计算机为1946年美国设计,最开始用于复杂的科学计算,占地面积、开机时间要求都非常高,经过数十几的改变计算机技术才发展到今天。现如今已是电子时代、数据时代,所有的生活都离不开计算机和网络。工作中有各类办公软件、APP,娱乐中有各类游戏软件、视频软件等都为生活带来了便捷,特别是我国的手机支付功能更是领先世界。科技推动了时代的发展。现在人们办公大多已从传统的面对面办公转换到线上办公。线上办公拥有更大的优点,信息种类全、流程清晰、结果反馈快。由于传统办公需要亲力亲为,信息单一,需要多部门面对面共同配合而逐渐被加入线上办公方式。
现在,网络覆盖范围扩大,价格便宜,各大商户都开放的有无线网络。手机也得到了普及,计算机技术也深入到手机中。普通生活、娱乐等都可以在线上解决。线上已成为趋势,大部分的行业都可以在线上开通业务,通过线上为人们解决问题,改变面对面方式,提高工作效率以及减少时间浪费。
1.2课题现状与实现意义
现在网上办公管理平台使用率高的有企业办公软件、收银软件、会计软件以及各类国家性质的办公平台。对于个人日常事务管理来言,想要突破发展就需要加入线上平台,传统每天的日常安排需要自己记住或者记录到笔记本上或者记录到手机备忘录上。对于事务少的时候自己记住的方式非常有效,但对于事务多的时候这三种方式都做不到及时提醒和有效的安排。
本系统采用管理员对用户的模式,管理员利用本平台可以管理基础数据信息、用户信息、个人信息等。本系统可以帮助管理用户的日常安排、重要提醒和消费记录。用户可以随时浏览、查询重要提醒信息,可以查询日常安排和查询消费记录。本系统可以帮助用户安排每天的事务和跟踪结果,帮助管理员增加工作途径,减少时间费用。本个人日常事务管理系统实现数据的自动化,减少管理员的工作内容并实现数据的清晰化。
1.3课题内容
本个人日常事务管理系统使用角色可以分为用户、管理员。用户可以实现每天的事务安排和消费登记,管理员在收到用户的信息后可以修改、删除,以保证用户记录信息的准确性,还可以审核用户的资料。同时用户可以设置重要事项的提醒。管理员同时可以管理个人信息、基础数据信息等。
1.4论文结构安排
本论文的结构安排为三部分,分别为:
(1)第一部分,
摘要,本部分为简单的阐述,使读者可以对本论文有大致的了解;
外文翻译,采用英语对摘要进行翻译;
目录,本部分可以使读者对本论文有详细的了解。
(2)第二部分为正文部分,
绪论,本章从课题开发的来源、现状来进行介绍,总结出本系统开发的意义以及内容等;
系统分析,本章包括语言、技术等的介绍以及系统的需求分析、可行性分析、流程分析等;
系统设计,本章包括系统的功能结构图、数据库设计等;
系统实现,本章采用系统运行截图加文字进行本系统的详细介绍;
系统测试,本章采用测试的方法进行主要核心功能的测试介绍;
(3)第三部分为总结、致谢、参考文献。
第2章 系统分析
2.1系统使用相关技术分析
2.1.1Java语言介绍
Java语言是一种分布式的简单的 开发语言,有很好的 特征,在安全方面、性能方面等。非常适合在Internet环境中使用,也是目前企业级运用中最常用的一个编程语言,具有很大的影响力。主要是通过面向对象的形式进行开发,这样的话,就更能满足人们的需求。在编程开发使用中,主要通过封装的方式,通过类来实现,具有很好的可编辑行和操作性,这就是面向对象语言的最大特性,还可以在同一个类中把共同特性的类封装起来,形成一个抽象类,抽象类形容的不是一个对象,而是一个实体,这样就使用过程中就可以进行实例化,达到更好的效果。类之间还可以进行继承,比如一个类可以把另个类的特征进行继承,这样就可以重复使用,所以说这种继承性的类实际上还是同一个类体,这样就可以达到最大的效果。通过java开发的代码还有很好的扩展性,可以通过不同的类达到的不同的效果,更好的提高使用效率,而且在后期维护方面非常的方便,开发的代码更加实用,更加简洁。
2.1.2Mysql数据库介绍
Mysql数据库是Oracle公司推出的一个数据库管理软件,有很好的性能设计,可以充分发挥和利用互联网的优势,而且在数据库管理方面非常的方便,支持图形化管理,非常适合新手的使用,可以直接在本地进行数据管理和配置,而且有很强大的数据处理能力,还有很好的安全性。在数据存储的过程中可以支持多处理器的存储结构,可以自动生产和处理sql语句,有很强大的数据读取和复制存储功能,最最重要的是一个开放式的数据软件,可以为开放人员提供一个很好的数据库管理平台。
2.1.3Tomcat服务器介绍
Tomcat服务器是一个小型的轻量级服务器,非常适合一些小型的系统和本地的服务器使用,特别适合一些新手开发者使用。Tomcat服务器主要是当成java程序的服务器使用,Tomcat服务器相当于就是Apache的一个扩展应用,区别就是他可以独立运行,当客户端上配置好Tomcat服务器以后,就可以直接通过服务器对HTML页面完成数据访问和响应。非常受程序员的喜欢,因为占用的运行空间非常的小时,不影响服务器性能,而且扩展性很好,支持很多开发过程中常用的功能,可以根据开发者的需求进行不断的改进和完善,所以说Tomcat服务器是目前使用非常广泛的一个服务器。
2.1.4VUE技术介绍
VUE技术属于渐进式的框架,VUE框架和其它框架最大的区别就是VUE框架是由下向上开发的技术。这种特点可以简化项目的开发,对于新手非常友好。VUE框架的核心在于图层,可以和其它的项目合并,也可以和其它的第三方平台合作使用。
2.1.5 SSM框架介绍
SSM框架技术在使用时非常简单,只要安装好SSM后,想要使用样式直接导入就行,不需要再自己重新建立。在选择好的样式里查看代码,然后把需要的代码复制到VUE里就可以直接使用,非常简单。SSM框架由Spring和SpringMVC、Mybatis组成。Spring负责粘合,把指定参数的实例化方法用到所需要的对象中,SpringMVC负责拦截,Mybatis负责封装。
2.2系统可行性分析
系统是否可行决定了系统开发的成功性。想要系统的设计工作不会白费就需要经过详细的系统可行性分析。根据充分调查和参考相关论文发现,系统的可行性分析一般包括系统的技术可行性分析、系统的经济可行性分析、系统的操作可行性分析三种。
2.2.1系统经济可行性分析
本系统是Web型的管理平台,采用的Java语言开发的,开发周期比较短,而且技术成熟,所以在开发过程中没有过高的投入要求,有很好的经济可行性。
2.2.2系统技术可行性分析
本系统采用的技术有VUE网页技术、Mysql数据库、B/s模式、Java语言等。
(1)通过VUE进行前台的页面开发,具有很好的稳定性,而且可以直接在线升级维护,可以更方便的实现数据管理,通过VUE的最大特征就是系统提前已经自动完成了很大不重要的简单工作,可以自动生成很多常规代码,这样减少很大的工作量。而且VUE技术非常成熟,可以参考的案例也非常多。
(2)数据库采用Mysql数据库,也是非常适合学生用的一款小型数据库,使用起来非常的简单,而且数据处理效率高。
(3)采用B/s模式的网站已经是目前的开发主流,也是未来的发展方向。
(4)采用Java语言进行后台代码的开发,是面向对象的开发语言,可以直接查看和调用已用的案例,可以直接调用XML服务,而且兼容性非常的强,不管是哪个平台,都可以直接调用,而且是通用的,可以提高开发者的工作效率,而且有很好的灵活性,使用起来非常的方便。
所以通过以上几点的分析,开发人员只要能熟练的操作以上的技术就行,具有开发技术可行性。
2.2.3系统操作可行性分析
因为本系统是采用B/s的架构模式进行开发的,所以只有安装的有浏览器和数据库服务器就可以进行系统的访问的使用。而且非常的简单易操作,普通用户只需要有最简单的互联网操作经验就行。
2.3系统需求分析
现在网上管理系统的技术发展已经非常成熟,各大公司的使用率也非常可观,特别是在一些重要的行业里使用率更高。个人日常事务管理系统可以方便用户更快的解决自己的问题,并且售后升级维护非常简单。现在实体企业里也会采用线上、线下相结合的方式进行工作,各部门的资料可以共享调用,工作内容可以在线发布,非常适合现代生活。个人日常事务管理系统是时代的趋势,其需求性不言而喻。
2.3.1传统管理系统优缺点分析
在最早出现的管理系统中主要使用人为工作人员,这类管理系统主要是采用C/s模式,这种模式可以保证数据的安全和存储性,数据库采用的也都是复杂、高性能的数据库,这类管理系统需要使用人员经过定期的培训才可以使用。随着网络的快速发展,这类管理系统的缺点也逐渐暴露出来,由于采用C/s模式就必须要求固定的客户端,这就需要足够严格的客户端条件,一旦客户端出现问题,系统里的数据都会出现问题,稳定性差,而且C/s模式的系统最大的问题是不能多次修改,如果系统经过了多次的补充、修改就会造成运行出错,为系统的使用造成不便。传统的管理系统通常采用的是脚本语言,脚本语言不够成熟,更容易出错,造成使用人员的损失。
2.3.2本个人日常事务管理系统分析
通过对传统管理系统的分析发现主要问题在于系统的模式架构上和数据库上。想要数据更为稳定就需要更稳定的数据库,好的数据库可以保证系统拥有更大的容错率和移植性,也可以在多种数据库中进行相互结合以此来保证系统里数据的安全。同时还需要注意系统的延续性,时代不断的发展,就会要求系统的服务更加的完善。想要使系统的生命周期更长就需要更为成熟的开发语言、技术、环境等。
本个人日常事务管理系统采用的模式架构为B/s,B/s框架可以脱离固定的客户端,把系统部署到浏览器上供用户使用,还可以把功能进行模块划分使数据库和操作界面分开,这样可以实现当任何一方出现问题时,另一方不受影响。数据库采用Mysql,Mysql数据库可以单独运行,当用户在进行操作后可自动保存操作后的数据,改变需要去数据库里修改数据的问题。开发语言采用Java,Java语言为动态语言,使用时间长久,已发展的非常成熟。本系统的其它技术包括Eclipse运行软件,VUE网页技术,Html技术等都是经过时间考验的。
2.4系统功能分析
本人参考大量的办公管理软件以及充分调查用户和管理员需求,设计出的本个人日常事务管理系统使用角色为用户、管理员。框架界面分为用户操作界面、管理员操作界面。用户的功能设计为个人信息修改、密码重置、日常事务安排、消费记录登记以及设置重要提醒,管理员的功能设计为用户信息更新、管理员账号设置和密码重置、日常事务查询和安排、消费记录查询和记录、重要提醒信息查询和设置以及消费类型、事务类型、提醒类型的划分。
2.5系统性能分析
在系统分析中还有重要的一点就是系统的性能分析,除却系统的功能分析其它问题都可以划分到系统的性能分析。主要包括系统数据问题、系统运行问题、系统安全问题。
- 系统数据问题表现在数据库的设计中,因为个人日常事务管理系统的核心在于各类信息的管理,在统计信息操作中会引起多种数据的变化。想要数据在变化时不会出错就需要在数据库设计时注意不同数据字段、类型等的主外键联系;
- 系统的运行问题表现在多平台、多人在运行系统时的稳定性。系统的运行速度也需要注意,运行的卡顿、读码速度等都需要经过多次测试;
- 系统的安全性问题表现在不同角色的使用权限,用户做为普通人员的角色不能越权,管理员做为权限最多的角色要可以管理其它几种角色。
2.6用例图
根据功能分析得出,本系统的主要使用角色为管理员和用户。用户可以查看日常安排、设置安排信息、记录消费情况和设置重要提醒等。管理员可以管理管理员信息、用户的资料、管理基础数据、消费记录、重要提醒信息等。系统管理员用例图如下图2-1所示:
图2-1个人日常事务管理系统管理员用例图
用户用例图如下图2-2所示:
图2-2个人日常事务管理系统用户用例图
2.7系统业务流程
业务流程可以按照用户使用本系统的步骤进行设计。本系统中用户的流程为管理日常安排、消费记录、重要提醒、个人资料信息。管理员的流程为管理用户信息、管理员信息、管理日常安排信息、重要提醒信息、消费记录信息等。个人日常事务管理系统的业务流程如下图2-2所示:
图2-2个人日常事务管理系统业务流程图
(1)用户登录是使用本系统的必经之路,在登录时需要输入信息、判断信息。用户登录的流程图如下图2-3所示:
图2-3用户登录的流程图
(2)用户设置重要提醒时需要判断填写的信息是否正确,当填写的信息都为正确时才可以把提醒信息设置成功。用户设置重要提醒流程图如下图2-4所示:
图2-4用户设置重要提醒流程图
第3章 系统设计
3.1系统体系结构
系统的体系结构非常重要,往往决定了系统的质量和生命周期。针对不同的系统可以采用不同的系统体系结构。本系统为个人日常事务管理系统,属于开放式的平台,所以在体系结构中采用B/s。B/s结构抛弃了固定客户端要求,采用服务器、客户端的模式。用户操作界面和管理员操作界面分开展示。B/s结构基于互联网,需要网络的支持,由用户在浏览器上发布命令,服务器负责向数据库传送命令,最后再由服务器把反馈的结果传回浏览器给用户进行呈现。
3.2系统功能结构
系统的功能结构是系统实现的框架,本系统的主要结构为管理员和用户。管理员的功能为个人中心管理、用户管理、基础数据信息管理、日常安排信息管理、消费记录信息管理、重要提醒信息管理等。用户的功能为个人中心管理、日常安排信息管理、消费记录管理和重要提醒信息管理等。本个人日常事务管理系统功能结构图如下图3-1所示:
图3-1个人日常事务管理系统功能结构图
3.3数据库设计
数据库设计在系统设计中占有重大比例,数据库的设计包括ER图设计和数据库表设计。
3.3.1ER图设计
根据本系统的特点,本系统设计的主要实体包括管理员信息、用户信息、消费记录信息、重要提醒信息、日常安排信息等。
- 管理员ER图包括的属性有管理员的编号、用户名和密码。管理员ER图如下图3-2所示:
图3-2管理员实体的ER图
- 日常安排信息包含的属性为日常安排的详细描述,有编号、安排时间等。日常安排信息ER图如下图3-3所示:
图3-3日常安排信息实体ER图
(3)用户信息的属性包括用户的个人资料,有姓名、性别、电话等。用户信息实体ER图如下图3-4所示:
图3-4用户实体ER图
(4)重要提醒信息实体的属性有编号、用户姓名等。重要提醒信息实体ER图如下图3-5所示:
图3-5重要提醒信息实体ER图
(7)本个人日常事务管理系统的整体实体关系图如下图3-6所示:
图3-6系统关系ER图
3.3.2数据库表设计
根据数据ER图的设计,本系统的数据库表有管理员信息表、用户信息表、重要提醒信息表、日常安排信息表等。本系统的数据库表如下图3-1至3-8所示:
表3-1 config
表3-2 dictionary
表3-3 richanganpai
表3-4 token
表3-5 users
表3-6 xiaofeijilu
表3-7 yonghu
表3-8 zhongyaotixing
第4章 系统实现
4.1系统调试运行
在电脑上安装Eclpse软件和Mysql软件后,先打开Mysql软件,运行数据库。数据库运行成功后可以看到本系统所创建的所有数据库表。然后打开Eclipse软件,在打开本系统的源码后可以进行运行,运行成功后可以出现系统登录的界面。系统调试运行界面如下图4-1所示:
图4-1系统运行调试界面
4.2登录功能的界面实现
系统运行调试后,需要登录。登录界面设计的目的是保证当前的使用角色等级。管理员同样需要登录后才可以进行操作。在登录界面里加入了权限的选择,在登录时只需要填写用户账号和密码、选择权限就可以实现。用户登录的运行界面如下图4-2所示:
图4-2用户登录的运行界面
在登录的界面中包含的元素有系统题目、输入框、登录按钮、选择框。本系统的使用权限为管理员和用户。权限选择框的运行界面如下图4-3所示:
图4-3权限选择框运行界面
4.3管理员功能的设计实现
4.3.1用户信息管理功能的实现界面
用户的信息可由管理员审核,用户的资料由注册时形成。本功能设计的目的是查询和审核用户的资料,当发现不当的使用用户可以删除其账号。当删除用户信息后相对应的用户信息表里的信息也会随着删除掉。查询用户信息功能的运行界面如下图4-4所示:
图4-4查询用户信息功能的运行界面
4.3.2 个人中心管理功能的实现界面
个人中心管理的内容包括修改密码和个人信息的修改。本系统中可以拥有多个管理员。个人中心管理功能的运行界面如下图4-5所示:
图4-5个人中心管理功能的运行界面
4.3.3日常安排管理功能的实现界面
用户浏览的日常安排都是由管理员在此功能里进行维护添加的,同样当管理员添加、编辑日常安排信息后,数据库表中的日常安排信息表也会发生改变。日常安排信息管理功能的运行界面如下图4-6所示:
图4-6日常安排信息管理功能的运行界面
在添加日常安排信息时可以取消和提交。发布新日常安排的运行界面如下图4-7所示:
图4-7发布新日常安排的运行界面
4.3.4 基础数据管理功能的实现界面
管理员可以设置消费类型、提醒类型、安排类型。类型的编号不能为空。设置消费类型功能的运行界面如下图4-8所示:
图4.8设置消费类型运行界面
输入提醒类型可以查询提醒。提醒类型查询运行界面如下图4-9所示:
图4-9提醒类型查询的运行界面展示
4.3.5消费记录管理功能的实现界面
管理员可以记录日常的消费信息并查询其它用户发布的消费记录和进行必要的修改、删除。查询消费记录信息功能的实现界面如下图4-10所示:
图4-10查询消费记录信息功能的实现界面
4.3.6重要提醒管理功能的实现界面
管理员可以设置重要提醒的信息,也可以看到其它用户设置的重要提醒内容。管理员查询重要提醒信息的实现界面如下图4-11所示:
图4-11管理员查询重要提醒的实现界面
4.4用户角色功能的界面实现
4.4.1日常安排管理功能的界面实现
用户可以查询日常安排详情,也可以输入日常安排标题进行日常安排信息的查询,还要以发布新的日常安排信息,用户发布日常安排信息功能的运行界面如下图4-12所示:
图4-12用户发布新日常安排信息功能的运行界面
4.4.2重要提醒管理功能的实现界面
用户可以查询重要提醒的内容也可以设置新的重要提醒信息。查询重要提醒信息功能的运行界面如下图4-13所示:
图4-13查询重要提醒信息功能的运行界面
4.4.3个人资料管理功能的实现界面
用户可以修改个人的资料,可以使个人的资料更准确。修改个人资料的实现界面如下图4-14所示:
图4-14修改个人资料的功能实现界面
4.4.4消费记录管理功能的界面实现
用户可以查询自己的消费记录并登记新的消费记录。消费记录查询功能的实现界面如下图4-15所示:
图4-15消费记录查询功能的实现界面
第5章 系统测试
系统测试的方
CommonUtil.java
package com.utils;
import java.util.Random;
public class CommonUtil {
/**
* 获取随机字符串
*
* @param num
* @return
*/
public static String getRandomString(Integer num) {
String base = "abcdefghijklmnopqrstuvwxyz0123456789";
Random random = new Random();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < num; i++) {
int number = random.nextInt(base.length());
sb.append(base.charAt(number));
}
return sb.toString();
}
}
ZhongyaotixingController.java
package com.controller;
import java.io.File;
import java.math.BigDecimal;
import java.net.URL;
import java.text.SimpleDateFormat;
import com.alibaba.fastjson.JSONObject;
import java.util.*;
import org.springframework.beans.BeanUtils;
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.context.ContextLoader;
import javax.servlet.ServletContext;
import com.service.TokenService;
import com.utils.*;
import java.lang.reflect.InvocationTargetException;
import com.service.DictionaryService;
import org.apache.commons.lang3.StringUtils;
import com.annotation.IgnoreAuth;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.entity.*;
import com.entity.view.*;
import com.service.*;
import com.utils.PageUtils;
import com.utils.R;
import com.alibaba.fastjson.*;
/**
* 重要提醒
* 后端接口
* @author
* @email
*/
@RestController
@Controller
@RequestMapping("/zhongyaotixing")
public class ZhongyaotixingController {
private static final Logger logger = LoggerFactory.getLogger(ZhongyaotixingController.class);
@Autowired
private ZhongyaotixingService zhongyaotixingService;
@Autowired
private TokenService tokenService;
@Autowired
private DictionaryService dictionaryService;
//级联表service
@Autowired
private YonghuService yonghuService;
/**
* 后端列表
*/
@RequestMapping("/page")
public R page(@RequestParam Map<String, Object> params, HttpServletRequest request){
logger.debug("page方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params));
String role = String.valueOf(request.getSession().getAttribute("role"));
if(false)
return R.error(511,"永不会进入");
else if("用户".equals(role))
params.put("yonghuId",request.getSession().getAttribute("userId"));
if(params.get("orderBy")==null || params.get("orderBy")==""){
params.put("orderBy","id");
}
PageUtils page = zhongyaotixingService.queryPage(params);
//字典表数据转换
List<ZhongyaotixingView> list =(List<ZhongyaotixingView>)page.getList();
for(ZhongyaotixingView c:list){
//修改对应字典表字段
dictionaryService.dictionaryConvert(c, request);
}
return R.ok().put("data", page);
}
/**
* 后端详情
*/
@RequestMapping("/info/{id}")
public R info(@PathVariable("id") Long id, HttpServletRequest request){
logger.debug("info方法:,,Controller:{},,id:{}",this.getClass().getName(),id);
ZhongyaotixingEntity zhongyaotixing = zhongyaotixingService.selectById(id);
if(zhongyaotixing !=null){
//entity转view
ZhongyaotixingView view = new ZhongyaotixingView();
BeanUtils.copyProperties( zhongyaotixing , view );//把实体数据重构到view中
//级联表
YonghuEntity yonghu = yonghuService.selectById(zhongyaotixing.getYonghuId());
if(yonghu != null){
BeanUtils.copyProperties( yonghu , view ,new String[]{ "id", "createTime", "insertTime", "updateTime"});//把级联的数据添加到view中,并排除id和创建时间字段
view.setYonghuId(yonghu.getId());
}
//修改对应字典表字段
dictionaryService.dictionaryConvert(view, request);
return R.ok().put("data", view);
}else {
return R.error(511,"查不到数据");
}
}
/**
* 后端保存
*/
@RequestMapping("/save")
public R save(@RequestBody ZhongyaotixingEntity zhongyaotixing, HttpServletRequest request){
logger.debug("save方法:,,Controller:{},,zhongyaotixing:{}",this.getClass().getName(),zhongyaotixing.toString());
String role = String.valueOf(request.getSession().getAttribute("role"));
if(false)
return R.error(511,"永远不会进入");
else if("用户".equals(role))
zhongyaotixing.setYonghuId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId"))));
Wrapper<ZhongyaotixingEntity> queryWrapper = new EntityWrapper<ZhongyaotixingEntity>()
.eq("yonghu_id", zhongyaotixing.getYonghuId())
.eq("zhongyaotixing_name", zhongyaotixing.getZhongyaotixingName())
.eq("zhongyaotixing_types", zhongyaotixing.getZhongyaotixingTypes())
;
logger.info("sql语句:"+queryWrapper.getSqlSegment());
ZhongyaotixingEntity zhongyaotixingEntity = zhongyaotixingService.selectOne(queryWrapper);
if(zhongyaotixingEntity==null){
zhongyaotixing.setInsertTime(new Date());
zhongyaotixing.setCreateTime(new Date());
zhongyaotixingService.insert(zhongyaotixing);
return R.ok();
}else {
return R.error(511,"表中有相同数据");
}
}
/**
* 后端修改
*/
@RequestMapping("/update")
public R update(@RequestBody ZhongyaotixingEntity zhongyaotixing, HttpServletRequest request){
logger.debug("update方法:,,Controller:{},,zhongyaotixing:{}",this.getClass().getName(),zhongyaotixing.toString());
String role = String.valueOf(request.getSession().getAttribute("role"));
// if(false)
// return R.error(511,"永远不会进入");
// else if("用户".equals(role))
// zhongyaotixing.setYonghuId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId"))));
//根据字段查询是否有相同数据
Wrapper<ZhongyaotixingEntity> queryWrapper = new EntityWrapper<ZhongyaotixingEntity>()
.notIn("id",zhongyaotixing.getId())
.andNew()
.eq("yonghu_id", zhongyaotixing.getYonghuId())
.eq("zhongyaotixing_name", zhongyaotixing.getZhongyaotixingName())
.eq("zhongyaotixing_types", zhongyaotixing.getZhongyaotixingTypes())
;
logger.info("sql语句:"+queryWrapper.getSqlSegment());
ZhongyaotixingEntity zhongyaotixingEntity = zhongyaotixingService.selectOne(queryWrapper);
if(zhongyaotixingEntity==null){
zhongyaotixingService.updateById(zhongyaotixing);//根据id更新
return R.ok();
}else {
return R.error(511,"表中有相同数据");
}
}
/**
* 删除
*/
@RequestMapping("/delete")
public R delete(@RequestBody Integer[] ids){
logger.debug("delete:,,Controller:{},,ids:{}",this.getClass().getName(),ids.toString());
zhongyaotixingService.deleteBatchIds(Arrays.asList(ids));
return R.ok();
}
/**
* 批量上传
*/
@RequestMapping("/batchInsert")
public R save( String fileName, HttpServletRequest request){
logger.debug("batchInsert方法:,,Controller:{},,fileName:{}",this.getClass().getName(),fileName);
Integer yonghuId = Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId")));
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
List<ZhongyaotixingEntity> zhongyaotixingList = new ArrayList<>();//上传的东西
Map<String, List<String>> seachFields= new HashMap<>();//要查询的字段
Date date = new Date();
int lastIndexOf = fileName.lastIndexOf(".");
if(lastIndexOf == -1){
return R.error(511,"该文件没有后缀");
}else{
String suffix = fileName.substring(lastIndexOf);
if(!".xls".equals(suffix)){
return R.error(511,"只支持后缀为xls的excel文件");
}else{
URL resource = this.getClass().getClassLoader().getResource("../../upload/" + fileName);//获取文件路径
File file = new File(resource.getFile());
if(!file.exists()){
return R.error(511,"找不到上传文件,请联系管理员");
}else{
List<List<String>> dataList = PoiUtil.poiImport(file.getPath());//读取xls文件
dataList.remove(0);//删除第一行,因为第一行是提示
for(List<String> data:dataList){
//循环
ZhongyaotixingEntity zhongyaotixingEntity = new ZhongyaotixingEntity();
// zhongyaotixingEntity.setYonghuId(Integer.valueOf(data.get(0))); //用户 要改的
// zhongyaotixingEntity.setZhongyaotixingName(data.get(0)); //提醒名称 要改的
// zhongyaotixingEntity.setZhongyaotixingTypes(Integer.valueOf(data.get(0))); //提醒类型 要改的
// zhongyaotixingEntity.setAnpaiTime(sdf.parse(data.get(0))); //提醒时间 要改的
// zhongyaotixingEntity.setZhongyaotixingContent("");//详情和图片
// zhongyaotixingEntity.setInsertTime(date);//时间
// zhongyaotixingEntity.setCreateTime(date);//时间
zhongyaotixingList.add(zhongyaotixingEntity);
//把要查询是否重复的字段放入map中
}
//查询是否重复
zhongyaotixingService.insertBatch(zhongyaotixingList);
return R.ok();
}
}
}
}catch (Exception e){
e.printStackTrace();
return R.error(511,"批量插入数据异常,请联系管理员");
}
}
}
DictionaryServiceImpl.java
package com.service.impl;
import com.utils.StringUtil;
import org.springframework.stereotype.Service;
import java.lang.reflect.Field;
import java.util.*;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.transaction.annotation.Transactional;
import com.utils.PageUtils;
import com.utils.Query;
import org.springframework.web.context.ContextLoader;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import com.dao.DictionaryDao;
import com.entity.DictionaryEntity;
import com.service.DictionaryService;
import com.entity.view.DictionaryView;
/**
* 字典 服务实现类
*/
@Service("dictionaryService")
@Transactional
public class DictionaryServiceImpl extends ServiceImpl<DictionaryDao, DictionaryEntity> implements DictionaryService {
@Override
public PageUtils queryPage(Map<String,Object> params) {
if(params != null && (params.get("limit") == null || params.get("page") == null)){
params.put("page","1");
params.put("limit","10");
}
Page<DictionaryView> page =new Query<DictionaryView>(params).getPage();
page.setRecords(baseMapper.selectListView(page,params));
return new PageUtils(page);
}
/**
* 赋值给字典表
* @param obj view对象
*/
public void dictionaryConvert(Object obj, HttpServletRequest request) {
try {
if (obj == null) return;
//当前view和entity中的所有types的字段
List<String> fieldNameList = new ArrayList<>();
Class tempClass = obj.getClass();
while (tempClass !=null) {
Field[] declaredFields = tempClass.getDeclaredFields();
for (Field f : declaredFields) {
f.setAccessible(true);
if (f.getType().getName().equals("java.lang.Integer") && f.getName().contains("Types")) {
fieldNameList.add(f.getName());
}
}
tempClass = tempClass.getSuperclass(); //得到父类,然后赋给自己
}
// 获取监听器中的字典表
// ServletContext servletContext = ContextLoader.getCurrentWebApplicationContext().getServletContext();
ServletContext servletContext = request.getServletContext();
Map<String, Map<Integer, String>> dictionaryMap= (Map<String, Map<Integer, String>>) servletContext.getAttribute("dictionaryMap");
//通过Types的值给Value字段赋值
for (String s : fieldNameList) {
Field types = null;
if(hasField(obj.getClass(),s)){
//判断view中有没有这个字段,有就通过反射取出字段
types= obj.getClass().getDeclaredField(s);//获取Types私有字段
}else{
//本表中没有这个字段,说明它是父表中的字段,也就是entity中的字段,从entity中取值
types=obj.getClass().getSuperclass().getDeclaredField(s);
}
Field value = obj.getClass().getDeclaredField(s.replace("Types", "Value"));//获取value私有字段
//设置权限
types.setAccessible(true);
value.setAccessible(true);
//赋值
if (StringUtil.isNotEmpty(String.valueOf(types.get(obj)))) { //types的值不为空
int i = Integer.parseInt(String.valueOf(types.get(obj)));//type
//把s1字符中的所有大写转小写,并在前面加 _
char[] chars = s.toCharArray();
StringBuffer sbf = new StringBuffer();
for(int b=0; b< chars.length; b++){
char ch = chars[b];
if(ch <= 90 && ch >= 65){
sbf.append("_");
ch += 32;
}
sbf.append(ch);
}
String s2 = dictionaryMap.get(sbf.toString()).get(i);
value.set(obj, s2);
} else {
new Exception("字典表赋值出现问题::::"+value.getName());
value.set(obj, "");
}
}
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 判断本实体有没有这个字段
* @param c
* @param fieldName
* @return
*/
public boolean hasField(Class c, String fieldName){
Field[] fields = c.getDeclaredFields();
for (Field f : fields) {
if (fieldName.equals(f.getName())) {
return true;
}
}
return false;
}
}
home.vue
<template>
<div class="content">
<div class="text main-text">欢迎使用 {{this.$project.projectName}}</div>
</div>
</template>
<script>
import router from '@/router/router-static'
export default {
mounted(){
this.init();
},
methods:{
init(){
if(this.$storage.get('Token')){
this.$http({
url: `${this.$storage.get('sessionTable')}/session`,
method: "get"
}).then(({ data }) => {
if (data && data.code != 0) {
router.push({ name: 'login' })
}
});
}else{
router.push({ name: 'login' })
}
}
}
};
</script>
<style lang="scss" scoped>
.content {
display: flex;
align-items: center;
flex-direction: column;
width: 100%;
height: 100%;
min-height: 500px;
text-align: center;
.main-text{
font-size: 38px;
font-weight: bold;
margin-top: 15%;
}
.text {
font-size: 24px;
font-weight: bold;
color: #333;
}
}
</style>
声明
本博客适用于广泛的学术和教育用途,包括但不限于个人学习、开发设计,产品设计。仅供学习参考,旨在为读者提供深入理解和学术研究的材料。
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » 如何使用ssm实现个人日常事务管理系统+vue
发表评论 取消回复