前言
✨ **博主介绍:**一线全栈工程师,毕设实战引路人。技术栈覆盖Java、Python、C#、PHP、Node.js及UniApp跨端开发,擅长多语言项目落地与架构设计。持续分享毕设源码、开题报告、技术选型心得与职场踩坑经验。用工程化思维写代码,帮你把毕设做成作品集。👍👍
👇精彩专栏 推荐订阅👇
2026-2027届Java毕业设计优质选题汇总:百个热门方向完整推荐✅
2026-2027届Python毕业设计优质选题汇总:百个热门方向完整推荐✅
2026-2027届小程序/APP毕业设计优质选题汇总:百个热门方向完整推荐✅
✅获取源码请私信✅
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以找我咨询,希望帮助更多的人❤️
系统实现
普通用户功能实现
首页浏览功能实现
普通用户进入平台后首先看到首页界面,顶部导航栏集中展示各功能入口,中间区域呈现平台公告与中华传统文化概览内容,底部陈列热门文创商品推荐。用户在此页面可快速定位所需服务模块,完成从平台总览到具体功能页面的跳转。
首页浏览界面
宣传社区功能实现
用户在宣传社区页面查看已通过管理员审核的习俗分享内容,每项分享展示发布者信息、分享标题与用户互动数据。页面顶部提供关键词搜索与内容筛选功能,用户可依据自身兴趣快速定位相关分享。
宣传社区界面
文化资讯功能实现
文化资讯页面按照资讯发布时间的先后顺序排列文章列表,每条资讯包含标题、封面图与简要概述。用户点击任意资讯条目后进入详情页查看完整内容,页面底部展示其他用户的评论信息。
文化资讯界面
文创商品功能实现
文创商品模块将文化衍生商品以卡片网格形式排列展示,每件商品展示名称、价格与商品图片。用户浏览商品列表时可依据分类标签进行筛选,商品详情页呈现完整的规格参数与库存状态。
文创商品界面
商城管理功能实现
商城管理模块整合购物车与订单管理功能,用户在购物车页面确认商品数量与规格后生成订单,订单页面展示待付款、待发货、已签收等不同状态的订单记录,用户可随时查看订单流转情况。
商城管理界面
文言一心功能实现
文言一心模块提供智能问答服务,用户在对话输入框内输入问题后系统返回相关内容回复。页面预设创意写作、阅读分析、智慧绘图等多个功能入口,用户可根据需求切换使用场景。
文言一心界面
学习资源功能实现
学习资源页面按照资源类型分类展示各类节日文化学习材料,用户通过资源名称搜索或类型筛选快速定位所需内容。资源列表呈现资源封面、资源名称与推荐状态,点击条目后跳转至详情页查看完整学习内容。
学习资源界面
习俗分享功能实现
用户在习俗分享列表页面浏览其他用户发布的节日习俗内容,每条分享展示习俗名称、流行民族与时间节点信息。页面提供习俗名称搜索与流行民族筛选,用户点击详情按钮后查看完整的习俗起源与寓意说明。
习俗分享界面
活动信息功能实现
活动信息页面展示各类节日活动的列表信息,包含活动名称、活动类型与活动主题。用户可通过活动名称搜索与活动类型筛选定位意向活动,点击活动条目后进入详情页查看活动规则与报名入口。
活动信息界面
服务用户功能实现
首页浏览功能实现
服务用户登录平台后首页界面展示平台公告与民俗文化概览内容,导航栏集中呈现宣传社区、文化资讯与活动信息三个核心功能入口。用户在此页面完成从平台总览到具体业务模块的跳转。
首页浏览界面
宣传社区功能实现
服务用户在宣传社区页面浏览已发布习俗分享内容,每项分享展示发布者信息、分享标题与用户互动数据。页面顶部提供关键词搜索功能,用户依据自身兴趣快速定位相关内容。
宣传社区界面
文化资讯功能实现
文化资讯页面按照资讯发布时间顺序排列文章列表,每条资讯包含标题、封面图与简要概述。用户点击资讯条目后进入详情页查看完整内容,页面底部展示其他用户的评论信息。
文化资讯界面
活动信息功能实现
活动信息页面展示各类节日活动的列表信息,包含活动名称、活动类型与活动主题。用户通过活动名称搜索与活动类型筛选定位意向活动,点击活动条目后进入详情页查看活动规则并完成报名操作。
活动信息界面
管理员功能实现
学习资源管理功能实现
管理员进入学习资源管理页面后查看已发布资源列表,每条资源展示资源编号、资源名称与资源类型。页面提供资源添加功能,管理员填写资源内容并上传封面图后完成新资源的发布操作。
学习资源管理界面
习俗分享管理功能实现
管理员在习俗分享管理页面查看用户提交的分享内容列表,每条分享展示习俗名称、分享用户与流行民族信息。管理员对每条分享执行详情查看与审核操作,通过审核的内容在前端宣传社区展示。
习俗分享管理界面
活动信息管理功能实现
管理员在活动信息管理页面查看已发布活动列表,每条活动展示活动编号、活动名称与活动类型。管理员可执行活动信息的查询与删除操作,进入详情页后对活动内容进行修改更新。
活动信息管理界面
活动报名管理功能实现
管理员在活动报名管理页面查看用户提交的报名记录列表,每条记录展示活动编号、活动名称与报名用户。管理员对报名记录执行批量审核操作,审核通过的报名记录关联至活动成果管理模块。
活动报名管理界面
活动成果管理功能实现
管理员在活动成果管理页面查看活动结束后生成的成果记录列表,每条成果展示活动编号、活动名称与活动类型。管理员可执行成果记录的查询与删除操作,进入详情页后对活动奖励与活动表现信息进行管理。
活动成果管理界面
资源管理功能实现
管理员在资源管理页面查看平台资源分类列表,每条分类展示类型名称与创建时间。管理员可执行资源分类的查询、重置与删除操作,点击添加按钮后录入新的资源分类信息。
资源管理界面
交流管理功能实现
管理员在交流管理页面查看宣传社区内的帖子列表,每条帖子展示标题、封面图与分类标签。管理员可执行帖子的查询、重置与删除操作,点击添加按钮后发布新的交流主题内容。
交流管理界面
商城管理功能实现
管理员在商城管理页面查看文创商品列表,每条商品展示标题、产品分类与上架状态。管理员可执行商品的查询、添加与删除操作,进入详情页后对商品价格、库存与描述信息进行维护管理。
商城管理界面
数据库参考
sql
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='商品信息';
CREATE TABLE `cart` (
`cart_id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '购物车ID',
`title` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '标题',
`img` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '0' COMMENT '图片',
`user_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '用户ID',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`state` int(1) unsigned NOT NULL DEFAULT '0' COMMENT '状态:使用中,已失效',
`price` double(8,2) NOT NULL DEFAULT '0.00' COMMENT '单价',
`price_ago` double(8,2) NOT NULL DEFAULT '0.00' COMMENT '原价',
`price_count` double(10,2) NOT NULL DEFAULT '0.00' COMMENT '总价',
`num` int(8) unsigned NOT NULL DEFAULT '1' COMMENT '数量',
`goods_id` mediumint(8) unsigned NOT NULL COMMENT '商品id',
`type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '未分类' COMMENT '商品分类',
`description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '描述',
`norms` varchar(64) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '规格',
PRIMARY KEY (`cart_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='购物车';
DROP TABLE IF EXISTS `message_inform`;
CREATE TABLE `message_inform` (
`message_inform_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '通知ID',
`user_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '通知人ID',
`title` varchar(255) DEFAULT NULL COMMENT '标题',
`state` varchar(255) DEFAULT NULL COMMENT '状态',
`type` varchar(64) DEFAULT NULL COMMENT '分类',
`content` varchar(255) 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 (`message_inform_id`) USING BTREE,
KEY `user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='通知记录';
DROP TABLE IF EXISTS `order`;
CREATE TABLE `order` (
`order_id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '订单ID',
`order_number` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '订单号',
`goods_id` mediumint(8) unsigned NOT NULL COMMENT '商品ID',
`title` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '商品标题',
`img` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '商品图片',
`price` double(10,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '价格',
`price_ago` double(10,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '原价',
`num` int(8) NOT NULL DEFAULT '1' COMMENT '数量',
`price_count` double(8,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '总价',
`norms` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '规格',
`type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '未分类' COMMENT '商品分类',
`contact_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '联系人姓名',
`contact_email` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '联系人邮箱',
`contact_phone` varchar(11) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '联系人手机',
`contact_address` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '收件地址',
`postal_code` varchar(9) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '邮政编码',
`user_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '买家ID',
`merchant_id` mediumint(8) unsigned NOT NULL DEFAULT '0' COMMENT '商家ID',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '描述',
`state` varchar(16) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '待付款' COMMENT '订单状态:待付款,待发货,待签收,已签收,待退款,已退款,已拒绝,已完成',
`remark` text CHARACTER SET utf8 COLLATE utf8_general_ci COMMENT '订单备注',
`delivery_state` varchar(16) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '未配送' COMMENT '发货状态:未配送,已配送',
`vip_discount` double(10,2) DEFAULT '0.00' COMMENT '折扣',
`integral` int(11) DEFAULT '0' COMMENT '积分',
`buy_type` tinyint(2) DEFAULT '1' COMMENT '1-全额购买,2-积分兑换,3-钱包购买',
`desc` varchar(64) COLLATE utf8mb4_general_ci DEFAULT '其他原因' COMMENT '取消订单原因',
PRIMARY KEY (`order_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单';
代码参考
java
/**
* 习俗分享:(CustomSharing)表控制层
*
*/
@RestController
@RequestMapping("/custom_sharing")
public class CustomSharingController extends BaseController<CustomSharing, CustomSharingService> {
/**
* 习俗分享对象
*/
@Autowired
public CustomSharingController(CustomSharingService 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();
});
CustomSharing custom_sharing = new CustomSharing();
custom_sharing.setShare_number(paramMap.get("share_number")==null?null:String.valueOf(paramMap.get("share_number")));
custom_sharing.setShare_user(paramMap.get("share_user")==null?null:Integer.valueOf(String.valueOf(paramMap.get("share_user"))));
custom_sharing.setCustom_name(paramMap.get("custom_name")==null?null:String.valueOf(paramMap.get("custom_name")));
custom_sharing.setPopular_nation(paramMap.get("popular_nation")==null?null:String.valueOf(paramMap.get("popular_nation")));
custom_sharing.setOrigins_of_the_custom(paramMap.get("origins_of_the_custom")==null?null:String.valueOf(paramMap.get("origins_of_the_custom")));
custom_sharing.setTime_node(paramMap.get("time_node")==null?null:String.valueOf(paramMap.get("time_node")));
custom_sharing.setRelated_diet(paramMap.get("related_diet")==null?null:String.valueOf(paramMap.get("related_diet")));
custom_sharing.setVuser_ideo_content(paramMap.get("vuser_ideo_content")==null?null:String.valueOf(paramMap.get("vuser_ideo_content")));
custom_sharing.setCustom_pictures(paramMap.get("custom_pictures")==null?null:String.valueOf(paramMap.get("custom_pictures")));
custom_sharing.setCultural_symbolism_and_meaning(paramMap.get("cultural_symbolism_and_meaning")==null?null:String.valueOf(paramMap.get("cultural_symbolism_and_meaning")));
custom_sharing.setTaboo_matters(paramMap.get("taboo_matters")==null?null:String.valueOf(paramMap.get("taboo_matters")));
custom_sharing.setHits(paramMap.get("hits")==null?null:Integer.valueOf(String.valueOf(paramMap.get("hits"))));
custom_sharing.setPraise_len(paramMap.get("praise_len")==null?null:Integer.valueOf(String.valueOf(paramMap.get("praise_len"))));
custom_sharing.setCollect_len(paramMap.get("collect_len")==null?null:Integer.valueOf(String.valueOf(paramMap.get("collect_len"))));
custom_sharing.setComment_len(paramMap.get("comment_len")==null?null:Integer.valueOf(String.valueOf(paramMap.get("comment_len"))));
custom_sharing.setExamine_state(paramMap.get("examine_state")==null?null:String.valueOf(paramMap.get("examine_state")));
custom_sharing.setExamine_reply(paramMap.get("examine_reply")==null?null:String.valueOf(paramMap.get("examine_reply")));
custom_sharing.setCreate_by(paramMap.get("create_by")==null?null:Integer.valueOf(String.valueOf(paramMap.get("create_by"))));
this.addEntity(custom_sharing);
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();
});
CustomSharing custom_sharing = new CustomSharing();
custom_sharing.setShare_number(paramMap.get("share_number")==null?null:String.valueOf(paramMap.get("share_number")));
custom_sharing.setShare_user(paramMap.get("share_user")==null?null:Integer.valueOf(String.valueOf(paramMap.get("share_user"))));
custom_sharing.setCustom_name(paramMap.get("custom_name")==null?null:String.valueOf(paramMap.get("custom_name")));
custom_sharing.setPopular_nation(paramMap.get("popular_nation")==null?null:String.valueOf(paramMap.get("popular_nation")));
custom_sharing.setOrigins_of_the_custom(paramMap.get("origins_of_the_custom")==null?null:String.valueOf(paramMap.get("origins_of_the_custom")));
custom_sharing.setTime_node(paramMap.get("time_node")==null?null:String.valueOf(paramMap.get("time_node")));
custom_sharing.setRelated_diet(paramMap.get("related_diet")==null?null:String.valueOf(paramMap.get("related_diet")));
custom_sharing.setVuser_ideo_content(paramMap.get("vuser_ideo_content")==null?null:String.valueOf(paramMap.get("vuser_ideo_content")));
custom_sharing.setCustom_pictures(paramMap.get("custom_pictures")==null?null:String.valueOf(paramMap.get("custom_pictures")));
custom_sharing.setCultural_symbolism_and_meaning(paramMap.get("cultural_symbolism_and_meaning")==null?null:String.valueOf(paramMap.get("cultural_symbolism_and_meaning")));
custom_sharing.setTaboo_matters(paramMap.get("taboo_matters")==null?null:String.valueOf(paramMap.get("taboo_matters")));
custom_sharing.setHits(paramMap.get("hits")==null?null:Integer.valueOf(String.valueOf(paramMap.get("hits"))));
custom_sharing.setPraise_len(paramMap.get("praise_len")==null?null:Integer.valueOf(String.valueOf(paramMap.get("praise_len"))));
custom_sharing.setCollect_len(paramMap.get("collect_len")==null?null:Integer.valueOf(String.valueOf(paramMap.get("collect_len"))));
custom_sharing.setComment_len(paramMap.get("comment_len")==null?null:Integer.valueOf(String.valueOf(paramMap.get("comment_len"))));
custom_sharing.setExamine_state(paramMap.get("examine_state")==null?null:String.valueOf(paramMap.get("examine_state")));
custom_sharing.setExamine_reply(paramMap.get("examine_reply")==null?null:String.valueOf(paramMap.get("examine_reply")));
this.setEntity(queryMap,configMap,custom_sharing);
System.out.println("习俗分享修改成功");
return success(1);
}
/**
* 修改审核状态
*
* @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 "非法的审核状态";
}
Map<String,String> queryMap = new HashMap<>();
queryMap.put("id",String.valueOf(id));
// 根据ID查找记录
CustomSharing custom_sharing = service.findOne(queryMap);
if (custom_sharing!=null) {
// 更新审核状态
custom_sharing.setExamine_state(newState);
this.setEntity(queryMap,new HashMap<>(),custom_sharing);
return "审核成功";
} else {
return "审核失败:记录不存在";
/**
* 学习资源:(LearningResources)表控制层
*
*/
@RestController
@RequestMapping("/learning_resources")
public class LearningResourcesController extends BaseController<LearningResources, LearningResourcesService> {
/**
* 学习资源对象
*/
@Autowired
public LearningResourcesController(LearningResourcesService 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();
});
LearningResources learning_resources = new LearningResources();
learning_resources.setResource_number(paramMap.get("resource_number")==null?null:String.valueOf(paramMap.get("resource_number")));
learning_resources.setResource_name(paramMap.get("resource_name")==null?null:String.valueOf(paramMap.get("resource_name")));
learning_resources.setResource_type(paramMap.get("resource_type")==null?null:String.valueOf(paramMap.get("resource_type")));
if (paramMap.get("release_time" ) != null && !StringUtils.isEmpty(String.valueOf(paramMap.get("release_time" )))) {
String timStr = String.valueOf(paramMap.get("release_time" ));
learning_resources.setRelease_time(parseToTimestamp(timStr));
} else {
learning_resources.setRelease_time(null);
}
learning_resources.setResource_content(paramMap.get("resource_content")==null?null:String.valueOf(paramMap.get("resource_content")));
learning_resources.setResource_cover(paramMap.get("resource_cover")==null?null:String.valueOf(paramMap.get("resource_cover")));
learning_resources.setArticle_content(paramMap.get("article_content")==null?null:String.valueOf(paramMap.get("article_content")));
learning_resources.setHits(paramMap.get("hits")==null?null:Integer.valueOf(String.valueOf(paramMap.get("hits"))));
learning_resources.setPraise_len(paramMap.get("praise_len")==null?null:Integer.valueOf(String.valueOf(paramMap.get("praise_len"))));
learning_resources.setCollect_len(paramMap.get("collect_len")==null?null:Integer.valueOf(String.valueOf(paramMap.get("collect_len"))));
learning_resources.setComment_len(paramMap.get("comment_len")==null?null:Integer.valueOf(String.valueOf(paramMap.get("comment_len"))));
learning_resources.setCreate_by(paramMap.get("create_by")==null?null:Integer.valueOf(String.valueOf(paramMap.get("create_by"))));
this.addEntity(learning_resources);
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();
});
LearningResources learning_resources = new LearningResources();
learning_resources.setResource_number(paramMap.get("resource_number")==null?null:String.valueOf(paramMap.get("resource_number")));
learning_resources.setResource_name(paramMap.get("resource_name")==null?null:String.valueOf(paramMap.get("resource_name")));
learning_resources.setResource_type(paramMap.get("resource_type")==null?null:String.valueOf(paramMap.get("resource_type")));
if (paramMap.get("release_time" ) != null && !StringUtils.isEmpty(String.valueOf(paramMap.get("release_time" )))) {
String timStr = String.valueOf(paramMap.get("release_time" ));
learning_resources.setRelease_time(parseToTimestamp(timStr));
} else {
learning_resources.setRelease_time(null);
}
learning_resources.setResource_content(paramMap.get("resource_content")==null?null:String.valueOf(paramMap.get("resource_content")));
learning_resources.setResource_cover(paramMap.get("resource_cover")==null?null:String.valueOf(paramMap.get("resource_cover")));
learning_resources.setArticle_content(paramMap.get("article_content")==null?null:String.valueOf(paramMap.get("article_content")));
learning_resources.setHits(paramMap.get("hits")==null?null:Integer.valueOf(String.valueOf(paramMap.get("hits"))));
learning_resources.setPraise_len(paramMap.get("praise_len")==null?null:Integer.valueOf(String.valueOf(paramMap.get("praise_len"))));
learning_resources.setCollect_len(paramMap.get("collect_len")==null?null:Integer.valueOf(String.valueOf(paramMap.get("collect_len"))));
learning_resources.setComment_len(paramMap.get("comment_len")==null?null:Integer.valueOf(String.valueOf(paramMap.get("comment_len"))));
this.setEntity(queryMap,configMap,learning_resources);
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( hits_id ) AS hits_count, source_id FROM hits WHERE source_table = 'learning_resources' AND user_id = "+paramMap.get("user_id")+" GROUP BY source_id";
List<Map<String,Object>> hitsSourceList = service.selectMapBaseList(hitsSource);
//判断是否为空,代表当前用户暂无点击数据,那么取其他用户的最常点击
if (hitsSourceList==null || hitsSourceList.size()<=0){
hitsSource = "SELECT COUNT( hits_id ) AS hits_count, source_id FROM hits WHERE source_table = 'learning_resources' GROUP BY source_id";
hitsSourceList = service.selectMapBaseList(hitsSource);
}
String table_name = "learning_resources";
String table_id = "learning_resources_id";
String type_name = "resource_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 {
//对用户点击量进行排序取得最大值
double max = 0.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("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++) {
LearningResources leftMap = (LearningResources) resultList.get(j);
LearningResources rightMap = (LearningResources) resultList.get(j + 1);
if (leftMap.getHits()<rightMap.getHits()){
LearningResources 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;
**前端:**基于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-app),IDEA开发后端,Git进行版本管理,Maven管理后端依赖,npm或yarn管理前端依赖,并通过HBuilderX的App发布功能或命令行工具完成多端(iOS、Android、H5、各小程序)打包发布。
👇精彩专栏 推荐订阅👇
2026-2027届Java毕业设计优质选题汇总:百个热门方向完整推荐✅
2026-2027届Python毕业设计优质选题汇总:百个热门方向完整推荐✅
2026-2027届小程序/APP毕业设计优质选题汇总:百个热门方向完整推荐✅
✅获取源码请私信✅
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以找我咨询,希望帮助更多的人❤️