基于SSM的手机商城-JAVA【数据库设计、源码、开题报告】

  1. 系统分析

本章将从整体上描述系统的需求,根据需求确定了系统的整体结构和数据库设计方案,对系统各部分的功能进行了划分并描述了系统架构的设计思路。本文将详细的分析系统的续期功能的设计及实现方法。

研究背景

目前市面上已经有很多面包手机店专卖店铺,而且有很多店铺已经做出了不错的业绩,是全国连锁店。然而随着时代的进步,人们渐渐倾向于在线购物的消费方式。手机店的销售也应该与时俱进,加强自身的信息化建设,才能在越来越激烈的竞争中保持竞争优势。如今市场上也已经存在了此类的烘焙食品在线销售网站,但是现有的手机店在线销售网站还存在着商品单一、操作难、页面不美观、缺少后台管理等问题,还有很大的进步空间。这些问题因素也导致了网站在市场上的推广受到一定的限制。如何开发出成本低廉、功能齐全、页面美观的烘焙商城网站正是我们目前需要解决的问题。

目的和意义

本网站目的是方便广大用户在线购买自己喜欢的手机,打破传统购买方式促进消费,也让用户足不出户即可完成手机的购买,享受到食品的美味、、线上销售的数据也可以作为商家分析销售情况的基本数据来源。

    1. 系统可行性分析

    应用的可行性包括许多方面,整体来讲可以概括为三点,首先是经济上的可行性,毕竟这是任何人都不得不面对的问题;其次,技术上也必须可行,不可脱离实际;最后,操作和法律上的可行性也是不可或缺的。经过一系列的研发之后,还有进行运行和实际操作,从发展的眼光来看,还要考虑这个系统的可持续发展性,一个成功的基于智能推荐的b2c销售网站平台,也许在硬件设备上是有一定的局限性,进一步的优化和创新乃至突破是非常重要的。

      1. 经济可行性

该系统的研发在经济上并没有非常大的需求,商品信息的获取也只需较少的费用。同时,目的也并非是十分的复杂,这样并不实用,研发的时间整体上来说很长,事实上它达到了为用户带来方便的目的,还可以让该应用有很大的发展空间,这样的话,那它所产生的回报会高于支出。Java平台是一个非常自由的平台,开发人员的经济支出其实是有限的。这样会在很大程度上提升该系统的高效性这一特点,然后就能为研发工作创造一个良好的条件和基础。结果证实,本系统的开发确实科学性较强。

      1. 技术可行性

该应用采用的是基于JavaEE开发,现阶段来讲,Java发展已经相当成熟,并且以Java为开发平台的研发日益增多,受到很多研发工作人员的欢迎。所以,技术层面上JavaEE其实是能够完成这个平台开发的任务。因此系统开发在技术上是可行的。

      1. 操作可行性

对于软件来讲,开发之后其操作难度决定了它能否受到大规模推广,这是研发者必须考虑的问题,而本基于智能推荐的b2c销售网站就非常易于操作。使用者能够拥有一个浏览器设备,根本就不需要指导,很自然的就能够自己学会使用,操作完全没有复杂性,因此,在开发这个软件的时候,我并没有提供提示或者帮助这类功能,这完全不影响。多以,该系统在操作上来说,都是广大群众非常熟练的模式,一切的操作都很简单,易于上手。

      1. 法律可行性

该系统无论在哪一方面都有十分详尽的考虑,包括技术,经济等等,事实上,它也绝不会有任何的法律问题,完全具有法律的可行性,其研发能够进行。

    1. 需求分析

1.2.1 系统目标

本系统的目标是要完成一个基于B/S架构的基于智能推荐的b2c销售网站功能的设计和开发。这些模块主要包括服装订购管理、用户管理、订单管理、商品管理等功能。实现对基于智能推荐的b2c销售网站信息进行管理,实现管理自动化,系统化,规范化。本系统开发过程主要采用基于SSM框架技术,使用JSP页面技术,后台数据库采用MySQL开发而成,保证查询,添加,删除,修改等功能。

1.2.2 用户需求和模块功能

1、注册用户:收藏管理、订单管理、地址管理、安全管理、购物车管理

2、管理员:商品管理、订单管理、用户管理、轮播图管理、评论管理、商品分类管理、账户管理

1.2.3 系统业务流分析

    1. 软件系统的非功能分析

软件的非功能需求是约束系统、支持功能实现的相关需求,包括软件的效率、可靠性、安全性、可用性、适应性等。由于本软件的用户量较大应满足以下非功能需求:

  1. 效率:基于智能推荐的b2c销售网站数据库访问速度最大延迟为1秒,允许多个用户并行访问,访问站点不能超过2秒的延迟时间。
  2. 可靠性:保证系统正常工作,具有抗干扰能力,能够对系统检测并自动纠错。出现故障时不会发生崩溃,并且功能重新恢复。
  3. 安全性:保证信息的可用性、完整性、机密性、用户身份认证。
  4. 可用性:界面友好、容易学习、方便用户使用。
  5. 适应性:系统能能够适应外部环境及需求的变化。

1.4 设计目标

设计与实现一个基于智能推荐的b2c销售网站。能够辅助管理员对基于智能推荐的b2c销售网站信息的管理。

在构建系统时,根据不同的模块的特点和功能,新系统必需满足以下目标:

(1)稳定性:保证系统能够稳定的运行,部分硬件的变化不会影响到系统的整体运行,同时系统的运行也不会受到其他错误模块的影响。

(2)准确性:根据官方的操作指南,使用系统管理员操作所产生的“权限数据”,应该是符合所有数据库的实际状态,它是禁止记录错误和错位数据等现象。

(3)开放性:系统可以在保证兼容性的硬件基础上,进行多个站点的操作,作为在Java平台的基础上架构的该系统具有独立的平台,在不同的环境下,具有独立处理能力。

(4)可扩展性:如果有新的业务增加,不需要改变原有系统,你只需要进行扩展。

(5)可维护性:接口参数的变化不需要再写代码,从而大大方便了二次开发。

(6)独立性:尽量减少模块之间的链接,这样用户可以自主选择模块需要安装或不需要安装的模块。

(7)易使用性:系统的用户界面和操作员之间的交互性非常的好,同时和主机使用B/S模式。

(8)先进性:使系统能够跟上技术的发展,不过时。在保证系统稳定性的前提下,我们可以尝试更多的国际上的流行技术。

  1. .4相关技术以及开发工具

经过第一章节的介绍,已经对课题的研究背景、现状及目的有了初步的理解,接下来介绍在设计实现该系统的过程中所使用到的技术和开发工具。

1.4.1相关技术

      1. Spring简介

