ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

SSM潮玩盲盒商城25949-计算机毕业设计、课程设计

SSM潮玩盲盒商城25949-计算机毕业设计、课程设计

前言

✨博主介绍:一线全栈工程师,毕设实战引路人。技术栈覆盖Java、Python、C#、PHP、Node.js及UniApp跨端开发,擅长多语言项目落地与架构设计。持续分享毕设源码、开题报告、技术选型心得与职场踩坑经验。用工程化思维写代码,帮你把毕设做成作品集。👍👍

👇精彩专栏 推荐订阅👇

海量实战库,源码任你选! 坐拥Java项目2000+套

海量实战库,源码任你选! 坐拥Python项目1000+套

海量实战库,源码任你选! 坐拥小程序/app项目500+套

✅获取源码请私信✅

感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以找我咨询,希望帮助更多的人❤️

系统实现

普通用户功能实现

用户注册模块

普通用户在访问系统首页后,可选择点击“注册”按钮,进入相应的注册页面。在该页面中,用户需完成所有注册信息必填项,点击页面下方的“注册”按钮。系统在接收到表单数据并完成验证后,若信息无误,将提示注册成功,以便用户立即进行登录操作。注册界面如下图所示。

注册界面

用户登录模块

用户在登录界面点击“登录”按钮后,需输入用户名、密码以及验证码以完成身份验证操作。系统在前端会自动对所输入信息进行有效性校验,同时检查该用户是否已通过后台审核流程。若审核通过且信息无误,则系统将允许用户成功登录并跳转至相应的功能界面;反之页面会弹出相应的提示信息,提醒用户重新输入或检查相关信息的正确性。登录界面如下图所示。

登录界面

前台首页模块

首页作为用户进入平台的主入口,集成导航栏、全局搜索框、轮播广告图及盲盒商品推荐区域,布局清晰直观。用户可通过导航快速跳转至资讯、公告或商城等板块,搜索功能支持按关键词检索商品与资讯吗,通知中心实时推送系统消息,在线沟通模块提供即时客服入口,便于用户咨询问题或反馈需求。界面如下图所示。

首页界面

盲盒商品模块

盲盒商品模块展示所有在售盲盒产品,支持分类浏览与关键词搜索。每个商品详情页包含图片、价格、描述及操作按钮,用户可执行立即购买、加入购物车、分享链接或收藏商品。已购买用户可在订单完成后对商品进行评论,评论内容将同步至商品页面,为其他用户提供参考,形成闭环反馈机制。界面如下图所示。

盲盒商品详情界面

盲盒商品界面

商城管理模块

商城管理整合用户交易相关功能,包括“我的地址”用于维护收货信息,“我的订单”展示历史购买记录及当前状态,“我的购物车”支持商品增删、数量调整及批量结算。三者协同支撑用户完成从选品到履约的全流程操作,界面简洁,操作路径明确。界面如下图所示。

我的地址界面

我的购物车界面

我的订单界面

留言反馈模块

留言反馈模块允许普通用户向平台提交意见、建议或问题描述。用户填写反馈标题与内容后提交,系统自动生成工单并关联用户账户。提交后可在个人中心查看反馈记录及管理员回复状态。该通道为平台优化服务提供直接依据,同时增强用户参与感与信任度。界面如下图所示。

留言反馈界面

个人中心模块

个人中心作为用户操作聚合页,包含个人首页概览、留言反馈记录、配送列表、收藏记录(含商品与资讯)、点赞记录及评论管理(可编辑或删除已发布评论)。各子功能以卡片式布局呈现,数据实时同步,便于用户一站式管理其在平台上的全部互动与交易行为。界面如下图所示。

个人中心界面

管理员功能实现

后台首页模块

后台首页为管理员提供全局概览,顶部设功能导航栏快速切换模块,中部嵌入核心统计图表,商品销售金额、销售数量,数据按日/周/月动态更新。右侧集成个人信息修改、密码重置及通知中心,便于管理员及时掌握运营状况并处理系统消息,提升管理效率。界面如下图所示。

