Compare commits

...

3 Commits

Author SHA1 Message Date
e2a546218a feat: 新增预售书重复购买提示
- 更新应用版本号至1.0.52
- 在订单提交页面新增预售备注确认弹窗,用户可在购买前查看并确认备注内容
- 添加相关方法以处理预售备注的显示和确认逻辑
- 更新请求配置,增加预售备注接口
2026-03-25 11:40:20 +08:00
d635ab5081 feat: 修改学术传承分类和我的vip自动换行
调整VIP购买提示明确不包含论坛权益
优化用户信息页面布局样式
切换开发环境API至本地测试地址
2026-03-24 18:48:03 +08:00
1efcf2d675 feat: 添加记录观看时长;个人资料增加身份项;
- 将应用版本号更新至1.0.50
- 修改edu-core依赖为git引用,版本更新至1.0.9
- 优化用户资料页面,增加用户信息展示和编辑功能
- 更新请求配置,改善加载动画逻辑
- 添加新权限请求以支持外部存储访问
2026-03-24 14:25:45 +08:00
14 changed files with 226 additions and 2819 deletions

View File

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

View File

@@ -82,11 +82,12 @@ $http.getAliToken = function (callback) {
//请求开始拦截器
$http.requestStart = function (options) {
// console.log("请求开始", options);
if (options.load && options.data.loadAnimate != 'none') {
const resData = options.data || {}
if (options.load && resData.loadAnimate != 'none') {
//打开加载动画
store.commit("setLoadingShow", true);
}
if (options.data.loadAnimate == 'none') {
if (resData.loadAnimate == 'none') {
delete options.data.loadAnimate
}
// 图片、视频上传大小限制

View File

@@ -2,9 +2,9 @@
"name" : "心灵空间",
"appid" : "__UNI__BBBDFD2",
"description" : "心灵空间",
"versionName" : "1.0.49",
"versionName" : "1.0.52",
"sassImplementationName" : "node-sass",
"versionCode" : 1049,
"versionCode" : 1052,
"transformPx" : false,
/* 5+App */
"app-plus" : {
@@ -61,12 +61,16 @@
"<uses-permission android:name=\"android.permission.CAMERA\"/>",
"<uses-permission android:name=\"android.permission.INTERNET\"/>",
"<uses-permission android:name=\"android.permission.REQUEST_INSTALL_PACKAGES\"/>",
"<uses-permission android:name=\"android.permission.WAKE_LOCK\" />"
"<uses-permission android:name=\"android.permission.WAKE_LOCK\" />",
"<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>",
"<uses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\"/>",
"<uses-permission android:name=\"android.permission.READ_MEDIA_IMAGES\"/>"
],
"minSdkVersion" : 23,
"targetSdkVersion" : 35,
"abiFilters" : [ "armeabi-v7a", "arm64-v8a", "x86" ],
"schemes" : "soulspace"
"schemes" : "soulspace",
"excludePermissions" : []
},
/* ios */
"ios" : {

10
package-lock.json generated
View File

@@ -9,7 +9,7 @@
"version": "1.0.0",
"license": "MIT",
"dependencies": {
"edu-core": "file:../edu-core",
"edu-core": "git+https://git.nuttyreading.com/chenghuan/edu-core.git#v1.0.9",
"jquery": "^3.7.1",
"tcplayer.js": "^5.1.0"
},
@@ -18,7 +18,8 @@
}
},
"../edu-core": {
"version": "1.0.6",
"version": "1.0.8",
"extraneous": true,
"license": "ISC",
"devDependencies": {}
},
@@ -73,8 +74,9 @@
"integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w=="
},
"node_modules/edu-core": {
"resolved": "../edu-core",
"link": true
"version": "1.0.8",
"resolved": "git+https://git.nuttyreading.com/chenghuan/edu-core.git#f815e7660e0645ca4393205b30986c4bc7aa4d9f",
"license": "ISC"
},
"node_modules/es5-shim": {
"version": "4.6.7",

View File

@@ -14,7 +14,7 @@
},
"homepage": "https://github.com/dcloudio/hello-uniapp#readme",
"dependencies": {
"edu-core": "file:../edu-core",
"edu-core": "git+https://git.nuttyreading.com/chenghuan/edu-core.git#v1.0.9",
"jquery": "^3.7.1",
"tcplayer.js": "^5.1.0"
},

View File

@@ -510,6 +510,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>
@@ -607,6 +618,9 @@
orderModalShowInfo: {},
orderModalShow: false,
presaleRemarkModalShow: false,
presaleRemarkModalContent: "",
presaleRemarkModalResolve: null,
payType: 1,
freightNum: 0,
addressData: {
@@ -1339,6 +1353,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") {
@@ -1446,6 +1516,11 @@
});
thisproduct = thisproduct.join(",");
}
const passPresaleRemark = await this.checkPresaleRemark();
if (!passPresaleRemark) {
this.buyingFlag = false;
return;
}
if (
this.historyOrderInfo &&
thisproduct == this.historyOrderInfo.product &&
@@ -2405,4 +2480,4 @@
color: $themeColor;
}
</style>