Spring框架是个轻量级的Java开放源代码的技术框架,主要用来管理后段业务各类的Bean对象。其面向切面的编程思想贯穿整个系统的设计过程,以此来实现业务逻辑层与其他层次的解耦,大大的减少了开发人员的工作量。在Spring出现前,开发者需要将配置大量的xml以及编写大量的Servlet配置类,手动的创建大量的对象以实现对对象的引用。而早期的EJB规范是为了简化分布式系统的开发,虽然EJB的出现却有其先进性,但是随着时间的推移,开发者们渴望诞生一种技术能够弥补EJB的缺陷,由此Spring便应运而生。

      1. MyBatis简介

 Mybatis是一种数据库管理框架。前身是Java开源框架ibatis,mybatis框架之所以使用量比是hibernate多,是因为它不同于hibernate的全局性,Mybatis的sql语句非常的灵活,便于更改,是一种弱对应的框架(hibernate是一个强对应的持久化框架),你可以自己在mapper相关的xml文件中轻松的配置对应关系,或者你可以在Java代码中通过竹节轻松编写SQL语句,实现开发0配置,极大的简化了开发人员的工作,降低了开发难度。

      1. Tomcat服务器

Tomcat是一个免费的轻量级的用于发布中小型项目的JavaWeb服务器,Tomcat虽属于Apache基金会,但是他与Apache服务器不同,他是一个独立的服务器,与Apache相辅相成,可以这么说,Tomcat服务器是Apache的一个独立的进程单元。

      1. Navicat简介

Navicat 相对来说比较小巧可靠轻盈的数据库管理工具,相对于workbench的笨重,Navicat非常的快速,很适合小型企业或者学术研究使用,它支持连接多种数据库,同时,它还能够集成目前市场上的多品牌(例如:阿里云,亚马逊云)的云数据库。并且它可以对MongoDB、MySQL、Oracle、SQL Server等主流数据库进行支持和管理,非常适合本实验使用,所以选择了Navicat而并未选择其他数据库管理工具。

    1. 本章小结

本章主要介绍系统开发与实现过程中所使用到的相关技术及开发工具,包括SpringMVC框架、MyBatis技术、Eclipse开发环境、Tomcat服务器和MySQL数据库等。


  1.  系统设计

概要设计的主要任务是把需求分析得到DFD转换为软件结构和数据结构。设计软件结构的具体任务是:将一个复杂系统按功能进行模块划分,建立模块的层次结构及调用关系,确定模块间的接口及人机界面等。数据结构设计包括数据特征的描述,确定数据的结构特性,以及数据库的设计,显然,概要设计建立的是目标系统的逻辑模型,与计算机无关。

2.1 系统功能模块

经过对系统的需求分析的了解,我们对系统的功能模块进行了划分,图2.1是本系统所涉及的功能模块图。

  1. 注册用户:收藏管理、地址管理、购物车管理、安全管理、订单管理

图2.1 功能模块

  1. 管理员:商品管理、订单管理、用户管理、轮播图管理、评论管理、商品分类管理、账户管理。

图2.1 功能模块

2.2 数据库设计

在一个数据库应用系统的开发过程中,数据库的设计是整个系统的基础。良好的数据结构设计不仅可以减少数据冗余、提高查询效率,而且还可以降低应用程序的编写难度,提高工作效率。

2.2.1 数据库概要设计

概念设计是在分析数据的基础上建立了系统的分析和数据库设计,然后从前面分析的角度,将设计的观点整合在一起,最终完成了系统的结构分析和优化设计。

一般的数据库结构的概念,是一个实体和属性的关系模型。E-R模型一般拥有实体、属性和联系等多方面的信息,E-R模型采用的是E-R图来表示,需要提示用户工作中所以需要用到的事物,属性则是对实体信息的表述。

概念设计的目标是需要反映出系统所要求的数据库概念的结构,也就是概念模型。概念模式是独立于数据库的逻辑结构的,并且是一个独立的DBMS,不需要去依赖计算机系统的。

根据以上对数据库的需求分析,并结合系统概念模型的特点及建立方法,建立E-R模型图。

2.2.2 E-R关系模式的转换

关系模型的逻辑结构是一组关系模式的集合。E-R图则是由实体,实体的属性和实体间的联系三个要素组成。所以将E-R图转换为关系模型实际上就是要将实体,实体的属性和实体间的联系转换为关系模式。转换原则如下:

(1) 实体类型的转换:将每个实体类型转换成一个关系模式,实体的属性及为关系模式的属性,实体标识符及为关系模式的键。

(2) 联系类型的转换,根据不同的情况做不同的处理:

①若实体间的联系是1:1,可以在两个实体类型转换成的两个关系模式中的任意一个关系模式的属性中加入另一各关系模式的键和联系类型的属性。

② 若实体间的联系1:N,则在N端实体类型转换成的关系模式中加入1端实体类型转换成的关系模式的键和联系类型的属性。

③若实体间的联系是M:N,则将联系类型也转换成关系模式,其属性为两端实体类型的键加上关系类型的属性,而键为两端实体间的组合。

依照该规则将网上招聘求职系统的E-R图转换为关系模型如下:

将每一个实体转换成一个关系(关系就是给出关系名,写出属性,并标明该关系的主键)。

管理员信息(流水号,管理员帐号,管理员密码)

用户信息(流水号,姓名,编号,年龄,性别,用户名,密码,邮箱)

2.2.3 数据表结构

建立一个良好的数据库,需要追寻一下原则:

1. 尽量较少数据沉余和重复。

2. 操作设计和结构设计相结合。

3. 数据结构具有相对的稳定性。

根据系统的需求分析,同时又根据相关部分数据流程,本系统共创建了6张表,

以下为数据库中的表:

数据库名:phonemarket2

表名:userd

序号

列名

数据类型

长度

主键

外键

允许空

默认值

说明

1

User—id

Varchar

32

主键

2

User-Name

Varchar

100

3

User-Pass

Varchar

32

4

User-Phone

Varchar

32

5

User-email

Varchar

32

6

User-state

Varchar

1

s

7

User-Img

String

表名:admin

序号

列名

数据类型

长度

主键

外键

允许空

默认值

说明

1

Admin-id

Varchar

32

2

Admin-name

Varchar

32

3

Admin-pass

Varchar

32

4

Admin-phone

Varchar

32

5

Admin-date

Datetime

6

Admin-state

Varchar

2

1

7

Admin-role

Varchar

3

1

表名:address

序号

列名

数据类型

长度

主键

外键

允许空

默认值

说明

1

Addr-id

Varchar

32

2

Addr_province

Varchar

32

3

Addr-city

Varchar

32

4

Addr-area

Varchar

32

5

