如何使用ssm实现基于Java的校园二手物品交易平台的设计与实现+vue

@TOC

ssm789基于Java的校园二手物品交易平台的设计与实现+vue

绪论

1.1 研究背景

在这个推荐个性化的时代,采用新技术开发一个校园二手物品交易平台来分享和展示内容是一个永恒不变的需求。本次设计的校园二手物品交易平台有管理员,商家,用户三个角色。管理员功能有个人中心,管理员管理,论坛信息管理,公告类型管理,商家信用类型管理,商品类型管理,公告信息管理,商家管理,商品管理,用户管理,轮播图管理。商家可以注册和登录,个人中心,查看公告信息,在论坛里面发布帖子并且可以查看论坛回复,管理自己发布的商品信息,商品留言信息,商品收藏信息,商品订单信息等。用户可以注册和登录,在论坛里面发布自己的帖子,查看和购买商品信息,并且对商品信息进行收藏和留言,可以把商品添加到购物车进行操作,生成订单等操作。

1.2 研究现状

国内电子商务的发展也是经历了不少模式的变更和发展。也反映出了电子商务的蓬勃的发展力。第一个是一个商对客铅,但后来因为库存,物流,分销,而麻烦的回报,近两年来中国巨大的个人用户社区C2C模式开始无限风光。与此同时,B2B则因为交易的专业性更强、额度更高而保持着稳定的发展势头。

国外的电子商务的发展可以说是日新月异。在英法等这些欧洲国家,将近1/4的商务总额都源于电子商务,在美国,比例高达1/3甚至更多。同时,电子商务的发展是迅速的发展在欧洲和美国和其他西方国家,甚至改变国家的GDP原始积累型同时,电子商务的发展是迅速的发展在欧洲和美国和其他西方国家,甚至改变国家的GDP原始积累型,对一些发达国家的商业事务的近1/4在欧洲的总金额是来自电子商务。

我国的校园电子商务还处于比较落后的阶段,即使己经开始实施的学校大多也都停留着比较低级的方面,也受着一些方面的制约,大多都局限在一定的范围内发展。与此同时,学校人口的密集、单笔交易量少的问题也都在制约着校园电子商务的发展。

目前,国内二手交易网站主要有两种形式:一是拍卖网站,类似淘宝网,另一个是对交易信息平台,各方论坛发布,并提供站连接,类似这样的网站的欢乐。但这两种形式有缺陷。拍卖网站的时间较长,需要对交易的双方都花费大量的时间和精力。适用于高价值的商品,但不适合大学生闲置物品。而以论坛为平台的交易模式,其只是以论坛为媒介,在论坛上发售相关需求信息,并不是专业的交易平台。一般没有专们的商品检索服务以及良好的购物体验。固然,这类形式每每缺少买卖规矩管制,无有保障买卖者的信誉保障,也无信誉评价系统,买卖者要担当"危害"。

相比国内电子商务发展缓慢,早期国外电子商务的发展,高等院校依靠本国完善的贸易办事体系和信誉表现开展了校内网上买卖、支岀等各类型的贸易买卖,这些为其学校师生的工作生活带来了方便。例如,许多大学的学生可以登录校园卡网站在线购物用信用卡或智能,实现拍卖二手商品和其他功能。

电子商务的发展给校园二手交易的发展带来了机会,近些年来大数据的出现使人们认识到了挖掘大数据背后的重要意义。伴随着这一趋势,数据挖掘等的出现也使得电子商务的体验有了很大的提升。同时由于现阶段的校园二手商品交易多存在于论坛,普遍没有一个可靠的评价体系,因此也有更多的校园二手交易系统将两者结合起来开发校园二手交易系统。

由于以往的二手交易多存在于论坛中,这样有比较高的风险。现阶段的二手交易系统中引入了信用评价机制。同时,定向推荐的加入以及商品推荐的加入将能更好的满足用户对于购物的需求。考虑近况重要体现在如下两个方面:

(1)信用评价

信用评价是信用中介机构行驶模糊数学、神经网络、期权订价等数学方式和模子,对根本信用数据进行剖析打算,做出对信用程度的评价参数,和一个贸易实体信用的实数编码形成信用系数,信用等级标识的过程。所谓电子商务信用评价体系,是指买卖双方在一笔买卖完成后,在评价有效期内,按照此次买卖的情形对买卖对象进行彼此评价,构成信用的信息反馈,和所有的用户评价是按照一定的方式对用户的信用和信用记录聚集,以反映用户的信用状况,为其他用户进行交易决策,参考。

而信用信息的信用评价系统作为一种交流工具,它的目的是帮助交易双方的贸易伙伴了解信用状况,限制交易行为,减少交易风险,提高交易的成功率。例如,当前,很多C2C电子商务站点纷繁创建了各自信用评价体系,如淘宝、"ebay"等。各网站的信用评价条列有所不同,如有的网站釆纳"所有评价一起积分"的轨制,有的网站则采纳"买卖信用值分离"的轨制,但评价为"好"和"评论","差评"三层,分别对应于1,0,-1评分。

(2)商品推荐系统

现今的过于系统主要以协同过滤和知识为基础的推荐。协同过滤方法的核心思想是:用户更喜欢那些志同道合的人所喜欢的项目。一个协同过滤推荐系统(CFRS),因此,做出预测给一个用户是基于在这个用户的兴趣档案和那些其他用户兴趣的相似性。以知识为基础的推荐系统(KBRS)产生推荐给一个用户通过咨询其基于产品领域的知识,然后推理出哪些项目将能最大限度的满足用户的需求。但是由于协同过滤的自身的一些缺点,比如需要在做岀推荐前就拥有一个一定数量的用户喜好数据库来帮助系统做出推荐。所以来自渥太华大学的Thomas Tran将这两种方法集成起来,提出了一种基于协同过滤和以知识为基础过滤的方法"。

1.3 研究意义

通过网络进行文章的转移展示,可以让用户和商家都能感受到互联网的魅力,让用户解除了地理的远近的限制和降低欣赏时间的成本。本次开发的校园二手物品交易平台具有下面的意义:

第一,现实中租赁场地欣赏文章与互联网办公设备的费用比较起来可谓是天上地下,能有效的节约成本。

第二,用户和商家都可以通过网络查看,避免了线下来回路费的实际成本。

综上所述,网络展示可以让展示变得更加灵活,是对传统展示模式的突破与变革,对于众多用户以及商家都有很强烈的吸引力和亲和力,在互联网时代真正实现了多环节的多赢。

