From 0d01a5f2a896cacd6e0558af4c1ecc35a82c8072 Mon Sep 17 00:00:00 2001 From: jeremygan2021 Date: Mon, 23 Feb 2026 23:34:54 +0800 Subject: [PATCH] =?UTF-8?q?VC=E8=AF=BE=E7=A8=8B=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/shop/views.py | 10 +++++++++- frontend/src/pages/VCCourseDetail.jsx | 16 +++++++++++++++- frontend/src/pages/VCCourses.jsx | 2 +- 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/backend/shop/views.py b/backend/shop/views.py index f50ba25..12efe9c 100644 --- a/backend/shop/views.py +++ b/backend/shop/views.py @@ -601,7 +601,15 @@ class OrderViewSet(viewsets.ModelViewSet): 创建订单时自动关联当前微信用户 """ user = get_current_wechat_user(self.request) - serializer.save(wechat_user=user) + instance = serializer.save(wechat_user=user) + + # Check if free course and set to paid + if instance.course and instance.course.price == 0 and instance.status == 'pending': + instance.status = 'paid' + instance.save() + # Trigger post payment logic + from .services import handle_post_payment + handle_post_payment(instance) @action(detail=True, methods=['post']) def prepay_miniprogram(self, request, pk=None): diff --git a/frontend/src/pages/VCCourseDetail.jsx b/frontend/src/pages/VCCourseDetail.jsx index da3d945..341d4cb 100644 --- a/frontend/src/pages/VCCourseDetail.jsx +++ b/frontend/src/pages/VCCourseDetail.jsx @@ -4,6 +4,7 @@ import { Typography, Button, Spin, Empty, Descriptions, Tag, Row, Col, Modal, Fo import { ArrowLeftOutlined, ClockCircleOutlined, UserOutlined, BookOutlined, FormOutlined } from '@ant-design/icons'; import { getVCCourseDetail, createOrder } from '../api'; import { motion } from 'framer-motion'; +import { useAuth } from '../context/AuthContext'; const { Title, Paragraph } = Typography; @@ -11,6 +12,7 @@ const VCCourseDetail = () => { const { id } = useParams(); const navigate = useNavigate(); const [searchParams] = useSearchParams(); + const { user } = useAuth(); const [course, setCourse] = useState(null); const [loading, setLoading] = useState(true); const [isModalOpen, setIsModalOpen] = useState(false); @@ -34,6 +36,14 @@ const VCCourseDetail = () => { fetchDetail(); }, [id]); + useEffect(() => { + if (isModalOpen && user && user.phone_number) { + form.setFieldsValue({ + phone_number: user.phone_number + }); + } + }, [isModalOpen, user, form]); + const handleEnroll = async (values) => { setSubmitting(true); try { @@ -48,7 +58,11 @@ const VCCourseDetail = () => { }; await createOrder(orderData); - message.success('报名咨询已提交,我们的课程顾问将尽快与您联系!'); + if (course.price === 0 || parseFloat(course.price) === 0) { + message.success('报名成功!您已成功加入课程。'); + } else { + message.success('报名咨询已提交,我们的课程顾问将尽快与您联系!'); + } setIsModalOpen(false); } catch (error) { console.error(error); diff --git a/frontend/src/pages/VCCourses.jsx b/frontend/src/pages/VCCourses.jsx index cd48a70..214bd8d 100644 --- a/frontend/src/pages/VCCourses.jsx +++ b/frontend/src/pages/VCCourses.jsx @@ -88,7 +88,7 @@ const VCCourses = () => {

{item.description}