springboot中国传统节日宣传平台49078-计算机课程设计、毕业设计

前言

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

👇精彩专栏 推荐订阅👇

Java精品项目案例【3000套】

Python精品项目案例【500套】

uniapp/微信小程序/安卓app【800套】

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、各小程序)打包发布。

👇精彩专栏 推荐订阅👇

Java精品项目案例【3000套】

Python精品项目案例【500套】

uniapp/微信小程序/安卓app【800套】

2026-2027届Java毕业设计优质选题汇总:百个热门方向完整推荐✅

2026-2027届Python毕业设计优质选题汇总:百个热门方向完整推荐✅

2026-2027届小程序/APP毕业设计优质选题汇总:百个热门方向完整推荐✅

✅获取源码请私信✅

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

相关推荐
妙码生花1 小时前
两个月 59 篇 AI 开发日志 + Golang 商业级实战项目收工后,得来的 AI 使用心法-下
前端·后端·go
野生技术架构师1 小时前
从向量检索到混合搜索优化:Spring AI 2.0.1 + pgvector RAG 实战
java·人工智能·spring
qq_452396231 小时前
第三篇:《变量、类型与函数:Rust 的“基本盘”》
开发语言·后端·rust
IT枫斗者枫哥1 小时前
CompletableFuture 超时了,任务还在跑?用三个实验分清超时与取消
java
江华森1 小时前
02 Ubuntu 24.04 手把手部署 K8s 集群(K3s 选型 + 真实踩坑记录)
后端
袁因1 小时前
多租户隔离该做到哪一层:从连接池到 ORM 的取舍
后端
chushiyunen1 小时前
mockito笔记
java·开发语言·笔记
名字还没想好☜1 小时前
Python 用 tempfile 安全创建临时文件:NamedTemporaryFile、TemporaryDirectory 与别自己拼 /tmp 的坑
开发语言·后端·python·安全·编程语言
lvshuocool2 小时前
golang 多版本管理工具 -- g
开发语言·后端·golang