├── pages
├── mine
│ ├── mine.json
│ ├── mine.wxml
│ ├── mine.wxss
│ └── mine.js
├── detail
│ ├── detail.json
│ ├── detail.wxml
│ ├── detail.wxss
│ └── detail.js
└── index
│ ├── index.json
│ ├── index.js
│ ├── index.wxml
│ └── index.wxss
├── images
├── 加载中.gif
├── 加载中.png
├── 已收藏.png
├── 未收藏.png
├── .DS_Store
├── 我的已选中.png
├── 我的未选中.png
├── 课程封面01.png
├── 课程封面02.png
├── 课程封面03.png
├── 课程封面04.png
├── 课程封面05.png
├── 首页已选中.png
├── 首页未选中.png
├── 默认头像.png
└── avatar01.png
├── components
└── cloudTipModal
│ ├── index.json
│ ├── index.wxml
│ ├── index.js
│ └── index.wxss
├── envList.js
├── sitemap.json
├── app.wxss
├── app.json
├── README.md
└── app.js
/pages/mine/mine.json:
--------------------------------------------------------------------------------
1 | {
2 | "navigationBarTitleText": "个人中心"
3 | }
4 |
--------------------------------------------------------------------------------
/pages/detail/detail.json:
--------------------------------------------------------------------------------
1 | {
2 | "navigationBarTitleText": "课程详情"
3 | }
4 |
--------------------------------------------------------------------------------
/pages/index/index.json:
--------------------------------------------------------------------------------
1 | {
2 | "navigationBarTitleText": "AI工具课程"
3 | }
4 |
--------------------------------------------------------------------------------
/images/加载中.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xw-an/WechatCourse/HEAD/images/加载中.gif
--------------------------------------------------------------------------------
/images/加载中.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xw-an/WechatCourse/HEAD/images/加载中.png
--------------------------------------------------------------------------------
/images/已收藏.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xw-an/WechatCourse/HEAD/images/已收藏.png
--------------------------------------------------------------------------------
/images/未收藏.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xw-an/WechatCourse/HEAD/images/未收藏.png
--------------------------------------------------------------------------------
/images/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xw-an/WechatCourse/HEAD/images/.DS_Store
--------------------------------------------------------------------------------
/images/我的已选中.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xw-an/WechatCourse/HEAD/images/我的已选中.png
--------------------------------------------------------------------------------
/images/我的未选中.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xw-an/WechatCourse/HEAD/images/我的未选中.png
--------------------------------------------------------------------------------
/images/课程封面01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xw-an/WechatCourse/HEAD/images/课程封面01.png
--------------------------------------------------------------------------------
/images/课程封面02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xw-an/WechatCourse/HEAD/images/课程封面02.png
--------------------------------------------------------------------------------
/images/课程封面03.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xw-an/WechatCourse/HEAD/images/课程封面03.png
--------------------------------------------------------------------------------
/images/课程封面04.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xw-an/WechatCourse/HEAD/images/课程封面04.png
--------------------------------------------------------------------------------
/images/课程封面05.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xw-an/WechatCourse/HEAD/images/课程封面05.png
--------------------------------------------------------------------------------
/images/首页已选中.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xw-an/WechatCourse/HEAD/images/首页已选中.png
--------------------------------------------------------------------------------
/images/首页未选中.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xw-an/WechatCourse/HEAD/images/首页未选中.png
--------------------------------------------------------------------------------
/images/默认头像.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xw-an/WechatCourse/HEAD/images/默认头像.png
--------------------------------------------------------------------------------
/images/avatar01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xw-an/WechatCourse/HEAD/images/avatar01.png
--------------------------------------------------------------------------------
/components/cloudTipModal/index.json:
--------------------------------------------------------------------------------
1 | {
2 | "usingComponents": {},
3 | "component": true
4 | }
--------------------------------------------------------------------------------
/envList.js:
--------------------------------------------------------------------------------
1 | const envList = [];
2 | const isMac = false;
3 | module.exports = {
4 | envList,
5 | isMac
6 | };
7 |
--------------------------------------------------------------------------------
/sitemap.json:
--------------------------------------------------------------------------------
1 | {
2 | "desc": "关于本文件的更多信息,请参考文档 https://developers.weixin.qq.com/miniprogram/dev/framework/sitemap.html",
3 | "rules": [{
4 | "action": "allow",
5 | "page": "*"
6 | }]
7 | }
--------------------------------------------------------------------------------
/app.wxss:
--------------------------------------------------------------------------------
1 | /**app.wxss**/
2 | .container {
3 | display: flex;
4 | flex-direction: column;
5 | align-items: center;
6 | box-sizing: border-box;
7 | }
8 |
9 | button {
10 | background: initial;
11 | }
12 |
13 | button:focus{
14 | outline: 0;
15 | }
16 |
17 | button::after{
18 | border: none;
19 | }
20 |
21 | page {
22 | background: #f6f6f6;
23 | display: flex;
24 | flex-direction: column;
25 | justify-content: flex-start;
26 | }
--------------------------------------------------------------------------------
/components/cloudTipModal/index.wxml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 体验前需部署云资源
6 | 请开启调试器进入终端窗口,复制并运行以下命令
7 |
8 | {{tipText}}
9 | 复制
10 |
11 | 已执行命令
12 |
13 |
14 |
--------------------------------------------------------------------------------
/components/cloudTipModal/index.js:
--------------------------------------------------------------------------------
1 | // miniprogram/components/cloudTipModal/index.js
2 | const { isMac } = require('../../envList.js');
3 |
4 | Component({
5 |
6 | /**
7 | * 页面的初始数据
8 | */
9 | data: {
10 | showUploadTip: false,
11 | tipText: isMac ? 'sh ./uploadCloudFunction.sh' : './uploadCloudFunction.bat'
12 | },
13 | properties: {
14 | showUploadTipProps: Boolean
15 | },
16 | observers: {
17 | showUploadTipProps: function(showUploadTipProps) {
18 | this.setData({
19 | showUploadTip: showUploadTipProps
20 | });
21 | }
22 | },
23 | methods: {
24 | onChangeShowUploadTip() {
25 | this.setData({
26 | showUploadTip: !this.data.showUploadTip
27 | });
28 | },
29 |
30 | copyShell() {
31 | wx.setClipboardData({
32 | data: this.data.tipText,
33 | });
34 | },
35 | }
36 |
37 | });
38 |
--------------------------------------------------------------------------------
/app.json:
--------------------------------------------------------------------------------
1 | {
2 | "pages": [
3 | "pages/index/index",
4 | "pages/detail/detail",
5 | "pages/mine/mine"
6 | ],
7 | "window": {
8 | "backgroundColor": "#F6F6F6",
9 | "backgroundTextStyle": "light",
10 | "navigationBarBackgroundColor": "#F6F6F6",
11 | "navigationBarTitleText": "智慧AI谷",
12 | "navigationBarTextStyle": "black"
13 | },
14 | "sitemapLocation": "sitemap.json",
15 | "style": "v2",
16 | "networkTimeout": {
17 | "request": 10000,
18 | "downloadFile": 10000
19 | },
20 | "tabBar": {
21 | "color": "#999999",
22 | "selectedColor": "#7cba59",
23 | "backgroundColor": "#FFFFFF",
24 | "borderStyle": "black",
25 | "list": [
26 | {
27 | "pagePath": "pages/index/index",
28 | "text": "首页",
29 | "iconPath": "images/首页未选中.png",
30 | "selectedIconPath": "images/首页已选中.png"
31 | },
32 | {
33 | "pagePath": "pages/mine/mine",
34 | "text": "我的",
35 | "iconPath": "images/我的未选中.png",
36 | "selectedIconPath": "images/我的已选中.png"
37 | }
38 | ]
39 | }
40 | }
--------------------------------------------------------------------------------
/components/cloudTipModal/index.wxss:
--------------------------------------------------------------------------------
1 | .install_tip_back {
2 | position: fixed;
3 | top: 0;
4 | right: 0;
5 | bottom: 0;
6 | left: 0;
7 | background-color: rgba(0,0,0,0.4);
8 | z-index: 1;
9 | }
10 |
11 | .install_tip_detail {
12 | position: fixed;
13 | background-color: white;
14 | right: 0;
15 | bottom: 0;
16 | left: 0;
17 | top: 60%;
18 | border-radius: 40rpx 40rpx 0 0;
19 | padding: 50rpx;
20 | z-index: 9;
21 | }
22 |
23 | .install_tip_detail_title {
24 | font-weight: 400;
25 | font-size: 40rpx;
26 | text-align: center;
27 | }
28 |
29 | .install_tip_detail_tip {
30 | font-size: 25rpx;
31 | color: rgba(0,0,0,0.4);
32 | margin-top: 20rpx;
33 | text-align: center;
34 | }
35 |
36 | .install_tip_detail_shell {
37 | margin: 70rpx 0;
38 | display: flex;
39 | justify-content: center;
40 | }
41 |
42 | .install_tip_detail_copy {
43 | color: #546488;
44 | margin-left: 10rpx;
45 | }
46 |
47 | .install_tip_detail_button {
48 | color: #07C160;
49 | font-weight: 500;
50 | background-color: rgba(0,0,0,0.1);
51 | width: 60%;
52 | text-align: center;
53 | height: 90rpx;
54 | line-height: 90rpx;
55 | border-radius: 10rpx;
56 | margin: 0 auto;
57 | }
--------------------------------------------------------------------------------
/pages/mine/mine.wxml:
--------------------------------------------------------------------------------
1 |
2 |
3 | {{userInfo.nickName || '游客身份'}}
4 |
5 | 退出登录
6 |
7 |
8 |
9 |
10 |
13 |
14 |
15 |
16 |
17 |
18 |
19 | 我的收藏
20 |
21 |
22 |
23 | {{item.title}}
24 |
25 |
26 | 暂无收藏课程,快去首页寻找喜欢的课程吧~
27 |
28 |
29 |
--------------------------------------------------------------------------------
/pages/index/index.js:
--------------------------------------------------------------------------------
1 | // index.js (续)
2 | Page({
3 | data: {
4 | loading: true, // 是否显示加载中状态
5 | activeTab: '绘图类',
6 | categories: [
7 | {
8 | id: "1",
9 | name: "绘图类",
10 | },
11 | {
12 | id: "2",
13 | name: "编程类",
14 | }
15 | ],
16 | videoList: [],
17 | searchResult: [], // 搜索结果数据
18 | keyword: '' // 搜索关键字
19 | },
20 |
21 | onLoad() {
22 | // 轮询间隔时间(毫秒)
23 | const interval = 100;
24 | // 定时器ID
25 | let timerId = null;
26 | // 定义轮询函数
27 | const that = this;
28 | const pollStorage = () => {
29 | wx.getStorage({
30 | key: 'courseList',
31 | success: res => {
32 | const courseList = res.data;
33 | if (courseList) {
34 | clearInterval(timerId);
35 | // 获取到数据后,执行相应的逻辑
36 | that.setData({
37 | videoList: res.data, // 获取课程列表数据
38 | loading: false
39 | })
40 | }
41 | },
42 | fail: () => {
43 | // 如果获取失败,继续轮询
44 | console.log('未获取到 courseList 数据,继续轮询...');
45 | }
46 | });
47 | };
48 | // 开始轮询
49 | timerId = setInterval(pollStorage, interval);
50 | },
51 | navigateToVideoDetail(event) {
52 | const videoId = event.currentTarget.dataset.videoId;
53 | wx.navigateTo({
54 | url: `/pages/detail/detail?courseId=${videoId}`, // 跳转到视频详情页面并传递视频 ID
55 | });
56 | },
57 | switchTab(event) {
58 | const category = event.currentTarget.dataset.category;
59 | this.setData({
60 | activeTab: category
61 | });
62 | },
63 | onSearchInput(event) {
64 | const keyword = event.detail.value; // 获取搜索框输入的关键字
65 | this.setData({
66 | keyword: keyword, // 更新搜索关键字
67 | });
68 | this.updateSearchResult(); // 更新搜索结果数据
69 | },
70 | updateSearchResult() {
71 | const keyword = this.data.keyword;
72 | // 根据关键字在视频列表数据中进行搜索
73 | const searchResult = this.data.videoList.filter(video =>
74 | video.title.includes(keyword) || video.description.includes(keyword)
75 | );
76 | console.log(searchResult)
77 | this.setData({
78 | searchResult: searchResult, // 更新搜索结果数据
79 | });
80 | },
81 | // 监听页面显示事件
82 | onShow() {
83 | const videoList = wx.getStorageSync('courseList') || [];
84 | this.setData({
85 | videoList: videoList, // 更新搜索结果数据
86 | })
87 | }
88 | })
89 |
--------------------------------------------------------------------------------
/pages/index/index.wxml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | 正在努力加载中...
7 |
8 |
9 |
10 |
11 |
12 |
15 |
16 |
17 |
18 | {{item.name}}
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 | {{item.title}}
30 | {{item.description}}
31 |
32 | {{item.applyCount}}人报名
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 | {{item.title}}
45 | {{item.description}}
46 |
47 | {{item.applyCount}}人报名
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
--------------------------------------------------------------------------------
/pages/mine/mine.wxss:
--------------------------------------------------------------------------------
1 | .container {
2 | display: flex;
3 | flex-direction: column;
4 | align-items: center;
5 | justify-content: center;
6 | }
7 |
8 | .avatar {
9 | width: 60px;
10 | height: 60px;
11 | border-radius: 50%;
12 | margin-top: 10px;
13 | }
14 |
15 | .nickname {
16 | margin-top:10px;
17 | font-size: 13px;
18 | color: #333;
19 | }
20 |
21 | .login-btn {
22 | display: flex;
23 | justify-content: center;
24 | align-items: center;
25 | padding: 8px 16px;
26 | background-color: #7cba59;
27 | color: #FFFFFF;
28 | border-radius: 20px;
29 | margin-top: 20px;
30 | font-size: 14px;
31 | }
32 |
33 | .logout-btn {
34 | font-size: 14px;
35 | color: #8a8a8a;
36 | /* text-decoration: underline; */
37 | margin-top: 10px;
38 | }
39 |
40 | .card {
41 | margin-top:20px;
42 | padding: 10px;
43 | border-top: 1rpx solid #ccc;
44 | /* background-color: #fff; */
45 | /* box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1); */
46 | /* border-radius: 5px; */
47 | width: 100%;
48 | }
49 | .card-title {
50 | font-size: 14px;
51 | margin-bottom: 10px;
52 | margin-left: 10px;
53 | }
54 | .collect-list {
55 | display: flex;
56 | flex-wrap: wrap;
57 | justify-content: flex-start;
58 | margin-left: 10px;
59 | }
60 | .collect-item {
61 | width: 33.33%;
62 | padding-right: 10px;
63 | box-sizing: border-box;
64 | display: flex;
65 | flex-direction: column;
66 | align-items: center;
67 | }
68 | .item-cover {
69 | width: 100%;
70 | height: 90px;
71 | border-radius: 6px;
72 | object-fit: cover;
73 | }
74 | .item-title {
75 | font-size: 12px;
76 | text-align: center;
77 | display: -webkit-box;
78 | -webkit-line-clamp: 2;
79 | -webkit-box-orient: vertical;
80 | overflow: hidden;
81 | text-overflow: ellipsis;
82 | }
83 |
84 | .no-collect {
85 | margin-top: 20px;
86 | margin-left: 20px;
87 | text-align: center;
88 | color: #999999;
89 | font-size: 14px;
90 | }
91 |
92 | .go-home {
93 | color: #7cba59;
94 | text-decoration: none;
95 | }
96 |
97 | /* 弹层样式 */
98 | .modal {
99 | position: fixed;
100 | top: 0;
101 | left: 0;
102 | right: 0;
103 | bottom: 0;
104 | background-color: rgba(0, 0, 0, 0.5);
105 | display: flex;
106 | justify-content: center;
107 | align-items: center;
108 | z-index: 999;
109 | }
110 |
111 | .modal-content {
112 | width: 500rpx;
113 | height: 500rpx;
114 | padding: 20rpx;
115 | background-color: #fff;
116 | border-radius: 8rpx;
117 | text-align: center;
118 | border-radius: 5px;
119 | }
120 | .btn-login {
121 | display: flex;
122 | justify-content: center;
123 | align-items: center;
124 | padding: 8px 16px;
125 | background-color: #7cba59;
126 | color: #FFFFFF;
127 | border-radius: 20px;
128 | margin-top: 20px;
129 | font-size: 14px;
130 | }
131 |
--------------------------------------------------------------------------------
/pages/detail/detail.wxml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 | {{course.title}}
18 |
19 |
20 |
24 |
25 |
26 | {{course.description}}
27 |
28 |
29 | 开课时间
30 |
31 | {{course.estimatedDate}}
32 | {{course.estimatedDuration}}分钟
33 |
34 |
35 |
36 |
37 |
38 |
39 | {{course.lecturer.name}}
40 | {{course.lecturer.department}}
41 |
42 |
43 |
44 |
45 | 课程章节介绍
46 |
47 |
48 | {{item.title}}
49 | {{item.description}}
50 |
51 |
52 |
53 |
54 |
61 |
62 |
63 |
64 |
65 |
68 |
69 |
70 |
71 |
72 |
--------------------------------------------------------------------------------
/pages/index/index.wxss:
--------------------------------------------------------------------------------
1 | /* index.wxss */
2 | /* 遮罩层样式 */
3 | .mask {
4 | position: fixed;
5 | top: 0;
6 | left: 0;
7 | width: 100%;
8 | height: 100%;
9 | background-color: rgba(8, 8, 8, 0.31);
10 | display: flex;
11 | align-items: center;
12 | justify-content: center;
13 | z-index: 9999;
14 | }
15 |
16 | /* 加载容器样式 */
17 | .loading-container {
18 | display: flex;
19 | align-items: center;
20 | justify-content: center;
21 | }
22 |
23 | /* 加载动画样式 */
24 | .loading-icon {
25 | width: 50px;
26 | height: 50px;
27 | }
28 |
29 | /* 加载文本样式 */
30 | .loading-text {
31 | margin-left: 10px;
32 | color: #333; /* 字体颜色修改为深色 */
33 | font-size: 14px;
34 | }
35 |
36 | .container {
37 | padding: 10px;
38 | }
39 |
40 | .header {
41 | display: flex;
42 | align-items: center;
43 | justify-content: space-between;
44 | margin-bottom: 10px;
45 | width: 100%;
46 | }
47 | .search {
48 | width: 100%;
49 | height: 18px;
50 | border: 1px solid #cccccc;
51 | border-radius: 15px;
52 | padding: 5px 10px;
53 | font-size: 13px;
54 | }
55 |
56 | .category-nav {
57 | display: flex;
58 | justify-content: center;
59 | align-items: center;
60 | background-color: #f5f5f5;
61 | height: 100rpx;
62 | width: 100%;
63 | }
64 |
65 | .category-item {
66 | flex: 1;
67 | display: flex;
68 | justify-content: center;
69 | align-items: center;
70 | position: relative;
71 | }
72 |
73 | .category-text {
74 | font-size: 32rpx;
75 | color: #333333;
76 | transition: color 0.3s;
77 | }
78 |
79 | .category-text.active {
80 | color: #07c160;
81 | }
82 |
83 | .category-text.active::after {
84 | content: "";
85 | position: absolute;
86 | bottom: 0;
87 | left: 50%;
88 | transform: translateX(-50%);
89 | width: 28%;
90 | height: 2rpx;
91 | background-color: #07c160;
92 | }
93 |
94 | .video-list {
95 | display: flex;
96 | flex-direction: column;
97 | gap: 20px; /* 调整视频项之间的间距 */
98 | width: 100%;
99 | }
100 |
101 | .video-card {
102 | display: flex;
103 | align-items: flex-start; /* 图片和文案顶部对齐 */
104 | justify-content: center;
105 | margin-bottom: 15rpx;
106 | width: 100%;
107 | }
108 |
109 | .video-cover {
110 | width: 35%;
111 | height: 95px;
112 | object-fit: cover;
113 | border-radius: 10px;
114 | }
115 |
116 | .video-info {
117 | width: 65%;
118 | flex-grow: 1;
119 | margin-left: 10px;
120 | }
121 |
122 | .video-title {
123 | font-size: 28rpx;
124 | font-weight: bold;
125 | margin-bottom: 10rpx;
126 | }
127 |
128 | .video-description {
129 | font-size: 24rpx;
130 | color: #666666;
131 | margin-bottom: 10rpx;
132 | display: -webkit-box;
133 | -webkit-box-orient: vertical;
134 | -webkit-line-clamp: 2;
135 | overflow: hidden;
136 | text-overflow: ellipsis;
137 | }
138 |
139 | .video-stats {
140 | display: flex;
141 | align-items: center;
142 | margin-top: 10rpx;
143 | }
144 |
145 | .apply-count {
146 | font-size: 24rpx;
147 | color: #999999;
148 | margin-right: 10rpx;
149 | flex-grow: 1;
150 | white-space: nowrap;
151 | overflow: hidden;
152 | text-overflow: ellipsis;
153 | }
154 |
155 | .like-button {
156 | font-size: 24rpx;
157 | color: #999999;
158 | background-color: transparent;
159 | border: none;
160 | padding: 0;
161 | outline: none;
162 | }
163 |
164 |
165 |
--------------------------------------------------------------------------------
/pages/detail/detail.wxss:
--------------------------------------------------------------------------------
1 | /* pages/detail/detail.wxss */
2 | .course-detail {
3 | height: 100vh;
4 | }
5 | .scroll-view {
6 | height: calc(100vh - 100rpx); /* 设置 scroll-view 的高度,留出底部的底栏高度,单位为rpx */
7 | }
8 | .swiper-container {
9 | height: 700rpx; /* 调整图片轮播的高度,单位为rpx */
10 | }
11 |
12 | .swiper-video,
13 | .swiper-image {
14 | width: 100%;
15 | height: 100%;
16 | object-fit: cover;
17 | }
18 |
19 | .course-title-container {
20 | display: flex;
21 | align-items: center;
22 | width: 100%;
23 | margin-top: 5px;
24 | }
25 |
26 | .course-title {
27 | flex-grow: 1;
28 | font-size: 18px;
29 | font-weight: bold;
30 | white-space: nowrap;
31 | overflow: hidden;
32 | text-overflow: ellipsis;
33 | margin-left: 20px;
34 | width: 75%;
35 | }
36 |
37 | .like-container {
38 | display: flex;
39 | align-items: center;
40 | margin-left: 10px;
41 | width: 25%;
42 | }
43 |
44 | .like-button {
45 | display: flex;
46 | align-items: center;
47 | justify-content: center;
48 | }
49 |
50 | .like-icon {
51 | width: 16px;
52 | height: 16px;
53 | margin-right: 5px;
54 | }
55 |
56 | .like-count {
57 | padding-top:1px;
58 | font-size: 13px;
59 | }
60 |
61 | .course-description {
62 | font-size: 13px;
63 | color: #666;
64 | margin-bottom: 10px;
65 | margin-left: 20px;
66 | margin-right: 5px;
67 | margin-top: 5px;
68 | }
69 |
70 | .time-card {
71 | background-color: #fff;
72 | box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1);
73 | border-radius: 5px;
74 | padding: 20px;
75 | margin-bottom: 20px;
76 | display: flex;
77 | align-items: center;
78 | }
79 |
80 | .time-card-title {
81 | font-size: 15px;
82 | font-weight: bold;
83 | color: #666;
84 | flex-grow: 1;
85 | }
86 |
87 | .time-card-content {
88 | display: flex;
89 | flex-direction: row;
90 | align-items: center;
91 | }
92 |
93 | .time-estimated-date {
94 | font-size: 14px;
95 | color: #666;
96 | margin-right: 10px;
97 | }
98 |
99 | .time-estimated-duration {
100 | font-size: 14px;
101 | color: #666;
102 | }
103 |
104 | .lecturer-card {
105 | display: flex;
106 | align-items: center;
107 | padding: 20px;
108 | background-color: #fff;
109 | box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1);
110 | border-radius: 5px;
111 | }
112 | .lecturer-avatar {
113 | width: 75px;
114 | height: 70px;
115 | border-radius: 50%;
116 | }
117 | .lecturer-info {
118 | margin-left: 20px;
119 | }
120 | .lecturer-name {
121 | font-size: 18px;
122 | font-weight: bold;
123 | color: #333;
124 | white-space: nowrap;
125 | overflow: hidden;
126 | text-overflow: ellipsis;
127 | }
128 | .lecturer-department {
129 | margin-top: 5px;
130 | font-size: 14px;
131 | color: #999;
132 | white-space: nowrap;
133 | overflow: hidden;
134 | text-overflow: ellipsis;
135 | }
136 | .chapter-card {
137 | background-color: #fff;
138 | border-radius: 8px;
139 | box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
140 | padding: 20px;
141 | margin-bottom: 20px;
142 | }
143 | .chapter-card-title {
144 | font-size: 18px;
145 | font-weight: bold;
146 | color: #333;
147 | margin-bottom: 10px;
148 | }
149 | .chapter-card-content{
150 | font-size: 14px;
151 | color: #666;
152 | }
153 | .chapter {
154 | margin-bottom: 20px;
155 | }
156 | .chapter-title {
157 | font-size: 16px;
158 | font-weight: bold;
159 | color: #333;
160 | }
161 |
162 | .chapter-description {
163 | font-size: 14px;
164 | color: #666;
165 | }
166 |
167 |
168 | .footer {
169 | position: fixed;
170 | bottom: 0;
171 | left: 0;
172 | width: 100%;
173 | padding: 10px;
174 | background-color: #fff;
175 | border-top: 1px solid #ccc;
176 | display: flex;
177 | align-items: center;
178 | justify-content: space-between;
179 | height: 110rpx;
180 | }
181 |
182 | .enroll-info {
183 | display: flex;
184 | align-items: center;
185 | margin-left: 10px;
186 | margin-bottom: 10px;
187 | }
188 |
189 | .enroll-count {
190 | font-size: 14px;
191 | color: #65c466;
192 | margin-right: 5px;
193 | }
194 |
195 | .enroll-label {
196 | font-size: 14px;
197 | color: #999;
198 | }
199 |
200 | .enroll-button {
201 | display: block;
202 | /* padding: 10px 10px; */
203 | margin-bottom: 10px;
204 | background-color: #65c466;
205 | color: #fff;
206 | font-size: 16px;
207 | text-align: center;
208 | border-radius: 20px;
209 | }
210 |
211 | /* 弹层样式 */
212 | .modal {
213 | position: fixed;
214 | top: 0;
215 | left: 0;
216 | right: 0;
217 | bottom: 0;
218 | background-color: rgba(0, 0, 0, 0.5);
219 | display: flex;
220 | justify-content: center;
221 | align-items: center;
222 | z-index: 999;
223 | }
224 |
225 | .modal-content {
226 | width: 500rpx;
227 | height: 500rpx;
228 | padding: 20rpx;
229 | background-color: #fff;
230 | border-radius: 8rpx;
231 | text-align: center;
232 | border-radius: 5px;
233 | }
234 | .btn-login {
235 | display: flex;
236 | justify-content: center;
237 | align-items: center;
238 | padding: 8px 16px;
239 | background-color: #7cba59;
240 | color: #FFFFFF;
241 | border-radius: 20px;
242 | margin-top: 20px;
243 | font-size: 14px;
244 | }
245 | .avatar {
246 | width: 60px;
247 | height: 60px;
248 | border-radius: 50%;
249 | margin-top: 10px;
250 | }
251 |
252 | .nickname {
253 | margin-top:10px;
254 | font-size: 13px;
255 | color: #333;
256 | }
257 |
--------------------------------------------------------------------------------
/pages/mine/mine.js:
--------------------------------------------------------------------------------
1 | Page({
2 | data: {
3 | isLogged: false,
4 | userInfo: {},
5 | collectList: [],
6 | isShowModal: false,
7 | avatarUrl:'/images/默认头像.png',
8 | nickName: ''
9 | },
10 |
11 | onLoad() {
12 | // 从本地存储中获取用户信息
13 | const userInfo = wx.getStorageSync('userInfo');
14 | // console.log('获取userInfo',userInfo)
15 | if (userInfo) {
16 | this.setData({
17 | isLogged: true,
18 | userInfo,
19 | nickName: this.data.userInfo.nickName,
20 | avatarUrl: this.data.userInfo.avatarUrl
21 | });
22 | // 获取收藏列表数据
23 | this.getCollectList();
24 | }
25 | },
26 | // 监听页面显示事件
27 | onShow() {
28 | // 从本地存储中获取用户信息
29 | const userInfo = wx.getStorageSync('userInfo');
30 | if (userInfo) {
31 | this.setData({
32 | isLogged: true,
33 | userInfo,
34 | nickName: this.data.userInfo.nickName,
35 | avatarUrl: this.data.userInfo.avatarUrl
36 | });
37 | // 获取收藏列表数据
38 | this.getCollectList();
39 | }
40 | },
41 | // 点击课程,跳转到课程详情页
42 | gotoDetail(event) {
43 | const index = event.currentTarget.dataset.index;
44 | const courseId = this.data.collectList[index].id;
45 | wx.navigateTo({
46 | url: '/pages/detail/detail?courseId=' + courseId,
47 | });
48 | },
49 | // 点击首页,跳转到首页
50 | goHome () {
51 | wx.switchTab({
52 | url: '/pages/index/index',
53 | });
54 | },
55 | // 从storage中获取收藏列表数据
56 | getCollectList() {
57 | if(this.data.userInfo.nickName) {
58 | // 假设从服务器获取的收藏列表数据
59 | const likeCourses = wx.getStorageSync('likeCourses')||[];
60 | // 从likeCourses中,根据nickName获取用户收藏的courseIds信息
61 | if(likeCourses){
62 | likeCourses.forEach(element => {
63 | if(element.nickName === this.data.userInfo.nickName){
64 | this.setData({ collectList: element.collectList });
65 | return;
66 | }
67 | });
68 | }
69 | }
70 | },
71 |
72 | // 点击登录按钮,显示弹窗
73 | showLoginModal() {
74 | this.setData({
75 | isShowModal: true,
76 | });
77 | },
78 | // 点击 modal 背景时关闭弹层
79 | handleModalTap(e) {
80 | if (e.target.dataset.modal === 'background') {
81 | this.setData({
82 | isShowModal: false,
83 | });
84 | }
85 | },
86 | // 微信获取头像
87 | onChooseAvatar(e) {
88 | const { avatarUrl } = e.detail
89 | this.setData({
90 | avatarUrl,
91 | })
92 | },
93 | // 微信登录获取头像和昵称
94 | login() {
95 | const nickName = this.data.nickName
96 | const avatarUrl= this.data.avatarUrl
97 | if (nickName) {
98 | // 从cos中获取所有注册用户数据
99 | const cosJsonUrl = '自己cos的服务域名地址/jsonData/loginUser.json';
100 | wx.request({
101 | url: cosJsonUrl,
102 | method: 'GET',
103 | success: (res) => {
104 | const userList = res.data; // 从响应中获取 JSON 数据
105 | // 根据昵称判断用户是否存在
106 | const user = userList.find(user => user.nickName === nickName);
107 | if (user) {
108 | // 用户已存在,更新用户信息
109 | this.setData({
110 | avatarUrl: user.avatarUrl,
111 | userInfo: user,
112 | isShowModal: false,
113 | isLogged: true,
114 | });
115 | // 保存用户信息到 Storage 中
116 | wx.setStorageSync('userInfo', user);
117 | console.log('登录成功')
118 | this.getCollectList()
119 | wx.showToast({
120 | title: '登录成功',
121 | icon: 'success',
122 | });
123 | } else {
124 | // 请求这个URL获取图片,上传到cos中
125 | console.log('头像的url',avatarUrl)
126 | this.uploadImageToCos(avatarUrl).then((cosFileUrl) => {
127 | // 文件上传成功,可以进行后续操作,如保存到用户信息中
128 | // 用户不存在,需要插入新的用户信息
129 | const newUser = { nickName, avatarUrl: cosFileUrl};
130 | userList.push(newUser);
131 | // 更新 COS 的 JSON 文件
132 | wx.request({
133 | url: cosJsonUrl, // 替换为 COS 的 JSON 文件的访问链接
134 | method: 'PUT',
135 | headers: {
136 | 'Content-Type': 'application/json', // 设置请求头中的 Content-Type
137 | },
138 | data: JSON.stringify(userList),
139 | success: (res) => {
140 | // 更新用户信息
141 | this.setData({
142 | avatarUrl: cosFileUrl,
143 | userInfo: newUser,
144 | isShowModal: false,
145 | isLogged: true,
146 | });
147 | // 保存用户信息到 Storage 中
148 | wx.setStorageSync('userInfo', newUser);
149 | console.log('注册成功')
150 | wx.showToast({
151 | title: '注册成功',
152 | icon: 'success',
153 | });
154 | this.getCollectList()
155 | },
156 | fail: (error) => {
157 | console.error('注册失败', error);
158 | }
159 | });
160 | })
161 | .catch((error) => {
162 | // 文件上传失败,处理错误情况
163 | console.log('文件上传失败', error);
164 | });
165 | }
166 | },
167 | fail: (error) => {
168 | console.log('获取数据失败', error);
169 | }
170 | });
171 | }else{
172 | wx.showToast({
173 | title: '请输入昵称',
174 | icon: 'error',
175 | });
176 | }
177 | },
178 |
179 | uploadImageToCos(filePath) {
180 | return new Promise((resolve, reject) => {
181 | const fileName = `${Date.now()}_${Math.floor(Math.random() * 100000)}`;
182 | const cosFilePath = `/images/userAvatar/${fileName}.png`; // 设置图片的存储路径和文件名,这里假设上传的是 PNG 格式的图片
183 | wx.uploadFile({
184 | url: '自己cos的服务域名地址', // 替换为您的上传接口 URL
185 | filePath: filePath,
186 | name: 'file',
187 | formData: {
188 | key: cosFilePath, // 上传到 COS 的文件路径
189 | },
190 | success: (res) => {
191 | console.log(res)
192 | if (res.statusCode === 204) {
193 | const cosFileUrl = res.header.Location; // 上传成功后返回的 COS 文件 URL
194 | resolve(cosFileUrl);
195 | } else {
196 | reject(new Error('图片上传失败'));
197 | }
198 | },
199 | fail: (error) => {
200 | reject(error);
201 | },
202 | });
203 | });
204 | },
205 |
206 | // 退出登录
207 | logout() {
208 | // 清除本地存储的用户信息
209 | wx.removeStorageSync('userInfo');
210 | this.setData({
211 | isLogged: false,
212 | userInfo: {},
213 | collectList: [],
214 | avatarUrl:'/images/默认头像.png',
215 | nickName: ''
216 | });
217 | },
218 |
219 | // uploadAvatarToCos(tempUrl) {
220 | // return new Promise((resolve, reject) => {
221 | // wx.downloadFile({
222 | // url: tempUrl,
223 | // success: (res) => {
224 | // console.log('下载到本地临时文件',res)
225 | // if (res.statusCode === 200) {
226 | // const tempFilePath = res.tempFilePath;
227 | // console.log('本地临时文件地址',tempFilePath)
228 | // this.uploadImageToCos(tempFilePath)
229 | // .then((cosFileUrl) => {
230 | // resolve(cosFileUrl);
231 | // })
232 | // .catch((error) => {
233 | // reject(error);
234 | // });
235 | // } else {
236 | // reject(new Error('头像下载失败'));
237 | // }
238 | // },
239 | // fail: (error) => {
240 | // reject(error);
241 | // }
242 | // });
243 | // });
244 | // },
245 | });
--------------------------------------------------------------------------------
/pages/detail/detail.js:
--------------------------------------------------------------------------------
1 | // pages/detail/detail.js
2 | Page({
3 | /**
4 | * 页面的初始数据
5 | */
6 | data: {
7 | autoplay: true,
8 | courseId: 0,
9 | course: null, // 课程数据
10 | courseList: [],
11 | liked: false, // 是否已收藏
12 | isShowModal: false,
13 | avatarUrl:'/images/默认头像.png',
14 | nickName: ''
15 | },
16 | /**
17 | * 生命周期函数--监听页面加载
18 | */
19 | onLoad(options) {
20 | // 从全局课程列表中获取当前课程的数据
21 | const courseId = options.courseId;
22 | const courseList = wx.getStorageSync('courseList') || [];
23 | const course = courseList.find((item) => {
24 | return item.id === Number(courseId);
25 | });
26 | this.setData({
27 | course: course,
28 | courseList: courseList,
29 | courseId: Number(courseId),
30 | nickName: wx.getStorageSync('userInfo').nickName,
31 | avatarUrl: wx.getStorageSync('userInfo').avatarUrl
32 | });
33 | // 判断当前用户是否已经收藏过该课程
34 | const likeCourses = wx.getStorageSync('likeCourses') || [];
35 | if(this.data.nickName){
36 | if (likeCourses) {
37 | likeCourses.forEach(element => {
38 | if(element.nickName === this.data.nickName){
39 | element.collectList.forEach(item => {
40 | if(item.id === Number(this.data.courseId)){
41 | this.setData({liked:true})
42 | return
43 | }
44 | })
45 | }
46 | });
47 | }
48 | }else {
49 | // 未登录状态下,不展示收藏功能按钮
50 | }
51 | },
52 | // 点击立即报名按钮的事件处理函数
53 | handleSignup() {
54 | let that = this
55 | let courseId = this.data.courseId;
56 | let course = this.data.course;
57 | let courseList = this.data.courseList;
58 | if (course) {
59 | // 判断当前的userInfo中是否存在数据,如果有直接获取nickName
60 | const userInfo = wx.getStorageSync('userInfo');
61 | if (userInfo && userInfo.nickName) {
62 | this.setData({
63 | nickName: userInfo.nickName,
64 | })
65 | this.handleApply()
66 | } else {
67 | // 不存在,则弹出弹层自己登录
68 | this.setData({
69 | isShowModal: true,
70 | });
71 | }
72 | }
73 | },
74 |
75 | // 收藏/取消收藏操作
76 | handleLikeButtonClick() {
77 | let course = this.data.course;
78 | let courseList = this.data.courseList;
79 | if (course && this.data.nickName) {
80 | this.data.liked?course.likes--:course.likes++;
81 | // 更新全局课程列表中对应课程的报名人数
82 | courseList.forEach((item)=> {
83 | if (item.id === course.id) {
84 | item.likes = course.likes;
85 | }
86 | });
87 | this.setData({
88 | course: course,
89 | courseList: courseList,
90 | });
91 | // 根据收藏/取消收藏,将数据更新到storage的likeCourses中
92 | const likeCourses = wx.getStorageSync('likeCourses') || [];
93 | if (likeCourses&&likeCourses.length) {
94 | // 如果likeCourses不为空,则判断当前用户是否已经收藏过其他课程
95 | let flag = false
96 | likeCourses.forEach(element => {
97 | if (element.nickName === this.data.nickName){
98 | flag = true
99 | if (this.data.liked) {
100 | // 如果已经收藏过,则取消收藏
101 | console.log('如果已经收藏过,则取消收藏')
102 | element.collectList.forEach((item,index) => {
103 | if(item.id === Number(this.data.courseId)){
104 | element.collectList.splice(index,1)
105 | return
106 | }
107 | })
108 | } else{
109 | // 如果没有收藏过,则添加收藏
110 | element.collectList.push(this.data.course)
111 | console.log('如果没有收藏过,则添加收藏')
112 | }
113 | }
114 | })
115 | if(!flag){
116 | // 如果当前用户没有收藏过其他课程,则直接将当前课程添加到likeCourses中
117 | console.log('如果当前用户没有收藏过其他课程,则直接将当前课程添加到likeCourses中')
118 | likeCourses.push({nickName:this.data.nickName,collectList:[this.data.course]})
119 | }
120 | } else {
121 | // 如果likeCourses为空,则直接将当前课程添加到likeCourses中
122 | console.log('如果likeCourses为空,则直接将当前课程添加到likeCourses中')
123 | likeCourses.push({nickName:this.data.nickName,collectList:[this.data.course]})
124 | }
125 | //将数据保存到cos的文件中
126 | const cosJsonUrl = '自己cos的服务域名地址/jsonData/course.json';
127 | // 先从cos中获取文件内容,然后再将最新内容更更新到cos中
128 | wx.request({
129 | url: cosJsonUrl,
130 | method: 'GET',
131 | success: (res)=> {
132 | const jsonData = res.data;
133 | jsonData.likeInfo.likeCourses = likeCourses
134 | jsonData.likeInfo.likeCounts = courseList.map(course=>{return {"id":Number(course.id),"likeCount":course.likes}})
135 | // 将最新数据jsonData更新到cos中
136 | wx.request({
137 | url: '自己cos的服务域名地址/jsonData/course.json', // 替换为 COS 的 JSON 文件的访问链接
138 | method: 'PUT',
139 | headers: {
140 | 'Content-Type': 'application/json', // 设置请求头中的 Content-Type
141 | },
142 | data: JSON.stringify(jsonData),
143 | success: (res) => {
144 | wx.setStorageSync('likeCourses', likeCourses);
145 | console.log('成功更新数据',likeCourses);
146 | wx.setStorageSync('courseList', courseList);
147 | // 更新数据并存储到本地
148 | this.setData({
149 | liked: !this.data.liked
150 | });
151 | },
152 | fail: (error) => {
153 | console.error('Failed to update COS JSON file:', error);
154 | }
155 | });
156 | },
157 | fail: (error) => {
158 | console.error('Failed to fetch COS JSON file:', error);
159 | }
160 | })
161 | }
162 | },
163 |
164 | // 轮播视频播放功能
165 | onVideoPlay() {
166 | const videoContext = wx.createVideoContext('videoPlayer');
167 | videoContext.play();
168 | this.setData({
169 | autoplay: false
170 | });
171 | },
172 |
173 | // 轮播视频暂停功能
174 | onVideoPause() {
175 | const videoContext = wx.createVideoContext('videoPlayer');
176 | videoContext.pause();
177 | this.setData({
178 | autoplay: true
179 | });
180 | },
181 |
182 | // 点击 modal 背景时关闭弹层
183 | handleModalTap(e) {
184 | if (e.target.dataset.modal === 'background') {
185 | this.setData({
186 | isShowModal: false,
187 | });
188 | }
189 | },
190 | // 微信获取头像
191 | onChooseAvatar(e) {
192 | const { avatarUrl } = e.detail
193 | this.setData({
194 | avatarUrl,
195 | })
196 | },
197 | // 微信登录获取头像和昵称
198 | login() {
199 | const avatarUrl=this.data.avatarUrl
200 | const nickName = this.data.nickName
201 | if (nickName) {
202 | // 从cos中获取所有注册用户数据
203 | const cosJsonUrl = '自己cos的服务域名地址/jsonData/loginUser.json';
204 | wx.request({
205 | url: cosJsonUrl,
206 | method: 'GET',
207 | success: (res) => {
208 | const userList = res.data; // 从响应中获取 JSON 数据
209 | // 根据昵称判断用户是否存在
210 | const user = userList.find(user => user.nickName === nickName);
211 | if (user) {
212 | // 用户已存在,更新用户信息
213 | this.setData({
214 | avatarUrl: user.avatarUrl,
215 | userInfo: user,
216 | isShowModal: false,
217 | isLogged: true,
218 | });
219 | // 保存用户信息到 Storage 中
220 | wx.setStorageSync('userInfo', user);
221 | // wx.showToast({
222 | // title: '登录成功',
223 | // icon: 'success',
224 | // });
225 | } else {
226 | // 请求这个URL获取图片,上传到cos中
227 | console.log('头像的url',avatarUrl)
228 | this.uploadImageToCos(avatarUrl).then((cosFileUrl) => {
229 | // 文件上传成功,可以进行后续操作,如保存到用户信息中
230 | // 用户不存在,需要插入新的用户信息
231 | const newUser = { nickName, avatarUrl: cosFileUrl};
232 | userList.push(newUser);
233 | // 更新 COS 的 JSON 文件
234 | wx.request({
235 | url: cosJsonUrl, // 替换为 COS 的 JSON 文件的访问链接
236 | method: 'PUT',
237 | headers: {
238 | 'Content-Type': 'application/json', // 设置请求头中的 Content-Type
239 | },
240 | data: JSON.stringify(userList),
241 | success: (res) => {
242 | // 更新用户信息
243 | this.setData({
244 | avatarUrl: cosFileUrl,
245 | userInfo: newUser,
246 | isShowModal: false,
247 | isLogged: true,
248 | });
249 | // 保存用户信息到 Storage 中
250 | wx.setStorageSync('userInfo', newUser);
251 | },
252 | fail: (error) => {
253 | console.error('注册失败', error);
254 | }
255 | });
256 | })
257 | .catch((error) => {
258 | // 文件上传失败,处理错误情况
259 | console.log('文件上传失败', error);
260 | });
261 | }
262 | // 登录成功之后,走报名逻辑
263 | this.handleApply()
264 | },
265 | fail: (error) => {
266 | console.log('获取数据失败', error);
267 | }
268 | });
269 | }else{
270 | wx.showToast({
271 | title: '请输入昵称',
272 | icon: 'error',
273 | });
274 | }
275 | },
276 |
277 | // 上传图片到cos中
278 | uploadImageToCos(filePath) {
279 | return new Promise((resolve, reject) => {
280 | const fileName = `${Date.now()}_${Math.floor(Math.random() * 100000)}`;
281 | const cosFilePath = `/images/userAvatar/${fileName}.png`; // 设置图片的存储路径和文件名,这里假设上传的是 PNG 格式的图片
282 | wx.uploadFile({
283 | url: '自己cos的服务域名地址', // 替换为您的上传接口 URL
284 | filePath: filePath,
285 | name: 'file',
286 | formData: {
287 | key: cosFilePath, // 上传到 COS 的文件路径
288 | },
289 | success: (res) => {
290 | console.log(res)
291 | if (res.statusCode === 204) {
292 | const cosFileUrl = res.header.Location; // 上传成功后返回的 COS 文件 URL
293 | resolve(cosFileUrl);
294 | } else {
295 | reject(new Error('图片上传失败'));
296 | }
297 | },
298 | fail: (error) => {
299 | reject(error);
300 | },
301 | });
302 | });
303 | },
304 | // 报名相关后续操作
305 | handleApply() {
306 | let nickName = this.data.nickName;
307 | let courseId = this.data.courseId;
308 | let course = this.data.course;
309 | let courseList = this.data.courseList;
310 | let that = this;
311 | if (nickName) {
312 | wx.request({
313 | url: '自己cos的服务域名地址/jsonData/course.json',
314 | method: 'GET',
315 | success: (res) => {
316 | const jsonData = res.data;
317 | // 查找用户对象
318 | const currentUser = jsonData.applyInfo.applyCourses.find(item => item.nickName === nickName);
319 | if (currentUser) {
320 | // 用户已经存在
321 | const isSignedUp = currentUser.courseIds.includes(courseId);
322 | if (isSignedUp) {
323 | // 用户已经报名过,给出相应提示
324 | wx.showToast({
325 | title: '您已报名过该课程',
326 | icon: 'none'
327 | });
328 | } else {
329 | // 用户未报名过,执行报名操作
330 | currentUser.courseIds.push(courseId);
331 | // 更新报名人数
332 | const appliedCourse = jsonData.applyInfo.applyCounts.find(course => course.id === courseId);
333 | appliedCourse.applyCount += 1;
334 | // 更新 COS 的 JSON 文件
335 | wx.request({
336 | url: '自己cos的服务域名地址/jsonData/course.json', // 替换为 COS 的 JSON 文件的访问链接
337 | method: 'PUT',
338 | headers: {
339 | 'Content-Type': 'application/json', // 设置请求头中的 Content-Type
340 | },
341 | data: JSON.stringify(jsonData),
342 | success: (res) => {
343 | // 更新当前课程的报名人数
344 | course.applyCount++;
345 | // 更新全局课程列表中对应课程的报名人数
346 | courseList.forEach(function(item) {
347 | if (item.id === course.id) {
348 | item.applyCount = course.applyCount;
349 | }
350 | });
351 | // 更新数据并存储到本地
352 | that.setData({
353 | course: course,
354 | courseList: courseList,
355 | });
356 | wx.setStorageSync('courseList', courseList);
357 | wx.showToast({
358 | title: '报名成功',
359 | icon: 'success',
360 | duration: 1000,
361 | success: () => {
362 | // 报名成功提示框显示后,跳转到首页
363 | setTimeout(() => {
364 | wx.reLaunch({
365 | url: '/pages/index/index' // 首页的路径
366 | });
367 | }, 1000);
368 | }
369 | });
370 | },
371 | fail: function (error) {
372 | console.error('Failed to update COS JSON file:', error);
373 | }
374 | });
375 | }
376 | } else {
377 | // 用户不存在,创建新用户并执行报名操作
378 | const newUser = {
379 | nickName: nickName,
380 | courseIds: [courseId] // 替换为实际的课程ID
381 | };
382 | jsonData.applyInfo.applyCourses.push(newUser);
383 | // 更新报名人数
384 | const appliedCourse = jsonData.applyInfo.applyCounts.find(course => course.id === courseId);
385 | appliedCourse.applyCount += 1;
386 | // 更新 COS 的 JSON 文件
387 | wx.request({
388 | url: '自己cos的服务域名地址/jsonData/course.json', // 替换为 COS 的 JSON 文件的访问链接
389 | method: 'PUT',
390 | data: JSON.stringify(jsonData),
391 | header: {
392 | 'Content-Type': 'application/json',
393 | },
394 | success: (res) => {
395 | // 更新当前课程的报名人数
396 | course.applyCount++;
397 | // 更新全局课程列表中对应课程的报名人数
398 | courseList.forEach(function(item) {
399 | if (item.id === course.id) {
400 | item.applyCount = course.applyCount;
401 | }
402 | });
403 | // 更新数据并存储到本地
404 | that.setData({
405 | course: course,
406 | courseList: courseList,
407 | });
408 | wx.setStorageSync('courseList', courseList);
409 | wx.showToast({
410 | title: '报名成功',
411 | icon: 'success',
412 | duration: 1000,
413 | success: () => {
414 | // 报名成功提示框显示后,跳转到首页
415 | setTimeout(() => {
416 | wx.reLaunch({
417 | url: '/pages/index/index' // 首页的路径
418 | });
419 | }, 1000);
420 | }
421 | });
422 | },
423 | fail: (error) => {
424 | console.error('Failed to update COS JSON file:', error);
425 | }
426 | });
427 | }
428 | },
429 | fail: (error) => {
430 | console.error('Failed to fetch COS JSON file:', error);
431 | }
432 | });
433 | }
434 | }
435 | })
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # 项目名称: WechatCourse
2 | 一个微信小程序,旨在提供一个课程学习平台,用户可以浏览不同的课程资料、查看课程详情、登录/注册账号、报名课程和收藏感兴趣的课程。同时,用户还可以在个人中心页管理自己的账号信息和查看已收藏的课程。
3 |
4 | ## 功能特点
5 |
6 | - 首页:展示所有课程资料,用户可以点击进入详情页查看更多信息。
7 | - 课程详情页:展示特定课程的详细资料,包括标题、封面、描述等。
8 | - 登录/注册功能:支持用户登录和注册账号,登录后可以享受更多功能。
9 | - 报名功能:登录用户可以报名感兴趣的课程,参与学习。
10 | - 收藏功能:登录用户可以收藏自己喜欢的课程,方便以后查看。
11 | - 个人中心页:展示用户的个人信息和已收藏的课程,支持修改个人信息和退出登录。
12 |
13 | ## 技术栈
14 |
15 | - 前端:微信小程序框架、HTML、CSS、JavaScript
16 | - 后台数据:文件存储 COS(腾讯云对象存储)
17 |
18 | ## 开始使用
19 |
20 | 1. 克隆本项目到本地或下载源代码。
21 | 2. 使用微信开发者工具打开项目目录。
22 | 3. 配置微信开发者工具的 AppID(需要提前注册微信小程序账号)。
23 | 4. 配置项目中的文件存储 COS,包括设置存储桶名称、地域、秘钥等信息。
24 | (需要将项目中所有的“自己cos的服务域名地址“替换成自己的cos路径比如:https://wechatapp-xxxxxx.cos.ap-shanghai.myqcloud.com)
25 | 6. 运行项目并在微信开发者工具中预览效果。
26 |
27 | ## 目录结构
28 |
29 | - `pages/`:存放各个页面的目录
30 | - `home/`:首页相关的页面文件
31 | - `detail/`:课程详情页相关的页面文件
32 | - `mine/`:个人中心页相关的页面文件
33 | - `app.js`:小程序的入口文件
34 | - `app.json`:小程序的配置文件
35 | - `app.wxss`:小程序的全局样式文件
36 |
37 | ## 腾讯cos文件目录
38 |
39 | - images/目录下放置所需图片
40 | - jsondata目录下的2个json数据,loginUser.json、course.json用来保存登录信息和报名点赞数
41 | - course.json的文件内容:
42 | ```json
43 | {
44 | "applyInfo": {
45 | "applyCounts": [
46 | {
47 | "id": 1,
48 | "applyCount": 3
49 | },
50 | {
51 | "id": 2,
52 | "applyCount": 3
53 | },
54 | {
55 | "id": 3,
56 | "applyCount": 2
57 | },
58 | {
59 | "id": 4,
60 | "applyCount": 3
61 | },
62 | {
63 | "id": 5,
64 | "applyCount": 2
65 | },
66 | {
67 | "id": 6,
68 | "applyCount": 0
69 | },
70 | {
71 | "id": 7,
72 | "applyCount": 1
73 | },
74 | {
75 | "id": 8,
76 | "applyCount": 0
77 | },
78 | {
79 | "id": 9,
80 | "applyCount": 0
81 | },
82 | {
83 | "id": 10,
84 | "applyCount": 0
85 | }
86 | ],
87 | "applyCourses": [
88 | {
89 | "nickName": "张三",
90 | "courseIds": [
91 | 2,
92 | 3,
93 | 4,
94 | 1,
95 | 7,
96 | 5
97 | ]
98 | },
99 | {
100 | "nickName": "123",
101 | "courseIds": [
102 | 4,
103 | 2,
104 | 3,
105 | 1
106 | ]
107 | },
108 | {
109 | "nickName": "232",
110 | "courseIds": [
111 | 2,
112 | 1
113 | ]
114 | },
115 | {
116 | "nickName": "2233",
117 | "courseIds": [
118 | 4,
119 | 5
120 | ]
121 | }
122 | ]
123 | },
124 | "likeInfo": {
125 | "likeCounts": [
126 | {
127 | "id": 1,
128 | "likeCount": 2
129 | },
130 | {
131 | "id": 2,
132 | "likeCount": 2
133 | },
134 | {
135 | "id": 3,
136 | "likeCount": 1
137 | },
138 | {
139 | "id": 4,
140 | "likeCount": 1
141 | },
142 | {
143 | "id": 5,
144 | "likeCount": 2
145 | },
146 | {
147 | "id": 6,
148 | "likeCount": 2
149 | },
150 | {
151 | "id": 7,
152 | "likeCount": 0
153 | },
154 | {
155 | "id": 8,
156 | "likeCount": 1
157 | }
158 | ],
159 | "likeCourses": [
160 | {
161 | "nickName": "张三",
162 | "collectList": [
163 | {
164 | "id": 1,
165 | "category": "绘图类",
166 | "title": "AI绘图工具入门教程",
167 | "description": "探索MidJourney的基本功能和界面,快速上手绘图工具,为你的创作之旅打下坚实基础。",
168 | "coverUrl": "/images/课程封面01.png",
169 | "images": [
170 | "/images/课程封面01.png"
171 | ],
172 | "applyCount": 1,
173 | "likes": 2,
174 | "lecturer": {
175 | "avatar": "/images/avatar01.png",
176 | "name": "amy.xue",
177 | "department": "AI工具探索者"
178 | },
179 | "chapterList": [
180 | {
181 | "title": "第一章:介绍MidJourney",
182 | "description": "课程概述:了解课程内容和学习目标。"
183 | },
184 | {
185 | "title": "第二章:安装和入门",
186 | "description": "1、指导学员如何下载和安装MidJourney应用程序。\n2、注册和登录:详细说明注册和登录MidJourney账号的步骤和方法。\n3、界面导览:介绍MidJourney的主要界面和功能区域。"
187 | },
188 | {
189 | "title": "第三章:基本绘图工具",
190 | "description": "1、绘图基础知识:回顾绘图的基本概念和技巧。\n2、绘图工具概览:介绍MidJourney中常用的绘图工具和功能。\n3、图层管理:学习如何创建、编辑和管理图层,实现绘图的分层效果。"
191 | },
192 | {
193 | "title": "第四章:图像处理和效果",
194 | "description": "1、调整图像参数:学习如何使用MidJourney的调整功能对图像进行亮度、对比度、饱和度等参数的调整。\n2、滤镜和特效:探索MidJourney中的滤镜和特效功能,为图像添加艺术效果和风格。\n3、文本和标注:学习如何在图像上添加文本、标注和说明,增强图像的表达力和可读性。"
195 | },
196 | {
197 | "title": "第五章:导出和分享作品",
198 | "description": "1、图像导出:教授学员如何导出和保存绘制的图像,选择合适的格式和质量设置。\n2、分享和展示:介绍将作品分享到社交媒体平台、博客或在线画廊的方法,展示自己的创作成果。"
199 | }
200 | ],
201 | "estimatedDate": "日期待定",
202 | "estimatedDuration": 30
203 | }
204 | ]
205 | },
206 | {
207 | "nickName": "123",
208 | "collectList": [
209 | {
210 | "id": 2,
211 | "category": "绘图类",
212 | "title": "AI换脸艺术",
213 | "description": "利用MidJourney的AI换脸功能,学习如何将自己或他人的脸部特征与名人、艺术作品等进行融合。",
214 | "coverUrl": "自己cos的服务域名地址/images/course02/%E6%8D%A2%E8%84%B8%E5%B0%81%E9%9D%A2.png",
215 | "images": [
216 | "自己cos的服务域名地址/images/course02/%E6%8D%A2%E8%84%B8%E5%B0%81%E9%9D%A2.png",
217 | "自己cos的服务域名地址/images/course02/%E6%8D%A2%E8%84%B8%E8%BD%AE%E6%92%AD%E5%9B%BE01.png"
218 | ],
219 | "applyCount": 3,
220 | "likes": 2,
221 | "lecturer": {
222 | "avatar": "自己cos的服务域名地址/images/avatar01.png",
223 | "name": "amy.xue",
224 | "department": "AI工具探索者"
225 | },
226 | "chapterList": [
227 | {
228 | "title": "第一章:介绍",
229 | "description": "了解课程的概述和学习目标"
230 | },
231 | {
232 | "title": "第二章:基础知识",
233 | "description": "掌握AI换脸的基本原理和相关技术"
234 | },
235 | {
236 | "title": "第三章:MidJourney工具介绍",
237 | "description": "学习MidJourney工具的功能和界面"
238 | },
239 | {
240 | "title": "第四章:准备工作",
241 | "description": "了解进行AI换脸艺术所需的前期准备"
242 | },
243 | {
244 | "title": "第五章:人脸特征提取",
245 | "description": "学习如何提取自己或他人的人脸特征"
246 | },
247 | {
248 | "title": "第六章:选择换脸素材",
249 | "description": "探索选择合适的名人或艺术作品作为换脸素材"
250 | },
251 | {
252 | "title": "第七章:融合人脸特征",
253 | "description": "学习将人脸特征与素材进行融合的技巧和方法"
254 | },
255 | {
256 | "title": "第八章:调整与优化",
257 | "description": "掌握调整换脸效果和优化艺术效果的技巧"
258 | },
259 | {
260 | "title": "第九章:创作实践",
261 | "description": "实践应用所学知识,创作个性化的AI换脸作品"
262 | },
263 | {
264 | "title": "第十章:作品分享与展示",
265 | "description": "分享和展示自己的AI换脸艺术作品"
266 | }
267 | ],
268 | "estimatedDate": "日期待定",
269 | "estimatedDuration": 30
270 | }
271 | ]
272 | },
273 | {
274 | "nickName": "456",
275 | "collectList": [
276 | {
277 | "id": 3,
278 | "category": "绘图类",
279 | "title": "创意海报设计",
280 | "description": "探索MidJourney的设计工具和素材库,学习如何利用AI工具设计令人印象深刻的海报,为你的品牌、活动或个人展示增添创意。",
281 | "coverUrl": "/images/课程封面03.png",
282 | "images": [
283 | "/images/课程封面03.png"
284 | ],
285 | "applyCount": 2,
286 | "likes": 3,
287 | "lecturer": {
288 | "avatar": "/images/avatar01.png",
289 | "name": "amy.xue",
290 | "department": "AI工具探索者"
291 | },
292 | "chapterList": [
293 | {
294 | "title": "第一章:认识MidJourney",
295 | "description": "介绍MidJourney工具的概述和功能,了解如何开始使用该工具进行创意海报设计。"
296 | },
297 | {
298 | "title": "第二章:海报设计基础",
299 | "description": "学习海报设计的基本原理和要素,包括色彩搭配、排版技巧、字体选择等,为创作令人印象深刻的海报打下基础。"
300 | },
301 | {
302 | "title": "第三章:MidJourney工具介绍",
303 | "description": "深入了解MidJourney工具的各项功能和操作,包括素材库的使用、图层管理、图像处理等,掌握如何利用工具进行海报设计。"
304 | },
305 | {
306 | "title": "第四章:创意海报构思",
307 | "description": "学习如何进行创意海报的构思和策划,包括目标受众分析、主题选择、创意发散等,为设计出独特和有吸引力的海报奠定基础。"
308 | },
309 | {
310 | "title": "第五章:海报设计实践",
311 | "description": "通过实际案例演练,掌握如何使用MidJourney工具进行海报设计,包括添加图像、调整图层、应用特效等技巧和操作。"
312 | },
313 | {
314 | "title": "第六章:创意海报优化",
315 | "description": "学习如何优化和完善创意海报,包括颜色调整、细节修饰、效果增强等,提升海报的吸引力和表现力。"
316 | },
317 | {
318 | "title": "第七章:海报输出与分享",
319 | "description": "了解海报的输出格式和要求,学习如何导出高质量的海报文件,并掌握分享海报的方式和渠道,让你的创作得到更多的关注和赞赏。"
320 | },
321 | {
322 | "title": "第八章:海报案例解析",
323 | "description": "分析和解读一些优秀的创意海报案例,探讨其设计思路和技巧,启发你在海报设计中的创意和灵感。"
324 | },
325 | {
326 | "title": "第九章:品牌展示与个人推广",
327 | "description": "学习如何利用创意海报为品牌、活动或个人进行展示和推广,包括在社交媒体上发布、制作印刷品等方式,打造个性化的形象和品牌价值。"
328 | },
329 | {
330 | "title": "第十章:创意海报设计进阶",
331 | "description": "进一步探索创意海报设计的高级技巧和趋势,了解最新的设计潮流和应用场景,为你的创作之路开拓更广阔的可能性。"
332 | }
333 | ],
334 | "estimatedDate": "日期待定",
335 | "estimatedDuration": 30
336 | },
337 | {
338 | "id": 8,
339 | "category": "编程类",
340 | "title": "使用ChatGPT从0-1搭建微信小程序",
341 | "description": "学习如何利用ChatGPT和微信小程序开发框架,从项目规划、界面设计、逻辑实现到发布上线的全流程,掌握微信小程序的开发要点和技巧。",
342 | "coverUrl": "自己cos的服务域名地址/images/course08/%E5%B0%8F%E7%A8%8B%E5%BA%8F%E5%B0%81%E9%9D%A2.png",
343 | "images": [
344 | "自己cos的服务域名地址/images/course08/%E5%B0%8F%E7%A8%8B%E5%BA%8F%E5%B0%81%E9%9D%A2.png"
345 | ],
346 | "applyCount": 0,
347 | "likes": 1,
348 | "lecturer": {
349 | "avatar": "/images/avatar01.png",
350 | "name": "amy.xue",
351 | "department": "AI工具探索者"
352 | },
353 | "chapterList": [
354 | {
355 | "title": "第一章:课程介绍",
356 | "description": "了解课程的概述和学习目标"
357 | },
358 | {
359 | "title": "第二章:微信小程序开发入门",
360 | "description": "学习微信小程序的基本概念和开发环境的搭建"
361 | },
362 | {
363 | "title": "第三章:界面设计与布局",
364 | "description": "探索微信小程序界面设计的基本原则和布局方法"
365 | },
366 | {
367 | "title": "第四章:逻辑实现与数据交互",
368 | "description": "学习微信小程序逻辑实现和与后端数据交互的方法"
369 | },
370 | {
371 | "title": "第五章:小程序发布与上线",
372 | "description": "了解微信小程序的发布流程和上线注意事项"
373 | },
374 | {
375 | "title": "第六章:小程序优化与调试",
376 | "description": "学习微信小程序的性能优化和调试技巧"
377 | },
378 | {
379 | "title": "第七章:小程序商业化变现",
380 | "description": "探索如何利用微信小程序进行商业化变现和推广"
381 | }
382 | ],
383 | "estimatedDate": "日期待定",
384 | "estimatedDuration": 30
385 | }
386 | ]
387 | },
388 | {
389 | "nickName": "2233",
390 | "collectList": [
391 | {
392 | "id": 4,
393 | "category": "绘图类",
394 | "title": "AI卡通形象创作",
395 | "description": "使用MidJourney的AI技术,学习如何将照片或人物形象转化为可爱的卡通形象,为个人品牌、社交媒体等打造独特形象。",
396 | "coverUrl": "自己cos的服务域名地址/images/course04/%E5%8D%A1%E9%80%9A%E4%BA%BA%E7%89%A9%E5%B0%81%E9%9D%A2.png",
397 | "images": [
398 | "自己cos的服务域名地址/images/course04/%E5%8D%A1%E9%80%9A%E4%BA%BA%E7%89%A9%E5%B0%81%E9%9D%A2.png",
399 | "自己cos的服务域名地址/images/course04/%E5%8D%A1%E9%80%9A%E4%BA%BA%E7%89%A9%E8%BD%AE%E6%92%AD%E5%9B%BE01.png",
400 | "自己cos的服务域名地址/images/course04/%E5%8D%A1%E9%80%9A%E4%BA%BA%E7%89%A9%E8%BD%AE%E6%92%AD%E5%9B%BE02.png",
401 | "自己cos的服务域名地址/images/course04/%E5%8D%A1%E9%80%9A%E4%BA%BA%E7%89%A9%E8%BD%AE%E6%92%AD%E5%9B%BE03.png"
402 | ],
403 | "applyCount": 2,
404 | "likes": 1,
405 | "lecturer": {
406 | "avatar": "自己cos的服务域名地址/images/avatar01.png",
407 | "name": "amy.xue",
408 | "department": "AI工具探索者"
409 | },
410 | "chapterList": [
411 | {
412 | "title": "第一章:课程介绍",
413 | "description": "了解课程的概述和学习目标"
414 | },
415 | {
416 | "title": "第二章:卡通形象的特点",
417 | "description": "探索卡通形象的基本特点和设计原则"
418 | },
419 | {
420 | "title": "第三章:MidJourney工具介绍",
421 | "description": "学习MidJourney工具的功能和界面"
422 | },
423 | {
424 | "title": "第四章:准备工作",
425 | "description": "了解进行AI卡通形象创作所需的前期准备"
426 | },
427 | {
428 | "title": "第五章:选择素材照片",
429 | "description": "学习如何选择适合的照片作为卡通形象的基础"
430 | },
431 | {
432 | "title": "第六章:形象转化",
433 | "description": "掌握将照片转化为卡通形象的技巧和方法"
434 | },
435 | {
436 | "title": "第七章:特征调整与个性化",
437 | "description": "学习调整卡通形象特征和个性化定制的技巧"
438 | },
439 | {
440 | "title": "第八章:表情和动作设计",
441 | "description": "探索为卡通形象设计表情和动作的创意方法"
442 | },
443 | {
444 | "title": "第九章:配色和风格化",
445 | "description": "学习如何为卡通形象选择合适的配色和风格化处理"
446 | },
447 | {
448 | "title": "第十章:应用和展示",
449 | "description": "实践应用所学知识,展示个人卡通形象的应用场景"
450 | }
451 | ],
452 | "estimatedDate": "日期待定",
453 | "estimatedDuration": 30
454 | },
455 | {
456 | "id": 5,
457 | "category": "绘图类",
458 | "title": "电商模块图设计",
459 | "description": "学习如何使用MidJourney的工具和功能,设计吸引人的电商模块图,提升产品在电商平台上的吸引力和销售效果。",
460 | "coverUrl": "自己cos的服务域名地址/images/course05/%E7%94%B5%E5%95%86%E6%A8%A1%E7%89%B9%E5%B0%81%E9%9D%A2.png",
461 | "images": [
462 | "自己cos的服务域名地址/images/course05/%E7%94%B5%E5%95%86%E6%A8%A1%E7%89%B9%E5%B0%81%E9%9D%A2.png",
463 | "自己cos的服务域名地址/images/course05/%E7%94%B5%E5%95%86%E6%A8%A1%E7%89%B9%E8%BD%AE%E6%92%AD%E5%9B%BE01.png",
464 | "自己cos的服务域名地址/images/course05/%E7%94%B5%E5%95%86%E6%A8%A1%E7%89%B9%E8%BD%AE%E6%92%AD%E5%9B%BE02.png",
465 | "自己cos的服务域名地址/images/course05/%E7%94%B5%E5%95%86%E6%A8%A1%E7%89%B9%E8%BD%AE%E6%92%AD%E5%9B%BE03.png"
466 | ],
467 | "applyCount": 1,
468 | "likes": 2,
469 | "lecturer": {
470 | "avatar": "自己cos的服务域名地址/images/avatar01.png",
471 | "name": "amy.xue",
472 | "department": "AI工具探索者"
473 | },
474 | "chapterList": [
475 | {
476 | "title": "第一章:课程介绍",
477 | "description": "了解课程的概述和学习目标"
478 | },
479 | {
480 | "title": "第二章:电商模块图概述",
481 | "description": "探索电商模块图的基本概念和设计原则"
482 | },
483 | {
484 | "title": "第三章:MidJourney工具介绍",
485 | "description": "学习MidJourney工具的功能和界面"
486 | },
487 | {
488 | "title": "第四章:电商平台分析",
489 | "description": "了解各种电商平台的特点和需求"
490 | },
491 | {
492 | "title": "第五章:模块图设计要素",
493 | "description": "学习电商模块图的设计要素和注意事项"
494 | },
495 | {
496 | "title": "第六章:产品展示模块",
497 | "description": "掌握设计吸引人的产品展示模块的技巧和方法"
498 | },
499 | {
500 | "title": "第七章:导航和分类模块",
501 | "description": "学习设计清晰的导航和分类模块以提升用户体验"
502 | },
503 | {
504 | "title": "第八章:推广和促销模块",
505 | "description": "探索设计引人注目的推广和促销模块的创意方法"
506 | },
507 | {
508 | "title": "第九章:购物流程模块",
509 | "description": "学习设计简洁流畅的购物流程模块以提升转化率"
510 | },
511 | {
512 | "title": "第十章:响应式设计与适配",
513 | "description": "了解如何设计响应式的电商模块图并适配不同设备"
514 | }
515 | ],
516 | "estimatedDate": "日期待定",
517 | "estimatedDuration": 30
518 | }
519 | ]
520 | }
521 | ]
522 | }
523 | }
524 | ```
525 | - loginUser.json的文件内容:
526 | ```json
527 | [
528 | {
529 | "nickName": "amy",
530 | "avatarUrl": [
531 | "自己cos的服务域名地址/images/userAvatar/1687877068798_33381.png"
532 | ]
533 | },
534 | {
535 | "nickName": "xue",
536 | "avatarUrl": [
537 | "自己cos的服务域名地址/images/userAvatar/1687919134978_21958.png"
538 | ]
539 | },
540 | {
541 | "nickName": "123",
542 | "avatarUrl": [
543 | "自己cos的服务域名地址/images/userAvatar/1688092062511_43012.png"
544 | ]
545 | },
546 | {
547 | "nickName": "2233",
548 | "avatarUrl": [
549 | "自己c'o's/images/userAvatar/1688092305243_77783.png"
550 | ]
551 | },
552 | {
553 | "nickName": "232",
554 | "avatarUrl": "自己cos的服务域名地址/images/userAvatar/1688094743409_58568.png"
555 | }
556 | ]
557 | ```
558 |
559 | ## 成果展示
560 |
561 |
562 |
563 |
564 |
565 | https://github.com/xw-an/WechatCourse/assets/9762767/63b2cb80-4efe-421e-b780-b0811208a859
566 |
567 | ## 小程序入口
568 |
569 |
570 |
571 | ## 参与贡献
572 |
573 | - 如果您发现问题或有任何建议,请提交 Issue。
574 | - 如果您想要贡献代码,请 Fork 本项目并提交 Pull Request。
575 |
--------------------------------------------------------------------------------
/app.js:
--------------------------------------------------------------------------------
1 | // app.js
2 | App({
3 | globalData:{
4 | // data: [
5 | // {
6 | // "id": 1,
7 | // "category": "绘图类",
8 | // "title": "AI绘图工具入门教程",
9 | // "description": "探索MidJourney的基本功能和界面,快速上手绘图工具,为你的创作之旅打下坚实基础。",
10 | // "coverUrl": "/images/课程封面01.png",
11 | // "images": [
12 | // "/images/课程封面01.png",
13 | // ],
14 | // "applyCount": 10,
15 | // "likes": 20,
16 | // "lecturer": {
17 | // "avatar": "/images/avatar01.png",
18 | // "name": "amy.xue",
19 | // "department": "AI工具探索者"
20 | // },
21 | // "chapterList": [
22 | // {
23 | // "title": "第一章:介绍MidJourney",
24 | // "description": "课程概述:了解课程内容和学习目标。"
25 | // },
26 | // {
27 | // "title": "第二章:安装和入门",
28 | // "description": "1、指导学员如何下载和安装MidJourney应用程序。\n2、注册和登录:详细说明注册和登录MidJourney账号的步骤和方法。\n3、界面导览:介绍MidJourney的主要界面和功能区域。"
29 | // },
30 | // {
31 | // "title": "第三章:基本绘图工具",
32 | // "description": "1、绘图基础知识:回顾绘图的基本概念和技巧。\n2、绘图工具概览:介绍MidJourney中常用的绘图工具和功能。\n3、图层管理:学习如何创建、编辑和管理图层,实现绘图的分层效果。"
33 | // },
34 | // {
35 | // "title": "第四章:图像处理和效果",
36 | // "description": "1、调整图像参数:学习如何使用MidJourney的调整功能对图像进行亮度、对比度、饱和度等参数的调整。\n2、滤镜和特效:探索MidJourney中的滤镜和特效功能,为图像添加艺术效果和风格。\n3、文本和标注:学习如何在图像上添加文本、标注和说明,增强图像的表达力和可读性。"
37 | // },
38 | // {
39 | // "title": "第五章:导出和分享作品",
40 | // "description": "1、图像导出:教授学员如何导出和保存绘制的图像,选择合适的格式和质量设置。\n2、分享和展示:介绍将作品分享到社交媒体平台、博客或在线画廊的方法,展示自己的创作成果。"
41 | // }
42 | // ],
43 | // "estimatedDate": "日期待定",
44 | // "estimatedDuration": 30
45 | // },
46 | // {
47 | // "id": 2,
48 | // "category": "绘图类",
49 | // "title": "AI换脸艺术",
50 | // "description": "利用MidJourney的AI换脸功能,学习如何将自己或他人的脸部特征与名人、艺术作品等进行融合。",
51 | // "coverUrl": "/images/课程封面02.png",
52 | // "images": [
53 | // "/images/课程封面02.png"
54 | // ],
55 | // "applyCount": 0,
56 | // "likes": 0,
57 | // "lecturer": {
58 | // "avatar": "/images/avatar01.png",
59 | // "name": "amy.xue",
60 | // "department": "AI工具探索者"
61 | // },
62 | // "chapterList": [
63 | // {
64 | // "title": "第一章:介绍",
65 | // "description": "了解课程的概述和学习目标"
66 | // },
67 | // {
68 | // "title": "第二章:基础知识",
69 | // "description": "掌握AI换脸的基本原理和相关技术"
70 | // },
71 | // {
72 | // "title": "第三章:MidJourney工具介绍",
73 | // "description": "学习MidJourney工具的功能和界面"
74 | // },
75 | // {
76 | // "title": "第四章:准备工作",
77 | // "description": "了解进行AI换脸艺术所需的前期准备"
78 | // },
79 | // {
80 | // "title": "第五章:人脸特征提取",
81 | // "description": "学习如何提取自己或他人的人脸特征"
82 | // },
83 | // {
84 | // "title": "第六章:选择换脸素材",
85 | // "description": "探索选择合适的名人或艺术作品作为换脸素材"
86 | // },
87 | // {
88 | // "title": "第七章:融合人脸特征",
89 | // "description": "学习将人脸特征与素材进行融合的技巧和方法"
90 | // },
91 | // {
92 | // "title": "第八章:调整与优化",
93 | // "description": "掌握调整换脸效果和优化艺术效果的技巧"
94 | // },
95 | // {
96 | // "title": "第九章:创作实践",
97 | // "description": "实践应用所学知识,创作个性化的AI换脸作品"
98 | // },
99 | // {
100 | // "title": "第十章:作品分享与展示",
101 | // "description": "分享和展示自己的AI换脸艺术作品"
102 | // }
103 | // ],
104 | // "estimatedDate": "日期待定",
105 | // "estimatedDuration": 30
106 | // },
107 | // {
108 | // "id": 3,
109 | // "category": "绘图类",
110 | // "title": "创意海报设计",
111 | // "description": "探索MidJourney的设计工具和素材库,学习如何利用AI工具设计令人印象深刻的海报,为你的品牌、活动或个人展示增添创意。",
112 | // "coverUrl": "/images/课程封面03.png",
113 | // "images": [
114 | // "/images/课程封面03.png"
115 | // ],
116 | // "applyCount": 0,
117 | // "likes": 0,
118 | // "lecturer": {
119 | // "avatar": "/images/avatar01.png",
120 | // "name": "amy.xue",
121 | // "department": "AI工具探索者"
122 | // },
123 | // "chapterList": [
124 | // {
125 | // "title": "第一章:认识MidJourney",
126 | // "description": "介绍MidJourney工具的概述和功能,了解如何开始使用该工具进行创意海报设计。"
127 | // },
128 | // {
129 | // "title": "第二章:海报设计基础",
130 | // "description": "学习海报设计的基本原理和要素,包括色彩搭配、排版技巧、字体选择等,为创作令人印象深刻的海报打下基础。"
131 | // },
132 | // {
133 | // "title": "第三章:MidJourney工具介绍",
134 | // "description": "深入了解MidJourney工具的各项功能和操作,包括素材库的使用、图层管理、图像处理等,掌握如何利用工具进行海报设计。"
135 | // },
136 | // {
137 | // "title": "第四章:创意海报构思",
138 | // "description": "学习如何进行创意海报的构思和策划,包括目标受众分析、主题选择、创意发散等,为设计出独特和有吸引力的海报奠定基础。"
139 | // },
140 | // {
141 | // "title": "第五章:海报设计实践",
142 | // "description": "通过实际案例演练,掌握如何使用MidJourney工具进行海报设计,包括添加图像、调整图层、应用特效等技巧和操作。"
143 | // },
144 | // {
145 | // "title": "第六章:创意海报优化",
146 | // "description": "学习如何优化和完善创意海报,包括颜色调整、细节修饰、效果增强等,提升海报的吸引力和表现力。"
147 | // },
148 | // {
149 | // "title": "第七章:海报输出与分享",
150 | // "description": "了解海报的输出格式和要求,学习如何导出高质量的海报文件,并掌握分享海报的方式和渠道,让你的创作得到更多的关注和赞赏。"
151 | // },
152 | // {
153 | // "title": "第八章:海报案例解析",
154 | // "description": "分析和解读一些优秀的创意海报案例,探讨其设计思路和技巧,启发你在海报设计中的创意和灵感。"
155 | // },
156 | // {
157 | // "title": "第九章:品牌展示与个人推广",
158 | // "description": "学习如何利用创意海报为品牌、活动或个人进行展示和推广,包括在社交媒体上发布、制作印刷品等方式,打造个性化的形象和品牌价值。"
159 | // },
160 | // {
161 | // "title": "第十章:创意海报设计进阶",
162 | // "description": "进一步探索创意海报设计的高级技巧和趋势,了解最新的设计潮流和应用场景,为你的创作之路开拓更广阔的可能性。"
163 | // }],
164 | // "estimatedDate": "日期待定",
165 | // "estimatedDuration": 30
166 | // },
167 | // {
168 | // "id": 4,
169 | // "category": "绘图类",
170 | // "title": "AI卡通形象创作",
171 | // "description": "使用MidJourney的AI技术,学习如何将照片或人物形象转化为可爱的卡通形象,为个人品牌、社交媒体等打造独特形象。",
172 | // "coverUrl": "/images/课程封面04.png",
173 | // "images": [
174 | // "/images/课程封面04.png"
175 | // ],
176 | // "applyCount": 0,
177 | // "likes": 0,
178 | // "lecturer": {
179 | // "avatar": "/images/avatar01.png",
180 | // "name": "amy.xue",
181 | // "department": "AI工具探索者"
182 | // },
183 | // "chapterList": [
184 | // {
185 | // "title": "第一章:课程介绍",
186 | // "description": "了解课程的概述和学习目标"
187 | // },
188 | // {
189 | // "title": "第二章:卡通形象的特点",
190 | // "description": "探索卡通形象的基本特点和设计原则"
191 | // },
192 | // {
193 | // "title": "第三章:MidJourney工具介绍",
194 | // "description": "学习MidJourney工具的功能和界面"
195 | // },
196 | // {
197 | // "title": "第四章:准备工作",
198 | // "description": "了解进行AI卡通形象创作所需的前期准备"
199 | // },
200 | // {
201 | // "title": "第五章:选择素材照片",
202 | // "description": "学习如何选择适合的照片作为卡通形象的基础"
203 | // },
204 | // {
205 | // "title": "第六章:形象转化",
206 | // "description": "掌握将照片转化为卡通形象的技巧和方法"
207 | // },
208 | // {
209 | // "title": "第七章:特征调整与个性化",
210 | // "description": "学习调整卡通形象特征和个性化定制的技巧"
211 | // },
212 | // {
213 | // "title": "第八章:表情和动作设计",
214 | // "description": "探索为卡通形象设计表情和动作的创意方法"
215 | // },
216 | // {
217 | // "title": "第九章:配色和风格化",
218 | // "description": "学习如何为卡通形象选择合适的配色和风格化处理"
219 | // },
220 | // {
221 | // "title": "第十章:应用和展示",
222 | // "description": "实践应用所学知识,展示个人卡通形象的应用场景"
223 | // }
224 | // ],
225 | // "estimatedDate": "日期待定",
226 | // "estimatedDuration": 30
227 | // },
228 | // {
229 | // "id": 5,
230 | // "category": "绘图类",
231 | // "title": "电商模块图设计",
232 | // "description": "学习如何使用MidJourney的工具和功能,设计吸引人的电商模块图,提升产品在电商平台上的吸引力和销售效果。",
233 | // "coverUrl": "/images/课程封面05.png",
234 | // "images": [
235 | // "/images/课程封面05.png"
236 | // ],
237 | // "applyCount": 0,
238 | // "likes": 0,
239 | // "lecturer": {
240 | // "avatar": "/images/avatar01.png",
241 | // "name": "amy.xue",
242 | // "department": "AI工具探索者"
243 | // },
244 | // "chapterList": [
245 | // {
246 | // "title": "第一章:课程介绍",
247 | // "description": "了解课程的概述和学习目标"
248 | // },
249 | // {
250 | // "title": "第二章:电商模块图概述",
251 | // "description": "探索电商模块图的基本概念和设计原则"
252 | // },
253 | // {
254 | // "title": "第三章:MidJourney工具介绍",
255 | // "description": "学习MidJourney工具的功能和界面"
256 | // },
257 | // {
258 | // "title": "第四章:电商平台分析",
259 | // "description": "了解各种电商平台的特点和需求"
260 | // },
261 | // {
262 | // "title": "第五章:模块图设计要素",
263 | // "description": "学习电商模块图的设计要素和注意事项"
264 | // },
265 | // {
266 | // "title": "第六章:产品展示模块",
267 | // "description": "掌握设计吸引人的产品展示模块的技巧和方法"
268 | // },
269 | // {
270 | // "title": "第七章:导航和分类模块",
271 | // "description": "学习设计清晰的导航和分类模块以提升用户体验"
272 | // },
273 | // {
274 | // "title": "第八章:推广和促销模块",
275 | // "description": "探索设计引人注目的推广和促销模块的创意方法"
276 | // },
277 | // {
278 | // "title": "第九章:购物流程模块",
279 | // "description": "学习设计简洁流畅的购物流程模块以提升转化率"
280 | // },
281 | // {
282 | // "title": "第十章:响应式设计与适配",
283 | // "description": "了解如何设计响应式的电商模块图并适配不同设备"
284 | // }
285 | // ],
286 | // "estimatedDate": "日期待定",
287 | // "estimatedDuration": 30
288 | // },
289 | // {
290 | // "id": 6,
291 | // "category": "绘图类",
292 | // "title": "企业标志设计与AI",
293 | // "description": "利用MidJourney的AI设计功能,学习如何运用AI技术创造独特的企业标志,为企业形象打造专业和独特的标识。",
294 | // "coverUrl": "自己cos的服务域名地址/images/course06/logo%E5%B0%81%E9%9D%A2.png",
295 | // "images": [
296 | // "自己cos的服务域名地址/images/course06/logo%E5%B0%81%E9%9D%A2.png"
297 | // ],
298 | // "applyCount": 0,
299 | // "likes": 0,
300 | // "lecturer": {
301 | // "avatar": "/images/avatar01.png",
302 | // "name": "amy.xue",
303 | // "department": "AI工具探索者"
304 | // },
305 | // "chapterList": [
306 | // {
307 | // "title": "第一章:课程介绍",
308 | // "description": "了解课程的概述和学习目标"
309 | // },
310 | // {
311 | // "title": "第二章:企业标志设计概述",
312 | // "description": "探索企业标志设计的基本概念和设计原则"
313 | // },
314 | // {
315 | // "title": "第三章:MidJourney工具介绍",
316 | // "description": "学习MidJourney工具的功能和界面"
317 | // },
318 | // {
319 | // "title": "第四章:企业标志设计要素",
320 | // "description": "了解企业标志设计的关键要素和设计原则"
321 | // },
322 | // {
323 | // "title": "第五章:AI技术在标志设计中的应用",
324 | // "description": "学习如何运用AI技术创造独特的企业标志"
325 | // },
326 | // {
327 | // "title": "第六章:品牌识别与定位",
328 | // "description": "了解品牌识别和定位在标志设计中的重要性"
329 | // },
330 | // {
331 | // "title": "第七章:色彩和字体选择",
332 | // "description": "学习如何选择适合企业形象的色彩和字体"
333 | // },
334 | // {
335 | // "title": "第八章:图形与形状设计",
336 | // "description": "探索图形和形状设计的创意方法和技巧"
337 | // },
338 | // {
339 | // "title": "第九章:标志设计案例分析",
340 | // "description": "分析并学习成功的企业标志设计案例"
341 | // },
342 | // {
343 | // "title": "第十章:标志设计实践",
344 | // "description": "实践运用所学知识设计企业标志"
345 | // }
346 | // ],
347 | // "estimatedDate": "2023年7月1日",
348 | // "estimatedDuration": 30
349 | // },
350 | // {
351 | // "id": 7,
352 | // "category": "编程类",
353 | // "title": "AI助力高效前后端框架搭建",
354 | // "description": "结合ChatGPT和GitHub Copilot,探索如何快速搭建高效的前后端框架,提升开发效率,让编码工作更轻松、高效。",
355 | // "coverUrl": "自己cos的服务域名地址/images/course07/copilot%E5%B0%81%E9%9D%A2.png",
356 | // "images": [
357 | // "自己cos的服务域名地址/images/course07/copilot%E5%B0%81%E9%9D%A2.png"
358 | // ],
359 | // "applyCount": 0,
360 | // "likes": 0,
361 | // "lecturer": {
362 | // "avatar": "/images/avatar01.png",
363 | // "name": "amy.xue",
364 | // "department": "AI工具探索者"
365 | // },
366 | // "chapterList": [
367 | // {
368 | // "title": "第一章:课程介绍",
369 | // "description": "了解课程的概述和学习目标"
370 | // },
371 | // {
372 | // "title": "第二章:前后端框架基础",
373 | // "description": "学习前后端框架的基本概念和工作原理"
374 | // },
375 | // {
376 | // "title": "第三章:ChatGPT和Copilot简介",
377 | // "description": "探索ChatGPT和Copilot的功能和应用场景"
378 | // },
379 | // {
380 | // "title": "第四章:快速搭建前端框架",
381 | // "description": "学习如何利用ChatGPT和Copilot快速搭建前端框架"
382 | // },
383 | // {
384 | // "title": "第五章:高效开发后端框架",
385 | // "description": "探索利用ChatGPT和Copilot提高后端框架开发效率的方法"
386 | // }
387 | // ],
388 | // "estimatedDate": "日期待定",
389 | // "estimatedDuration": 30
390 | // },
391 | // {
392 | // "id": 8,
393 | // "category": "编程类",
394 | // "title": "使用ChatGPT从0-1搭建微信小程序",
395 | // "description": "学习如何利用ChatGPT和微信小程序开发框架,从项目规划、界面设计、逻辑实现到发布上线的全流程,掌握微信小程序的开发要点和技巧。",
396 | // "coverUrl": "自己cos的服务域名地址/images/course08/%E5%B0%8F%E7%A8%8B%E5%BA%8F%E5%B0%81%E9%9D%A2.png",
397 | // "images": [
398 | // "自己cos的服务域名地址/images/course08/%E5%B0%8F%E7%A8%8B%E5%BA%8F%E5%B0%81%E9%9D%A2.png",
399 | // ],
400 | // "applyCount": 0,
401 | // "likes": 0,
402 | // "lecturer": {
403 | // "avatar": "/images/avatar01.png",
404 | // "name": "amy.xue",
405 | // "department": "AI工具探索者"
406 | // },
407 | // "chapterList": [
408 | // {
409 | // "title": "第一章:课程介绍",
410 | // "description": "了解课程的概述和学习目标"
411 | // },
412 | // {
413 | // "title": "第二章:微信小程序开发入门",
414 | // "description": "学习微信小程序的基本概念和开发环境的搭建"
415 | // },
416 | // {
417 | // "title": "第三章:界面设计与布局",
418 | // "description": "探索微信小程序界面设计的基本原则和布局方法"
419 | // },
420 | // {
421 | // "title": "第四章:逻辑实现与数据交互",
422 | // "description": "学习微信小程序逻辑实现和与后端数据交互的方法"
423 | // },
424 | // {
425 | // "title": "第五章:小程序发布与上线",
426 | // "description": "了解微信小程序的发布流程和上线注意事项"
427 | // },
428 | // {
429 | // "title": "第六章:小程序优化与调试",
430 | // "description": "学习微信小程序的性能优化和调试技巧"
431 | // },
432 | // {
433 | // "title": "第七章:小程序商业化变现",
434 | // "description": "探索如何利用微信小程序进行商业化变现和推广"
435 | // }
436 | // ],
437 | // "estimatedDate": "日期待定",
438 | // "estimatedDuration": 30
439 | // }
440 | // ]
441 | data: [
442 | {
443 | "id": 1,
444 | "category": "绘图类",
445 | "title": "AI绘图工具入门教程",
446 | "description": "探索MidJourney的基本功能和界面,快速上手绘图工具,为你的创作之旅打下坚实基础。",
447 | "coverUrl": "自己cos的服务域名地址/images/course01/%E7%BB%98%E5%9B%BE%E5%B7%A5%E5%85%B7%E5%B0%81%E9%9D%A2.png",
448 | "video": {
449 | "poster": "自己cos的服务域名地址/images/course01/%E7%BB%98%E5%9B%BE%E5%B7%A5%E5%85%B7%E5%B0%81%E9%9D%A2.png",
450 | "url":"自己cos的服务域名地址/video/midjourney%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B-%E6%96%87%E7%94%9F%E5%9B%BE.mov"
451 | },
452 | "images": [
453 | "自己cos的服务域名地址/images/course01/%E7%BB%98%E5%9B%BE%E5%B7%A5%E5%85%B7%E5%B0%81%E9%9D%A2.png",
454 | "自己cos的服务域名地址/images/course01/%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B%E5%B0%81%E9%9D%A2.png",
455 | "自己cos的服务域名地址/images/course01/%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B%E8%BD%AE%E6%92%AD%E5%9B%BE01.png"
456 | ],
457 | "applyCount": 10,
458 | "likes": 20,
459 | "lecturer": {
460 | "avatar": "自己cos的服务域名地址/images/avatar01.png",
461 | "name": "amy.xue",
462 | "department": "AI工具探索者"
463 | },
464 | "chapterList": [
465 | {
466 | "title": "第一章:介绍MidJourney",
467 | "description": "课程概述:了解课程内容和学习目标。"
468 | },
469 | {
470 | "title": "第二章:安装和入门",
471 | "description": "1、指导学员如何下载和安装MidJourney应用程序。\n2、注册和登录:详细说明注册和登录MidJourney账号的步骤和方法。\n3、界面导览:介绍MidJourney的主要界面和功能区域。"
472 | },
473 | {
474 | "title": "第三章:基本绘图工具",
475 | "description": "1、绘图基础知识:回顾绘图的基本概念和技巧。\n2、绘图工具概览:介绍MidJourney中常用的绘图工具和功能。\n3、图层管理:学习如何创建、编辑和管理图层,实现绘图的分层效果。"
476 | },
477 | {
478 | "title": "第四章:图像处理和效果",
479 | "description": "1、调整图像参数:学习如何使用MidJourney的调整功能对图像进行亮度、对比度、饱和度等参数的调整。\n2、滤镜和特效:探索MidJourney中的滤镜和特效功能,为图像添加艺术效果和风格。\n3、文本和标注:学习如何在图像上添加文本、标注和说明,增强图像的表达力和可读性。"
480 | },
481 | {
482 | "title": "第五章:导出和分享作品",
483 | "description": "1、图像导出:教授学员如何导出和保存绘制的图像,选择合适的格式和质量设置。\n2、分享和展示:介绍将作品分享到社交媒体平台、博客或在线画廊的方法,展示自己的创作成果。"
484 | }
485 | ],
486 | "estimatedDate": "日期待定",
487 | "estimatedDuration": 30
488 | },
489 | {
490 | "id": 2,
491 | "category": "绘图类",
492 | "title": "AI换脸艺术",
493 | "description": "利用MidJourney的AI换脸功能,学习如何将自己或他人的脸部特征与名人、艺术作品等进行融合。",
494 | "coverUrl": "自己cos的服务域名地址/images/course02/%E6%8D%A2%E8%84%B8%E5%B0%81%E9%9D%A2.png",
495 | "images": [
496 | "自己cos的服务域名地址/images/course02/%E6%8D%A2%E8%84%B8%E5%B0%81%E9%9D%A2.png",
497 | "自己cos的服务域名地址/images/course02/%E6%8D%A2%E8%84%B8%E8%BD%AE%E6%92%AD%E5%9B%BE01.png"
498 | ],
499 | "applyCount": 0,
500 | "likes": 0,
501 | "lecturer": {
502 | "avatar": "自己cos的服务域名地址/images/avatar01.png",
503 | "name": "amy.xue",
504 | "department": "AI工具探索者"
505 | },
506 | "chapterList": [
507 | {
508 | "title": "第一章:介绍",
509 | "description": "了解课程的概述和学习目标"
510 | },
511 | {
512 | "title": "第二章:基础知识",
513 | "description": "掌握AI换脸的基本原理和相关技术"
514 | },
515 | {
516 | "title": "第三章:MidJourney工具介绍",
517 | "description": "学习MidJourney工具的功能和界面"
518 | },
519 | {
520 | "title": "第四章:准备工作",
521 | "description": "了解进行AI换脸艺术所需的前期准备"
522 | },
523 | {
524 | "title": "第五章:人脸特征提取",
525 | "description": "学习如何提取自己或他人的人脸特征"
526 | },
527 | {
528 | "title": "第六章:选择换脸素材",
529 | "description": "探索选择合适的名人或艺术作品作为换脸素材"
530 | },
531 | {
532 | "title": "第七章:融合人脸特征",
533 | "description": "学习将人脸特征与素材进行融合的技巧和方法"
534 | },
535 | {
536 | "title": "第八章:调整与优化",
537 | "description": "掌握调整换脸效果和优化艺术效果的技巧"
538 | },
539 | {
540 | "title": "第九章:创作实践",
541 | "description": "实践应用所学知识,创作个性化的AI换脸作品"
542 | },
543 | {
544 | "title": "第十章:作品分享与展示",
545 | "description": "分享和展示自己的AI换脸艺术作品"
546 | }
547 | ],
548 | "estimatedDate": "日期待定",
549 | "estimatedDuration": 30
550 | },
551 | {
552 | "id": 3,
553 | "category": "绘图类",
554 | "title": "创意海报设计",
555 | "description": "探索MidJourney的设计工具和素材库,学习如何利用AI工具设计令人印象深刻的海报,为你的品牌、活动或个人展示增添创意。",
556 | "coverUrl": "自己cos的服务域名地址/images/course03/%E5%88%9B%E6%84%8F%E6%B5%B7%E6%8A%A5%E5%B0%81%E9%9D%A2.png",
557 | "images": [
558 | "自己cos的服务域名地址/images/course03/%E5%88%9B%E6%84%8F%E6%B5%B7%E6%8A%A5%E5%B0%81%E9%9D%A2.png",
559 | "自己cos的服务域名地址/images/course03/%E5%88%9B%E6%84%8F%E6%B5%B7%E6%8A%A5%E8%BD%AE%E6%92%AD%E5%9B%BE01.png",
560 | "自己cos的服务域名地址/images/course03/%E5%88%9B%E6%84%8F%E6%B5%B7%E6%8A%A5%E8%BD%AE%E6%92%AD%E5%9B%BE02.png"
561 | ],
562 | "applyCount": 0,
563 | "likes": 0,
564 | "lecturer": {
565 | "avatar": "自己cos的服务域名地址/images/avatar01.png",
566 | "name": "amy.xue",
567 | "department": "AI工具探索者"
568 | },
569 | "chapterList": [
570 | {
571 | "title": "第一章:认识MidJourney",
572 | "description": "介绍MidJourney工具的概述和功能,了解如何开始使用该工具进行创意海报设计。"
573 | },
574 | {
575 | "title": "第二章:海报设计基础",
576 | "description": "学习海报设计的基本原理和要素,包括色彩搭配、排版技巧、字体选择等,为创作令人印象深刻的海报打下基础。"
577 | },
578 | {
579 | "title": "第三章:MidJourney工具介绍",
580 | "description": "深入了解MidJourney工具的各项功能和操作,包括素材库的使用、图层管理、图像处理等,掌握如何利用工具进行海报设计。"
581 | },
582 | {
583 | "title": "第四章:创意海报构思",
584 | "description": "学习如何进行创意海报的构思和策划,包括目标受众分析、主题选择、创意发散等,为设计出独特和有吸引力的海报奠定基础。"
585 | },
586 | {
587 | "title": "第五章:海报设计实践",
588 | "description": "通过实际案例演练,掌握如何使用MidJourney工具进行海报设计,包括添加图像、调整图层、应用特效等技巧和操作。"
589 | },
590 | {
591 | "title": "第六章:创意海报优化",
592 | "description": "学习如何优化和完善创意海报,包括颜色调整、细节修饰、效果增强等,提升海报的吸引力和表现力。"
593 | },
594 | {
595 | "title": "第七章:海报输出与分享",
596 | "description": "了解海报的输出格式和要求,学习如何导出高质量的海报文件,并掌握分享海报的方式和渠道,让你的创作得到更多的关注和赞赏。"
597 | },
598 | {
599 | "title": "第八章:海报案例解析",
600 | "description": "分析和解读一些优秀的创意海报案例,探讨其设计思路和技巧,启发你在海报设计中的创意和灵感。"
601 | },
602 | {
603 | "title": "第九章:品牌展示与个人推广",
604 | "description": "学习如何利用创意海报为品牌、活动或个人进行展示和推广,包括在社交媒体上发布、制作印刷品等方式,打造个性化的形象和品牌价值。"
605 | },
606 | {
607 | "title": "第十章:创意海报设计进阶",
608 | "description": "进一步探索创意海报设计的高级技巧和趋势,了解最新的设计潮流和应用场景,为你的创作之路开拓更广阔的可能性。"
609 | }],
610 | "estimatedDate": "日期待定",
611 | "estimatedDuration": 30
612 | },
613 | {
614 | "id": 4,
615 | "category": "绘图类",
616 | "title": "AI卡通形象创作",
617 | "description": "使用MidJourney的AI技术,学习如何将照片或人物形象转化为可爱的卡通形象,为个人品牌、社交媒体等打造独特形象。",
618 | "coverUrl": "自己cos的服务域名地址/images/course04/%E5%8D%A1%E9%80%9A%E4%BA%BA%E7%89%A9%E5%B0%81%E9%9D%A2.png",
619 | "images": [
620 | "自己cos的服务域名地址/images/course04/%E5%8D%A1%E9%80%9A%E4%BA%BA%E7%89%A9%E5%B0%81%E9%9D%A2.png",
621 | "自己cos的服务域名地址/images/course04/%E5%8D%A1%E9%80%9A%E4%BA%BA%E7%89%A9%E8%BD%AE%E6%92%AD%E5%9B%BE01.png",
622 | "自己cos的服务域名地址/images/course04/%E5%8D%A1%E9%80%9A%E4%BA%BA%E7%89%A9%E8%BD%AE%E6%92%AD%E5%9B%BE02.png",
623 | "自己cos的服务域名地址/images/course04/%E5%8D%A1%E9%80%9A%E4%BA%BA%E7%89%A9%E8%BD%AE%E6%92%AD%E5%9B%BE03.png"
624 | ],
625 | "applyCount": 0,
626 | "likes": 0,
627 | "lecturer": {
628 | "avatar": "自己cos的服务域名地址/images/avatar01.png",
629 | "name": "amy.xue",
630 | "department": "AI工具探索者"
631 | },
632 | "chapterList": [
633 | {
634 | "title": "第一章:课程介绍",
635 | "description": "了解课程的概述和学习目标"
636 | },
637 | {
638 | "title": "第二章:卡通形象的特点",
639 | "description": "探索卡通形象的基本特点和设计原则"
640 | },
641 | {
642 | "title": "第三章:MidJourney工具介绍",
643 | "description": "学习MidJourney工具的功能和界面"
644 | },
645 | {
646 | "title": "第四章:准备工作",
647 | "description": "了解进行AI卡通形象创作所需的前期准备"
648 | },
649 | {
650 | "title": "第五章:选择素材照片",
651 | "description": "学习如何选择适合的照片作为卡通形象的基础"
652 | },
653 | {
654 | "title": "第六章:形象转化",
655 | "description": "掌握将照片转化为卡通形象的技巧和方法"
656 | },
657 | {
658 | "title": "第七章:特征调整与个性化",
659 | "description": "学习调整卡通形象特征和个性化定制的技巧"
660 | },
661 | {
662 | "title": "第八章:表情和动作设计",
663 | "description": "探索为卡通形象设计表情和动作的创意方法"
664 | },
665 | {
666 | "title": "第九章:配色和风格化",
667 | "description": "学习如何为卡通形象选择合适的配色和风格化处理"
668 | },
669 | {
670 | "title": "第十章:应用和展示",
671 | "description": "实践应用所学知识,展示个人卡通形象的应用场景"
672 | }
673 | ],
674 | "estimatedDate": "日期待定",
675 | "estimatedDuration": 30
676 | },
677 | {
678 | "id": 5,
679 | "category": "绘图类",
680 | "title": "电商模块图设计",
681 | "description": "学习如何使用MidJourney的工具和功能,设计吸引人的电商模块图,提升产品在电商平台上的吸引力和销售效果。",
682 | "coverUrl": "自己cos的服务域名地址/images/course05/%E7%94%B5%E5%95%86%E6%A8%A1%E7%89%B9%E5%B0%81%E9%9D%A2.png",
683 | "images": [
684 | "自己cos的服务域名地址/images/course05/%E7%94%B5%E5%95%86%E6%A8%A1%E7%89%B9%E5%B0%81%E9%9D%A2.png",
685 | "自己cos的服务域名地址/images/course05/%E7%94%B5%E5%95%86%E6%A8%A1%E7%89%B9%E8%BD%AE%E6%92%AD%E5%9B%BE01.png",
686 | "自己cos的服务域名地址/images/course05/%E7%94%B5%E5%95%86%E6%A8%A1%E7%89%B9%E8%BD%AE%E6%92%AD%E5%9B%BE02.png",
687 | "自己cos的服务域名地址/images/course05/%E7%94%B5%E5%95%86%E6%A8%A1%E7%89%B9%E8%BD%AE%E6%92%AD%E5%9B%BE03.png"
688 | ],
689 | "applyCount": 0,
690 | "likes": 0,
691 | "lecturer": {
692 | "avatar": "自己cos的服务域名地址/images/avatar01.png",
693 | "name": "amy.xue",
694 | "department": "AI工具探索者"
695 | },
696 | "chapterList": [
697 | {
698 | "title": "第一章:课程介绍",
699 | "description": "了解课程的概述和学习目标"
700 | },
701 | {
702 | "title": "第二章:电商模块图概述",
703 | "description": "探索电商模块图的基本概念和设计原则"
704 | },
705 | {
706 | "title": "第三章:MidJourney工具介绍",
707 | "description": "学习MidJourney工具的功能和界面"
708 | },
709 | {
710 | "title": "第四章:电商平台分析",
711 | "description": "了解各种电商平台的特点和需求"
712 | },
713 | {
714 | "title": "第五章:模块图设计要素",
715 | "description": "学习电商模块图的设计要素和注意事项"
716 | },
717 | {
718 | "title": "第六章:产品展示模块",
719 | "description": "掌握设计吸引人的产品展示模块的技巧和方法"
720 | },
721 | {
722 | "title": "第七章:导航和分类模块",
723 | "description": "学习设计清晰的导航和分类模块以提升用户体验"
724 | },
725 | {
726 | "title": "第八章:推广和促销模块",
727 | "description": "探索设计引人注目的推广和促销模块的创意方法"
728 | },
729 | {
730 | "title": "第九章:购物流程模块",
731 | "description": "学习设计简洁流畅的购物流程模块以提升转化率"
732 | },
733 | {
734 | "title": "第十章:响应式设计与适配",
735 | "description": "了解如何设计响应式的电商模块图并适配不同设备"
736 | }
737 | ],
738 | "estimatedDate": "日期待定",
739 | "estimatedDuration": 30
740 | },
741 | {
742 | "id": 6,
743 | "category": "绘图类",
744 | "title": "企业标志设计与AI",
745 | "description": "利用MidJourney的AI设计功能,学习如何运用AI技术创造独特的企业标志,为企业形象打造专业和独特的标识。",
746 | "coverUrl": "自己cos的服务域名地址/images/course06/logo%E5%B0%81%E9%9D%A2.png",
747 | "images": [
748 | "自己cos的服务域名地址/images/course06/logo%E5%B0%81%E9%9D%A2.png",
749 | "自己cos的服务域名地址/images/course06/logo%E8%BD%AE%E6%92%AD%E5%9B%BE01.png",
750 | "自己cos的服务域名地址/images/course06/logo%E8%BD%AE%E6%92%AD%E5%9B%BE02.png",
751 | "自己cos的服务域名地址/images/course06/logo%E8%BD%AE%E6%92%AD%E5%9B%BE03.png"
752 | ],
753 | "applyCount": 0,
754 | "likes": 0,
755 | "lecturer": {
756 | "avatar": "自己cos的服务域名地址/images/avatar01.png",
757 | "name": "amy.xue",
758 | "department": "AI工具探索者"
759 | },
760 | "chapterList": [
761 | {
762 | "title": "第一章:课程介绍",
763 | "description": "了解课程的概述和学习目标"
764 | },
765 | {
766 | "title": "第二章:企业标志设计概述",
767 | "description": "探索企业标志设计的基本概念和设计原则"
768 | },
769 | {
770 | "title": "第三章:MidJourney工具介绍",
771 | "description": "学习MidJourney工具的功能和界面"
772 | },
773 | {
774 | "title": "第四章:企业标志设计要素",
775 | "description": "了解企业标志设计的关键要素和设计原则"
776 | },
777 | {
778 | "title": "第五章:AI技术在标志设计中的应用",
779 | "description": "学习如何运用AI技术创造独特的企业标志"
780 | },
781 | {
782 | "title": "第六章:品牌识别与定位",
783 | "description": "了解品牌识别和定位在标志设计中的重要性"
784 | },
785 | {
786 | "title": "第七章:色彩和字体选择",
787 | "description": "学习如何选择适合企业形象的色彩和字体"
788 | },
789 | {
790 | "title": "第八章:图形与形状设计",
791 | "description": "探索图形和形状设计的创意方法和技巧"
792 | },
793 | {
794 | "title": "第九章:标志设计案例分析",
795 | "description": "分析并学习成功的企业标志设计案例"
796 | },
797 | {
798 | "title": "第十章:标志设计实践",
799 | "description": "实践运用所学知识设计企业标志"
800 | }
801 | ],
802 | "estimatedDate": "2023年7月1日",
803 | "estimatedDuration": 30
804 | },
805 | {
806 | "id": 7,
807 | "category": "编程类",
808 | "title": "AI助力高效前后端框架搭建",
809 | "description": "结合ChatGPT和GitHub Copilot,探索如何快速搭建高效的前后端框架,提升开发效率,让编码工作更轻松、高效。",
810 | "coverUrl": "自己cos的服务域名地址/images/course07/copilot%E5%B0%81%E9%9D%A2.png",
811 | "images": [
812 | "自己cos的服务域名地址/images/course07/copilot%E5%B0%81%E9%9D%A2.png"
813 | ],
814 | "applyCount": 0,
815 | "likes": 0,
816 | "lecturer": {
817 | "avatar": "自己cos的服务域名地址/images/avatar01.png",
818 | "name": "amy.xue",
819 | "department": "AI工具探索者"
820 | },
821 | "chapterList": [
822 | {
823 | "title": "第一章:课程介绍",
824 | "description": "了解课程的概述和学习目标"
825 | },
826 | {
827 | "title": "第二章:前后端框架基础",
828 | "description": "学习前后端框架的基本概念和工作原理"
829 | },
830 | {
831 | "title": "第三章:ChatGPT和Copilot简介",
832 | "description": "探索ChatGPT和Copilot的功能和应用场景"
833 | },
834 | {
835 | "title": "第四章:快速搭建前端框架",
836 | "description": "学习如何利用ChatGPT和Copilot快速搭建前端框架"
837 | },
838 | {
839 | "title": "第五章:高效开发后端框架",
840 | "description": "探索利用ChatGPT和Copilot提高后端框架开发效率的方法"
841 | }
842 | ],
843 | "estimatedDate": "日期待定",
844 | "estimatedDuration": 30
845 | },
846 | {
847 | "id": 8,
848 | "category": "编程类",
849 | "title": "使用ChatGPT从0-1搭建微信小程序",
850 | "description": "学习如何利用ChatGPT和微信小程序开发框架,从项目规划、界面设计、逻辑实现到发布上线的全流程,掌握微信小程序的开发要点和技巧。",
851 | "coverUrl": "自己cos的服务域名地址/images/course08/%E5%B0%8F%E7%A8%8B%E5%BA%8F%E5%B0%81%E9%9D%A2.png",
852 | "images": [
853 | "自己cos的服务域名地址/images/course08/%E5%B0%8F%E7%A8%8B%E5%BA%8F%E5%B0%81%E9%9D%A2.png",
854 | ],
855 | "applyCount": 0,
856 | "likes": 0,
857 | "lecturer": {
858 | "avatar": "自己cos的服务域名地址/images/avatar01.png",
859 | "name": "amy.xue",
860 | "department": "AI工具探索者"
861 | },
862 | "chapterList": [
863 | {
864 | "title": "第一章:课程介绍",
865 | "description": "了解课程的概述和学习目标"
866 | },
867 | {
868 | "title": "第二章:微信小程序开发入门",
869 | "description": "学习微信小程序的基本概念和开发环境的搭建"
870 | },
871 | {
872 | "title": "第三章:界面设计与布局",
873 | "description": "探索微信小程序界面设计的基本原则和布局方法"
874 | },
875 | {
876 | "title": "第四章:逻辑实现与数据交互",
877 | "description": "学习微信小程序逻辑实现和与后端数据交互的方法"
878 | },
879 | {
880 | "title": "第五章:小程序发布与上线",
881 | "description": "了解微信小程序的发布流程和上线注意事项"
882 | },
883 | {
884 | "title": "第六章:小程序优化与调试",
885 | "description": "学习微信小程序的性能优化和调试技巧"
886 | },
887 | {
888 | "title": "第七章:小程序商业化变现",
889 | "description": "探索如何利用微信小程序进行商业化变现和推广"
890 | }
891 | ],
892 | "estimatedDate": "日期待定",
893 | "estimatedDuration": 30
894 | }
895 | ]
896 | },
897 | onLaunch: function () {
898 | if (!wx.cloud) {
899 | console.error('请使用 2.2.3 或以上的基础库以使用云能力');
900 | } else {
901 | wx.cloud.init({
902 | // env 参数说明:
903 | // env 参数决定接下来小程序发起的云开发调用(wx.cloud.xxx)会默认请求到哪个云环境的资源
904 | // 此处请填入环境 ID, 环境 ID 可打开云控制台查看
905 | // 如不填则使用默认环境(第一个创建的环境)
906 | // env: 'my-env-id',
907 | traceUser: true,
908 | });
909 | }
910 | // this.globalData = {};
911 | this.fetchDataFromCOS(); // 从 COS 获取数据
912 | },
913 | fetchDataFromCOS() {
914 | // 从 COS 获取 JSON 数据的示例接口地址
915 | const cosJsonUrl = '自己cos的服务域名地址/jsonData/course.json';
916 | wx.request({
917 | url: cosJsonUrl,
918 | method: 'GET',
919 | success: (res) => {
920 | const cosData = res.data; // 从响应中获取 JSON 数据
921 | // 处理数据并更新到 storage
922 | // 遍历cosData中的applyInfo.applyCounts
923 | cosData.applyInfo.applyCounts.forEach(applyCount => {
924 | // 在globalData中查找匹配的id
925 | const matchedData = this.globalData.data.find(data => data.id === applyCount.id);
926 | // 如果找到了匹配的数据,则更新applyCount字段
927 | if (matchedData) {
928 | matchedData.applyCount = applyCount.applyCount;
929 | }
930 | });
931 | // 遍历cosData中的likeInfo.likeCounts
932 | cosData.likeInfo.likeCounts.forEach(likeCount => {
933 | // 在globalData中查找匹配的id
934 | const matchedData = this.globalData.data.find(data => data.id === likeCount.id);
935 | // 如果找到了匹配的数据,则更新likeCount字段
936 | if (matchedData) {
937 | matchedData.likes = likeCount.likeCount;
938 | }
939 | });
940 | // 更新数据到 storage
941 | wx.setStorageSync('courseList', this.globalData.data);
942 | wx.setStorageSync('likeCourses', cosData.likeInfo.likeCourses);
943 | },
944 | fail: (error) => {
945 | console.log('获取数据失败', error);
946 | }
947 | });
948 | }
949 | });
950 |
--------------------------------------------------------------------------------