1.4 研究内容

本文主要对已开发程序进行文档说明,文章从绪论,开发技术,系统分析与设计,系统实现与测试等环节进行程序描述。

绪论:绪论部分主要从课题的背景,课题的意义等角度进行阐述。

开发技术:开发技术部分主要还是介绍开发的平台,使用的技术与开发的语言等内容。

系统分析:系统分析部分主要还是分析系统的运行流程与系统需要具备的功能等进行分析。

系统设计:系统设计主要还是基于系统分析,从系统分析得出的功能进行详细设计和数据库设计。

系统实现:系统实现主要运用开发知识对系统设计的功能进行实现。

系统测试:系统测试主要检测完成开发程序整体运行是否报错,程序运行使用是否可靠。

2 开发技术

2.1 VUE框架

Vue.js(读音 /vjuː/, 类似于 view) 是一套构建用户界面的渐进式框架。

Vue 只关注视图层, 采用自底向上增量开发的设计。

Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。

Vue.js是一款流行的JavaScript前端框架,是一个用于创建用户界面的开源JavaScript框架,也是一个创建单页应用的Web应用框架。

1.Vue常见的框架: Element:一套为开发者,设计师和产品经理准备的基于Vue 2.0的桌面端组件库;iview:主要服务于PC界面的中后台产品。

2.vue的优势:轻量级框架、简单易学、双向数据绑定、组件化、数据和结构的分离、虚拟DOM、运行速度快;缺点:Vue 不缺入门教程,可是很缺乏高阶教程与文档。同样的还有书籍;VUE不支持IE8;生态环境差不如angular和react。

3.React与Vue最大的区别是模板的编写。Vue鼓励去写近似常规HTML的模板。写起来很接近标准HTML元素,只是多了一些属性。这些属性也可以被使用在单文件组件中,尽管它需要在在构建时将组件转换为合法的JavaScript和HTML。

2.2 MySQL数据库

关于程序的数据结构设计,数据的字段设计,为了更好的、更规范的使用数据库,在数据库里进行了字段的设计挑选。关系型数据库可挑选范围不广,基本上也就是甲骨文公司的Oracle和MySQL,微软的SQL SERVER和ACCESS,IBM的DB2数据库,常用的也就5个,根据课题需求,创建的程序进行选择数据库的时候,最重要的一条就是符合课题设计的需要,在五个数据库里可以说都符合,但是从课题的需求具体分析,Oracle明显不合适,维护难,又比较臃肿,课题程序只用到了里面很少一部分,SQL SERVER数据库安装维护方面动不动就需要重装系统,因为操作系统的限制,也不采用SQL SERVER,ACCESS数据库比较简单小巧,但是安全性方面还有语言支持方面比较片面,也不予考虑,DBM数据库接触较少也不考虑,只有MySQL数据库,社区版完全的不用掏钱,并且是开源,值得信赖,从关系型数据库里挑选到MySQL,是因为完全符合课题需要,而且小巧,基本不占用硬盘的空间,处理性能也可以,这就是选择MySQL数据库作为课题程序所需要的数据库的理由。

2.3 SSM框架

SSM框架,是Spring + Spring MVC + MyBatis的缩写,这个是继SSH之后,目前比较主流的Java EE企业级框架,适用于搭建各种大型的企业级应用系统。

1.Spring简介

Spring是一个开源框架,Spring是于2003年兴起的一个轻量级的Java开发框架,由Rod Johnson在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。 简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。

A.控制反转(IOC)是什么呢?

IOC:控制反转也叫依赖注入。利用了工厂模式将对象交给容器管理,你只需要在spring配置文件总配置相应的bean,以及设置相关的属性,让spring容器来生成类的实例对象以及管理对象。在spring容器启动的时候,spring会把你在配置文件中配置的bean都初始化好,然后在你需要调用的时候,就把它已经初始化好的那些bean分配给你需要调用这些bean的类(假设这个类名是A),分配的方法就是调用A的setter方法来注入,而不需要你在A里面new这些bean了。

Spring 最认同的技术是控制反转的依赖注入(DI)模式。控制反转(IoC)是一个通用的概念,它可以用许多不同的方式去表达,依赖注入仅仅是控制反转的一个具体的例子。

当编写一个复杂的 Java 应用程序时,应用程序类应该尽可能的独立于其他的 Java 类来增加这些类可重用可能性,当进行单元测试时,可以使它们独立于其他类进行测试。依赖注入(或者有时被称为配线)有助于将这些类粘合在一起,并且在同一时间让它们保持独立。

到底什么是依赖注入?让我们将这两个词分开来看一看。这里将依赖关系部分转化为两个类之间的关联。例如,类 A 依赖于类 B。现在,让我们看一看第二部分,注入。所有这一切都意味着类 B 将通过 IoC 被注入到类 A 中。

依赖注入可以以向构造函数传递参数的方式发生,或者通过使用 setter 方法 post-construction。由于依赖注入是 Spring 框架的核心部分,所以我将在一个单独的章节中利用很好的例子去解释这一概念。

B.面向切面(AOP)又是什么呢?

首先,需要说明的一点,AOP只是Spring的特性,它就像OOP一样是一种编程思想,并不是某一种技术,AOP可以说是对OOP的补充和完善。OOP引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力。也就是说,OOP允许你定义从上到下的关系,但并不适合定义从左到右的关系。例如日志功能。日志代码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无关系。在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。将程序中的交叉业务逻辑(比如安全,日志,事务等),封装成一个切面,然后注入到目标对象(具体业务逻辑)中去。

实现AOP的技术,主要分为两大类:一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;二是采用静态织入的方式,引入特定的语法创建"方面",从而使得编译器可以在编译期间织入有关"方面"的代码。

