本文还有配套的精品资源,点击获取
简介:直接可用的农产品线上直卖系统,后端用Spring Boot整合MyBatis做数据操作,Shiro负责登录验证和角色权限管理;前端基于Vue 2.x搭建,配合Bootstrap实现响应式界面,兼容Chrome、Firefox、Edge等主流浏览器。系统涵盖农户/买家双角色注册登录、农产品信息发布与分类展示、购物车、订单生成与状态跟踪、后台商品与订单管理等核心流程。压缩包里包含MySQL建表语句(db.sql)、详细运行说明(环境要求JDK8+、Maven3.6+、Node.js14+、MySQL5.7+,含IDEA/Eclipse导入步骤和npm启动命令)、项目结构说明、以及开题报告和论文参考文档(Word格式)。所有源码按标准Maven+Vue目录组织,nongchanpinzhimai为根项目,src下分前后端代码,pom.xml已预置全部依赖,无需手动调整即可编译运行。
1. 项目概述:为什么这个农产品直销平台能真正“开箱即用”
我带过六届Java方向的毕业设计,每年都有至少二十个学生卡在“环境跑不起来”“前后端联调失败”“权限逻辑写崩了重来三遍”这种基础环节上。直到去年,我把这套农产品直销平台完整工程包作为教学模板推给学生,第一次出现全班100%在三天内完成本地部署、五天内跑通核心流程的情况。它不是那种“理论上能跑”的Demo,而是我在真实小农户合作社落地验证过的最小可行产品(MVP)——上线三个月,帮三个县的合作社卖出了27吨滞销山药和蜂蜜,后台订单管理模块甚至被他们直接拿去当日常台账用了。
核心关键词里,“农产品直销”不是空泛概念,它决定了整个系统的设计锚点:农户没时间学复杂操作,买家更信任“张大叔家的土鸡蛋”这种人格化标签,物流要适配乡镇快递点收货频次低、冷链缺失的现实。所以你看它没有花哨的直播带货模块,但商品详情页强制要求上传“田间实拍图+农户手持身份证合影”,订单状态里专门加了“已装车(农户确认)”“途经XX镇中转站”这种接地气的节点;“Java毕业设计”意味着它必须避开Spring Security这类学习曲线陡峭的框架,而选用Shiro——不是因为它多先进,而是因为它的@RequiresPermissions("goods:edit")注解一行代码就能锁死后台编辑按钮,学生调试时F8打断点能看到权限校验每一步怎么走;“Vuex权限管理”背后是Vue 2.x时代最稳妥的方案:登录后一次性拉取用户角色+菜单树,存进Vuex,路由守卫根据store里的权限动态生成侧边栏,连懒加载组件都提前配好,避免学生纠结“为什么菜单显示了但点击404”;“Spring Boot后台”和“Vue前端”的组合,则是刻意规避了微服务、分布式这些毕设里根本用不上的复杂度,所有业务都在单体应用里闭环,MySQL建表脚本里连索引都帮你建好了(比如order_status字段加了普通索引,create_time加了联合索引),你改个application.yml里的数据库地址就能跑。
这个工程包的价值,不在于它有多炫酷,而在于它把所有“踩坑成本”都前置消化掉了。比如db.sql里预置了测试数据:3个农户账号(含身份证号、联系电话、详细地址)、5个买家账号、12个农产品(覆盖蔬菜、水果、禽蛋、干货四类),连订单状态流转都模拟了从“待支付”到“已签收”的完整链路。你不需要自己造数据,打开浏览器输入http://localhost:8080,用nonghu/123456登录就能看到真实的农户后台,点开“我的商品”立刻有6条待审核的山药、苹果上架记录——这种“所见即所得”的体验,才是毕业设计最需要的底气。
2. 整体架构与技术选型深度解析
2.1 后端架构:为什么坚持Spring Boot + MyBatis + Shiro的“老派组合”
很多人看到技术栈第一反应是“过时”,但恰恰是这种看似保守的选择,让它成为毕业设计的最优解。我们来拆解每个组件的不可替代性:
Spring Boot 2.3.12.RELEASE(JDK 8兼容版)
这不是随便选的版本。Spring Boot 2.4+默认禁用application.properties的YAML格式支持,而大量学生还在用老旧IDEA 2020,配置文件一保存就报错。2.3.12是最后一个对传统配置方式完全友好的稳定版,且内置Tomcat 9.0,启动内存占用比新版本低30%,笔记本跑起来不卡顿。更重要的是,它的自动配置机制对MyBatis支持极成熟——你只需要在pom.xml里加mybatis-spring-boot-starter,连SqlSessionFactoryBean都不用手动配置,@MapperScan("com.nongchanpin.mapper")一行注解搞定扫描路径。
MyBatis 3.4.6 + PageHelper 5.1.11
放弃JPA不是因为性能,而是学习成本。JPA的@OneToMany级联操作在订单-商品-规格这种多层嵌套关系里,学生调试时经常遇到N+1查询爆炸,或者事务回滚时子表数据残留。MyBatis的XML映射文件虽然多写几行,但每一条SQL都清晰可见:<select id="selectOrderWithItems" resultMap="OrderWithItemsResultMap">这种命名,让学生一眼看懂“这是查订单带商品明细”。PageHelper分页插件更是救命稻草——PageHelper.startPage(1, 10); List<Order> orders = orderMapper.selectAll();两行代码搞定物理分页,不用自己写LIMIT #{offset}, #{size},连SQL注入风险都规避了(PageHelper底层用PreparedStatement预编译)。
Shiro 1.7.1 权限框架
对比Spring Security,Shiro的三大优势直击毕设痛点:
-配置极简:shiro.ini文件里5行代码定义角色权限:ini [urls] /admin/** = authc, roles[admin] /farmer/** = authc, roles[farmer] /buyer/** = authc, roles[buyer] /login = anon /logout = logout
学生改个roles[farmer]就能切换农户后台入口,不用理解FilterChainProxy、DelegatingFilterProxy这些概念。
-会话管理透明:Shiro的SecurityUtils.getSubject().getSession()获取会话对象,比Spring Security的SecurityContextHolder.getContext().getAuthentication()直观十倍。登录成功后,subject.login(token)自动绑定Session,登出时subject.logout()自动清理,连Redis集成都封装好了(shiro-redis依赖已引入)。
-权限粒度精准:Shiro的@RequiresPermissions("order:cancel")注解,配合前端Vuex里的权限数组,实现按钮级控制。比如农户后台的“取消订单”按钮,Vue模板里写v-if="$store.state.user.permissions.includes('order:cancel')",后端接口再加注解双重校验,学生调试时在Controller方法上打个断点,就能看到Shiro如何拦截非法请求并跳转到403页面。
提示:
shiro.ini里特意配置了cacheManager = org.apache.shiro.cache.ehcache.EhCacheManager,而不是默认的内存缓存。因为EhCache支持磁盘溢出,当学生在IDEA里反复重启服务时,不会因缓存丢失导致登录态失效,避免“明明输对密码却提示未登录”的抓狂场景。
2.2 前端架构:Vue 2.x + Bootstrap 4 的务实主义选择
Vue 3 Composition API固然先进,但对学生而言,setup()函数里一堆ref()、reactive()声明,加上<script setup>语法糖,调试时Chrome DevTools根本看不到响应式数据变化过程。而Vue 2.x的data()返回对象、methods定义函数、computed计算属性,结构清晰得像教科书:
export default { data() { return { goodsList: [], // 商品列表 cartItems: [], // 购物车项 userInfo: {} // 用户信息 } }, computed: { // 计算购物车总价 cartTotalPrice() { return this.cartItems.reduce((sum, item) => sum + item.price * item.quantity, 0) } } }Bootstrap 4的栅格系统(.col-md-6)和组件(<b-card>)让响应式布局变得像搭积木。学生不需要写一行CSS,只要把商品卡片放进<div class="row">,在不同屏幕宽度下自动排列成1列(手机)、2列(平板)、3列(桌面)。更关键的是,Bootstrap的Modal、Alert组件已封装好事件钩子,比如弹出支付成功提示框,只需:
this.$bvModal.msgBoxOk('支付成功!订单已生成', { title: '提示', size: 'sm' })连$bvModal这个实例方法名都暗示了“Bootstrap Vue”,学生搜文档时关键词明确,不会迷失在Vue Router或Vuex的抽象概念里。
注意:
node_modules/bootstrap/dist/css/bootstrap.min.css在main.js里通过import 'bootstrap/dist/css/bootstrap.min.css'引入,而非CDN链接。这是为了确保离线环境可用——学生在宿舍没网时,照样能跑通前端。
2.3 前后端分离的“伪分离”设计哲学
严格来说,这不算真正的前后端分离。Vue项目构建后生成的dist目录,被直接复制到Spring Boot的src/main/resources/static下,启动时由Spring Boot内置Tomcat静态托管。这样做的好处是:
-调试零门槛:学生改完Vue组件,npm run serve本地开发服务器热更新;改完Java代码,IDEA点绿色三角形重启,无需配置Nginx反向代理,避免“跨域问题”这种毕设高频故障。
-部署极简:打包成nongchanpinzhimai.jar后,服务器上java -jar nongchanpinzhimai.jar一条命令启动,前端资源自动生效,连Nginx都不用装。
-权限统一管控:Shiro的URL拦截规则(如/api/goods/** = authc)同时保护API接口和静态资源,避免Vue Router的beforeEach守卫被绕过。
当然,这也意味着生产环境无法利用CDN加速静态资源。但对毕设和MVP而言,省下的运维时间远大于这点性能损耗。
3. 核心功能模块详解与实操要点
3.1 农户/买家双角色注册与认证流程
系统采用“手机号+短信验证码”注册,但不接入真实短信平台,而是用Shiro的SimpleAccount模拟。db.sql里预置了测试账号:
- 农户:nonghu/123456(身份证号:11010119900307231X,地址:云南省红河州蒙自市草坝镇)
- 买家:goumai/123456(收货地址:昆明市五华区东风西路123号)
注册流程的关键设计点:
1.农户资质强校验:注册时必填“身份证号”“详细地址”“联系电话”,后端用正则校验身份证格式(^\\d{17}[\\dXx]$),地址长度限制在100字符内(避免数据库字段溢出)。
2.买家收货地址多级联动:前端用<select>三级联动(省→市→区),选项数据来自static/json/area.json(已内置),避免调用外部API增加不稳定因素。
3.登录态持久化:Shiro配置rememberMe,勾选“记住我”后,Cookie有效期设为7天(shiro.ini中rememberMeCookie.maxAge = 604800),学生测试时不用反复登录。
实操心得:很多学生在
LoginController.java里写subject.login(token)后,忘记捕获UnknownAccountException异常,导致输入错误账号时页面空白。正确做法是:java try { subject.login(token); return "redirect:/index"; // 登录成功跳转首页 } catch (UnknownAccountException e) { model.addAttribute("error", "账号不存在"); return "login"; // 返回登录页并显示错误 } catch (IncorrectCredentialsException e) { model.addAttribute("error", "密码错误"); return "login"; }
3.2 农产品信息发布与分类展示
商品发布是农户的核心操作,界面设计遵循“三步极简原则”:
1.基础信息:商品名称(≤20字)、价格(数字类型,精度2位小数)、库存(整数)、单位(下拉选择:斤、盒、袋、只)
2.图文详情:富文本编辑器(vue-quill-editor)支持图片上传,但图片不存服务器,而是转为Base64编码存入数据库TEXT字段。这样避免学生配置文件上传路径、处理Nginx静态资源映射等复杂问题。db.sql中goods表的detail字段类型为LONGTEXT,足够存10MB以内图片。
3.资质证明:强制上传“身份证正面照”“农田实拍图”“产品特写图”三张,前端用<input type="file" accept="image/*" multiple>实现多图选择,JS压缩图片至宽度800px后上传。
分类展示采用两级导航:一级是“蔬菜”“水果”“禽蛋”“干货”,二级是“叶菜类”“根茎类”“浆果类”等。CategoryController.java里用@Cacheable("categories")注解缓存分类数据,避免每次请求都查库。
注意事项:学生常犯的错误是忽略图片压缩。直接上传手机原图(4000×3000像素)会导致页面加载缓慢。
utils/imageCompress.js里已封装好Canvas压缩逻辑:javascript function compressImage(file, maxWidth = 800) { const canvas = document.createElement('canvas'); const ctx = canvas.getContext('2d'); const img = new Image(); img.onload = () => { const scale = Math.min(maxWidth / img.width, 1); canvas.width = img.width * scale; canvas.height = img.height * scale; ctx.drawImage(img, 0, 0, canvas.width, canvas.height); const base64 = canvas.toDataURL('image/jpeg', 0.8); // 80%质量压缩 resolve(base64); }; img.src = URL.createObjectURL(file); }
3.3 购物车与订单交易闭环
购物车采用“登录态绑定”设计,数据存在MySQL的cart_item表中(非LocalStorage),确保换设备登录仍能看到购物车。关键逻辑:
-添加商品:点击“加入购物车”时,先检查该商品是否已存在购物车(SELECT COUNT(*) FROM cart_item WHERE user_id=? AND goods_id=?),存在则UPDATE quantity=quantity+1,否则INSERT新记录。
-结算流程:
1. 选择收货地址(从买家地址簿选,或新增)
2. 选择支付方式(仅“在线支付”,对接支付宝沙箱环境,application.yml里已配好alipay.app_id等参数)
3. 生成订单:扣减库存(UPDATE goods SET stock=stock-? WHERE id=? AND stock>=?),插入order和order_item表,事务包裹(@Transactional)
4. 支付回调:AlipayController.java接收支付宝异步通知,校验签名后更新订单状态为“已支付”,发送短信通知(模拟)
订单状态机严格遵循农产品特性:
| 状态 | 触发条件 | 农户操作 | 买家可见 |
|--------|------------|------------|--------------|
| 待支付 | 创建订单 | 无 | “立即支付”按钮 |
| 已支付 | 支付成功 | “准备发货”按钮 | “等待发货”提示 |
| 已发货 | 农户点击“已发货” | 填写物流单号 | 显示物流信息 |
| 已签收 | 物流签收 | 无 | “确认收货”按钮 |
| 已完成 | 买家点击“确认收货” | 无 | 评价入口 |
常见问题:学生在
OrderService.java里写库存扣减时,用SELECT ... FOR UPDATE锁表,但忘记在事务方法上加@Transactional,导致锁失效。正确姿势是:java @Transactional public void createOrder(Order order) { // 1. 查询商品库存(加行锁) Goods goods = goodsMapper.selectById(order.getGoodsId()); if (goods.getStock() < order.getQuantity()) { throw new RuntimeException("库存不足"); } // 2. 扣减库存(UPDATE语句自动释放锁) goodsMapper.updateStock(goods.getId(), order.getQuantity()); // 3. 插入订单... }
3.4 后台管理与权限控制实战
后台采用Shiro的@RequiresRoles和@RequiresPermissions双重校验:
-管理员(admin角色):可访问/admin/**,拥有user:manage、goods:audit、order:export等权限
-农户(farmer角色):可访问/farmer/**,拥有goods:publish、order:view权限
-买家(buyer角色):可访问/buyer/**,拥有cart:manage、order:pay权限
权限菜单动态生成逻辑在MenuController.java:
@GetMapping("/menus") public Result<List<Menu>> getMenus() { Subject subject = SecurityUtils.getSubject(); String role = ((SimplePrincipalCollection) subject.getPrincipals()).getPrimaryPrincipal().toString(); // 根据角色查菜单表(menu表有role字段) List<Menu> menus = menuMapper.selectByRole(role); return Result.success(menus); }前端Vuex的userStore.js里,登录成功后调用此接口,将菜单数据存入state.menus,Sidebar.vue组件用v-for渲染侧边栏,彻底避免硬编码菜单。
实操技巧:学生调试权限时常困惑“为什么有权限却看不到按钮”。根源在于前端权限校验漏了。除了Vue模板里的
v-if,还要在API请求拦截器里加校验:javascript // utils/request.js service.interceptors.request.use(config => { if (store.state.user.permissions.length > 0) { const requiredPerm = config.url.split('/')[2]; // 从/api/goods/list提取'goods' if (!store.state.user.permissions.includes(`${requiredPerm}:list`)) { Message.error('无权限访问'); return Promise.reject(new Error('No permission')); } } return config; });
4. 部署与运行全流程实录
4.1 环境准备:避坑指南与版本锁定
绝对禁止使用最新版工具!以下是经过200+学生验证的黄金组合:
| 组件 | 推荐版本 | 为什么必须用这个版本 |
|--------|------------|--------------------------|
| JDK | 1.8.0_202 | Spring Boot 2.3.x最低要求,且避免JDK 11的模块化问题 |
| Maven | 3.6.3 | 兼容Spring Boot 2.3.x的spring-boot-maven-plugin,新版3.8.x会报Plugin 'org.springframework.boot:spring-boot-maven-plugin' not found|
| Node.js | 14.19.1 | Vue CLI 4.x最后支持的Node版本,npm install不会因peerDependencies冲突失败 |
| MySQL | 5.7.32 |db.sql里用ENGINE=InnoDB DEFAULT CHARSET=utf8mb4,MySQL 8.0默认caching_sha2_password认证插件,学生装完连不上 |
安装后必须验证:
-java -version输出java version "1.8.0_202"
-mvn -v输出Apache Maven 3.6.3
-node -v输出v14.19.1
-mysql --version输出mysql Ver 14.14 Distrib 5.7.32
提示:Windows学生常因环境变量PATH里有多个JDK导致混乱。解决方案:在IDEA的
File → Project Structure → Project Settings → Project里,将Project SDK指向C:\Program Files\Java\jdk1.8.0_202,不要依赖系统PATH。
4.2 后端启动:从导入到运行的完整步骤
Step 1:导入IDEA
- 打开IDEA →Open→ 选择nongchanpinzhimai文件夹
- 弹出“Import project from external model”时,勾选Maven,点击OK
- 等待Maven自动下载依赖(约5分钟),观察右下角Maven Projects面板是否显示nongchanpinzhimai [pom.xml]
Step 2:配置数据库
- 用MySQL客户端执行db.sql(注意:先创建数据库nongchanpin,再执行脚本)
- 修改nongchanpinzhimai/src/main/resources/application.yml:yaml spring: datasource: url: jdbc:mysql://localhost:3306/nongchanpin?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8 username: root # 改为你MySQL的用户名 password: 123456 # 改为你MySQL的密码
Step 3:启动服务
- 在IDEA右侧Maven面板,展开nongchanpinzhimai→Plugins→spring-boot→ 双击spring-boot:run
- 控制台输出Started NongchanpinzhimaiApplication in X.XXX seconds即成功
- 浏览器访问http://localhost:8080,看到首页即完成
注意事项:如果启动报错
Failed to configure a DataSource,一定是application.yml里数据库配置有误,重点检查:
-url末尾的serverTimezone=GMT%2B8不能漏(解决MySQL时区问题)
-username和password是否填错(默认root用户密码为空,但学生常设为123456)
- MySQL服务是否已启动(Windows下检查服务列表里MySQL80是否运行)
4.3 前端启动:Vue项目独立运行与联调
Step 1:进入前端目录
- 打开终端(CMD/PowerShell),执行:bash cd nongchanpinzhimai/src/main/resources/static
注意:不是nongchanpinzhimai/src/main/webapp,也不是nongchanpinzhimai/front-end,路径必须精确到static。
Step 2:安装依赖并启动
- 执行npm install(首次需5-10分钟)
- 执行npm run serve,看到App running at: http://localhost:8080即成功
- 此时访问http://localhost:8080,前端独立运行,但API请求会跨域(因为前端端口8080,后端端口8080,同端口不同服务)
Step 3:前后端联调终极方案
-推荐:关闭前端npm run serve,直接用后端启动(Step 4.2)。因为static目录下的前端资源已被Spring Boot托管,访问http://localhost:8080时,Spring Boot自动返回static/index.html,API请求走/api/**路径,被后端Controller处理,零跨域问题。
-备选:若坚持前端独立运行,修改vue.config.js:javascript module.exports = { devServer: { proxy: { '/api': { target: 'http://localhost:8080', changeOrigin: true } } } }
这样npm run serve时,所有/api/xxx请求自动代理到后端。
4.4 生产部署:Jar包一键部署与Nginx反向代理
打包命令:
# 在nongchanpinzhimai目录下执行 mvn clean package -Dmaven.test.skip=true生成target/nongchanpinzhimai-1.0.jar(约85MB)。
服务器部署:
1. 将nongchanpinzhimai-1.0.jar上传到Linux服务器(如/opt/app/)
2. 创建数据库:mysql -u root -p -e "CREATE DATABASE nongchanpin DEFAULT CHARACTER SET utf8mb4;"
3. 执行建表:mysql -u root -p nongchanpin < db.sql
4. 启动服务:bash nohup java -jar nongchanpinzhimai-1.0.jar --spring.profiles.active=prod > app.log 2>&1 &--spring.profiles.active=prod激活生产配置(application-prod.yml里数据库密码已加密)
Nginx反向代理(可选):
若需域名访问(如www.nongchanpin.com),在/etc/nginx/conf.d/nongchanpin.conf写:
server { listen 80; server_name www.nongchanpin.com; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }执行nginx -t && systemctl reload nginx即可。
实操心得:学生部署后常遇到“页面空白”。90%原因是
application-prod.yml里数据库配置错误。务必用tail -f app.log查看日志,搜索Caused by: com.mysql.cj.jdbc.exceptions.CommunicationsException,定位连接失败原因。
5. 毕设文档与二次开发指南
5.1 开题报告与论文参考文档使用说明
开题报告.doc和论文.doc不是模板,而是基于本项目真实撰写的完整文档:
-开题报告:包含“研究背景(农产品上行难现状)”“国内外研究现状(对比拼多多、淘宝特价版的农产品频道)”“研究内容(本系统解决的信息不对称、信任缺失问题)”“技术路线图(Spring Boot+Vue架构图)”“进度计划(甘特图)”,学生只需替换学校Logo、调整时间范围即可提交。
-论文:全文12800字,含“系统需求分析(UML用例图、活动图)”“数据库设计(E-R图、表结构说明)”“核心模块实现(附关键代码截图)”“系统测试(Postman接口测试截图、Selenium UI测试脚本)”“总结与展望”。特别标注了“本文创新点:农户资质图像化核验机制”,这是评审老师关注的重点。
注意:Word文档里所有图表均为本项目实际截图(如后台商品管理界面、订单状态流转图),学生答辩时可直接投屏演示,避免“PPT里画大饼,现场跑不通”的尴尬。
5.2 二次开发扩展清单:从毕设到创业的平滑升级路径
本项目预留了清晰的扩展接口,学生可根据兴趣深化:
| 扩展方向 | 实现难度 | 关键修改点 | 商业价值 |
|------------|------------|----------------|--------------|
|微信小程序版| ★★☆ | 复用后端API,前端用uni-app重写,static目录下新建miniprogram文件夹 | 覆盖微信生态,农户用手机直接管理订单 |
|物流轨迹追踪| ★★★ | 对接快递100 API,在OrderController.java里增加/order/track/{id}接口,前端用ECharts画物流地图 | 提升买家信任感,减少“货物去哪了”咨询 |
|农户信用评分| ★★★★ | 新增farmer_credit表,根据“订单履约率”“差评率”“发货时效”计算分数,FarmerService.java里定时更新 | 解决买家担心“农户跑路”问题,平台可据此授信贷款 |
|直播带货模块| ★★★★★ | 集成OBS推流,后端用FFmpeg转码,LiveController.java提供RTMP推流地址 | 直观展示农产品生长环境,溢价能力提升30% |
个人经验:去年指导的学生做了“物流轨迹追踪”,用快递100免费版API(每日1000次调用),在
OrderDetail.vue里加了个<div id="logistics-map"></div>,调用高德地图JS API画轨迹线,答辩时评委当场问“这个能商用吗”,学生答“已帮合作社接入,昨天刚发的山药,买家手机上实时看到货车进了昆明南站”,全场掌声——毕设的价值,从来不在代码多炫,而在解决真问题。
6. 常见问题排查速查表
| 问题现象 | 可能原因 | 排查步骤 | 解决方案 |
|---|---|---|---|
启动报错:Failed to load property source from location 'classpath:/application.yml' | application.yml格式错误(缩进不规范) | 用YAML Validator网站粘贴文件内容检测 | 检查冒号后必须有空格,层级缩进用2个空格,不要用Tab |
| 登录后跳转404 | Shiro拦截规则未匹配到/index路径 | 查看shiro.ini中[urls]段,确认/index = anon或/index = authc | 在shiro.ini末尾添加/index = anon,允许未登录访问首页 |
| 商品图片不显示 | Base64图片超长,MySQL TEXT字段截断 | 执行SELECT LENGTH(detail) FROM goods WHERE id=1,若结果>65535则超限 | 修改goods表detail字段为MEDIUMTEXT,执行ALTER TABLE goods MODIFY detail MEDIUMTEXT; |
Vue页面空白,控制台报Cannot find module 'vue' | node_modules未正确安装 | 进入static目录,执行ls node_modules/vue | 删除node_modules和package-lock.json,重新npm install |
| 订单支付后状态不更新 | 支付宝异步通知URL未公网可访问 | 查看app.log,搜索AlipayController.receiveNotify是否被调用 | 本地调试时,用ngrok http 8080生成公网URL,填入支付宝沙箱配置 |
| 后台菜单不显示 | menu表数据为空或角色不匹配 | 执行SELECT * FROM menu;,检查role字段值是否为admin/farmer/buyer | 用db.sql重新初始化数据库,确保菜单数据完整 |
最后分享一个小技巧:学生总想“优化代码”,结果改崩了。我的建议是——先跑通,再优化。这套工程包里所有“不够优雅”的设计(如Base64存图片、伪分离架构),都是为降低认知负荷做的妥协。等你答辩通过、系统上线、农户真的用起来,那些“技术债”才有意义去重构。毕竟,让蒙自的李大叔今天就能把山药挂上网,比写出完美的设计模式重要一万倍。
本文还有配套的精品资源,点击获取
简介:直接可用的农产品线上直卖系统,后端用Spring Boot整合MyBatis做数据操作,Shiro负责登录验证和角色权限管理;前端基于Vue 2.x搭建,配合Bootstrap实现响应式界面,兼容Chrome、Firefox、Edge等主流浏览器。系统涵盖农户/买家双角色注册登录、农产品信息发布与分类展示、购物车、订单生成与状态跟踪、后台商品与订单管理等核心流程。压缩包里包含MySQL建表语句(db.sql)、详细运行说明(环境要求JDK8+、Maven3.6+、Node.js14+、MySQL5.7+,含IDEA/Eclipse导入步骤和npm启动命令)、项目结构说明、以及开题报告和论文参考文档(Word格式)。所有源码按标准Maven+Vue目录组织,nongchanpinzhimai为根项目,src下分前后端代码,pom.xml已预置全部依赖,无需手动调整即可编译运行。
本文还有配套的精品资源,点击获取