
前言✨博主介绍一线全栈工程师毕设实战引路人。技术栈覆盖Java、Python、C#、PHP、Node.js及UniApp跨端开发擅长多语言项目落地与架构设计。持续分享毕设源码、开题报告、技术选型心得与职场踩坑经验。用工程化思维写代码帮你把毕设做成作品集。精彩专栏 推荐订阅海量实战库源码任你选 坐拥Java项目2000套海量实战库源码任你选 坐拥Python项目1000套海量实战库源码任你选 坐拥小程序/app项目500套✅获取源码请私信✅感兴趣的可以先收藏起来还有大家在毕设选题项目以及论文编写等相关问题都可以找我咨询希望帮助更多的人❤️系统实现普通用户功能实现装修案例功能实现用户进入小程序首页后系统默认展示按发布时间倒序排列的装修案例列表。列表项包含案例封面图、案例名称与设计师姓名。用户点击任意案例可跳转至详情页面详情页完整呈现案例的效果图集、实际照片、设计理念、装修风格、使用户型及预算清单等详细信息。用户在浏览过程中可以通过点击收藏按钮将心仪案例保存至个人收藏夹方便日后查阅。装修案例界面发表评论功能实现用户在查看案例详情或征集活动详情时页面底部设有评论输入区域。用户点击输入框唤起键盘编辑评论内容后点击发送按钮。系统前端将评论内容与当前页面的来源标识一同封装通过接口提交至后端服务器。后端对评论内容进行存储后该评论实时显示在页面的评论区列表中。其他用户浏览该页面时可以查看已发表的所有评论。发表评论界面官方征集功能实现系统在底部导航栏设置征集入口点击后进入官方征集列表页面。列表以卡片形式展示进行中与已结束的各类征集活动卡片上显示活动名称、征集主题、活动海报与截止时间。用户点击卡片可查看活动详情详情页完整呈现活动规则、活动奖品、参与要求等具体信息。用户通过详情页可快速了解活动背景并决定是否参与。官方征集界面活动报名功能实现用户在征集活动详情页浏览活动规则后点击页面底部的报名按钮进入报名流程。系统检测到用户已登录则直接展示报名表单表单包含用户姓名、手机号码等预设字段。用户确认信息无误后点击提交前端将表单数据发送至服务器。服务器生成唯一报名编号并返回成功提示。报名成功后用户在个人中心可查看自己的报名记录。活动报名界面获奖记录功能实现用户点击个人中心的获奖记录入口系统跳转至获奖列表页面。列表按时间倒序展示用户参与征集活动所获得的奖项每条记录包含活动名称、获得奖项、获奖说明等关键信息。用户点击任意记录可进入详情页详情页完整呈现该次获奖的具体内容与颁奖机构说明。用户可以通过此模块随时回顾自己在平台上的荣誉积累。获奖记录界面认证缴费功能实现用户在个人中心选择成为设计师选项系统引导进入认证缴费页面。页面展示认证费用金额、缴费说明与设计师权益介绍。用户阅读并同意相关条款后选择微信支付或支付宝支付方式。点击确认支付按钮唤起支付界面用户完成支付操作。系统接收到支付成功回调后自动更新用户角色状态用户即获得设计师身份及相关权限。认证缴费界面设计师功能实现认证缴费功能实现设计师首次进入小程序时若未完成认证系统在个人中心提示进行认证缴费。设计师点击认证缴费入口页面展示详细的认证费用说明与所需提交的设计师资质材料。设计师填写姓名、手机号码并上传设计师证件照片确认信息后选择支付方式完成缴费。系统审核通过后设计师账号正式激活可开始发布装修案例。认证缴费界面装修案例功能实现设计师登录后点击底部发布按钮进入案例编辑页面。页面提供案例名称、装修风格、使用户型、设计理念等输入项。设计师从本地相册选择效果图集与实际照片进行上传填写预算清单与完成装修时间。所有信息填写完毕点击发布案例进入待审核状态。审核通过后案例在首页列表中对所有用户可见。装修案例界面回复评论功能实现设计师进入个人中心的评论管理模块系统展示用户对自己发布案例的所有评论列表。每条评论右侧设有回复按钮。设计师点击回复按钮弹出输入框输入回复内容后点击发送。回复内容即时显示在原评论下方评论用户可在自己的消息中心查看回复。通过此功能设计师可以与用户进行有效互动。回复评论界面评论管理功能实现设计师在评论管理列表页可以浏览所有用户评论。对于包含不当言论或广告信息的评论设计师点击评论条目右侧的更多按钮选择删除。系统弹出二次确认提示设计师确认删除后该评论从页面消失且对其他用户不可见。此功能帮助设计师维护自己案例页面的讨论环境。评论管理界面管理员功能实现认证缴费管理功能实现管理员登录后台管理系统进入认证缴费管理模块。页面以表格形式展示所有用户提交的认证申请记录每条记录包含申请人姓名、手机号码、申请时间与支付状态。管理员点击待审核记录可查看用户上传的设计师证件。审核通过后系统自动更新对应用户的角色状态为设计师。管理员也可驳回不符合要求的申请并填写驳回原因。认证缴费管理界面装修案例管理功能实现管理员进入装修案例管理页面查看所有设计师发布的案例。列表展示案例名称、发布人、发布时间、审核状态等字段。管理员点击案例条目可预览案例完整内容。对于内容规范、图片清晰的案例管理员点击审核通过按钮使其在前端上线。对于存在问题的案例管理员可选择驳回并填写审核回复设计师收到通知后可修改后再次提交。装修案例管理界面官方征集管理功能实现管理员在官方征集管理模块可以创建新的征集活动。创建页面包含活动名称、活动编号、征集主题、活动规则、活动奖品、截止时间等输入项。管理员上传活动海报并设置活动规则后点击发布。已发布的活动在用户端征集列表页显示。管理员还可以对进行中的活动进行编辑或提前结束。官方征集管理界面报名记录管理功能实现管理员进入报名记录管理页面查看所有用户提交的报名信息。列表按报名时间倒序排列展示报名编号、活动名称、用户姓名、手机号码、报名状态等核心字段。管理员点击单条记录可查看报名详情包括用户上传的案例材料与信息备注。对于需要核实的报名信息管理员可以在后台进行状态标记与备注说明。报名记录管理界面获奖记录管理功能实现管理员在获奖记录管理模块对已结束的征集活动进行获奖结果录入。管理员选择对应活动进入获奖设置页面填写获得奖项名称与获奖说明。系统支持批量导入获奖用户名单。录入完成后获奖信息在用户端的获奖记录中显示。管理员还可以对已公布的获奖结果进行修改或撤销操作。获奖记录管理界面房屋户型管理功能实现管理员进入房屋户型管理页面维护案例关联的户型分类。页面以列表形式展示现有户型名称如两室一厅、三室两厅等。管理员可以添加新的户型名称编辑已有户型的显示顺序或删除不再使用的户型。户型分类的调整即时生效设计师在发布案例时可在装修案例编辑页面的户型下拉菜单中看到更新后的选项。房屋户型管理界面装修风格管理功能实现管理员在装修风格管理模块维护案例的风格标签。页面展示已存在的风格名称如现代简约、北欧风格、日式原木等。管理员可新增风格名称并设置其在前端的展示顺序。对于重复或过时的风格管理员可执行删除操作。风格数据的变更实时同步至前端用户浏览案例时可通过风格分类进行筛选查找。装修风格管理界面数据库参考CREATE TABLE sensitive_vocabulary ( sensitive_vocabulary_id int(11) NOT NULL AUTO_INCREMENT COMMENT 敏感词汇ID, sensitive_vocabulary varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT 敏感词汇, create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间, update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 更新时间, PRIMARY KEY (sensitive_vocabulary_id) USING BTREE ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_general_ci COMMENT敏感词汇; DROP TABLE IF EXISTS user_group; CREATE TABLE user_group ( group_id mediumint(8) unsigned NOT NULL AUTO_INCREMENT COMMENT 用户组ID, display smallint(4) unsigned NOT NULL DEFAULT 100 COMMENT 显示顺序, name varchar(16) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT COMMENT 名称, description varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL 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, register smallint(1) unsigned DEFAULT 0 COMMENT 注册位置, create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间, update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 更新时间, PRIMARY KEY (group_id) USING BTREE ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_general_ci COMMENT用户组; DROP TABLE IF EXISTS article; CREATE TABLE article ( article_id mediumint(8) unsigned NOT NULL AUTO_INCREMENT COMMENT 文章id, title varchar(125) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT COMMENT 标题, type varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 0 COMMENT 文章分类, hits int(10) unsigned NOT NULL DEFAULT 0 COMMENT 点击数, praise_len int(11) NOT NULL DEFAULT 0 COMMENT 点赞数, create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间, update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 更新时间, source varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 来源, url varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 来源地址, tag varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 标签, content longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT 正文, img varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 封面图, description text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT 文章描述, PRIMARY KEY (article_id,title) USING BTREE ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_general_ci COMMENT文章; DROP TABLE IF EXISTS access_token; CREATE TABLE access_token ( token_id int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 临时访问牌ID, token varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT 临时访问牌, info text CHARACTER SET utf8 COLLATE utf8_general_ci COMMENT 信息, maxage int(2) NOT NULL DEFAULT 2 COMMENT 最大寿命默认2小时, create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间, update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 更新时间, user_id int(11) unsigned NOT NULL DEFAULT 0 COMMENT 用户编号, PRIMARY KEY (token_id) USING BTREE ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_general_ci COMMENT登陆访问时长; DROP TABLE IF EXISTS code_token; CREATE TABLE code_token ( code_token_id int(11) NOT NULL AUTO_INCREMENT COMMENT 验证码ID, token varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci DEFAULT NULL COMMENT 令牌, code varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci DEFAULT NULL COMMENT 验证码, expire_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 失效时间, create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间, update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 更新时间, PRIMARY KEY (code_token_id) USING BTREE ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_general_ci ROW_FORMATCOMPACT COMMENT验证码;代码参考package com.project.demo.controller; import com.project.demo.entity.DecorationCase; import com.project.demo.service.DecorationCaseService; 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 java.io.UnsupportedEncodingException; import java.net.URLDecoder; import javax.persistence.Query; import javax.servlet.http.HttpServletRequest; import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.*; /** * 装修案例(DecorationCase)表控制层 * */ RestController RequestMapping(/decoration_case) public class DecorationCaseController extends BaseControllerDecorationCase, DecorationCaseService { /** * 装修案例对象 */ Autowired public DecorationCaseController(DecorationCaseService service) { setService(service); } PostMapping(/add) Transactional public MapString, Object add(HttpServletRequest request) throws IOException { MapString,Object paramMap service.readBody(request.getReader()); paramMap.entrySet().removeIf(entry - { Object value entry.getValue(); return value instanceof String ((String) value).isEmpty(); }); DecorationCase decoration_case new DecorationCase(); decoration_case.setDesigner_user(paramMap.get(designer_user)null?null:Integer.valueOf(String.valueOf(paramMap.get(designer_user)))); decoration_case.setName_of_designer(paramMap.get(name_of_designer)null?null:String.valueOf(paramMap.get(name_of_designer))); decoration_case.setDesigner_phone(paramMap.get(designer_phone)null?null:String.valueOf(paramMap.get(designer_phone))); decoration_case.setCase_name(paramMap.get(case_name)null?null:String.valueOf(paramMap.get(case_name))); decoration_case.setUse_of_house_type(paramMap.get(use_of_house_type)null?null:String.valueOf(paramMap.get(use_of_house_type))); decoration_case.setDecoration_style(paramMap.get(decoration_style)null?null:String.valueOf(paramMap.get(decoration_style))); if (paramMap.get(finishing_the_renovation ) ! null !StringUtils.isEmpty(String.valueOf(paramMap.get(finishing_the_renovation )))) { String timStr String.valueOf(paramMap.get(finishing_the_renovation )); decoration_case.setFinishing_the_renovation(parseToTimestamp(timStr)); } else { decoration_case.setFinishing_the_renovation(null); } decoration_case.setActual_photo(paramMap.get(actual_photo)null?null:String.valueOf(paramMap.get(actual_photo))); decoration_case.setEffect_atlas(paramMap.get(effect_atlas)null?null:String.valueOf(paramMap.get(effect_atlas))); decoration_case.setShow_vuser_ideo(paramMap.get(show_vuser_ideo)null?null:String.valueOf(paramMap.get(show_vuser_ideo))); decoration_case.setDesign_concept(paramMap.get(design_concept)null?null:String.valueOf(paramMap.get(design_concept))); decoration_case.setBudget_summary(paramMap.get(budget_summary)null?null:String.valueOf(paramMap.get(budget_summary))); decoration_case.setHits(paramMap.get(hits)null?null:Integer.valueOf(String.valueOf(paramMap.get(hits)))); decoration_case.setPraise_len(paramMap.get(praise_len)null?null:Integer.valueOf(String.valueOf(paramMap.get(praise_len)))); decoration_case.setCollect_len(paramMap.get(collect_len)null?null:Integer.valueOf(String.valueOf(paramMap.get(collect_len)))); decoration_case.setComment_len(paramMap.get(comment_len)null?null:Integer.valueOf(String.valueOf(paramMap.get(comment_len)))); decoration_case.setExamine_state(paramMap.get(examine_state)null?null:String.valueOf(paramMap.get(examine_state))); decoration_case.setExamine_reply(paramMap.get(examine_reply)null?null:String.valueOf(paramMap.get(examine_reply))); decoration_case.setCreate_by(paramMap.get(create_by)null?null:Integer.valueOf(String.valueOf(paramMap.get(create_by)))); this.addEntity(decoration_case); System.out.println(装修案例新增成功); return success(1); } PostMapping(/set) Transactional public MapString, Object set(HttpServletRequest request) throws IOException { MapString,String queryMap service.readQuery(request); MapString,String configMap service.readConfig(request); MapString,Object paramMap service.readBody(request.getReader()); paramMap.entrySet().removeIf(entry - { Object value entry.getValue(); return value instanceof String ((String) value).isEmpty(); }); DecorationCase decoration_case new DecorationCase(); decoration_case.setDesigner_user(paramMap.get(designer_user)null?null:Integer.valueOf(String.valueOf(paramMap.get(designer_user)))); decoration_case.setName_of_designer(paramMap.get(name_of_designer)null?null:String.valueOf(paramMap.get(name_of_designer))); decoration_case.setDesigner_phone(paramMap.get(designer_phone)null?null:String.valueOf(paramMap.get(designer_phone))); decoration_case.setCase_name(paramMap.get(case_name)null?null:String.valueOf(paramMap.get(case_name))); decoration_case.setUse_of_house_type(paramMap.get(use_of_house_type)null?null:String.valueOf(paramMap.get(use_of_house_type))); decoration_case.setDecoration_style(paramMap.get(decoration_style)null?null:String.valueOf(paramMap.get(decoration_style))); if (paramMap.get(finishing_the_renovation ) ! null !StringUtils.isEmpty(String.valueOf(paramMap.get(finishing_the_renovation )))) { String timStr String.valueOf(paramMap.get(finishing_the_renovation )); decoration_case.setFinishing_the_renovation(parseToTimestamp(timStr)); } else { decoration_case.setFinishing_the_renovation(null); } decoration_case.setActual_photo(paramMap.get(actual_photo)null?null:String.valueOf(paramMap.get(actual_photo))); decoration_case.setEffect_atlas(paramMap.get(effect_atlas)null?null:String.valueOf(paramMap.get(effect_atlas))); decoration_case.setShow_vuser_ideo(paramMap.get(show_vuser_ideo)null?null:String.valueOf(paramMap.get(show_vuser_ideo))); decoration_case.setDesign_concept(paramMap.get(design_concept)null?null:String.valueOf(paramMap.get(design_concept))); decoration_case.setBudget_summary(paramMap.get(budget_summary)null?null:String.valueOf(paramMap.get(budget_summary))); decoration_case.setHits(paramMap.get(hits)null?null:Integer.valueOf(String.valueOf(paramMap.get(hits)))); decoration_case.setPraise_len(paramMap.get(praise_len)null?null:Integer.valueOf(String.valueOf(paramMap.get(praise_len)))); decoration_case.setCollect_len(paramMap.get(collect_len)null?null:Integer.valueOf(String.valueOf(paramMap.get(collect_len)))); decoration_case.setComment_len(paramMap.get(comment_len)null?null:Integer.valueOf(String.valueOf(paramMap.get(comment_len)))); decoration_case.setExamine_state(paramMap.get(examine_state)null?null:String.valueOf(paramMap.get(examine_state))); decoration_case.setExamine_reply(paramMap.get(examine_reply)null?null:String.valueOf(paramMap.get(examine_reply))); this.setEntity(queryMap,configMap,decoration_case); System.out.println(装修案例修改成功); return success(1); } /** * 协同过滤算法 */ RequestMapping(/get_hits_list) public MapString, Object getHits(HttpServletRequest request) { MapString,String paramMap service.readQuery(request); if (paramMap.get(user_id)null||paramMap.get(user_id).equals()){ return this.getList(request); }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 SELECT COUNT( hits_id ) AS hits_count, source_id FROM hits WHERE source_table decoration_case AND user_id paramMap.get(user_id) GROUP BY source_id; ListMapString,Object hitsSourceList service.selectMapBaseList(hitsSource); //判断是否为空,代表当前用户暂无点击数据那么取其他用户的最常点击 if (hitsSourceListnull || hitsSourceList.size()0){ hitsSource SELECT COUNT( hits_id ) AS hits_count, source_id FROM hits WHERE source_table decoration_case GROUP BY source_id; hitsSourceList service.selectMapBaseList(hitsSource); } String table_name decoration_case; String table_id decoration_case_id; String type_name decoration_style; //二次处理-如果依旧为空则取添加时间前12条数据 if (hitsSourceListnull || 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 service.selectBaseList(sql); MapString, Object mapnew HashMap(); map.put(list,list); map.put(count,list.size()); return success(map); }else { //对用户点击量进行排序取得最大值 double max 0.0; int maxSourceId 0; for (MapString,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(source_id))); } } //查询该用户点击最大值的种类 String typeSql SELECT type_name FROM table_name WHERE table_id maxSourceId; ListMapString,Object typeList service.selectMapBaseList(typeSql); //如果为空则取添加时间前12条数据 if (typeListnull || 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 service.selectBaseList(sql); MapString, Object mapnew 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 service.selectBaseList(sql); //如果为空则取添加时间前12条数据 if (resultListnull || 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 service.selectBaseList(sql); MapString, Object mapnew 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) { DecorationCase leftMap (DecorationCase) resultList.get(j); DecorationCase rightMap (DecorationCase) resultList.get(j 1); if (leftMap.getHits()rightMap.getHits()){ DecorationCase 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; ListMapString, Object typeCosList service.selectMapBaseList(typeCosSql); if (typeCosList ! null typeCosList.size() 0) { for (MapString, 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) { MapString, Object leftMap typeCosList.get(j); MapString, Object rightMap typeCosList.get(j 1); if (Double.parseDouble(String.valueOf(leftMap.get(cosSim ))) Double.parseDouble(String.valueOf(rightMap.get(cosSim )))) { MapString, Object temp rightMap; rightMap leftMap; leftMap temp; swapped true; } } if (!swapped) { // 没有发生交换则说明数组已有序,停止冒泡 break; } } //逐条加入数据 for (MapString, 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 service.selectBaseList(sql); if (list ! null list.size() 0) { resultList.addAll(list); } if (resultList.size() 12) { break; } } } } MapString, Object mapnew HashMap(); map.put(list,resultList); map.put(count,resultList.size()); return success(map); } } } } } /** * 计算余弦相似度 */ private double calculateCosineSimilarity(String text1, String text2) { // 将文本分词并转换为向量表示 MapCharacter, Integer wordCount1 getWordCount(text1); MapCharacter, 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 MapCharacter, Integer getWordCount(String text) { MapCharacter, Integer wordCount new HashMap(); for (char c : text.toCharArray()) { wordCount.put(c, wordCount.getOrDefault(c, 0) 1); } return wordCount; } /** * 修改审核状态 * * param id 要修改的记录ID * param newState 新的审核状态 * return 提示信息审核成功/失败 */ Transactional GetMapping(/update_examine_state) public String updateExamineState(Long id, String newState) throws IOException { // 检查传入的状态是否合法 if (!newState.equals(未审核) !newState.equals(已通过) !newState.equals(未通过)) { return 非法的审核状态; } MapString,String queryMap new HashMap(); queryMap.put(id,String.valueOf(id)); // 根据ID查找记录 DecorationCase decoration_case service.findOne(queryMap); if (decoration_case!null) { // 更新审核状态 decoration_case.setExamine_state(newState); this.setEntity(queryMap,new HashMap(),decoration_case); return 审核成功; } else { return 审核失败记录不存在; package com.project.demo.controller; import com.project.demo.entity.SensitiveVocabulary; import com.project.demo.service.SensitiveVocabularyService; import com.project.demo.controller.base.BaseController; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; /** * 敏感词汇(SensitiveVocabulary)表控制层 * */ RestController RequestMapping(/sensitive_vocabulary) public class SensitiveVocabularyController extends BaseControllerSensitiveVocabulary, SensitiveVocabularyService { /** * 敏感词汇对象 */ Autowired public SensitiveVocabularyController(SensitiveVocabularyService service) { setService(service);前端基于uni-app框架构建跨平台用户界面使用HTML5、CSS3和JavaScript/Vue.js实现页面结构与交互逻辑通过uni-app内置路由或Vue Router管理页面导航Vuex或Pinia维护全局状态。采用uni-ui或uView等组件库快速搭建界面使用uni.request或Axios经适配封装HTTP请求实现与后端的数据通信同时可调用uni-app提供的丰富原生API如相机、定位、支付等增强移动端能力。后端基于Spring Boot框架搭建遵循Controller-Service-Mapper三层架构。Controller层接收前端请求并校验参数Service层处理核心业务逻辑Mapper层通过MyBatis或MyBatis-Plus完成数据库操作。使用Spring Security或Shiro结合JWT实现用户认证与权限控制。数据库采用MySQL存储持久化数据Redis缓存热点信息以提升系统性能。开发工具使用HBuilderX或VSCode开发前端uni-appIDEA开发后端Git进行版本管理Maven管理后端依赖npm或yarn管理前端依赖并通过HBuilderX的App发布功能或命令行工具完成多端iOS、Android、H5、各小程序打包发布。源码获取私信联系我即可~大家点赞、收藏、关注、评论啦精彩专栏 推荐订阅海量实战库源码任你选 坐拥Java项目2000套海量实战库源码任你选 坐拥Python项目1000套海量实战库源码任你选 坐拥小程序/app项目500套✅获取源码请私信✅感兴趣的可以先收藏起来还有大家在毕设选题项目以及论文编写等相关问题都可以找我咨询希望帮助更多的人❤️