💖💖作者:计算机毕业设计江挽 💙💙个人简介:曾长期从事计算机专业培训教学,本人也热爱上课教学,语言擅长Java、微信小程序、Python、Golang、安卓Android等,开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。平常喜欢分享一些自己开发中遇到的问题的解决办法,也喜欢交流技术,大家有技术代码这一块的问题可以问我! 💛💛想说的话:感谢大家的关注与支持! 💜💜 网站实战项目 安卓/小程序实战项目 大数据实战项目 深度学习实战项目
基于微信小程序的丽江市旅游分享平台介绍
基于微信小程序的丽江市旅游分享平台是一个集景点展示、信息分享、在线购票于一体的综合性旅游服务系统,采用uni-app跨端开发框架构建前端界面,确保在微信小程序和安卓应用中都能提供流畅的用户体验。系统后端基于SpringBoot框架搭建,运用Spring+SpringMVC+Mybatis技术架构实现业务逻辑处理,通过MySQL数据库存储用户信息、景点数据、购票记录等关键信息。平台主要功能模块涵盖用户注册登录管理、景点分类浏览、详细景点信息展示、在线购票服务、个人中心管理、轮播图展示以及敏感词过滤等核心业务。用户可以通过微信小程序便捷地浏览丽江各大景点信息,查看其他游客的分享内容,直接在线购买景点门票,同时平台提供个性化的个人中心功能,让用户管理自己的订单和分享内容。整个系统采用前后端分离的开发模式,前端负责用户交互和数据展示,后端专注于业务逻辑处理和数据管理,为丽江市旅游行业提供了一个现代化的数字化服务解决方案。
基于微信小程序的丽江市旅游分享平台演示视频
基于微信小程序的丽江市旅游分享平台演示图片
基于微信小程序的丽江市旅游分享平台代码展示
import org.apache.spark.sql.SparkSession;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
@RestController
@RequestMapping("/api/attraction")
public class AttractionController {
private SparkSession spark = SparkSession.builder().appName("LijiangTourismAnalysis").master("local[*]").getOrCreate();
@Autowired
private AttractionService attractionService;
@PostMapping("/recommend")
public ResponseEntity<List<Attraction>> getRecommendedAttractions(@RequestParam String userId) {
Dataset<Row> userBehaviorData = spark.read().option("header", "true").csv("user_behavior.csv");
Dataset<Row> filteredData = userBehaviorData.filter(col("user_id").equalTo(userId));
List<String> userPreferences = filteredData.select("attraction_type").distinct().collectAsList().stream().map(row -> row.getString(0)).collect(Collectors.toList());
List<Attraction> attractions = attractionService.findByCategory(userPreferences.get(0));
Collections.shuffle(attractions);
List<Attraction> recommendedAttractions = attractions.stream().limit(10).collect(Collectors.toList());
for(Attraction attraction : recommendedAttractions) {
attraction.setVisitCount(attraction.getVisitCount() + 1);
attractionService.updateAttraction(attraction);
}
return ResponseEntity.ok(recommendedAttractions);
}
@GetMapping("/category/{categoryId}")
public ResponseEntity<List<Attraction>> getAttractionsByCategory(@PathVariable Long categoryId) {
try {
List<Attraction> attractions = attractionService.findByCategoryId(categoryId);
Dataset<Row> attractionData = spark.createDataFrame(attractions, Attraction.class);
Dataset<Row> sortedData = attractionData.orderBy(col("visit_count").desc(), col("rating").desc());
List<Attraction> sortedAttractions = sortedData.collectAsList().stream().map(row -> {
Attraction attr = new Attraction();
attr.setId(row.getLong("id"));
attr.setName(row.getString("name"));
attr.setDescription(row.getString("description"));
attr.setPrice(row.getDouble("price"));
attr.setRating(row.getDouble("rating"));
attr.setVisitCount(row.getLong("visitCount"));
return attr;
}).collect(Collectors.toList());
return ResponseEntity.ok(sortedAttractions);
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);
}
}
}
@RestController
@RequestMapping("/api/ticket")
public class TicketController {
@Autowired
private TicketService ticketService;
@Autowired
private AttractionService attractionService;
@PostMapping("/purchase")
public ResponseEntity<TicketOrder> purchaseTicket(@RequestBody TicketPurchaseRequest request) {
try {
Attraction attraction = attractionService.findById(request.getAttractionId());
if(attraction == null) {
return ResponseEntity.badRequest().body(null);
}
if(attraction.getAvailableTickets() < request.getQuantity()) {
return ResponseEntity.status(HttpStatus.CONFLICT).body(null);
}
TicketOrder order = new TicketOrder();
order.setUserId(request.getUserId());
order.setAttractionId(request.getAttractionId());
order.setQuantity(request.getQuantity());
order.setTotalPrice(attraction.getPrice() * request.getQuantity());
order.setOrderStatus("PENDING");
order.setCreateTime(new Date());
order.setOrderNumber("TK" + System.currentTimeMillis());
TicketOrder savedOrder = ticketService.createOrder(order);
attraction.setAvailableTickets(attraction.getAvailableTickets() - request.getQuantity());
attraction.setSoldTickets(attraction.getSoldTickets() + request.getQuantity());
attractionService.updateAttraction(attraction);
Dataset<Row> salesData = spark.read().option("header", "true").csv("ticket_sales.csv");
Row newSaleRecord = RowFactory.create(savedOrder.getId(), savedOrder.getAttractionId(), savedOrder.getQuantity(), savedOrder.getTotalPrice(), savedOrder.getCreateTime().toString());
Dataset<Row> updatedSalesData = salesData.union(spark.createDataFrame(Arrays.asList(newSaleRecord), salesData.schema()));
updatedSalesData.write().mode("overwrite").option("header", "true").csv("ticket_sales.csv");
return ResponseEntity.ok(savedOrder);
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);
}
}
@GetMapping("/orders/{userId}")
public ResponseEntity<List<TicketOrder>> getUserTicketOrders(@PathVariable String userId) {
List<TicketOrder> orders = ticketService.findOrdersByUserId(userId);
for(TicketOrder order : orders) {
Attraction attraction = attractionService.findById(order.getAttractionId());
order.setAttractionName(attraction.getName());
order.setAttractionImage(attraction.getImageUrl());
}
return ResponseEntity.ok(orders);
}
}
@RestController
@RequestMapping("/api/user")
public class UserController {
@Autowired
private UserService userService;
@PostMapping("/register")
public ResponseEntity<ApiResponse> registerUser(@RequestBody UserRegistrationRequest request) {
try {
if(userService.existsByWechatOpenid(request.getOpenid())) {
return ResponseEntity.status(HttpStatus.CONFLICT).body(new ApiResponse(false, "用户已存在"));
}
User user = new User();
user.setWechatOpenid(request.getOpenid());
user.setNickname(request.getNickname());
user.setAvatarUrl(request.getAvatarUrl());
user.setPhoneNumber(request.getPhoneNumber());
user.setRegistrationTime(new Date());
user.setUserStatus("ACTIVE");
user.setUserType("REGULAR");
User savedUser = userService.createUser(user);
Dataset<Row> userData = spark.read().option("header", "true").csv("user_profiles.csv");
Row newUserRecord = RowFactory.create(savedUser.getId(), savedUser.getNickname(), savedUser.getRegistrationTime().toString(), "NEW_USER");
Dataset<Row> updatedUserData = userData.union(spark.createDataFrame(Arrays.asList(newUserRecord), userData.schema()));
updatedUserData.write().mode("overwrite").option("header", "true").csv("user_profiles.csv");
return ResponseEntity.ok(new ApiResponse(true, "注册成功"));
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(new ApiResponse(false, "注册失败"));
}
}
@PostMapping("/login")
public ResponseEntity<LoginResponse> userLogin(@RequestBody LoginRequest request) {
try {
User user = userService.findByWechatOpenid(request.getOpenid());
if(user == null) {
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(null);
}
user.setLastLoginTime(new Date());
userService.updateUser(user);
String token = JwtUtil.generateToken(user.getId());
LoginResponse response = new LoginResponse();
response.setToken(token);
response.setUser(user);
response.setLoginTime(new Date());
return ResponseEntity.ok(response);
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);
}
}
}
基于微信小程序的丽江市旅游分享平台文档展示
💖💖作者:计算机毕业设计江挽 💙💙个人简介:曾长期从事计算机专业培训教学,本人也热爱上课教学,语言擅长Java、微信小程序、Python、Golang、安卓Android等,开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。平常喜欢分享一些自己开发中遇到的问题的解决办法,也喜欢交流技术,大家有技术代码这一块的问题可以问我! 💛💛想说的话:感谢大家的关注与支持! 💜💜 网站实战项目 安卓/小程序实战项目 大数据实战项目 深度学习实战项目