小程序 - 页面固定文案全部改读后台配置(购买、登录、资料、首页、分享、介绍页),代码里不再硬编码 - 已拥有课程时在当前页提示,不再跳购买页再提示 - 介绍页正文由代码常量改为读 settings.page.formula.content 服务端 - 课程相关报错文案(不存在 / 已下架 / 课时不存在 / 未购买 / 已过期 / 重复购买 / 未配置支付商品)改读配置,代码保留默认值兜底 - 新增支付总开关 pay.blocked:打开即拦截下单并下发配置里的提示;开关存在数据库里,开发库与生产库各一份(开发库已开,生产库未设) 后台 - 系统配置页按页面分组折叠,默认收起;认不出来的配置归入「其他」 配套数据(不在代码里):对应的 settings 行已写入生产库与开发库
76 lines
2.1 KiB
JavaScript
76 lines
2.1 KiB
JavaScript
// pages/kecheng/kecheng.js
|
|
const api = require('../../utils/api');
|
|
const store = require('../../utils/store');
|
|
const config = require('../../config/index');
|
|
|
|
const app = getApp();
|
|
|
|
Page({
|
|
data: {
|
|
staticBase: config.STATIC_BASE_URL,
|
|
hasCourse: false,
|
|
ownedCourses: [],
|
|
tipsHtml: '',
|
|
/** 账号被封禁:不显示已购权益,改为显示提示。文字全部来自后台配置 */
|
|
blocked: false,
|
|
blockedTitle: '',
|
|
blockedDesc: '',
|
|
},
|
|
|
|
onLoad() {
|
|
// 旧版本用 10ms 轮询最多 5 秒等登录数据,这里改为等初始化完成
|
|
app.ready().then(() => this.refresh());
|
|
},
|
|
|
|
onShow() {
|
|
if (store.isLoggedIn()) this.refresh();
|
|
// 未登录(含刚退出登录)不能留着一份别人的课程列表
|
|
else this.setData({ ownedCourses: [], hasCourse: false });
|
|
},
|
|
|
|
refresh() {
|
|
this.loadTips();
|
|
|
|
api
|
|
.getEntitlements()
|
|
.then((list) => {
|
|
store.setEntitlements(list);
|
|
this.setData({ ownedCourses: list || [], hasCourse: (list || []).length > 0, blocked: false });
|
|
})
|
|
.catch((err) => {
|
|
if (err && err.code === api.ACCOUNT_DISABLED) {
|
|
// 服务端不返回权益了,本地缓存也一并清掉,免得露出上一次的课程
|
|
store.setEntitlements([]);
|
|
this.setData({
|
|
ownedCourses: [],
|
|
hasCourse: false,
|
|
blocked: true,
|
|
blockedTitle: store.cfg('account.blocked_title'),
|
|
blockedDesc: store.cfg('account.blocked_desc'),
|
|
});
|
|
return;
|
|
}
|
|
console.warn('[kecheng] 已购课程加载失败', err);
|
|
});
|
|
},
|
|
|
|
loadTips() {
|
|
if (this.data.tipsHtml) return;
|
|
api
|
|
.getTips()
|
|
.then((tip) => this.setData({ tipsHtml: (tip && tip.content) || ' ' }))
|
|
.catch((err) => console.warn('[kecheng] 文案加载失败', err));
|
|
},
|
|
|
|
toMyCourse(e) {
|
|
wx.navigateTo({
|
|
url: '/pages/VideoDetails/VideoDetails?code=' + e.currentTarget.dataset.code,
|
|
});
|
|
},
|
|
|
|
onShareAppMessage() {
|
|
return { title: store.cfg('share.title'), path: '/pages/index/index' };
|
|
},
|
|
});
|
|
|