springboot环保生活指南网站23223-计算机毕业设计、课程设计
前言
✨博主介绍:一线全栈工程师,毕设实战引路人。技术栈覆盖Java、Python、C#、PHP、Node.js及UniApp跨端开发,擅长多语言项目落地与架构设计。持续分享毕设源码、开题报告、技术选型心得与职场踩坑经验。用工程化思维写代码,帮你把毕设做成作品集。👍👍
👇精彩专栏 推荐订阅👇
海量实战库,源码任你选! 坐拥Java项目2000+套
海量实战库,源码任你选! 坐拥Python项目1000+套
海量实战库,源码任你选! 坐拥小程序/app项目500+套
✅获取源码请私信✅
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以找我咨询,希望帮助更多的人❤️
系统实现
普通用户功能实现
普通用户点击导航栏,进入社区板块,页面展示全部用户发帖列表。用户点击发布按钮创建一条帖子,使用编辑器输入标题、正文信息上传相关的图片。帖子发布后会在列表页面向所有的用户展示,其他用户可以对该帖进行点赞或者评论。
发布互动社区界面
用户在个人中心或者工具页面找到碳足迹计算器入口,进入之后会看到一个包含多个日常活动的表单。用户要逐项填写或者选择自己交通、饮食、用电等的数据。填完之后点“计算”按钮,系统就会对数据进行自动处理,在页面底部产生一份详细的碳排放报告。
碳足迹计算器计算界面
用户在站点查看功能页面的搜索框中输入地址关键词,页面地图就会自动定位并高亮显示周边的回收站点。用户也可以直接浏览系统推荐的站点列表,点击列表中的任意站点,右侧会出现该站点的详细信息卡片,卡片中会显示站点地址、联系方式、可回收物种类等信息。
回收站点查看界面
用户可以在活动查看页浏览所有环保活动,活动的卡片有标题、时间、地点的简介。用户点击感兴趣的卡并进入详情页后可以获得该活动所有的信息、负责人和联系方式。用户想参加的话可以在详情页里点击"我要报名"并填写简单的个人信息完成注册。
环保活动查看界面
用户在页面右下角找到悬浮的客服图标,点击之后弹出对话框。用户在对话框中输入自己的疑问,例如电池属于什么垃圾,智能客服会立即根据知识库返回分类答案。如果问题超出预设范围,系统就提示转入人工客服或者引导用户查阅相关文章。
咨询智能客服界面
管理员功能实现
管理员登录后台之后,在回收站点管理页面上可以看到所有的已注册站点信息列表。管理员点击添加按钮,新建站点。输入站点名称、地址、负责人等信息。管理员可以对已有的站点条目进行修改信息或者删除操作。
回收站点管理界面
管理员进入垃圾分类管理模块,页面用表格形式列出所有的垃圾分类标准。管理员可以利用表单来新增一种垃圾类别以及其处理方式,也可以对已有的垃圾类别名称、描述进行修改。管理员可以移除已过时的某条分类规则。
垃圾分类管理界面
管理员在环保活动管理页面查看所有的活动发布状态以及报名情况。管理员可以创建新的活动,填写活动的标题、种类、时间、地点等信息,设置活动的封面图。对于已经发布的活动,管理员可以修改、提前下架或者查看具体的参加人员名单。
环保活动管理界面
管理员在活动类型管理页面创建整个网站的活动分类。管理员可在系统中增加新的活动类型名,即线上宣传和线下清洁。系统把新类型加入分类选项库,供发布活动时使用。管理员可以对已存在的类型进行重命名或者删除操作,在删除前会检测是否有活动正在使用该类型。
活动类型管理界面
管理员进入互动社区管理功能,可以浏览所有的用户发布的帖子内容列表。管理员可以对涉嫌违规或者不当的帖子进行内容审查,执行“隐藏”操作使该帖对于普通用户不可见。管理员也可以在必要时对帖子内容进行直接修改,或者从数据库中删除该条帖子记录。
互动社区管理界面
数据库参考
CREATE TABLE `forum_type` ( `type_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT COMMENT '分类ID', `name` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '分类名称', `description` 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 '外链地址', `father_id` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT '上级分类ID', `icon` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL 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 (`type_id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='论坛分类'; insert into `forum_type` values ('1','分类一','分类一','/article/list?type_id=1','0',null,'2025-12-15 16:51:38','2025-12-15 16:51:38'); insert into `forum_type` values ('2','分类二','分类二','/article/list?type_id=2','0',null,'2025-12-15 16:51:38','2025-12-15 16:51:38'); insert into `forum_type` values ('3','分类三','分类三','/article/list?type_id=3','0',null,'2025-12-15 16:51:38','2025-12-15 16:51:38'); DROP TABLE IF EXISTS `notice`; CREATE TABLE `notice` ( `notice_id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT COMMENT '公告ID', `title` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '标题', `content` longtext CHARACTER SET utf8 COLLATE utf8_general_ci 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 (`notice_id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='公告'; insert into `notice` values ('1','系统维护通知','<p>网站升级通知</p><p>尊敬的客户,为了提供更好的用户体验,我们将于本周三凌晨1:00-5:00进行系统维护升级,期间可能出现短暂服务中断。建议您提前保存操作数据,感谢您的理解与支持!</p>','2025-12-15 16:51:39','2025-12-15 16:51:39'); insert into `notice` values ('2','新功能上线','<p>搜索功能已优化升级!现已正式开放使用,支持关键词搜索,快去体验检索服务吧~</p>','2025-12-15 16:51:39','2025-12-15 16:51:39'); insert into `notice` values ('3','客服时间调整','<p>人工客服服务时间已延长为每日8:00-22:00(含节假日),智能客服24小时在线,随时为您解答问题。</p>','2025-12-15 16:51:39','2025-12-15 16:51:39'); insert into `notice` values ('4','规范提示','<p>请遵守《用户行为守则》:禁止发布广告、虚假信息及不当内容。共同维护友善的网络环境,违规账号将受到限制。</p>','2025-12-15 16:51:39','2025-12-15 16:51:39'); DROP TABLE IF EXISTS `article_type`; CREATE TABLE `article_type` ( `type_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT COMMENT '分类ID', `display` smallint(4) unsigned NOT NULL DEFAULT '100' COMMENT '显示顺序', `name` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '分类名称', `father_id` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT '上级分类ID', `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '描述', `icon` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '分类图标', `url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL 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 (`type_id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='文章分类';代码参考
package com.project.demo.controller; import com.project.demo.entity.EnvironmentalProtectionActivities; import com.project.demo.service.EnvironmentalProtectionActivitiesService; 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 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.*; /** * 环保活动:(EnvironmentalProtectionActivities)表控制层 * */ @RestController @RequestMapping("/environmental_protection_activities") public class EnvironmentalProtectionActivitiesController extends BaseController<EnvironmentalProtectionActivities, EnvironmentalProtectionActivitiesService> { /** * 环保活动对象 */ @Autowired public EnvironmentalProtectionActivitiesController(EnvironmentalProtectionActivitiesService service) { setService(service); } @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(); }); EnvironmentalProtectionActivities environmental_protection_activities = new EnvironmentalProtectionActivities(); environmental_protection_activities.setActivity_title(paramMap.get("activity_title")==null?null:String.valueOf(paramMap.get("activity_title"))); Map<String, String> mapactivity_title = new HashMap<>(); mapactivity_title.put("activity_title",String.valueOf(paramMap.get("activity_title"))); List listactivity_title = service.selectBaseList(service.select(mapactivity_title, new HashMap<>())); if (listactivity_title.size()>0){ return error(30000, "字段活动标题内容不能重复"); } environmental_protection_activities.setActivity_type(paramMap.get("activity_type")==null?null:String.valueOf(paramMap.get("activity_type"))); environmental_protection_activities.setCover_chart(paramMap.get("cover_chart")==null?null:String.valueOf(paramMap.get("cover_chart"))); if (paramMap.get("activity_date" ) != null && !StringUtils.isEmpty(String.valueOf(paramMap.get("activity_date" )))) { String timStr = String.valueOf(paramMap.get("activity_date" )); environmental_protection_activities.setActivity_date(parseToTimestamp(timStr)); } else { environmental_protection_activities.setActivity_date(null); } environmental_protection_activities.setPerson_in_charge(paramMap.get("person_in_charge")==null?null:String.valueOf(paramMap.get("person_in_charge"))); environmental_protection_activities.setActivity_location(paramMap.get("activity_location")==null?null:String.valueOf(paramMap.get("activity_location"))); environmental_protection_activities.setContact_number(paramMap.get("contact_number")==null?null:String.valueOf(paramMap.get("contact_number"))); environmental_protection_activities.setSpecificsed_introduction(paramMap.get("specificsed_introduction")==null?null:String.valueOf(paramMap.get("specificsed_introduction"))); environmental_protection_activities.setHits(paramMap.get("hits")==null?null:Integer.valueOf(String.valueOf(paramMap.get("hits")))); environmental_protection_activities.setPraise_len(paramMap.get("praise_len")==null?null:Integer.valueOf(String.valueOf(paramMap.get("praise_len")))); environmental_protection_activities.setCollect_len(paramMap.get("collect_len")==null?null:Integer.valueOf(String.valueOf(paramMap.get("collect_len")))); environmental_protection_activities.setComment_len(paramMap.get("comment_len")==null?null:Integer.valueOf(String.valueOf(paramMap.get("comment_len")))); environmental_protection_activities.setTimer_title(paramMap.get("timer_title")==null?null:String.valueOf(paramMap.get("timer_title"))); if (paramMap.get("timing_start_time" ) != null && !StringUtils.isEmpty(String.valueOf(paramMap.get("timing_start_time" )))) { String timStr = String.valueOf(paramMap.get("timing_start_time" )); environmental_protection_activities.setTiming_start_time(parseToTimestamp(timStr)); } else { environmental_protection_activities.setTiming_start_time(null); } if (paramMap.get("timing_end_time" ) != null && !StringUtils.isEmpty(String.valueOf(paramMap.get("timing_end_time" )))) { String timStr = String.valueOf(paramMap.get("timing_end_time" )); environmental_protection_activities.setTiming_end_time(parseToTimestamp(timStr)); } else { environmental_protection_activities.setTiming_end_time(null); } environmental_protection_activities.setCreate_by(paramMap.get("create_by")==null?null:Integer.valueOf(String.valueOf(paramMap.get("create_by")))); this.addEntity(environmental_protection_activities); 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(); }); EnvironmentalProtectionActivities environmental_protection_activities = new EnvironmentalProtectionActivities(); environmental_protection_activities.setActivity_title(paramMap.get("activity_title")==null?null:String.valueOf(paramMap.get("activity_title"))); environmental_protection_activities.setActivity_type(paramMap.get("activity_type")==null?null:String.valueOf(paramMap.get("activity_type"))); environmental_protection_activities.setCover_chart(paramMap.get("cover_chart")==null?null:String.valueOf(paramMap.get("cover_chart"))); if (paramMap.get("activity_date" ) != null && !StringUtils.isEmpty(String.valueOf(paramMap.get("activity_date" )))) { String timStr = String.valueOf(paramMap.get("activity_date" )); environmental_protection_activities.setActivity_date(parseToTimestamp(timStr)); } else { environmental_protection_activities.setActivity_date(null); } environmental_protection_activities.setPerson_in_charge(paramMap.get("person_in_charge")==null?null:String.valueOf(paramMap.get("person_in_charge"))); environmental_protection_activities.setActivity_location(paramMap.get("activity_location")==null?null:String.valueOf(paramMap.get("activity_location"))); environmental_protection_activities.setContact_number(paramMap.get("contact_number")==null?null:String.valueOf(paramMap.get("contact_number"))); environmental_protection_activities.setSpecificsed_introduction(paramMap.get("specificsed_introduction")==null?null:String.valueOf(paramMap.get("specificsed_introduction"))); environmental_protection_activities.setHits(paramMap.get("hits")==null?null:Integer.valueOf(String.valueOf(paramMap.get("hits")))); environmental_protection_activities.setPraise_len(paramMap.get("praise_len")==null?null:Integer.valueOf(String.valueOf(paramMap.get("praise_len")))); environmental_protection_activities.setCollect_len(paramMap.get("collect_len")==null?null:Integer.valueOf(String.valueOf(paramMap.get("collect_len")))); environmental_protection_activities.setComment_len(paramMap.get("comment_len")==null?null:Integer.valueOf(String.valueOf(paramMap.get("comment_len")))); environmental_protection_activities.setTimer_title(paramMap.get("timer_title")==null?null:String.valueOf(paramMap.get("timer_title"))); if (paramMap.get("timing_start_time" ) != null && !StringUtils.isEmpty(String.valueOf(paramMap.get("timing_start_time" )))) { String timStr = String.valueOf(paramMap.get("timing_start_time" )); environmental_protection_activities.setTiming_start_time(parseToTimestamp(timStr)); } else { environmental_protection_activities.setTiming_start_time(null); } if (paramMap.get("timing_end_time" ) != null && !StringUtils.isEmpty(String.valueOf(paramMap.get("timing_end_time" )))) { String timStr = String.valueOf(paramMap.get("timing_end_time" )); environmental_protection_activities.setTiming_end_time(parseToTimestamp(timStr)); } else { environmental_protection_activities.setTiming_end_time(null); } this.setEntity(queryMap,configMap,environmental_protection_activities); System.out.println("环保活动修改成功"); return success(1); } /** * 协同过滤算法 */ @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("")){ 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( collect_id ) AS hits_count, source_id FROM collect WHERE source_table = 'environmental_protection_activities' AND user_id = "+paramMap.get("user_id")+" GROUP BY source_id ORDER BY create_time desc"; List<Map<String,Object>> hitsSourceList = service.selectMapBaseList(hitsSource); //判断是否为空,代表当前用户暂无点击数据,那么取其他用户的最常点击 if (hitsSourceList==null || hitsSourceList.size()<=0){ hitsSource = "SELECT COUNT( collect_id ) AS hits_count, source_id FROM collect WHERE source_table = 'environmental_protection_activities' GROUP BY source_id ORDER BY create_time desc"; hitsSourceList = service.selectMapBaseList(hitsSource); } String table_name = "environmental_protection_activities"; String table_id = "environmental_protection_activities_id"; String type_name = "activity_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 = service.selectBaseList(sql); Map<String, Object> map=new HashMap<>(); map.put("list",list); map.put("count",list.size()); return success(map); }else { //对用户点击量进行排序取得最大值 int max = 0; int maxSourceId = 0; for (Map<String,Object> map:hitsSourceList) { int hitsCount = Integer.parseInt(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; List<Map<String,Object>> typeList = service.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 = service.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 = service.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 = service.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++) { EnvironmentalProtectionActivities leftMap = (EnvironmentalProtectionActivities) resultList.get(j); EnvironmentalProtectionActivities rightMap = (EnvironmentalProtectionActivities) resultList.get(j + 1); if (leftMap.getHits()<rightMap.getHits()){ EnvironmentalProtectionActivities 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 = service.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 = service.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; package com.project.demo.controller; import com.project.demo.entity.Schedule; import com.project.demo.service.ScheduleService; import com.project.demo.controller.base.BaseController; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; /** * 日程:(Schedule)表控制层 * */ @RestController @RequestMapping("schedule") public class ScheduleController extends BaseController<Schedule, ScheduleService> { /** * 服务对象 */ @Autowired public ScheduleController(ScheduleService service) { setService(service);前端:基于Vue.js框架构建用户界面,使用HTML5、CSS3和JavaScript实现页面结构与交互逻辑,通过Vue Router管理路由,Vuex或Pinia维护全局状态。采用Element UI或Vant组件库快速搭建界面,Axios封装HTTP请求实现与后端的数据通信。
后端:基于springboot框架搭建,遵循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+套
✅获取源码请私信✅
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以找我咨询,希望帮助更多的人❤️