8 Commits

Author SHA1 Message Date
a38187c13f chore: 视频播放下一集自动保持倍速设置;增加2.5倍速 2026-04-14 10:24:41 +08:00
3b5920cfa5 chore: 更新edu-core依赖至v1.0.11 2026-03-27 09:36:40 +08:00
6fddc1cb4a chore: 小班作业心得思考题等编辑框提示修改
- 将应用版本从2.0.46提升至2.0.47
- 更新edu-core依赖版本至1.0.10
- 在manifest.json中新增读取外部存储和媒体图片的权限
- 修改多个页面的文本提示以提高用户体验
2026-03-27 09:34:02 +08:00
32c625ab2a fix: 修复固定分类逻辑以确保正确处理当前索引和项目
- 优化了固定分类的判断逻辑,确保在当前索引为 null 或 undefined 时正确初始化,并在固定分类存在时调用 curseClick 方法。
2026-03-25 17:44:35 +08:00
2fd84c57e0 fix: 更新订单重复购买的确认按钮文本为继续购买
- 将订单提交组件中的确认按钮文本从“确定”修改为“继续购买”,以更清晰地表达用户操作意图。
2026-03-25 17:44:22 +08:00
ddb8bf6cab chore: remove launch.json configuration file
- Deleted the launch.json file which contained debugging configurations for various app types and launch types.
2026-03-25 17:42:56 +08:00
03e031ac81 feat(订单): 添加预售商品提示功能
- 在订单提交组件中添加预售商品提示弹窗
- 新增预售商品备注接口调用
- 修改VIP购买提示文本,明确不包含论坛权益
- 调整开发环境API配置
2026-03-24 18:46:08 +08:00
2b208f5dd6 chore: 用户观看时长上传和统计
- 在用户信息页面中,增加用户资料的显示,包括今日观看和总观看时长
- 优化课程详情页中视频组件的传递参数,确保课程ID和目录ID的正确传递
- 注释掉不必要的样式代码以提升可读性
2026-03-24 14:23:48 +08:00
15 changed files with 1083 additions and 2108 deletions

View File

@@ -1,38 +0,0 @@
{
// launch.json 配置了启动调试时相关设置configurations下节点名称可为 app-plus/h5/mp-weixin/mp-baidu/mp-alipay/mp-qq/mp-toutiao/mp-360/
// launchtype项可配置值为local或remote, local代表前端连本地云函数remote代表前端连云端云函数
"version" : "0.0",
"configurations" : [
{
"app" : {
"launchtype" : "remote"
},
"app-plus" : {
"launchtype" : "remote"
},
"default" : {
"launchtype" : "local"
},
"h5" : {
"launchtype" : "remote"
},
"mp-weixin" : {
"launchtype" : "local"
},
"provider" : "aliyun",
"type" : "uniCloud"
},
{
"playground" : "custom",
"type" : "uni-app:app-ios"
},
{
"playground" : "custom",
"type" : "uni-app:app-android"
},
{
"playground" : "standard",
"type" : "uni-app:app-ios_simulator"
}
]
}

View File

@@ -2,6 +2,7 @@ let baseUrl = "";
let socketUrl = "";
if (process.env.NODE_ENV === 'development') {
// 开发环境
// baseUrl = "https://testapi.nuttyreading.com/"; // 线上测试
baseUrl = "https://api.nuttyreading.com/"; //线上正式'
// baseUrl = "http://192.168.110.100:9200/pb/"; //张川川
} else if (process.env.NODE_ENV === 'production') {

View File

@@ -12,8 +12,8 @@
"src" : "图片路径"
}
],
"versionName" : "2.0.43",
"versionCode" : 2043,
"versionName" : "2.0.48",
"versionCode" : 2048,
"sassImplementationName" : "node-sass",
"app-plus" : {
"nvueCompiler" : "uni-app",
@@ -63,6 +63,7 @@
"<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
"<uses-permission android:name=\"android.permission.CALL_PHONE\"/>",
"<uses-permission android:name=\"android.permission.CAMERA\"/>",
"",
"<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
"<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
@@ -70,6 +71,8 @@
"<uses-permission android:name=\"android.permission.INTERNET\"/>",
"<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>",
"<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
"<uses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\"/>",
"<uses-permission android:name=\"android.permission.READ_MEDIA_IMAGES\"/>",
"<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
"<uses-permission android:name=\"android.permission.RECEIVE_BOOT_COMPLETED\"/>",
"<uses-permission android:name=\"android.permission.REQUEST_INSTALL_PACKAGES\"/>",
@@ -437,7 +440,9 @@
"uniStatistics" : {
"enable" : true
}
}
},
"fallbackLocale" : "zh-Hans",
"locale" : "zh-Hans"
}
// 小程序特有相关

