| tcm-training-admin-backend/src/main/java/com/tcm/training/admin/app/home/controller/AppHomeLiveCourseController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| tcm-training-admin-backend/src/main/java/com/tcm/training/admin/live/controller/LiveCourseController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| traditionalApp/pages/passwordInput/passwordInput.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| traditionalApp/pages/passwordInput/service.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| traditionalApp/utils/public-request.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
tcm-training-admin-backend/src/main/java/com/tcm/training/admin/app/home/controller/AppHomeLiveCourseController.java
@@ -3,11 +3,16 @@ import com.tcm.training.admin.app.home.service.AppHomeLiveCourseService; import com.tcm.training.admin.app.home.vo.AppHomeLiveCourseVO; import com.tcm.training.admin.common.ApiResponse; import com.tcm.training.admin.live.dto.LiveCoursePasswordVerifyRequest; import com.tcm.training.admin.live.service.LiveCourseAppService; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.validation.Valid; import java.util.List; /** @@ -20,11 +25,15 @@ private final AppHomeLiveCourseService appHomeLiveCourseService; private final LiveCourseAppService liveCourseAppService; /** * 注入首页养生直播服务。 */ public AppHomeLiveCourseController(AppHomeLiveCourseService appHomeLiveCourseService) { public AppHomeLiveCourseController(AppHomeLiveCourseService appHomeLiveCourseService, LiveCourseAppService liveCourseAppService) { this.appHomeLiveCourseService = appHomeLiveCourseService; this.liveCourseAppService = liveCourseAppService; } /** @@ -34,4 +43,12 @@ public ApiResponse<List<AppHomeLiveCourseVO>> listHomeLiveCourses() { return ApiResponse.ok(appHomeLiveCourseService.listHomeLiveCourses()); } /** * 校验 APP 首页直播课程访问密码。 */ @PostMapping("/live-courses/password/verify") public ApiResponse<Boolean> verifyPassword(@Valid @RequestBody LiveCoursePasswordVerifyRequest req) { return ApiResponse.ok(liveCourseAppService.verifyPassword(req)); } } tcm-training-admin-backend/src/main/java/com/tcm/training/admin/live/controller/LiveCourseController.java
@@ -5,7 +5,6 @@ import com.tcm.training.admin.live.dto.LiveCourseStatusRequest; import com.tcm.training.admin.live.dto.LiveCourseUpsertRequest; import com.tcm.training.admin.live.dto.LiveCoursePasswordRequest; import com.tcm.training.admin.live.dto.LiveCoursePasswordVerifyRequest; import com.tcm.training.admin.live.service.LiveCourseAppService; import com.tcm.training.admin.live.vo.LiveCourseDetailVO; import com.tcm.training.admin.live.vo.LiveCourseListItemVO; @@ -71,10 +70,6 @@ return ApiResponse.ok(null); } @PostMapping("/live-courses/password/verify") public ApiResponse<Boolean> verifyPassword(@Valid @RequestBody LiveCoursePasswordVerifyRequest req) { return ApiResponse.ok(liveCourseAppService.verifyPassword(req)); } @DeleteMapping("/live-courses/{id}") public ApiResponse<Void> delete(@PathVariable("id") Long id) { traditionalApp/pages/passwordInput/passwordInput.vue
@@ -22,7 +22,7 @@ /> </view> <view class="confirm-btn" :class="{ disabled: !password }" @tap="handleConfirm"> <view class="confirm-btn" :class="{ disabled: !password || submitting }" @tap="handleConfirm"> 确认 </view> </view> @@ -32,12 +32,12 @@ <script setup lang="ts"> import { onLoad } from '@dcloudio/uni-app' import { ref } from 'vue' const OPERATOR_TRAINING_PASSWORD = '123456' import { verifyLiveCoursePassword } from './service.js' const statusBarHeight = ref(0) const password = ref('') const autoFocus = ref(true) const targetUrl = ref('') const submitting = ref(false) onLoad((options) => { uni.getSystemInfo({ @@ -55,30 +55,41 @@ uni.navigateBack() } const handleConfirm = () => { if (!password.value) { const handleConfirm = async () => { if (!password.value || submitting.value) { return } if (password.value !== OPERATOR_TRAINING_PASSWORD) { submitting.value = true try { const response = await verifyLiveCoursePassword(password.value) if (response?.code !== 0 || response.data !== true) { uni.showToast({ title: '密码错误,请重新输入', icon: 'none' }) return } if (targetUrl.value) { uni.redirectTo({ url: targetUrl.value, fail: () => { uni.navigateTo({ url: targetUrl.value }) } }) } else { uni.navigateBack() } } catch { uni.showToast({ title: '密码错误,请重新输入', title: '密码校验失败,请稍后重试', icon: 'none' }) return } if (targetUrl.value) { uni.redirectTo({ url: targetUrl.value, fail: () => { uni.navigateTo({ url: targetUrl.value }) } }) } else { uni.navigateBack() } finally { submitting.value = false } } </script> traditionalApp/pages/passwordInput/service.js
New file @@ -0,0 +1,11 @@ import { publicPost } from '@/utils/public-request.js' /** * 校验 APP 首页直播课程访问密码。 */ export const verifyLiveCoursePassword = (password) => { return publicPost('/api/app/home/live-courses/password/verify', { type: 1, password, }) } traditionalApp/utils/public-request.js
@@ -24,3 +24,27 @@ }) }) } /** * 发起游客可访问的 POST 请求。 */ export function publicPost(url, data = {}) { const requestUrl = `${config.BASE_URL}${url}` return new Promise((resolve, reject) => { uni.request({ url: requestUrl, method: 'POST', data, timeout: 10000, header: { 'content-type': 'application/json', lang: uni.getStorageSync('locale') === 'zh-Hans' ? 'zh_CN' : 'zh-tw', }, success: (res) => { resolve(res.data || {}) }, fail: (error) => { reject(error) }, }) }) }