Addr-detail

Varchar

32

6

Addr-phone

Varchar

32

7

Addr-nickname

Varchar

32

8

Addr-state

Varchar

1

表名:goods

序号

列名

数据类型

长度

主键

外键

允许空

默认值

说明

1

Goods-id

Varchar

32

2

Goods-name

Varchar

32

3

Goods-price

Double

10

4

Goods-num

Int

32

5

Goods-type

Varchar

32

6

Goods-memory

Varchar

32

7

Goods-color

Varchar

32

8

Goods-img

String

9

Goods-state

Varchar

2

1

10

Goods-desc

Varchar

1000

11

Goods-volume

Varchar

10

表名:order

序号

列名

数据类型

长度

主键

外键

允许空

默认值

说明

1

Order-id

Varchar

32

2

Order-user

Varchar

32

3

Order-date

Datetime

4

Order-price

Double

32

5

Order-state

Varchar

5

6

Order-username

Varchar

32

7

Order-phone

Varchar

32

8

Order-address

Varchar

100

9

Order-expressno

Varchar

32

3 系统实现

系统实现是软件工程中软件开发的一个步骤,就是对概要设计的一个细化,就是详细设计每个模块实现算法,所需的局部结构。详细设计的主要任务是设计每个模块的实现算法,所需的局部数据结构。

本章将使用图形,代码,语言等工具将系统的每个模块处理过程的详细算法描述出来。

3.1 用户登录

用户登陆模块最基本的作用是为了限制该管理系统资源的使用,只有经过身份确认的操作员才能对其个性化电子商务推荐系统进行相关操作。其基本过程是从客户端取得提交的用户名和密码,然后到数据库中进行核对。如果该信息在数据库中存在,那么就可以成功登录到下一界面,否则就会被该系统拒之门外。

选择连接数据库后,进入用户登陆界面。在用户登陆界面中输入用户名和密码,从数据库表中检查是否有相应的用户名和密码。如果用户名和密码错误,系统就会给出错误提示,并且不会有任何的页面跳转。如果输入的用户名和相应密码正确,则可以点击“确定”进入主控制平台。用户登录的界面如图3.1所示。

3.1 登录界面

3.2 用户注册

用户点击网站首页的注册链接并跳转到注册页面,在注册页面上填写上必填的手机号、密码相关的用户信息。当用户提交时,先由页面判断是否符合提交的基础要求,符合要求则向服务器提交表单数据。如果填写不正确,就会弹出错误提示框,让用户重新输入。

注册模块如图3.2所示:

3.2 用户注册页面

3.3产品浏览

注册用户登录系统可以查看系统的产品的详细信息,如图3.3所示

3.3 产品详细信息界面

3.4 购物车管理

在该模块中,用户必须注册成为会员才可以在网站进行订购,未注册的用户或注册失败的会员只可以浏览物品,不可以把商品添加到购物车中。在购物车中,用户可以输入购买商品的数量,也可以删除购物车中的商品。

3.4 购物车管理

购物车controller层代码:

@RequestMapping("addCart")

@ResponseBody

public String addToCart(Integer goodsId,Integer num,HttpServletRequest request){

HttpSession session = request.getSession();

Users user=(Users) session.getAttribute("user");

Cart cart = cartService.findCartByUserId(user.getUserId(), goodsId);

if(cart!=null){

cart.setCartNum(cart.getCartNum()+num);

cartService.updateCart(cart);

}else{

Goods goods = goodsService.findById(goodsId);

Cart c=new Cart(goods, num, goods.getGoodsPrice(), user);

cartService.addGoodsToCart(c);

}

return "success";

}

@RequestMapping("findCartByUser")

@ResponseBody

public List<Cart> findCartByUser(HttpServletRequest request){

HttpSession session = request.getSession();

Users user=(Users) session.getAttribute("user");

List<Cart> list = cartService.findCartByUserId(user.getUserId());

return list;

}

@RequestMapping("deleteCart")

@ResponseBody

public String deleteCart(Integer cartId){

Integer rs = cartService.deleteCart(cartId);

if(rs>0){

return "success";

}else{

return "fail";

}

}

@RequestMapping("reduceCartNum")

@ResponseBody

public String reduceCartNum(Integer cartId){

Cart cart = cartService.findCartById(cartId);

cart.setCartNum(cart.getCartNum()-1);

Integer rs = cartService.updateCart(cart);

if(rs>0){

return "success";

}else{

return "fail";

}

}

@RequestMapping("addCartNum")

@ResponseBody

public String addCartNum(Integer cartId){

Cart cart = cartService.findCartById(cartId);

cart.setCartNum(cart.getCartNum()+1);

Integer rs = cartService.updateCart(cart);

if(rs>0){

return "success";

}else{

return "fail";

}

}

3.5 账户安全

在该模块中,只有注册并登录成功后的用户才能进入。在该模块中,用户可以修改登录密码。

3.5 账户安全界面

3.6 后台欢迎界面

在这个界面可以查看商城的总订单量,待发货数量,销售额,手机销售排行,热门商品浏览量等等。

欢迎界面前端代码:

<body style="background-color:#F2F2F2;padding-top:15px;padding-left:15px;padding-bottom:0px;">

<div class="layui-card" style="width: 480px; height: 250px;float:left;">

<div class="layui-card-header">待办事件</div>

<div class="layui-card-body" id="todo" style="width: 440px; height: 120px;">

              <div class="layadmin-backlog" lay-anim="" lay-indicator="inside" lay-arrow="none" style="width: 100%; height: 80px;">

                    <li class="layui-col-xs6">

                      <a class="layadmin-backlog-body">

                        <h3>总订单量</h3>

                        <p><cite style="line-height:45px;" id="totalOrder"></cite></p>

                      </a>

                    </li>

                    <li class="layui-col-xs6">

                     <a class="layadmin-backlog-body">

                        <h3>待发货</h3>

                        <p><cite style="line-height:45px;" id="toDoOrder"></cite></p>

                        </a>

                    </li>

                </div>

</div>

</div>

<div class="layui-card" style="width: 600px; height: 250px;float:left;margin-left:15px;">

<div class="layui-card-header">热门商品浏览量</div>

<div class="layui-card-body" id="hot" style="width: 560px; height:180px;"></div>

</div>

<div class="layui-card" style="width: 480px; height: 310px;float:left;">

<div class="layui-card-header">销售额及订单量趋势</div>

<div class="layui-card-body" id="order" style="width: 480px; height: 260px;"></div>

</div>

<div class="layui-card" style="width: 600px; height: 310px;float:left;margin-left:15px;">

<div class="layui-card-header">手机销量排行</div>

<div class="layui-card-body" id="volume" style="width: 580px; height: 260px;"></div>

