ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Spring Boot旅游网站从零部署到上线:框架选型、数据库设计与MinIO集成全解析

Spring Boot旅游网站从零部署到上线:框架选型、数据库设计与MinIO集成全解析 一个Spring Boot旅游网站能从零搭到上线其实核心就那几件事框架选型、数据库设计、文件存储、部署调试。我用一个实际做过的“Springboot旅游网站o2j3b”项目来讲讲完整链路从开发环境搭建到最终部署上线再说说那些文档里不会写、但实测特别坑的细节。这篇文章既适合刚入手Spring Boot的学生朋友做课程设计参考也适合工作中被安排做类似业务系统的开发者抄作业。1. 内容整体设计与思路拆解1.1 这个旅游网站到底在做什么先把这个项目拆开看。标题里带“o2j3b”这是典型的自动生成项目代号不代表任何业务含义不用纠结。真正的核心是一个基于Spring Boot的旅游信息管理平台。通常这类系统包含前台展示和后台管理两大块前台面向普通游客提供景点列表、旅游攻略、线路推荐、特价活动展示这些内容后台面向管理员负责景点信息维护、用户订单管理、评论审核、公告发布等操作。我拿到这类项目需求时第一件事不是急着写代码而是把业务实体理清楚。旅游网站最少涉及这么几张核心表用户表普通游客和管理员、景点分类表、景点信息表、旅游线路表、订单表、评论表、公告表。如果再扩展一点还可以加收藏表、酒店表、导游表。表设计得好不好直接决定后面增删改查的复杂度。为什么选Spring Boot因为它极大地降低了Spring配置的繁琐程度。以前用Spring写一个HTTP接口要配一堆XML文件现在Spring Boot用自动配置加约定优于配置一个SpringBootApplication注解就能跑起来一个Web服务。尤其是做课程设计或者小团队内部项目时Spring Boot自带的Tomcat内嵌容器不需要单独装Tomcat打包成Jar直接java -jar就能运行这点太省事了。数据库方面我建议用MySQL 5.7或8.0。免费、社区活跃、官方文档全而且市面上绝大多数教程资料都基于MySQL出问题容易搜到答案。如果你只是本地测试不想装MySQL也可以用H2或SQLite先顶着但最终交付我建议还是回归MySQL因为导出数据、备份恢复、团队协作都正规得多。1.2 技术栈选型的几个避坑理由很多人写旅游网站项目喜欢堆技术今天加个Redis明天加个Elasticsearch后天再上个消息队列。我不能说这些技术没用但对于标题这个量级的项目来说过度设计等于给自己挖坑。我建议的核心技术栈是Spring Boot 2.7.x、MyBatis-Plus、MySQL 8.0、Thymeleaf或Vue前后端分离看需求、Bootstrap、Maven。Spring Boot版本这里特别强调一下。Spring Boot 3.x已经出了但如果你用的JDK是8千万不要选3.x因为Spring Boot 3强制要求JDK 17以上否则启动直接报UnsupportedClassVersionError。很多同学从网上下了一个新项目结果本地JDK版本不对跑来问我怎么配置其实十有八九是版本匹配问题。我的经验是课程设计和企业小项目老老实实用Spring Boot 2.7.18这是2.x系列的最后一个版本稳定且资料多。数据库访问层我首选MyBatis-Plus而不是原生MyBatis也不是JPA。原因很简单MyBatis-Plus内置了常用的单表CRUD方法你不需要写一堆重复的XML映射文件一张实体类加一个Mapper接口就能直接调用selectById、selectList、insert这些方法。对于业务逻辑不复杂的旅游网站来说这就够了。等以后业务复杂了它也能让你照样写自定义SQL灵活度不丢。文件存储这里要专门说因为标题相关热搜词里出现了“minio加入到springboot”。旅游网站难免要上传景点图片、轮播图、攻略封面如果直接把文件存到服务器的某个目录下面部署时文件和代码混在一起迁移和备份都很痛苦。专业的做法是把文件放到对象存储服务中。MinIO就是一个开源的对象存储服务完全兼容亚马逊S3 API可以部署在自己服务器上。Spring Boot集成MinIO的方式很简单引入minio依赖配置endpoint、accessKey、secretKey然后用MinioClient来做文件上传和下载。我用MinIO做过几次图片存储后最大的感受是部署到云服务器后图片域名和业务域名可以分离减少主服务器带宽压力而且MinIO自带Web管理界面文件列表一目了然。当然如果学校或者公司没有额外服务器部署MinIO也可以退一步用本地磁盘存储加Nginx映射静态资源但那样每次迁移都要手动拷图片目录体验很差。为什么强调这些选型决策因为很多人做项目失败不是输在编码而是输在一开始的技术选型。选型错了后面越写越别扭改来改去时间全浪费了。2. 核心细节解析与实操要点2.1 数据库表设计的关键细节数据库是一个网站系统的地基。旅游网站的表设计我给出一个通用参考实际项目可以根据需求增删字段。用户表user主键id、用户名、密码加密存储、昵称、手机号、邮箱、头像、角色普通用户/管理员、注册时间、状态。密码绝对不能明文存用Spring Security自带的BCrypt加密或者用MD5加盐也行我建议前者。景点分类表category主键id、分类名称、排序、状态、创建时间。这个表不要设计得太复杂就做一级分类就行旅游景点的二级分类通常意义不大。景点信息表scenic主键id、所属分类id、景点名称、景点简介、详细介绍富文本、封面图URL、详情图列表JSON字符串存储、地址、开放时间、门票价格、评分、浏览量、状态、创建时间。订单表orders主键id、订单编号、用户id、景点id、数量、总金额、下单时间、支付状态、订单状态待支付/已支付/已取消/已完成。评论表comment主键id、用户id、景点id、评论内容、评分、回复上级评论id、评论时间、状态。公告表notice主键id、标题、内容、创建时间、状态。这个设计里有一个细节值得展开详情图列表为什么用JSON字符串存因为一张景点详情可能需要多张图片如果单独建一张子表每次查询都要多一次关联如果直接用一个字段存JSON数组查询时把字符串解析一下就行。数据量不大、结构又简单的场景下这种“偷懒”方案反而好用。另一个细节是订单编号。不要用数据库自增id当订单号因为用户下单后会把订单号发给平台客服自增id容易暴露订单量而且不美观。我习惯用时间戳加随机数生成订单编号比如20250307093015421格式是年月日时分秒加四位随机数简易且够用。2.2 Spring Boot项目搭建和配置要点项目骨架用Spring Initializr生成最省事。IDEA里面新建项目时直接选Spring Initializr或者到start.spring.io网站打包下载再导入IDEA。需要注意的一点是Spring Initializr默认会选择最新稳定版Spring Boot如果你要用JDK 8记得手工改成2.7.x。生成项目后先在pom.xml里补充依赖。我每次必加的东西包括spring-boot-starter-web、spring-boot-starter-thymeleaf、mybatis-plus-boot-starter、mysql-connector-java新版是com.mysql:mysql-connector-j、lombok、spring-boot-starter-validation。如果你的系统需要登录鉴权可以加Spring Security如果只是简单用Interceptor做登录拦截也可以不引入Spring Security避免配置复杂度上升。配置文件我习惯用application.yml而不是application.properties因为YAML层级清晰写多数据源或者自定义配置时更容易阅读。一个最小可用的配置大致是server: port: 8080 servlet: context-path: / spring: datasource: url: jdbc:mysql://localhost:3306/travel_db?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver thymeleaf: cache: false mybatis-plus: mapper-locations: classpath:/mapper/**/*.xml configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl这里有一个特别容易踩的坑数据库连接的serverTimezone参数不设置时老版本MySQL驱动会报时区异常。另外如果从网上下载的项目是5.x驱动要注意driver-class-name是com.mysql.jdbc.Driver而8.x驱动是com.mysql.cj.jdbc.Driver别搞混。配置过程中我还遇到过JDK和Maven不匹配导致构建失败的情况。Maven从3.6升级到3.8后对JDK的默认支持也有变化。如果发现编译报错先检查Maven编译插件版本把maven-compiler-plugin的source和target设成和JDK版本一致。这个破问题困扰了我一下午最后发现是pom.xml里没显式声明编译版本导致默认编译级别对不上。解决办法是在pom.xml里加上properties java.version1.8/java.version maven.compiler.source1.8/maven.compiler.source maven.compiler.target1.8/maven.compiler.target /properties2.3 前后端数据交互的常见坑旅游网站如果采用前后端分离模式Vue打包后放进Spring Boot的src/main/resources/static目录下这是一个热搜里出现的操作。做法是Vue项目执行npm run build生成dist目录把里面的内容复制到Spring Boot的static目录然后重启后端服务访问http://localhost:8080/就能看到页面。这里有几个注意点。第一Vue的router如果使用history模式刷新页面会出现404因为Spring Boot默认没有把前端路由转发到index.html。解决办法是写一个转发Controller把非API路径统统转发Controller public class PageForwardController { RequestMapping(value {/, /index, /scenic/**, /orders/**, /user/**}) public String forward() { return forward:/index.html; } }第二Vue打包后JavaScript文件路径默认是绝对路径/js/...如果你的项目部署在子路径要做publicPath配置。第三API请求的跨域问题在Spring Boot里加一个WebMvcConfigurer实现类重写addCorsMappings方法即可。当然如果不用前后端分离直接用Thymeleaf渲染页面就不存在跨域问题开发和部署都更简单。对于以单人开发为主的项目我一直建议先用服务端渲染把核心业务跑通后再考虑拆分前端。3. 实操过程与核心环节实现3.1 从零开始搭建开发环境先说本地开发环境的准备。JDK 8、Maven 3.6、MySQL 5.7、IDEA 2020这套组合是我反复验证过的稳定组合。Windows用户下载JDK时记得选对应架构的安装包装好后在环境变量里配JAVA_HOME和Path。配好后打开命令行输入java -version验证能输出版本信息就说明没问题。Maven安装后要换镜像源不然下载依赖能慢到怀疑人生。打开conf/settings.xml找到mirrors标签加入阿里云镜像mirror idaliyunmaven/id mirrorOfcentral/mirrorOf namealiyun maven mirror/name urlhttps://maven.aliyun.com/repository/public/url /mirrorMySQL安装时建议把字符集设置成utf8mb4因为utf8mb4能存表情符号而UTF8字符集在MySQL里是3字节存不了emoji。虽然网站本身不一定需要emoji但保险起见还是用utf8mb4。数据库工具我推荐DbVisualizer或者Navicat热搜里提到的“dbx数据库工具”我不太熟但只要是支持图形化建表、执行SQL的工具都行。我自己平时就用Navicat导数据、看ER图方便得很。开发环境建好后创建一个数据库travel_db然后把SQL脚本导入。SQL脚本从哪里来如果项目自带源码数据库文件直接用导入功能即可。如果是自己从零开发就按前面说的表结构在Navicat里可视化建表然后让Navicat帮你生成SQL脚本保存起来方便后续交接。标题里说的“源码数据库调试部署”指的就是这套交付物后端源码工程、数据库初始化脚本、部署文档。3.2 核心业务功能怎么落地拿旅游网站最核心的功能举例写一个景点分页列表的完整实现。第一步在Scenic实体类上加上MyBatis-Plus注解Data TableName(scenic) public class Scenic { TableId(type IdType.AUTO) private Long id; private Long categoryId; private String name; private String intro; private String detail; private String cover; private String images; private String address; private String openTime; private BigDecimal price; private Double score; private Long viewCount; private Integer status; private LocalDateTime createTime; }第二步Mapper接口继承BaseMapperScenic什么方法都不用写。第三步Service层继承ServiceImplScenicMapper, Scenic然后写一个自定义查询Override public PageScenic pageScenic(PageScenic page, String keyword, Long categoryId) { LambdaQueryWrapperScenic wrapper new LambdaQueryWrapper(); wrapper.like(StringUtils.hasText(keyword), Scenic::getName, keyword) .eq(categoryId ! null, Scenic::getCategoryId, categoryId) .eq(Scenic::getStatus, 1) .orderByDesc(Scenic::getViewCount); return baseMapper.selectPage(page, wrapper); }第四步Controller接收参数返回数据。这个流程里我重点解释一下LambdaQueryWrapper的好处它是类型安全的查询条件构造器字段名用方法引用表示不会有手写字符串写错的风险。比如你不小心把view_count写成viewcount编译期根本看不出来运行期才报错而LambdaQueryWrapper直接把字段和实体属性绑定编译期间就能发现属性名错误。分页参数怎么从前端传过来我没有用传统pageNum和pageSize而是让前端传current和size配合MyBatis-Plus的Page对象直接从请求参数里绑定代码少写不少。如果前端要的是pageNum风格你自己在Controller里做一层参数转换即可。订单模块还有一个必写的逻辑下订单时先查库存或状态。旅游景点票务虽然没有实物库存那么复杂但是要防止用户重复下单。我的做法是用户提交订单时先用用户id和景点id查一下有没有未支付订单如果存在提示“您还有待支付的订单”如果不存在再新增订单。这个判断虽然简单但能挡住绝大多数误操作。3.3 图片上传与MinIO集成图片上传功能是旅游网站的高频功能我把MinIO集成过程完整说一遍。先到项目官网下载MinIO服务器端Windows直接下载exe文件Linux下载rpm或二进制文件。我常用的是docker部署docker run -p 9000:9000 -p 9001:9001 \ --name minio \ -v /data/minio/data:/data \ -e MINIO_ROOT_USERadmin \ -e MINIO_ROOT_PASSWORDadmin123456 \ quay.io/minio/minio server /data --console-address :9001启动后9000端口是S3 API端口9001是Web管理界面。第一次登录后新建一个bucket比如叫travel-images访问权限设为public或者private看需求。我通常设为public因为景点图片就是要给游客看没必要做鉴权。Spring Boot的pom.xml加入依赖dependency groupIdio.minio/groupId artifactIdminio/artifactId version8.5.7/version /dependency配置类minio: endpoint: http://localhost:9000 access-key: admin secret-key: admin123456 bucket: travel-images然后写一个工具类Component public class MinioUtils { Autowired private MinioProperties minioProperties; private MinioClient client; PostConstruct public void init() { client MinioClient.builder() .endpoint(minioProperties.getEndpoint()) .credentials(minioProperties.getAccessKey(), minioProperties.getSecretKey()) .build(); } public String upload(MultipartFile file) throws Exception { String originalFilename file.getOriginalFilename(); String suffix originalFilename.substring(originalFilename.lastIndexOf(.)); String objectName UUID.randomUUID().toString().replace(-, ) suffix; client.putObject(PutObjectArgs.builder() .bucket(minioProperties.getBucket()) .object(objectName) .stream(file.getInputStream(), file.getSize(), -1) .contentType(file.getContentType()) .build()); return minioProperties.getEndpoint() / minioProperties.getBucket() / objectName; } }这段代码有两个坑要提一下。第一file.getInputStream()方法调用后流只能被读取一次。如果你既想在本地保存又想上传MinIO一定要先复制一个流。第二上传后的URL拼写要注意MinIO的endpoint如果带了路径拼接时不要重复。实际部署时我建议再加一个Nginx反代把/minio/请求转发到MinIO服务这样外网访问图片时走的是80端口而不是9000端口安全性和美观性都好很多。MinIO集成实际做下来比传统磁盘存储舒服得多。以前磁盘存储的删除逻辑要计算文件物理路径再删文件现在MinIO直接把文件对象删除就行和管理数据库记录一样自然。3.4 调试部署的完整流程本地调试时IDEA直接点击Run按钮启动Application类访问http://localhost:8080测试。如果你改了前端页面且用了Thymeleaf记得把spring.thymeleaf.cache设为false不然页面改动不生效还得重启服务很耽误事。部署到服务器时我推荐两种方式。第一种打Jar包部署适合中小项目。先在pom.xml引入Spring Boot打包插件build plugins plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId /plugin /plugins /build然后在项目根目录执行mvn clean package -DskipTests看到BUILD SUCCESS后在target目录下会生成一个xxx.jar。把这个jar上传到服务器执行java -jar travel-0.0.1-SNAPSHOT.jar --spring.profiles.activeprod如果要让服务在后台常驻用nohupnohup java -jar travel.jar app.log 21 第二种Docker部署适合有Docker环境的服务器。我不建议新手一上来就用Docker因为你得同时搞定Dockerfile、镜像构建、容器网络任何一个环节出问题都很难查。先把Jar方式跑通再上Docker不迟。如果确实要用Docker一个精简的Dockerfile如下FROM openjdk:8-jre-alpine WORKDIR /app COPY travel.jar app.jar EXPOSE 8080 ENTRYPOINT [java, -jar, app.jar]注意基础镜像要选8-jre-alpine而不是8u102-jdk后者体积大好几倍部署传输慢。我一开始为了图省事直接拉大镜像结果上传服务器时等了十分钟后来换了Alpine版本体积小、启动也更快。数据库放服务器上也别裸奔。先用命令行创建数据库并导入SQLmysql -u root -p -e CREATE DATABASE travel_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; mysql -u root -p travel_db travel_db.sql如果项目和数据库在同一台机器application.yml里的数据库地址就填localhost分开了就填数据库服务器私有IP。环境配置尽量用Profile区分spring: profiles: active: dev --- spring: config: activate: on-profile: dev datasource: url: jdbc:mysql://localhost:3306/travel_db?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai --- spring: config: activate: on-profile: prod datasource: url: jdbc:mysql://你的数据库IP:3306/travel_db?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai有人问为什么要用Profile直接改配置不行吗行但多环境Profile的好处是上线时不用手动改任何东西启动命令里带--spring.profiles.activeprod就完事不容易出错。4. 常见问题与排查技巧实录4.1 启动报错的典型场景场景一端口被占用启动Spring Boot时提示Port 8080 was already in use。这个非常常见尤其是你开着一堆乱七八糟的服务。解决办法就是找到占用进程并停掉。Windows下netstat -ano | findstr 8080 taskkill /PID 对应PID /FLinux下lsof -i:8080 kill -9 对应PID或者干脆改项目端口把server.port改成8081也可以。场景二无法加载主类或JDK版本不匹配启动时报UnsupportedClassVersionError百分百是编译版本和运行版本不一致。压缩包里的源码如果用JDK 17编译你本地JDK 8运行必然会报这个错误。解决办法是重新编译或者干脆把JDK升到和源码一致。我建议优先看项目pom.xml里的java.version是多少然后本地装对应JDK。多版本JDK共存时用IDEA的Project Structure里把Project SDK切对问题就能解决。场景三数据库连不上报Access denied for user rootlocalhost先确认密码对不对再确认用户名是不是root。MySQL 8默认认证插件是caching_sha2_password老版本MySQL驱动不支持所以如果你用MySQL 8驱动要选8.x。把mysql-connector-java换成com.mysql:mysql-connector-j版本即可。还有一种情况是连接超时Communications link failure。先ping一下数据库服务器通不通然后检查数据库端口能不能访问。我遇到过的最离奇问题是服务器防火墙开着但云服务商安全组没放行3306端口本地能连服务器上连不了折腾半天才知道安全组规则挡住了一切。场景四Thymeleaf模板报错Error resolving template [index], template might not exist多半是templates目录下没有index.html或者文件名写错。还有可能是application.yml里没有配置视图解析器前缀后缀默认前缀是classpath:/templates/后缀是.html如果你的页面放在其他目录就要手动配。4.2 前端常见问题Vue项目打包后接口404通常是接口路径和前缀不匹配。我习惯在后端Controller里统一加/api前缀比如RequestMapping(/api/scenic)这样前后端分离时逆向代理规则很清晰。还有就是在application.yml里配置spring: mvc: servlet: load-on-startup: 1这个参数解决的是后端服务刚启动时第一次请求偶发慢的问题相当于让DispatcherServlet提前初始化。实际效果还行但不是必需。前后端联调跨域报错时不是只有后端配CORS这一种方案。你可以让前端用Vite的Proxy配置转发到后端这样浏览器看到的还是同源请求Cross-Origin问题直接消失。Vite配置server: { proxy: { /api: { target: http://localhost:8080, changeOrigin: true } } }这个方法比我配CORS简单得多而且开发环境下屡试不爽。4.3 数据库增删改查的日常坑用MyBatis-Plus做增删改查时有一个字段填充问题值得说。很多表都有create_time和update_time字段如果每次插入都手动setCreateTime代码零散且容易漏。MyBatis-Plus提供了自动填充功能实体类字段上加TableField(fill FieldFill.INSERT)然后在Handler里统一填充Component public class MyMetaObjectHandler implements MetaObjectHandler { Override public void insertFill(MetaObject metaObject) { this.strictInsertFill(metaObject, createTime, LocalDateTime.class, LocalDateTime.now()); this.strictInsertFill(metaObject, updateTime, LocalDateTime.class, LocalDateTime.now()); } Override public void updateFill(MetaObject metaObject) { this.strictUpdateFill(metaObject, updateTime, LocalDateTime.class, LocalDateTime.now()); } }这样控制器里插入记录时完全不用管时间字段省不少事。还有一个容易被忽视的坑MyBatis-Plus的逻辑删除配置。如果你在实体类字段上加了TableLogic注解删除操作会自动变成update set deleted1 where id?查询时自动追加deleted0条件。这个功能很好用但有一个副作用加了TableLogic后如果用selectById查询它也会自动带删除条件这是正常的。如果哪天发现明明有数据却查不到先想想是不是逻辑删除字段被误加或者值不对。4.4 部署上线后的监控与日志上线不是终点能稳定运行才是目的。我每次部署完都会做三件事第一看启动日志。nohup java -jar travel.jar app.log 21 启动后用tail -f app.log观察日志看到Started Application in X seconds才算真正启动成功。我见过有人说服务起不来结果发现是启动上一秒日志还是正常的下一秒进程就消失了查下来是服务器内存不足JVM启动申请不到内存被系统杀掉了。第二配置日志文件保存。默认控制台日志不落盘会很麻烦。在application.yml里加logging: file: name: logs/travel.log这样日志记录到本地文件排查问题时直接grep关键字比翻控制台强一百倍。第三用ps -ef | grep java确认进程在跑再用curl http://localhost:8080/api/scenic/list验证接口通不通。如果接口返回正常JSON基本就稳了。5. 论文文档写作的实操经验标题里明确提到“带论文文档1万字以上”这里我也分享一点写论文文档的经验。很多同学写技术论文总是把字凑在“绪论”和“国内外研究现状”里其实评委真正看的是你的系统设计、数据库设计和实现细节。我的写作框架建议如下第一章绪论项目背景、研究意义、国内外研究现状。这里不要空谈要结合旅游行业信息化趋势去写引用一些公开统计数据字数自然就上来了。第二章需求分析功能性需求和非功能性需求。功能性需求就写普通用户能浏览景点、搜索、下订单、评论管理员能维护景点信息、处理订单等。非功能性需求写系统性能、安全性、易用性。第三章系统设计系统总体架构图、模块划分、数据库设计。数据库设计可以给出ER图、每张表的字段说明这一节是字数的大头一定要写细。第四章系统实现每个核心功能模块的实现思路、关键代码、界面截图。代码不要贴一大段要挑核心方法配上文字解释。第五章系统测试测试用例、测试过程、测试结果。给出登录模块、景点查询模块、下单模块的测试用例表。这套框架写下来加上代码和截图1万字很容易凑够而且质量高不水。写论文时还有一个技巧界面截图不能少。先把系统跑起来把前台页面、后台页面、数据库表截图插入论文中每一张图配一段文字说明视觉上充实逻辑也完整。很多同学的论文被导师打回都是因为图和表太少论文干巴巴全是字。6. 实用工具扩展与效率提升最后说两个实际能提升开发效率的小工具。第一个是数据库连接池。虽然标题里没直接提但这属于必备案。MyBatis-Plus默认用的是HikariCPSpring Boot 2.x默认集成了Hikari它非常轻量且性能好。如果默认连接池配置不够可以自定义spring: datasource: hikari: maximum-pool-size: 20 minimum-idle: 5 connection-timeout: 30000这个配置的重点是maximum-pool-size不要设太大数据库并发量没有达到几百上千10到20就够了设太大会消耗数据库连接资源。第二个是数据库设计阶段的ER建模工具。我用过ERMaster、Navicat的模型功能也用过在线工具如draw.io但最顺手的还是直接在Navicat里设计表然后让工具生成SQL脚本。如果你要跟同学协作开发可以用数据库版本管理工具Flyway把SQL脚本纳入版本控制。不过这个项目规模不需要上Flyway你们直接把SQL导出成文件放在db目录下统一定义即可。热搜里还有一个“数据库同步软件”这里提一句。如果你在本地开发、服务器部署需要把本地数据库结构和数据同步到线上最省事的办法是在Navicat里用“数据传输”功能选好源和目标的连接一键同步。尽量不要用命令行手工导出导入编码问题容易让你头大。这个旅游网站项目做完之后我最大的体会是一个合格的业务系统代码只是一部分环境配置、数据设计、部署运维、文档整理每一环都很关键。我见过太多代码写得很好但因为没有合理的表设计导致后期改需求改到崩溃的项目也见过功能并不复杂却因为Spring Boot版本和JDK不匹配卡在启动阶段一整天的案例。把基础打牢把选型做对后面的路会顺很多。如果你正打算照着这个项目去复刻或者改造我的建议是不要想着一步到位加太多花哨功能先把用户、景点、订单、评论、公告这五个基础模块做扎实界面做得干净一些论文写得规范一些整个项目就已经足够完整了。等你把这些基础模块全跑通了再考虑加收藏、加搜索、加支付都是水到渠成的事。
返回列表