目 录
原创性声明 I
摘 要 I
Abstract II
1 绪论 1
1.1 研究背景 1
1.2 研究目的和意义 1
1.3 国内外研究现状 1
1.4 论文组织结构 2
2 系统开发技术介绍 3
2.1系统开发环境 3
2.1.1 硬件环境 3
2.1.2 软件环境 3
2.2 系统开发工具 3
2.2.1 Java语言 3
2.2.2 Eclipse集成开发环境 3
2.2.3 MySQL数据库 4
2.2.4 Spring Boot框架 4
3 需求分析 5
3.1 功能需求分析 5
3.1.1 管理员 5
3.1.2 用户 7
3.1.3 商家 9
3.2可行性分析 11
3.2.1 技术可行性 11
3.2.2 经济可行性 11
3.2.3 操作可行性 11
3.2.4 法律与合规性 12
3.2.5 可行性分析结论 12
3.3 系统数据流图分析 12
3.3.1屿茶商城顶层数据流图 12
3.3.2 商城系统管理1级数据流图 13
3.3.3 用户管理1级数据流图 13
3.3.4 商品管理1级流程图 14
3.4 非功能需求分析 14
4 概要设计 16
4.1 总体设计 16
4.2 功能模块设计 16
4.3 数据库设计 17
4.3.1 E-R总图 17
4.3.2 用户 18
4.3.3 订单 18
4.3.4 日志 19
4.3.5 商品 20
4.3.6 用户逻辑设计 22
4.3.7 管理员的逻辑设计 23
5 系统实现 26
5.1 用户模块 26
5.1.1 用户注册 26
5.1.2 用户登录 27
5.1.3 主页面 28
5.1.4 商品页面 30
5.1.5 用户下订单页面 31
5.2 管理员模块 32
5.2.1 商品管理 32
5.2.2 用户管理 33
5.2.3 订单管理 34
5.2.4 日志管理 34
5.2.5 菜单管理 35
6 系统测试 37
6.1 软件测试的目的 37
6.2 软件测试的方法 37
6.3 测试用例 37
6.4 测试总结 39
总结与展望 40
参考文献 41
致谢 43
3 需求分析
3.1 功能需求分析
茶叶线上商城系统旨在提供一个突破时间与空间限制的便捷网络购物平台。其主要目的是让消费者能够随时随地、高效地选购各类茶叶产品,同时满足商家拓展销售渠道、管理商品与订单的需求。在此基础上,针对系统要达成的目标,进行全面的功能需求分析,以明确系统应具备的各项功能,如商品展示与浏览、购物车、订单管理等核心功能,以及融入茶文化元素等特色功能;开展非功能需求分析,从系统处理的准确性和及时性、安全性、易用性、稳定性等方面,确保系统能为消费者和商家提供优质、可靠的使用体验,满足各方对系统性能与质量的期望。
3.1.1 管理员
管理员作为参与者,用例涵盖用户管理、商家管理、商品管理、订单管理、促销活动管理、茶文化知识推广管理等,全方位保障平台的高效稳定运行与业务拓展。管理员用例图如图3. 1所示。
图3. 1 管理员用例图
(1)用户管理
用户信息查看与维护:能够查看所有注册用户的基本信息,包括用户名、联系方式、注册时间等。处理违规用户账号时,除直接删除,还能将其标记为 “违规待处理” 状态,方便后续复查与统计。
用户权限管理:设定不同用户角色(普通用户、商家、管理员等)的权限,例如普通用户具有浏览、购买商品的权限,商家具有管理商品和订单的权限等。根据用户的信誉或业务需求,调整用户的权限,如限制某些违规用户的购买数量或权限等。
(2)商家管理
商家审核:对申请注册的商家进行审核,查看其提供的公司信息、营业执照等资料的真实性和合法性。审核通过后,为商家开通账号并分配相应的权限;审核不通过则拒绝注册并告知原因。
商家监督:监控商家的商品供应情况,包括商品的质量、库存管理、订单处理速度等。对违规的商家(如提供虚假商品信息、发货不及时等)进行警告、处罚(如限制商品上架、暂停账号等)操作。
(3)商品管理
商品分类管理:持续创建和完善茶叶的分类体系,除按品种(绿茶、红茶、乌龙茶等)、产地(福建、云南等)分类,还可新增按茶叶采摘季节、价格区间等维度分类。针对不同分类,设置个性化的商品展示模板,如高端茶叶分类采用更精致的页面布局。
商品审核:对商家提交的商品信息进行严格审核,除确保商品名称、价格、描述、图片符合商城规范,还需检查商品的保质期等信息的准确性。对于商品描述,要求突出茶叶的特色风味、制作工艺等独特卖点;对于图片,规定图片的分辨率、背景要求等。审核通过后,还可对商品进行推荐位设置,提升商品曝光度。
(4)订单管理
订单监控:全面查看所有订单的状态,包括未付款、已付款、已发货、已完成、已取消等,同时能查看订单的物流轨迹信息,对长时间未更新物流状态的订单进行预警处理。针对异常订单,如用户频繁退换货的订单、金额异常的订单等,可进行单独标记与深入调查。
订单统计与分析:精准统计不同时间段的订单数量、销售额等数据,还可进一步分析订单的客单价、商品销售组合情况等。通过分析,为促销活动策划提供数据支持,如发现某类茶叶与茶具搭配购买率高,可针对性推出组合促销活动。
(5)促销活动管理
活动策划与创建:精心制定丰富多样的促销活动方案,如满减活动、买一送一活动、限时折扣活动等。详细设置活动的规则,包括活动时间、参与商品范围、是否可与其他优惠叠加等。在活动策划时,可结合节假日、季节特点等因素,打造特色主题促销活动,如春节茶叶礼盒促销活动。
(6)茶文化知识推广管理
文章发布:发布涵盖茶叶历史、文化内涵、茶艺技巧等多方面内容的文章。在文章发布前,可邀请专业的茶文化学者进行审核,确保内容的准确性与专业性。同时,对文章进行关键词优化,方便用户搜索查阅。
视频发布:发布茶叶文化知识的视频内容,如介绍茶叶的冲泡艺术、不同茶叶品种的鉴别方法等。视频发布时,除输入标题、简介,上传视频文件,并设置视频的分类(如茶文化历史、茶叶品鉴技巧等)。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link href="../../resources/home/css/css.css" rel="stylesheet" type="text/css" />
<link href="../../resources/home/css/common.css" rel="stylesheet" tyle="text/css" />
<link href="../../resources/home/css/Orders.css" rel="stylesheet" type="text/css" />
<link rel="stylesheet" type="text/css" href="../../resources/admin/easyui/easyui/1.3.4/themes/default/easyui.css" />
<link rel="stylesheet" type="text/css" href="../../resources/admin/easyui/css/wu.css" />
<link rel="stylesheet" type="text/css" href="../../resources/admin/easyui/css/icon.css" />
<script src="../../resources/home/js/jquery-1.9.1.min.js" type="text/javascript"></script>
<script src="../../resources/home/js/jquery.reveal.js" type="text/javascript"></script>
<script src="../../resources/home/js/jquery.SuperSlide.2.1.1.js" type="text/javascript"></script>
<script src="../../resources/home/js/jquery.sumoselect.min.js" type="text/javascript"></script>
<script src="../../resources/home/js/common_js.js" type="text/javascript"></script>
<script src="../../resources/home/js/footer.js" type="text/javascript"></script>
<script src="../../resources/home/js/jquery.jumpto.js" type="text/javascript"></script>
<script type="text/javascript" src="../../resources/admin/easyui/js/jquery-1.8.0.min.js"></script>
<script type="text/javascript" src="../../resources/admin/easyui/easyui/1.3.4/jquery.easyui.min.js"></script>
<script type="text/javascript" src="../../resources/admin/easyui/easyui/1.3.4/locale/easyui-lang-zh_CN.js"></script>
<title>确认订单界面</title>
</head>
<script>
var charCount;
$(function() {
$("#remark").val("");
});
function CountWords(obj, show_id){
var fullStr = obj.value;
charCount = fullStr.length;
var rExp = /[^A-Za-z0-9]/gi;
var spacesStr = fullStr.replace(rExp, ' ');
var cleanedStr = spacesStr + ' ';
do{
var old_str = cleanedStr;
cleanedStrcleanedStr = cleanedStr.replace(' ', ' ');
}while( old_str != cleanedStr );
var splitString = cleanedStr.split(' ');
document.getElementById(show_id).innerHTML=charCount;
}
function submit_order()
{
<c:if test="${address == null}">
$.messager.alert("消息提醒", "您还未添加地址,请先去个人中心添加地址!", "info",function(){window.location.href="/TeaShop/home/account/address";});
return;
</c:if>
var total_Price = $('#total_Price').val();
$.messager.confirm("消息提醒", "本次消费:<font color=red>"+total_Price+"</font>元,确定支付吗?", function (data) {
if (data) {
if(charCount>50)
{
$.messager.alert("消息提醒","备注字数不能大于50字!", "warning");
return;
}
var cart_id = "";
<c:forEach items="${cartList}" var="cart" varStatus="vs">
cart_id += ",${cart.id}"; //,2,3
</c:forEach>
var remark = $('#remark').val();
$.ajax({
type: "post",
url: "/TeaShop/home/shopping/submit_order",
data: {cart_id:cart_id,remark:remark},
dataType: "json", //返回数据类型
success: function(result){
if(result.type == 'success'){
$.messager.alert("消息提醒", result.msg, "info",function(){window.location.href="/TeaShop/home/system/index";});
}
else{
$.messager.alert("消息提醒", result.msg, "warning");
}
}
});
}
else {
return;
}
});
}
</script>
<body>
<%@include file="../common/common_top.jsp"%>
<!--导航栏样式-->
<div id="Menu" class="clearfix">
<div class="Menu_style">
<div id="allSortOuterbox" class="display">
<div class="Category"><a href="/TeaShop/home/product/list" class="Menu_img"><em></em></a></div>
<div class="hd_allsort_out_box_new">
<!--左侧栏目开始-->
<div class="Menu_list">
<div class="menu_title">茶叶品种</div>
<c:forEach items="${teaCategoryList}" var="teaCategory">
<a href="${teaCategory.href}">${teaCategory.name}</a>
</c:forEach>
</div>
<div class="Menu_list">
<div class="menu_title">茶叶价格</div>
<a href="/TeaShop/home/product/list?price=1">100以下</a><a href="/TeaShop/home/product/list?price=2">100-200</a>
<a href="/TeaShop/home/product/list?price=3">200-400</a><a href="/TeaShop/home/product/list?price=4">400-600</a>
<a href="/TeaShop/home/product/list?price=5">600-1000</a><a href="/TeaShop/home/product/list?price=6">1000以上</a>
</div>
<div class="Menu_list">
<div class="menu_title">推荐茶叶</div>
<ul class="recommend">
<c:set var="count" value="0"></c:set>
<c:forEach items="${teaListByActionId}" var="tea">
<!-- 只允许显示2个 -->
<c:if test="${count < 2}">
<li><a href="${tea.href}" title="${tea.name}">${tea.name}</a></li>
<c:set var="count" value="${count+1}"></c:set>
</c:if>
</c:forEach>
</ul>
</div>
</div>
</div>
<div class="Navigation" id="Navigation">
<ul class="Navigation_name">
<li><a class="nav_on" id="mynav" href="/TeaShop/home/system/index"><span>首页</span></a></li>
<c:forEach items="${teaCategoryList}" var="teaCategory">
<li><a class="nav_on" id="mynav" href="${teaCategory.href}"><span>${teaCategory.name}</span></a></li>
</c:forEach>
</ul>
</div>
<!--购物车-->
<div class="hd_Shopping_list" id="Shopping_list">
<div class="s_cart"><em></em><a href="#">我的购物车</a> <i class="ci-right">></i><i class="ci-count" id="shopping-amount">${cartTotal}</i></div>
<div class="dorpdown-layer">
<div class="spacer"></div>
<!--<div class="prompt"></div><div class="nogoods"><b></b>购物车中还没有商品,赶紧选购吧!</div>-->
<ul class="p_s_list">
<c:set var="totalPrice" value="0"></c:set>
<c:forEach items="${cartList}" var="cart" varStatus="vs">
<li>
<div class="img"><img src="${cart.tea.photo}" style="width:40px;height:40px;"></div>
<div class="content">
<p><a href="${cart.tea.href}">${cart.tea.name}</a></p><p>${cart.tea.info}</p>
</div>
<div class="Operations">
<p class="Price">¥${cart.tea.new_price}</p>
<p>数量:${cart.num}</p></div>
</li>
<c:set var="totalPrice" value="${totalPrice+cart.tea.new_price*cart.num}"></c:set>
</c:forEach>
</ul>
<div class="Shopping_style">
<div class="p-total">共<b>${cartTotal}</b>件商品 共计<strong>¥ ${totalPrice}</strong></div>
<a href="/TeaShop/home/shopping/cart" title="去购物车结算" id="btn-payforgoods" class="Shopping">去购物车结算</a>
</div>
</div>
</div>
</div>
</div>
<div id="Orders" class="Inside_pages clearfix">
<div class="Orders_style clearfix">
<div class="address clearfix">
<div class="title">收货人信息</div>
<div class="adderss_list clearfix">
<div class="title_name">选择收货地址 <a href="/TeaShop/home/account/address">+添加地址</a></div>
<div class="Shipping_address">
<ul class="detailed">
<li><label>收货人姓名</label><span>${address.name}</span></li>
<li><label>详细地址</label><span>${address.province}${address.city}${address.area}${address.detail}</span></li>
<li><label>邮政编码</label><span>${address.postcode}</span></li>
<li><label>收货人手机</label><span>${address.phone}</span></li>
</ul>
</div>
</div>
<form class="form" id="order_form" method="post">
<fieldset>
<!--产品列表-->
<div class="Product_List">
<table>
<thead><tr class="title"><td class="name">商品名称</td><td class="price">商品原价</td><td class="Preferential">商品新价</td><td class="Quantity">购买数量</td><td class="Money">金额</td></tr></thead>
<tbody>
<c:set var="totalPrice" value="0"></c:set>
<c:forEach items="${cartList}" var="cart" varStatus="vs">
<tr>
<td class="Product_info">
<a href="${cart.tea.href}"><img src="${cart.tea.photo}" width="100px" height="100px"/></a>
<a href="${cart.tea.href}" class="product_name">${cart.tea.name}</a>
</td>
<td><i>¥</i>${cart.tea.pre_price}</td>
<td><i>¥</i>${cart.tea.new_price}</td>
<td>${cart.num}</td>
<td class="Moneys"><i>¥</i>${cart.tea.new_price * cart.num}</td>
</tr>
<c:set var="totalPrice" value="${totalPrice+cart.tea.new_price * cart.num}"></c:set>
</c:forEach>
</tbody>
</table>
<div class="Pay_info">
<label>订单留言</label><input id ="remark" name="remark" type="text" onkeyup="CountWords(this,'show')" class="text_name " /> <span class="wordage" >字数:<span id="show" style="color:Red;">0</span>/50</span>
</div>
<!--价格-->
<div class="price_style">
<input id="total_Price" type="hidden" value="${totalPrice}" />
<div class="right_direction">
<ul>
<li><label>商品总价</label><i>¥</i><span>${totalPrice}</span></li>
<li class="shiji_price"><label>实 付 款</label><i>¥</i><span>${totalPrice}</span></li>
</ul>
<div class="btn">
<input type="button" onclick="submit_order();" value="提交订单" class="submit_btn"/>
<a href="/TeaShop/home/shopping/cart"><input type="button" value="返回购物车" class="return_btn"/></a>
</div>
</div>
</div>
</div>
</fieldset>
</form>
</div>
</div>
</div>
<%@include file="../common/footer.jsp"%>
</body>
</html>