在旅游行业数字化转型的浪潮中,山东省作为文化旅游大省,急需一个能够整合全省旅游资源、提升游客体验的智能化服务平台。这一平台需要解决游客在行程规划、服务预订、信息获取等方面的痛点,同时为旅游管理机构提供有效的数字化管理工具。
系统架构与技术栈
该平台采用经典的SSM(Spring + Spring MVC + MyBatis)框架组合,构建了高内聚低耦合的三层架构体系。Spring框架作为核心容器,负责依赖注入和事务管理;Spring MVC处理Web层请求路由和响应;MyBatis作为持久层框架,通过XML配置实现灵活的SQL映射。
前端技术栈基于传统的JSP+Servlet架构,结合jQuery和Ajax实现动态交互效果。这种技术选型在保证系统稳定性的同时,也兼顾了开发效率和后期维护的便利性。
<!-- Spring MVC配置示例 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="url" value="jdbc:mysql://localhost:3306/shandong_tourism"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>
数据库设计亮点分析
旅游服务信息表设计
fuwuxinxi表作为核心业务表,其设计体现了良好的规范化理念:
CREATE TABLE `fuwuxinxi` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`fuwubianhao` varchar(50) NOT NULL COMMENT '旅游服务编号',
`fuwumingcheng` varchar(255) NOT NULL COMMENT '旅游服务名称',
`fenlei` int(10) unsigned NOT NULL COMMENT '分类',
`fuwutupian` text NOT NULL COMMENT '旅游服务图片',
`xiaoshoujiage` decimal(18,2) NOT NULL COMMENT '销售价格',
`kucun` int(11) NOT NULL COMMENT '库存',
`zuozhe` varchar(50) NOT NULL COMMENT '所在地',
`chubanshe` varchar(50) NOT NULL COMMENT '运营集团',
`fuwuxiangqing` longtext NOT NULL COMMENT '旅游服务详情',
`tianjiaren` varchar(50) NOT NULL COMMENT '添加人',
`addtime` timestamp NOT NULL DEFAULT current_timestamp() COMMENT '添加时间',
PRIMARY KEY (`id`),
KEY `fuwuxinxi_fenlei_index` (`fenlei`)
) ENGINE=InnoDB AUTO_INCREMENT=33 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='旅游服务信息'
该表设计的亮点包括:
- 使用
decimal(18,2)类型存储价格,确保金融计算的精确性 fuwutupian字段采用text类型,支持存储Base64编码的图片或图片URL- 为分类字段建立索引,提升按类别查询的性能
- 包含完整的审计字段(添加人、添加时间),便于操作追踪
订单信息表与购物车表的关系设计
订单系统采用分离设计理念,dingdanxinxi表存储订单主信息,gouwuche表处理购物车逻辑:
CREATE TABLE `dingdanxinxi` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`dingdanbianhao` varchar(50) NOT NULL COMMENT '订单编号',
`dingdanxinxi` text NOT NULL COMMENT '订单信息',
`zongjijine` decimal(18,2) NOT NULL COMMENT '总计金额',
`shouhuoren` varchar(50) NOT NULL COMMENT '收货人',
`dianhua` varchar(50) NOT NULL COMMENT '电话',
`dizhi` varchar(255) NOT NULL COMMENT '地址',
`beizhu` text NOT NULL COMMENT '备注',
`zhuangtai` varchar(255) NOT NULL COMMENT '状态',
`xiadanren` varchar(50) NOT NULL COMMENT '下单人',
`iszf` varchar(10) NOT NULL DEFAULT '否' COMMENT '是否支付',
`addtime` timestamp NOT NULL DEFAULT current_timestamp() COMMENT '添加时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='订单信息表'
这种设计实现了购物车与订单的松耦合,购物车中的商品在用户确认下单后才正式生成订单记录。

