diff --git a/src/api/course.js b/src/api/course.js index 7071fd6..efc4b9a 100644 --- a/src/api/course.js +++ b/src/api/course.js @@ -2,9 +2,14 @@ import { get, post, put, del } from '../utils/request' // 获取课程列表 export function getCourses(params) { - return get('/courses', params) + return get('/bs/courses', params) } +export function getCoursesMethod(params) { + return get('/bs/courses', params) +} + + // 获取课程详情 export function getCourseDetail(id) { return get(`/courses/${id}`) @@ -49,11 +54,11 @@ export function toggleFavoriteCourse(id) { export function searchCourses(params) { // 处理数组参数 let queryParams = { ...params } - + // 如果有标签数组,转换为逗号分隔的字符串 if (params.tags && Array.isArray(params.tags) && params.tags.length > 0) { queryParams.tags = params.tags.join(',') } - + return get('/courses/search', queryParams) -} \ No newline at end of file +} diff --git a/src/api/user.js b/src/api/user.js index ac0a205..a6691dc 100644 --- a/src/api/user.js +++ b/src/api/user.js @@ -20,6 +20,17 @@ const normalUser = { role: 'user' } + +export function registerMethod(registerForm){ + return post('/bs/user/register', registerForm) +} + +export function sendVerifyCodeMethod(email){ + return post('/bs/user/getEmailCode', { email }) +} + + + // 用户登录 export function login(username, password) { // 模拟登录逻辑 @@ -27,7 +38,7 @@ export function login(username, password) { setTimeout(() => { // 根据用户名判断返回管理员还是普通用户 const userInfo = username === 'admin' ? adminUser : normalUser - + resolve({ code: 200, data: { @@ -43,4 +54,4 @@ export function login(username, password) { // 更新用户信息 export function updateUserProfile(userId, data) { return put(`/users/${userId}`, data) -} \ No newline at end of file +} diff --git a/src/utils/request.js b/src/utils/request.js index 654f907..526591e 100644 --- a/src/utils/request.js +++ b/src/utils/request.js @@ -5,7 +5,8 @@ import { useUserStore } from '../stores/user' // 创建 axios 实例 const service = axios.create({ // baseURL: import.meta.env.VITE_API_BASE_URL || '/api', // 从环境变量获取 API 基础 URL - baseURL: 'http://localhost:8101', // 从环境变量获取 API 基础 URL + //baseURL: 'http://localhost:8101', // 从环境变量获取 API 基础 URL + baseURL: 'http://localhost:8084', // 从环境变量获取 API 基础 URL timeout: 15000, // 请求超时时间 }) diff --git a/src/views/Home.vue b/src/views/Home.vue index 279751b..aba4b03 100644 --- a/src/views/Home.vue +++ b/src/views/Home.vue @@ -110,6 +110,7 @@ import { QuestionFilled, School, DocumentChecked, DataAnalysis, Reading, Edit, User, Star } from '@element-plus/icons-vue' +import {getCoursesMethod} from "@/api/course.js"; const router = useRouter() @@ -133,13 +134,13 @@ const features = [ ] // 更新课程数据 -const popularCourses = ref([ +/*const popularCourses = ref([ { id: 1, title: 'C++面向对象编程精讲', category: 'cpp', categoryName: 'C++编程', - coverImg: 'https://p5.img.cctvpic.com/photoworkspace/contentimg/2023/03/30/2023033011303020756.jpg', + coverImg: 'http://localhost:9000/file/c6d07740-7306-4fc1-b1f8-670684a73ed9/img/31c258e7-3fd4-402c-8f2f-c9455c6cfdaf.png', studentCount: 1234, rating: 4.8, price: 0 @@ -165,7 +166,16 @@ const popularCourses = ref([ categoryName: '测试', coverImg: 'https://p5.img.cctvpic.com/photoworkspace/contentimg/2023/03/30/2023033011303020756.jpg', } -]) +])*/ + +const popularCourses = ref([]) + +const getCourses = async () => { + var axiosResponse = await getCoursesMethod(); + console.log(axiosResponse) + popularCourses.value = axiosResponse.data + +} const viewCourse = (courseId) => { router.push(`/course/detail/${courseId}`) @@ -217,6 +227,9 @@ onMounted(() => { startGuide() localStorage.setItem('hasVisited', 'true') } + + getCourses() + }) diff --git a/src/views/Login.vue b/src/views/Login.vue index d2fd8e5..d697c1c 100644 --- a/src/views/Login.vue +++ b/src/views/Login.vue @@ -24,15 +24,15 @@
-
登录
-
@@ -42,7 +42,7 @@
-
-
- - @@ -86,8 +86,8 @@ 忘记密码?
-
- -
-
- + + {{ cooldown > 0 ? `${cooldown}s` : '发送验证码' }} + +
+ + + +
+ +
- - @@ -164,7 +183,7 @@
- - import { ref, reactive } from 'vue' import { useRouter } from 'vue-router' +import { useUserStore } from '../stores/user' import { ElMessage } from 'element-plus' -import { +import { User, Lock, View, Hide, Message, - ChatDotRound, Position + ChatDotRound, Position, Key } from '@element-plus/icons-vue' +import { registerMethod, sendVerifyCodeMethod } from "@/api/user.js" const router = useRouter() +const userStore = useUserStore() const activeTab = ref('login') const showPassword = ref(false) const loading = ref(false) const rememberMe = ref(false) const activeInput = ref('') +const cooldown = ref(0) const loginForm = reactive({ username: '', @@ -211,11 +234,11 @@ const loginForm = reactive({ const registerForm = reactive({ username: '', email: '', + verifyCode: '', password: '', confirmPassword: '' }) -// 登录表单验证规则 const loginRules = { username: [ { required: true, message: '请输入用户名', trigger: 'blur' }, @@ -227,7 +250,6 @@ const loginRules = { ] } -// 注册表单验证规则 const registerRules = { username: [ { required: true, message: '请设置用户名', trigger: 'blur' }, @@ -237,59 +259,74 @@ const registerRules = { { required: true, message: '请输入邮箱地址', trigger: 'blur' }, { type: 'email', message: '请输入正确的邮箱地址', trigger: 'blur' } ], + verifyCode: [ + { required: true, message: '请输入验证码', trigger: 'blur' }, + { len: 6, message: '验证码长度应为6位', trigger: 'blur' } + ], password: [ { required: true, message: '请设置密码', trigger: 'blur' }, { min: 6, max: 20, message: '长度在 6 到 20 个字符', trigger: 'blur' } ], confirmPassword: [ { required: true, message: '请确认密码', trigger: 'blur' }, - { - validator: (rule, value, callback) => { - if (value !== registerForm.password) { - callback(new Error('两次输入密码不一致')) - } else { - callback() - } - }, - trigger: 'blur' - } + { min: 6, max: 20, message: '长度在 6 到 20 个字符', trigger: 'blur' } ] } -// 处理登录 const handleLogin = async () => { loading.value = true try { - // 模拟登录请求 - await new Promise(resolve => setTimeout(resolve, 1000)) - ElMessage.success('登录成功') - router.push('/') + if (loginForm.username === 'admin' && loginForm.password === 'admin123') { + await userStore.mockAdminLogin() + ElMessage.success('登录成功') + router.push('/') + } else { + ElMessage.error('用户名或密码错误') + } } catch (error) { - ElMessage.error('登录失败') + ElMessage.error('登录失败: ' + error.message) } finally { loading.value = false } } -// 处理注册 -const handleRegister = async () => { - loading.value = true - try { - // 模拟注册请求 - await new Promise(resolve => setTimeout(resolve, 1000)) - ElMessage.success('注册成功') - activeTab.value = 'login' - } catch (error) { - ElMessage.error('注册失败') - } finally { - loading.value = false +const handleRegister = () => { + if (registerForm.password !== registerForm.confirmPassword){ + ElMessage.error('两次密码不一致') + return } + + registerMethod(registerForm) + } -// 忘记密码 const forgotPassword = () => { ElMessage.info('忘记密码功能开发中') } + +const sendVerifyCode = async () => { + if (!registerForm.email) { + ElMessage.warning('请先输入邮箱地址') + return + } + + try { + var axiosResponse = await sendVerifyCodeMethod(registerForm.email); + ElMessage.success('验证码已发送') + cooldown.value = 60 + const timer = setInterval(() => { + cooldown.value-- + if (cooldown.value <= 0) { + clearInterval(timer) + } + }, 1000) + + console.log(axiosResponse) + + } catch (error) { + ElMessage.error('验证码发送失败: ' + error.message) + } +} \ No newline at end of file +