前言
✨ **博主介绍:**一线全栈工程师,毕设实战引路人。技术栈覆盖Java、Python、C#、PHP、Node.js及UniApp跨端开发,擅长多语言项目落地与架构设计。持续分享毕设源码、开题报告、技术选型心得与职场踩坑经验。用工程化思维写代码,帮你把毕设做成作品集。👍👍
👇精彩专栏 推荐订阅👇
✅获取源码请私信✅
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以找我咨询,希望帮助更多的人❤️
系统实现
用户功能实现
旅游景点列表功能实现
该模块为用户提供贵州省内旅游景点的集中展示与查询入口。用户进入界面后可浏览景点列表,系统默认按热度排序。用户通过搜索框输入关键词,系统调用后端接口返回匹配的景点信息。点击具体景点卡片后跳转至详情页面,该页面呈现景点的图文介绍、门票价格与开放时间。用户决定游览后选择票种与数量,点击购票按钮,系统生成预订单。
旅游景点列表界面
酒店信息列表功能实现
此模块整合的是系统合作伙伴酒店的相关信息以供用户浏览和预定。旅客依据旅行地、入住时间以及价格区间选择对应的酒店,列表页面提供酒店的基本情况,点击相应酒店可进入酒店详情页面浏览房间类型以及酒店设施、服务及评论等信息,在确定理想住宿间房型之后进入预定步骤中,填写住客信息提交订单,完成预订操作之后进入到付款过程,系统将指引用户进行购买。
酒店信息列表界面
出行计划功能实现
此功能允许游客自定行程,游客单击新建计划,跳转到计划编辑界面。该页面包含地图、及景点信息,游客把感兴趣的景点拖放到日程时间轴上,构成每天的活动安排。对计划的内容还可以进行文字备注。游客规划好自己的行程之后,提交计划给系统后台存储下来。
出行计划界面
个人中心功能实现
个人中心是用户的个人信息统一展示页面,汇集了历史订单和规划信息,用户在这里查询以往的景点门票订购情况,在这里点击订单还可以查看相关的历史信息并且可以进行付款。酒店预定记录也会出现在这里,用户可以查看相关的预定情况。用户所有的出行规划都在这里以列表的形式展现出来方便用户浏览查询。
个人中心界面
管理员功能实现
首页功能实现
管理员进行登录之后首先到达系统首页,此主页是用数据面板的方式来展现主要的业务数量统计。图中通过图形动态展示景区订票总数量,酒店订房总次数以及分类统计下的热门资源列表排名情况。数据统计都是从后台数据库中实时运算得出,帮助管理者了解经营现状。
首页界面
旅游景点管理功能实现
管理员在此模块中对系统中存在的所有景区信息加以管理。页面中以列表的方式展示景区项目,可按照名称或区域搜索。管理员添加新的景区,录入名称、简介、照片、门票价格等等相关信息。对于已有的景区,管理员浏览详情、更新信息或进行删减以保障信息准确无误及时有效。
旅游景点管理界面
景点购票管理功能实现
此模块负责统一对由用户发起的所有景点门票预订订单进行管理。在后台管理人员可以通过订单编号、用户信息、时间区间来查询指定的单个订单。订单列表页显示预订者、景点、张数、金额以及订单状态等信息。管理人员能对该订单详情进一步了解,在此基础上可以依据实情更改其订单状态,如对退款请求予以回应或者清除废单。
景点购票管理界面
酒店信息管理功能实现
管理员可对酒店合作伙伴信息以及房间类型信息进行管理。管理系统为酒店信息提供增加,删除,修改,查询功能。管理员添加新酒店时须填写基本信息,联系信息和全部房间类型信息;管理员可以查看已经上线的酒店信息,并对房间状态以及价格进行更改,对于不继续和我们平台合作的酒店可以将其下线。
酒店信息管理界面
酒店预订管理功能实现
此模块负责处理用户的酒店预定订单的信息。管理员通过输入预定单编号、酒店名或者用户账号来进行搜索。预定单表展示出预定的具体信息,管理员点击可以查看整个预定单的信息包含入住人的姓名、房间类型以及时间与支付情况等等,管理员可以根据酒店的实际情况或者预定者的要求对订单的状态进行相应的更改,也可以选择将无效的预定取消掉。
酒店预订管理界面
出行计划管理功能实现
管理员在此模块审批用户所设计的个性化旅行方案。系统将所有的待审批以及已经审批的方案以列表的形式呈现出来。管理员点击查看方案详情,阅览用户的行程,管理员依据方案内容是否合理以及合法,进行审批的操作,编辑方案状态为通过、驳回或删除非法方案。
出行计划管理界面
数据库参考
sql
CREATE TABLE `message_inform` (
`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 (`inform_id`) USING BTREE,
KEY `user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC 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
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_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
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_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
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_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
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=COMPACT COMMENT='验证码';
DROP TABLE IF EXISTS `collect`;
CREATE TABLE `collect` (
`collect_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '收藏ID',
`user_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '收藏人ID',
`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',
`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 '封面',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`collect_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='收藏';
DROP TABLE IF EXISTS `forum_type`;
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,'2026-02-03 10:13:02','2026-02-03 10:13:02');
insert into `forum_type` values ('2','分类二','分类二','/article/list?type_id=2','0',null,'2026-02-03 10:13:02','2026-02-03 10:13:02');
insert into `forum_type` values ('3','分类三','分类三','/article/list?type_id=3','0',null,'2026-02-03 10:13:02','2026-02-03 10:13:02');
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='公告';
代码参考
java
package com.project.demo.controller;
import com.project.demo.entity.ClassNameificationOfScenicSpots;
import com.project.demo.service.ClassNameificationOfScenicSpotsService;
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.*;
/**
* 景点分类:(ClassNameificationOfScenicSpots)表控制层
*
*/
@RestController
@RequestMapping("/class_nameification_of_scenic_spots")
public class ClassNameificationOfScenicSpotsController extends BaseController<ClassNameificationOfScenicSpots, ClassNameificationOfScenicSpotsService> {
/**
* 景点分类对象
*/
@Autowired
public ClassNameificationOfScenicSpotsController(ClassNameificationOfScenicSpotsService 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();
});
ClassNameificationOfScenicSpots class_nameification_of_scenic_spots = new ClassNameificationOfScenicSpots();
class_nameification_of_scenic_spots.setClass_nameification_of_scenic_spots(paramMap.get("class_nameification_of_scenic_spots")==null?null:String.valueOf(paramMap.get("class_nameification_of_scenic_spots")));
class_nameification_of_scenic_spots.setCreate_by(paramMap.get("create_by")==null?null:Integer.valueOf(String.valueOf(paramMap.get("create_by"))));
this.addEntity(class_nameification_of_scenic_spots);
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();
});
ClassNameificationOfScenicSpots class_nameification_of_scenic_spots = new ClassNameificationOfScenicSpots();
class_nameification_of_scenic_spots.setClass_nameification_of_scenic_spots(paramMap.get("class_nameification_of_scenic_spots")==null?null:String.valueOf(paramMap.get("class_nameification_of_scenic_spots")));
this.setEntity(queryMap,configMap,class_nameification_of_scenic_spots);
System.out.println("景点分类修改成功");
return success(1);
}
}
package com.project.demo.controller;
import com.project.demo.entity.Comment;
import com.project.demo.service.CommentService;
import com.project.demo.controller.base.BaseController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
* 评论:(Comment)表控制层
*
*/
@RestController
@RequestMapping("comment")
public class CommentController extends BaseController<Comment, CommentService> {
/**
* 服务对象
*/
@Autowired
public CommentController(CommentService service) {
setService(service);
}
}
package com.project.demo.controller;
import com.project.demo.entity.RouteRecommendation;
import com.project.demo.service.RouteRecommendationService;
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.*;
/**
* 路线推荐:(RouteRecommendation)表控制层
*
*/
@RestController
@RequestMapping("/route_recommendation")
public class RouteRecommendationController extends BaseController<RouteRecommendation, RouteRecommendationService> {
/**
* 路线推荐对象
*/
@Autowired
public RouteRecommendationController(RouteRecommendationService 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();
});
RouteRecommendation route_recommendation = new RouteRecommendation();
route_recommendation.setOrdinary_user(paramMap.get("ordinary_user")==null?null:Integer.valueOf(String.valueOf(paramMap.get("ordinary_user"))));
route_recommendation.setUser_name(paramMap.get("user_name")==null?null:String.valueOf(paramMap.get("user_name")));
route_recommendation.setPlan_no(paramMap.get("plan_no")==null?null:String.valueOf(paramMap.get("plan_no")));
route_recommendation.setRoute_name(paramMap.get("route_name")==null?null:String.valueOf(paramMap.get("route_name")));
route_recommendation.setRoute_budget(paramMap.get("route_budget")==null?null:String.valueOf(paramMap.get("route_budget")));
route_recommendation.setItinerary_node(paramMap.get("itinerary_node")==null?null:String.valueOf(paramMap.get("itinerary_node")));
route_recommendation.setExtra(paramMap.get("extra")==null?null:String.valueOf(paramMap.get("extra")));
route_recommendation.setSource_table(paramMap.get("source_table")==null?null:String.valueOf(paramMap.get("source_table")));
route_recommendation.setSource_id(paramMap.get("source_id")==null?null:Integer.valueOf(String.valueOf(paramMap.get("source_id"))));
route_recommendation.setSource_user_id(paramMap.get("source_user_id")==null?null:Integer.valueOf(String.valueOf(paramMap.get("source_user_id"))));
route_recommendation.setCreate_by(paramMap.get("create_by")==null?null:Integer.valueOf(String.valueOf(paramMap.get("create_by"))));
this.addEntity(route_recommendation);
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();
});
RouteRecommendation route_recommendation = new RouteRecommendation();
route_recommendation.setOrdinary_user(paramMap.get("ordinary_user")==null?null:Integer.valueOf(String.valueOf(paramMap.get("ordinary_user"))));
route_recommendation.setUser_name(paramMap.get("user_name")==null?null:String.valueOf(paramMap.get("user_name")));
route_recommendation.setPlan_no(paramMap.get("plan_no")==null?null:String.valueOf(paramMap.get("plan_no")));
route_recommendation.setRoute_name(paramMap.get("route_name")==null?null:String.valueOf(paramMap.get("route_name")));
route_recommendation.setRoute_budget(paramMap.get("route_budget")==null?null:String.valueOf(paramMap.get("route_budget")));
route_recommendation.setItinerary_node(paramMap.get("itinerary_node")==null?null:String.valueOf(paramMap.get("itinerary_node")));
route_recommendation.setSource_table(paramMap.get("source_table")==null?null:String.valueOf(paramMap.get("source_table")));
route_recommendation.setSource_id(paramMap.get("source_id")==null?null:Integer.valueOf(String.valueOf(paramMap.get("source_id"))));
route_recommendation.setSource_user_id(paramMap.get("source_user_id")==null?null:Integer.valueOf(String.valueOf(paramMap.get("source_user_id"))));
this.setEntity(queryMap,configMap,route_recommendation);
System.out.println("路线推荐修改成功");
return success(1);
}
}
前端: 基于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分别管理前后端依赖。
源码获取
私信联系我即可~
大家点赞、收藏、关注、评论啦
👇精彩专栏 推荐订阅👇
✅获取源码请私信✅
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以找我咨询,希望帮助更多的人❤️