前言
✨ **博主介绍:**一线全栈工程师,毕设实战引路人。技术栈覆盖Java、Python、C#、PHP、Node.js及UniApp跨端开发,擅长多语言项目落地与架构设计。持续分享毕设源码、开题报告、技术选型心得与职场踩坑经验。用工程化思维写代码,帮你把毕设做成作品集。👍👍
👇精彩专栏 推荐订阅👇
2026-2027届Java毕业设计优质选题汇总:百个热门方向完整推荐✅
2026-2027届Python毕业设计优质选题汇总:百个热门方向完整推荐✅
2026-2027届小程序/APP毕业设计优质选题汇总:百个热门方向完整推荐✅
✅获取源码请私信✅
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以找我咨询,希望帮助更多的人❤️
系统实现
宠物库存管理功能实现
宠物库存管理由MenuController类完成后台数据的管理,它的page方法就是用来分页查询库存列表,并自动对结果进行脱敏。此方法接收前台发送参数并创建EntityWrapper查询条件,然后调用menuService.queryPage方法进行分页查找,最后使用DeSensUtil对敏感属性进行脱敏并返回R对象,controller层统一完成权限校验以及数据封装,使得库存数据能够可控安全地管理。
宠物库存管理界面
订单管理功能实现
订单管理由OrdersController的page方法完成,此方法依据用户级别动态过滤订单信息:商家仅能浏览本账号下的订单,而管理员则能够看到所有的订单,该方法首先从session中获得用户权限并构建相应的查询参数,然后调用ordersService.queryPage来执行分页查询,在返回的结果上做一下脱敏操作再返回给前端,整个过程都保障着订单信息的隔离和快速查询。
订单管理界面
宠物评论管理功能实现
宠物评论管理利用ChongwuxinxiController的autoSort方法提供智能化排序服务。该方法基于用户的历史点击记录自动优化排序参数,使最近被浏览过的宠物品种能够优先出现在页面上。程序先检索出该用户的购买经历,获取其对应的商品种类名称,再同普通的分页结果合并排重,最后输出按个性化需求调整顺序的信息条目。
宠物评论管理界面
服务管理功能实现
服务管理是由ChongwufuwuController中的page方法提供的后台列表展示,此方法依据登录用户的权限情况(商家或者管理员),自动筛选数据,商家只能看到自身发布的服务信息。系统建立EntityWrapper包装查询参数后,向chongwufuwuService.queryPage发起分页请求查询并运用DeSensUtil对返回的结果集内敏感字段进行脱敏操作,最后将数据以ModelAndView形式传回前端。
服务管理界面
服务预约管理功能实现
服务预约管理借助FuwuyuyueController中的shBatch方法完成批量审批操作,此方法获取需要审批的服务预约id数组,审批状态以及审批意见,对每个id进行循环检索获取相应的FuwuyuyueEntity实体对象,修改实体对象的sfsh、shhf属性值,放入list集合中,最后由fuwuyuyueService.updateBatchById批量处理所有的修改,达到快速批量审批的效果。
服务预约管理界面
宠物科普文章功能实现
宠物科普文章通过SaishiwenzhangController的thumbsup方法来进行点赞与点踩的投票操作,此方法接受文章id及投票类型,按照类型给thumbsupNumber或者crazilyNumber加一进行累加修改,然后调用saishiwenzhangService.updateById保存修改对象到数据库中,最后返回投票成功的消息。提高了宠物科普文章的互动性。
宠物科普文章界面
充值资金管理功能实现
充值资金管理由RechargeRecordController的page方法来完成用户的充值记录分页查询。该方法先判断用户身份如果不是admin,将会自动把查询条件里面的userid替换为当前登录用户的id,做到数据隔离。然后建立EntityWrapper并通过rechargeRecordService.queryPage完成分页查询,将结果脱敏再返回,从而实现了安全地查看用户的资金流水记录。
充值资金管理界面
发布服务管理功能实现
发布服务管理由FuwuleixingController的save方法来完成服务类型的添加功能。方法获取页面提交的FuwuleixingEntity实体类,通过调用fuwuleixingService.insert保存至数据库,并用SysLog注解记录系统日志,操作成功以后返回新增实体对象的id值,作为关联操作的数据标识符,以保障服务类型数据的可追踪性。
发布服务管理界面
发布宠物管理功能实现
宠物上架通过ChongwuxinxiController的save方法完成宠物信息的添加,该方法接收ChongwuxinxiEntity对象并调用chongwuxinxiService.insert方法存入数据库中,@SysLog注解记录此次添加的宠物日志。后台不做逻辑判断处理,直接响应返回新增加实体的id值,保证宠物信息发布环节简单快捷,方便商家迅速发布宠物产品、
发布宠物管理界面
宠物认领功能实现
宠物认领的模块是使用ChongwuxinxiController下的detail方法来查阅宠物的详细情况。它通过Id来查找相应的宠物实体,同时刷新点击时间为当前时间从而统计出热度情况,接着调用selectView方法来选择对应的view页面数据,再运用DeSensUtil工具类将敏感属性脱敏化,最后把脱敏之后的数据传回给前台用户界面,保证了宠物信息的展示安全与及时。

