目录
毕设目的 1
开发环境 1
毕设内容 1
需求分析 2
4.1功能性需求分析 2
4.2非功能性需求 6
4.3设计约束 7设计过程 7
5.1概要设计 7
5.2数据库设计 8
5.3系统详细设计 17
5.4、编码设计(具体实现流程) 20调试过程 38
6.1 背景 38
6.2 测试目的 38
6.3测试环境 38
6.4 测试策略 39
6.5 测试方法 39
6.4 测试需求分析 39
6.5 测试设计与测试结果 40
6.6 测试报告 43小结 43
参考文献 44
附录: 44开发环境
硬件环境:
Window11 电脑、Centos7.6 服务器
软件环境:
IntelliJ IDEA 2021.1.3 开发工具
JDK 16 运行环境
Mysql 8
Navicat 15 for MySQL
XShell、XFtp
Redis5
RDM
Docker
Node.js 16.3.1
Maven
Nginx 1.9.9毕设内容
完成商城的基本功能模块:
登录模块、注册模块、首页商品列表显示模块、商品列表显示模块、 商品详情模块、购物车模块、收获地址模块、订单模块、个人中心模块。需求分析
4.1功能性需求分析
网上商城主要分为两部分前台和后台,前台是面向用户的,其中包括用户在线注册、登录、购物、提交订单、付款等操作;本文转载自http://www.biyezuopin.vip/onews.asp?id=15217另一部分是商城的后台,是管理员用来管理商城的,这部分包括,商成数据展示、商品分类管理、商品信息管理、会员管理、订单管理。
4.1.1用户注册基本需求
1.用户需要输入用户名、邮箱、密码、以及重复密码
2.用户提交后会对表单数据进行校验,用户名不可用重复,邮箱格式也必须正确且不允许重复,密码用户自定义,重复密码需要与密码栏书写一致,防止用户操作失误输入错误的密码。
3.用户阅读并且勾选服务协议,才可注册。
4.注册后,系统会向用户注册邮箱发送激活链接,用户需要去邮箱查看并且点击激活用户,才可以使用此账号进行购物操作。
<template>
<div class="app-container home">
<el-row :gutter="20">
<el-col :span="4">
<el-card class="box-card">
<el-row class="cart-content">
<el-col :span="10">
<i class="el-icon-user-solid" style="color: #F56C6C;"></i>
</el-col>
<el-col :span="14">
<span>{{ homeData.topData.memberCountNow }}</span>
<p>今日登录会员</p>
</el-col>
</el-row>
</el-card>
</el-col>
<el-col :span="4">
<el-card class="box-card">
<el-row class="cart-content">
<el-col :span="10">
<i class="el-icon-s-order" style="color: rgb(68,177,84)"></i>
</el-col>
<el-col :span="14">
<span>{{ homeData.topData.orderCountNow }}</span>
<p>今日付款订单</p>
</el-col>
</el-row>
</el-card>
</el-col>
<el-col :span="4">
<el-card class="box-card">
<el-row class="cart-content">
<el-col :span="10">
<i class="el-icon-s-finance" style="color: rgb(59,212,175)"></i>
</el-col>
<el-col :span="14">
<span>{{ homeData.topData.orderSumNow }}</span>
<p>今日收益</p>
</el-col>
</el-row>
</el-card>
</el-col>
<el-col :span="4">
<el-card class="box-card">
<el-row class="cart-content">
<el-col :span="10">
<i class="el-icon-shopping-bag-2" style="color: rgb(146,47,163)"></i>
</el-col>
<el-col :span="14">
<span>{{ homeData.topData.categoryCount }}</span>
<p>商品类别数量</p>
</el-col>
</el-row>
</el-card>
</el-col>
<el-col :span="4">
<el-card class="box-card">
<el-row class="cart-content">
<el-col :span="10">
<i class="el-icon-s-shop" style="color: rgb(83,172,230)"></i>
</el-col>
<el-col :span="14">
<span>{{ homeData.topData.sumTotalprice }}</span>
<p>累计收益</p>
</el-col>
</el-row>
</el-card>
</el-col>
<el-col :span="4">
<el-card class="box-card">
<el-row class="cart-content">
<el-col :span="10">
<i class="el-icon-s-custom" style="color: rgb(217,105,127)"></i>
</el-col>
<el-col :span="14">
<span>{{ homeData.topData.countMember }}</span>
<p>累计会员数量</p>
</el-col>
</el-row>
</el-card>
</el-col>
</el-row>
<el-row :gutter="20" style="margin-top: 30px">
<el-col :span="16">
<div id="myChart" class="chart"></div>
</el-col>
<el-col :span="8">
<div id="classChart" class="chart"></div>
</el-col>
</el-row>
</div>
</template>
<script>
import {getTopData} from "@/api/shop/indexdata"
export default {
name: "Index",
data() {
return {
// 版本号
version: "3.7.0",
homeData: {
topData: {},
categoryCountChart: {},
xData: [],
yData: []
}
};
},
methods: {
getTop() {
getTopData().then(response => {
this.homeData = response.data;
console.log("----", response.data)
this.drawLine()
})
},
goTarget(href) {
window.open(href, "_blank");
},
drawLine() {
// 基于准备好的dom,初始化echarts实例
var charDom = document.getElementById('myChart')
var classChart = document.getElementById('classChart')
let myClassChart = this.$echarts.init(classChart)
let myChart = this.$echarts.init(charDom)
var option;
// 绘制图表
option = {
title: {
text: '近一个月销售记录',
subtext: '总的销售金额',
left: 'center'
},
xAxis: {
type: 'category',
data: this.homeData.xData
},
yAxis: {
type: 'value'
},
series: [
{
data: this.homeData.yData,
type: 'line'
}
],
tooltip: {
trigger: 'axis',
}
};
option && myChart.setOption(option)
var option1;
option1 = {
title: {
text: '商品分类占比',
subtext: '各类商品的数量',
left: 'center'
},
tooltip: {
trigger: 'item'
},
series: [
{
name: '类别名称',
type: 'pie',
radius: '50%',
data: this.homeData.categoryCountChart,
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
}
}
]
};
option1 && myClassChart.setOption(option1)
}
},
created() {
this.getTop()
},
mounted() {
console.log("+++++", this.homeData)
// this.drawLine()
}
};
</script>
<style scoped lang="scss">
//.cart-content{
//margin-top: 20px;
//}
.chart {
height: 450px;
background-color: #fff;
padding-top: 20px;
}
//.el-row{
// margin-bottom: 30px;
//}
.box-card i {
font-size: 60px;
}
.app-container {
background-color: rgb(246, 246, 246);
}
.home {
blockquote {
padding: 10px 20px;
margin: 0 0 20px;
font-size: 17.5px;
border-left: 5px solid #eee;
}
hr {
margin-top: 20px;
margin-bottom: 20px;
border: 0;
border-top: 1px solid #eee;
}
.col-item {
margin-bottom: 20px;
}
ul {
padding: 0;
margin: 0;
}
font-family: "open sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
font-size: 13px;
color: #676a6c;
overflow-x: hidden;
ul {
list-style-type: none;
}
h4 {
margin-top: 0px;
}
h2 {
margin-top: 10px;
font-size: 26px;
font-weight: 100;
}
p {
margin-top: 10px;
b {
font-weight: 700;
}
}
.update-log {
ol {
display: block;
list-style-type: decimal;
margin-block-start: 1em;
margin-block-end: 1em;
margin-inline-start: 0;
margin-inline-end: 0;
padding-inline-start: 40px;
}
}
}
</style>