View File

@@ -12,7 +12,7 @@
<CommonCourseVideo
:video-list="videoArray"
:current-index="currentVideoIndex !== null ? currentVideoIndex : 0"
:course="{courseTitle:options.navTitle, chapterTitle: curriculumData.title}"
:course="{courseTitle:options.navTitle, chapterTitle: curriculumData.title, catalogueId: curriculumData.catalogueId || '', courseId: curriculumData.courseId || ''}"
:cover="options.curriculumImgUrl"
:http="$http"
/>

File diff suppressed because it is too large Load Diff

View File

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

View File

@@ -107,6 +107,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",

View File

@@ -22,13 +22,20 @@
</view>
</view>
<view class="userInfoBox">
<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>
<view class="phone" v-if="userMes.tel">手机号({{ userMes.tel }})</view>
<view class="vip_type" v-if="textList.length>0">
<view class="vip_type_item" v-for="(item,index) in textList" :key="index">
{{item}}<image src="@/static/icon/chao_vip.png"></image>
</view>
</view>
<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>
</view>
<br clear="both" />
</view>
@@ -318,6 +325,9 @@ export default {
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 || '';
});
}
},
@@ -427,23 +437,31 @@ export default {
}
.userInfoBox{
padding-left: 20rpx;
flex: 1;
}
view {
.name {
font-weight: bold;
width: 100%;
font-size: 30rpx;
line-height: 40rpx;
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;
line-height: 40rpx;
color: #6990c7;
color: #6990c7 !important;
margin: 6rpx 0;
}
.per_user_img {
display: inline-block;
width: 40upx;
@@ -451,6 +469,12 @@ export default {
margin-left: 10rpx;
vertical-align: super;
}
.watch-time {
margin-top: 10rpx;
display: inline-block;
margin-right: 10rpx;
}
}
}
@@ -732,7 +756,7 @@ export default {
}
.modal_vip{
margin-top: 50rpx;
margin-top: 25rpx;
padding: 20rpx 20rpx 0;
height: auto;
display: flex;
@@ -1022,6 +1046,7 @@ export default {
margin-top: 10rpx;
display: flex;
align-items: center;
flex-wrap: wrap;
}
.vip_type_item{
display: flex;
@@ -1035,7 +1060,8 @@ export default {
height: 40rpx;
font-weight: bold;
color: #fff;
margin-right: 10rpx;
margin-right: 8rpx;
margin-bottom: 4rpx;
}
.vip_type_item:last-child{
margin-right: 0;
@@ -1044,9 +1070,9 @@ export default {
width: 34rpx;
height: 24rpx;
}
.vip_infor{
// .vip_infor{
}
// }
.vip_infor_item{
display: block;
color: #fff;
@@ -1058,9 +1084,9 @@ export default {
.vip_infor_item text{
color: #fff;
}
.vip_btn{
// .vip_btn{
}
// }
.vip_btn button{
background: none;
border: 2rpx solid #294a97;

File diff suppressed because it is too large Load Diff

View File

@@ -828,8 +828,6 @@ export default {
color: $themeColor;
}
.emaPho {}
.emaPho>view {
display: inline-block;
padding: 10rpx 0;
@@ -904,7 +902,8 @@ export default {
border-radius: 50rpx;
&.active {
@include theme("btn_bg") color: #fff;
@include theme("btn_bg");
color: #fff;
}
}
}

3
style/mixin.scss Normal file
View File

@@ -0,0 +1,3 @@
@charset "utf-8";
//主题色
$themeColor: #7dc1f0;