9 Commits

Author SHA1 Message Date
6274ac6cd6 feat(订单): 添加退款功能及相关页面
- 新增退款申请功能,用户可申请订单内所有商品退款
- 更新订单状态显示,增加“已退款”和“退款中”状态
- 新增退款去向页面,展示退款信息
- 更新依赖版本至v1.0.13
- 提升用户体验,优化多个页面的文本提示和样式
- 更新应用版本至2.0.49
2026-05-09 11:12:34 +08:00
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
26 changed files with 1411 additions and 2146 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,8 +2,10 @@ let baseUrl = "";
let socketUrl = ""; let socketUrl = "";
if (process.env.NODE_ENV === 'development') { if (process.env.NODE_ENV === 'development') {
// 开发环境 // 开发环境
// baseUrl = "https://testapi.nuttyreading.com/"; // 线上测试
baseUrl = "https://api.nuttyreading.com/"; //线上正式' baseUrl = "https://api.nuttyreading.com/"; //线上正式'
// baseUrl = "http://192.168.110.100:9200/pb/"; //张川川 // baseUrl = "http://192.168.110.100:9200/pb/"; //张川川
// baseUrl = "http://192.168.110.131:9200/pb/"; // 王亚男
} else if (process.env.NODE_ENV === 'production') { } else if (process.env.NODE_ENV === 'production') {
// 生产环境11 // 生产环境11
baseUrl = "https://api.nuttyreading.com/"; //线上正式 baseUrl = "https://api.nuttyreading.com/"; //线上正式

View File

@@ -92,6 +92,9 @@ Vue.component('common-order-submit', commonOrderSubmit);
import CommonCourseVideo from 'edu-core/components/course-video' import CommonCourseVideo from 'edu-core/components/course-video'
Vue.component('CommonCourseVideo', CommonCourseVideo); Vue.component('CommonCourseVideo', CommonCourseVideo);
import CommonRefundDestination from 'edu-core/components/order/refund-destination.vue'
Vue.component('common-refund-destination', CommonRefundDestination);
import commonCoupon from '@/pages/component/commonComponents/coupon/index.vue' import commonCoupon from '@/pages/component/commonComponents/coupon/index.vue'
Vue.component('common-coupon', commonCoupon); Vue.component('common-coupon', commonCoupon);
import commonGoodsList from '@/pages/component/commonComponents/goodsList.vue' import commonGoodsList from '@/pages/component/commonComponents/goodsList.vue'

View File

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

20
package-lock.json generated
View File

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

View File

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

View File

@@ -170,6 +170,18 @@
} }
} }
}, },
{
"path": "pages/bookShop/refundDestination",
"style": {
"navigationBarTitleText": "钱款去向",
"enablePullDownRefresh": false,
"app-plus": {
"bounce": "none",
"titleNView": false,
"popGesture": "none"
}
}
},
{ {
"path": "pages/hufen/hufen", "path": "pages/hufen/hufen",
"style": { "style": {

View File

@@ -90,6 +90,16 @@
v-if="orderContet.orderStatus == 5" v-if="orderContet.orderStatus == 5"
>已超时</text >已超时</text
> >
<text
class="orderState orderState6"
v-if="orderContet.orderStatus == 6"
>已退款</text
>
<text
class="orderState orderState7"
v-if="orderContet.orderStatus == 7"
>退款中</text
>
</view> </view>
<view <view
class="orderContent" class="orderContent"
@@ -775,6 +785,8 @@ export default {
this.OverOrder(); this.OverOrder();
} else if (data.text == "查看物流") { } else if (data.text == "查看物流") {
this.seeExpressDetail(this.orderContet); this.seeExpressDetail(this.orderContet);
} else if (data.text == "申请退款") {
this.confirmApplyRefund();
} }
}, },
async clickIcon(data) { async clickIcon(data) {
@@ -783,6 +795,53 @@ export default {
this.kefu(); this.kefu();
} }
}, },
confirmApplyRefund() {
uni.showModal({
title: "提示",
content: "确认申请订单内所有商品退款吗?",
confirmText: "确认",
cancelText: "取消",
success: (res) => {
if (res.confirm) {
this.submitOrderRefund();
}
},
});
},
submitOrderRefund() {
if (!this.orderContet || !this.orderContet.orderId) return;
this.$http
.request({
url: "book/buyOrder/refundOrder",
method: "POST",
data: {
order_id: this.orderContet.orderId,
},
header: {
"Content-Type": "application/json",
},
})
.then((res) => {
if (res.code == 0) {
uni.showToast({
icon: "none",
title: "退款成功",
});
this.getOrderList();
return;
}
uni.showToast({
icon: "none",
title: (res && (res.msg || res.errMsg)) || "退款失败",
});
})
.catch((e) => {
uni.showToast({
icon: "none",
title: (e && (e.msg || e.errMsg)) || "退款失败",
});
});
},
// 复制到剪切板 // 复制到剪切板
copyData(data) { copyData(data) {
uni.setClipboardData({ uni.setClipboardData({
@@ -1188,10 +1247,19 @@ export default {
text: "继续付款", text: "继续付款",
}); });
} }
if (this.orderContet.orderStatus == 0) { // medicine注释取消订单按钮
// if (this.orderContet.orderStatus == 0) {
// this.customButton.push({
// width: "160rpx",
// text: "取消订单",
// color: "#333",
// backgroundColor: "#f0f0f0",
// });
// }
if (this.orderContet.refundableStatus === true) {
this.customButton.push({ this.customButton.push({
width: "160rpx", width: "160rpx",
text: "取消订单", text: "申请退款",
color: "#333", color: "#333",
backgroundColor: "#f0f0f0", backgroundColor: "#f0f0f0",
}); });
@@ -1214,6 +1282,10 @@ export default {
this.titleStat = "待收到"; this.titleStat = "待收到";
} else if (this.orderContet.orderStatus == 3) { } else if (this.orderContet.orderStatus == 3) {
this.titleStat = "已完成"; this.titleStat = "已完成";
} else if (this.orderContet.orderStatus == 6) {
this.titleStat = "已退款";
} else if (this.orderContet.orderStatus == 7) {
this.titleStat = "退款中";
} }
if ( if (
this.orderContet.orderStatus >= 2 && this.orderContet.orderStatus >= 2 &&
@@ -1256,10 +1328,28 @@ export default {
}, },
}); });
}, },
checkPayTimeout(payItem) {
const createTime = payItem && payItem.createTime;
if (!createTime) return true;
const createdAt = new Date(String(createTime).replace(/-/g, "/")).getTime();
if (!createdAt) return true;
const expired = Date.now() - createdAt > 10 * 60 * 1000;
if (expired) {
uni.showModal({
title: "提示",
content: "订单已超时,不能继续支付,请重新下单",
confirmText: "知道了",
showCancel: false,
});
return false;
}
return true;
},
// 支付 // 支付
goPay(payItem) { goPay(payItem) {
console.log(payItem, "订单数据"); console.log(payItem, "订单数据");
if (!this.checkPayTimeout(payItem)) return;
if (payItem.paymentMethod == 2) { if (payItem.paymentMethod == 2) {
console.log("阿里支付"); console.log("阿里支付");
setPay( setPay(
@@ -1403,6 +1493,12 @@ export default {
.orderState5 { .orderState5 {
background-color: #787878; background-color: #787878;
} }
.orderState6 {
background-color: #f56c6c;
}
.orderState7 {
background-color: #f56c6c;
}
.guoqi { .guoqi {
font-size: 28rpx; font-size: 28rpx;
align-items: center; align-items: center;

View File

@@ -12,7 +12,7 @@
</z-nav-bar> </z-nav-bar>
<view class="cateList flexbox"> <view class="cateList flexbox">
<common-sticky <common-sticky
itemStyle="width:20%; height: 68rpx;font-size:24rpx;" itemStyle="width:auto; padding: 0 20rpx; height: 68rpx;font-size:22rpx;"
:list="ordersTabs" :list="ordersTabs"
label="name" label="name"
:currentCateIndex="currentCateIndex" :currentCateIndex="currentCateIndex"
@@ -111,6 +111,16 @@
v-show="slotProps.row.orderStatus == 5" v-show="slotProps.row.orderStatus == 5"
>已过期</text >已过期</text
> >
<text
class="orderstatus"
v-show="slotProps.row.orderStatus == 6"
>已退款</text
>
<text
class="orderstatus"
v-show="slotProps.row.orderStatus == 7"
>退款中</text
>
</view> </view>
</view> </view>
<view v-if="slotProps.row.orderType == 'trainingClass'" class="bookinfolist"> <view v-if="slotProps.row.orderType == 'trainingClass'" class="bookinfolist">
@@ -392,17 +402,12 @@
</view> </view>
<view <view
class="operation_box boxShadow" class="btns flexbox"
v-if="slotProps.row.isShowMore == true" :class="{ 'btns-no-more': !hasMoreActions(slotProps.row) }"
style="margin-top: 10rpx"
> >
<view <view
v-if="slotProps.row.orderStatus == 0" v-if="hasMoreActions(slotProps.row)"
@click.native.stop="canceOrder(slotProps.row)"
>取消订单</view
>
</view>
<view class="btns flexbox" style="margin-top: 10rpx">
<view
class="left" class="left"
style="color: #c0c4cc" style="color: #c0c4cc"
@click.native.stop=" @click.native.stop="
@@ -442,6 +447,21 @@
v-if="slotProps.row.orderStatus == 3" v-if="slotProps.row.orderStatus == 3"
>申请售后</view >申请售后</view
> >
<view
class="orderstatusbtn"
v-if="
slotProps.row.orderStatus == 6 ||
slotProps.row.orderStatus == 7
"
@click.stop="goRefundDestination(slotProps.row)"
>钱款去向</view
>
<view
class="orderstatusbtn"
v-if="slotProps.row.refundableStatus === true"
@click.stop="confirmApplyRefund(slotProps.row)"
>申请退款</view
>
<!-- <view <!-- <view
class="orderstatusbtn" class="orderstatusbtn"
v-if="item.orderStatus == 3 && userRecordid == null" v-if="item.orderStatus == 3 && userRecordid == null"
@@ -615,12 +635,7 @@ export default {
come: "2", come: "2",
isShowTab: false, isShowTab: false,
isLoadingHide: false, isLoadingHide: false,
moreList: [ moreList: [],
{
name: "取消订单",
key: "false",
},
],
currentCateIndex: 0, currentCateIndex: 0,
pagination: { pagination: {
// 请求参数 // 请求参数
@@ -671,6 +686,16 @@ export default {
value: 3, value: 3,
badge: {}, badge: {},
}, },
{
name: "已退款",
value: 6,
badge: {},
},
{
name: "退款中",
value: 7,
badge: {},
},
], ],
selectOrderInfo: {}, selectOrderInfo: {},
ordersListTab: 1, ordersListTab: 1,
@@ -742,15 +767,26 @@ export default {
}, },
selectClick(index) { selectClick(index) {
console.log("index at line 609:", index); console.log("index at line 609:", index);
if (index.key == "false") { if (index.key == "cancelOrder") {
this.isShowMore = false; this.isShowMore = false;
this.canceOrder(this.selectOrderInfo); this.canceOrder(this.selectOrderInfo);
} }
}, },
openMore(row, index) { openMore(row, index) {
const actions = this.getMoreActions(row);
if (!actions.length) return;
this.moreList = actions;
this.selectOrderInfo = row; this.selectOrderInfo = row;
this.isShowMore = true; this.isShowMore = true;
}, },
hasMoreActions(row) {
return this.getMoreActions(row).length > 0;
},
getMoreActions(row) {
const actions = [];
// 取消订单功能已屏蔽,更多操作为空时不展示“更多”按钮
return actions;
},
handleCopy(value, title) { handleCopy(value, title) {
this.$commonJS.handleCopy(value, title); this.$commonJS.handleCopy(value, title);
}, },
@@ -813,6 +849,60 @@ export default {
val.orderSn, val.orderSn,
}); });
}, },
goRefundDestination(row) {
uni.navigateTo({
url: "/pages/bookShop/refundDestination?orderId=" + row.orderId,
});
},
confirmApplyRefund(row) {
uni.showModal({
title: "提示",
content: "确认申请订单内所有商品退款吗?",
confirmText: "确认",
cancelText: "取消",
success: (res) => {
if (res.confirm) {
this.submitOrderRefund(row);
}
},
});
},
submitOrderRefund(orderRow) {
if (!orderRow || !orderRow.orderId) return;
this.$http
.request({
url: "book/buyOrder/refundOrder",
method: "POST",
data: {
orderId: orderRow.orderId,
},
header: {
"Content-Type": "application/json",
},
})
.then((res) => {
if (res.code == 0) {
uni.showToast({
icon: "none",
title: "退款成功",
});
this.pagination.page = 1;
this.newList = [];
this.getBookList(this.ordersListTab, false);
return;
}
uni.showToast({
icon: "none",
title: (res && (res.msg || res.errMsg)) || "退款失败",
});
})
.catch((e) => {
uni.showToast({
icon: "none",
title: (e && (e.msg || e.errMsg)) || "退款失败",
});
});
},
getBookList(flag, refreshflag) { getBookList(flag, refreshflag) {
this.isLoadingHide = false; this.isLoadingHide = false;
var that = this; var that = this;
@@ -843,6 +933,8 @@ export default {
// * 3已完成 // * 3已完成
// * 4: 交易失败 // * 4: 交易失败
// * 5: 已过期 // * 5: 已过期
// * 6: 已退款
// * 7: 退款中
console.log("res at line 757:", res); console.log("res at line 757:", res);
that.map = res.data; that.map = res.data;
@@ -872,7 +964,7 @@ export default {
var params = { var params = {
userId: this.userInfo.id, userId: this.userInfo.id,
come: this.come, come: this.come,
orderStatus: flag == -1 ? "" : flag, //传null为全部订单状态 0-未付款 1-待发出 2-待收到 3-交易成功 4-交易失败 5-过期 orderStatus: flag == -1 ? "" : flag, //传null为全部订单状态 0-未付款 1-待发出 2-待收到 3-交易成功 4-交易失败 5-过期 6-已退款 7-退款中
...this.pagination, ...this.pagination,
// limit: 10, // limit: 10,
// page: this.newestpage, // page: this.newestpage,
@@ -908,9 +1000,27 @@ export default {
console.log(e); console.log(e);
}); });
}, },
checkPayTimeout(payItem) {
const createTime = payItem && payItem.createTime;
if (!createTime) return true;
const createdAt = new Date(String(createTime).replace(/-/g, "/")).getTime();
if (!createdAt) return true;
const expired = Date.now() - createdAt > 10 * 60 * 1000;
if (expired) {
uni.showModal({
title: "提示",
content: "订单已超时,不能继续支付,请重新下单",
confirmText: "知道了",
showCancel: false,
});
return false;
}
return true;
},
// 支付 // 支付
goPay(payItem) { goPay(payItem) {
console.log(payItem, "订单数据"); console.log(payItem, "订单数据");
if (!this.checkPayTimeout(payItem)) return;
if (payItem.paymentMethod == 2) { if (payItem.paymentMethod == 2) {
console.log("阿里支付"); console.log("阿里支付");
setPay( setPay(
@@ -1542,6 +1652,15 @@ export default {
} }
} }
} }
.btns.btns-no-more {
justify-content: flex-end;
.right {
width: auto;
max-width: 100%;
}
}
} }
.mb30 { .mb30 {
@@ -1584,7 +1703,7 @@ export default {
} }
/deep/.u-tabs__wrapper__nav__item { /deep/.u-tabs__wrapper__nav__item {
padding: 0 !important; // padding: 0 !important;
} }
.commonDetailPage { .commonDetailPage {

View File

@@ -0,0 +1,27 @@
<template>
<view class="page-wrap">
<public-module></public-module>
<common-refund-destination :order-id="orderId" :http="$http" />
</view>
</template>
<script>
export default {
data() {
return {
orderId: '',
}
},
onLoad(options) {
if (options && options.orderId != null) {
this.orderId = options.orderId
}
},
}
</script>
<style scoped>
.page-wrap {
min-height: 100vh;
}
</style>

View File

@@ -519,6 +519,17 @@
</view> </view>
</view> </view>
</u-popup> </u-popup>
<u-modal
:show="presaleRemarkModalShow"
title="提示"
:content="presaleRemarkModalContent"
:showCancelButton="true"
confirmText="继续购买"
cancelText="取消"
@confirm="handlePresaleRemarkConfirm"
@cancel="handlePresaleRemarkCancel"
@close="handlePresaleRemarkCancel"
></u-modal>
</view> </view>
</template> </template>
@@ -616,6 +627,9 @@
orderModalShowInfo: {}, orderModalShowInfo: {},
orderModalShow: false, orderModalShow: false,
presaleRemarkModalShow: false,
presaleRemarkModalContent: "",
presaleRemarkModalResolve: null,
payType: 1, payType: 1,
freightNum: 0, freightNum: 0,
addressData: { addressData: {
@@ -1350,6 +1364,62 @@
this.content = this.remark; 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() { async goBuyJie() {
if (this.pageType == "vip") { if (this.pageType == "vip") {
if (this.radioValue != "1") { if (this.radioValue != "1") {
@@ -1457,6 +1527,11 @@
}); });
thisproduct = thisproduct.join(","); thisproduct = thisproduct.join(",");
} }
const passPresaleRemark = await this.checkPresaleRemark();
if (!passPresaleRemark) {
this.buyingFlag = false;
return;
}
if ( if (
this.historyOrderInfo && this.historyOrderInfo &&
thisproduct == this.historyOrderInfo.product && thisproduct == this.historyOrderInfo.product &&

View File

@@ -249,9 +249,9 @@ export default {
gotoDetail(v) { gotoDetail(v) {
this.$emit("hancleClick", v); this.$emit("hancleClick", v);
}, },
onHandleClickBuy() { onHandleClickBuy(e) {
this.$emit("selectGoodsData", this.selectGoodsData); this.$emit("selectGoodsData", this.selectGoodsData);
this.$emit("onHandleClickBuy"); this.$emit("onHandleClickBuy", e);
}, },
}, },
onBackPress() { onBackPress() {
@@ -430,4 +430,8 @@ export default {
font-weight: 700; font-weight: 700;
} }
} }
.title_list {
margin-bottom: 20rpx;
}
</style> </style>

View File

@@ -1,6 +1,6 @@
<template> <template>
<!-- <scroll-view class="scroll-view_H cateList" scroll-x="true" scroll-left="0"> --> <!-- <scroll-view class="scroll-view_H cateList" scroll-x="true" scroll-left="0"> -->
<view class="" style="background-color: #fff; width: 100%"> <view class="" style="background-color: #fff; width: 100%; padding: 0 20rpx;">
<u-tabs <u-tabs
lineWidth="30" lineWidth="30"
lineColor="#258feb" lineColor="#258feb"

View File

@@ -17,7 +17,7 @@
<CommonCourseVideo <CommonCourseVideo
:video-list="videoArray" :video-list="videoArray"
:current-index="currentCateIndex !== null ? currentCateIndex : 0" :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 || ''" :cover="options.curriculumImgUrl || ''"
:http="$http" :http="$http"
/> />
@@ -120,7 +120,7 @@
<view class="page-body"> <view class="page-body">
<view class='wrapper'> <view class='wrapper'>
<view class="editor-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 show-img-size show-img-toolbar show-img-resize
@statuschange="onStatusChange" :read-only="readOnly" @statuschange="onStatusChange" :read-only="readOnly"
@ready="onEditorReady"> @ready="onEditorReady">
@@ -934,9 +934,9 @@
} }
.u-grid-list { // .u-grid-list {
// height: 40rpx; // // height: 40rpx;
} // }
.searchList { .searchList {
.item { .item {
@@ -1133,7 +1133,8 @@
button { button {
font-size: 32rpx; font-size: 32rpx;
@include theme('btn_bg') color: #fff; @include theme('btn_bg');
color: #fff;
height: 80rpx; height: 80rpx;
line-height: 80rpx; line-height: 80rpx;
border-radius: 50rpx; border-radius: 50rpx;
@@ -1236,11 +1237,11 @@
// align-items: center; // align-items: center;
} }
.headImage { // .headImage {
// height: 400rpx !important; // // height: 400rpx !important;
} // }
.commonDetailPage {} // .commonDetailPage {}
.curriulum_box { .curriulum_box {
margin-top: 20rpx; margin-top: 20rpx;
@@ -1263,9 +1264,9 @@
} }
} }
/deep/.titleItem { // /deep/.titleItem {
// width: calc(100% - 120rpx) !important; // // width: calc(100% - 120rpx) !important;
} // }
/deep/.scroll-view-item:nth-child(2n-1) { /deep/.scroll-view-item:nth-child(2n-1) {
background-color: transparent !important; background-color: transparent !important;
@@ -1396,7 +1397,7 @@
width: calc(100% - 150rpx) !important; width: calc(100% - 150rpx) !important;
.aui-text-danger { .aui-text-danger {
display: inline-block; // display: inline-block;
float: right; float: right;
} }
} }

View File

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

View File

@@ -790,8 +790,13 @@ export default {
this.$refs.commonSelectGoods.open(); this.$refs.commonSelectGoods.open();
}, },
//点击下单按钮 //点击下单按钮
onHandleClickBuy() { onHandleClickBuy(e) {
if(this.buttonType==0){ //如果是加入购物车 if (e && e.content && e.content.text === "购物车") {
this.onHandleClick();
return;
}
const clickType = typeof (e && e.index) === "number" ? e.index : this.buttonType;
if(clickType==0){ //如果是加入购物车
console.log('剩余', this.selectGoodsData.productStock) console.log('剩余', this.selectGoodsData.productStock)
if(this.selectGoodsData.productStock==0){ if(this.selectGoodsData.productStock==0){
uni.showToast({ uni.showToast({

View File

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

File diff suppressed because it is too large Load Diff

View File

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

@@ -71,17 +71,19 @@
> >
<template slot="labelSlot" slot-scope="slotProps"> <template slot="labelSlot" slot-scope="slotProps">
<view class="label_content AC_List"> <view class="label_content AC_List">
<view class="left"> <view style=" display: flex; align-items: center; justify-content: space-between;">
<view class="title" v-if="slotProps.row.productName">{{ slotProps.row.productName }}</view> <view class="left">
<view class="title" v-else>{{ slotProps.row.orderType }}</view> <view class="title">{{ slotProps.row.productName || slotProps.row.orderType}}</view>
</view> </view>
<view <view
:class="`right ${ :class="`right ${
slotProps.row.changeAmount > 0 ? 'Hot' : '' slotProps.row.changeAmount > 0 ? 'Hot' : ''
}`" }`"
> >
<text v-if="slotProps.row.changeAmount > 0">+</text> <text v-if="slotProps.row.changeAmount > 0">+</text>
<text>{{ slotProps.row.changeAmount }}</text> </view> <text>{{ slotProps.row.changeAmount }}</text>
</view>
</view>
<view class="AC_mark" v-if="slotProps.row.remark">{{slotProps.row.remark}}</view> <view class="AC_mark" v-if="slotProps.row.remark">{{slotProps.row.remark}}</view>
<view class="AC_note" v-if="slotProps.row.note&&slotProps.row.note!='null'">说明{{slotProps.row.note}}</view> <view class="AC_note" v-if="slotProps.row.note&&slotProps.row.note!='null'">说明{{slotProps.row.note}}</view>
<view class="AC_time">{{ slotProps.row.createTime }}</view> <view class="AC_time">{{ slotProps.row.createTime }}</view>
@@ -339,6 +341,12 @@ export default {
.AC_List { .AC_List {
overflow: hidden; overflow: hidden;
.title,
.AC_note,
.AC_mark {
word-break: break-word;
overflow-wrap: break-word;
}
.left { .left {
width: calc(100% - 120rpx) !important; width: calc(100% - 120rpx) !important;
font-weight: 700; font-weight: 700;
@@ -356,6 +364,19 @@ export default {
font-weight: 700; font-weight: 700;
color: #333; color: #333;
} }
> view:first-child {
.left {
flex: 1;
min-width: 0;
width: auto !important;
float: none;
}
.right {
flex-shrink: 0;
float: none;
width: auto !important;
}
}
.AC_title { .AC_title {
font-size: 32rpx; font-size: 32rpx;

View File

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

View File

@@ -111,7 +111,7 @@
<view class="in"> <view class="in">
<view class="uni-textarea"> <view class="uni-textarea">
<textarea placeholder-style="font-size:26rpx" v-model="form.content" maxlength="-1" <textarea placeholder-style="font-size:26rpx" v-model="form.content" maxlength="-1"
auto-height placeholder="请输入内容" /> auto-height placeholder="请您一次性提交答题内容,提交后会进入评分流程" />
</view> </view>
</view> </view>

View File

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

View File

@@ -389,4 +389,6 @@ button::after {
} }
} }
uni-text {
white-space: normal;
}

Binary file not shown.