JAVA无人共享无人机赁柜预约小程序源码代码
JAVA无人共享无人机租赁柜预约小程序源码实现方案
采用Uniapp框架开发无人共享无人机租赁柜预约小程序,需整合后端Java服务和前端跨平台技术。以下是核心实现方案:
技术栈选择
- 前端:Uniapp + Vue.js + uView UI
- 后端:Spring Boot + MyBatis Plus + MySQL
- 硬件通信:WebSocket + MQTT协议
- 地图服务:高德地图API
- 支付对接:微信支付SDK
数据库设计关键表结构包括:
CREATE TABLE `drone` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `sn` varchar(64) NOT NULL COMMENT '设备序列号', `status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '0空闲 1使用中 2维修中', `battery` int(11) DEFAULT '100' COMMENT '剩余电量', `locker_id` bigint(20) DEFAULT NULL COMMENT '所属柜机ID', PRIMARY KEY (`id`) ); CREATE TABLE `reservation` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `user_id` bigint(20) NOT NULL, `drone_id` bigint(20) NOT NULL, `start_time` datetime NOT NULL, `end_time` datetime DEFAULT NULL, `status` tinyint(4) NOT NULL COMMENT '0待支付 1已预约 2使用中 3已完成 4已取消', `payment_amount` decimal(10,2) DEFAULT NULL, PRIMARY KEY (`id`) );Uniapp前端核心实现
预约流程组件
// pages/reserve/reserve.vue <template> <view class="container"> <amap :latitude="latitude" :longitude="longitude" @markerTap="handleMarkerTap"/> <u-calendar v-model="showCalendar" @confirm="selectDate"/> <u-button @click="confirmReserve">确认预约</u-button> </view> </template> <script> export default { data() { return { selectedDrone: null, startTime: '', endTime: '' } }, methods: { async confirmReserve() { const res = await this.$http.post('/api/reserve', { droneId: this.selectedDrone.id, startTime: this.startTime, duration: 2 // 小时数 }); if(res.code === 200) { uni.navigateTo({ url: `/pages/payment/payment?orderId=${res.data}` }); } } } } </script>硬件通信模块
// utils/ws.js let socketTask = null; export function connectWS(lockerId) { socketTask = uni.connectSocket({ url: `wss://yourdomain.com/ws/${lockerId}`, success: () => { console.log('websocket连接成功'); } }); socketTask.onMessage((res) => { const data = JSON.parse(res.data); if(data.type === 'lock_status') { store.commit('updateLockStatus', data.status); } }); }Java后端关键实现
预约业务逻辑
@RestController @RequestMapping("/api/reserve") public class ReserveController { @Autowired private DroneService droneService; @PostMapping public Result reserve(@RequestBody ReserveDTO dto) { // 检查无人机可用性 Drone drone = droneService.getById(dto.getDroneId()); if(drone.getStatus() != DroneStatus.AVAILABLE) { throw new BusinessException("当前设备不可用"); } // 创建预约记录 Reservation reservation = new Reservation(); reservation.setUserId(SecurityUtils.getUserId()); reservation.setDroneId(dto.getDroneId()); reservation.setStartTime(dto.getStartTime()); reservation.setEndTime(calculateEndTime(dto)); reservation.setStatus(ReserveStatus.PENDING_PAYMENT); reservationService.save(reservation); // 锁定设备 droneService.updateStatus(dto.getDroneId(), DroneStatus.RESERVED); return Result.success(reservation.getId()); } }柜机通信接口
@RestController @RequestMapping("/api/locker") public class LockerController { @PostMapping("/open") public Result openLocker(@RequestParam Long reservationId) { Reservation reservation = reservationService.getById(reservationId); if(reservation.getStatus() != ReserveStatus.CONFIRMED) { throw new BusinessException("预约状态异常"); } // 通过MQTT发送开柜指令 mqttGateway.sendToMqtt( "OPEN:" + reservation.getDrone().getLockerId(), "locker/control" ); return Result.success(); } }支付系统集成
微信支付对接
@Service public class PaymentServiceImpl implements PaymentService { @Override public WxPayResponse createWxOrder(Long reservationId) { Reservation reservation = reservationService.getById(reservationId); WxPayUnifiedOrderRequest request = new WxPayUnifiedOrderRequest(); request.setBody("无人机租赁-订单号:" + reservationId); request.setOutTradeNo(generateTradeNo()); request.setTotalFee(reservation.getPaymentAmount().multiply(new BigDecimal(100)).intValue()); request.setSpbillCreateIp(request.getRemoteAddr()); request.setNotifyUrl(notifyUrl); request.setTradeType("JSAPI"); request.setOpenid(getUserOpenId()); return wxPayService.unifiedOrder(request); } }安全控制措施
JWT认证实现
@Component public class JwtTokenProvider { private String secret = "your_jwt_secret"; private long validityInMilliseconds = 3600000; // 1h public String createToken(String username, List<String> roles) { Claims claims = Jwts.claims().setSubject(username); claims.put("roles", roles); Date now = new Date(); Date validity = new Date(now.getTime() + validityInMilliseconds); return Jwts.builder() .setClaims(claims) .setIssuedAt(now) .setExpiration(validity) .signWith(SignatureAlgorithm.HS256, secret) .compact(); } public Authentication getAuthentication(String token) { UserDetails userDetails = userDetailsService.loadUserByUsername(getUsername(token)); return new UsernamePasswordAuthenticationToken(userDetails, "", userDetails.getAuthorities()); } }性能优化方案
缓存策略实现
@Service @CacheConfig(cacheNames = "drone") public class DroneServiceImpl implements DroneService { @Override @Cacheable(key = "#id") public Drone getById(Long id) { return baseMapper.selectById(id); } @Override @CacheEvict(key = "#id") public void updateStatus(Long id, DroneStatus status) { lambdaUpdate() .eq(Drone::getId, id) .set(Drone::getStatus, status) .update(); } }运维监控体系
Spring Boot Admin集成
@Configuration @EnableAdminServer public class AdminServerConfig { } // application.properties spring.boot.admin.client.url=http://localhost:8080 management.endpoints.web.exposure.include=* management.endpoint.health.show-details=always开源代码片段示例
Uniapp页面路由配置
// pages.json { "pages": [ { "path": "pages/index/index", "style": { "navigationBarTitleText": "无人机共享平台" } }, { "path": "pages/reserve/map", "style": { "navigationBarTitleText": "选择租赁点" } } ] }Vuex状态管理
// store/modules/drone.js export default { state: { currentReservation: null, nearbyLockers: [] }, mutations: { setReservation(state, payload) { state.currentReservation = payload } }, actions: { async loadNearbyLockers({commit}, params) { const res = await api.getLockers(params); commit('setNearbyLockers', res.data); } } }以上方案实现了共享无人机租赁的核心业务流程,包含硬件交互、支付系统、安全认证等关键模块。实际开发中需根据具体硬件协议调整通信模块,并完善异常处理机制。完整项目建议采用微服务架构分离业务模块,使用Docker进行容器化部署。