</div>

</body>

<script type="text/javascript">

// 基于准备好的dom,初始化echarts实例

$(function(){

showToDo();

var myChart = echarts.init(document.getElementById('volume'),'wonderland');

var orderChart = echarts.init(document.getElementById('order'),'wonderland');

var hotChart = echarts.init(document.getElementById('hot'),'wonderland');

var layer;

layui.use('layer',function(){

layer=layui.layer;

});

// 指定图表的配置项和数据

myChart.setOption({

        tooltip: {},

        legend: {

        },

        xAxis: {

            data: [],

            axisLabel:{

     interval:0//横轴信息全部显示

}

        },

        yAxis: {},

        series: [{

            type: 'bar',

            data: []

        }]

    });

orderChart.setOption({

        tooltip: {

            trigger: 'axis'

        },

        //图例名

        legend: {

            data:['销售额','订单量']

        },

        //工具框,可以选择

        toolbox: {

        },

        //x轴信息样式

        xAxis: {

            type: 'category',

            boundaryGap: false,

            data: [],

            axisLabel:{

                interval:0

            },

        },

        yAxis : [

            {

                type : 'value'

            }

        ],

        series: [

            //虚线

            {

                name:'订单量',

                type:'line',

                symbolSize:4,   //拐点圆的大小

                data:[],

                smooth:false,   //关键点,为true是不支持虚线的,实线就用true

                itemStyle:{

                    normal:{

                        lineStyle:{

                            width:4,

                            type:'dotted'  //'dotted'虚线 'solid'实线

                        }

                    }

                }

            },

            //实线

            {

                name:'销售额',

                type:'line',

                symbol:'circle',

                symbolSize:4,

                data:[]

            }

        ]

});

hotChart.setOption({

        title: {

         text: '热门商品浏览量',//展示收藏表中,所有用户收藏的商品的总浏览量

            x:'center'

        },

        tooltip: {

            trigger: 'item',

            formatter: "{a} <br/>{b} : {c} ({d}%)"

        },        

        legend: {

            orient: 'vertical',

            x: 'left',

            data: []

        },        

        toolbox: {

            show: true,

            feature: {

                mark: { show: true },

                magicType: {

                    show: true,

                    type: ['pie', 'funnel'],

                    option: {

                        funnel: {

                            x: '25%',

                            width: '50%',

                            funnelAlign: 'left',

                            max: 1548

                        }

                    }

                },

                restore: { show: true }

            }

        },         

        series: [{

            type: 'pie',

            name:"浏览量",

            radius: '55%',

            center: ['50%', '60%'],            

            data: []

        }]        

    });

myChart.showLoading();

$.ajax({

type:"post",

url:"goods/findGoodsByVolume",

dataType:"json",

success:function(res){

 myChart.hideLoading();    //隐藏加载动画

         myChart.setOption({        //加载数据图表

            xAxis: {

                  data: res.name

            },

            series: [{

             type: 'bar',

                data: res.volume

             }]

            });     

},

error:function(){

layer.msg("图表数据请求失败!",{icon:5,anim:6,time:1000});

myChart.hideLoading();

}

});

$.ajax({

type:"post",

url:"order/findTotalOrder",//查询销售额及订单量趋势

dataType:"json",

success:function(res){

orderChart.setOption({        //加载数据图表

            xAxis: {

                  data: res.month

            },

            series: [{

             name:'订单量',

                type:'line',

                data:res.sheets

             },

             {

             name:'销售额',

                type:'line',

                symbol:'circle',

                data:res.total

             }

            ]

            });

}

});

var names = [];

var brower = [];

$.ajax({

type:"post",

url:"guess/findMostHotGoods",//找热门商品

dataType:"json",

success:function(res){

$.each(res, function (index, item) {

                names.push(item.name);    //挨个取出类别并填入类别数组

                brower.push({

                    name: item.name,

                    value: item.num

                });

            });

            hotChart.setOption({        //加载数据图表                

                legend: {                    

                    data: names

                },

                series: [{                    

                    data: brower

                }]

            });

        }

});

});

//代办事项

function showToDo(){

$.ajax({

type:"post",

url:"order/findToDo",

dataType:"json",

success:function(data){

$("#totalOrder").html(data.total);

$("#toDoOrder").html(data.deliver);

}

});

}

</script>

3.7 查看订单

可以通过订单编号,订单状态查询订单。可以修改订单的状态,比如发货,删除,编辑订单。

订单部分前端代码:

<form class="layui-form">

<div class="layui-form-item" style="margin:15px;height:30px;">

     <div style="height:40px;width:70px;float:left;line-height:40px;">订单编号:</div>

        <input type="text" class="layui-input" style="width:250px;float:left;" id="orderIdKeyword" name="orderIdKeyword" value="" lay-verify="" placeholder="请输入订单编号" autocomplete="off">

        <div style="height:40px;width:80px;float:left;line-height:40px;">  起始日期:</div>

        <input type="text" id="startDate" name="startDate"  class="layui-input" style="float:left;width:100px;">

        <div style="height:40px;width:80px;float:left;line-height:40px;">  结束日期:</div>

        <input type="text" id="endDate" name="endDate"  class="layui-input" style="float:left;width:100px;">

<div style="height:40px;width:70px;float:left;line-height:40px;">  订单状态:</div>

<div class="layui-input-inline" style="width:150px;">

<select name="orderState" id="orderState">

<option value="">请选择订单状态</option>

<option value="1">待付款</option>

<option value="2">待发货</option>

<option value="3">待收货</option>

<option value="4">待评价</option>

<option value="5">完成</option>

</select>

</div>

    <div class="layui-input-inline" style="width:80px;">

        <a class="layui-btn" id="search" data-type="reload" name="search">

            <i class="layui-icon"></i>搜索

        </a>

    </div>

    <div class="layui-input-inline" style="width:80px;">

     <button class="layui-btn layui-btn-normal" id="reset"  name="reset" type="reset">

            <i class="layui-icon"></i>重置

     </button>

    </div>

</div>

</form>

<div>

    <table id="orders" lay-filter="orders"></table>

</div>

<div id="formData" style="display:none;width:750px;padding-top:10px;">

<form id="orderForm" class="layui-form">

<div class="layui-form-item">

    <label class="layui-form-label">订单编号</label>

    <div class="layui-input-block">

      <input type="text" name="orderId" id="orderId" style='background-color:#F8F8F8;' readonly="readonly" required lay-verify="required" value="" class="layui-input" />

    </div>     

</div>

<div class="layui-form-item">

    <label class="layui-form-label">订单总价</label>

    <div class="layui-input-block">

      <input type="text" name="orderPrice" id="orderPrice" required lay-verify="required" value="" class="layui-input" />

    </div>     