后台首页界面

公共管理模块

公共管理负责维护平台前端展示的基础内容,包括轮播图与公告信息。管理员可上传、编辑、排序轮播图素材,对公告进行新增、修改、删除及详情查看。所有内容变更即时生效于用户端首页。界面如下图所示。

轮播图管理界面

商城管理模块

商城管理聚焦盲盒商品与订单全流程管控。管理员可维护商品信息及分类列表;在订单列表中查看所有用户订单,执行“配送”操作标记发货,并在用户确认收货后更新为“送达”,针对售后申请(如退换货),可进行审核处理,确保交易环节规范、透明、可追踪。界面如下图所示。

盲盒商品管理界面

留言管理模块

留言管理模块集中处理用户提交的反馈内容。管理员可查询所有留言记录,查看详情(含用户信息与反馈内容),对有效建议进行审核回复,或删除无效/不当留言。回复内容将同步至用户个人中心,形成双向沟通闭环,提升用户满意度与平台服务质量。界面如下图所示。

留言反馈审核界面

用户管理模块

用户管理模块支持对平台所有账户(含管理员与普通用户)进行全生命周期管控。管理员可查询用户列表、查看详情,执行添加新管理员、删除违规账户或封禁用户等操作,所有变更均需二次确认,确保用户数据管理的规范性与安全性。界面如下图所示。

用户管理界面

资讯管理模块

资讯管理涵盖资讯内容及其分类的维护,管理员可创建、编辑或删除资讯文章与分类标签。每篇资讯支持富文本编辑、封面上传及状态设置(如是否置顶)。系统提供评论查看功能,便于管理员审核用户留言并决定是否公开,实现内容生产与互动监管的一体化管理。界面如下图所示。

资讯信息管理界面

数据库参考