核心功能实现深度解析
1. 旅游服务管理与展示功能
平台通过服务信息管理模块实现旅游产品的统一管理。后端控制器采用标准的CRUD操作模式:
@Controller
@RequestMapping("/fuwuxinxi")
public class FuwuxinxiController extends BaseController {
@Autowired
private FuwuxinxiService service;
@RequestMapping("/list")
public String list(HttpServletRequest request) {
String order = Request.get("order", "id");
String sort = Request.get("sort", "desc");
Example example = new Example(Fuwuxinxi.class);
Example.Criteria criteria = example.createCriteria();
String where = " 1=1 ";
// 动态条件构建
if (!Request.get("fuwumingcheng").equals("")) {
where += " AND fuwumingcheng LIKE '%" + Request.get("fuwumingcheng") + "%' ";
}
if (!Request.get("fenlei").equals("")) {
where += " AND fenlei = " + Request.get("fenlei");
}
criteria.andCondition(where);
if (sort.equals("desc")) {
example.orderBy(order).desc();
} else {
example.orderBy(order).asc();
}
int page = request.getParameter("page") == null ? 1 :
Integer.valueOf(request.getParameter("page"));
List<Fuwuxinxi> list = service.selectPageExample(example, page, 12);
request.setAttribute("list", list);
request.setAttribute("orderby", order);
request.setAttribute("sort", sort);
return "fuwuxinxi_list";
}
}
前端展示页面采用响应式设计,确保在不同设备上都能良好显示旅游服务信息:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<div class="container">
<c:forEach items="${list}" var="fuwu">
<div class="service-item">
<img src="${fuwu.fuwutupian}" alt="${fuwu.fuwumingcheng}">
<h3>${fuwu.fuwumingcheng}</h3>
<p class="price">¥${fuwu.xiaoshoujiage}</p>
<p class="location">${fuwu.zuozhe}</p>
<a href="fuwuxinxi_detail.do?id=${fuwu.id}" class="btn-detail">查看详情</a>
</div>
</c:forEach>
</div>

2. 购物车与订单处理系统
购物车功能采用Session与数据库结合的方式,确保用户数据的持久化:
@Controller
@RequestMapping("/gouwuche")
public class GouwucheController {
@RequestMapping("/add")
@ResponseBody
public Map<String, Object> addToCart(HttpServletRequest request) {
Map<String, Object> result = new HashMap<>();
try {
Integer fuwuxinxiid = Request.getInt("fuwuxinxiid");
Integer shuliang = Request.getInt("shuliang", 1);
// 验证库存
Fuwuxinxi fuwu = fuwuxinxiService.find(fuwuxinxiid);
if (fuwu.getKucun() < shuliang) {
result.put("success", false);
result.put("msg", "库存不足");
return result;
}
Gouwuche cartItem = new Gouwuche();
cartItem.setFuwuxinxiid(fuwuxinxiid);
cartItem.setFuwubianhao(fuwu.getFuwubianhao());
cartItem.setFuwumingcheng(fuwu.getFuwumingcheng());
cartItem.setXiaoshoujiage(fuwu.getXiaoshoujiage());
cartItem.setGoumaishuliang(shuliang);
cartItem.setXiaoji(fuwu.getXiaoshoujiage().multiply(new BigDecimal(shuliang)));
cartItem.setGoumairen(getUsername());
gouwucheService.insert(cartItem);
result.put("success", true);
result.put("msg", "添加成功");
} catch (Exception e) {
result.put("success", false);
result.put("msg", "系统错误");
}
return result;
}
}
订单生成过程包含完整的业务逻辑验证:
@Service
public class DingdanService {
@Transactional
public String createOrder(List<Integer> cartIds, String shouhuoren,
String dianhua, String dizhi) {
// 验证购物车商品
List<Gouwuche> cartItems = gouwucheService.selectByIds(cartIds);
if (cartItems.isEmpty()) {
return "购物车为空";
}
// 计算总金额并验证库存
BigDecimal total = BigDecimal.ZERO;
for (Gouwuche item : cartItems) {
Fuwuxinxi fuwu = fuwuxinxiService.find(item.getFuwuxinxiid());
if (fuwu.getKucun() < item.getGoumaishuliang()) {
return fuwu.getFuwumingcheng() + "库存不足";
}
total = total.add(item.getXiaoji());
}
// 生成订单
Dingdanxinxi order = new Dingdanxinxi();
order.setDingdanbianhao(generateOrderNo());
order.setZongjijine(total);
order.setShouhuoren(shouhuoren);
order.setDianhua(dianhua);
order.setDizhi(dizhi);
order.setXiadanren(getCurrentUser());
order.setIszf("否");
order.setZhuangtai("待支付");
dingdanxinxiService.insert(order);
// 扣减库存
for (Gouwuche item : cartItems) {
fuwuxinxiService.reduceStock(item.getFuwuxinxiid(), item.getGoumaishuliang());
}
// 清空购物车
gouwucheService.deleteByIds(cartIds);
return "订单创建成功";
}
}

