1. 项目背景与意义
灵官峡位于陕西省凤县,是嘉陵江上游著名的自然风景区,以峡谷地貌、红叶景观和红色文化资源闻名。随着文旅融合和智慧旅游的深入推进,景区对线上信息展示、票务预约、游客服务等数字化能力的需求日益迫切。传统的静态宣传页面已难以满足游客对实时资讯、在线互动和便捷服务的需求。
本课题基于 Spring Boot 开发灵官峡景区官方网站,旨在构建一个集景区介绍、新闻动态、旅游攻略、在线留言、后台管理于一体的综合信息平台。其意义主要体现在以下几个方面:
- 提升景区形象:通过统一、美观的官网展示景区自然与人文资源,增强品牌影响力。
- 优化游客体验:提供景点导览、线路推荐、常见问题等一站式信息服务,降低游客出行决策成本。
- 推动智慧旅游:以信息化手段支撑景区运营管理,为后续票务预约、客流监测等功能扩展奠定基础。
- 锻炼工程实践能力:完整覆盖前端页面、后端接口、数据库设计和部署上线等环节,是典型的全栈开发实践项目。
2. 系统技术栈
本系统采用前后端分离与分层架构相结合的方式,后端以 Spring Boot 为核心,前端采用模板引擎与静态资源结合的方式,整体技术选型如下:
| 层次 | 技术选型 | 说明 |
|---|---|---|
| 后端框架 | Spring Boot 2.7.x | 快速构建独立运行的 Web 应用,简化配置 |
| 持久层框架 | MyBatis-Plus | 简化 CRUD 操作,内置分页与条件构造器 |
| 数据库 | MySQL 8.0 | 存储景区资讯、景点、留言等业务数据 |
| 模板引擎 | Thymeleaf | 服务端渲染景区前台页面,利于 SEO |
| 前端技术 | HTML5、CSS3、JavaScript、Bootstrap | 构建响应式页面,适配 PC 与移动端 |
| 安全认证 | Spring Security + JWT | 实现后台管理员登录认证与接口鉴权 |
| 构建工具 | Maven | 统一管理项目依赖与构建流程 |
3. 系统功能模块设计
根据景区网站的业务需求,系统划分为前台展示和后台管理两大功能区,具体模块如下:
3.1 前台展示模块
- 首页轮播:展示景区精美图片与核心宣传语。
- 景区介绍:展示灵官峡自然风光、地质地貌、历史文化等图文详情。
- 新闻资讯:发布景区公告、活动动态和行业新闻,支持分页浏览。
- 旅游攻略:提供游玩路线、交通指南、住宿餐饮等实用信息。
- 在线留言:游客可提交咨询、建议和投诉,后台进行回复管理。
3.2 后台管理模块
- 管理员登录:基于 Spring Security 的账号密码认证,JWT 维持会话状态。
- 轮播图管理:对首页轮播图片进行增删改查和排序。
- 资讯管理:发布、编辑、删除和审核新闻文章。
- 攻略管理:维护旅游攻略的分类与内容。
- 留言管理:查看游客留言并进行回复或删除。
4. 数据库设计
系统核心数据表包括管理员表、轮播图表、资讯表、攻略表和留言表。以下为主要表结构说明:
| 表名 | 主要字段 | 说明 |
|---|---|---|
| admin_user | id、username、password、nickname | 后台管理员账号 |
| banner | id、image_url、title、sort、status | 首页轮播图 |
| article | id、title、summary、content、cover、create_time | 新闻资讯文章 |
| strategy | id、title、content、category、create_time | 旅游攻略 |
| message | id、nickname、content、reply、create_time | 游客留言与回复 |
5. 核心代码实现
本节给出系统开发中具有代表性的核心代码片段,涵盖实体类、控制器、服务层和配置类。
5.1 项目依赖配置
在pom.xml中引入 Spring Boot、MyBatis-Plus、MySQL 驱动和 JWT 相关依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.3</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.1</version> </dependency>5.2 实体类示例
以资讯文章实体为例,使用 MyBatis-Plus 注解映射数据库表:
import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import java.time.LocalDateTime; @TableName("article") public class Article { @TableId(type = IdType.AUTO) private Long id; private String title; private String summary; private String content; private String cover; private LocalDateTime createTime; // 省略 getter 和 setter 方法 }5.3 控制器示例
前台资讯查询接口,支持分页返回文章列表:
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/api/article") public class ArticleController { private final ArticleService articleService; public ArticleController(ArticleService articleService) { this.articleService = articleService; } @GetMapping("/list") public Page<Article> list(@RequestParam(defaultValue = "1") int page, @RequestParam(defaultValue = "10") int size) { QueryWrapper<Article> wrapper = new QueryWrapper<>(); wrapper.orderByDesc("create_time"); return articleService.page(new Page<>(page, size), wrapper); } }5.4 服务层示例
留言回复业务逻辑,实现游客留言的提交与后台回复:
import org.springframework.stereotype.Service; @Service public class MessageServiceImpl implements MessageService { private final MessageMapper messageMapper; public MessageServiceImpl(MessageMapper messageMapper) { this.messageMapper = messageMapper; } @Override public boolean submitMessage(Message message) { message.setCreateTime(LocalDateTime.now()); return messageMapper.insert(message) > 0; } @Override public boolean replyMessage(Long id, String reply) { Message message = messageMapper.selectById(id); if (message == null) { return false; } message.setReply(reply); return messageMapper.updateById(message) > 0; } }5.5 登录认证配置
基于 Spring Security 的登录认证核心配置,放行前台静态资源与公开接口:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; @Configuration @EnableWebSecurity public class SecurityConfig { @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.csrf().disable() .authorizeHttpRequests(auth -> auth .antMatchers("/", "/index", "/api/article/", "/css/", "/js/", "/images/").permitAll() .antMatchers("/admin/**").authenticated() .anyRequest().permitAll() ) .formLogin(form -> form .loginPage("/admin/login") .defaultSuccessUrl("/admin/index") .permitAll() ) .logout(logout -> logout.logoutUrl("/admin/logout").permitAll()); return http.build(); } }6. 总结
本文围绕基于 Spring Boot 的灵官峡景区网站开发与设计,从项目背景、技术栈、功能模块、数据库设计和核心代码等方面进行了系统阐述。项目采用 Spring Boot 与 MyBatis-Plus 构建稳定可靠的后端服务,结合 Thymeleaf 与 Bootstrap 实现美观友好的前台页面,完整覆盖了景区信息展示和后台运营管理需求。后续可在现有基础上扩展在线票务预约、电子导览、客流统计等智慧旅游功能,进一步提升景区的数字化服务水平。