鲜花商城系统
一、项目演示
鲜花销售系统
二、项目介绍
基于springboot和vue前后端分离的鲜花商城系统
系统角色:用户、管理员
主要菜单功能:
[1]后台(管理员也就是商家):登录,首页,用户管理,商品管理,订单管理,财务管理,系统管理,充值管理,角色管理,个人中心
[2]前台(用户):注册,登录,首页,自商城区,登录,注册,我的订单,我的收藏,个人中心,购物车,评论
语言:java
前端技术:Vue、 ELementUI、echarts
后端技术:SpringBoot、Mybatis-Plus
数据库:MySQL
三、系统部分功能截图
四、部分代码展示
package com.mall.goods.controller;
import com.mall.common.utils.FuyouResult;
import com.mall.common.utils.JsonUtils;
import com.mall.common.utils.RedisOperator;
import com.mall.goods.entity.ShopCat;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
@Api(value = "购物车接口controller", tags = {"购物车接口相关的api"})
@RequestMapping("shopcart")
@RestController
public class ShopCatController extends BaseController{
@Autowired
private RedisOperator redisOperator;
@ApiOperation(value = "添加商品到购物车", notes = "添加商品到购物车", httpMethod = "POST")
@PostMapping("/add")
public FuyouResult add(@RequestBody ShopCat shopCat,
HttpServletRequest request,
HttpServletResponse response) {
if (StringUtils.isBlank(shopCat.getUserId())) {
return FuyouResult.errorMsg("");
}
System.out.println(shopCat);
//前端用户在登录的情况下,添加商品到购物车,会同时在后端同步购物车到redis缓存
//需要判断当前购物车中已经存在的商品,如果存在,则累加数量
String shopcartJson = redisOperator.get(FUYOU_SHOPCART + ":" +shopCat.getUserId());
List<ShopCat> shopCatsList = null;
if (StringUtils.isNotBlank(shopcartJson)){
//redis中已经有购物车了
shopCatsList = JsonUtils.jsonToList(shopcartJson,ShopCat.class);
//判断购物车中是否存在已有商品,如果有的话number直接替换
boolean isHaving = false;
for (ShopCat sc : shopCatsList){
String tmpSpecId = sc.getId();
if (tmpSpecId.equals(shopCat.getId())) {
sc.setNumber(sc.getNumber() + shopCat.getNumber());
if (sc.getNumber() <= sc.getStock()){
isHaving = true;
}else {
return FuyouResult.errorMsg("数量超过库存了哦!");
}
}
}
if (!isHaving){
shopCatsList.add(shopCat);
}
}else {
//redis中没有购物车
shopCatsList = new ArrayList<>();
//直接添加到购物车中
shopCatsList.add(shopCat);
}
//覆盖现有redis中的购物车
redisOperator.set(FUYOU_SHOPCART + ":" +shopCat.getUserId(),JsonUtils.objectToJson(shopCatsList));
return FuyouResult.ok();
}
@ApiOperation(value = "修改购物车商品数量", notes = "修改购物车商品数量", httpMethod = "GET")
@GetMapping("/selectNumber")
public FuyouResult selectNumber(@RequestParam String userId,
@RequestParam String activityNumber,
@RequestParam Integer number,
HttpServletRequest request,
HttpServletResponse response){
if (StringUtils.isBlank(userId) || StringUtils.isBlank(activityNumber)) {
return FuyouResult.errorMsg("参数不能为空");
}
String shopcartJson = redisOperator.get(FUYOU_SHOPCART+":"+userId);
if (StringUtils.isNotBlank(shopcartJson)){
//redis中已经有了购物车
List<ShopCat> shopCatList = JsonUtils.jsonToList(shopcartJson,ShopCat.class);
//判断购物车中是否存在已有商品,如果有的话则删除
for (ShopCat sc : shopCatList){
String tmpSpecId = sc.getAcitivityNumber();
if (tmpSpecId.equals(activityNumber)){
sc.setNumber(number);
//覆盖现有redis中的购物车数据
redisOperator.set(FUYOU_SHOPCART+":"+userId,JsonUtils.objectToJson(shopCatList));
break;
}
}
}
return FuyouResult.ok("数量修改成功");
}
@ApiOperation(value = "从购物车中删除商品", notes = "从购物车中删除商品", httpMethod = "POST")
@PostMapping("/del")
public FuyouResult del(@RequestParam String userId,
@RequestParam String activityNumber,
HttpServletRequest request,
HttpServletResponse response) {
if (StringUtils.isBlank(userId) || StringUtils.isBlank(activityNumber)) {
return FuyouResult.errorMsg("参数不能为空");
}
// TODO 用户在页面删除购物车中的商品数据,如果此时用户已经登录,则需要同步删除后端购物车中的商品
String shopcartJson = redisOperator.get(FUYOU_SHOPCART+":"+userId);
if (StringUtils.isNotBlank(shopcartJson)){
//redis中已经有购物车了
List<ShopCat> shopCatList = JsonUtils.jsonToList(shopcartJson,ShopCat.class);
//判断购物车中是否存在已有商品,如果有的话则删除
for (ShopCat sc : shopCatList){
String tmpSpecId = sc.getAcitivityNumber();
if (tmpSpecId.equals(activityNumber)){
shopCatList.remove(sc);
break;
}
}
//覆盖现有redis中的购物车数据
redisOperator.set(FUYOU_SHOPCART+":"+userId,JsonUtils.objectToJson(shopCatList));
}
return FuyouResult.ok("删除成功");
}
@ApiOperation(value = "查询购物车的商品", notes = "查询购物车的商品", httpMethod = "GET")
@GetMapping("/get")
public JSONArray get(@RequestParam String userId,
HttpServletRequest request,
HttpServletResponse response) {
String shopcartJson =redisOperator.get(FUYOU_SHOPCART+":"+userId);
JSONArray jsonArray = JSONObject.parseArray(shopcartJson);
System.out.println(jsonArray);
return jsonArray;
}
}
package com.mall.sys.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.mall.common.result.R;
import com.mall.common.utils.FieldAssert;
import com.mall.goods.entity.User;
import com.mall.goods.entity.queryVo.UserQueryVo;
import com.mall.goods.service.UserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RestController;
/**
* 商城用户表 前端控制器
*/
@RestController
@RequestMapping("/sys/goodsUser")
@Api(tags = "商城用户表")
public class GoodsSysUserController {
@Autowired
UserService iGoodsUserService;
/**
* 查询商城用户表列表
*/
@PostMapping("queryGoodsUserList")
@ApiOperation("商城用户表列表")
public R queryGoodsUserList(@RequestBody UserQueryVo queryVo) {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
Page<User> page = iGoodsUserService.page(queryVo.getPage(), queryWrapper);
return R.ok().data("dataList", page);
}
/**
* 保存或者更新商城用户表信息
*/
@PostMapping("saveOrUpdateGoodsUser")
@ApiOperation("保存或者更新商城用户表信息")
public R saveOrUpdateGoodsUser(@RequestBody User entity) {
boolean b = true;
if (StringUtils.isEmpty(entity.getId())) {
b = iGoodsUserService.save(entity);
} else {
b = iGoodsUserService.updateById(entity);
}
return R.th(b);
}
/**
* 根据id查询商城用户表信息
*/
@GetMapping("getByIdGoodsUser/{id}")
@ApiOperation("根据id查询商城用户表信息")
public R getByIdGoodsUser(@PathVariable("id") String id) {
User dataGoodsUser = iGoodsUserService.getById(id);
return R.ok().data("entity", dataGoodsUser);
}
/**
* 根据id删除商城用户表信息
*/
@DeleteMapping("removeByIdGoodsUser/{id}")
@ApiOperation("根据id删除商城用户表信息")
public R removeByIdGoodsUser(@PathVariable("id") String id) {
boolean effect = iGoodsUserService.removeById(id);
return R.th(effect);
}
/**
* 查询携带余额的用户信息
*/
@GetMapping("getByCarryMoneyDetail/{id}")
public R getByCarryMoneyDetail(@PathVariable("id") Long id) {
return R.ok().data("dataInfo",iGoodsUserService.getByCarryMoneyDetail(id));
}
@PostMapping("uptUserInfo")
public R uptUserInfo(@RequestBody User user) {
if (!StringUtils.isEmpty(user.getUsername())){
QueryWrapper<User> queryWrapper=new QueryWrapper<>();
queryWrapper.eq("username",user.getUsername());
iGoodsUserService.list(queryWrapper).forEach(res->{
FieldAssert.isTrue(res.getId().equals(user.getId()),"用户已存在");
});
}
iGoodsUserService.updateById(user);
return R.ok();
}
}
package com.mall.sys.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.mall.common.result.R;
import com.mall.common.utils.MailServiceImpl;
import com.mall.sys.entity.MallOrder;
import com.mall.sys.entity.queryVo.MallOrderQueryVo;
import com.mall.sys.entity.vo.MallGoodsOrderVo;
import com.mall.sys.mapper.MallGoodsOrderMapper;
import com.mall.sys.service.MallOrderService;
import com.mall.goods.entity.Address;
import com.mall.goods.entity.User;
import com.mall.goods.service.AddressService;
import com.mall.goods.service.UserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 订单详情表 前端控制器
*/
@RestController
@RequestMapping("/sys/mallOrder")
@Api(tags = "订单详情表")
public class MallOrderController {
@Autowired
MallOrderService iMallOrderService;
@Autowired
AddressService addressService;
@Resource
MallGoodsOrderMapper mallGoodsOrderMapper;
@Autowired
private MailServiceImpl mailService;
@Autowired
UserService iUserService;
/**
* 查询订单详情表列表
*/
@PostMapping("queryMallOrderList")
@ApiOperation("订单详情表列表")
public R queryMallOrderList(@RequestBody MallOrderQueryVo queryVo) {
QueryWrapper<MallOrder> queryWrapper = new QueryWrapper<>();
if (queryVo.getUserId() != null) {
queryWrapper.eq("user_id", queryVo.getUserId());
}
queryWrapper.orderByDesc("gmt_create");
Page<MallOrder> page = iMallOrderService.page(queryVo.getPage(), queryWrapper);
return R.ok().data("dataList", page);
}
/**
* 保存或者更新订单详情表信息
*/
@PostMapping("saveOrUpdateMallOrder")
@ApiOperation("保存或者更新订单详情表信息")
public R saveOrUpdateMallOrder(@RequestBody MallOrder entity) {
boolean b = true;
if (StringUtils.isEmpty(entity.getId())) {
b = iMallOrderService.save(entity);
} else {
b = iMallOrderService.updateById(entity);
}
return R.th(b);
}
/**
* 根据id查询订单详情表信息
*/
@GetMapping("getByIdMallOrder/{id}")
@ApiOperation("根据id查询订单详情表信息")
public R getByIdMallOrder(@PathVariable("id") String id) {
QueryWrapper<MallOrder> orderQueryWrapper = new QueryWrapper<>();
orderQueryWrapper.eq("order_umber", id);
MallOrder one = iMallOrderService.getOne(orderQueryWrapper);
Address byId = addressService.getById(one.getAddressId());
List<MallGoodsOrderVo> mallGoodsOrderVoList = mallGoodsOrderMapper.getMallGoodsOrderVoList(id);
return R.ok().data("orderInfo", one).data("goodsAddressInfo", byId).data("MallGoodsList", mallGoodsOrderVoList);
}
/**
* 根据id删除订单详情表信息
*/
@DeleteMapping("removeByIdMallOrder/{id}")
@ApiOperation("根据id删除订单详情表信息")
public R removeByIdMallOrder(@PathVariable("id") String id) {
boolean effect = iMallOrderService.removeById(id);
return R.th(effect);
}
@GetMapping("sendCore/{orderNumber}")
public R sendCore(@PathVariable String orderNumber) throws Exception {
QueryWrapper<MallOrder> mallOrderQueryWrapper = new QueryWrapper<>();
mallOrderQueryWrapper.eq("order_umber", orderNumber);
MallOrder one = iMallOrderService.getOne(mallOrderQueryWrapper);
User byId = iUserService.getById(one.getUserId());
Map<String, Object> hashMap = new HashMap<>();
hashMap.put("username", byId.getUsername());
hashMap.put("orderNumber", orderNumber);
//mailService.sendHtmlMessageMail(byId.getEmail(), "发货通知", hashMap, "sys-notice.ftl");
UpdateWrapper<MallOrder> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("order_umber", orderNumber);
updateWrapper.set("status",1);
iMallOrderService.update(updateWrapper);
return R.ok();
}
}
package com.mall.sys.controller;
import cn.hutool.json.JSONUtil;
import com.mall.common.annotation.IgnoreSecurity;
import com.mall.common.result.R;
import com.mall.common.utils.JwtUtils;
import com.mall.common.utils.SnowflakeUtil;
import com.mall.common.utils.UserInfoUtil;
import com.mall.common.utils.UserLogInfoDto;
import com.mall.sys.entity.MallSysUser;
import com.mall.sys.entity.queryVo.MallSysUserQueryVo;
import com.mall.sys.service.MallMenuService;
import com.mall.sys.service.MallSysUserService;
import io.jsonwebtoken.Claims;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;
/**
* 用户表 前端控制器
*/
@RestController
@RequestMapping("/sys/mallSysUser")
@Api(tags = "用户表")
public class MallSysUserController {
@Autowired
MallSysUserService mallSysUserService;
@Autowired
MallMenuService mallMenuService;
/**
* 登录接口
*/
@PostMapping("login")
@IgnoreSecurity
@ApiOperation("登录")
public R login(@RequestBody MallSysUser user, HttpServletRequest request) {
Map login = mallSysUserService.login(user, request);
return R.ok().data(login);
}
@PostMapping("uptToken")
@IgnoreSecurity
@ApiOperation("uptToken")
public R aaa(@RequestBody String tokenS) {
Claims claims = JwtUtils.validateJWT(tokenS);
String issuedAt = claims.getSubject();
UserLogInfoDto userLogInfoDto = JSONUtil.toBean(issuedAt, UserLogInfoDto.class);
String token = JwtUtils.createJWT(SnowflakeUtil.randomLong() + "", "hujie", "{'userId':" + userLogInfoDto.getUserId() + ",'username':" + userLogInfoDto.getUsername() + ",'type':" + userLogInfoDto.getType() + ",'roleId':" + userLogInfoDto.getRoleId() + ",loginDateLong:" + userLogInfoDto.getLoginDateLong() + ",loginKey:" + userLogInfoDto.getLoginKey() + "}", 60 * 1000 * 30);
return R.ok().data("token", token);
}
/**
分页查询
*/
@PostMapping("queryPage")
@ApiOperation("查看用户列表")
public R queryPage(@RequestBody MallSysUserQueryVo mallSysUserQueryVo) {
return R.ok().data("list", mallSysUserService.queryPage(mallSysUserQueryVo));
}
/**
更新用户状态
*/
@PutMapping("/users/{uid}/state/{status}")
@ApiOperation("更新用户状态")
public R uptStatus(@PathVariable("uid") Long uid, @PathVariable("status") Boolean b) {
MallSysUser hujieitUser = new MallSysUser();
hujieitUser.setId(uid);
hujieitUser.setMgState(b);
mallSysUserService.uptUser(hujieitUser);
return R.ok();
}
@PostMapping("save")
@ApiOperation("添加用户")
public R saveUser(@RequestBody MallSysUser mallSysUser) {
if (StringUtils.isEmpty(mallSysUser.getId())) {
mallSysUserService.addUser(mallSysUser);
} else {
mallSysUserService.saveOrUpdate(mallSysUser);
}
return R.ok();
}
@DeleteMapping("del/{id}")
@ApiOperation("删除用户")
public R delUser(@PathVariable String id) {
boolean b = mallSysUserService.delUser(id);
return R.th(b);
}
@GetMapping("getById/{id}")
@ApiOperation("查询用户详情")
public R getByIdUser(@PathVariable String id) {
return R.ok().data(mallSysUserService.userDetail(id));
}
@GetMapping("getByIdThis")
@ApiOperation("查询用户详情")
public R getByIdUserThis() {
return R.ok().data(mallSysUserService.userDetail(UserInfoUtil.getUserId()));
}
}
五、底部获取项目源码(9.9¥带走)
有问题,或者需要协助调试运行项目的也可以