springboot校园绿色积分成长计划平台31608-计算机毕业设计、课程设计

发布时间:2026/10/30 9:53:41
springboot校园绿色积分成长计划平台31608-计算机毕业设计、课程设计

前言

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

👇精彩专栏 推荐订阅👇

Java精品项目案例【3000套】

Python精品项目案例【500套】

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

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

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

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

✅获取源码请私信✅

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

系统实现

学生用户功能实现

学生用户登录之后进入个人中心,在个人中心页面点击环保知识菜单进入知识浏览页面。该页面的文章标题和摘要用列表形式展示,用户可以点击任一文章标题查看详细的文章内容。用户查看文章的时候可以收藏或者分享感兴趣的内容。

环保知识界面

学生用户点击投放站点,跳转进入站点查询页面。页面上设置有区域名称和站点名称的搜索框,用户输入关键词可以筛选站点。页面下方的卡片列表里显示符合条件的站点信息,用户点击卡片上的“查看详情”按钮可以进入站点详情页,页面内包含站点位置、开放时间、接收物品等具体信息,在底部设置有“投上一票”按钮供用户对站点服务做评价。

投放站点界面

学生用户点击积分商城菜单就会进入积分商品浏览、兑换页面。页面顶端有商品名、商品类型筛选查找功能。页面主体部分用网格的形式展示可以兑换的商品图片、名称和所需积分。用户点击商品卡片进入商品详情页查看更多的信息,确定兑换就点一下兑换按钮,系统会核实积分来创建出兑换订单。

积分商城界面

学生用户在个人中心或者打卡页面上点击“打卡”功能,进入打卡提交界面。用户先从下拉列表中选择本次的打卡类型,系统就显示出该类型对应的积分。用户选择或者输入打卡日期,上传打卡图片,填写描述性的打卡内容。信息填写完毕后,点击页面底部的提交按钮来完成打卡记录的上传。

学生打卡界面

管理员功能实现

管理员进入后台系统,点击左侧菜单区域信息管理进入对应的页面。页面用表格的形式罗列所有的区域信息。管理员可以通过顶部的查询条件筛选区域,点击新增按钮可打开表单添加新区域,在表格的“操作”列里点修改或删除按钮即可对现有区域信息进行编辑或者移除。

区域信息管理界面

管理员选择投放站点管理进入站点管理页面。页面结构和区域管理类似,显示所有的站点信息列表。管理员通过查询功能找到某个站点,点击新增进入创建站点页面填写信息,点击列表中修改按钮可以修改站点详情,点击删除按钮可以删除无效站点。

投放站点管理界面

管理员在“回收打卡管理”页面查看学生提交的全部回收打卡申请。列表中清楚地显示出每项申请的详细情况以及目前的审核状态。管理员可以逐条查看申请详情,对符合规定的申请点一下回收积分按钮确认发放积分。页面多选,管理员可以选多条申请后用批量审核完成积分的审核和发放。

回收打卡管理界面

管理员进入排行榜单管理页面,系统默认显示当前生效的榜单列表。管理员可以按照条件查询历史排行榜或者某段时期的排行榜。点击“新增”按钮来创建一个新的榜单,设榜名、周期、规则。在现有的榜单操作列中,修改按钮可以对榜单参数进行修改,删除按钮可以删除过期的榜单。

排行榜单管理界面

管理员在积分商城管理页面管理所有的上架商品。页面上列出所有商品的名称、类型、积分、库存。管理员通过查询选择商品,然后点按"添加"按钮进入添加商品信息表单。对需要下架的商品,管理员点击对应行的删除按钮,商品就会从商城中被移除。

积分商城管理界面

管理员在积分兑换管理页面处理学生的商品兑换申请。页面用订单列表的形式展示所有的兑换记录,包含商品信息、申请人、所需积分、订单状态。管理员可以查询特定订单的详情,并对待处理的订单进行审核操作,审核通过后系统扣除学生积分并把订单标记成已完成的。

积分兑换管理界面

区域用户功能实现