CREATE TABLE `logistics_delivery` ( `logistics_delivery_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '物流配送ID', `order_number` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '订单号', `product_name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '商品名称', `purchase_quantity` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '购买数量', `total_transaction_amount` double(10,2) DEFAULT '0.00' COMMENT '交易总额', `the_date_of_issuance` date DEFAULT NULL COMMENT '发货日期', `delivery_number` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '配送订单', `ordinary_users` int(11) DEFAULT '0' COMMENT '普通用户', `shipping_address` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '收货地址', `delivery_status` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '配送状态', `signing_status` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '签收状态', `recommend` int(11) NOT NULL DEFAULT '0' COMMENT '智能推荐', `contact_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '联系人名字', `merchant_id` int(11) DEFAULT NULL COMMENT '商家id', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `courier_type` int(11) NOT NULL DEFAULT '1' COMMENT '配送方式(1:商家配送,2:其他配送)', `courier_id` int(11) DEFAULT NULL COMMENT '配送员ID', `courier_name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '配送员名字', `courier_detail` longtext COLLATE utf8mb4_general_ci COMMENT '配送详情', PRIMARY KEY (`logistics_delivery_id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='物流配送'; DROP TABLE IF EXISTS `goods`; CREATE TABLE `goods` ( `goods_id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT COMMENT '产品ID', `title` varchar(125) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '标题', `img` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '封面图:用于显示于产品列表页', `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '描述', `price_ago` double(8,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '原价', `price` double(8,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '卖价', `sales` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '销量', `inventory` int(11) NOT NULL DEFAULT '0' COMMENT '商品库存', `type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '商品分类', `hits` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '点击量', `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '正文', `img_1` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '主图1', `img_2` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '主图2', `img_3` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '主图3', `img_4` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '主图4', `img_5` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '主图5', `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `customize_field` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '自定义字段', `source_table` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '来源表', `source_field` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '来源字段', `source_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '来源ID', `user_id` int(11) unsigned DEFAULT '0' COMMENT '添加人', `integral` int(11) DEFAULT '0' COMMENT '积分', `list_status` smallint(1) DEFAULT '1' COMMENT '上架状态(0:下架;1上架)', PRIMARY KEY (`goods_id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='商品信息';

代码参考

package com.project.demo.controller; import com.project.demo.entity.BlindBoxMerchandise; import com.project.demo.service.BlindBoxMerchandiseService; import com.alibaba.fastjson.JSON; import com.project.demo.controller.base.BaseController; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import org.springframework.util.StringUtils; import com.project.demo.constant.FindConfig; import com.project.demo.entity.Goods; import com.project.demo.service.GoodsService; import java.util.stream.Collectors; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import javax.servlet.http.HttpServletRequest; import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.*; /** * 盲盒商品:(BlindBoxMerchandise)表控制层 * */ @RestController @RequestMapping("/blind_box_merchandise") public class BlindBoxMerchandiseController extends BaseController<BlindBoxMerchandise, BlindBoxMerchandiseService> { /** * 盲盒商品对象 */ @Autowired public BlindBoxMerchandiseController(BlindBoxMerchandiseService service) { setService(service); } @Autowired private GoodsService goodsService; @PostMapping("/add") @Transactional public Map<String, Object> add(HttpServletRequest request) throws IOException { Map<String,Object> paramMap = service.readBody(request.getReader()); paramMap.entrySet().removeIf(entry -> { Object value = entry.getValue(); return value instanceof String && ((String) value).isEmpty(); }); BlindBoxMerchandise blind_box_merchandise = new BlindBoxMerchandise(); blind_box_merchandise.setCommodity_source(paramMap.get("commodity_source")==null?null:String.valueOf(paramMap.get("commodity_source"))); blind_box_merchandise.setHits(paramMap.get("hits")==null?null:Integer.valueOf(String.valueOf(paramMap.get("hits")))); blind_box_merchandise.setComment_len(paramMap.get("comment_len")==null?null:Integer.valueOf(String.valueOf(paramMap.get("comment_len")))); blind_box_merchandise.setCart_title(paramMap.get("cart_title")==null?null:String.valueOf(paramMap.get("cart_title"))); blind_box_merchandise.setCart_img(paramMap.get("cart_img")==null?null:String.valueOf(paramMap.get("cart_img"))); blind_box_merchandise.setCart_description(paramMap.get("cart_description")==null?null:String.valueOf(paramMap.get("cart_description"))); blind_box_merchandise.setCart_price_ago(paramMap.get("cart_price_ago")==null?null:Double.valueOf(String.valueOf(paramMap.get("cart_price_ago")))); blind_box_merchandise.setCart_price(paramMap.get("cart_price")==null?null:Double.valueOf(String.valueOf(paramMap.get("cart_price")))); blind_box_merchandise.setCart_inventory(paramMap.get("cart_inventory")==null?null:Double.valueOf(String.valueOf(paramMap.get("cart_inventory")))); blind_box_merchandise.setCart_type(paramMap.get("cart_type")==null?null:String.valueOf(paramMap.get("cart_type"))); blind_box_merchandise.setCart_content(paramMap.get("cart_content")==null?null:String.valueOf(paramMap.get("cart_content"))); blind_box_merchandise.setCart_img_1(paramMap.get("cart_img_1")==null?null:String.valueOf(paramMap.get("cart_img_1"))); blind_box_merchandise.setCart_img_2(paramMap.get("cart_img_2")==null?null:String.valueOf(paramMap.get("cart_img_2"))); blind_box_merchandise.setCart_img_3(paramMap.get("cart_img_3")==null?null:String.valueOf(paramMap.get("cart_img_3"))); blind_box_merchandise.setCart_img_4(paramMap.get("cart_img_4")==null?null:String.valueOf(paramMap.get("cart_img_4"))); blind_box_merchandise.setCart_img_5(paramMap.get("cart_img_5")==null?null:String.valueOf(paramMap.get("cart_img_5"))); blind_box_merchandise.setListStatus(paramMap.get("list_status")==null?null:Integer.valueOf(String.valueOf(paramMap.get("list_status")))); blind_box_merchandise.setCreate_by(paramMap.get("create_by")==null?null:Integer.valueOf(String.valueOf(paramMap.get("create_by")))); this.addEntity(blind_box_merchandise); System.out.println("盲盒商品新增成功"); return success(1); } @PostMapping("/set") @Transactional public Map<String, Object> set(HttpServletRequest request) throws IOException { Map<String,String> queryMap = service.readQuery(request); Map<String,String> configMap = service.readConfig(request); Map<String,Object> paramMap = service.readBody(request.getReader()); paramMap.entrySet().removeIf(entry -> { Object value = entry.getValue(); return value instanceof String && ((String) value).isEmpty(); }); BlindBoxMerchandise blind_box_merchandise = new BlindBoxMerchandise(); blind_box_merchandise.setCommodity_source(paramMap.get("commodity_source")==null?null:String.valueOf(paramMap.get("commodity_source"))); blind_box_merchandise.setHits(paramMap.get("hits")==null?null:Integer.valueOf(String.valueOf(paramMap.get("hits")))); blind_box_merchandise.setComment_len(paramMap.get("comment_len")==null?null:Integer.valueOf(String.valueOf(paramMap.get("comment_len")))); blind_box_merchandise.setCart_title(paramMap.get("cart_title")==null?null:String.valueOf(paramMap.get("cart_title"))); blind_box_merchandise.setCart_img(paramMap.get("cart_img")==null?null:String.valueOf(paramMap.get("cart_img"))); blind_box_merchandise.setCart_description(paramMap.get("cart_description")==null?null:String.valueOf(paramMap.get("cart_description"))); blind_box_merchandise.setCart_price_ago(paramMap.get("cart_price_ago")==null?null:Double.valueOf(String.valueOf(paramMap.get("cart_price_ago")))); blind_box_merchandise.setCart_price(paramMap.get("cart_price")==null?null:Double.valueOf(String.valueOf(paramMap.get("cart_price")))); blind_box_merchandise.setCart_inventory(paramMap.get("cart_inventory")==null?null:Double.valueOf(String.valueOf(paramMap.get("cart_inventory")))); blind_box_merchandise.setCart_type(paramMap.get("cart_type")==null?null:String.valueOf(paramMap.get("cart_type"))); blind_box_merchandise.setCart_content(paramMap.get("cart_content")==null?null:String.valueOf(paramMap.get("cart_content"))); blind_box_merchandise.setCart_img_1(paramMap.get("cart_img_1")==null?null:String.valueOf(paramMap.get("cart_img_1"))); blind_box_merchandise.setCart_img_2(paramMap.get("cart_img_2")==null?null:String.valueOf(paramMap.get("cart_img_2"))); blind_box_merchandise.setCart_img_3(paramMap.get("cart_img_3")==null?null:String.valueOf(paramMap.get("cart_img_3"))); blind_box_merchandise.setCart_img_4(paramMap.get("cart_img_4")==null?null:String.valueOf(paramMap.get("cart_img_4"))); blind_box_merchandise.setCart_img_5(paramMap.get("cart_img_5")==null?null:String.valueOf(paramMap.get("cart_img_5"))); blind_box_merchandise.setListStatus(paramMap.get("list_status")==null?null:Integer.valueOf(String.valueOf(paramMap.get("list_status")))); this.setEntity(queryMap,configMap,blind_box_merchandise); System.out.println("盲盒商品修改成功"); return success(1); } private static final double PURCHASE_WEIGHT = 5.0; // 购买权重 private static final double COLLECT_WEIGHT = 3.0; // 收藏权重 private static final double CLICK_WEIGHT = 1.0; // 点击权重 private static final double COMMENT_WEIGHT = 2.0; // 评论权重 /** * 协同过滤算法 */ @RequestMapping("/get_hits_list") public Map<String, Object> getHits(HttpServletRequest request) { Map<String,String> paramMap = service.readQuery(request); if (paramMap.get("user_id")==null||paramMap.get("user_id").equals("")){ Map<String,String> configMap = service.readConfig(request); configMap.computeIfAbsent(FindConfig.PAGE, k -> String.valueOf(1)); configMap.computeIfAbsent(FindConfig.SIZE, k -> String.valueOf(1)); configMap.put(FindConfig.ORDER_BY, "goods_id asc"); List goodsList = goodsService.selectBaseList(goodsService.select(paramMap, configMap)); Map<String, Object> map = new HashMap<>(); map.put("list", goodsList); map.put("count", goodsList.size()); return success(map); }else{ try { if (paramMap.get("examine_state")!=null && !paramMap.get("examine_state").equals("")){ paramMap.put("examine_state", URLDecoder.decode(paramMap.get("examine_state"), "UTF-8")); } } catch (UnsupportedEncodingException e) { e.printStackTrace(); } //加权查询 String hitsSource = buildCartWeightedSql(paramMap.get("user_id")); List<Map<String,Object>> hitsSourceList = goodsService.selectMapBaseList(hitsSource); if (hitsSourceList != null && hitsSourceList.size() > 0) { System.out.println("前5条行为数据: "); for (int i = 0; i < Math.min(5, hitsSourceList.size()); i++) { Map<String, Object> item = hitsSourceList.get(i); System.out.println(" 商品ID: " + item.get("goods_id") + ", 加权分数: " + item.get("hits_count")); } } //判断是否为空,代表当前用户暂无点击数据,那么取其他用户的最常点击 if (hitsSourceList==null || hitsSourceList.size()<=0){ hitsSource = buildCartWeightedSql(null); hitsSourceList = goodsService.selectMapBaseList(hitsSource); } String table_name = "goods"; String table_id = "goods_id"; String type_name = "type"; //二次处理-如果依旧为空则取添加时间前12条数据 if (hitsSourceList==null || hitsSourceList.size()<=0){ String sql = "SELECT * FROM " + table_name; if (paramMap.get("examine_state")!=null && !paramMap.get("examine_state").equals("")){ sql = sql + " where examine_state = '"+paramMap.get("examine_state")+"'"; } sql = sql + " ORDER BY create_time DESC LIMIT 0,12"; List list = goodsService.selectBaseList(sql); Map<String, Object> map=new HashMap<>(); map.put("list",list); map.put("count",list.size()); return success(map); }else { //对用户点击量进行排序取得最大值 double max = 0; int maxSourceId = 0; for (Map<String,Object> map:hitsSourceList) { double hitsCount = Double.parseDouble(String.valueOf(map.get("hits_count"))); if (hitsCount > max){ max = hitsCount; maxSourceId = Integer.parseInt(String.valueOf(map.get("goods_id"))); } } //查询该用户点击最大值的种类 String typeSql = "SELECT " + type_name + " FROM " + table_name + " WHERE " + table_id + " = " + maxSourceId; List<Map<String,Object>> typeList = goodsService.selectMapBaseList(typeSql); //如果为空则取添加时间前12条数据 if (typeList==null || typeList.size()<=0){ String sql = "SELECT * FROM " + table_name; if (paramMap.get("examine_state")!=null && !paramMap.get("examine_state").equals("")){ sql = sql + " where examine_state = '"+paramMap.get("examine_state")+"'"; } sql = sql + " ORDER BY create_time DESC LIMIT 0,12"; List list = goodsService.selectBaseList(sql); Map<String, Object> map=new HashMap<>(); map.put("list",list); map.put("count",list.size()); return success(map); }else { String typeName = String.valueOf(typeList.get(0).get(type_name)); //查询该种类的数据 String sql = "SELECT * FROM " + table_name + " WHERE " + type_name + " = '"+typeName+"'" ; if (paramMap.get("examine_state")!=null && !paramMap.get("examine_state").equals("")){ sql = sql + " and examine_state = '"+paramMap.get("examine_state")+"' ORDER BY create_time DESC limit 0,12"; }else { sql = sql + " ORDER BY create_time DESC limit 0,12"; } List resultList = goodsService.selectBaseList(sql); //如果为空则取添加时间前12条数据 if (resultList==null || resultList.size()<=0){ sql = "SELECT * FROM " + table_name; if (paramMap.get("examine_state")!=null && !paramMap.get("examine_state").equals("")){ sql = sql + " where examine_state = '"+paramMap.get("examine_state")+"'"; } sql = sql + " ORDER BY create_time DESC LIMIT 0,12"; List list = goodsService.selectBaseList(sql); Map<String, Object> map=new HashMap<>(); map.put("list",list); map.put("count",list.size()); return success(map); }else { //对结果排序-冒泡排序 for (int i = resultList.size() - 1; i > 0; i--) { // 是否发生交换 boolean swapped = false; for (int j = 0; j < i; j++) { Goods leftMap = (Goods) resultList.get(j); Goods rightMap = (Goods) resultList.get(j + 1); if (leftMap.getHits()<rightMap.getHits()){ Goods temp = rightMap; rightMap = leftMap; leftMap = temp; swapped = true; } } if (!swapped) { // 没有发生交换,则说明数组已有序,停止冒泡 break; } } //判断是否有12条-如果不足则计算其他类型和用户当前点击最多的余弦相似度,依次往下取得数据 if (resultList.size()<12) { String typeCosSql = "SELECT " + type_name + " FROM " + table_name + " WHERE " + type_name + " <> '" + typeName + "' GROUP BY " + type_name; List<Map<String, Object>> typeCosList = goodsService.selectMapBaseList(typeCosSql); if (typeCosList != null && typeCosList.size() > 0) { for (Map<String, Object> typeCos : typeCosList) { typeCos.put("cosSim", calculateCosineSimilarity(typeName, String.valueOf(typeCos.get(type_name)))); } //冒泡根据相似度排序 for (int i = typeCosList.size() - 1; i > 0; i--) { // 是否发生交换 boolean swapped = false; for (int j = 0; j < i; j++) { Map<String, Object> leftMap = typeCosList.get(j); Map<String, Object> rightMap = typeCosList.get(j + 1); if (Double.parseDouble(String.valueOf(leftMap.get("cosSim" ))) < Double.parseDouble(String.valueOf(rightMap.get("cosSim" )))) { Map<String, Object> temp = rightMap; rightMap = leftMap; leftMap = temp; swapped = true; } } if (!swapped) { // 没有发生交换,则说明数组已有序,停止冒泡 break; } } //逐条加入数据 for (Map<String, Object> typeCos : typeCosList) { sql = "SELECT * FROM " + table_name + " WHERE " + type_name + " = '" + String.valueOf(typeCos.get(type_name)) + "'"; if (paramMap.get("examine_state")!=null && !paramMap.get("examine_state").equals("")){ sql = sql + " and examine_state = '"+paramMap.get("examine_state")+"'"; } sql = sql + " ORDER BY create_time DESC LIMIT 0," + (12 - resultList.size()); List list = goodsService.selectBaseList(sql); if (list != null && list.size() > 0) { resultList.addAll(list); } if (resultList.size() >= 12) { break; } } } } Map<String, Object> map=new HashMap<>(); map.put("list",resultList); map.put("count",resultList.size()); return success(map); } } } } } /** * 计算余弦相似度 */ private double calculateCosineSimilarity(String text1, String text2) { // 将文本分词并转换为向量表示 Map<Character, Integer> wordCount1 = getWordCount(text1); Map<Character, Integer> wordCount2 = getWordCount(text2); double dotProduct = 0.0; double magnitude1 = 0.0; double magnitude2 = 0.0; for (Character word : wordCount1.keySet()) { int count1 = wordCount1.get(word); int count2 = wordCount2.getOrDefault(word, 0); dotProduct += count1 * count2; magnitude1 += Math.pow(count1, 2); } for (Integer count : wordCount2.values()) { magnitude2 += Math.pow(count, 2); } magnitude1 = Math.sqrt(magnitude1); magnitude2 = Math.sqrt(magnitude2); if (magnitude1 == 0.0 || magnitude2 == 0.0) { return 0.0; } return dotProduct / (magnitude1 * magnitude2); } private static Map<Character, Integer> getWordCount(String text) { Map<Character, Integer> wordCount = new HashMap<>(); for (char c : text.toCharArray()) { wordCount.put(c, wordCount.getOrDefault(c, 0) + 1); } return wordCount; } /** * 构建加权行为SQL * @param userId 用户ID(null表示全局) * @return 加权SQL */ private String buildCartWeightedSql(String userId) { // 用户条件 String userCondition = (userId != null && !userId.isEmpty()) ? " AND user_id = " + userId : ""; return "SELECT goods_id, " + "(COUNT(CASE WHEN source_type = 'order' THEN 1 END) * " + PURCHASE_WEIGHT + " + " + "COUNT(CASE WHEN source_type = 'collect' THEN 1 END) * " + COLLECT_WEIGHT + " + " + "COUNT(CASE WHEN source_type = 'hits' THEN 1 END) * " + CLICK_WEIGHT + " + " + "COUNT(CASE WHEN source_type = 'comment' THEN 1 END) * " + COMMENT_WEIGHT + ") as hits_count " + "FROM (" + // 购买行为 "SELECT goods_id, 'order' as source_type FROM `order` WHERE 1=1" + userCondition + " " + "UNION ALL " + // 收藏行为 "SELECT source_id as goods_id, 'collect' as source_type FROM collect " + "WHERE source_table = 'goods'" + userCondition + " " + "UNION ALL " + // 点击行为 "SELECT source_id as goods_id, 'hits' as source_type FROM hits " + "WHERE source_table = 'goods'" + userCondition + " " + "UNION ALL " + // 评论行为 "SELECT source_id as goods_id, 'comment' as source_type FROM comment " + "WHERE source_table = 'goods'" + userCondition + " " + ") t " + "GROUP BY goods_id " + "ORDER BY hits_count DESC"; package com.project.demo.controller; import com.project.demo.entity.ReleasingNotices; import com.project.demo.service.ReleasingNoticesService; import com.project.demo.controller.base.BaseController; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import javax.servlet.http.HttpServletRequest; import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.*; /** * 通知发布:(ReleasingNotices)表控制层 * */ @RestController @RequestMapping("/releasing_notices") public class ReleasingNoticesController extends BaseController<ReleasingNotices, ReleasingNoticesService> { /** * 通知发布对象 */ @Autowired public ReleasingNoticesController(ReleasingNoticesService service) { setService(service); } @PostMapping("/add") @Transactional public Map<String, Object> add(HttpServletRequest request) throws IOException { Map<String,Object> paramMap = service.readBody(request.getReader()); this.addMap(paramMap); return success(1);

前端:基于Vue.js框架构建用户界面,使用HTML5、CSS3和JavaScript实现页面结构与交互逻辑,通过Vue Router管理路由,Vuex或Pinia维护全局状态。采用Element UI或Vant组件库快速搭建界面,Axios封装HTTP请求实现与后端的数据通信。

后端:基于ssm框架搭建,遵循Controller-Service-Mapper三层架构。Controller层接收前端请求并校验参数,Service层处理核心业务逻辑,Mapper层通过MyBatis或MyBatis-Plus完成数据库操作。使用Spring Security或Shiro结合JWT实现用户认证与权限控制。

数据库:采用MySQL存储持久化数据,Redis缓存热点信息以提升系统性能。

开发工具:使用IDEA开发后端,VSCode或HBuilderX开发前端,Git进行版本管理,Maven和npm分别管理前后端依赖。

源码获取

私信联系我即可~

大家点赞、收藏、关注、评论啦

👇精彩专栏 推荐订阅👇

海量实战库,源码任你选! 坐拥Java项目2000+套

海量实战库,源码任你选! 坐拥Python项目1000+套

海量实战库,源码任你选! 坐拥小程序/app项目500+套

✅获取源码请私信✅

感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以找我咨询,希望帮助更多的人❤️

返回列表