计算机毕业设计 家电销售展示平台的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌

🍅文末获取源码联系🍅

👇🏻 精彩专栏推荐订阅👇🏻 不然下次找不到哟


计算机毕业设计《1000套》

目录

1、项目介绍及开发技术

[1.1 项目介绍](#1.1 项目介绍)

[1.2 开发技术](#1.2 开发技术)

2、系统功能设计结构图

3、功能截图

[3.1 前台功能](#3.1 前台功能)

[3.2 后台功能](#3.2 后台功能)

4、数据库表结构设计

5、关键代码

[5.1 家电Controller模块](#5.1 家电Controller模块)

[5.2 家电Service模块](#5.2 家电Service模块)

[5.3 家电ServiceImpl模块](#5.3 家电ServiceImpl模块)

[5.4 家电Dao模块](#5.4 家电Dao模块)

6、论文目录结构

7、源码获取


1、项目介绍及开发技术

1.1 项目介绍

在数字化时代,电子商务已成为家电销售的重要渠道。消费者越来越倾向于通过在线平台浏览、比较和购买家电产品。为了满足市场需求,提升用户体验,我们设计并开发了一个家电销售展示平台,旨在提供一个集商品展示、用户交流、信息反馈于一体的综合性服务平台。

背景:

随着互联网技术的飞速发展,传统的家电销售模式已经无法完全满足现代消费者的需求。消费者期望能够在网上方便地获取家电信息,比较不同产品,享受便捷的购物体验。此外,随着市场竞争的加剧,家电销售商也需要一个有效的平台来展示产品,吸引和留住客户。

目的意义:

    1. 提升购物体验:平台通过提供清晰的商品图片、详细的产品描述和用户评价,帮助消费者做出更明智的购买决策。
    1. 增强用户互动:通过论坛和留言反馈功能,平台鼓励用户之间的交流和与商家的互动,从而提升用户参与度和品牌忠诚度。
    1. 优化信息传递:公告信息和轮播图信息管理功能使得商家能够及时发布促销活动和最新产品信息,吸引用户关注。
    1. 提高管理效率:后端管理系统为商家提供了商品管理、订单处理、用户反馈跟踪等工具,提高了运营效率和服务质量。
    1. 数据分析与决策支持:平台的数据分析功能为商家提供了用户行为分析和销售趋势预测,支持商家制定更有效的市场策略。

综上所述,家电销售展示平台的设计与实现,不仅能够为消费者提供一个便捷、互动的购物环境,还能够为家电销售商提供一个高效、智能的管理工具。通过技术手段优化家电销售流程,该平台有望成为推动家电电子商务发展的重要力量,为消费者和商家创造更大的价值。

1.2 开发技术

类别 技术名称 用途/描述
开发语言 Java 一种广泛使用的面向对象编程语言。
框架 Spring Boot 简化Spring应用的初始搭建以及开发过程。
ORM工具 MyBatis Plus MyBatis的增强工具,简化CRUD操作。
数据库 MySQL 流行的关系型数据库管理系统。
构建工具 Maven 项目管理和理解工具。
开发工具 IDEA 集成开发环境,用于代码编写和调试。
JDK版本 JDK 1.8+ Java开发工具包,提供运行Java程序所需的环境。
前端框架 Vue 用于构建用户界面的渐进式JavaScript框架。
UI框架 Element UI 基于Vue的桌面端组件库。
前端技术 HTML 网页内容的标准标记语言。
前端技术 CSS 描述HTML文档的样式。
前端技术 JS 网页脚本语言,用于实现网页的动态效果。

2、系统功能设计结构图

功能模块结构图

├── 前端

│ ├── 登录

│ ├── 注册

│ ├── 论坛

│ ├── 商品

│ ├── 留言反馈

│ ├── 公告信息

│ ├── 个人中心

│ ├── 购物车

└── 后端

├── 登录

├── 首页

├── 个人中心

├── 管理员管理

├── 基础数据管理

├── 论坛管理

├── 商品管理

├── 留言反馈管理

├── 公告信息管理

├── 用户管理

└── 轮播图信息管理

系统MVC框架,请求流程展示:

3、功能截图

3.1 前台功能

3.2 后台功能

4、数据库表结构设计

sql 复制代码
CREATE TABLE `dictionary` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `dic_code` varchar(200) DEFAULT NULL COMMENT '字段',
  `dic_name` varchar(200) DEFAULT NULL COMMENT '字段名',
  `code_index` int(11) DEFAULT NULL COMMENT '编码',
  `index_name` varchar(200) DEFAULT NULL COMMENT '编码名字  Search111 ',
  `super_id` int(11) DEFAULT NULL COMMENT '父字段id',
  `beizhu` varchar(200) DEFAULT NULL COMMENT '备注',
  `create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=58 DEFAULT CHARSET=utf8 COMMENT='字典';


CREATE TABLE `forum` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `forum_name` varchar(200) DEFAULT NULL COMMENT '帖子标题  Search111 ',
  `yonghu_id` int(11) DEFAULT NULL COMMENT '用户',
  `users_id` int(11) DEFAULT NULL COMMENT '管理员',
  `forum_content` longtext COMMENT '发布内容',
  `super_ids` int(11) DEFAULT NULL COMMENT '父id',
  `forum_state_types` int(11) DEFAULT NULL COMMENT '帖子状态',
  `insert_time` timestamp NULL DEFAULT NULL COMMENT '发帖时间',
  `update_time` timestamp NULL DEFAULT NULL COMMENT '修改时间',
  `create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间 show2',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8 COMMENT='论坛';


CREATE TABLE `jiadian_commentback` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `jiadian_id` int(11) DEFAULT NULL COMMENT '商品',
  `yonghu_id` int(11) DEFAULT NULL COMMENT '用户',
  `jiadian_commentback_text` longtext COMMENT '评价内容',
  `insert_time` timestamp NULL DEFAULT NULL COMMENT '评价时间',
  `reply_text` longtext COMMENT '回复内容',
  `update_time` timestamp NULL DEFAULT NULL COMMENT '回复时间',
  `create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间 show3 listShow',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8 COMMENT='商品评价';


CREATE TABLE `jiadian_order` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `jiadian_order_uuid_number` varchar(200) DEFAULT NULL COMMENT '订单号 Search111 ',
  `address_id` int(11) DEFAULT NULL COMMENT '收货地址 ',
  `jiadian_id` int(11) DEFAULT NULL COMMENT '商品',
  `yonghu_id` int(11) DEFAULT NULL COMMENT '用户',
  `buy_number` int(11) DEFAULT NULL COMMENT '购买数量',
  `jiadian_order_true_price` decimal(10,2) DEFAULT NULL COMMENT '实付价格',
  `jiadian_order_courier_name` varchar(200) DEFAULT NULL COMMENT '快递公司',
  `jiadian_order_courier_number` varchar(200) DEFAULT NULL COMMENT '订单快递单号',
  `jiadian_order_types` int(11) DEFAULT NULL COMMENT '订单类型 Search111 ',
  `jiadian_order_payment_types` int(11) DEFAULT NULL COMMENT '支付类型',
  `insert_time` timestamp NULL DEFAULT NULL COMMENT '订单创建时间',
  `create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间 show3 listShow',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='商品订单';


CREATE TABLE `liuyan` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键 ',
  `yonghu_id` int(11) DEFAULT NULL COMMENT '用户',
  `liuyan_name` varchar(200) DEFAULT NULL COMMENT '留言标题  Search111 ',
  `liuyan_text` longtext COMMENT '留言内容',
  `insert_time` timestamp NULL DEFAULT NULL COMMENT '留言时间',
  `reply_text` longtext COMMENT '回复内容',
  `update_time` timestamp NULL DEFAULT NULL COMMENT '回复时间',
  `create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间 show2 nameShow',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8 COMMENT='留言反馈';


DROP TABLE IF EXISTS `news`;

CREATE TABLE `news` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `news_name` varchar(200) DEFAULT NULL COMMENT '公告标题  Search111 ',
  `news_types` int(11) DEFAULT NULL COMMENT '公告类型  Search111 ',
  `news_photo` varchar(200) DEFAULT NULL COMMENT '公告图片',
  `insert_time` timestamp NULL DEFAULT NULL COMMENT '添加时间',
  `news_content` longtext COMMENT '公告详情',
  `create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间 show1 show2 nameShow',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8 COMMENT='公告信息';


CREATE TABLE `token` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `userid` bigint(20) NOT NULL COMMENT '用户id',
  `username` varchar(100) NOT NULL COMMENT '用户名',
  `tablename` varchar(100) DEFAULT NULL COMMENT '表名',
  `role` varchar(100) DEFAULT NULL COMMENT '角色',
  `token` varchar(200) NOT NULL COMMENT '密码',
  `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '新增时间',
  `expiratedtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '过期时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COMMENT='token表';


CREATE TABLE `users` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `username` varchar(100) NOT NULL COMMENT '用户名',
  `password` varchar(100) NOT NULL COMMENT '密码',
  `role` varchar(100) DEFAULT '管理员' COMMENT '角色',
  `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '新增时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='管理员';



CREATE TABLE `yonghu` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `username` varchar(200) DEFAULT NULL COMMENT '账户',
  `password` varchar(200) DEFAULT NULL COMMENT '密码',
  `yonghu_name` varchar(200) DEFAULT NULL COMMENT '用户姓名 Search111 ',
  `yonghu_phone` varchar(200) DEFAULT NULL COMMENT '联系方式',
  `yonghu_id_number` varchar(200) DEFAULT NULL COMMENT '身份证号',
  `yonghu_photo` varchar(200) DEFAULT NULL COMMENT '用户头像',
  `sex_types` int(11) DEFAULT NULL COMMENT '性别 Search111',
  `yonghu_email` varchar(200) DEFAULT NULL COMMENT '电子邮箱',
  `new_money` decimal(10,2) DEFAULT NULL COMMENT '余额 ',
  `create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='用户';

5、关键代码

5.1 家电Controller模块

java 复制代码
package com.controller;

import java.io.File;
import java.math.BigDecimal;
import java.net.URL;
import java.text.SimpleDateFormat;
import com.alibaba.fastjson.JSONObject;
import java.util.*;
import org.springframework.beans.BeanUtils;
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.context.ContextLoader;
import javax.servlet.ServletContext;
import com.service.TokenService;
import com.utils.*;
import java.lang.reflect.InvocationTargetException;

import com.service.DictionaryService;
import org.apache.commons.lang3.StringUtils;
import com.annotation.IgnoreAuth;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.entity.*;
import com.entity.view.*;
import com.service.*;
import com.utils.PageUtils;
import com.utils.R;
import com.alibaba.fastjson.*;

/**
 * 商品
 * 后端接口
 * @author
 * @email
*/
@RestController
@Controller
@RequestMapping("/jiadian")
public class JiadianController {
    private static final Logger logger = LoggerFactory.getLogger(JiadianController.class);

    private static final String TABLE_NAME = "jiadian";

    @Autowired
    private JiadianService jiadianService;


    @Autowired
    private TokenService tokenService;

    @Autowired
    private AddressService addressService;//收货地址
    @Autowired
    private CartService cartService;//购物车
    @Autowired
    private DictionaryService dictionaryService;//字典
    @Autowired
    private ForumService forumService;//论坛
    @Autowired
    private JiadianCollectionService jiadianCollectionService;//商品收藏
    @Autowired
    private JiadianCommentbackService jiadianCommentbackService;//商品评价
    @Autowired
    private JiadianOrderService jiadianOrderService;//商品订单
    @Autowired
    private LiuyanService liuyanService;//留言反馈
    @Autowired
    private NewsService newsService;//公告信息
    @Autowired
    private YonghuService yonghuService;//用户
    @Autowired
    private UsersService usersService;//管理员


    /**
    * 后端列表
    */
    @RequestMapping("/page")
    public R page(@RequestParam Map<String, Object> params, HttpServletRequest request){
        logger.debug("page方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params));
        String role = String.valueOf(request.getSession().getAttribute("role"));
        if(false)
            return R.error(511,"永不会进入");
        else if("用户".equals(role))
            params.put("yonghuId",request.getSession().getAttribute("userId"));
        params.put("jiadianDeleteStart",1);params.put("jiadianDeleteEnd",1);
        CommonUtil.checkMap(params);
        PageUtils page = jiadianService.queryPage(params);

        //字典表数据转换
        List<JiadianView> list =(List<JiadianView>)page.getList();
        for(JiadianView c:list){
            //修改对应字典表字段
            dictionaryService.dictionaryConvert(c, request);
        }
        return R.ok().put("data", page);
    }

    /**
    * 后端详情
    */
    @RequestMapping("/info/{id}")
    public R info(@PathVariable("id") Long id, HttpServletRequest request){
        logger.debug("info方法:,,Controller:{},,id:{}",this.getClass().getName(),id);
        JiadianEntity jiadian = jiadianService.selectById(id);
        if(jiadian !=null){
            //entity转view
            JiadianView view = new JiadianView();
            BeanUtils.copyProperties( jiadian , view );//把实体数据重构到view中
            //修改对应字典表字段
            dictionaryService.dictionaryConvert(view, request);
            return R.ok().put("data", view);
        }else {
            return R.error(511,"查不到数据");
        }

    }

    /**
    * 后端保存
    */
    @RequestMapping("/save")
    public R save(@RequestBody JiadianEntity jiadian, HttpServletRequest request){
        logger.debug("save方法:,,Controller:{},,jiadian:{}",this.getClass().getName(),jiadian.toString());

        String role = String.valueOf(request.getSession().getAttribute("role"));
        if(false)
            return R.error(511,"永远不会进入");

        Wrapper<JiadianEntity> queryWrapper = new EntityWrapper<JiadianEntity>()
            .eq("jiadian_name", jiadian.getJiadianName())
            .eq("jiadian_types", jiadian.getJiadianTypes())
            .eq("jiadian_kucun_number", jiadian.getJiadianKucunNumber())
            .eq("shangxia_types", jiadian.getShangxiaTypes())
            .eq("jiadian_delete", 1)
            ;

        logger.info("sql语句:"+queryWrapper.getSqlSegment());
        JiadianEntity jiadianEntity = jiadianService.selectOne(queryWrapper);
        if(jiadianEntity==null){
            jiadian.setJiadianClicknum(1);
            jiadian.setShangxiaTypes(1);
            jiadian.setJiadianDelete(1);
            jiadian.setInsertTime(new Date());
            jiadian.setCreateTime(new Date());
            jiadianService.insert(jiadian);
            return R.ok();
        }else {
            return R.error(511,"表中有相同数据");
        }
    }

    /**
    * 后端修改
    */
    @RequestMapping("/update")
    public R update(@RequestBody JiadianEntity jiadian, HttpServletRequest request) throws NoSuchFieldException, ClassNotFoundException, IllegalAccessException, InstantiationException {
        logger.debug("update方法:,,Controller:{},,jiadian:{}",this.getClass().getName(),jiadian.toString());
        JiadianEntity oldJiadianEntity = jiadianService.selectById(jiadian.getId());//查询原先数据

        String role = String.valueOf(request.getSession().getAttribute("role"));
//        if(false)
//            return R.error(511,"永远不会进入");
        if("".equals(jiadian.getJiadianPhoto()) || "null".equals(jiadian.getJiadianPhoto())){
                jiadian.setJiadianPhoto(null);
        }

            jiadianService.updateById(jiadian);//根据id更新
            return R.ok();
    }



    /**
    * 删除
    */
    @RequestMapping("/delete")
    public R delete(@RequestBody Integer[] ids, HttpServletRequest request){
        logger.debug("delete:,,Controller:{},,ids:{}",this.getClass().getName(),ids.toString());
        List<JiadianEntity> oldJiadianList =jiadianService.selectBatchIds(Arrays.asList(ids));//要删除的数据
        ArrayList<JiadianEntity> list = new ArrayList<>();
        for(Integer id:ids){
            JiadianEntity jiadianEntity = new JiadianEntity();
            jiadianEntity.setId(id);
            jiadianEntity.setJiadianDelete(2);
            list.add(jiadianEntity);
        }
        if(list != null && list.size() >0){
            jiadianService.updateBatchById(list);
        }

        return R.ok();
    }


    /**
     * 批量上传
     */
    @RequestMapping("/batchInsert")
    public R save( String fileName, HttpServletRequest request){
        logger.debug("batchInsert方法:,,Controller:{},,fileName:{}",this.getClass().getName(),fileName);
        Integer yonghuId = Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId")));
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            List<JiadianEntity> jiadianList = new ArrayList<>();//上传的东西
            Map<String, List<String>> seachFields= new HashMap<>();//要查询的字段
            Date date = new Date();
            int lastIndexOf = fileName.lastIndexOf(".");
            if(lastIndexOf == -1){
                return R.error(511,"该文件没有后缀");
            }else{
                String suffix = fileName.substring(lastIndexOf);
                if(!".xls".equals(suffix)){
                    return R.error(511,"只支持后缀为xls的excel文件");
                }else{
                    URL resource = this.getClass().getClassLoader().getResource("static/upload/" + fileName);//获取文件路径
                    File file = new File(resource.getFile());
                    if(!file.exists()){
                        return R.error(511,"找不到上传文件,请联系管理员");
                    }else{
                        List<List<String>> dataList = PoiUtil.poiImport(file.getPath());//读取xls文件
                        dataList.remove(0);//删除第一行,因为第一行是提示
                        for(List<String> data:dataList){
                            //循环
                            JiadianEntity jiadianEntity = new JiadianEntity();
//                            jiadianEntity.setJiadianName(data.get(0));                    //商品名称 要改的
//                            jiadianEntity.setJiadianUuidNumber(data.get(0));                    //商品编号 要改的
//                            jiadianEntity.setJiadianPhoto("");//详情和图片
//                            jiadianEntity.setJiadianTypes(Integer.valueOf(data.get(0)));   //商品类型 要改的
//                            jiadianEntity.setJiadianKucunNumber(Integer.valueOf(data.get(0)));   //商品库存 要改的
//                            jiadianEntity.setJiadianOldMoney(data.get(0));                    //商品原价 要改的
//                            jiadianEntity.setJiadianNewMoney(data.get(0));                    //现价 要改的
//                            jiadianEntity.setJiadianClicknum(Integer.valueOf(data.get(0)));   //商品热度 要改的
//                            jiadianEntity.setJiadianContent("");//详情和图片
//                            jiadianEntity.setShangxiaTypes(Integer.valueOf(data.get(0)));   //是否上架 要改的
//                            jiadianEntity.setJiadianDelete(1);//逻辑删除字段
//                            jiadianEntity.setInsertTime(date);//时间
//                            jiadianEntity.setCreateTime(date);//时间
                            jiadianList.add(jiadianEntity);


                            //把要查询是否重复的字段放入map中
                                //商品编号
                                if(seachFields.containsKey("jiadianUuidNumber")){
                                    List<String> jiadianUuidNumber = seachFields.get("jiadianUuidNumber");
                                    jiadianUuidNumber.add(data.get(0));//要改的
                                }else{
                                    List<String> jiadianUuidNumber = new ArrayList<>();
                                    jiadianUuidNumber.add(data.get(0));//要改的
                                    seachFields.put("jiadianUuidNumber",jiadianUuidNumber);
                                }
                        }

                        //查询是否重复
                         //商品编号
                        List<JiadianEntity> jiadianEntities_jiadianUuidNumber = jiadianService.selectList(new EntityWrapper<JiadianEntity>().in("jiadian_uuid_number", seachFields.get("jiadianUuidNumber")).eq("jiadian_delete", 1));
                        if(jiadianEntities_jiadianUuidNumber.size() >0 ){
                            ArrayList<String> repeatFields = new ArrayList<>();
                            for(JiadianEntity s:jiadianEntities_jiadianUuidNumber){
                                repeatFields.add(s.getJiadianUuidNumber());
                            }
                            return R.error(511,"数据库的该表中的 [商品编号] 字段已经存在 存在数据为:"+repeatFields.toString());
                        }
                        jiadianService.insertBatch(jiadianList);
                        return R.ok();
                    }
                }
            }
        }catch (Exception e){
            e.printStackTrace();
            return R.error(511,"批量插入数据异常,请联系管理员");
        }
    }



    /**
    * 个性推荐
    */
    @IgnoreAuth
    @RequestMapping("/gexingtuijian")
    public R gexingtuijian(@RequestParam Map<String, Object> params, HttpServletRequest request){
        logger.debug("gexingtuijian方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params));
        CommonUtil.checkMap(params);
        List<JiadianView> returnJiadianViewList = new ArrayList<>();

        //查询订单
        Map<String, Object> params1 = new HashMap<>(params);params1.put("sort","id");params1.put("yonghuId",request.getSession().getAttribute("userId"));
        PageUtils pageUtils = jiadianOrderService.queryPage(params1);
        List<JiadianOrderView> orderViewsList =(List<JiadianOrderView>)pageUtils.getList();
        Map<Integer,Integer> typeMap=new HashMap<>();//购买的类型list
        for(JiadianOrderView orderView:orderViewsList){
            Integer jiadianTypes = orderView.getJiadianTypes();
            if(typeMap.containsKey(jiadianTypes)){
                typeMap.put(jiadianTypes,typeMap.get(jiadianTypes)+1);
            }else{
                typeMap.put(jiadianTypes,1);
            }
        }
        List<Integer> typeList = new ArrayList<>();//排序后的有序的类型 按最多到最少
        typeMap.entrySet().stream().sorted((o1, o2) -> o2.getValue() - o1.getValue()).forEach(e -> typeList.add(e.getKey()));//排序
        Integer limit = Integer.valueOf(String.valueOf(params.get("limit")));
        for(Integer type:typeList){
            Map<String, Object> params2 = new HashMap<>(params);params2.put("jiadianTypes",type);
            PageUtils pageUtils1 = jiadianService.queryPage(params2);
            List<JiadianView> jiadianViewList =(List<JiadianView>)pageUtils1.getList();
            returnJiadianViewList.addAll(jiadianViewList);
            if(returnJiadianViewList.size()>= limit) break;//返回的推荐数量大于要的数量 跳出循环
        }
        //正常查询出来商品,用于补全推荐缺少的数据
        PageUtils page = jiadianService.queryPage(params);
        if(returnJiadianViewList.size()<limit){//返回数量还是小于要求数量
            int toAddNum = limit - returnJiadianViewList.size();//要添加的数量
            List<JiadianView> jiadianViewList =(List<JiadianView>)page.getList();
            for(JiadianView jiadianView:jiadianViewList){
                Boolean addFlag = true;
                for(JiadianView returnJiadianView:returnJiadianViewList){
                    if(returnJiadianView.getId().intValue() ==jiadianView.getId().intValue()) addFlag=false;//返回的数据中已存在此商品
                }
                if(addFlag){
                    toAddNum=toAddNum-1;
                    returnJiadianViewList.add(jiadianView);
                    if(toAddNum==0) break;//够数量了
                }
            }
        }else {
            returnJiadianViewList = returnJiadianViewList.subList(0, limit);
        }

        for(JiadianView c:returnJiadianViewList)
            dictionaryService.dictionaryConvert(c, request);
        page.setList(returnJiadianViewList);
        return R.ok().put("data", page);
    }

    /**
    * 前端列表
    */
    @IgnoreAuth
    @RequestMapping("/list")
    public R list(@RequestParam Map<String, Object> params, HttpServletRequest request){
        logger.debug("list方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params));

        CommonUtil.checkMap(params);
        PageUtils page = jiadianService.queryPage(params);

        //字典表数据转换
        List<JiadianView> list =(List<JiadianView>)page.getList();
        for(JiadianView c:list)
            dictionaryService.dictionaryConvert(c, request); //修改对应字典表字段

        return R.ok().put("data", page);
    }

    /**
    * 前端详情
    */
    @RequestMapping("/detail/{id}")
    public R detail(@PathVariable("id") Long id, HttpServletRequest request){
        logger.debug("detail方法:,,Controller:{},,id:{}",this.getClass().getName(),id);
        JiadianEntity jiadian = jiadianService.selectById(id);
            if(jiadian !=null){

                //点击数量加1
                jiadian.setJiadianClicknum(jiadian.getJiadianClicknum()+1);
                jiadianService.updateById(jiadian);

                //entity转view
                JiadianView view = new JiadianView();
                BeanUtils.copyProperties( jiadian , view );//把实体数据重构到view中

                //修改对应字典表字段
                dictionaryService.dictionaryConvert(view, request);
                return R.ok().put("data", view);
            }else {
                return R.error(511,"查不到数据");
            }
    }


    /**
    * 前端保存
    */
    @RequestMapping("/add")
    public R add(@RequestBody JiadianEntity jiadian, HttpServletRequest request){
        logger.debug("add方法:,,Controller:{},,jiadian:{}",this.getClass().getName(),jiadian.toString());
        Wrapper<JiadianEntity> queryWrapper = new EntityWrapper<JiadianEntity>()
            .eq("jiadian_name", jiadian.getJiadianName())
            .eq("jiadian_uuid_number", jiadian.getJiadianUuidNumber())
            .eq("jiadian_types", jiadian.getJiadianTypes())
            .eq("jiadian_kucun_number", jiadian.getJiadianKucunNumber())
            .eq("jiadian_clicknum", jiadian.getJiadianClicknum())
            .eq("shangxia_types", jiadian.getShangxiaTypes())
            .eq("jiadian_delete", jiadian.getJiadianDelete())
//            .notIn("jiadian_types", new Integer[]{102})
            ;
        logger.info("sql语句:"+queryWrapper.getSqlSegment());
        JiadianEntity jiadianEntity = jiadianService.selectOne(queryWrapper);
        if(jiadianEntity==null){
            jiadian.setJiadianClicknum(1);
            jiadian.setJiadianDelete(1);
            jiadian.setInsertTime(new Date());
            jiadian.setCreateTime(new Date());
        jiadianService.insert(jiadian);

            return R.ok();
        }else {
            return R.error(511,"表中有相同数据");
        }
    }

}

5.2 家电Service模块

java 复制代码
 package com.service;

import com.baomidou.mybatisplus.service.IService;
import com.utils.PageUtils;
import com.entity.JiadianEntity;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.springframework.lang.Nullable;
import java.util.List;

/**
 * 商品 服务类
 */
public interface JiadianService extends IService<JiadianEntity> {

    /**
    * @param params 查询参数
    * @return 带分页的查询出来的数据
    */
     PageUtils queryPage(Map<String, Object> params);

}

5.3 家电ServiceImpl模块

java 复制代码
package com.service.impl;

import com.utils.StringUtil;
import com.service.DictionaryService;
import com.utils.ClazzDiff;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.lang.reflect.Field;
import java.util.*;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.transaction.annotation.Transactional;
import com.utils.PageUtils;
import com.utils.Query;
import org.springframework.web.context.ContextLoader;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import com.dao.JiadianDao;
import com.entity.JiadianEntity;
import com.service.JiadianService;
import com.entity.view.JiadianView;

/**
 * 商品 服务实现类
 */
@Service("jiadianService")
@Transactional
public class JiadianServiceImpl extends ServiceImpl<JiadianDao, JiadianEntity> implements JiadianService {

    @Override
    public PageUtils queryPage(Map<String,Object> params) {
        Page<JiadianView> page =new Query<JiadianView>(params).getPage();
        page.setRecords(baseMapper.selectListView(page,params));
        return new PageUtils(page);
    }


}

5.4 家电Dao模块

java 复制代码
package com.dao;

import com.entity.JiadianEntity;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import java.util.List;
import java.util.Map;
import com.baomidou.mybatisplus.plugins.pagination.Pagination;

import org.apache.ibatis.annotations.Param;
import com.entity.view.JiadianView;

/**
 * 商品 Dao 接口
 *
 * @author 
 */
public interface JiadianDao extends BaseMapper<JiadianEntity> {

   List<JiadianView> selectListView(Pagination page,@Param("params")Map<String,Object> params);

}

6、论文目录结构

摘要... I

Abstract... II

1 绪论... 1

1.1 项目简介... 1

1.2 调查研究... 1

1.2.1 研究背景及意义... 1

1.2.2 国内外研究现状... 2

1.2.3 研究主要内容... 2

1.3 论文的章节安排... 3

2 系统相关技术介绍... 4

2.1 Java语言... 4

2.2 SpringBoot框架... 4

2.3 Vue框架... 4

2.4 MySQL数据库... 4

3 系统需求分析... 6

3.1 可行性分析... 6

3.1.1 技术可行性... 6

3.1.2 经济可行性... 6

3.1.3 操作可行性... 6

3.2 系统功能需求... 6

3.2.1 用户端功能需求... 6

3.2.2 XX端功能需求... 6

3.2.3 管理员端功能需求... 6

3.3 系统性能需求... 6

4 系统总体设计... 7

4.1 系统总体架构设计... 7

4.2 系统的功能设计... 7

4.3 数据库设计... 7

4.3.1 概念设计E-R图... 7

4.3.2 逻辑设计关系模式... 7

4.3.3 数据库物理设计... 7

5 系统详细实现... 14

5.1 系统实现环境... 14

5.2 用户端... 14

5.2.1 登录页面... 14

5.2.2 注册页面... 14

5.2.3 XXXX页面... 14

5.2.4 XXXX页面... 14

5.2.5 XXXX页面... 14

5.3 XXXX端... 15

5.3.1 XXXX页面... 15

5.3.2 XXXX页面... 15

5.3.3 XXXX页面... 15

5.3.4 XXXX页面... 15

5.4 管理端... 15

5.4.1 用户管理页面... 15

5.4.2 XXXX页面... 15

5.4.3 XXXX页面... 16

5.4.4 XXXX页面... 16

6 系统测试... 16

6.1 测试目的... 16

6.2 测试方法... 16

6.3 测试用例... 16

6.3.1 XXXX测试... 16

6.3.2 XXXX测试... 16

6.4 测试结果... 16

结论... 17

参考文献... 18

致谢... 19

更多源码:

计算机毕业设计选题1000套等你来!!!

7、源码获取

感谢大家的阅读,如有不懂的问题可以评论区交流或私聊!

喜欢文章可以点赞、收藏、关注、评论

下方联系方式获取源码

相关推荐
yuanbenshidiaos1 小时前
c++---------数据类型
java·jvm·c++
向宇it1 小时前
【从零开始入门unity游戏开发之——C#篇25】C#面向对象动态多态——virtual、override 和 base 关键字、抽象类和抽象方法
java·开发语言·unity·c#·游戏引擎
Lojarro1 小时前
【Spring】Spring框架之-AOP
java·mysql·spring
莫名其妙小饼干1 小时前
网上球鞋竞拍系统|Java|SSM|VUE| 前后端分离
java·开发语言·maven·mssql
isolusion2 小时前
Springboot的创建方式
java·spring boot·后端
Yvemil72 小时前
《开启微服务之旅:Spring Boot Web开发举例》(一)
前端·spring boot·微服务
zjw_rp2 小时前
Spring-AOP
java·后端·spring·spring-aop
Oneforlove_twoforjob2 小时前
【Java基础面试题033】Java泛型的作用是什么?
java·开发语言
TodoCoder2 小时前
【编程思想】CopyOnWrite是如何解决高并发场景中的读写瓶颈?
java·后端·面试
向宇it2 小时前
【从零开始入门unity游戏开发之——C#篇24】C#面向对象继承——万物之父(object)、装箱和拆箱、sealed 密封类
java·开发语言·unity·c#·游戏引擎