区域用户登录之后进入区域信息管理页面。该页面显示该人员所负责区域的具体情况。区域用户可以查看该区域的名称、位置、简介等基础信息,也可以修改该区域的一些基本信息,例如改变区域简介或者对区域进行描述。

区域信息管理界面

区域用户选择“投放站点管理”,进入管理本区域内所有回收站点的页面。区域用户可以查看辖区内每个站点详细的站情和信息,可以新增站点来扩大覆盖范围,也可以修改已有站点的信息或者对废弃站点进行删除。

投放站点管理界面

区域用户在自己的管理界面中进入回收打卡管理模块。此模块集中展示所有提交给该用户所辖区域或者站点的回收打卡申请。区域用户可以对每一条申请进行物品及数量的详细信息查询,并对这些申请实行审核操作来确定回收行为的有效性。

回收打卡管理界面

区域用户在回收积分管理页面上查看本区域的积分发放情况。页面提供查询功能,用户可以按照学生、日期或者物品种类筛选积分流水记录。区域用户可以查看每一条积分发放的明细,处理学生关于积分发放提出的问题或者申诉。

回收积分管理界面

数据库参考

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='收藏';

代码参考

package com.project.demo.controller; import com.project.demo.entity.DeliverySite; import com.project.demo.service.DeliverySiteService; 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.*; /** * 投放站点:(DeliverySite)表控制层 * */ @RestController @RequestMapping("/delivery_site") public class DeliverySiteController extends BaseController<DeliverySite, DeliverySiteService> { /** * 投放站点对象 */ @Autowired public DeliverySiteController(DeliverySiteService 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(); }); DeliverySite delivery_site = new DeliverySite(); delivery_site.setArea_name(paramMap.get("area_name")==null?null:String.valueOf(paramMap.get("area_name"))); delivery_site.setRegional_location(paramMap.get("regional_location")==null?null:String.valueOf(paramMap.get("regional_location"))); delivery_site.setArea_squared(paramMap.get("area_squared")==null?null:String.valueOf(paramMap.get("area_squared"))); delivery_site.setRegional_users(paramMap.get("regional_users")==null?null:Integer.valueOf(String.valueOf(paramMap.get("regional_users")))); delivery_site.setSite_name(paramMap.get("site_name")==null?null:String.valueOf(paramMap.get("site_name"))); delivery_site.setSite_location(paramMap.get("site_location")==null?null:String.valueOf(paramMap.get("site_location"))); delivery_site.setCover_image(paramMap.get("cover_image")==null?null:String.valueOf(paramMap.get("cover_image"))); delivery_site.setSite_introduction(paramMap.get("site_introduction")==null?null:String.valueOf(paramMap.get("site_introduction"))); delivery_site.setPraise_len(paramMap.get("praise_len")==null?null:Integer.valueOf(String.valueOf(paramMap.get("praise_len")))); delivery_site.setCollect_len(paramMap.get("collect_len")==null?null:Integer.valueOf(String.valueOf(paramMap.get("collect_len")))); delivery_site.setComment_len(paramMap.get("comment_len")==null?null:Integer.valueOf(String.valueOf(paramMap.get("comment_len")))); delivery_site.setRecycling_clock_in_limit_times(paramMap.get("recycling_clock_in_limit_times")==null?null:String.valueOf(paramMap.get("recycling_clock_in_limit_times"))); delivery_site.setExtra(paramMap.get("extra")==null?null:String.valueOf(paramMap.get("extra"))); delivery_site.setSource_table(paramMap.get("source_table")==null?null:String.valueOf(paramMap.get("source_table"))); delivery_site.setSource_id(paramMap.get("source_id")==null?null:Integer.valueOf(String.valueOf(paramMap.get("source_id")))); delivery_site.setSource_user_id(paramMap.get("source_user_id")==null?null:Integer.valueOf(String.valueOf(paramMap.get("source_user_id")))); delivery_site.setCreate_by(paramMap.get("create_by")==null?null:Integer.valueOf(String.valueOf(paramMap.get("create_by")))); this.addEntity(delivery_site); 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(); }); DeliverySite delivery_site = new DeliverySite(); delivery_site.setArea_name(paramMap.get("area_name")==null?null:String.valueOf(paramMap.get("area_name"))); delivery_site.setRegional_location(paramMap.get("regional_location")==null?null:String.valueOf(paramMap.get("regional_location"))); delivery_site.setArea_squared(paramMap.get("area_squared")==null?null:String.valueOf(paramMap.get("area_squared"))); delivery_site.setRegional_users(paramMap.get("regional_users")==null?null:Integer.valueOf(String.valueOf(paramMap.get("regional_users")))); delivery_site.setSite_name(paramMap.get("site_name")==null?null:String.valueOf(paramMap.get("site_name"))); delivery_site.setSite_location(paramMap.get("site_location")==null?null:String.valueOf(paramMap.get("site_location"))); delivery_site.setCover_image(paramMap.get("cover_image")==null?null:String.valueOf(paramMap.get("cover_image"))); delivery_site.setSite_introduction(paramMap.get("site_introduction")==null?null:String.valueOf(paramMap.get("site_introduction"))); delivery_site.setPraise_len(paramMap.get("praise_len")==null?null:Integer.valueOf(String.valueOf(paramMap.get("praise_len")))); delivery_site.setCollect_len(paramMap.get("collect_len")==null?null:Integer.valueOf(String.valueOf(paramMap.get("collect_len")))); delivery_site.setComment_len(paramMap.get("comment_len")==null?null:Integer.valueOf(String.valueOf(paramMap.get("comment_len")))); delivery_site.setRecycling_clock_in_limit_times(paramMap.get("recycling_clock_in_limit_times")==null?null:String.valueOf(paramMap.get("recycling_clock_in_limit_times"))); delivery_site.setSource_table(paramMap.get("source_table")==null?null:String.valueOf(paramMap.get("source_table"))); delivery_site.setSource_id(paramMap.get("source_id")==null?null:Integer.valueOf(String.valueOf(paramMap.get("source_id")))); delivery_site.setSource_user_id(paramMap.get("source_user_id")==null?null:Integer.valueOf(String.valueOf(paramMap.get("source_user_id")))); this.setEntity(queryMap,configMap,delivery_site); System.out.println("投放站点修改成功"); return success(1); package com.project.demo.controller; import com.project.demo.entity.RecoveryPoints; import com.project.demo.service.RecoveryPointsService; 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.*; /** * 回收积分:(RecoveryPoints)表控制层 * */ @RestController @RequestMapping("/recovery_points") public class RecoveryPointsController extends BaseController<RecoveryPoints, RecoveryPointsService> { /** * 回收积分对象 */ @Autowired public RecoveryPointsController(RecoveryPointsService 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(); }); RecoveryPoints recovery_points = new RecoveryPoints(); recovery_points.setArea_name(paramMap.get("area_name")==null?null:String.valueOf(paramMap.get("area_name"))); recovery_points.setSite_name(paramMap.get("site_name")==null?null:String.valueOf(paramMap.get("site_name"))); recovery_points.setRegional_users(paramMap.get("regional_users")==null?null:Integer.valueOf(String.valueOf(paramMap.get("regional_users")))); recovery_points.setSite_location(paramMap.get("site_location")==null?null:String.valueOf(paramMap.get("site_location"))); recovery_points.setStudent_name(paramMap.get("student_name")==null?null:String.valueOf(paramMap.get("student_name"))); recovery_points.setStudent_number(paramMap.get("student_number")==null?null:String.valueOf(paramMap.get("student_number"))); recovery_points.setStudent_users(paramMap.get("student_users")==null?null:Integer.valueOf(String.valueOf(paramMap.get("student_users")))); if (paramMap.get("recycling_date" ) != null && !StringUtils.isEmpty(String.valueOf(paramMap.get("recycling_date" )))) { String timStr = String.valueOf(paramMap.get("recycling_date" )); recovery_points.setRecycling_date(parseToTimestamp(timStr)); } else { recovery_points.setRecycling_date(null); } recovery_points.setRecycled_quantity(paramMap.get("recycled_quantity")==null?null:Double.valueOf(String.valueOf(paramMap.get("recycled_quantity")))); recovery_points.setRecycled_items(paramMap.get("recycled_items")==null?null:String.valueOf(paramMap.get("recycled_items"))); recovery_points.setRecovery_points(paramMap.get("recovery_points")==null?null:Double.valueOf(String.valueOf(paramMap.get("recovery_points")))); recovery_points.setExtra(paramMap.get("extra")==null?null:String.valueOf(paramMap.get("extra"))); recovery_points.setSource_table(paramMap.get("source_table")==null?null:String.valueOf(paramMap.get("source_table"))); recovery_points.setSource_id(paramMap.get("source_id")==null?null:Integer.valueOf(String.valueOf(paramMap.get("source_id")))); recovery_points.setSource_user_id(paramMap.get("source_user_id")==null?null:Integer.valueOf(String.valueOf(paramMap.get("source_user_id")))); recovery_points.setCreate_by(paramMap.get("create_by")==null?null:Integer.valueOf(String.valueOf(paramMap.get("create_by")))); this.addEntity(recovery_points); String sql = "SELECT MAX(recovery_points_id) AS max FROM "+"`recovery_points`"; Integer max = service.selectBaseCount(sql); sql = "UPDATE `student_users` INNER JOIN `recovery_points` ON student_users.student_number=recovery_points.student_number SET student_users.student_points= student_users.student_points + recovery_points.recovery_points WHERE recovery_points.recovery_points_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(); }); RecoveryPoints recovery_points = new RecoveryPoints(); recovery_points.setArea_name(paramMap.get("area_name")==null?null:String.valueOf(paramMap.get("area_name"))); recovery_points.setSite_name(paramMap.get("site_name")==null?null:String.valueOf(paramMap.get("site_name"))); recovery_points.setRegional_users(paramMap.get("regional_users")==null?null:Integer.valueOf(String.valueOf(paramMap.get("regional_users")))); recovery_points.setSite_location(paramMap.get("site_location")==null?null:String.valueOf(paramMap.get("site_location"))); recovery_points.setStudent_name(paramMap.get("student_name")==null?null:String.valueOf(paramMap.get("student_name"))); recovery_points.setStudent_number(paramMap.get("student_number")==null?null:String.valueOf(paramMap.get("student_number"))); recovery_points.setStudent_users(paramMap.get("student_users")==null?null:Integer.valueOf(String.valueOf(paramMap.get("student_users")))); if (paramMap.get("recycling_date" ) != null && !StringUtils.isEmpty(String.valueOf(paramMap.get("recycling_date" )))) { String timStr = String.valueOf(paramMap.get("recycling_date" )); recovery_points.setRecycling_date(parseToTimestamp(timStr)); } else { recovery_points.setRecycling_date(null); } recovery_points.setRecycled_quantity(paramMap.get("recycled_quantity")==null?null:Double.valueOf(String.valueOf(paramMap.get("recycled_quantity")))); recovery_points.setRecycled_items(paramMap.get("recycled_items")==null?null:String.valueOf(paramMap.get("recycled_items"))); recovery_points.setRecovery_points(paramMap.get("recovery_points")==null?null:Double.valueOf(String.valueOf(paramMap.get("recovery_points")))); recovery_points.setSource_table(paramMap.get("source_table")==null?null:String.valueOf(paramMap.get("source_table"))); recovery_points.setSource_id(paramMap.get("source_id")==null?null:Integer.valueOf(String.valueOf(paramMap.get("source_id")))); recovery_points.setSource_user_id(paramMap.get("source_user_id")==null?null:Integer.valueOf(String.valueOf(paramMap.get("source_user_id")))); this.setEntity(queryMap,configMap,recovery_points); 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分别管理前后端依赖。

👇精彩专栏 推荐订阅👇

Java精品项目案例【3000套】

Python精品项目案例【500套】

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

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

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

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

✅获取源码请私信✅

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