springboot012基于springboot的社区团购系统设计与实现(源码文档)

博主介绍:专注于Java(springboot ssm 等开发框架) vue  .net  php phython node.js    uniapp 微信小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设,从业十五余年开发设计教学工作
☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟
我的博客空间发布了2000+毕设题目 方便大家学习使用
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人
文末下方有源码获取地址

springboot012基于springboot的社区团购系统设计录像(含源码文档)

4.1 系统结构设计

系统结构设计是一个将一个庞大的任务细分为多个小的任务的过程,这些小的任务分段完成后,组合在一起形成一个完整的任务。在整个设计过程,以确定可能的具体方案达成每一个小的最终目标,对于每一个小的目标而言,我们必须先了解一些相关的需求分析的信息。然后对系统进行初步的设计,并对其逐渐进行优化,设计出一个具体可实现的系统结构。

本基于Spring Boot的社区团购系统主要包括用户模块和管理员模块,根据第三章中系统功能需求分析,可画出本基于Spring Boot的社区团购系统的结构图如图4-1所示:

图 4-1  系统结构图

4.2系统顺序图

4.2.1登录模块顺序图

用户和管理员均可进行登录操作,登录模块的顺序图如图 4-2 所示。

图4-2用户登录顺序图

4.2.2添加信息模块顺序图

管理员和用户登录后均可进行添加信息操作,添加信息顺序图如图4-3所示

图4-3添加信息顺序图

4.3 数据库设计

4.3.1 数据库E-R图设计

E-R图展现了数据的实体结构关系,为系统数据管理奠定了基础,也对数据进行规范化的设置,保证后期的高效性,避免数据出现重复造成冗余使得数据更新出现异常,无法同步数据和插入数据。通过E-R图也可便于对数据的设计和修改,如果一个数据库在被设计时没有相对应的E-R图,则整体数据库就缺少明确的定位和条理性,使得处理数据的效率大大降低,在需要更新或者查找数据时报错的可能性大大提升,对与后期运行调试系统会造成不必要的麻烦。本基于Spring Boot的社区团购系统的E-R图如下图所示:

4.3.2数据库设计

本基于Spring Boot的社区团购系统采用了MYSQL数据库进行系统数据的储存,主要的数据库表的具体设置如下:

表4-1  address地址信息表

字段名称

字段意义

字段类型

字段长度

是否主键

能否为空

id

编号

bigint

20

addtime

添加时间

timestamp

userid

用户编号

bigint

20

address

地址

varchar

200

name

收货人

varchar

200

phone

电话

varchar

200

isdefault

默认地址

varchar

200

表4-2s cart购物车信息表

字段名称

字段意义

字段类型

字段长度

是否主键

能否为空

id

编号

bigint

20

addtime

添加时间

timestamp

tablename

商品表名

bigint

200

userid

用户ID

bigint

20

goodid

商品ID

bigint

20

goodname

商品名称

varchar

200

picture

图片

varchar

200

buynumber

购买数量

int

11

price

单价

float

discountprice

会员价

float

表4-3  tuangouxinxi团购信息表

字段名称

字段意义

字段类型

字段长度

是否主键

能否为空

id

编号

bigint

20

addtime

添加时间

timestamp

shangpinbianhao

商品编号

varchar

200

shangpinmingcheng

商品名称

varchar

200

leixing`

类型

varchar

200

shuliang

数量

int

11

tuangoujia

团购价

int

11

xiangqing

详情

longtext

huodongshijian

活动时间

date

tupian

图片

varchar

200

thumbsupnum`

赞数

int

11

crazilynum`

踩数

int

11

表4-4  orders订单信息表

字段名称

字段意义

字段类型

字段长度

是否主键

能否为空

id

编号

bigint

20

addtime

下单时间

timestamp

orderid

订单编号

varchar

200

tablename

商品表名

varchar

200

userid

用户编号

bigint

20

goodid

商品编号

bigint

20

goodname

商品名称

varchar

200

picture

商品图片

varchar

200

buynumber

购买数量

int

11

price

价格

float

discountprice

折扣价格

float

total

总价格

float

discounttotal

折扣总价格

float

type

支付类型

int

11

status

状态

varchar

200

address

地址

varchar

200

tel`

电话

varchar

200

consignee

收货人

varchar

200

表4-5  users管理员信息表

字段名称

字段意义

字段类型

字段长度

是否主键

能否为空

id

编号

bigint

20

username

用户名

varchar

100

password

密码

varchar

100

role

角色

varchar

100

addtime

添加时间

timestamp

表4-6  yonghu用户信息表

字段名称

字段意义

字段类型

字段长度

是否主键

能否为空

id

编号

bigint

20

addtime

创建时间

timestamp

zhanghao

用户名

varchar

200

mima

密码

varchar

200

xingming

姓名

varchar

200

xingbie

性别

varchar

200

shouji

手机