宠物认领界面
充值中心功能实现
充值中心模块由RechargeRecordController下的add方法来执行用户的充值请求处理工作。该方法接收RechargeRecordEntity对象参数,如果这个对象里的userid字段为空,则会默认从session中取值当前登录用户的ID进行赋值,使得充值记录能够与对应的用户相关联起来。之后再通过调用rechargeRecordService.insert进行充值记录的存储,并利用@SysLog注解记录系统日志信息,最后返回成功信息,实现充值流水记录。

充值中心界面
宠物服务功能实现
宠物服务功能由FuwuyuyueController中的add方法来处理用户的宠物服务预定提交。此方法接收FuwuyuyueEntity预定实体,直接调用fuwuyuyueService.insert实现插入预定数据,同时通过@SysLog注解对新增操作进行日志记录。后端不做复杂的校验,迅速反馈用户预定请求,保证宠物服务预定过程的畅通便捷,优化用户感受。

宠物服务界面
购物车功能实现
购物车的功能是由OrdersController的add方法完成客户的下单操作。接受OrdersEntity订单实体,并判断userid是否为空,为空则默认取session获取当前登录用户id设定。调用ordersService.insert添加订单信息,同时使用@SysLog注解,新增商品订单日志,减少客户从购物车到订单之间的步骤,保证订单归属于正确的客户。

购物车界面
宠物科普功能实现
宠物科普模块通过SaishiwenzhangController的list方法来输出赛事文章的前端列表页面。此方法用@IgnoreAuth注解免去授权认证,开放所有用户阅览。初始化EntityWrapper然后调用saishiwenzhangService.queryPage查询分页信息,并对结果进行脱敏,最后输出文章列表信息,达到宠物科普信息公开阅读及宣传的目的。