</div>

<div class="layui-form-item">

    <label class="layui-form-label">订单地址</label>

    <div class="layui-input-block">

      <input type="text" name="orderAddress" id="orderAddress" required lay-verify="required" value="" class="layui-input" />

    </div>     

</div>

<div class="layui-form-item">

    <label class="layui-form-label">收货人</label>

    <div class="layui-input-block">

      <input type="text" name="orderUserName" id="orderUserName" required lay-verify="required" value="" class="layui-input" />

    </div>     

</div>

<div class="layui-form-item">

    <label class="layui-form-label">收货电话</label>

    <div class="layui-input-block">

      <input type="text" name="orderPhone" id="orderPhone" required lay-verify="required" value="" class="layui-input" />

    </div>     

</div>

</form>

</div>

<script type="text/html" id="bar">

    <a class="layui-btn layui-btn-xs" title="查看" lay-event="show">查看</a>

    <a class="layui-btn layui-btn-xs layui-btn-normal" title="编辑" lay-event="edit">编辑</a>

    <a class="layui-btn layui-btn-xs layui-btn-danger" title="刪除" lay-event="delete">刪除</a>

</script>

<script type="text/html" id="dateTpl">

    {{ layui.laytpl.fn(d.editdate) }}

</script>

<script type="text/javascript">

var table;

var layer;

var form;

var upload;

var laydate;