20
package-lock.json generated
View File

@@ -11,7 +11,7 @@
"dependencies": {
"animate.css": "^4.1.1",
"e-peanut": "file:",
"edu-core": "file:../edu-core",
"edu-core": "git+https://git.nuttyreading.com/chenghuan/edu-core.git#v1.0.12",
"element-plus": "^2.9.6",
"epubjs": "^0.3.93",
"jquery": "^2.2.4",
@@ -23,11 +23,6 @@
" ../edu-core": {
"extraneous": true
},
"../edu-core": {
"version": "1.0.7",
"license": "ISC",
"devDependencies": {}
},
"node_modules/@babel/helper-string-parser": {
"version": "7.27.1",
"resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
@@ -440,8 +435,9 @@
"link": true
},
"node_modules/edu-core": {
"resolved": "../edu-core",
"link": true
"version": "1.0.12",
"resolved": "git+https://git.nuttyreading.com/chenghuan/edu-core.git#ea1dca213de69ac5a01a44a352ab33024edd2577",
"license": "ISC"
},
"node_modules/element-plus": {
"version": "2.11.5",
@@ -4177,7 +4173,7 @@
"requires": {
"animate.css": "^4.1.1",
"e-peanut": "file:",
"edu-core": "file:../edu-core",
"edu-core": "git+https://git.nuttyreading.com/chenghuan/edu-core.git#v1.0.12",
"element-plus": "^2.9.6",
"epubjs": "^0.3.93",
"jquery": "^2.2.4",
@@ -4498,7 +4494,8 @@
}
},
"edu-core": {
"version": "file:../edu-core"
"version": "git+https://git.nuttyreading.com/chenghuan/edu-core.git#ea1dca213de69ac5a01a44a352ab33024edd2577",
"from": "edu-core@git+https://git.nuttyreading.com/chenghuan/edu-core.git#v1.0.12"
},
"element-plus": {
"version": "2.11.5",
@@ -7259,7 +7256,8 @@
}
},
"edu-core": {
"version": "file:../edu-core"
"version": "git+https://git.nuttyreading.com/chenghuan/edu-core.git#ea1dca213de69ac5a01a44a352ab33024edd2577",
"from": "edu-core@git+https://git.nuttyreading.com/chenghuan/edu-core.git#v1.0.12"
},
"element-plus": {
"version": "2.11.5",

View File

@@ -7,7 +7,7 @@
"dependencies": {
"animate.css": "^4.1.1",
"e-peanut": "file:",
"edu-core": "file:../edu-core",
"edu-core": "git+https://git.nuttyreading.com/chenghuan/edu-core.git#v1.0.12",
"element-plus": "^2.9.6",
"epubjs": "^0.3.93",
"jquery": "^2.2.4",

View File

@@ -519,6 +519,17 @@
</view>
</view>
</u-popup>
<u-modal
:show="presaleRemarkModalShow"
title="提示"
:content="presaleRemarkModalContent"
:showCancelButton="true"
confirmText="继续购买"
cancelText="取消"
@confirm="handlePresaleRemarkConfirm"
@cancel="handlePresaleRemarkCancel"
@close="handlePresaleRemarkCancel"
></u-modal>
</view>
</template>
@@ -616,6 +627,9 @@
orderModalShowInfo: {},
orderModalShow: false,
presaleRemarkModalShow: false,
presaleRemarkModalContent: "",
presaleRemarkModalResolve: null,
payType: 1,
freightNum: 0,
addressData: {
@@ -1350,6 +1364,62 @@
this.content = this.remark;
}
},
openPresaleRemarkModal(content) {
this.presaleRemarkModalContent = content;
this.presaleRemarkModalShow = true;
return new Promise((resolve) => {
this.presaleRemarkModalResolve = resolve;
});
},
handlePresaleRemarkConfirm() {
this.presaleRemarkModalShow = false;
if (this.presaleRemarkModalResolve) {
const resolve = this.presaleRemarkModalResolve;
this.presaleRemarkModalResolve = null;
resolve(true);
}
},
handlePresaleRemarkCancel() {
this.presaleRemarkModalShow = false;
if (this.presaleRemarkModalResolve) {
const resolve = this.presaleRemarkModalResolve;
this.presaleRemarkModalResolve = null;
resolve(false);
}
},
async checkPresaleRemark() {
if (this.pageType != "goods") {
return true;
}
const productIds = this.goodsDataList
.map((e) => e.productId)
.filter((id) => id)
.join(",");
if (!productIds || !this.urlList.presaleRemark) {
return true;
}
try {
const res = await this.$http.request({
url: `${this.urlList.presaleRemark}`,
method: "POST",
data: {
productIds,
},
header: {
"Content-Type": "application/json",
},
});
const remark =
res && typeof res.remark == "string" ? res.remark.trim() : "";
if (!remark) {
return true;
}
return await this.openPresaleRemarkModal(remark);
} catch (error) {
console.log("presaleRemark error:", error);
return true;
}
},
async goBuyJie() {
if (this.pageType == "vip") {
if (this.radioValue != "1") {
@@ -1457,6 +1527,11 @@
});
thisproduct = thisproduct.join(",");
}
const passPresaleRemark = await this.checkPresaleRemark();
if (!passPresaleRemark) {
this.buyingFlag = false;
return;
}
if (
this.historyOrderInfo &&
thisproduct == this.historyOrderInfo.product &&
@@ -2437,4 +2512,4 @@
font-size: 24rpx;
}
</style>

View File

@@ -17,7 +17,7 @@
<CommonCourseVideo
:video-list="videoArray"
:current-index="currentCateIndex !== null ? currentCateIndex : 0"
:course="{courseTitle:options.navTitle, chapterTitle: curriculumData.title}"
:course="{courseTitle:options.navTitle, chapterTitle: curriculumData.title, catalogueId: curriculumData.catalogueId || '', courseId: curriculumData.courseId || options.courseId || ''}"
:cover="options.curriculumImgUrl || ''"
:http="$http"
/>
@@ -120,7 +120,7 @@
<view class="page-body">
<view class='wrapper'>
<view class="editor-wrapper">
<editor @input="editorIput" id="editor" class="ql-container" placeholder="请输入您的见解..."
<editor @input="editorIput" id="editor" class="ql-container" placeholder="请您一次性提交答题内容,提交后会进入评分流程"
show-img-size show-img-toolbar show-img-resize
@statuschange="onStatusChange" :read-only="readOnly"
@ready="onEditorReady">
@@ -934,9 +934,9 @@
}
.u-grid-list {
// height: 40rpx;
}
// .u-grid-list {
// // height: 40rpx;
// }
.searchList {
.item {
@@ -1133,7 +1133,8 @@
button {
font-size: 32rpx;
@include theme('btn_bg') color: #fff;
@include theme('btn_bg');
color: #fff;
height: 80rpx;
line-height: 80rpx;
border-radius: 50rpx;
@@ -1236,11 +1237,11 @@
// align-items: center;
}
.headImage {
// height: 400rpx !important;
}
// .headImage {
// // height: 400rpx !important;
// }
.commonDetailPage {}
// .commonDetailPage {}
.curriulum_box {
margin-top: 20rpx;
@@ -1263,9 +1264,9 @@
}
}
/deep/.titleItem {
// width: calc(100% - 120rpx) !important;
}
// /deep/.titleItem {
// // width: calc(100% - 120rpx) !important;
// }
/deep/.scroll-view-item:nth-child(2n-1) {
background-color: transparent !important;
@@ -1396,7 +1397,7 @@
width: calc(100% - 150rpx) !important;
.aui-text-danger {
display: inline-block;
// display: inline-block;
float: right;
}
}

View File

@@ -1308,7 +1308,7 @@
});
const joinedText = this.textList.join('/');
this.goBuyTitle = '购买'+joinedText+'VIP即可畅享更多专属权益';
this.goBuyTitle = '购买'+joinedText+'VIP即可畅享更多专属权益(不包含论坛)';
}
})
},