简单点解释\],比方说你想在你的biz层所有类中都加上一个打印'你好,AOP'的功能这你经可以用aop思想来做,你先写个类写个方法,方法经实现打印'你好,AOP'让后你Ioc这个类 ref="biz.\*"让每个类都注入。 2.Spring MVC简介 Spring MVC属于Spring Framework的后续产品,已经融合在Spring Web Flow里面,它原生支持的Spring特性,让开发变得非常简单规范。Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。 3.MyBatis简介 MyBatis本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。MyBatis是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO)MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。可以这么理解,MyBatis是一个用来帮你管理数据增删改查的框架。 ### 2.4 layui介绍 layui 是一套开源的 Web UI 解决方案,采用自身经典的模块化规范,并遵循原生 HTML/CSS/JS 的开发方式,极易上手,拿来即用。其风格简约轻盈,而组件优雅丰盈,从源代码到使用方法的每一处细节都经过精心雕琢,非常适合网页界面的快速开发。layui 区别于那些基于 MVVM 底层的前端框架,却并非逆道而行,而是信奉返璞归真之道。准确地说,它更多是面向后端开发者,你无需涉足前端的各种工具,只需面对浏览器本身,让一切你所需要的元素与交互,从这里信手拈来。 ### 2.5 HTML技术介绍 超文本标记语言,标准通用标记语言下的一个应用。 "超文本"就是指页面内可以包含图片、链接,甚至音乐、程序等非文字元素。 超文本标记语言的结构包括"头"部分(英语:Head)、和"主体"部分(英语:Body),其中"头"部提供关于网页的信息,"主体"部分提供网页的具体内容。 语言概述 在WWW上的一个超媒体文档称之为一个页面(page)。作为一个组织或个人在万维网上开始点的页面称为主页Homepage,或首页,主页中通常包括有指向其他相关页面或其他节点的指针(超级链接)。在逻辑上将视为一个整体的一系列页面的有机集合称为网站(Website或Web)。 Web页面也就是通常所说的网页,在这里不作区分。 折叠规范标准 HTML是一种规范,一种标准,它通过标记符号来标记要显示的网页中的各个部分。网页文件本身是一种文本文件,通过在文本文件中添加标记符,可以告诉浏览器如何显示其中的内容(如:文字如何处理,画面如何安排,图片如何显示等)。浏览器按顺序阅读网页文件,然后根据标记符解释和显示其标记的内容,对书写出错的标记将不指出其错误,且不停止其解释执行过程,编制者只能通过显示效果来分析出错原因和出错部位。但需要注意的是,对于不同的浏览器,对同一标记符可能会有不完全相同的解释,因而可能会有不同的显示效果。 折叠标记语言 HTML之所以称为超文本标记语言,是因为文本中包含了所谓"超级链接"点------就是一种URL指针,通过激活(点击)它,可使浏览器方便地获取新的网页。这也是HTML获得广泛应用的最重要的原因之一。 由此可见,网页的本质就是HTML,通过结合使用其他的Web技术(如:脚本语言、CGI、组件等),可以创造出功能强大的网页。因而,HTML是Web编程的基础,也就是说万维网是建立在超文本基础之上的。 ### 2.6 Java语言介绍 程序开发语言有很多,但是截至目前,Java语言在IT领域内,仍然是最被认可,以及被广泛运用的编写语言之一,因此在选择此程序的编写语言上,果断选择这门编程语言进行程序开发。可以说经过了这么多年的发展,Java语言不仅在Web开发领域有了突出性贡献,而且在大数据开发领域以及Android开发领域都得到了广泛运用。由于Java语言拥有较强的扩展性能,并且表现出的稳定性能,让其成为大型后端系统开发语言首选,现如今,Java语言也成为了一种常用的互联网平台的解决方案。 作为一种源码在网络上开源的面向对象的程序开发Java语言,由它开发完成的程序是不可能直接运行在各大平台的,Java程序的运行,需要在操作平台上配置其运行的环境,包括数据库软件与Java程序开发软件等工具的安装与配置。在Win7,Win10或其它操作平台上配置Java程序运行环境,只要环境配置成功,Java程序都可以运行起来。 ### 2.7 Tomcat 服务器介绍 对于开发Java程序的人员来讲,Tomcat服务器一般都是第一次接触,之所以不使用其他的诸如IIS服务器或者Apache服务器,是因为IIS对微软的开发语言比较友好,而Apache服务器对静态的HTML有很好的优势,只有Tomcat服务器属于小巧玲珑形,比较适合Java开发时使用。Tomcat对于Java项目用到的Servlet和HTML技术可以很好的匹配。再说,Tomcat是开源的,开源免费就是王道,能够很好的支持Javaweb项目,如果没有太多的要求的话,Tomcat就是首选。Tomcat跟随Java的成长一起发展,目前有很多版本,Tomcat对JRE环境也有对应的版本支持需求。 一般情况下,Tomcat服务器是Javaweb程序开发首选,tomcat服务器是Apache服务器的扩展,myeclise就集成的有Tomcat服务器,如果Tomcat服务器版本无法满足需求,也可以另外配置相应的Tomcat服务器,目前Tomcat版本已经发展到了tomcat9这个版本了。 2.8 bootstarp 技术 Bootstrap 是最受欢迎的 HTML、CSS 和 JS 框架,用于开发响应式布局、移动设备优先的 WEB 项目。 为所有开发者、所有应用场景而设计 Bootstrap 让前端开发更快速、简单。所有开发者都能快速上手、所有设备都可以适配、所有项目都适用。 预处理工具 虽然可以直接使用 Bootstrap 提供的 CSS 样式表,但是不要忘记,Bootstrap 的源码是采用最流行的 CSS 预处理工具 Less 和 Sass 开发的。你可以直接采用预编译的 CSS 文件快速开发,也可以从 Bootstrap 源码自定义自己需要的样式。 Responsive across devices 一个框架、多种设备。 你的网站和应用能在 Bootstrap 的帮助下通过同一份源码快速、有效地适配手机、平板和 PC 设备,这一切都是 CSS 媒体查询(Media Query)的功劳。 Components 功能完备 Bootstrap 提供了全面、美观的文档,你能在这里找到关于普通 HTML 元素、HTML 和 CSS 组件以及 jQuery 插件方面的所有详细文档。 Bootstrap 是完全开源的。代码的托管、开发和维护都在 GitHub 平台上完成。 ## 3 系统分析 通过阅读查看之前收集的各种文献资料,了解了程序开发遵循的大体流程。其中系统分析也就是其流程当中的一部分,系统分析也是对所选课题,通过对使用者的调查分析,对同类型课题进行比较分析过程中得出本课题需要具备的功能,此部分也是对所选课题的功能等进行需求分析。 ### 3.1可行性研究 开发任何程序都需要提前进行分析,也包括了程序的开发与使用是否可行的分析,通常在可行性分析部分,需要涉及到的内容有经济是否可行,有对开发者开发技术上是否可行的分析,有对使用者运行操作程序是否可行的分析等。 (1)技术可行性 此课题主要用于检验本人的专业知识,检验本人将理论运用于实践的能力。由于本人作为大学生,在大学校园学习了程序开发方面的专业知识,也多次根据学院老师布置的期末作业进行过程序小功能模块的制作与开发,也参与过本专业的课程设计作业,因此本人具备一定高度的开发经验,并在开发技术上,比如JAVA这种课堂上学习并实践过的网页技术等有了一定的技术基础,在操作软件的使用上,比如数据库MySQL的操作等都有一定的熟练度。所以,只要配置好开发的相关环境,程序开发就会很快上手。 (2)经济可行性 此次课题主要用于毕业答辩,并不是作为商业程序投入社会使用。运用的开发软件通过各大网页浏览器就可以下载在笔记本电脑上,环境安装教程也在各大网页浏览器上查看,在开发期间,包括代码的编写也可以通过网页浏览器下载相应功能模块的代码,然后对下载的功能模块代码进行相应的编辑,就可以写入程序中。可以说整个过程并没有涉及到资金的投入,在程序开发硬件设备上,仅需一台电脑,鼠标,键盘等设备,这些硬件设备也无需额外掏钱欣赏,因为校园文章馆有专门的计算机机房供学生使用,另外,由于本专业的原因,本人早期已购置一台笔记本,所以硬件设备都已具备。因此此程序在经济投入上是零支出,具备可行性。 (3)运行可行性 此次课题在界面设计上讲究简单化,美观的设计原则,在对各个功能的流程设计上也是比较通俗易懂的,所以程序一旦投入使用,对使用者的计算机操作水平没有过多要求,加上现如今计算机在各个行业都有运用,以及人们学历的普遍提升,大部分人在操作具备可视化操作界面的程序时,很快就可以上手,就算有少数人不懂怎么操作,经人简单指点培训也可以操作程序。因此,程序投入使用,在运行上具备可行性。 程序可行性分析,分析了开发者的技术可行,分析了使用者的运行使用可行,分析了程序开发的经济可行。总之,开发与使用该程序完全可行。 ### 3.2系统性能分析 程序一旦开发完成,就会投入生活中使用,使用者大多都是使用程序的功能区解决问题,之所以去分析程序需要具备的性能特征,主要还是确保程序运行中,在质量上是可靠的,在数据安全上是值得放心的,以及程序是一个健壮性的程序,程序在今后的社会变化中,也能通过编辑修改进行升级,以满足使用者不断变化的需求等等,这些特点都是程序的性能需要具备的特点。之所以要进行性能分析,也主要是考虑程序投入使用中,要尽可能降低程序的维护成本,要始终保持程序可以可靠运行,并长时间帮助使用者处理各种数据。在程序的功能符合使用者的要求的前提下,只有稳定可靠的程序,才能得到使用者的青睐。 ### 3.3 系统流程分析 每个程序开发出来,不管是登录,添加信息等操作都是遵循一定的操作流程的,每个流程都有相应的判断,所以在分析系统的时候,也有必要对系统的流程进行分析。 #### 3.3.1 系统开发流程 程序开发首先需要分析所开发程序的功能,这个步骤也是程序的需求分析阶段,这个阶段的任务很重要,因为程序功能确定之后,后面的设计,编码等环节都跟系统的分析阶段所完成的内容挂钩。程序在开发时大致都遵循以下流程。 ![](https://i-blog.csdnimg.cn/direct/9547be52547f410686a2a0d99b34e136.png) 图3.1系统开发流程图 #### 3.3.2 系统注册流程 程序提供注册的功能(注册对应流程在下图展示)。就是让非系统操作用户变成程序的操作用户,主要让用户在注册页面上,根据页面提示,规范填写个人信息,程序也会根据用户填写的内容进行逻辑判断,确定用户身份是合格的身份之后,用户填写的数据才可以被数据库写入用户数据表里面。 ![](https://i-blog.csdnimg.cn/direct/5f592d93efe547ef9dc4fd321b92e0f8.png) 图3.2 注册流程图 #### 3.3.3 系统登录流程 程序投入生活让使用者使用,都需要经过登录模块这个入门环节,这个功能也就像现实生活一样,需要使用正确的钥匙打开门,才能进入。而登录模块需要的钥匙就是账号,密码,这两项数据正确就能访问程序的功能区。登录流程也会在下图展示,里面也有相应的判断规则。 ![](https://i-blog.csdnimg.cn/direct/9ac9f6631a754ecfa457c80418b4b789.png) 图3.3 登录流程图 ## 4 系统设计 系统分析接下来的操作步骤就是系统的设计,这部分内容也是不能马虎对待的。因为生活都是在不断产生变化,人们需求也是在不断改变,开发技术也是在不断升级,所以程序也需要考虑在今后可以方便进行功能扩展,完成升级。程序也需要具备大容量以及对其它软硬件的适应能力,而不仅仅是满足现有用户提出来的功能需求,程序在设计期间始终要以发展的理念来进行,要让程序的开发技术上具备先进性的特点,也要让程序开发成本降低,以及让程序后期运行使用时易于维护。 ### 4.1 系统结构设计 本程序在设计结构选择上首选B/S,也是为了满足程序今后升级便利,以及程序低维护成本的要求。本程序的网络拓扑设计也会在下图展示,通过图形的方式来描述更容易理解。 ![](https://i-blog.csdnimg.cn/direct/d6949faddcdb429b9c0185d936c87714.png)图4.1 系统网络拓扑设计图 ### 4.2系统功能模块设计 程序的功能在系统分析这部分已经确定了,这部分主要还是针对程序功能进行更加详细的设计,设计成果使用结构图展示直观明了,也更容易让人理解。绘制结构图采用的工具是Visio,使用它可以快速绘制出不同角色拥有的功能结构。 ![](https://i-blog.csdnimg.cn/direct/f6612995ad2b42958c86020664ef11d6.png) 图4.2 功能结构图 ### 4.3数据库设计 对程序的功能分析与结构设计之后,也要对程序数据存储的工具进行选择,本程序选用的数据存储仓库是MySQL,选用这个工具就需要根据该数据库的特点进行数据库文件的创建,并设计与之对应的数据表。 #### 4.3.1数据库E-R图 设计一个数据库,不仅包含了数据库实体的设计,也包括了数据库表的结构设计,此部分内容设计的就是确认数据库的实体,并在此基础上对每个实体应该有的属性值进行分析设计,这些确认好的属性值对接下来的数据表的设计也是有很大帮助的,因为它们代表数据表里面的字段值。通常每个程序的数据库里面都具备用户这样的一个数据表。那么在分析用户这个实体的时候,都会设计出它的属性,有最基本的登录程序的账号属性,有用户的姓名属性,有用户的电话或联系地址属性等内容。一旦确认实体具备的属性之后,就可以采用相应的设计软件绘画出实体属性图,或者是实体之间的E-R图。设计E-R模型的软件有很多,这里列举常用的几个,一个是PowerDesigner,一个是Navicat绘制E-R模型,本设计模块用到的还是之前课堂上就了解并接触的Visio工具,这个工具跟办公软件Word,Excel一样都属于Office里面的一部分。使用Visio工具不仅在软件安装上快捷高效,而且它不会占用很多计算机的存储空间。 (1)校园二手物品交易平台设计了管理员实体,管理员实体属性图会在下图进行展示,此图的绘制工具是Visio工具。 ![](https://i-blog.csdnimg.cn/direct/c4d20f00d0014656b24cd2c7e01a88eb.png) 图4.4 管理员实体属性图 (2)校园二手物品交易平台设计了用户实体,用户实体属性图会在下图进行展示,此图的绘制工具是Visio工具。 ![](https://i-blog.csdnimg.cn/direct/221ed86058a14ce68a81432fad16fa4d.png) 图4.5 用户实体属性图 (3)校园二手物品交易平台设计了商品类型实体,商品类型实体属性图会在下图进行展示,此图的绘制工具是Visio工具。 ![](https://i-blog.csdnimg.cn/direct/82b16750546d4b71b2369e1058e12676.png) 图4.6 商品类型实体属性图 #### 4.3.2 数据库表结构 在上述内容中,已经设计出相应的E-R模型,就可以在数据库里面根据各个实体创建相应的数据表,不过在初次使用数据库工具的时候,是需要创建一个针对程序的数据库文件,有了此步操作之后,才在刚创建的数据库文件里面创建数据表,创建数据表需要涉及到字段的设计,主键的设计,字段长度与类型的设计等内容,只有设计好的数据表结构才可以按照此规则存放对应的程序数据。这里举个例子,就拿上面提到的用户实体来说吧,用户具备的属性值,比如账号,比如联系方式与电话等都可以设计成该用户数据表里面的字段,然后对这些字段设计其数据类型,长度,并选择该表的主键作为此用户数据表的唯一标志。数据库里面的各个数据表都有它们的主键,这样也是为了方便区分各个数据表。 1公告信息表 | 序号 | 列名 | 数据类型 | 说明 | 允许空 | |:--:|:------------:|:-------:|:------:|:---:| | 1 | Id | Int | id | 否 | | 2 | news_name | String | 公告名称 | 是 | | 3 | news_photo | String | 公告图片 | 是 | | 4 | news_types | Integer | 公告类型 | 是 | | 5 | insert_time | Date | 公告发布时间 | 是 | | 6 | news_content | String | 公告详情 | 是 | | 7 | create_time | Date | 创建时间 | 是 | 2收货地址表 | 序号 | 列名 | 数据类型 | 说明 | 允许空 | |:--:|:---------------:|:-------:|:------:|:---:| | 1 | Id | Int | id | 否 | | 2 | yonghu_id | Integer | 创建用户 | 是 | | 3 | address_name | String | 收货人 | 是 | | 4 | address_phone | String | 电话 | 是 | | 5 | address_dizhi | String | 地址 | 是 | | 6 | isdefault_types | Integer | 是否默认地址 | 是 | | 7 | insert_time | Date | 添加时间 | 是 | | 8 | update_time | Date | 修改时间 | 是 | | 9 | create_time | Date | 创建时间 | 是 | 3商品表 | 序号 | 列名 | 数据类型 | 说明 | 允许空 | |:--:|:---------------------:|:----------:|:----:|:---:| | 1 | Id | Int | id | 否 | | 2 | shangjia_id | Integer | 商家 | 是 | | 3 | shangpin_name | String | 商品名称 | 是 | | 4 | shangpin_uuid_number | String | 商品编号 | 是 | | 5 | shangpin_photo | String | 商品照片 | 是 | | 6 | shangpin_types | Integer | 商品类型 | 是 | | 7 | shangpin_kucun_number | Integer | 商品库存 | 是 | | 8 | shangpin_old_money | BigDecimal | 商品原价 | 是 | | 9 | shangpin_new_money | BigDecimal | 现价 | 是 | | 10 | shangpin_clicknum | Integer | 点击次数 | 是 | | 11 | shangpin_content | String | 商品介绍 | 是 | | 12 | shangxia_types | Integer | 是否上架 | 是 | | 13 | shangpin_delete | Integer | 逻辑删除 | 是 | | 14 | create_time | Date | 创建时间 | 是 | 4商品收藏表 | 序号 | 列名 | 数据类型 | 说明 | 允许空 | |:--:|:-------------------------:|:-------:|:----:|:---:| | 1 | Id | Int | id | 否 | | 2 | shangpin_id | Integer | 商品 | 是 | | 3 | yonghu_id | Integer | 用户 | 是 | | 4 | shangpin_collection_types | Integer | 类型 | 是 | | 5 | insert_time | Date | 收藏时间 | 是 | | 6 | create_time | Date | 创建时间 | 是 | 5商品留言表 | 序号 | 列名 | 数据类型 | 说明 | 允许空 | |:--:|:--------------------:|:-------:|:----:|:---:| | 1 | Id | Int | id | 否 | | 2 | shangpin_id | Integer | 商品 | 是 | | 3 | yonghu_id | Integer | 用户 | 是 | | 4 | shangpin_liuyan_text | String | 留言内容 | 是 | | 5 | insert_time | Date | 留言时间 | 是 | | 6 | reply_text | String | 回复内容 | 是 | | 7 | update_time | Date | 回复时间 | 是 | | 8 | create_time | Date | 创建时间 | 是 | 6购物车表 | 序号 | 列名 | 数据类型 | 说明 | 允许空 | |:--:|:-----------:|:-------:|:----:|:---:| | 1 | Id | Int | id | 否 | | 2 | yonghu_id | Integer | 所属用户 | 是 | | 3 | shangpin_id | Integer | 商品 | 是 | | 4 | buy_number | Integer | 购买数量 | 是 | | 5 | create_time | Date | 添加时间 | 是 | | 6 | update_time | Date | 更新时间 | 是 | | 7 | insert_time | Date | 创建时间 | 是 | 7商家表 | 序号 | 列名 | 数据类型 | 说明 | 允许空 | |:--:|:---------------------:|:----------:|:------:|:---:| | 1 | Id | Int | id | 否 | | 2 | username | String | 账户 | 是 | | 3 | password | String | 密码 | 是 | | 4 | shangjia_name | String | 商家名称 | 是 | | 5 | shangjia_phone | String | 联系方式 | 是 | | 6 | shangjia_email | String | 邮箱 | 是 | | 7 | shangjia_photo | String | 营业执照展示 | 是 | | 8 | shangjia_xingji_types | Integer | 商家信用类型 | 是 | | 9 | new_money | BigDecimal | 现有余额 | 是 | | 10 | shangjia_content | String | 商家简介 | 是 | | 11 | shangjia_delete | Integer | 逻辑删除 | 是 | | 12 | create_time | Date | 创建时间 | 是 | 8用户表 | 序号 | 列名 | 数据类型 | 说明 | 允许空 | |:--:|:--------:|:------:|:----:|:---:| | 1 | Id | Int | id | 否 | | 2 | username | String | 用户名 | 是 | | 3 | password | String | 密码 | 是 | | 4 | role | String | 角色 | 是 | | 5 | addtime | Date | 新增时间 | 是 | 9token表 | 序号 | 列名 | 数据类型 | 说明 | 允许空 | |:--:|:-------------:|:-------:|:----:|:---:| | 1 | Id | Int | id | 否 | | 2 | userid | Integer | 用户id | 是 | | 3 | username | String | 用户名 | 是 | | 4 | tablename | String | 表名 | 是 | | 5 | role | String | 角色 | 是 | | 6 | token | String | 密码 | 是 | | 7 | addtime | Date | 新增时间 | 是 | | 8 | expiratedtime | Date | 过期时间 | 是 | 10论坛表 | 序号 | 列名 | 数据类型 | 说明 | 允许空 | |:--:|:-----------------:|:-------:|:----:|:---:| | 1 | Id | Int | id | 否 | | 2 | forum_name | String | 帖子标题 | 是 | | 3 | yonghu_id | Integer | 用户 | 是 | | 4 | shangjia_id | Integer | 商家 | 是 | | 5 | users_id | Integer | 管理员 | 是 | | 6 | forum_content | String | 发布内容 | 是 | | 7 | super_ids | Integer | 父id | 是 | | 8 | forum_state_types | Integer | 帖子状态 | 是 | | 9 | insert_time | Date | 发帖时间 | 是 | | 10 | update_time | Date | 修改时间 | 是 | | 11 | create_time | Date | 创建时间 | 是 | 11字典表 | 序号 | 列名 | 数据类型 | 说明 | 允许空 | |:--:|:-----------:|:-------:|:-----:|:---:| | 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 | 创建时间 | 是 | 12用户表 | 序号 | 列名 | 数据类型 | 说明 | 允许空 | |:--:|:------------------:|:----------:|:------:|:---:| | 1 | Id | Int | id | 否 | | 2 | username | String | 账户 | 是 | | 3 | password | String | 密码 | 是 | | 4 | yonghu_name | String | 用户姓名 | 是 | | 5 | yonghu_phone | String | 用户手机号 | 是 | | 6 | yonghu_id_number | String | 用户身份证号 | 是 | | 7 | yonghu_photo | String | 用户头像 | 是 | | 8 | sex_types | Integer | 性别 | 是 | | 9 | yonghu_email | String | 电子邮箱 | 是 | | 10 | new_money | BigDecimal | 余额 | 是 | | 11 | yonghu_yesno_types | Integer | 用户审核 | 是 | | 12 | create_time | Date | 创建时间 | 是 | 13商品订单表 | 序号 | 列名 | 数据类型 | 说明 | 允许空 | |:--:|:-----------------------------:|:----------:|:------:|:---:| | 1 | Id | Int | id | 否 | | 2 | shangpin_order_uuid_number | String | 订单号 | 是 | | 3 | address_id | Integer | 收货地址 | 是 | | 4 | shangpin_id | Integer | 商品 | 是 | | 5 | yonghu_id | Integer | 用户 | 是 | | 6 | buy_number | Integer | 购买数量 | 是 | | 7 | shangpin_order_true_price | BigDecimal | 实付价格 | 是 | | 8 | shangpin_order_courier_name | String | 快递公司 | 是 | | 9 | shangpin_order_courier_number | String | 订单快递单号 | 是 | | 10 | shangpin_order_types | Integer | 订单类型 | 是 | | 11 | shangpin_order_payment_types | Integer | 支付类型 | 是 | | 12 | insert_time | Date | 订单创建时间 | 是 | | 13 | create_time | Date | 创建时间 | 是 | 14配置文件表 | 序号 | 列名 | 数据类型 | 说明 | 允许空 | |:--:|:-----:|:------:|:------:|:---:| | 1 | Id | Int | id | 否 | | 2 | name | String | 配置参数名称 | 是 | | 3 | value | String | 配置参数值 | 是 | ## 5 系统实现 对校园二手物品交易平台进行了前面的系统分析,系统设计之后,接下来的环节就是校园二手物品交易平台的具体编码实现功能的部分。这部分内容会显示系统各个功能的具体界面运行效果。 ### 5.1 管理员功能实现 #### 5.1.1 用户管理 管理员可以对用户信息进行添加,修改,删除,查询操作。 ![](https://i-blog.csdnimg.cn/direct/a279f261522743f688191a45ebc67434.png) 图5.1 用户管理页面 #### 5.1.2 商品类型管理 管理员可以对商品类型信息进行添加,修改,删除,查询操作。 ![](https://i-blog.csdnimg.cn/direct/f5c220725a5740aba3ef113e2a703efd.png) 图5.2 商品类型管理页面 #### 5.1.3 公告信息管理 管理员可以对公告信息进行添加,修改,删除,查询操作。 ![](https://i-blog.csdnimg.cn/direct/5e114827fdd44e239415fb5c75fddd22.png) 图5.3 公告信息管理页面 #### 5.1.4 商家管理 管理员可以对商家信息进行添加,修改,删除,查询操作。 ![](https://i-blog.csdnimg.cn/direct/b8d83f8384b44639bbc0c4e7b90ccfeb.png) 图5.4 商家信息管理页面 #### 5.1.5 轮播图管理 管理员可以对轮播图信息进行添加,修改,删除,查询操作。 ![](https://i-blog.csdnimg.cn/direct/7c2969d5efba481dacc3a355ab387209.png) 图5.5轮播图管理页面 ### 5.2 用户功能实现 #### 5.2.1 商品信息 用户可以查看商品信息,可以添加到购物车,还可以留言和收藏商品信息。 ![](https://i-blog.csdnimg.cn/direct/ef0764f8a54a4b96991609858bc06622.png) 图5.6 商品信息页面 #### 5.2.2 购物车 用户可以把商品信息都添加到购物车里,可以在购物车里删除和增加数量,用户不登录是看不到自己的购物车的。 ![](https://i-blog.csdnimg.cn/direct/c0f6b0413b844724be9dd5b685cf6aca.png) 图5.7 购物车页面 #### 5.2.3 我的收藏 我的收藏里面可以看到自己收藏过的商品信息,可以去点击收藏的信息去取消收藏。 ![](https://i-blog.csdnimg.cn/direct/593cbb2b3ea4414fa777082b40affdb4.png) 图5.8 我的收藏页面 ### 5.3 商家功能实现 #### 5.3.1 商品信息管理 商家可以可以对自己发布的商品信息进行添加,修改,删除,查询,上架操作。 ![](https://i-blog.csdnimg.cn/direct/316ef1f31d6a4888ade8a139c38872f6.png) 图5.9 商品管理页面 #### 5.3.2 商品留言管理 商家可以查看和搜索以及回复自己发布的商品信息里面的留言。 ![](https://i-blog.csdnimg.cn/direct/02ca500ebe164815995799806240b733.png) 图5.10 购物车页面 #### 5.3.3 商品订单管理 商家可以查看自己发布商品的商品订单信息,还可以搜索商品订单信息 ![](https://i-blog.csdnimg.cn/direct/8e5e5065e88c47deb010a5617be842f2.png) 图5.11 商品订单管理页面 ## 系统 ##### AddressController.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("/address") public class AddressController { private static final Logger logger = LoggerFactory.getLogger(AddressController.class); @Autowired private AddressService addressService; @Autowired private TokenService tokenService; @Autowired private DictionaryService dictionaryService; //级联表service @Autowired private YonghuService yonghuService; /** * 后端列表 */ @RequestMapping("/page") public R page(@RequestParam Map 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")); else if("商家".equals(role)) params.put("shangjiaId",request.getSession().getAttribute("userId")); if(params.get("orderBy")==null || params.get("orderBy")==""){ params.put("orderBy","id"); } PageUtils page = addressService.queryPage(params); //字典表数据转换 List list =(List)page.getList(); for(AddressView 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); AddressEntity address = addressService.selectById(id); if(address !=null){ //entity转view AddressView view = new AddressView(); BeanUtils.copyProperties( address , view );//把实体数据重构到view中 //级联表 YonghuEntity yonghu = yonghuService.selectById(address.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 AddressEntity address, HttpServletRequest request){ logger.debug("save方法:,,Controller:{},,address:{}",this.getClass().getName(),address.toString()); String role = String.valueOf(request.getSession().getAttribute("role")); if(false) return R.error(511,"永远不会进入"); else if("用户".equals(role)) address.setYonghuId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId")))); Wrapper queryWrapper = new EntityWrapper() .eq("yonghu_id", address.getYonghuId()) .eq("address_name", address.getAddressName()) .eq("address_phone", address.getAddressPhone()) .eq("address_dizhi", address.getAddressDizhi()) .eq("isdefault_types", address.getIsdefaultTypes()) ; logger.info("sql语句:"+queryWrapper.getSqlSegment()); AddressEntity addressEntity = addressService.selectOne(queryWrapper); if(addressEntity==null){ address.setInsertTime(new Date()); address.setCreateTime(new Date()); Integer isdefaultTypes = address.getIsdefaultTypes(); if(isdefaultTypes == 2 ){//如果当前的是默认地址,把当前用户的其他改为不是默认地址 List addressEntitys = addressService.selectList(new EntityWrapper().eq("isdefault_types",2)); if(addressEntitys != null && addressEntitys.size()>0){ for(AddressEntity a:addressEntitys) a.setIsdefaultTypes(1); addressService.updateBatchById(addressEntitys); } } addressService.insert(address); return R.ok(); }else { return R.error(511,"表中有相同数据"); } } /** * 后端修改 */ @RequestMapping("/update") public R update(@RequestBody AddressEntity address, HttpServletRequest request){ logger.debug("update方法:,,Controller:{},,address:{}",this.getClass().getName(),address.toString()); String role = String.valueOf(request.getSession().getAttribute("role")); // if(false) // return R.error(511,"永远不会进入"); // else if("用户".equals(role)) // address.setYonghuId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId")))); //根据字段查询是否有相同数据 Wrapper queryWrapper = new EntityWrapper() .notIn("id",address.getId()) .andNew() .eq("yonghu_id", address.getYonghuId()) .eq("address_name", address.getAddressName()) .eq("address_phone", address.getAddressPhone()) .eq("address_dizhi", address.getAddressDizhi()) .eq("isdefault_types", address.getIsdefaultTypes()) ; logger.info("sql语句:"+queryWrapper.getSqlSegment()); AddressEntity addressEntity = addressService.selectOne(queryWrapper); address.setUpdateTime(new Date()); if(addressEntity==null){ Integer isdefaultTypes = address.getIsdefaultTypes(); if(isdefaultTypes == 2 ){//如果当前的是默认地址,把当前用户的其他改为不是默认地址 List addressEntitys = addressService.selectList(new EntityWrapper().eq("isdefault_types",2)); if(addressEntitys != null && addressEntitys.size()>0){ for(AddressEntity a:addressEntitys) a.setIsdefaultTypes(1); addressService.updateBatchById(addressEntitys); } } addressService.updateById(address);//根据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()); addressService.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 addressList = new ArrayList<>();//上传的东西 Map> 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> dataList = PoiUtil.poiImport(file.getPath());//读取xls文件 dataList.remove(0);//删除第一行,因为第一行是提示 for(List data:dataList){ //循环 AddressEntity addressEntity = new AddressEntity(); // addressEntity.setYonghuId(Integer.valueOf(data.get(0))); //创建用户 要改的 // addressEntity.setAddressName(data.get(0)); //收货人 要改的 // addressEntity.setAddressPhone(data.get(0)); //电话 要改的 // addressEntity.setAddressDizhi(data.get(0)); //地址 要改的 // addressEntity.setIsdefaultTypes(Integer.valueOf(data.get(0))); //是否默认地址 要改的 // addressEntity.setInsertTime(date);//时间 // addressEntity.setUpdateTime(sdf.parse(data.get(0))); //修改时间 要改的 // addressEntity.setCreateTime(date);//时间 addressList.add(addressEntity); //把要查询是否重复的字段放入map中 //电话 if(seachFields.containsKey("addressPhone")){ List addressPhone = seachFields.get("addressPhone"); addressPhone.add(data.get(0));//要改的 }else{ List addressPhone = new ArrayList<>(); addressPhone.add(data.get(0));//要改的 seachFields.put("addressPhone",addressPhone); } } //查询是否重复 //电话 List addressEntities_addressPhone = addressService.selectList(new EntityWrapper().in("address_phone", seachFields.get("addressPhone"))); if(addressEntities_addressPhone.size() >0 ){ ArrayList repeatFields = new ArrayList<>(); for(AddressEntity s:addressEntities_addressPhone){ repeatFields.add(s.getAddressPhone()); } return R.error(511,"数据库的该表中的 [电话] 字段已经存在 存在数据为:"+repeatFields.toString()); } addressService.insertBatch(addressList); return R.ok(); } } } }catch (Exception e){ e.printStackTrace(); return R.error(511,"批量插入数据异常,请联系管理员"); } } /** * 前端列表 */ @IgnoreAuth @RequestMapping("/list") public R list(@RequestParam Map params, HttpServletRequest request){ logger.debug("list方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params)); // 没有指定排序字段就默认id倒序 if(StringUtil.isEmpty(String.valueOf(params.get("orderBy")))){ params.put("orderBy","id"); } PageUtils page = addressService.queryPage(params); //字典表数据转换 List list =(List)page.getList(); for(AddressView c:list) dictionaryService.dictionaryConvert(c, request); //修改对应字典表字段 return R.ok().put("data", page); } /** * 前端详情 */ @RequestMapping("/detail/{id}") public R detail(@PathVariable("id") Long id, HttpServletRequest request){ logger.debug("detail方法:,,Controller:{},,id:{}",this.getClass().getName(),id); AddressEntity address = addressService.selectById(id); if(address !=null){ //entity转view AddressView view = new AddressView(); BeanUtils.copyProperties( address , view );//把实体数据重构到view中 //级联表 YonghuEntity yonghu = yonghuService.selectById(address.getYonghuId()); if(yonghu != null){ BeanUtils.copyProperties( yonghu , view ,new String[]{ "id", "createDate"});//把级联的数据添加到view中,并排除id和创建时间字段 view.setYonghuId(yonghu.getId()); } //修改对应字典表字段 dictionaryService.dictionaryConvert(view, request); return R.ok().put("data", view); }else { return R.error(511,"查不到数据"); } } /** * 前端保存 */ @RequestMapping("/add") public R add(@RequestBody AddressEntity address, HttpServletRequest request){ logger.debug("add方法:,,Controller:{},,address:{}",this.getClass().getName(),address.toString()); Wrapper queryWrapper = new EntityWrapper() .eq("yonghu_id", address.getYonghuId()) .eq("address_name", address.getAddressName()) .eq("address_phone", address.getAddressPhone()) .eq("address_dizhi", address.getAddressDizhi()) .eq("isdefault_types", address.getIsdefaultTypes()) ; logger.info("sql语句:"+queryWrapper.getSqlSegment()); AddressEntity addressEntity = addressService.selectOne(queryWrapper); if(addressEntity==null){ address.setInsertTime(new Date()); address.setCreateTime(new Date()); if(address.getIsdefaultTypes() == null) address.setIsdefaultTypes(1); Integer isdefaultTypes = address.getIsdefaultTypes(); if(isdefaultTypes == 2 ){//如果当前的是默认地址,把当前用户的其他改为不是默认地址 List addressEntitys = addressService.selectList(new EntityWrapper().eq("isdefault_types",2)); if(addressEntitys != null && addressEntitys.size()>0){ for(AddressEntity a:addressEntitys) a.setIsdefaultTypes(1); addressService.updateBatchById(addressEntitys); } } addressService.insert(address); return R.ok(); }else { return R.error(511,"表中有相同数据"); } } } ##### ConfigServiceImpl.java package com.service.impl; import java.util.Map; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.plugins.Page; import com.baomidou.mybatisplus.service.impl.ServiceImpl; import com.dao.ConfigDao; import com.entity.ConfigEntity; import com.service.ConfigService; import com.utils.PageUtils; import com.utils.Query; /** * 系统用户 * @author yangliyuan * @date 2019年10月10日 上午9:17:59 */ @Service("configService") public class ConfigServiceImpl extends ServiceImpl implements ConfigService { @Override public PageUtils queryPage(Map params) { Page page = this.selectPage( new Query(params).getPage(), new EntityWrapper() ); return new PageUtils(page); } } ##### NewsServiceImpl.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.NewsDao; import com.entity.NewsEntity; import com.service.NewsService; import com.entity.view.NewsView; /** * 公告信息 服务实现类 */ @Service("newsService") @Transactional public class NewsServiceImpl extends ServiceImpl implements NewsService { @Override public PageUtils queryPage(Map params) { if(params != null && (params.get("limit") == null || params.get("page") == null)){ params.put("page","1"); params.put("limit","10"); } Page page =new Query(params).getPage(); page.setRecords(baseMapper.selectListView(page,params)); return new PageUtils(page); } } #### 声明 > 本博客适用于广泛的学术和教育用途,包括但不限于个人学习、开发设计,产品设计。仅供学习参考,旨在为读者提供深入理解和学术研究的材料。

相关推荐
HelloDam7 分钟前
基于元素小组的归并排序算法
后端·算法·排序算法
Net分享8 分钟前
在 ASP.NET Core 中使用 Confluent.Kafka 实现 Kafka 生产者和消费者
后端
HelloDam9 分钟前
单元格法近似求解多边形最大内接矩形问题【思路讲解+java实现】
后端
Winwoo11 分钟前
服务端推送 SSE
后端
chushiyunen12 分钟前
dom操作笔记、xml和document等
xml·java·笔记
whisperrr.12 分钟前
【spring01】Spring 管理 Bean-IOC,基于 XML 配置 bean
xml·java·spring
chushiyunen14 分钟前
tomcat使用笔记、启动失败但是未打印日志
java·笔记·tomcat
天上掉下来个程小白21 分钟前
HttpClient-03.入门案例-发送POST方式请求
java·spring·httpclient·苍穹外卖
ModestCoder_30 分钟前
将一个新的机器人模型导入最新版isaacLab进行训练(以unitree H1_2为例)
android·java·机器人
a180079310801 小时前
软件工程面试题(二十二)
java·面试·软件工程