var element;

        layui.use(['layer', 'table','form','upload','laydate','element'], function ()

        {

            table = layui.table;

            layer = layui.layer;

            form =layui.form;

            upload=layui.upload;

            laydate=layui.laydate;

            element=layui.element;

            layui.laytpl.fn = function (value)

            {

                //json日期格式转换为正常格式

                var date = new Date(parseInt(value.replace("/Date(", "").replace(")/", ""), 10));

                var month = date.getMonth() + 1 < 10 ? "0" + (date.getMonth() + 1) : date.getMonth() + 1;

                var day = date.getDate() < 10 ? "0" + date.getDate() : date.getDate();

                return date.getFullYear() + "-" + month + "-" + day;

            }

            var start=laydate.render({

                elem: '#startDate', //指定元素

                type: 'date',

                max: 'date',

                btns:['clear','confirm'],

                done:function(value,date){

                 endMax=end.config.max;

                 end.config.min=date;

                 end.config.min.month=date.month-1;

                }

              });

            var end=laydate.render({

                elem: '#endDate', //指定元素

                type:'date',

                max:'date',

                done:function(value,date){

                 if($.trim(value)==''){

                 var curDate=new Date();

                 date={'date':curDate.getDate(),'month':curDate.getMonth()+1,'year':curDate.getFullYear()};

                 }

                 start.config.max=date;

                 start.config.max.month=date.month-1;

                }

              });

            //--------------方法渲染TABLE----------------

            var tableIns = table.render({

                elem: '#orders'

                , id: 'orders'

                , url: 'order/findOrderBySplitPage'

                ,width:1140

                , cols: [[

                     { field: 'orderId', title: '订单编号', width: 300, align: 'center' }

                     , { field: 'orderUser', title: '下单用户', width: 120, align: 'center',templet:function(d){

                      return d.orderUser.userName

                      }

                     }

                    , { field: 'orderDate', title: '下单日期', width: 120, align: 'center' }

                    , { field: 'orderPrice', title: '订单总价', width: 120, align: 'center' }

                   ,{field:'orderState', title: '订单状态', width: 102, align: 'center',templet: function(d){

                        if(d.orderState==1){

                         return "待付款";

                        }else if(d.orderState==2){

                         return "待发货";

                        }else if(d.orderState==3){

                         return "待收货";

                        }else if(d.orderState==4){

                         return "待评价";

                        }else{

                         return "完成";

                        }

                    }

                  }, {field:'orderExpressNo', title: '快递单号', width: 180, align: 'center',templet: function(d){

                        if(d.orderState==1){

                         return "等待付款";

                        }else if(d.orderState==2){

                         return "<button οnclick='deliverOrder(\""+d.orderId+"\")' class='layui-btn layui-btn-sm layui-btn-fluid layui-btn-warm'>发货</button>";

                        }else if(d.orderState==3){

                         return d.orderExpressNo;

                        }else if(d.orderState==4){

                         return d.orderExpressNo;

                        }else{

                         return d.orderExpressNo;

                        }

                    }

                  }, {title: '操作', fixed: 'right', width: 190, align: 'center', toolbar: '#bar'}

                ]]

                , page: true

                , limits: [5, 10, 15]

                , limit: 10 //默认采用10

                , done: function (res, curr, count)

                {

                    //如果是异步请求数据方式,res即为你接口返回的信息。

                    //如果是直接赋值的方式,res即为:{data: [], count: 99} data为当前页数据、count为数据总长度

                    //console.log(res);

                    //得到当前页码

                    //console.log(curr);

                    $("#curPageIndex").val(curr);

                    //得到数据总量

                    //console.log(count);

                }

            });

            //#region --------------搜索----------------

            $("#search").click(function ()

            {

             var keyword=$("#orderIdKeyword").val();

             var start=$("#startDate").val();

             var end=$("#endDate").val();

             var state=$("#orderState").val();

                tableIns.reload({

                    where: {

                     orderIdKeyword: keyword,

                     startDate:start,

                     endDate:end,

                     orderState:state

                    },page: {

                    curr: 1 //重新从第 1 页开始

                  }

                });

            });

            //#endregion

            //工具条事件监听

            table.on('tool(orders)', function (obj)

            { //注:tool是工具条事件名,test是table原始容器的属性 lay-filter="对应的值"

                var data = obj.data; //获得当前行数据

                var layEvent = obj.event; //获得 lay-event 对应的值

                var tr = obj.tr; //获得当前行 tr 的DOM对象

                if (layEvent === 'edit')

                { //编辑

                    layer.open({

                        type: 1,

                        title: '编辑订单信息',

                        shade: 0.4,  //阴影度

                        fix: false,

                        shadeClose: true,

                        maxmin: false,

                        area: ['800px;', '400px;'],    //窗体大小(宽,高)

                        content: $('#formData'),

                        success: function (layero, index)

                        {

                            var body = layer.getChildFrame('body', index); //得到子页面层的BODY

                            $("#orderId").val(data.orderId);

                            $("#orderPrice").val(data.orderPrice);

                            $("#goodsPrice").val(data.goodsPrice);

                            $("#orderUserName").val(data.orderUserName);

                            $("#orderPhone").val(data.orderPhone);

                            $("#orderAddress").val(data.orderAddress);

                            form.render();

                            body.find('#hidValue').val(index); //将本层的窗口索引传给子页面层的hidValue中

                        },

                        btn:['修改','取消'],

                        yes: function(index, layero){

                         $.post('order/updateOrder',$('#orderForm').serialize(),function(data){

                                if (data == 'success')

                                {

                                    parent.layer.msg('修改成功', { icon: 1, shade: 0.4, time: 1000 });

                                    $("#search").click();

                                    $("#handle_status").val('');

                                }

                                else

                                {

                                    parent.layer.msg('修改失败', { icon: 5, shade: 0.4, time: 1000 });

                                }

                                layer.close(index);

                         });

                        }

                    });

                }else if(layEvent === 'delete'){

                 layer.confirm('是否删除该订单?', {

                   btn: ['确认', '取消'] //可以无限个按钮

                   ,btn1: function(index, layero){

                   $.ajax({

                    type: "POST",

                    url: "order/deleteOrder",

                    data: "orderId="+data.orderId,

                    success: function(msg){

                      if(msg=='success'){

                       parent.layer.msg('删除成功', { icon: 1, shade: 0.4, time: 1000 });

                      }else{

                       parent.layer.msg('删除失败', { icon: 5, shade: 0.4, time: 1000 });

                      }

                    }

                 });

                   $(tr).remove();

                   layer.close(index);

                   }

                 });

                }else if(layEvent ==='show'){

                 var str="";

                 $.ajax({

type : "post",

url : "order/findOrderById",

async: false,

data:"orderId="+data.orderId,

dataType : "json",

success : function(data) {

str = str+ "<div class='layui-collapse' lay-accordion=''>";

var date=new Date(data.orderDate).toLocaleString();

str = str

+ "<div class='layui-colla-item'>"

+ "<h2 class='layui-colla-title'>订单编号:"

+ data.orderId

+ "  总价:"

+ data.orderPrice

+ "元 订单日期:"+date+"</h2>"

+ "<div class='layui-colla-content layui-show'><h4>收货人:"

+ data.orderUserName

+ "  收货地址:"

+ data.orderAddress

+ " 电话:"+data.orderPhone+"</h4>"

+ "<div class='layui-form'><table class='layui-table'><thead><tr><th>商品名称</th><th>价格</th><th>数量</th><th>小计</th></tr>"

+ "</thead><tbody>";

var arr = data.detailList;

for (var t = 0; t < arr.length; t++) {

str = str

+ "<tr><td><a href='goods/detail?goodsId="

+ arr[t].detailGoods.goodsId

+ "'>"

+ arr[t].detailGoods.goodsName

+ "</a></td>" + "<td>"

+ arr[t].detailGoods.goodsPrice

+ "</td><td>"

+ arr[t].detailNum

+ "台</td><td>"

+ arr[t].detailGoods.goodsPrice

* arr[t].detailNum + "元</td>"

+ "</tr>";

}

str = str

+ "</tbody></table></div>"

+ "</div></div>";

str = str + "</div>";

}

});

                 layer.open({

                        type: 1,

                        title: '查看订单详情',

                        shade: 0.4,  //阴影度

                        fix: false,

                        shadeClose: true,

                        maxmin: false,

                        area: ['800px;', '400px;'],    //窗体大小(宽,高)

                        content: str,

                        success: function (layero, index)

                        {

                            var body = layer.getChildFrame('body', index); //得到子页面层的BODY

                            element.render();

                            body.find('#hidValue').val(index); //将本层的窗口索引传给子页面层的hidValue中

                        },

                        btn:['关闭'],

                        yes: function(index, layero){

                             layer.close(index);

                        }

                    });

                }

            });

        });

        function deliverOrder(id){

         layer.open({

                type: 1,

                title: '发货',

                shade: 0.4,  //阴影度

                fix: false,

                shadeClose: true,

                maxmin: false,

                area: ['600px;', '250px;'],    //窗体大小(宽,高)

                content: "<div style='width:500px;padding-top:15px;'><div class='layui-form-item'><label class='layui-form-label'>订单编号</label>"+

                "<div class='layui-input-block'><input type='text' name='orderId' id='orderId' style='background-color:#F8F8F8;' "+

                " readonly='readonly' required lay-verify='required' value='"+id+"' class='layui-input' /></div></div>"+

                "<div class='layui-form-item'><label class='layui-form-label'>快递单号</label><div class='layui-input-block'><input type='text' "+

                " id='expressNo' required lay-verify='required' class='layui-input' /></div></div></div>",

                success: function (layero, index)

                {

                    var body = layer.getChildFrame('body', index); //得到子页面层的BODY

                    body.find('#hidValue').val(index); //将本层的窗口索引传给子页面层的hidValue中

                },

                btn:['发货','取消'],

                yes: function(index, layero){

                 var no=$("#expressNo").val();

                 $.post('order/deliverOrder',{orderId:id,expressNo:no},function(msg){

                        if (msg == 'success')

                        {

                            parent.layer.msg('发货成功', { icon: 1, shade: 0.4, time: 1000 });

                            $("#search").click();

                            $("#handle_status").val('');

                        }

                        else

                        {

                            parent.layer.msg('发货失败', { icon: 5, shade: 0.4, time: 1000 });

                        }

                        layer.close(index);

                 });

                }

            });

        }

    </script>

3.8 用户管理

描述:管理员点击左侧的菜单“用户管理”,页面跳转到用户信息管理界面,从数据库中查询出所有的用户信息,并把这些信息显示到页面中。主要包括用户名、类型信息。点击删除按钮实现用户信息的删除操作。如图3.6所示。

3.6 用户管理界面

4 系统测试

在设计系统和系统开发的过程中,我们常常会遇到一些错误,有时是一些简单的语法错误,对于语句的语法错误,我们再编码的时候很多的开发工具就能够识别出来从而很容易发现并改正;还有一些错误是很难发现的,开发工具也不会给出提示,只有在我们运行程序是才会报错,这就需要我们对程序进行调试,如果遇到这种错误我们可以通过加断点或者打印语句等方法来定位错误,再根据错误信息改正错误。

系统开发完成后,测试环节是必不可少的。系统在开发过程中,首先分析需求和设计阶段得出的结论,用来确定测试的目的和范围。系统测试有单元测试、集成测试和系统测试等。

4.1 测试方法

本系统采用黑盒测试法,黑盒测试又称为功能测试。黑盒测试不同于白盒测试,不需要测试人员具有专业的测试知识,也不需要了解系统的内部运行细节。在测试时只需要找到所有输出功能和输入的集合,对每个模块分别进行测试分析。白盒测试,需要测试人员具有一定的专业知识,要懂得系统的内部工作过程。

