diff --git a/backend/check_urls.py b/backend/check_urls.py
index 63e303d..6dd3a96 100644
--- a/backend/check_urls.py
+++ b/backend/check_urls.py
@@ -12,7 +12,7 @@ links = [
"admin:shop_distributor_changelist",
"admin:shop_esp32config_changelist",
"admin:shop_service_changelist",
- "admin:shop_arservice_changelist",
+ "admin:shop_vbcourse_changelist",
"admin:shop_order_changelist",
"admin:shop_serviceorder_changelist",
"admin:shop_withdrawal_changelist",
diff --git a/backend/config/__pycache__/settings.cpython-312.pyc b/backend/config/__pycache__/settings.cpython-312.pyc
index 67a96a2..c8aed22 100644
Binary files a/backend/config/__pycache__/settings.cpython-312.pyc and b/backend/config/__pycache__/settings.cpython-312.pyc differ
diff --git a/backend/config/settings.py b/backend/config/settings.py
index b2702bb..215dbd0 100644
--- a/backend/config/settings.py
+++ b/backend/config/settings.py
@@ -232,9 +232,9 @@ UNFOLD = {
"link": reverse_lazy("admin:shop_service_changelist"),
},
{
- "title": "AR体验",
- "icon": "view_in_ar",
- "link": reverse_lazy("admin:shop_arservice_changelist"),
+ "title": "VB课程",
+ "icon": "school",
+ "link": reverse_lazy("admin:shop_vbcourse_changelist"),
},
],
},
diff --git a/backend/db.sqlite3 b/backend/db.sqlite3
index f6de3aa..0cf1b4e 100644
Binary files a/backend/db.sqlite3 and b/backend/db.sqlite3 differ
diff --git a/backend/shop/__pycache__/admin.cpython-312.pyc b/backend/shop/__pycache__/admin.cpython-312.pyc
index d98e11c..db1d0fe 100644
Binary files a/backend/shop/__pycache__/admin.cpython-312.pyc and b/backend/shop/__pycache__/admin.cpython-312.pyc differ
diff --git a/backend/shop/__pycache__/models.cpython-312.pyc b/backend/shop/__pycache__/models.cpython-312.pyc
index fa9a345..1961d41 100644
Binary files a/backend/shop/__pycache__/models.cpython-312.pyc and b/backend/shop/__pycache__/models.cpython-312.pyc differ
diff --git a/backend/shop/__pycache__/serializers.cpython-312.pyc b/backend/shop/__pycache__/serializers.cpython-312.pyc
index ae896a2..8cf1e44 100644
Binary files a/backend/shop/__pycache__/serializers.cpython-312.pyc and b/backend/shop/__pycache__/serializers.cpython-312.pyc differ
diff --git a/backend/shop/__pycache__/urls.cpython-312.pyc b/backend/shop/__pycache__/urls.cpython-312.pyc
index 2d8534f..f690115 100644
Binary files a/backend/shop/__pycache__/urls.cpython-312.pyc and b/backend/shop/__pycache__/urls.cpython-312.pyc differ
diff --git a/backend/shop/__pycache__/views.cpython-312.pyc b/backend/shop/__pycache__/views.cpython-312.pyc
index 0d50a17..db1c7c7 100644
Binary files a/backend/shop/__pycache__/views.cpython-312.pyc and b/backend/shop/__pycache__/views.cpython-312.pyc differ
diff --git a/backend/shop/admin.py b/backend/shop/admin.py
index fc08102..81f2527 100644
--- a/backend/shop/admin.py
+++ b/backend/shop/admin.py
@@ -4,7 +4,7 @@ from django.db.models import Sum
from django import forms
from unfold.admin import ModelAdmin, TabularInline
from unfold.decorators import display
-from .models import ESP32Config, Order, Salesperson, WeChatPayConfig, Service, ARService, ProductFeature, CommissionLog, WeChatUser, Distributor, Withdrawal, ServiceOrder
+from .models import ESP32Config, Order, Salesperson, WeChatPayConfig, Service, VBCourse, ProductFeature, CommissionLog, WeChatUser, Distributor, Withdrawal, ServiceOrder
import qrcode
from io import BytesIO
import base64
@@ -19,11 +19,11 @@ class ExternalUploadWidget(forms.URLInput):
super().__init__(*args, **kwargs)
self.upload_url = upload_url
self.attrs.update({
- 'class': 'upload-url-input',
+ 'class': 'upload-url-input vTextField',
'data-upload-url': upload_url,
'data-accept': accept,
- 'readonly': 'readonly',
- 'placeholder': '上传文件后自动生成URL'
+ 'placeholder': '上传文件后自动生成URL',
+ 'style': 'width: 100%;'
})
class Media:
@@ -141,18 +141,26 @@ class ServiceOrderAdmin(ModelAdmin):
}),
)
-@admin.register(ARService)
-class ARServiceAdmin(ModelAdmin):
- list_display = ('title', 'created_at')
- search_fields = ('title', 'description')
+@admin.register(VBCourse)
+class VBCourseAdmin(ModelAdmin):
+ list_display = ('title', 'course_type', 'tag', 'instructor', 'lesson_count', 'duration', 'created_at')
+ search_fields = ('title', 'description', 'instructor', 'tag')
+ list_filter = ('course_type', 'instructor', 'tag')
fieldsets = (
('基本信息', {
- 'fields': ('title', 'description')
+ 'fields': ('title', 'description', 'course_type', 'tag')
}),
- ('封面/长图', {
+ ('课程详情', {
+ 'fields': ('instructor', 'duration', 'lesson_count')
+ }),
+ ('封面', {
'fields': ('cover_image', 'cover_image_url'),
'description': '图片上传和URL二选一,优先使用URL'
}),
+ ('详情页长图', {
+ 'fields': ('detail_image', 'detail_image_url'),
+ 'description': '图片上传和URL二选一,优先使用URL'
+ }),
)
@admin.register(Salesperson)
diff --git a/backend/shop/migrations/0018_vbcourse_delete_arservice.py b/backend/shop/migrations/0018_vbcourse_delete_arservice.py
new file mode 100644
index 0000000..4975f0f
--- /dev/null
+++ b/backend/shop/migrations/0018_vbcourse_delete_arservice.py
@@ -0,0 +1,35 @@
+# Generated by Django 6.0.1 on 2026-02-10 18:48
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('shop', '0017_withdrawal'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='VBCourse',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('title', models.CharField(max_length=100, verbose_name='课程名称')),
+ ('description', models.TextField(verbose_name='课程简介')),
+ ('course_type', models.CharField(choices=[('software', '软件课程'), ('hardware', '硬件课程')], default='software', max_length=20, verbose_name='课程类型')),
+ ('duration', models.CharField(default='30分钟', help_text='例如: 30分钟', max_length=50, verbose_name='课程时长')),
+ ('lesson_count', models.IntegerField(default=1, verbose_name='课时数量')),
+ ('instructor', models.CharField(default='VB讲师', max_length=50, verbose_name='讲师')),
+ ('cover_image', models.ImageField(blank=True, null=True, upload_to='courses/covers/', verbose_name='封面图 (上传)')),
+ ('cover_image_url', models.URLField(blank=True, null=True, verbose_name='封面图 (URL)')),
+ ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
+ ],
+ options={
+ 'verbose_name': 'VB课程',
+ 'verbose_name_plural': 'VB课程管理',
+ },
+ ),
+ migrations.DeleteModel(
+ name='ARService',
+ ),
+ ]
diff --git a/backend/shop/migrations/0019_vbcourse_detail_image_vbcourse_detail_image_url_and_more.py b/backend/shop/migrations/0019_vbcourse_detail_image_vbcourse_detail_image_url_and_more.py
new file mode 100644
index 0000000..8a4e192
--- /dev/null
+++ b/backend/shop/migrations/0019_vbcourse_detail_image_vbcourse_detail_image_url_and_more.py
@@ -0,0 +1,28 @@
+# Generated by Django 6.0.1 on 2026-02-10 18:55
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('shop', '0018_vbcourse_delete_arservice'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='vbcourse',
+ name='detail_image',
+ field=models.ImageField(blank=True, null=True, upload_to='courses/details/', verbose_name='详情页长图 (上传)'),
+ ),
+ migrations.AddField(
+ model_name='vbcourse',
+ name='detail_image_url',
+ field=models.URLField(blank=True, help_text='如果填写了URL,将优先使用URL', null=True, verbose_name='详情页长图 (URL)'),
+ ),
+ migrations.AddField(
+ model_name='vbcourse',
+ name='tag',
+ field=models.CharField(blank=True, help_text='例如: 热门, 推荐, 进阶', max_length=20, verbose_name='标签'),
+ ),
+ ]
diff --git a/backend/shop/migrations/0020_alter_vbcourse_course_type.py b/backend/shop/migrations/0020_alter_vbcourse_course_type.py
new file mode 100644
index 0000000..857e060
--- /dev/null
+++ b/backend/shop/migrations/0020_alter_vbcourse_course_type.py
@@ -0,0 +1,18 @@
+# Generated by Django 6.0.1 on 2026-02-10 18:58
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('shop', '0019_vbcourse_detail_image_vbcourse_detail_image_url_and_more'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='vbcourse',
+ name='course_type',
+ field=models.CharField(choices=[('software', '软件课程'), ('hardware', '硬件课程'), ('incubation', '产品商业孵化')], default='software', max_length=20, verbose_name='课程类型'),
+ ),
+ ]
diff --git a/backend/shop/models.py b/backend/shop/models.py
index b1c49b4..2623222 100644
--- a/backend/shop/models.py
+++ b/backend/shop/models.py
@@ -312,19 +312,36 @@ class ServiceOrder(models.Model):
verbose_name_plural = "服务订单列表"
-class ARService(models.Model):
+class VBCourse(models.Model):
"""
- AR体验服务模型
+ VB Coding 课程模型
"""
- title = models.CharField(max_length=100, verbose_name="体验名称")
- description = models.TextField(verbose_name="简介")
- cover_image = models.ImageField(upload_to='ar/covers/', blank=True, null=True, verbose_name="封面/长图 (上传)")
- cover_image_url = models.URLField(blank=True, null=True, verbose_name="封面/长图 (URL)")
+ COURSE_TYPE_CHOICES = (
+ ('software', '软件课程'),
+ ('hardware', '硬件课程'),
+ ('incubation', '产品商业孵化'),
+ )
+
+ title = models.CharField(max_length=100, verbose_name="课程名称")
+ description = models.TextField(verbose_name="课程简介")
+ course_type = models.CharField(max_length=20, choices=COURSE_TYPE_CHOICES, default='software', verbose_name="课程类型")
+ duration = models.CharField(max_length=50, verbose_name="课程时长", help_text="例如: 30分钟", default="30分钟")
+ lesson_count = models.IntegerField(default=1, verbose_name="课时数量")
+ instructor = models.CharField(max_length=50, verbose_name="讲师", default="VB讲师")
+
+ tag = models.CharField(max_length=20, blank=True, verbose_name="标签", help_text="例如: 热门, 推荐, 进阶")
+
+ cover_image = models.ImageField(upload_to='courses/covers/', blank=True, null=True, verbose_name="封面图 (上传)")
+ cover_image_url = models.URLField(blank=True, null=True, verbose_name="封面图 (URL)")
+
+ detail_image = models.ImageField(upload_to='courses/details/', blank=True, null=True, verbose_name="详情页长图 (上传)")
+ detail_image_url = models.URLField(blank=True, null=True, verbose_name="详情页长图 (URL)", help_text="如果填写了URL,将优先使用URL")
+
created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
def __str__(self):
return self.title
class Meta:
- verbose_name = "AR体验"
- verbose_name_plural = "AR体验管理"
+ verbose_name = "VB课程"
+ verbose_name_plural = "VB课程管理"
diff --git a/backend/shop/serializers.py b/backend/shop/serializers.py
index 6e1fdd1..8c4d7e8 100644
--- a/backend/shop/serializers.py
+++ b/backend/shop/serializers.py
@@ -1,5 +1,5 @@
from rest_framework import serializers
-from .models import ESP32Config, Order, Salesperson, Service, ARService, ProductFeature, ServiceOrder, WeChatUser, Distributor, Withdrawal
+from .models import ESP32Config, Order, Salesperson, Service, VBCourse, ProductFeature, ServiceOrder, WeChatUser, Distributor, Withdrawal
class WeChatUserSerializer(serializers.ModelSerializer):
class Meta:
@@ -101,14 +101,16 @@ class ServiceOrderSerializer(serializers.ModelSerializer):
return super().create(validated_data)
-class ARServiceSerializer(serializers.ModelSerializer):
+class VBCourseSerializer(serializers.ModelSerializer):
"""
- AR服务序列化器
+ VB课程序列化器
"""
display_cover_image = serializers.SerializerMethodField()
+ display_detail_image = serializers.SerializerMethodField()
+ course_type_display = serializers.CharField(source='get_course_type_display', read_only=True)
class Meta:
- model = ARService
+ model = VBCourse
fields = '__all__'
def get_display_cover_image(self, obj):
@@ -118,6 +120,13 @@ class ARServiceSerializer(serializers.ModelSerializer):
return obj.cover_image.url
return None
+ def get_display_detail_image(self, obj):
+ if obj.detail_image_url:
+ return obj.detail_image_url
+ if obj.detail_image:
+ return obj.detail_image.url
+ return None
+
class ESP32ConfigSerializer(serializers.ModelSerializer):
"""
ESP32配置序列化器
diff --git a/backend/shop/urls.py b/backend/shop/urls.py
index 209ab54..3464a6d 100644
--- a/backend/shop/urls.py
+++ b/backend/shop/urls.py
@@ -2,7 +2,7 @@ from django.urls import path, include, re_path
from rest_framework.routers import DefaultRouter
from .views import (
ESP32ConfigViewSet, OrderViewSet, order_check_view,
- ServiceViewSet, ARServiceViewSet, ServiceOrderViewSet,
+ ServiceViewSet, VBCourseViewSet, ServiceOrderViewSet,
payment_finish, pay, send_sms_code, wechat_login, update_user_info, DistributorViewSet
)
@@ -10,7 +10,7 @@ router = DefaultRouter()
router.register(r'configs', ESP32ConfigViewSet)
router.register(r'orders', OrderViewSet)
router.register(r'services', ServiceViewSet)
-router.register(r'ar', ARServiceViewSet)
+router.register(r'courses', VBCourseViewSet)
router.register(r'service-orders', ServiceOrderViewSet)
router.register(r'distributor', DistributorViewSet, basename='distributor')
diff --git a/backend/shop/views.py b/backend/shop/views.py
index 2cb693e..3982f2e 100644
--- a/backend/shop/views.py
+++ b/backend/shop/views.py
@@ -5,8 +5,8 @@ from django.shortcuts import render
from django.views.decorators.csrf import csrf_exempt
from django.http import HttpResponse
from drf_spectacular.utils import extend_schema, extend_schema_view, OpenApiParameter, OpenApiExample
-from .models import ESP32Config, Order, WeChatPayConfig, Service, ARService, ServiceOrder, Salesperson, CommissionLog, WeChatUser, Distributor, Withdrawal
-from .serializers import ESP32ConfigSerializer, OrderSerializer, ServiceSerializer, ARServiceSerializer, ServiceOrderSerializer, WeChatUserSerializer, DistributorSerializer, WithdrawalSerializer
+from .models import ESP32Config, Order, WeChatPayConfig, Service, VBCourse, ServiceOrder, Salesperson, CommissionLog, WeChatUser, Distributor, Withdrawal
+from .serializers import ESP32ConfigSerializer, OrderSerializer, ServiceSerializer, VBCourseSerializer, ServiceOrderSerializer, WeChatUserSerializer, DistributorSerializer, WithdrawalSerializer
from django.core.signing import TimestampSigner, BadSignature, SignatureExpired
from django.contrib.auth.models import User
from wechatpayv3 import WeChatPay, WeChatPayType
@@ -508,15 +508,15 @@ def payment_finish(request):
return HttpResponse(str(e), status=500)
@extend_schema_view(
- list=extend_schema(summary="获取AR服务列表", description="获取所有可用的AR服务"),
- retrieve=extend_schema(summary="获取AR服务详情", description="获取指定AR服务的详细信息")
+ list=extend_schema(summary="获取VB课程列表", description="获取所有可用的VB课程"),
+ retrieve=extend_schema(summary="获取VB课程详情", description="获取指定VB课程的详细信息")
)
-class ARServiceViewSet(viewsets.ReadOnlyModelViewSet):
+class VBCourseViewSet(viewsets.ReadOnlyModelViewSet):
"""
- AR服务列表和详情
+ VB课程列表和详情
"""
- queryset = ARService.objects.all().order_by('-created_at')
- serializer_class = ARServiceSerializer
+ queryset = VBCourse.objects.all().order_by('-created_at')
+ serializer_class = VBCourseSerializer
def order_check_view(request):
"""
diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx
index 50bef69..f44e2cf 100644
--- a/frontend/src/App.jsx
+++ b/frontend/src/App.jsx
@@ -6,7 +6,7 @@ import ProductDetail from './pages/ProductDetail';
import Payment from './pages/Payment';
import AIServices from './pages/AIServices';
import ServiceDetail from './pages/ServiceDetail';
-import ARExperience from './pages/ARExperience';
+import VBCourses from './pages/VBCourses';
import MyOrders from './pages/MyOrders';
import 'antd/dist/reset.css';
import './App.css';
@@ -19,7 +19,7 @@ function App() {
} />
} />
} />
- } />
+ } />
} />
} />
} />
diff --git a/frontend/src/api.js b/frontend/src/api.js
index 48225bf..f01ac76 100644
--- a/frontend/src/api.js
+++ b/frontend/src/api.js
@@ -19,7 +19,7 @@ export const confirmPayment = (orderId) => api.post(`/orders/${orderId}/confirm_
export const getServices = () => api.get('/services/');
export const getServiceDetail = (id) => api.get(`/services/${id}/`);
export const createServiceOrder = (data) => api.post('/service-orders/', data);
-export const getARServices = () => api.get('/ar/');
+export const getVBCourses = () => api.get('/courses/');
export const sendSms = (data) => api.post('/auth/send-sms/', data);
export const queryMyOrders = (data) => api.post('/orders/my_orders/', data);
diff --git a/frontend/src/components/Layout.jsx b/frontend/src/components/Layout.jsx
index ad6242d..6adaa09 100644
--- a/frontend/src/components/Layout.jsx
+++ b/frontend/src/components/Layout.jsx
@@ -34,9 +34,9 @@ const Layout = ({ children }) => {
label: 'AI 服务',
},
{
- key: '/ar',
+ key: '/courses',
icon: ,
- label: 'AR 体验',
+ label: 'VB 课程',
},
{
key: '/my-orders',
diff --git a/frontend/src/pages/ARExperience.jsx b/frontend/src/pages/VBCourses.jsx
similarity index 57%
rename from frontend/src/pages/ARExperience.jsx
rename to frontend/src/pages/VBCourses.jsx
index 6dcc837..910c81f 100644
--- a/frontend/src/pages/ARExperience.jsx
+++ b/frontend/src/pages/VBCourses.jsx
@@ -1,28 +1,27 @@
import React, { useState, useEffect } from 'react';
import { motion } from 'framer-motion';
-import { Button, Typography, Spin, Row, Col, Empty } from 'antd';
-import { ScanOutlined } from '@ant-design/icons';
-import { getARServices } from '../api';
+import { Button, Typography, Spin, Row, Col, Empty, Tag } from 'antd';
+import { ReadOutlined, ClockCircleOutlined, UserOutlined, BookOutlined } from '@ant-design/icons';
+import { getVBCourses } from '../api';
const { Title, Paragraph } = Typography;
-const ARExperience = () => {
- const [scanning, setScanning] = useState(true);
- const [arServices, setArServices] = useState([]);
+const VBCourses = () => {
+ const [courses, setCourses] = useState([]);
const [loading, setLoading] = useState(true);
useEffect(() => {
- const fetchAR = async () => {
+ const fetchCourses = async () => {
try {
- const res = await getARServices();
- setArServices(res.data);
+ const res = await getVBCourses();
+ setCourses(res.data);
} catch (error) {
- console.error("Failed to fetch AR services:", error);
+ console.error("Failed to fetch VB Courses:", error);
} finally {
setLoading(false);
}
}
- fetchAR();
+ fetchCourses();
}, []);
if (loading) return
;
@@ -31,20 +30,20 @@ const ARExperience = () => {
- AR UNIVERSE
+ VB CODING COURSES
- 探索全息增强现实体验。请佩戴您的设备,或使用移动端摄像头扫描空间。
+ 探索 Vibe Coding 软件与硬件课程,开启您的编程之旅。
- {arServices.length === 0 ? (
+ {courses.length === 0 ? (
- 暂无 AR 体验内容} />
+ 暂无课程内容} />
) : (
- {arServices.map((item, index) => (
+ {courses.map((item, index) => (
{
border: '1px solid rgba(0,240,255,0.2)',
borderRadius: 12,
overflow: 'hidden',
- height: '100%'
+ height: '100%',
+ display: 'flex',
+ flexDirection: 'column'
}}>
-
+
{item.display_cover_image ? (

) : (
-
+
)}
+
+ {item.tag && (
+ {item.tag}
+ )}
+
+ {item.course_type_display || (item.course_type === 'hardware' ? '硬件课程' : '软件课程')}
+
+
-
-
{item.title}
-
{item.description}
+
+
{item.title}
+
+ {item.instructor}
+ {item.duration}
+ {item.lesson_count} 课时
+
+
{item.description}
@@ -108,4 +122,4 @@ const ARExperience = () => {
);
};
-export default ARExperience;
+export default VBCourses;
diff --git a/miniprogram/config/index.js b/miniprogram/config/index.js
index 77000c6..2d4ff5e 100644
--- a/miniprogram/config/index.js
+++ b/miniprogram/config/index.js
@@ -22,7 +22,7 @@ const config = {
framework: 'react',
compiler: 'webpack5',
cache: {
- enable: false // Disable cache to avoid potential issues
+ enable: true // Enable cache for better build performance
},
mini: {
postcss: {
diff --git a/miniprogram/src/api/index.ts b/miniprogram/src/api/index.ts
index 433f2d9..6bdc308 100644
--- a/miniprogram/src/api/index.ts
+++ b/miniprogram/src/api/index.ts
@@ -15,15 +15,18 @@ export const getServices = () => request({ url: '/services/' })
export const getServiceDetail = (id: number) => request({ url: `/services/${id}/` })
export const createServiceOrder = (data: any) => request({ url: '/service-orders/', method: 'POST', data })
-// AR Services
-export const getARServices = () => request({ url: '/ar/' })
-export const getARServiceDetail = (id: number) => request({ url: `/ar/${id}/` })
+// VB Courses
+export const getVBCourses = () => request({ url: '/courses/' })
+export const getVBCourseDetail = (id: number) => request({ url: `/courses/${id}/` })
// Distributor
export const distributorRegister = (data: any) => request({ url: '/distributor/register/', method: 'POST', data })
export const distributorInfo = () => request({ url: '/distributor/info/' })
export const distributorInvite = () => request({ url: '/distributor/invite/', method: 'POST' })
export const distributorWithdraw = (amount: number) => request({ url: '/distributor/withdraw/', method: 'POST', data: { amount } })
+// TODO: Verify if these exist in the API docs
+// export const distributorTeam = () => request({ url: '/distributor/team/' })
+// export const distributorHistory = () => request({ url: '/distributor/history/' })
// User
export const updateUserInfo = (data: any) => request({ url: '/wechat/update/', method: 'POST', data })
diff --git a/miniprogram/src/app.config.ts b/miniprogram/src/app.config.ts
index 41e0fa3..187cb73 100644
--- a/miniprogram/src/app.config.ts
+++ b/miniprogram/src/app.config.ts
@@ -3,8 +3,8 @@ export default defineAppConfig({
'pages/index/index',
'pages/services/index',
'pages/services/detail',
- 'pages/ar/index',
- 'pages/ar/detail',
+ 'pages/courses/index',
+ 'pages/courses/detail',
'pages/goods/detail',
'pages/cart/cart',
'pages/order/checkout',
@@ -25,14 +25,15 @@ export default defineAppConfig({
],
window: {
backgroundTextStyle: 'light',
- navigationBarBackgroundColor: '#fff',
+ navigationBarBackgroundColor: '#000000',
navigationBarTitleText: 'Quant Speed Market',
- navigationBarTextStyle: 'black'
+ navigationBarTextStyle: 'white'
},
tabBar: {
- color: "#999",
- selectedColor: "#333",
- backgroundColor: "#fff",
+ color: "#666666",
+ selectedColor: "#00b96b",
+ backgroundColor: "#000000",
+ borderStyle: "black",
list: [
{
pagePath: "pages/index/index",
@@ -43,13 +44,19 @@ export default defineAppConfig({
{
pagePath: "pages/services/index",
text: "AI服务",
- iconPath: "./assets/cart.png", // Using cart icon as placeholder if no other icon available
- selectedIconPath: "./assets/cart_active.png"
+ iconPath: "./assets/AI_service.png",
+ selectedIconPath: "./assets/AI_service_active.png"
},
{
- pagePath: "pages/ar/index",
- text: "AR体验",
- iconPath: "./assets/cart.png", // Placeholder
+ pagePath: "pages/courses/index",
+ text: "VB课程",
+ iconPath: "./assets/VR.png",
+ selectedIconPath: "./assets/VR_active.png"
+ },
+ {
+ pagePath: "pages/cart/cart",
+ text: "购物车",
+ iconPath: "./assets/cart.png",
selectedIconPath: "./assets/cart_active.png"
},
{
diff --git a/miniprogram/src/app.scss b/miniprogram/src/app.scss
index 237a53a..55d4031 100644
--- a/miniprogram/src/app.scss
+++ b/miniprogram/src/app.scss
@@ -1,8 +1,18 @@
page {
- background-color: #f7f8fa;
+ --primary-cyan: #00f0ff;
+ --primary-green: #00b96b;
+ --primary-purple: #bd00ff;
+ --bg-dark: #050505;
+ --card-bg: rgba(255, 255, 255, 0.03);
+ --glass-border: rgba(255, 255, 255, 0.08);
+ --text-main: #ffffff;
+ --text-secondary: rgba(255, 255, 255, 0.7);
+
+ background-color: var(--bg-dark);
font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', Helvetica,
Segoe UI, Arial, Roboto, 'PingFang SC', 'miui', 'Hiragino Sans GB', 'Microsoft Yahei',
sans-serif;
+ color: var(--text-main);
}
.container {
diff --git a/miniprogram/src/assets/AI_service.png b/miniprogram/src/assets/AI_service.png
new file mode 100644
index 0000000..b84a007
Binary files /dev/null and b/miniprogram/src/assets/AI_service.png differ
diff --git a/miniprogram/src/assets/AI_service_active.png b/miniprogram/src/assets/AI_service_active.png
new file mode 100644
index 0000000..e6364e0
Binary files /dev/null and b/miniprogram/src/assets/AI_service_active.png differ
diff --git a/miniprogram/src/assets/VR.png b/miniprogram/src/assets/VR.png
new file mode 100644
index 0000000..c22d66a
Binary files /dev/null and b/miniprogram/src/assets/VR.png differ
diff --git a/miniprogram/src/assets/VR_active.png b/miniprogram/src/assets/VR_active.png
new file mode 100644
index 0000000..12555b1
Binary files /dev/null and b/miniprogram/src/assets/VR_active.png differ
diff --git a/miniprogram/src/assets/cart.png b/miniprogram/src/assets/cart.png
index 7484fd0..2f7aff5 100644
Binary files a/miniprogram/src/assets/cart.png and b/miniprogram/src/assets/cart.png differ
diff --git a/miniprogram/src/assets/cart_active.png b/miniprogram/src/assets/cart_active.png
index 270e748..958df53 100644
Binary files a/miniprogram/src/assets/cart_active.png and b/miniprogram/src/assets/cart_active.png differ
diff --git a/miniprogram/src/assets/home.png b/miniprogram/src/assets/home.png
index 7484fd0..3961563 100644
Binary files a/miniprogram/src/assets/home.png and b/miniprogram/src/assets/home.png differ
diff --git a/miniprogram/src/assets/home_active.png b/miniprogram/src/assets/home_active.png
index 270e748..5f3a3e8 100644
Binary files a/miniprogram/src/assets/home_active.png and b/miniprogram/src/assets/home_active.png differ
diff --git a/miniprogram/src/assets/logo.svg b/miniprogram/src/assets/logo.svg
index e2c1f43..1972a12 100644
--- a/miniprogram/src/assets/logo.svg
+++ b/miniprogram/src/assets/logo.svg
@@ -1,6 +1,104 @@
-