宠物科普界面
数据库参考
sql
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='论坛分类';
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='文章分类';
DROP TABLE IF EXISTS `follow`;
CREATE TABLE `follow` (
`follow_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '用户关注ID',
`follower_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '关注人ID',
`follower_avatar` varchar(255) DEFAULT NULL COMMENT '关注人头像',
`follower_nickname` varchar(255) DEFAULT NULL COMMENT '关注人昵称',
`followed_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '被关注人ID',
`followed_avatar` varchar(255) DEFAULT NULL COMMENT '被关注人头像',
`followed_nickname` 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 (`follow_id`) USING BTREE,
KEY `followed_id` (`followed_id`),
KEY `follower_id` (`follower_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='用户关注';
DROP TABLE IF EXISTS `praise`;
CREATE TABLE `praise` (
`praise_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '点赞ID',
`user_id` int(11) unsigned 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_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',
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '点赞状态:1为点赞,0已取消',
`img` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
`title` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
PRIMARY KEY (`praise_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='点赞';
代码参考
java
/**
* 临时访问牌(AccessToken)表控制层
*
*/
@RestController
@RequestMapping("access_token")
public class AccessTokenController extends BaseController<AccessToken, AccessTokenService> {
/**
* 服务对象
*/
@Autowired
public AccessTokenController(AccessTokenService service) {
setService(service);
/**
* 兑换记录对象
*/
@Autowired
public ExchangeRecordsController(ExchangeRecordsService 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();
});
ExchangeRecords exchange_records = new ExchangeRecords();
exchange_records.setName_of_commodity(paramMap.get("name_of_commodity")==null?null:String.valueOf(paramMap.get("name_of_commodity")));
exchange_records.setRedeem_points(paramMap.get("redeem_points")==null?null:Double.valueOf(String.valueOf(paramMap.get("redeem_points"))));
exchange_records.setUser_information(paramMap.get("user_information")==null?null:Integer.valueOf(String.valueOf(paramMap.get("user_information"))));
exchange_records.setUser_name(paramMap.get("user_name")==null?null:String.valueOf(paramMap.get("user_name")));
exchange_records.setContact_phone(paramMap.get("contact_phone")==null?null:String.valueOf(paramMap.get("contact_phone")));
if (paramMap.get("redemption_date" ) != null && !StringUtils.isEmpty(String.valueOf(paramMap.get("redemption_date" )))) {
String timStr = String.valueOf(paramMap.get("redemption_date" ));
exchange_records.setRedemption_date(parseToTimestamp(timStr));
} else {
exchange_records.setRedemption_date(null);
}
exchange_records.setRedemption_times(paramMap.get("redemption_times")==null?null:String.valueOf(paramMap.get("redemption_times")));
exchange_records.setRedeem_remarks(paramMap.get("redeem_remarks")==null?null:String.valueOf(paramMap.get("redeem_remarks")));
exchange_records.setSource_table(paramMap.get("source_table")==null?null:String.valueOf(paramMap.get("source_table")));
exchange_records.setSource_id(paramMap.get("source_id")==null?null:Integer.valueOf(String.valueOf(paramMap.get("source_id"))));
exchange_records.setSource_user_id(paramMap.get("source_user_id")==null?null:Integer.valueOf(String.valueOf(paramMap.get("source_user_id"))));
exchange_records.setCreate_by(paramMap.get("create_by")==null?null:Integer.valueOf(String.valueOf(paramMap.get("create_by"))));
this.addEntity(exchange_records);
String sql = "SELECT MAX(exchange_records_id) AS max FROM "+"exchange_records";
Integer max = service.selectBaseCount(sql);
sql = ("SELECT count(*) as count FROM `ordinary_user` INNER JOIN `exchange_records` ON ordinary_user.user_name=exchange_records.user_name WHERE ordinary_user.user_points < exchange_records.redeem_points AND exchange_records.exchange_records_id="+max).replaceAll("<","<");
Integer count = service.selectBaseCount(sql);
if(count>0){
sql = "delete from "+"exchange_records"+" WHERE "+"exchange_records_id"+" ="+max;
service.deleteBaseSql(sql);
return error(30000,"积分不足!");
}
sql = "UPDATE `ordinary_user` INNER JOIN `exchange_records` ON ordinary_user.user_name=exchange_records.user_name SET ordinary_user.user_points= ordinary_user.user_points - exchange_records.redeem_points WHERE exchange_records.exchange_records_id="+max;
service.updateBaseSql(sql);
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();
});
ExchangeRecords exchange_records = new ExchangeRecords();
exchange_records.setName_of_commodity(paramMap.get("name_of_commodity")==null?null:String.valueOf(paramMap.get("name_of_commodity")));
exchange_records.setRedeem_points(paramMap.get("redeem_points")==null?null:Double.valueOf(String.valueOf(paramMap.get("redeem_points"))));
exchange_records.setUser_information(paramMap.get("user_information")==null?null:Integer.valueOf(String.valueOf(paramMap.get("user_information"))));
exchange_records.setUser_name(paramMap.get("user_name")==null?null:String.valueOf(paramMap.get("user_name")));
exchange_records.setContact_phone(paramMap.get("contact_phone")==null?null:String.valueOf(paramMap.get("contact_phone")));
if (paramMap.get("redemption_date" ) != null && !StringUtils.isEmpty(String.valueOf(paramMap.get("redemption_date" )))) {
String timStr = String.valueOf(paramMap.get("redemption_date" ));
exchange_records.setRedemption_date(parseToTimestamp(timStr));
} else {
exchange_records.setRedemption_date(null);
}
exchange_records.setRedemption_times(paramMap.get("redemption_times")==null?null:String.valueOf(paramMap.get("redemption_times")));
exchange_records.setRedeem_remarks(paramMap.get("redeem_remarks")==null?null:String.valueOf(paramMap.get("redeem_remarks")));
exchange_records.setSource_table(paramMap.get("source_table")==null?null:String.valueOf(paramMap.get("source_table")));
exchange_records.setSource_id(paramMap.get("source_id")==null?null:Integer.valueOf(String.valueOf(paramMap.get("source_id"))));
exchange_records.setSource_user_id(paramMap.get("source_user_id")==null?null:Integer.valueOf(String.valueOf(paramMap.get("source_user_id"))));
this.setEntity(queryMap,configMap,exchange_records);
System.out.println("兑换记录修改成功");
return success(1);
/**
* 服务分类对象
*/
@Autowired
public ServiceClassNameificationController(ServiceClassNameificationService 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();
});
ServiceClassNameification service_class_nameification = new ServiceClassNameification();
service_class_nameification.setService_class_nameification(paramMap.get("service_class_nameification")==null?null:String.valueOf(paramMap.get("service_class_nameification")));
service_class_nameification.setCreate_by(paramMap.get("create_by")==null?null:Integer.valueOf(String.valueOf(paramMap.get("create_by"))));
this.addEntity(service_class_nameification);
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();
});
ServiceClassNameification service_class_nameification = new ServiceClassNameification();
service_class_nameification.setService_class_nameification(paramMap.get("service_class_nameification")==null?null:String.valueOf(paramMap.get("service_class_nameification")));
this.setEntity(queryMap,configMap,service_class_nameification);
System.out.println("服务分类修改成功");
return success(1);
前端: 基于Vue.js框架构建用户界面,使用HTML5、CSS3和JavaScript实现页面结构与交互逻辑,通过Vue Router管理路由,Vuex或Pinia维护全局状态。采用Element UI或Vant组件库快速搭建界面,Axios封装HTTP请求实现与后端的数据通信。
后端: 基于ssm框架搭建,遵循Controller-Service-Mapper三层架构。Controller层接收前端请求并校验参数,Service层处理核心业务逻辑,Mapper层通过MyBatis或MyBatis-Plus完成数据库操作。使用Spring Security或Shiro结合JWT实现用户认证与权限控制。
数据库: 采用MySQL存储持久化数据,Redis缓存热点信息以提升系统性能。
开发工具: 使用IDEA开发后端,VSCode或HBuilderX开发前端,Git进行版本管理,Maven和npm分别管理前后端依赖。
👇精彩专栏 推荐订阅👇
2026-2027届Java毕业设计优质选题汇总:百个热门方向完整推荐✅
2026-2027届Python毕业设计优质选题汇总:百个热门方向完整推荐✅
2026-2027届小程序/APP毕业设计优质选题汇总:百个热门方向完整推荐✅
✅获取源码请私信✅
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以找我咨询,希望帮助更多的人❤️