4.2 测试环境介绍

测试环境:操作系统win10系统,数据库MYSQL。

测试数据:用户登录。

4.3 功能模块测试

用户登录测试,测试结果如图4.3.1所示。

表4.3.1

用例名称

 用户登录

测试时间

5.10

对应需求

 用户登录

测试人员

功能描述

 验证用户登录

测试目的

 不存在用户或者帐号密码错误登录是否成功

前置条件

数据库中存在用户(帐号:undo,密码:123456)

非法用户(undoo)

测试步骤

1.在登录界面中输入帐号和密码

2.单击“登录”按钮

序号

输入数据/动作

预期结果

实际结果

1

输入用户名和密码

去服务器数据库验证

和预期结果一致

2

输入非法用户

提示登录错误信息

和预期结果一致

在进行用户登录测试时,输入用户名和密码,点击登录按钮后,系统会去后台对用户名和密码进行校验。如果用户名和密码正确则跳转到用户信息界面,如果用户名和密码不正确就会显示登录不成功弹出提示框显示登录失败。测试效果如图4.3.2所示。

图4.3.2

5 收获与体会

网上手机商城购物系统采用了Java的SSM框架搭建。迫于用户的需求系统对此进行了充分的分析,在测试之后,运行的结果也达到了所期望的要求,为了能够使系统更加的人性化,导航条实现了对商品的分类功能。用户可以快速的对所有商品进行查看。

鉴于本人在知识量、开发经历等都处于初学阶段,系统可能在某些地方仍有bug。比如在一些具体的功能分析上考虑的还不够周到,导致系统在实现过程中不够详细、具体,所以在今后的学习过程里我会更加努力。

致谢

本论文及其中所载研究成果是在我的导师赵黎老师的悉心指导和帮助下完成的,从最初论文选题,到框架设计,直至定稿,老师都倾注了大量心血。老师深厚的理论素养,丰富的实践知识,开拓了我的视野,使我的开发能力有了很大的提高。此外,老师严谨的治学态度和科学的工作方法更是给予了我极大的帮助,并且必将对我今后的工作和生活产生极为深远的影响,在此衷心感谢赵黎老师对我学习、生活及科研方面的关心与指导。

参考文献

 [1] 杨开振等. Java EE互联网轻量级框架整合开发— —SSM框架spring和Redis实现[M]. 北京:电子工业出版,2017.

[2]李俊民. HTML 5+CSS 3网页设计经典范例[M].北京:电子工业出版,2010.

[3]邹红霆. 基于SSM框架的Web系统研究与应用[J]. 湖南理工学院学报(自科版), 2017,30(1):39-43.

[4]程杰. 大话设计模式[M]   北京:清华大学出版社,2010

[5]郭航宇,成丽君. 基于javaEE的诗词文化网站系统设计与实现[J]. 电子技术与软件工程,2018(11):7-8.  

[6] 杨黎薇. 基于JavaEE设计模式的烈度速报建设与应用[J]. 世界地震工程,2018,34(02):147-156.

[7] 牛勇超. 基于JavaEE的开放实验管理系统的设计与实现[J]. 实验技术与管理,2017,34(01):153-156.

[8]韩姗姗. 面向复杂学习的高校计算机实践类教材建设[J]. 计算机教育,2017(03):57-60.

[9] 张晓刚. 项目进阶驱动的JavaEE课程实践教学改革探索[J]. 计算机教育,2016(09):115-118.

[10] 王小正,杨鑫,侯青. 面向应用型本科院校的JavaEE教材建设[J]. 计算机教育,2015(12):98-101.

[11] 黄统奎,张艳红. 基于JavaEE高校毕业设计管理系统的设计与实现[J]. 电脑知识与技术,2014,10(19):4384-4386.

[12] 王荣芝,周洪翠,于世华. 基于Android+JavaEE技术的旅游助手系统设计与实现[J]. 电子技术与软件工程,2014(19):64-65.

[13]. 翟悦,王立娟. 基于CDIO模式的JavaEE课程改革方案研究[J]. 电脑知识与技术,2015,11(19):140-141.

[14]朱敏,朱晴婷,李媛媛编著. JSP Web应用教程[M].北京:清华大学出版社,2018

[15]陶林峰. 基于J2EE的网上商城的设计与实现[D] ,2015.

附录

@RequestMapping("findAll")

public String findAllGoods(Model model){

List<Goods> list = goodsService.findAll();

model.addAttribute("goodsList", list);

return "list";

}

@RequestMapping("{goodsId}")

public String findAllGoods(@PathVariable("goodsId")Integer goodsId,Model model){

Goods goods = goodsService.findById(goodsId);

List<Evaluate> evaList = evaluateService.findEvaluateByGoodsId(goodsId);

model.addAttribute("goods", goods);

model.addAttribute("evaList", evaList);

return "detail";

}

@RequestMapping("preUpdate")

public String preUpdate(Integer goodsId,Model model){

Goods goods = goodsService.findById(goodsId);

model.addAttribute("goods", goods);

return "update";

}

@RequestMapping("findBySplitPage")

@ResponseBody

public JSONObject findBySplitPage(Integer page,Integer limit,String keyword){

PageInfo<Goods> info = goodsService.findBySplitPage(page, limit,keyword);

JSONObject obj=new JSONObject();

obj.put("msg", "");

obj.put("code", 0);

obj.put("count", info.getTotal());

obj.put("data", info.getList());

return obj;

}

@RequestMapping("findGoodsByType")

@ResponseBody

public List<Goods> findGoodsByType(Integer typeId){

 List<Goods> list = goodsService.findGoodsByType(typeId);

 return list;

}

@RequestMapping("detail")

public String findGoodsDetail(Integer goodsId,Model model,HttpServletRequest request){

Goods goods = goodsService.findById(goodsId);

model.addAttribute("goods",goods);

model.addAttribute("evaList", goods.getEvaList());

HttpSession session = request.getSession();

Users user=(Users) session.getAttribute("user");

if(user!=null){

Guess guess = guessService.findGuessByUserId(user.getUserId(), goods.getGoodsId());

if(guess!=null){

guess.setGuessNum(guess.getGuessNum()+1);

guessService.updateGuess(guess);

}else{

Guess g=new Guess(goods, 1, -1, user);

guessService.addGuess(g);

}

}

return "userview/product_detail";

}

@RequestMapping("findHotGoods")

@ResponseBody

public List<Goods> findHotGoods(){

return goodsService.findHotGoods(4);

}

@RequestMapping("search")

public ModelAndView searchGoodsByName(String keyWord){

ModelAndView mv=new ModelAndView();

List<Goods> list = goodsService.findGoodsLikeName(keyWord);

mv.addObject("searchList",list);

mv.setViewName("userview/search");

return mv;

}