3. 用户权限管理与安全控制
系统采用基于拦截器的权限控制机制,确保不同角色用户访问相应的功能模块:
@Component
public class AuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
String uri = request.getRequestURI();
// 公开路径不需要登录
if (isPublicPath(uri)) {
return true;
}
HttpSession session = request.getSession();
Object user = session.getAttribute("user");
Object admin = session.getAttribute("admin");
// 检查用户登录状态
if (user == null && admin == null) {
response.sendRedirect(request.getContextPath() + "/login.do");
return false;
}
// 权限验证
if (uri.startsWith("/admin/") && admin == null) {
response.sendError(403, "无权限访问");
return false;
}
return true;
}
private boolean isPublicPath(String uri) {
return uri.endsWith("/login.do") ||
uri.endsWith("/register.do") ||
uri.contains("/static/") ||
uri.endsWith(".css") ||
uri.endsWith(".js");
}
}
管理员账户管理功能提供完整的用户生命周期管理:
@Controller
@RequestMapping("/admins")
public class AdminsController extends BaseController {
@RequestMapping("/save")
@ResponseBody
public Map<String, Object> save(Admins admin) {
Map<String, Object> result = new HashMap<>();
try {
// 用户名重复检查
if (service.existsUsername(admin.getUsername())) {
result.put("success", false);
result.put("msg", "用户名已存在");
return result;
}
// 密码加密
admin.setPwd(MD5Util.encode(admin.getPwd()));
admin.setAddtime(new Date());
service.insert(admin);
result.put("success", true);
result.put("msg", "添加成功");
} catch (Exception e) {
result.put("success", false);
result.put("msg", "添加失败");
}
return result;
}
}

实体模型设计
系统采用JPA注解方式定义实体类,实现对象关系映射:
@Table(name = "admins")
public class Admins implements Serializable {
@GeneratedValue(generator = "JDBC")
@Id
@Column(name = "id", insertable = false)
private Integer id;
@Column(name = "username")
private String username;
@Column(name = "pwd")
private String pwd;
@Column(name = "addtime")
private String addtime;
private static final long serialVersionUID = 1L;
// Getter和Setter方法
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username == null ? "" : username.trim();
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd == null ? "" : pwd.trim();
}
public String getAddtime() {
return addtime;
}
public void setAddtime(String addtime) {
this.addtime = addtime;
}
}
MyBatis的Mapper接口提供数据访问能力:
@Mapper
public interface FuwuxinxiMapper {
@Select("SELECT * FROM fuwuxinxi WHERE id = #{id}")
Fuwuxinxi selectById(Integer id);
@SelectProvider(type = FuwuxinxiSqlProvider.class, method = "selectByExample")
List<Fuwuxinxi> selectByExample(Example example);
@Update("UPDATE fuwuxinxi SET kucun = kucun - #{quantity} WHERE id = #{id} AND kucun >= #{quantity}")
int reduceStock(@Param("id") Integer id, @Param("quantity") Integer quantity);
@Insert("INSERT INTO fuwuxinxi (fuwubianhao, fuwumingcheng, fenlei, xiaoshoujiage, kucun) " +
"VALUES (#{fuwubianhao}, #{fuwumingcheng}, #{fenlei}, #{xiaoshoujiage}, #{kucun})")
@Options(useGeneratedKeys = true, keyProperty = "id")
int insert(Fuwuxinxi fuwuxinxi);
}
功能展望与优化方向
1. 引入Redis缓存提升性能
当前系统在高并发场景下可能存在数据库压力问题。引入Redis可以实现多级缓存优化:
@Service
public class FuwuxinxiServiceWithCache {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
private static final String CACHE_PREFIX = "fuwuxinxi:";
private static final long CACHE_EXPIRE = 3600; // 1小时
public Fuwuxinxi findWithCache(Integer id) {
String cacheKey = CACHE_PREFIX + id;
Fuwuxinxi fuwu = (Fuwuxinxi) redisTemplate.opsForValue().get(cacheKey);
if (fuwu == null) {
fuwu = fuwuxinxiMapper.selectById(id);
if (fuwu != null) {
redisTemplate.opsForValue().set(cacheKey, fuwu, CACHE_EXPIRE, TimeUnit.SECONDS);
}
}
return fuwu;
}
}
2. 微服务架构改造
将单体应用拆分为微服务架构,提升系统可扩展性和维护性:
- 用户服务:处理用户注册、登录、权限管理
- 产品服务:管理旅游产品信息、库存、分类
- 订单服务:处理订单创建、支付、状态跟踪
- 搜索服务:提供全文检索和推荐功能
3. 移动端适配与PWA应用
开发响应式PWA(渐进式Web应用),提升移动端用户体验:
// 服务工作者注册
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/sw.js')
.then(registration => {
console.log('SW registered: ', registration);
})
.catch(registrationError => {
console.log('SW registration failed: ', registrationError);
});
}
4. 智能推荐系统集成
基于用户行为数据构建推荐算法,提供个性化旅游服务推荐:
# 简单的协同过滤推荐算法示例
def recommend_services(user_id, top_n=10):
user_behavior = get_user_behavior(user_id)
similar_users = find_similar_users(user_id)
recommendations = {}
for similar