View File

@@ -132,6 +132,7 @@ export default {
list: "app/phone.do?getCourseDetail_new",
initPrepareOrder: "common/buyOrder/initPrepareOrder",
buyOrder: "book/buyOrder/placeOrder",
presaleRemark: "book/buyOrder/presaleRemark",
curriculumInfo: "app/phone.do?getCourseInfo",
detailInfo: "app/phoneDoctor.do?getTaiHuClassInfo_new",
userInfo: "common/user/getUserInfo",

File diff suppressed because it is too large Load Diff

View File

@@ -29,7 +29,12 @@
</view>
<view class="userInfoBox" style="margin-left: 20rpx;">
<template>
<view class="name">{{ userMes.nickname ? userMes.nickname : "未设置" }}</view>
<view class="name">
{{ userMes.nickname ? userMes.nickname : "未设置" }}
<text v-if="userMes.profile" class="user-profile">({{userMes.profile}})</text>
</view>
<!-- <u-tag v-if="userMes.profile" :text="userMes.profile" size="mini" plain plainFill type="success"></u-tag> -->
</template>
<template v-if="userMes.tel">
<view class="phone">手机号({{ userMes.tel }})</view>
@@ -41,6 +46,12 @@
</view>
</view>
</template>
<template>
<view>
<u-tag v-if="userMes.todayWatch" :text="userMes.todayWatch" size="mini" plain plainFill type="success" class="watch-time"></u-tag>
<u-tag v-if="userMes.totalWatch" :text="userMes.totalWatch" size="mini" plain plainFill class="watch-time"></u-tag>
</view>
</template>
</view>
</view>
@@ -128,13 +139,14 @@
<view class="xiugai boxShadow box_fillet">
<common-list :dataList="pageList" @hancleClick="handleClickTab" label="name">
<template slot="rightSlot" slot-scope="slotProps">
              <text
                class="fdButtonBox aui-text-success"
                v-if="slotProps.row.contentType&&slotProps.row.contentType == 'hufen'&&hufenNumber>0"
                style="line-height: 40rpx; font-size: 40rpx;color: #258feb;float: right;"
                >{{ hufenNumber }}<text style="font-size: 30rpx;margin-left: 4rpx;">湖分</text></text
              >
            </template>
<text
v-if="slotProps.row.contentType&&slotProps.row.contentType == 'hufen'&&hufenNumber>0"
class="fdButtonBox aui-text-success"
style="line-height: 40rpx; font-size: 40rpx;color: #258feb;float: right;"
>
{{ hufenNumber }}<text style="font-size: 30rpx;margin-left: 4rpx;">湖分</text>
</text>
</template>
</common-list>
</view>
</view>
@@ -483,6 +495,9 @@
if (this.userInfo.id != undefined) {
this.$http.post("common/user/getUserInfo").then((res) => {
this.userMes = res.result;
this.userMes.profile = res.des || '';
this.userMes.todayWatch = res.todayWatch || '';
this.userMes.totalWatch = res.totalWatch || '';
});
}
},
@@ -636,15 +651,23 @@
view {
.name {
width: 100%;
width: 90%;
font-weight: bold;
font-size: 32rpx;
color: #6990c7 !important;
line-height: 1.2;
}
.user-profile{
font-size: 28rpx;
font-weight: normal;
display: inline-block;
}
.phone {
font-size: 26rpx;
color: #6990c7 !important;
margin: 6rpx 0;
}
.per_user_img {
@@ -654,6 +677,12 @@
margin-left: 10rpx;
vertical-align: super;
}
.watch-time {
margin-top: 6rpx;
display: inline-block;
margin-right: 10rpx;
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -46,9 +46,9 @@
<view class="in">
<view class="uni-textarea">
<textarea v-show="false" placeholder-style="font-size:26rpx" v-model="form.content"
auto-height placeholder="请输入内容" />
auto-height placeholder="请您一次性提交答题内容,提交后会进入评分流程" />
<view class="editor-wrapper">
<editor @input="editorIput" id="editor" class="ql-container" placeholder="请输入内容..." show-img-size
<editor @input="editorIput" id="editor" class="ql-container" placeholder="请您一次性提交答题内容,提交后会进入评分流程" show-img-size
show-img-toolbar show-img-resize @statuschange="onStatusChange"
:read-only="readOnly" @ready="onEditorReady">
</editor>
@@ -537,4 +537,4 @@
}
}
}
</style>
</style>

View File

@@ -111,7 +111,7 @@
<view class="in">
<view class="uni-textarea">
<textarea placeholder-style="font-size:26rpx" v-model="form.content" maxlength="-1"
auto-height placeholder="请输入内容" />
auto-height placeholder="请您一次性提交答题内容,提交后会进入评分流程" />
</view>
</view>
@@ -750,4 +750,4 @@
background-image: linear-gradient(30deg, #d4eaf0 0%, #d4eaf0 50%, #fdf0ed 100%);
min-height: 100vh;
}
</style>
</style>

View File

@@ -642,11 +642,16 @@ export default {
//存储的需要固定分类
this.fixed = uni.getStorageSync("fixed");
//固定分类
if (this.fixed) {
this.curseClick(this.currentItem, this.currentIndex);
} else {
if (this.currentIndex === null || this.currentIndex === undefined) {
this.currentIndex = 0;
this.currentItem = null;
}
if (
this.fixed &&
this.currentItem &&
this.currentIndex !== null &&
this.currentIndex !== undefined
) {
this.curseClick(this.currentItem, this.currentIndex);
}
uni.hideTabBar();
// #ifdef APP-PLUS