@RequestMapping("searchPre")

@ResponseBody

public List<Goods> searchPreGoods(String keyword){

List<Goods> list = goodsService.findGoodsLikeName(keyword);

return list;

}

@RequestMapping("delete")

@ResponseBody

public String deleteGoods(Integer goodsId){

Integer rs = goodsService.deleteGoods(goodsId);

if(rs>0){

return "success";

}else{

return "fail";

}

}

@RequestMapping("updateGoods")

@ResponseBody

public String updateGoods(Goods goods){

Integer rs = goodsService.update(goods);

if(rs>0){

return "success";

}else{

return "fail";

}

}

@RequestMapping("batchDelete")

@ResponseBody

public String batchDelete(String batchId){

Integer rs=0;

String[] id = batchId.split(",");

for (String s : id) {

Integer goodsId = Integer.valueOf(s);

rs = goodsService.deleteGoods(goodsId);

}

if(rs>0){

return "success";

}else{

return "fail";

}

}

//下订单

@RequestMapping("takeOrder")

public String takeOrder(Integer[] goodslist,Integer addr,Model model,HttpServletRequest request){

List<Cart> cartList=new ArrayList<Cart>();

List<OrderDetail> detailList=new ArrayList<OrderDetail>();

Double totalPrice=0D;

for (Integer i : goodslist) {

Cart cart = cartService.findCartById(i);

totalPrice+=cart.getCartNum()*cart.getCartGoods().getGoodsPrice();

cartList.add(cart);

OrderDetail detail=new OrderDetail(cart.getCartGoods(), cart.getCartGoods().getGoodsPrice()*cart.getCartNum(), cart.getCartNum());

detailList.add(detail);

}

HttpSession session = request.getSession();

Users user=(Users) session.getAttribute("user");

Date orderDate=new Date();

Address address = addressService.findAddresById(addr);

String a=address.getAddrProvince()+address.getAddrCity()+address.getAddrArea()+address.getAddrDetail();

Order order=new Order(user, orderDate, totalPrice, 1, address.getAddrNickname(), address.getAddrPhone(), a);

order.setDetailList(detailList);

Order takeOrder = orderService.takeOrder(order);

for (Cart c : cartList) {

Goods goods = goodsService.findById(c.getCartGoods().getGoodsId());

goods.setGoodsNum(goods.getGoodsNum()-c.getCartNum());

goods.setGoodsVolume(goods.getGoodsVolume()+c.getCartNum());

goodsService.update(goods);

cartService.deleteCart(c.getCartId());

}

model.addAttribute("order",takeOrder);

List<Guess> guessList = guessService.findGuessGoodsByUserId(user.getUserId(), 4);

model.addAttribute("guessList", guessList);

return "userview/takeorder";

}

@RequestMapping("findReadPayOrder")

@ResponseBody

public List<Order> findReadyPayOrder(HttpServletRequest request){

HttpSession session = request.getSession();

Users user=(Users) session.getAttribute("user");

List<Order> orderList = orderService.findOrdersByUserIdAndState(user.getUserId(), 1);

return orderList;

}

@RequestMapping("findReadyToDeliverOrder")

@ResponseBody

public List<Order> findReadyToDeliverOrder(HttpServletRequest request){

HttpSession session = request.getSession();

Users user = (Users) session.getAttribute("user");

List<Order> orderList = orderService.findOrdersByUserIdAndState(user.getUserId(), 2);

return orderList;

}

@RequestMapping("findReadyToReceiveOrder")

@ResponseBody

public List<Order> findReadToReceiveOrder(HttpServletRequest request){

HttpSession session = request.getSession();

Users user = (Users) session.getAttribute("user");

List<Order> orderList = orderService.findOrdersByUserIdAndState(user.getUserId(), 3);

return orderList;

}

@RequestMapping("findReadyToEvaluateOrder")

@ResponseBody

public List<Order> findReadyToEvaluateOrder(HttpServletRequest request){

HttpSession session = request.getSession();

Users user = (Users) session.getAttribute("user");

List<Order> orderList = orderService.findOrdersByUserIdAndState(user.getUserId(), 4);

return orderList;

}

@RequestMapping("findFinishOrder")

@ResponseBody

public List<Order> findFinishOrder(HttpServletRequest request){

HttpSession session = request.getSession();

Users user = (Users) session.getAttribute("user");

List<Order> orderList = orderService.findOrdersByUserIdAndState(user.getUserId(), 5);

return orderList;

}

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【资源介绍】 毕设-期末课设-JavaEE 基于SSM框架+mysql实现的农场信息管理系统.zip毕设-期末课设-JavaEE 基于SSM框架+mysql实现的农场信息管理系统.zip毕设-期末课设-JavaEE 基于SSM框架+mysql实现的农场信息管理系统.zip毕设-期末课设-JavaEE 基于SSM框架+mysql实现的农场信息管理系统.zip毕设-期末课设-JavaEE 基于SSM框架+mysql实现的农场信息管理系统.zip毕设-期末课设-JavaEE 基于SSM框架+mysql实现的农场信息管理系统.zip毕设-期末课设-JavaEE 基于SSM框架+mysql实现的农场信息管理系统.zip毕设-期末课设-JavaEE 基于SSM框架+mysql实现的农场信息管理系统.zip毕设-期末课设-JavaEE 基于SSM框架+mysql实现的农场信息管理系统.zip毕设-期末课设-JavaEE 基于SSM框架+mysql实现的农场信息管理系统.zip毕设-期末课设-JavaEE 基于SSM框架+mysql实现的农场信息管理系统.zip毕设-期末课设-JavaEE 基于SSM框架+mysql实现的农场信息管理系统.zip毕设-期末课设-JavaEE 基于SSM框架+mysql实现的农场信息管理系统.zip毕设-期末课设-JavaEE 基于SSM框架+mysql实现的农场信息管理系统.zip毕设-期末课设-JavaEE 基于SSM框架+mysql实现的农场信息管理系统.zip毕设-期末课设-JavaEE 基于SSM框架+mysql实现的农场信息管理系统.zip毕设-期末课设-JavaEE 基于SSM框架+mysql实现的农场信息管理系统.zip 该项目是个人毕设项目,答辩评审分达到95分,代码都经过调试测试,确保可以运行!欢迎下载使用,可用于小白学习、进阶。 该资源主要针对计算机、通信、人工智能、自动化等相关专业的学生、老师或从业者下载使用,亦可作为期末课程设计、课程大作业、毕业设计等。 项目整体具有较高的学习借鉴价值!基础能力强的可以在此基础上修改调整,以实现不同的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值