varchar

200

youxiang`

邮箱

varchar

200

shenfenzheng

身份证

varchar

200

tupian

图片

varchar

200

jifen

积分

float

money

余额

float

第5章  系统的实现

5.1 用户功能模块的实现

5.1.1用户注册界面

没有账号的用户可进入注册界面进行注册操作,用户注册界面的运行效果如图5-1所示.

图5-1 用户注册界面

5.1.2用户登录界面

用户要想实现商品购买等操作,必须进行登录操作,在登录界面输入正确的用户名和密码,选择登录类型,点击登录按钮进行登录,用户登录界面如图5-2所示。

图5-2用户登录界面

5.1.3系统主界面

用户在系统前台可查看系统信息,包括首页、商品信息、团购信息等,系统主界面的运行效果如图5-3所示.

图5-3系统主界面

5.1.4商品详情界面

用户可选择商品查看商品详情信息,登录后可进行收藏、加入购物车和购买操作,商品详情界面如图5-4所示。

图5-4 商品详情界面

package com.controller;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Map;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpServletRequest;

import com.utils.ValidatorUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.annotation.IgnoreAuth;

import com.entity.ShangpinxinxiEntity;
import com.entity.view.ShangpinxinxiView;

import com.service.ShangpinxinxiService;
import com.service.TokenService;
import com.utils.PageUtils;
import com.utils.R;
import com.utils.MD5Util;
import com.utils.MPUtil;
import com.utils.CommonUtil;


/**
 * 商品信息
 * 后端接口
 * @author 
 * @email 
 * @date 2021-04-07 21:27:10
 */
@RestController
@RequestMapping("/shangpinxinxi")
public class ShangpinxinxiController {
    @Autowired
    private ShangpinxinxiService shangpinxinxiService;
    


    /**
     * 后端列表
     */
    @RequestMapping("/page")
    public R page(@RequestParam Map<String, Object> params,ShangpinxinxiEntity shangpinxinxi,
		HttpServletRequest request){
        EntityWrapper<ShangpinxinxiEntity> ew = new EntityWrapper<ShangpinxinxiEntity>();
		PageUtils page = shangpinxinxiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, shangpinxinxi), params), params));

        return R.ok().put("data", page);
    }
    
    /**
     * 前端列表
     */
	@IgnoreAuth
    @RequestMapping("/list")
    public R list(@RequestParam Map<String, Object> params,ShangpinxinxiEntity shangpinxinxi, HttpServletRequest request){
        EntityWrapper<ShangpinxinxiEntity> ew = new EntityWrapper<ShangpinxinxiEntity>();
		PageUtils page = shangpinxinxiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, shangpinxinxi), params), params));
        return R.ok().put("data", page);
    }

	/**
     * 列表
     */
    @RequestMapping("/lists")
    public R list( ShangpinxinxiEntity shangpinxinxi){
       	EntityWrapper<ShangpinxinxiEntity> ew = new EntityWrapper<ShangpinxinxiEntity>();
      	ew.allEq(MPUtil.allEQMapPre( shangpinxinxi, "shangpinxinxi")); 
        return R.ok().put("data", shangpinxinxiService.selectListView(ew));
    }

	 /**
     * 查询
     */
    @RequestMapping("/query")
    public R query(ShangpinxinxiEntity shangpinxinxi){
        EntityWrapper< ShangpinxinxiEntity> ew = new EntityWrapper< ShangpinxinxiEntity>();
 		ew.allEq(MPUtil.allEQMapPre( shangpinxinxi, "shangpinxinxi")); 
		ShangpinxinxiView shangpinxinxiView =  shangpinxinxiService.selectView(ew);
		return R.ok("查询商品信息成功").put("data", shangpinxinxiView);
    }
	
    /**
     * 后端详情
     */
    @RequestMapping("/info/{id}")
    public R info(@PathVariable("id") Long id){
        ShangpinxinxiEntity shangpinxinxi = shangpinxinxiService.selectById(id);
		shangpinxinxi.setClicknum(shangpinxinxi.getClicknum()+1);
		shangpinxinxi.setClicktime(new Date());
		shangpinxinxiService.updateById(shangpinxinxi);
        return R.ok().put("data", shangpinxinxi);
    }

    /**
     * 前端详情
     */
    @RequestMapping("/detail/{id}")
    public R detail(@PathVariable("id") Long id){
        ShangpinxinxiEntity shangpinxinxi = shangpinxinxiService.selectById(id);
		shangpinxinxi.setClicknum(shangpinxinxi.getClicknum()+1);
		shangpinxinxi.setClicktime(new Date());
		shangpinxinxiService.updateById(shangpinxinxi);
        return R.ok().put("data", shangpinxinxi);
    }
    


    /**
     * 赞或踩
     */
    @RequestMapping("/thumbsup/{id}")
    public R vote(@PathVariable("id") String id,String type){
        ShangpinxinxiEntity shangpinxinxi = shangpinxinxiService.selectById(id);
        if(type.equals("1")) {
        	shangpinxinxi.setThumbsupnum(shangpinxinxi.getThumbsupnum()+1);
        } else {
        	shangpinxinxi.setCrazilynum(shangpinxinxi.getCrazilynum()+1);
        }
        shangpinxinxiService.updateById(shangpinxinxi);
        return R.ok("投票成功");
    }

    /**
     * 后端保存
     */
    @RequestMapping("/save")
    public R save(@RequestBody ShangpinxinxiEntity shangpinxinxi, HttpServletRequest request){
    	shangpinxinxi.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
    	//ValidatorUtils.validateEntity(shangpinxinxi);
        shangpinxinxiService.insert(shangpinxinxi);
        return R.ok();
    }
    
    /**
     * 前端保存
     */
    @RequestMapping("/add")
    public R add(@RequestBody ShangpinxinxiEntity shangpinxinxi, HttpServletRequest request){
    	shangpinxinxi.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
    	//ValidatorUtils.validateEntity(shangpinxinxi);
        shangpinxinxiService.insert(shangpinxinxi);
        return R.ok();
    }

    /**
     * 修改
     */
    @RequestMapping("/update")
    public R update(@RequestBody ShangpinxinxiEntity shangpinxinxi, HttpServletRequest request){
        //ValidatorUtils.validateEntity(shangpinxinxi);
        shangpinxinxiService.updateById(shangpinxinxi);//全部更新
        return R.ok();
    }
    

    /**
     * 删除
     */
    @RequestMapping("/delete")
    public R delete(@RequestBody Long[] ids){
        shangpinxinxiService.deleteBatchIds(Arrays.asList(ids));
        return R.ok();
    }
    
    /**
     * 提醒接口
     */
	@RequestMapping("/remind/{columnName}/{type}")
	public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, 
						 @PathVariable("type") String type,@RequestParam Map<String, Object> map) {
		map.put("column", columnName);
		map.put("type", type);
		
		if(type.equals("2")) {
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
			Calendar c = Calendar.getInstance();
			Date remindStartDate = null;
			Date remindEndDate = null;
			if(map.get("remindstart")!=null) {
				Integer remindStart = Integer.parseInt(map.get("remindstart").toString());
				c.setTime(new Date()); 
				c.add(Calendar.DAY_OF_MONTH,remindStart);
				remindStartDate = c.getTime();
				map.put("remindstart", sdf.format(remindStartDate));
			}
			if(map.get("remindend")!=null) {
				Integer remindEnd = Integer.parseInt(map.get("remindend").toString());
				c.setTime(new Date());
				c.add(Calendar.DAY_OF_MONTH,remindEnd);
				remindEndDate = c.getTime();
				map.put("remindend", sdf.format(remindEndDate));
			}
		}
		
		Wrapper<ShangpinxinxiEntity> wrapper = new EntityWrapper<ShangpinxinxiEntity>();
		if(map.get("remindstart")!=null) {
			wrapper.ge(columnName, map.get("remindstart"));
		}
		if(map.get("remindend")!=null) {
			wrapper.le(columnName, map.get("remindend"));
		}


		int count = shangpinxinxiService.selectCount(wrapper);
		return R.ok().put("count", count);
	}
	
	/**
     * 前端智能排序
     */
	@IgnoreAuth
    @RequestMapping("/autoSort")
    public R autoSort(@RequestParam Map<String, Object> params,ShangpinxinxiEntity shangpinxinxi, HttpServletRequest request,String pre){
        EntityWrapper<ShangpinxinxiEntity> ew = new EntityWrapper<ShangpinxinxiEntity>();
        Map<String, Object> newMap = new HashMap<String, Object>();
        Map<String, Object> param = new HashMap<String, Object>();
		Iterator<Map.Entry<String, Object>> it = param.entrySet().iterator();
		while (it.hasNext()) {
			Map.Entry<String, Object> entry = it.next();
			String key = entry.getKey();
			String newKey = entry.getKey();
			if (pre.endsWith(".")) {
				newMap.put(pre + newKey, entry.getValue());
			} else if (StringUtils.isEmpty(pre)) {
				newMap.put(newKey, entry.getValue());
			} else {
				newMap.put(pre + "." + newKey, entry.getValue());
			}
		}
		params.put("sort", "clicknum");
        params.put("order", "desc");
		PageUtils page = shangpinxinxiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, shangpinxinxi), params), params));
        return R.ok().put("data", page);
    }


}

5.1.5购物车界面

用户在购物车界面可查看购物车商品信息,并可进行修改数量、删除商品以及购买等操作,购物车界面展示如图5-5所示。

图5-5 购物车界面


大家点赞、收藏、关注、评论啦  其他的定制服务 商务合作  下方联系卡片↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 或者私信作者