Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
P
project-online-fi
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
EzijingWeb
project-online-fi
Commits
c1a14627
提交
c1a14627
authored
1月 12, 2023
作者:
matian
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
项目优化
上级
b3849abf
隐藏空白字符变更
内嵌
并排
正在显示
18 个修改的文件
包含
303 行增加
和
157 行删除
+303
-157
1.js
data/src/goods/1.js
+36
-9
2.js
data/src/goods/2.js
+36
-9
3.js
data/src/goods/3.js
+48
-12
Course.vue
src/modules/home/components/Course.vue
+1
-2
Order.vue
src/modules/pay/views/Order.vue
+11
-3
ContactDialog.vue
src/modules/shop/components/ContactDialog.vue
+1
-0
CourseCatalogH5.vue
src/modules/shop/components/CourseCatalogH5.vue
+1
-1
CourseCatalogPC.vue
src/modules/shop/components/CourseCatalogPC.vue
+1
-1
CourseFooter.vue
src/modules/shop/components/CourseFooter.vue
+26
-22
CourseFor.vue
src/modules/shop/components/CourseFor.vue
+17
-22
CourseList.vue
src/modules/shop/components/CourseList.vue
+3
-10
CourseListItem.vue
src/modules/shop/components/CourseListItem.vue
+20
-11
DetailBanner.vue
src/modules/shop/components/DetailBanner.vue
+23
-13
IncludeCourseCard.vue
src/modules/shop/components/IncludeCourseCard.vue
+1
-2
RecommendCourse.vue
src/modules/shop/components/RecommendCourse.vue
+3
-1
Index.vue
src/modules/shop/views/Index.vue
+10
-6
View.vue
src/modules/shop/views/View.vue
+42
-23
shop.ts
src/stores/shop.ts
+23
-10
没有找到文件。
data/src/goods/1.js
浏览文件 @
c1a14627
...
@@ -26,7 +26,10 @@ export default [
...
@@ -26,7 +26,10 @@ export default [
class_id
:
'7017001355222974464'
,
class_id
:
'7017001355222974464'
,
total_price_desc
:
'课程费用4300元/人,考试费/认证费/教材费合计680元/人'
,
total_price_desc
:
'课程费用4300元/人,考试费/认证费/教材费合计680元/人'
,
sku_id
:
'7014129405609902080'
,
sku_id
:
'7014129405609902080'
,
spu_id
:
'7014129404863315968'
spu_id
:
'7014129404863315968'
,
is_free
:
false
,
is_new
:
true
,
is_test
:
false
},
},
{
{
category
:
'PAAP(Ⅰ)'
,
category
:
'PAAP(Ⅰ)'
,
...
@@ -85,7 +88,10 @@ export default [
...
@@ -85,7 +88,10 @@ export default [
class_id
:
'7017001355222974464'
,
class_id
:
'7017001355222974464'
,
total_price_desc
:
''
,
total_price_desc
:
''
,
sku_id
:
'7018148152972673024'
,
sku_id
:
'7018148152972673024'
,
spu_id
:
'7018148152758763520'
spu_id
:
'7018148152758763520'
,
is_free
:
false
,
is_new
:
true
,
is_test
:
false
},
},
{
{
category
:
'PAAP(Ⅰ)'
,
category
:
'PAAP(Ⅰ)'
,
...
@@ -130,7 +136,10 @@ export default [
...
@@ -130,7 +136,10 @@ export default [
class_id
:
'7017001355222974464'
,
class_id
:
'7017001355222974464'
,
total_price_desc
:
''
,
total_price_desc
:
''
,
sku_id
:
'7018148297881681920'
,
sku_id
:
'7018148297881681920'
,
spu_id
:
'7018148297659383808'
spu_id
:
'7018148297659383808'
,
is_free
:
false
,
is_new
:
true
,
is_test
:
false
},
},
{
{
category
:
'PAAP(Ⅰ)'
,
category
:
'PAAP(Ⅰ)'
,
...
@@ -175,7 +184,10 @@ export default [
...
@@ -175,7 +184,10 @@ export default [
class_id
:
'7017001355222974464'
,
class_id
:
'7017001355222974464'
,
total_price_desc
:
''
,
total_price_desc
:
''
,
sku_id
:
'7018148355993763840'
,
sku_id
:
'7018148355993763840'
,
spu_id
:
'7018148355750494208'
spu_id
:
'7018148355750494208'
,
is_free
:
false
,
is_new
:
true
,
is_test
:
false
},
},
{
{
category
:
'PAAP(Ⅰ)'
,
category
:
'PAAP(Ⅰ)'
,
...
@@ -220,7 +232,10 @@ export default [
...
@@ -220,7 +232,10 @@ export default [
class_id
:
'7017001355222974464'
,
class_id
:
'7017001355222974464'
,
total_price_desc
:
''
,
total_price_desc
:
''
,
sku_id
:
'7018148401996890112'
,
sku_id
:
'7018148401996890112'
,
spu_id
:
'7018148401443241984'
spu_id
:
'7018148401443241984'
,
is_free
:
false
,
is_new
:
true
,
is_test
:
false
},
},
{
{
category
:
'PAAP(Ⅰ)'
,
category
:
'PAAP(Ⅰ)'
,
...
@@ -265,7 +280,10 @@ export default [
...
@@ -265,7 +280,10 @@ export default [
class_id
:
'7017001355222974464'
,
class_id
:
'7017001355222974464'
,
total_price_desc
:
''
,
total_price_desc
:
''
,
sku_id
:
'7018148446439735296'
,
sku_id
:
'7018148446439735296'
,
spu_id
:
'7018148446183882752'
spu_id
:
'7018148446183882752'
,
is_free
:
false
,
is_new
:
true
,
is_test
:
false
},
},
{
{
category
:
'PAAP(Ⅰ)'
,
category
:
'PAAP(Ⅰ)'
,
...
@@ -310,7 +328,10 @@ export default [
...
@@ -310,7 +328,10 @@ export default [
class_id
:
'7017001355222974464'
,
class_id
:
'7017001355222974464'
,
total_price_desc
:
''
,
total_price_desc
:
''
,
sku_id
:
'7018148498998558720'
,
sku_id
:
'7018148498998558720'
,
spu_id
:
'7018148498784649216'
spu_id
:
'7018148498784649216'
,
is_free
:
false
,
is_new
:
true
,
is_test
:
false
},
},
{
{
category
:
'PAAP(Ⅰ)'
,
category
:
'PAAP(Ⅰ)'
,
...
@@ -355,7 +376,10 @@ export default [
...
@@ -355,7 +376,10 @@ export default [
class_id
:
'7017001355222974464'
,
class_id
:
'7017001355222974464'
,
total_price_desc
:
''
,
total_price_desc
:
''
,
sku_id
:
'7018148559375564800'
,
sku_id
:
'7018148559375564800'
,
spu_id
:
'7018148559153266688'
spu_id
:
'7018148559153266688'
,
is_free
:
false
,
is_new
:
false
,
is_test
:
false
},
},
{
{
category
:
'PAAP(Ⅰ)'
,
category
:
'PAAP(Ⅰ)'
,
...
@@ -400,6 +424,9 @@ export default [
...
@@ -400,6 +424,9 @@ export default [
class_id
:
'7017001355222974464'
,
class_id
:
'7017001355222974464'
,
total_price_desc
:
''
,
total_price_desc
:
''
,
sku_id
:
'7018148600190337024'
,
sku_id
:
'7018148600190337024'
,
spu_id
:
'7018148600018370560'
spu_id
:
'7018148600018370560'
,
is_free
:
false
,
is_new
:
true
,
is_test
:
false
}
}
]
]
data/src/goods/2.js
浏览文件 @
c1a14627
...
@@ -26,7 +26,10 @@ export default [
...
@@ -26,7 +26,10 @@ export default [
class_id
:
'7017001355222974464'
,
class_id
:
'7017001355222974464'
,
total_price_desc
:
'课程费用7000元/人,考试费/认证费/教材费合计680元/人'
,
total_price_desc
:
'课程费用7000元/人,考试费/认证费/教材费合计680元/人'
,
sku_id
:
'7014130347952570368'
,
sku_id
:
'7014130347952570368'
,
spu_id
:
'7014130347390533632'
spu_id
:
'7014130347390533632'
,
is_free
:
false
,
is_new
:
true
,
is_test
:
false
},
},
{
{
category
:
'PAAP(Ⅱ)'
,
category
:
'PAAP(Ⅱ)'
,
...
@@ -71,7 +74,10 @@ export default [
...
@@ -71,7 +74,10 @@ export default [
class_id
:
'7017001355222974464'
,
class_id
:
'7017001355222974464'
,
total_price_desc
:
''
,
total_price_desc
:
''
,
sku_id
:
'7018152688009347072'
,
sku_id
:
'7018152688009347072'
,
spu_id
:
'7018152687816409088'
spu_id
:
'7018152687816409088'
,
is_free
:
false
,
is_new
:
true
,
is_test
:
false
},
},
{
{
category
:
'PAAP(Ⅱ)'
,
category
:
'PAAP(Ⅱ)'
,
...
@@ -116,7 +122,10 @@ export default [
...
@@ -116,7 +122,10 @@ export default [
class_id
:
'7017001355222974464'
,
class_id
:
'7017001355222974464'
,
total_price_desc
:
''
,
total_price_desc
:
''
,
sku_id
:
'7018152880926359552'
,
sku_id
:
'7018152880926359552'
,
spu_id
:
'7018152880771170304'
spu_id
:
'7018152880771170304'
,
is_free
:
false
,
is_new
:
true
,
is_test
:
false
},
},
{
{
category
:
'PAAP(Ⅱ)'
,
category
:
'PAAP(Ⅱ)'
,
...
@@ -161,7 +170,10 @@ export default [
...
@@ -161,7 +170,10 @@ export default [
class_id
:
'7017001355222974464'
,
class_id
:
'7017001355222974464'
,
total_price_desc
:
''
,
total_price_desc
:
''
,
sku_id
:
'7018152942817509376'
,
sku_id
:
'7018152942817509376'
,
spu_id
:
'7018152942582628352'
spu_id
:
'7018152942582628352'
,
is_free
:
false
,
is_new
:
true
,
is_test
:
false
},
},
{
{
category
:
'PAAP(Ⅱ)'
,
category
:
'PAAP(Ⅱ)'
,
...
@@ -206,7 +218,10 @@ export default [
...
@@ -206,7 +218,10 @@ export default [
class_id
:
'7017001355222974464'
,
class_id
:
'7017001355222974464'
,
total_price_desc
:
''
,
total_price_desc
:
''
,
sku_id
:
'7018153065505095680'
,
sku_id
:
'7018153065505095680'
,
spu_id
:
'7018153065345712128'
spu_id
:
'7018153065345712128'
,
is_free
:
false
,
is_new
:
true
,
is_test
:
false
},
},
{
{
category
:
'PAAP(Ⅱ)'
,
category
:
'PAAP(Ⅱ)'
,
...
@@ -251,7 +266,10 @@ export default [
...
@@ -251,7 +266,10 @@ export default [
class_id
:
'7017001355222974464'
,
class_id
:
'7017001355222974464'
,
total_price_desc
:
''
,
total_price_desc
:
''
,
sku_id
:
'7018153097708961792'
,
sku_id
:
'7018153097708961792'
,
spu_id
:
'7018153097490857984'
spu_id
:
'7018153097490857984'
,
is_free
:
false
,
is_new
:
true
,
is_test
:
false
},
},
{
{
category
:
'PAAP(Ⅱ)'
,
category
:
'PAAP(Ⅱ)'
,
...
@@ -296,7 +314,10 @@ export default [
...
@@ -296,7 +314,10 @@ export default [
class_id
:
'7017001355222974464'
,
class_id
:
'7017001355222974464'
,
total_price_desc
:
''
,
total_price_desc
:
''
,
sku_id
:
'7018153138490179584'
,
sku_id
:
'7018153138490179584'
,
spu_id
:
'7018153138276270080'
spu_id
:
'7018153138276270080'
,
is_free
:
false
,
is_new
:
false
,
is_test
:
false
},
},
{
{
category
:
'PAAP(Ⅱ)'
,
category
:
'PAAP(Ⅱ)'
,
...
@@ -341,7 +362,10 @@ export default [
...
@@ -341,7 +362,10 @@ export default [
class_id
:
'7017001355222974464'
,
class_id
:
'7017001355222974464'
,
total_price_desc
:
''
,
total_price_desc
:
''
,
sku_id
:
'7018153186531737600'
,
sku_id
:
'7018153186531737600'
,
spu_id
:
'7018153185999060992'
spu_id
:
'7018153185999060992'
,
is_free
:
false
,
is_new
:
false
,
is_test
:
false
},
},
{
{
category
:
'PAAP(Ⅱ)'
,
category
:
'PAAP(Ⅱ)'
,
...
@@ -386,6 +410,9 @@ export default [
...
@@ -386,6 +410,9 @@ export default [
class_id
:
'7017001355222974464'
,
class_id
:
'7017001355222974464'
,
total_price_desc
:
''
,
total_price_desc
:
''
,
sku_id
:
'7018153236649476096'
,
sku_id
:
'7018153236649476096'
,
spu_id
:
'7018153236393623552'
spu_id
:
'7018153236393623552'
,
is_free
:
false
,
is_new
:
false
,
is_test
:
false
}
}
]
]
data/src/goods/3.js
浏览文件 @
c1a14627
...
@@ -26,7 +26,10 @@ export default [
...
@@ -26,7 +26,10 @@ export default [
class_id
:
'7017001355222974464'
,
class_id
:
'7017001355222974464'
,
total_price_desc
:
'课程费用12000元/人,考试费/认证费/教材费合计980元/人'
,
total_price_desc
:
'课程费用12000元/人,考试费/认证费/教材费合计980元/人'
,
sku_id
:
'7014130543629434880'
,
sku_id
:
'7014130543629434880'
,
spu_id
:
'7014130542861877248'
spu_id
:
'7014130542861877248'
,
is_free
:
false
,
is_new
:
true
,
is_test
:
false
},
},
{
{
category
:
'PAAM'
,
category
:
'PAAM'
,
...
@@ -71,7 +74,10 @@ export default [
...
@@ -71,7 +74,10 @@ export default [
class_id
:
'7017001355222974464'
,
class_id
:
'7017001355222974464'
,
total_price_desc
:
''
,
total_price_desc
:
''
,
sku_id
:
'7018154999255400448'
,
sku_id
:
'7018154999255400448'
,
spu_id
:
'7018154999087628288'
spu_id
:
'7018154999087628288'
,
is_free
:
false
,
is_new
:
true
,
is_test
:
false
},
},
{
{
category
:
'PAAM'
,
category
:
'PAAM'
,
...
@@ -116,7 +122,10 @@ export default [
...
@@ -116,7 +122,10 @@ export default [
class_id
:
'7017001355222974464'
,
class_id
:
'7017001355222974464'
,
total_price_desc
:
''
,
total_price_desc
:
''
,
sku_id
:
'7018155082088710144'
,
sku_id
:
'7018155082088710144'
,
spu_id
:
'7018155081837051904'
spu_id
:
'7018155081837051904'
,
is_free
:
false
,
is_new
:
true
,
is_test
:
false
},
},
{
{
category
:
'PAAM'
,
category
:
'PAAM'
,
...
@@ -161,7 +170,10 @@ export default [
...
@@ -161,7 +170,10 @@ export default [
class_id
:
'7017001355222974464'
,
class_id
:
'7017001355222974464'
,
total_price_desc
:
''
,
total_price_desc
:
''
,
sku_id
:
'7018155124648312832'
,
sku_id
:
'7018155124648312832'
,
spu_id
:
'7018155124409237504'
spu_id
:
'7018155124409237504'
,
is_free
:
false
,
is_new
:
true
,
is_test
:
false
},
},
{
{
category
:
'PAAM'
,
category
:
'PAAM'
,
...
@@ -206,7 +218,10 @@ export default [
...
@@ -206,7 +218,10 @@ export default [
class_id
:
'7017001355222974464'
,
class_id
:
'7017001355222974464'
,
total_price_desc
:
''
,
total_price_desc
:
''
,
sku_id
:
'7018155185348280320'
,
sku_id
:
'7018155185348280320'
,
spu_id
:
'7018155185100816384'
spu_id
:
'7018155185100816384'
,
is_free
:
false
,
is_new
:
true
,
is_test
:
false
},
},
{
{
category
:
'PAAM'
,
category
:
'PAAM'
,
...
@@ -251,7 +266,10 @@ export default [
...
@@ -251,7 +266,10 @@ export default [
class_id
:
'7017001355222974464'
,
class_id
:
'7017001355222974464'
,
total_price_desc
:
''
,
total_price_desc
:
''
,
sku_id
:
'7018155221046001664'
,
sku_id
:
'7018155221046001664'
,
spu_id
:
'7018155220798537728'
spu_id
:
'7018155220798537728'
,
is_free
:
false
,
is_new
:
true
,
is_test
:
false
},
},
{
{
category
:
'PAAM'
,
category
:
'PAAM'
,
...
@@ -296,7 +314,10 @@ export default [
...
@@ -296,7 +314,10 @@ export default [
class_id
:
'7017001355222974464'
,
class_id
:
'7017001355222974464'
,
total_price_desc
:
''
,
total_price_desc
:
''
,
sku_id
:
'7018155258798931968'
,
sku_id
:
'7018155258798931968'
,
spu_id
:
'7018155258513719296'
spu_id
:
'7018155258513719296'
,
is_free
:
false
,
is_new
:
true
,
is_test
:
false
},
},
{
{
category
:
'PAAM'
,
category
:
'PAAM'
,
...
@@ -341,7 +362,10 @@ export default [
...
@@ -341,7 +362,10 @@ export default [
class_id
:
'7017001355222974464'
,
class_id
:
'7017001355222974464'
,
total_price_desc
:
''
,
total_price_desc
:
''
,
sku_id
:
'7018155294282743808'
,
sku_id
:
'7018155294282743808'
,
spu_id
:
'7018155294085611520'
spu_id
:
'7018155294085611520'
,
is_free
:
false
,
is_new
:
false
,
is_test
:
false
},
},
{
{
category
:
'PAAM'
,
category
:
'PAAM'
,
...
@@ -386,7 +410,10 @@ export default [
...
@@ -386,7 +410,10 @@ export default [
class_id
:
'7017001355222974464'
,
class_id
:
'7017001355222974464'
,
total_price_desc
:
''
,
total_price_desc
:
''
,
sku_id
:
'7018155330718662656'
,
sku_id
:
'7018155330718662656'
,
spu_id
:
'7018155330425061376'
spu_id
:
'7018155330425061376'
,
is_free
:
false
,
is_new
:
false
,
is_test
:
false
},
},
{
{
category
:
'PAAM'
,
category
:
'PAAM'
,
...
@@ -431,7 +458,10 @@ export default [
...
@@ -431,7 +458,10 @@ export default [
class_id
:
'7017001355222974464'
,
class_id
:
'7017001355222974464'
,
total_price_desc
:
''
,
total_price_desc
:
''
,
sku_id
:
'7018155379125125120'
,
sku_id
:
'7018155379125125120'
,
spu_id
:
'7018155378894438400'
spu_id
:
'7018155378894438400'
,
is_free
:
false
,
is_new
:
false
,
is_test
:
false
},
},
{
{
category
:
'PAAM'
,
category
:
'PAAM'
,
...
@@ -476,7 +506,10 @@ export default [
...
@@ -476,7 +506,10 @@ export default [
class_id
:
'7017001355222974464'
,
class_id
:
'7017001355222974464'
,
total_price_desc
:
''
,
total_price_desc
:
''
,
sku_id
:
'7018155430316605440'
,
sku_id
:
'7018155430316605440'
,
spu_id
:
'7018155430069141504'
spu_id
:
'7018155430069141504'
,
is_free
:
false
,
is_new
:
false
,
is_test
:
false
},
},
{
{
category
:
'PAAM'
,
category
:
'PAAM'
,
...
@@ -521,6 +554,9 @@ export default [
...
@@ -521,6 +554,9 @@ export default [
class_id
:
'7017001355222974464'
,
class_id
:
'7017001355222974464'
,
total_price_desc
:
''
,
total_price_desc
:
''
,
sku_id
:
'7018155468174393344'
,
sku_id
:
'7018155468174393344'
,
spu_id
:
'7018155467947900928'
spu_id
:
'7018155467947900928'
,
is_free
:
false
,
is_new
:
false
,
is_test
:
false
}
}
]
]
src/modules/home/components/Course.vue
浏览文件 @
c1a14627
...
@@ -49,7 +49,7 @@ watchEffect(() => {
...
@@ -49,7 +49,7 @@ watchEffect(() => {
const
courseIndex
=
$ref
(
0
)
const
courseIndex
=
$ref
(
0
)
const
handleDetail
=
(
id
:
any
)
=>
{
const
handleDetail
=
(
id
:
any
)
=>
{
router
.
push
(
`/shop/
detail/
${
id
}
`
)
router
.
push
(
`/shop/
?id=
${
id
}
`
)
}
}
const
handleBuy
=
(
item
:
any
)
=>
{
const
handleBuy
=
(
item
:
any
)
=>
{
if
(
item
.
isBuy
===
true
)
{
if
(
item
.
isBuy
===
true
)
{
...
@@ -177,7 +177,6 @@ const handleBuy = (item: any) => {
...
@@ -177,7 +177,6 @@ const handleBuy = (item: any) => {
</h2>
</h2>
<img
:src=
"item.imgH5"
class=
"img1"
/>
<img
:src=
"item.imgH5"
class=
"img1"
/>
<div
class=
"btn-box"
>
<div
class=
"btn-box"
>
{{
item
.
isBuy
}}
<div
class=
"btn1"
@
click=
"handleDetail(item.id)"
>
查看详情
</div>
<div
class=
"btn1"
@
click=
"handleDetail(item.id)"
>
查看详情
</div>
<div
class=
"btn2"
@
click=
"handleBuy(item)"
>
<div
class=
"btn2"
@
click=
"handleBuy(item)"
>
{{
item
.
isBuy
===
true
?
'联系我们'
:
'立即购买'
}}
{{
item
.
isBuy
===
true
?
'联系我们'
:
'立即购买'
}}
...
...
src/modules/pay/views/Order.vue
浏览文件 @
c1a14627
...
@@ -5,7 +5,7 @@ import { getOrderList } from '../api'
...
@@ -5,7 +5,7 @@ import { getOrderList } from '../api'
import
{
useDevice
}
from
'@/composables/useDevice'
import
{
useDevice
}
from
'@/composables/useDevice'
import
{
useShopStore
}
from
'@/stores/shop'
import
{
useShopStore
}
from
'@/stores/shop'
import
{
useUserStore
}
from
'@/stores/user'
import
{
useUserStore
}
from
'@/stores/user'
import
ContactDialog
from
'../../shop/components/ContactDialog.vue'
interface
Props
{
interface
Props
{
id
:
string
id
:
string
}
}
...
@@ -17,6 +17,8 @@ const { mobile } = useDevice()
...
@@ -17,6 +17,8 @@ const { mobile } = useDevice()
const
router
=
useRouter
()
const
router
=
useRouter
()
const
route
=
useRoute
()
const
route
=
useRoute
()
const
buyDialogVisible
=
ref
(
false
)
const
orderId
=
useStorage
(
'order_detail_id'
,
route
.
query
.
order_detail_id
)
const
orderId
=
useStorage
(
'order_detail_id'
,
route
.
query
.
order_detail_id
)
const
order
=
ref
<
Order
>
()
const
order
=
ref
<
Order
>
()
async
function
getOrder
()
{
async
function
getOrder
()
{
...
@@ -44,7 +46,11 @@ const start_time = getDateTime(0)
...
@@ -44,7 +46,11 @@ const start_time = getDateTime(0)
const
end_time
=
getDateTime
(
90
)
const
end_time
=
getDateTime
(
90
)
const
handleStudy
=
()
=>
{
const
handleStudy
=
()
=>
{
window
.
open
(
'https://fi-learning.ezijing.com'
)
if
(
shopItem
?.
is_new
===
true
)
{
buyDialogVisible
.
value
=
true
}
else
{
window
.
open
(
'https://fi-learning.ezijing.com'
)
}
}
}
const
handlePrev
=
()
=>
{
const
handlePrev
=
()
=>
{
router
.
replace
({
path
:
`/shop/detail/
${
shopItem
?.
id
}
` })
router
.
replace
({
path
:
`/shop/detail/
${
shopItem
?.
id
}
` })
...
@@ -87,7 +93,8 @@ const handlePrev = () => {
...
@@ -87,7 +93,8 @@ const handlePrev = () => {
<div
class=
"course_con"
>
<div
class=
"course_con"
>
<img
<img
src=
"https://img1.baidu.com/it/u=3009731526,373851691&fm=253&fmt=auto&app=138&f=JPEG?w=800&h=500"
src=
"https://img1.baidu.com/it/u=3009731526,373851691&fm=253&fmt=auto&app=138&f=JPEG?w=800&h=500"
@
click=
"handlePrev"
/>
@
click=
"handlePrev"
/>
<div
class=
"course_dec"
>
<div
class=
"course_dec"
>
<div
class=
"info_title"
>
{{
shopItem
?.
title
}}
</div>
<div
class=
"info_title"
>
{{
shopItem
?.
title
}}
</div>
<div
class=
"info_date"
>
有效期:
{{
start_time
}}
至
{{
end_time
}}
</div>
<div
class=
"info_date"
>
有效期:
{{
start_time
}}
至
{{
end_time
}}
</div>
...
@@ -106,6 +113,7 @@ const handlePrev = () => {
...
@@ -106,6 +113,7 @@ const handlePrev = () => {
<div
class=
"study_con"
@
click=
"handleStudy"
>
开始学习
</div>
<div
class=
"study_con"
@
click=
"handleStudy"
>
开始学习
</div>
</div>
</div>
</div>
</div>
<ContactDialog
v-model:buyDialogVisible=
"buyDialogVisible"
/>
</div>
</div>
</
template
>
</
template
>
...
...
src/modules/shop/components/ContactDialog.vue
浏览文件 @
c1a14627
...
@@ -82,6 +82,7 @@ const handleCancel = () => {
...
@@ -82,6 +82,7 @@ const handleCancel = () => {
.buy_alert
{
.buy_alert
{
display
:
flex
;
display
:
flex
;
align-items
:
center
;
align-items
:
center
;
justify-content
:
center
;
flex-direction
:
column
;
flex-direction
:
column
;
.alert_con
{
.alert_con
{
text-align
:
center
;
text-align
:
center
;
...
...
src/modules/shop/components/CourseCatalogH5.vue
浏览文件 @
c1a14627
...
@@ -21,7 +21,7 @@ const handleDetail = (item: any) => {
...
@@ -21,7 +21,7 @@ const handleDetail = (item: any) => {
<div
class=
"info_line"
></div>
<div
class=
"info_line"
></div>
<div
class=
"info_con1"
v-if=
"shopItem?.type === '课程包'"
>
<div
class=
"info_con1"
v-if=
"shopItem?.type === '课程包'"
>
<div
class=
"course_list"
v-for=
"(item, index) in shopItem?.course_list"
:key=
"index"
@
click=
"handleDetail(item)"
>
<div
class=
"course_list"
v-for=
"(item, index) in shopItem?.course_list"
:key=
"index"
@
click=
"handleDetail(item)"
>
<img
:src=
"item.image_url"
/>
<img
:src=
"item.image_url"
alt=
""
/>
<div
class=
"list_info"
>
<div
class=
"list_info"
>
<div
class=
"tit"
>
{{
item
.
title
}}
</div>
<div
class=
"tit"
>
{{
item
.
title
}}
</div>
<div
class=
"hour"
>
{{
item
.
course_hour
}}
</div>
<div
class=
"hour"
>
{{
item
.
course_hour
}}
</div>
...
...
src/modules/shop/components/CourseCatalogPC.vue
浏览文件 @
c1a14627
...
@@ -21,7 +21,7 @@ const handleDetail = (item: any) => {
...
@@ -21,7 +21,7 @@ const handleDetail = (item: any) => {
<div
class=
"info_line"
></div>
<div
class=
"info_line"
></div>
<div
class=
"info_con1"
v-if=
"shopItem?.type === '课程包'"
>
<div
class=
"info_con1"
v-if=
"shopItem?.type === '课程包'"
>
<div
class=
"course_list"
v-for=
"(item, index) in shopItem?.course_list"
:key=
"index"
@
click=
"handleDetail(item)"
>
<div
class=
"course_list"
v-for=
"(item, index) in shopItem?.course_list"
:key=
"index"
@
click=
"handleDetail(item)"
>
<img
:src=
"item.image_url"
/>
<img
:src=
"item.image_url"
alt=
""
/>
<div
class=
"list_info"
>
<div
class=
"list_info"
>
<div
class=
"tit"
>
{{
item
.
title
}}
</div>
<div
class=
"tit"
>
{{
item
.
title
}}
</div>
<div
class=
"hour"
>
{{
item
.
course_hour
}}
</div>
<div
class=
"hour"
>
{{
item
.
course_hour
}}
</div>
...
...
src/modules/shop/components/CourseFooter.vue
浏览文件 @
c1a14627
...
@@ -18,14 +18,17 @@ const buyDialogVisible = ref(false)
...
@@ -18,14 +18,17 @@ const buyDialogVisible = ref(false)
const
handleBuyCourse
=
()
=>
{
const
handleBuyCourse
=
()
=>
{
if
(
user
.
isLogin
)
{
if
(
user
.
isLogin
)
{
if
(
props
.
payStatus
===
'4'
||
props
.
shopItem
?.
isBuy
===
true
)
{
if
(
props
.
payStatus
===
'4'
||
props
.
shopItem
?.
isBuy
===
true
)
{
// window.open('https://fi-learning.ezijing.com')
if
(
props
.
shopItem
?.
category
===
'system_course'
)
{
buyDialogVisible
.
value
=
true
buyDialogVisible
.
value
=
true
}
else
{
window
.
open
(
'https://fi-learning.ezijing.com'
)
}
}
else
{
}
else
{
// if (props.shopItem?.type === '课程包
') {
if
(
props
.
shopItem
?.
category
===
'free_course
'
)
{
//
buyDialogVisible.value = true
buyDialogVisible
.
value
=
true
//
} else {
}
else
{
router
.
push
(
`/shop/pay/
${
props
.
shopItem
?.
id
}
`)
router
.
push
(
`/shop/pay/
${
props
.
shopItem
?.
id
}
`)
//
}
}
}
}
} else {
} else {
window.location.href = `
$
{
import
.
meta
.
env
.
VITE_LOGIN_URL
}?
rd
=
$
{
encodeURIComponent
(
location
.
href
)}
`
window.location.href = `
$
{
import
.
meta
.
env
.
VITE_LOGIN_URL
}?
rd
=
$
{
encodeURIComponent
(
location
.
href
)}
`
...
@@ -46,7 +49,7 @@ const handleBuyCourse = () => {
...
@@ -46,7 +49,7 @@ const handleBuyCourse = () => {
</div>
</div>
</
template
>
</
template
>
<div
class=
"footer_btn"
@
click=
"handleBuyCourse"
>
<div
class=
"footer_btn"
@
click=
"handleBuyCourse"
>
{{ payStatus === '4' || shopItem?.isBuy === true
? '联系我们
' : '立即购买' }}
{{ payStatus === '4' || shopItem?.isBuy === true
|| shopItem?.is_free === true ? '立即学习
' : '立即购买' }}
</div>
</div>
</div>
</div>
<div
class=
"detail_footer"
v-else
>
<div
class=
"detail_footer"
v-else
>
...
@@ -55,27 +58,22 @@ const handleBuyCourse = () => {
...
@@ -55,27 +58,22 @@ const handleBuyCourse = () => {
<div
class=
"footer_left"
v-if=
"shopItem?.type === '课程包'"
>
<div
class=
"footer_left"
v-if=
"shopItem?.type === '课程包'"
>
<div
class=
"left_tit"
>
<div
class=
"left_tit"
>
总学费
<span
class=
"tit_price"
>
¥
{{
shopItem
?.
price
}}
</span>
总学费
<span
class=
"tit_price"
>
¥
{{
shopItem
?.
price
}}
</span>
<!--
<div
class=
"footer_price"
>
<div
class=
"price_icon"
>
¥
</div>
<div
class=
"price_price"
>
{{
shopItem
?.
price
}}
</div>
</div>
-->
</div>
</div>
<div
class=
"left_desc"
>
{{
shopItem
?.
total_price_desc
}}
</div>
<div
class=
"left_desc"
>
{{
shopItem
?.
total_price_desc
}}
</div>
</div>
</div>
<div
class=
"footer_left"
v-else
>
<div
class=
"footer_left"
v-else
>
<div
class=
"left_tit"
>
课程价格
</div>
<div
class=
"left_tit1"
v-if=
"shopItem?.is_free === true"
>
免费
</div>
<div
class=
"left_tit"
v-else
>
课程价格
<span
class=
"tit_price"
>
¥
{{
shopItem
?.
price
}}
</span>
</div>
</div>
</div>
</
template
>
</
template
>
<div
class=
"footer_btn"
@
click=
"handleBuyCourse"
v-if=
"payStatus === '4' || shopItem?.isBuy === true"
>
<div
class=
"footer_btn"
@
click=
"handleBuyCourse"
>
<div
class=
"btn_buy"
>
联系我们
</div>
<div
class=
"btn_buy"
>
</div>
{{ payStatus === '4' || shopItem?.isBuy === true || shopItem?.is_free === true ? '立即学习' : '立即购买' }}
<div
class=
"footer_btn"
@
click=
"handleBuyCourse"
v-else
>
</div>
<!-- <div class="footer_price">
<div class="price_icon">¥</div>
<div class="price_price">{{ shopItem?.price }}</div>
</div> -->
<div
class=
"btn_buy"
>
立即购买
</div>
</div>
</div>
</div>
</div>
<ContactDialog
v-model:buyDialogVisible=
"buyDialogVisible"
/>
<ContactDialog
v-model:buyDialogVisible=
"buyDialogVisible"
/>
...
@@ -165,9 +163,15 @@ const handleBuyCourse = () => {
...
@@ -165,9 +163,15 @@ const handleBuyCourse = () => {
}
}
}
}
.footer_left
{
.footer_left
{
.left_tit1
{
color
:
#aa1941
;
font-size
:
0
.36rem
;
font-weight
:
bold
;
}
.left_tit
{
.left_tit
{
font-size
:
0
.24rem
;
font-size
:
0
.24rem
;
color
:
#333333
;
color
:
#333333
;
font-weight
:
500
;
.tit_price
{
.tit_price
{
color
:
#aa1941
;
color
:
#aa1941
;
font-size
:
0
.36rem
;
font-size
:
0
.36rem
;
...
...
src/modules/shop/components/CourseFor.vue
浏览文件 @
c1a14627
...
@@ -6,21 +6,18 @@ defineProps({
...
@@ -6,21 +6,18 @@ defineProps({
})
})
</
script
>
</
script
>
<
template
>
<
template
>
<div
class=
"course_info"
>
<div
class=
"course_info"
>
<div
class=
"course_info course_info1"
>
<div
class=
"course_info course_info1"
>
<div
class=
"info_tit"
>
适用人群
</div>
<div
class=
"info_tit"
>
适用人群
</div>
<div
class=
"info_line"
></div>
<div
class=
"info_line"
></div>
<div
class=
"info_con"
>
{{
shopItem
?.
for_people
}}
</div>
<div
class=
"info_con"
>
{{
shopItem
?.
for_people
}}
</div>
</div>
</div>
</div>
</div>
</
template
>
</
template
>
<
style
lang=
"scss"
scoped
>
<
style
lang=
"scss"
scoped
>
.is-pc
{
.is-pc
{
.course_info
{
.course_info
{
margin-top
:
40px
;
margin-top
:
40px
;
.info_tit
{
.info_tit
{
...
@@ -44,29 +41,28 @@ defineProps({
...
@@ -44,29 +41,28 @@ defineProps({
line-height
:
32px
;
line-height
:
32px
;
color
:
#666666
;
color
:
#666666
;
}
}
}
}
}
}
.is-h5
{
.is-h5
{
.course_info
{
.course_info
{
.info_tit
{
.info_tit
{
font-size
:
0
.28rem
;
font-size
:
0
.28rem
;
font-weight
:
500
;
font-weight
:
500
;
color
:
#333333
;
color
:
#333333
;
}
}
.info_line
{
.info_line
{
display
:
none
;
display
:
none
;
}
}
.info_con
{
.info_con
{
padding
:
0
.2rem
;
padding
:
0
.2rem
;
background
:
#
F4F8FB
;
background
:
#
f4f8fb
;
font-size
:
0
.24rem
;
font-size
:
0
.24rem
;
font-weight
:
400
;
font-weight
:
400
;
line-height
:
0
.4rem
;
line-height
:
0
.4rem
;
color
:
#666666
;
color
:
#666666
;
margin-top
:
0
.2rem
;
margin-top
:
0
.2rem
;
border-radius
:
0
.16rem
;
border-radius
:
0
.16rem
;
}
}
}
}
}
}
</
style
>
</
style
>
\ No newline at end of file
src/modules/shop/components/CourseList.vue
浏览文件 @
c1a14627
...
@@ -12,9 +12,7 @@ const page = reactive({ size: 10, currentPage: 1 })
...
@@ -12,9 +12,7 @@ const page = reactive({ size: 10, currentPage: 1 })
// 筛选之后的数据
// 筛选之后的数据
const
courseFilterList
=
$computed
(()
=>
{
const
courseFilterList
=
$computed
(()
=>
{
return
props
.
courseList
.
filter
(
return
props
.
courseList
.
filter
((
item
:
any
)
=>
item
.
category
===
props
.
type
||
props
.
type
===
''
)
(
item
:
any
)
=>
item
.
category
===
props
.
type
||
props
.
type
===
''
)
})
})
// 当前页的数据
// 当前页的数据
...
@@ -23,8 +21,7 @@ const currentCourseList = $computed<any[]>(() => {
...
@@ -23,8 +21,7 @@ const currentCourseList = $computed<any[]>(() => {
const
start
=
(
page
.
currentPage
-
1
)
*
page
.
size
const
start
=
(
page
.
currentPage
-
1
)
*
page
.
size
// 结束位置 = 当前页 x 每页的大小
// 结束位置 = 当前页 x 每页的大小
const
end
=
page
.
currentPage
*
page
.
size
const
end
=
page
.
currentPage
*
page
.
size
const
pageList
=
courseFilterList
.
slice
(
start
,
end
)
return
courseFilterList
.
slice
(
start
,
end
)
return
pageList
})
})
const
paginationLayout
=
$computed
(()
=>
{
const
paginationLayout
=
$computed
(()
=>
{
...
@@ -34,11 +31,7 @@ const paginationLayout = $computed(() => {
...
@@ -34,11 +31,7 @@ const paginationLayout = $computed(() => {
<
template
>
<
template
>
<div
class=
"course_list"
>
<div
class=
"course_list"
>
<CourseListItem
<CourseListItem
:courseItem=
"item"
v-for=
"(item, index) in currentCourseList"
:key=
"index"
></CourseListItem>
:courseItem=
"item"
v-for=
"(item, index) in currentCourseList"
:key=
"index"
></CourseListItem>
</div>
</div>
<div
class=
"pagination"
v-if=
"courseFilterList.length > page.size"
>
<div
class=
"pagination"
v-if=
"courseFilterList.length > page.size"
>
<el-pagination
<el-pagination
...
...
src/modules/shop/components/CourseListItem.vue
浏览文件 @
c1a14627
...
@@ -2,7 +2,6 @@
...
@@ -2,7 +2,6 @@
import
ContactDialog
from
'../components/ContactDialog.vue'
import
ContactDialog
from
'../components/ContactDialog.vue'
import
{
useDevice
}
from
'@/composables/useDevice'
import
{
useDevice
}
from
'@/composables/useDevice'
import
{
useUserStore
}
from
'@/stores/user'
import
{
useUserStore
}
from
'@/stores/user'
const
{
mobile
}
=
useDevice
()
const
{
mobile
}
=
useDevice
()
const
user
=
useUserStore
()
const
user
=
useUserStore
()
...
@@ -23,14 +22,17 @@ const handleDatail = (item: any) => {
...
@@ -23,14 +22,17 @@ const handleDatail = (item: any) => {
const
handleBuy
=
(
courseItem
:
any
)
=>
{
const
handleBuy
=
(
courseItem
:
any
)
=>
{
if
(
user
.
isLogin
)
{
if
(
user
.
isLogin
)
{
if
(
courseItem
?.
isBuy
===
true
)
{
if
(
courseItem
?.
isBuy
===
true
)
{
// window.open('https://fi-learning.ezijing.com')
if
(
courseItem
?.
is_new
===
true
)
{
buyDialogVisible
.
value
=
true
buyDialogVisible
.
value
=
true
}
else
{
window
.
open
(
'https://fi-learning.ezijing.com'
)
}
}
else
{
}
else
{
// if (courseItem.type === '课程包'
) {
if
(
courseItem
?.
is_free
===
true
)
{
//
buyDialogVisible.value = true
buyDialogVisible
.
value
=
true
//
} else {
}
else
{
router
.
push
(
`/shop/pay/
${
courseItem
.
id
}
`
)
router
.
push
(
`/shop/pay/
${
courseItem
.
id
}
`
)
//
}
}
}
}
}
else
{
}
else
{
window
.
location
.
href
=
`
${
import
.
meta
.
env
.
VITE_LOGIN_URL
}
?rd=
${
encodeURIComponent
(
location
.
href
)}
`
window
.
location
.
href
=
`
${
import
.
meta
.
env
.
VITE_LOGIN_URL
}
?rd=
${
encodeURIComponent
(
location
.
href
)}
`
...
@@ -59,14 +61,17 @@ const handleBuy = (courseItem: any) => {
...
@@ -59,14 +61,17 @@ const handleBuy = (courseItem: any) => {
</div>
</div>
</div>
</div>
<div
class=
"right_bottom"
>
<div
class=
"right_bottom"
>
<div
class=
"bottom_price"
v-if=
"!mobile"
>
<div
class=
"bottom_price"
v-if=
"!mobile
&& courseItem?.price !== 0
"
>
<div
class=
"price_icon"
>
¥
</div>
<div
class=
"price_icon"
>
¥
</div>
<div
class=
"price_num"
>
{{
courseItem
?.
price
}}
</div>
<div
class=
"price_num"
>
{{
courseItem
?.
price
}}
</div>
</div>
</div>
<div
class=
"bottom_price"
v-if=
"!mobile && courseItem?.price === 0"
>
<div
class=
"price_icon"
>
免费
</div>
</div>
<div
class=
"bottom_btn"
>
<div
class=
"bottom_btn"
>
<div
class=
"btn_detail"
v-if=
"!mobile"
@
click=
"handleDatail(courseItem?.id)"
>
查看详情
</div>
<div
class=
"btn_detail"
v-if=
"!mobile"
@
click=
"handleDatail(courseItem?.id)"
>
查看详情
</div>
<div
class=
"btn_buy"
@
click=
"handleBuy(courseItem)"
>
<div
class=
"btn_buy"
@
click=
"handleBuy(courseItem)"
>
{{
courseItem
?.
isBuy
===
true
?
'联系我们
'
:
'立即购买'
}}
{{
courseItem
?.
isBuy
===
true
||
courseItem
?.
category
===
'free_course'
?
'立即学习
'
:
'立即购买'
}}
</div>
</div>
</div>
</div>
</div>
</div>
...
@@ -112,6 +117,7 @@ const handleBuy = (courseItem: any) => {
...
@@ -112,6 +117,7 @@ const handleBuy = (courseItem: any) => {
position
:
absolute
;
position
:
absolute
;
top
:
10px
;
top
:
10px
;
right
:
10px
;
right
:
10px
;
text-align
:
center
;
}
}
}
}
.con_right
{
.con_right
{
...
@@ -125,7 +131,7 @@ const handleBuy = (courseItem: any) => {
...
@@ -125,7 +131,7 @@ const handleBuy = (courseItem: any) => {
.use_icon
{
.use_icon
{
width
:
67px
;
width
:
67px
;
height
:
21px
;
height
:
21px
;
background
:
#f4eadb
;
background
:
rgba
(
244
,
234
,
219
,
0
.39
)
;
border-radius
:
2px
;
border-radius
:
2px
;
font-size
:
14px
;
font-size
:
14px
;
font-weight
:
400
;
font-weight
:
400
;
...
@@ -191,6 +197,7 @@ const handleBuy = (courseItem: any) => {
...
@@ -191,6 +197,7 @@ const handleBuy = (courseItem: any) => {
line-height
:
32px
;
line-height
:
32px
;
color
:
#e2971d
;
color
:
#e2971d
;
cursor
:
pointer
;
cursor
:
pointer
;
text-align
:
center
;
}
}
.btn_buy
{
.btn_buy
{
width
:
96px
;
width
:
96px
;
...
@@ -203,6 +210,7 @@ const handleBuy = (courseItem: any) => {
...
@@ -203,6 +210,7 @@ const handleBuy = (courseItem: any) => {
color
:
#ffffff
;
color
:
#ffffff
;
margin-left
:
20px
;
margin-left
:
20px
;
cursor
:
pointer
;
cursor
:
pointer
;
text-align
:
center
;
}
}
}
}
}
}
...
@@ -242,6 +250,7 @@ const handleBuy = (courseItem: any) => {
...
@@ -242,6 +250,7 @@ const handleBuy = (courseItem: any) => {
position
:
absolute
;
position
:
absolute
;
top
:
10px
;
top
:
10px
;
right
:
10px
;
right
:
10px
;
text-align
:
center
;
}
}
}
}
.con_right
{
.con_right
{
...
...
src/modules/shop/components/DetailBanner.vue
浏览文件 @
c1a14627
...
@@ -33,14 +33,17 @@ const shareTit = computed(() => {
...
@@ -33,14 +33,17 @@ const shareTit = computed(() => {
const
handleBuyCourse
=
()
=>
{
const
handleBuyCourse
=
()
=>
{
if
(
user
.
isLogin
)
{
if
(
user
.
isLogin
)
{
if
(
props
.
payStatus
===
'4'
||
props
.
shopItem
?.
isBuy
===
true
)
{
if
(
props
.
payStatus
===
'4'
||
props
.
shopItem
?.
isBuy
===
true
)
{
// window.open('https://fi-learning.ezijing.com')
if
(
props
.
shopItem
?.
is_new
===
true
)
{
buyDialogVisible
.
value
=
true
buyDialogVisible
.
value
=
true
}
else
{
window
.
open
(
'https://fi-learning.ezijing.com'
)
}
}
else
{
}
else
{
// if (props.shopItem?.type === '课程包'
) {
if
(
props
.
shopItem
?.
is_free
===
true
)
{
//
buyDialogVisible.value = true
buyDialogVisible
.
value
=
true
//
} else {
}
else
{
router
.
push
(
`/shop/pay/
${
props
.
shopItem
?.
id
}
`)
router
.
push
(
`/shop/pay/
${
props
.
shopItem
?.
id
}
`)
//
}
}
}
}
} else {
} else {
window.location.href = `
$
{
import
.
meta
.
env
.
VITE_LOGIN_URL
}?
rd
=
$
{
encodeURIComponent
(
location
.
href
)}
`
window.location.href = `
$
{
import
.
meta
.
env
.
VITE_LOGIN_URL
}?
rd
=
$
{
encodeURIComponent
(
location
.
href
)}
`
...
@@ -100,6 +103,7 @@ const handleCopyLink = () => {
...
@@ -100,6 +103,7 @@ const handleCopyLink = () => {
<div
class=
"detail_banner"
>
<div
class=
"detail_banner"
>
<div
class=
"banner_con"
>
<div
class=
"banner_con"
>
<img
class=
"con_img"
:src=
"shopItem?.image_url"
/>
<img
class=
"con_img"
:src=
"shopItem?.image_url"
/>
<template
v-if=
"!mobile"
>
<template
v-if=
"!mobile"
>
<div
class=
"con_info"
>
<div
class=
"con_info"
>
<div
class=
"info_tit"
>
{{
shopItem
?.
title
}}
</div>
<div
class=
"info_tit"
>
{{
shopItem
?.
title
}}
</div>
...
@@ -121,17 +125,22 @@ const handleCopyLink = () => {
...
@@ -121,17 +125,22 @@ const handleCopyLink = () => {
<div
class=
"detail_buy"
>
<div
class=
"detail_buy"
>
<div
class=
"buy_left"
>
<div
class=
"buy_left"
>
<div
class=
"left_status"
v-if=
"payStatus === '4' || shopItem?.isBuy === true"
>
已购买
</div>
<div
class=
"left_status"
v-if=
"payStatus === '4' || shopItem?.isBuy === true"
>
已购买
</div>
<div
class=
"left_price"
v-else
>
<
template
v-else
>
<div
class=
"price_icon"
>
¥
</div>
<div
class=
"left_price"
v-if=
"shopItem?.price !== 0"
>
<div
class=
"price_num"
>
{{ shopItem?.price }}
</div>
<div
class=
"price_icon"
>
¥
</div>
</div>
<div
class=
"price_num"
>
{{
shopItem
?.
price
}}
</div>
</div>
<div
class=
"left_price"
v-else
>
<div
class=
"price_icon"
>
免费
</div>
</div>
</
template
>
<div
class=
"left_tip"
>
<div
class=
"left_tip"
>
<div
class=
"tip1 tip"
>
支付安全
</div>
<div
class=
"tip1 tip"
v-if=
"shopItem?.price !== 0"
>
支付安全
</div>
<div
class=
"tip2 tip"
>
课程回放
</div>
<div
class=
"tip2 tip"
>
课程回放
</div>
</div>
</div>
</div>
</div>
<div
class=
"buy_right"
@
click=
"handleBuyCourse"
v-if=
"!mobile"
>
<div
class=
"buy_right"
@
click=
"handleBuyCourse"
v-if=
"!mobile"
>
{{ payStatus === '4' || shopItem?.isBuy === true
? '联系我们
' : '立即购买' }}
{{ payStatus === '4' || shopItem?.isBuy === true
|| shopItem?.is_free === true ? '立即学习
' : '立即购买' }}
</div>
</div>
</div>
</div>
<div
class=
"detail_info"
v-if=
"mobile"
>
<div
class=
"detail_info"
v-if=
"mobile"
>
...
@@ -436,6 +445,7 @@ const handleCopyLink = () => {
...
@@ -436,6 +445,7 @@ const handleCopyLink = () => {
margin-top
:
0
.2rem
;
margin-top
:
0
.2rem
;
padding
:
0
.15rem
1
.2rem
;
padding
:
0
.15rem
1
.2rem
;
display
:
flex
;
display
:
flex
;
justify-content
:
space-around
;
align-items
:
center
;
align-items
:
center
;
border-radius
:
0
.08rem
;
border-radius
:
0
.08rem
;
...
...
src/modules/shop/components/IncludeCourseCard.vue
浏览文件 @
c1a14627
...
@@ -127,8 +127,7 @@ defineProps({
...
@@ -127,8 +127,7 @@ defineProps({
img
{
img
{
width
:
1
.6rem
;
width
:
1
.6rem
;
height
:
0
.9rem
;
height
:
0
.9rem
;
border-radius
:
0
.06rem
;
border-radius
:
0
.05rem
;
object-fit
:
cover
;
}
}
.course_info
{
.course_info
{
margin-left
:
0
.14rem
;
margin-left
:
0
.14rem
;
...
...
src/modules/shop/components/RecommendCourse.vue
浏览文件 @
c1a14627
...
@@ -182,7 +182,7 @@ const handleDetail = item => {
...
@@ -182,7 +182,7 @@ const handleDetail = item => {
.img
{
.img
{
// width: 2.2rem;
// width: 2.2rem;
height
:
1
.4rem
;
height
:
1
.4rem
;
border-radius
:
6px
;
border-radius
:
0
.06rem
;
}
}
.item_right
{
.item_right
{
margin-left
:
0
.21rem
;
margin-left
:
0
.21rem
;
...
@@ -192,6 +192,8 @@ const handleDetail = item => {
...
@@ -192,6 +192,8 @@ const handleDetail = item => {
font-size
:
0
.28rem
;
font-size
:
0
.28rem
;
font-weight
:
500
;
font-weight
:
500
;
color
:
#333333
;
color
:
#333333
;
// width: 3.69rem;
// white-space: wrap;
}
}
.right_price
{
.right_price
{
display
:
flex
;
display
:
flex
;
...
...
src/modules/shop/views/Index.vue
浏览文件 @
c1a14627
...
@@ -2,16 +2,20 @@
...
@@ -2,16 +2,20 @@
import
CourseList
from
'../components/CourseList.vue'
import
CourseList
from
'../components/CourseList.vue'
import
{
useShopStore
}
from
'@/stores/shop'
import
{
useShopStore
}
from
'@/stores/shop'
import
{
useDevice
}
from
'@/composables/useDevice'
import
{
useDevice
}
from
'@/composables/useDevice'
const
route
=
useRoute
()
const
{
mobile
}
=
useDevice
()
const
{
mobile
}
=
useDevice
()
const
shopStore
=
useShopStore
()
const
shopStore
=
useShopStore
()
let
activeName
=
$ref
(
'0'
)
let
activeNameH5
=
$ref
(
0
)
const
handleTabClick
=
(
tab
:
any
)
=>
{
const
handleTabClick
=
(
tab
:
any
)
=>
{
if
(
tab
.
index
===
'4'
)
{
if
(
tab
.
index
===
'4'
)
{
window
.
open
(
'https://prp.ezijing.com'
)
window
.
open
(
'https://prp.ezijing.com'
)
window
.
location
.
reload
()
window
.
location
.
reload
()
}
}
}
}
watchEffect
(()
=>
{
if
(
route
.
query
.
id
)
!
mobile
?
(
activeName
=
route
.
query
.
id
.
toString
())
:
(
activeNameH5
=
Number
(
route
.
query
.
id
))
})
</
script
>
</
script
>
<
template
>
<
template
>
...
@@ -19,8 +23,8 @@ const handleTabClick = (tab: any) => {
...
@@ -19,8 +23,8 @@ const handleTabClick = (tab: any) => {
<img
src=
"https://webapp-pub.ezijing.com/project_online/paa/shop_banner.jpg"
class=
"shop_banner"
/>
<img
src=
"https://webapp-pub.ezijing.com/project_online/paa/shop_banner.jpg"
class=
"shop_banner"
/>
<div
class=
"shop_con"
>
<div
class=
"shop_con"
>
<div
class=
"con_tab"
>
<div
class=
"con_tab"
>
<el-tabs
class=
"my-tabs"
@
tab-click=
"handleTabClick"
>
<el-tabs
class=
"my-tabs"
@
tab-click=
"handleTabClick"
v-model=
"activeName"
>
<el-tab-pane
v-for=
"(item, index) in shopStore.filters
.slice(0, 4)
"
:key=
"index"
lazy
>
<el-tab-pane
v-for=
"(item, index) in shopStore.filters"
:key=
"index"
lazy
>
<template
#
label
>
<template
#
label
>
{{
item
.
label
}}
{{
item
.
label
}}
</
template
>
</
template
>
...
@@ -33,8 +37,8 @@ const handleTabClick = (tab: any) => {
...
@@ -33,8 +37,8 @@ const handleTabClick = (tab: any) => {
<div
class=
"main_shop"
v-else
>
<div
class=
"main_shop"
v-else
>
<img
src=
"https://webapp-pub.ezijing.com/project_online/paa/shop_banner.jpg"
class=
"shop_banner"
/>
<img
src=
"https://webapp-pub.ezijing.com/project_online/paa/shop_banner.jpg"
class=
"shop_banner"
/>
<van-tabs>
<van-tabs
v-model:active=
"activeNameH5"
>
<van-tab
:title=
"item.label"
v-for=
"(item, index) in shopStore.filters
.slice(0, 4)
"
:key=
"index"
lazy
>
<van-tab
:title=
"item.label"
v-for=
"(item, index) in shopStore.filters"
:key=
"index"
lazy
>
<CourseList
:type=
"item.value"
:courseList=
"shopStore.shopList"
:key=
"index"
/>
<CourseList
:type=
"item.value"
:courseList=
"shopStore.shopList"
:key=
"index"
/>
</van-tab>
</van-tab>
</van-tabs>
</van-tabs>
...
...
src/modules/shop/views/View.vue
浏览文件 @
c1a14627
...
@@ -10,6 +10,7 @@ import RecommendCourse from '../components/RecommendCourse.vue'
...
@@ -10,6 +10,7 @@ import RecommendCourse from '../components/RecommendCourse.vue'
import
CourseFooter
from
'../components/CourseFooter.vue'
import
CourseFooter
from
'../components/CourseFooter.vue'
import
{
useShopStore
}
from
'@/stores/shop'
import
{
useShopStore
}
from
'@/stores/shop'
import
{
useDevice
}
from
'@/composables/useDevice'
import
{
useDevice
}
from
'@/composables/useDevice'
const
{
mobile
}
=
useDevice
()
const
{
mobile
}
=
useDevice
()
const
shopStore
=
useShopStore
()
const
shopStore
=
useShopStore
()
const
route
=
useRoute
()
const
route
=
useRoute
()
...
@@ -18,15 +19,6 @@ const courseItem: any = ref([]) // 课程所属课程包
...
@@ -18,15 +19,6 @@ const courseItem: any = ref([]) // 课程所属课程包
courseItem
.
value
=
shopStore
.
shopList
.
filter
(
courseItem
.
value
=
shopStore
.
shopList
.
filter
(
(
item
:
any
)
=>
item
.
type
===
'课程包'
&&
item
.
child_ids
.
includes
(
shopStore
.
shopItem
?.
id
)
(
item
:
any
)
=>
item
.
type
===
'课程包'
&&
item
.
child_ids
.
includes
(
shopStore
.
shopItem
?.
id
)
)
)
const
recommendCourse
=
computed
(()
=>
{
if
(
shopStore
.
shopItem
?.
type
===
'课程包'
)
{
// 课程包推荐课程
return
shopStore
.
shopRelatedList
}
else
{
// 单一课程推荐的课程
return
shopStore
.
shopRelatedListOther
}
})
</
script
>
</
script
>
<
template
>
<
template
>
...
@@ -34,31 +26,58 @@ const recommendCourse = computed(() => {
...
@@ -34,31 +26,58 @@ const recommendCourse = computed(() => {
<DetailBanner
:shopItem=
"shopStore.shopItem"
:payStatus=
"payStatus"
/>
<DetailBanner
:shopItem=
"shopStore.shopItem"
:payStatus=
"payStatus"
/>
<div
class=
"detail_con"
>
<div
class=
"detail_con"
>
<div
class=
"con_left"
>
<div
class=
"con_left"
>
<div>
<IncludeCourseCard
<IncludeCourseCard
v-if=
"shopStore.shopItem?.type !== '课程包'"
:courseItem=
"courseItem"
/>
v-if=
"
<div
class=
"left_course"
v-if=
"shopStore.shopItem?.type === '课程包'"
>
shopStore.shopItem?.type === '课程' &&
<CourseIntrouduce
:shopItem=
"shopStore.shopItem"
/>
shopStore.shopItem?.category !== 'system_course' &&
<CourseFor
v-if=
"!mobile"
:shopItem=
"shopStore.shopItem"
/>
shopStore.shopItem?.category !== 'free_course'
<CourseCatalogPC
:shopItem=
"shopStore.shopItem"
/>
"
</div>
:courseItem=
"courseItem"
/>
<div
class=
"left_course"
v-if=
"
shopStore.shopItem?.type === '课程包' ||
shopStore.shopItem?.category === 'system_course' ||
shopStore.shopItem?.category === 'free_course'
"
>
<CourseIntrouduce
:shopItem=
"shopStore.shopItem"
/>
<CourseFor
:shopItem=
"shopStore.shopItem"
/>
<CourseCatalogPC
v-if=
"shopStore.shopItem?.type === '课程包'"
:shopItem=
"shopStore.shopItem"
/>
</div>
</div>
</div>
</div>
<div
class=
"con_right"
>
<div
class=
"con_right"
>
<!--
<TeacherCard
:lecturerList=
"shopStore.shopItem?.lecturer_list"
/>
-->
<!--
<TeacherCard
:lecturerList=
"shopStore.shopItem?.lecturer_list"
/>
-->
<RecommendCourse
:shopRelatedList=
"
recommendCourse
"
/>
<RecommendCourse
:shopRelatedList=
"
shopStore.shopRelatedList
"
/>
</div>
</div>
</div>
</div>
<CourseFooter
:payStatus=
"payStatus"
:shopItem=
"shopStore.shopItem"
v-if=
"shopStore.shopItem?.type == '课程包'"
/>
<CourseFooter
:payStatus=
"payStatus"
:shopItem=
"shopStore.shopItem"
v-if=
"shopStore.shopItem?.type == '课程包'"
/>
</div>
</div>
<div
class=
"course_detail"
v-else
>
<div
class=
"course_detail"
v-else
>
<DetailBanner
:shopItem=
"shopStore.shopItem"
:payStatus=
"payStatus"
/>
<DetailBanner
:shopItem=
"shopStore.shopItem"
:payStatus=
"payStatus"
/>
<IncludeCourseCard
v-if=
"shopStore.shopItem?.type !== '课程包'"
:courseItem=
"courseItem"
/>
<IncludeCourseCard
<div
class=
"detail_con"
v-if=
"shopStore.shopItem?.type == '课程包'"
>
v-if=
"
<CourseIntrouduce
:shopItem=
"shopStore.shopItem"
/>
shopStore.shopItem?.type === '课程' &&
shopStore.shopItem?.category !== 'system_course' &&
shopStore.shopItem?.category !== 'free_course'
"
:courseItem=
"courseItem"
/>
<div
class=
"detail_con"
>
<CourseIntrouduce
:shopItem=
"shopStore.shopItem"
v-if=
"
shopStore.shopItem?.type === '课程包' ||
shopStore.shopItem?.category !== 'system_course' ||
shopStore.shopItem?.category !== 'free_course'
"
/>
<!--
<TeacherCard
:lecturerList=
"shopStore.shopItem?.lecturer_list"
/>
-->
<!--
<TeacherCard
:lecturerList=
"shopStore.shopItem?.lecturer_list"
/>
-->
<CourseCatalogH5
:shopItem=
"shopStore.shopItem"
/>
<CourseCatalogH5
:shopItem=
"shopStore.shopItem"
v-if=
"shopStore.shopItem?.type === '课程包'"
/>
</div>
</div>
<RecommendCourse
:shopRelatedList=
"
recommendCourse
"
/>
<RecommendCourse
:shopRelatedList=
"
shopStore.shopRelatedList
"
/>
<CourseFooter
:payStatus=
"payStatus"
:shopItem=
"shopStore.shopItem"
/>
<CourseFooter
:payStatus=
"payStatus"
:shopItem=
"shopStore.shopItem"
/>
</div>
</div>
</
template
>
</
template
>
...
...
src/stores/shop.ts
浏览文件 @
c1a14627
import
{
ITEM_RENDER_EVT
}
from
'element-plus/es/components/virtual-list/src/defaults'
import
{
defineStore
}
from
'pinia'
import
{
defineStore
}
from
'pinia'
import
{
useUserStore
}
from
'./user'
import
{
useUserStore
}
from
'./user'
interface
ShopFilter
{
interface
ShopFilter
{
label
:
string
label
:
string
value
:
string
value
:
string
children
?:
any
courseList
:
any
courseList
:
any
isActive
?:
boolean
}
}
type
ShopListItem
=
Record
<
string
,
any
>
type
ShopListItem
=
Record
<
string
,
any
>
...
@@ -29,22 +32,32 @@ export const useShopStore = defineStore('shop', () => {
...
@@ -29,22 +32,32 @@ export const useShopStore = defineStore('shop', () => {
if
(
found
)
{
if
(
found
)
{
found
.
course_list
=
found
.
course_list
=
found
.
child_ids
&&
found
.
child_ids
.
length
found
.
child_ids
&&
found
.
child_ids
.
length
?
found
.
child_ids
.
map
((
id
:
string
)
=>
shopList
.
value
.
find
(
item
=>
item
.
id
===
id
))
?
found
.
child_ids
:
shopList
.
value
.
filter
(
item
=>
item
.
child_ids
?.
includes
(
found
.
id
))
.
map
((
id
:
string
)
=>
shopList
.
value
.
find
(
item
=>
item
.
id
===
id
))
.
filter
((
it
:
any
)
=>
!
it
.
is_test
)
:
shopList
.
value
.
filter
(
item
=>
item
.
child_ids
?.
includes
(
found
.
id
)).
filter
(
it
=>
!
it
.
is_test
)
}
}
return
found
return
found
})
})
// 相关推荐商品列表
// 相关推荐商品列表
const
shopRelatedList
=
computed
(()
=>
{
const
shopRelatedList
=
computed
(()
=>
{
return
shopList
.
value
.
filter
(
item
=>
item
.
category
!==
shopItem
.
value
?.
category
&&
item
.
type
===
'课程包'
)
if
(
shopItem
.
value
?.
category
===
'free_course'
)
{
})
return
shopList
.
value
.
filter
(
item
=>
item
.
category
===
'system_course'
&&
!
item
.
is_test
)
}
else
if
(
shopItem
.
value
?.
type
===
'课程包'
)
{
const
shopRelatedListOther
=
computed
(()
=>
{
return
shopList
.
value
.
filter
(
return
shopList
.
value
.
filter
(
item
=>
item
.
type
===
shopItem
.
value
?.
type
&&
!
item
.
is_test
&&
item
.
id
!==
shopItem
.
value
?.
id
(
item
:
ShopListItem
)
=>
item
.
category
===
shopItem
.
value
?.
category
&&
item
.
id
!==
shopItem
.
value
?.
id
&&
item
.
type
===
'课程'
)
)
}
else
{
return
shopList
.
value
.
filter
(
item
=>
item
.
type
===
shopItem
.
value
?.
type
&&
!
item
.
is_test
&&
item
.
id
!==
shopItem
.
value
?.
id
&&
item
.
category
===
shopItem
.
value
?.
category
)
}
})
})
return
{
filters
,
list
,
shopList
,
shopItem
,
shopRelatedList
,
shopRelatedListOther
}
return
{
filters
,
list
,
shopList
,
shopItem
,
shopRelatedList
}
})
})
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论