小程序 - 页面固定文案全部改读后台配置(购买、登录、资料、首页、分享、介绍页),代码里不再硬编码 - 已拥有课程时在当前页提示,不再跳购买页再提示 - 介绍页正文由代码常量改为读 settings.page.formula.content 服务端 - 课程相关报错文案(不存在 / 已下架 / 课时不存在 / 未购买 / 已过期 / 重复购买 / 未配置支付商品)改读配置,代码保留默认值兜底 - 新增支付总开关 pay.blocked:打开即拦截下单并下发配置里的提示;开关存在数据库里,开发库与生产库各一份(开发库已开,生产库未设) 后台 - 系统配置页按页面分组折叠,默认收起;认不出来的配置归入「其他」 配套数据(不在代码里):对应的 settings 行已写入生产库与开发库
106 lines
3.3 KiB
JavaScript
106 lines
3.3 KiB
JavaScript
// pages/LoginOrOutDetails/LoginOrOutDetails.js
|
|
const api = require('../../utils/api');
|
|
const store = require('../../utils/store');
|
|
const config = require('../../config/index');
|
|
|
|
const app = getApp();
|
|
|
|
/** 未填昵称时自动生成,与旧版行为一致:用户 + 8 位小写字母数字 */
|
|
function randomNickname() {
|
|
const chars = 'abcdefghijklmnopqrstuvwxyz0123456789';
|
|
let s = '';
|
|
for (let i = 0; i < 8; i++) s += chars[Math.floor(Math.random() * chars.length)];
|
|
return '用户' + s;
|
|
}
|
|
|
|
Page({
|
|
data: {
|
|
userInfo: { avatarUrl: '', nickName: '' },
|
|
loginStatue: false,
|
|
LoginTag: '',
|
|
// 页面固定文案,全部来自后台配置
|
|
pageTitle: '',
|
|
pageSubtitle: '',
|
|
logoutText: '',
|
|
},
|
|
|
|
onLoad() {
|
|
app.ready().then(() => this.refresh());
|
|
},
|
|
|
|
onShow() {
|
|
this.refresh();
|
|
},
|
|
|
|
refresh() {
|
|
const user = store.getUser();
|
|
// 「已登录」看的是用户主动登录过没有(服务端记着这一位),不是有没有 token
|
|
const registered = !!(user && user.isLogin === 1);
|
|
this.setData({
|
|
loginStatue: registered,
|
|
LoginTag: registered ? store.cfg('login.button.logout') : store.cfg('login.button.login'),
|
|
logoutText: store.cfg('login.button.logout'),
|
|
pageTitle: store.cfg('login.title'),
|
|
pageSubtitle: store.cfg('login.subtitle'),
|
|
userInfo: {
|
|
avatarUrl: config.STATIC_BASE_URL + config.PLACEHOLDER.WECHAT,
|
|
nickName: registered ? user.nickname : '',
|
|
},
|
|
});
|
|
},
|
|
|
|
/**
|
|
* 登录 / 注册。
|
|
*
|
|
* 关键:不能凭本地缓存决定昵称。
|
|
* 退出登录会清空本地缓存,此时若直接生成随机昵称并提交,
|
|
* 会把老用户在服务端的真实昵称覆盖掉。正确做法是先取服务端资料:
|
|
* - 已有昵称 → 老用户,原样保留,不提交任何修改
|
|
* - 没有昵称 → 首次注册,生成一个随机昵称
|
|
*
|
|
* activeLogin 负责把数据库里的「已登录」标记置 1——只有用户亲自点这里才会置 1,
|
|
* 静默登录不碰它。它带鉴权,未登录时会自动完成静默登录,无需手动判断 token。
|
|
*/
|
|
onLoginBtnClick() {
|
|
wx.showLoading({ title: '请稍候', mask: true });
|
|
|
|
api
|
|
.activeLogin()
|
|
.then(() => api.getMe())
|
|
.then((user) => {
|
|
store.setUser(user);
|
|
if (user.nickname) return user;
|
|
return api.updateMe({ nickname: randomNickname() }).then((created) => {
|
|
store.setUser(created);
|
|
return created;
|
|
});
|
|
})
|
|
.then(() => {
|
|
wx.hideLoading();
|
|
wx.showToast({ title: '成功', icon: 'success', mask: true, duration: 1500 });
|
|
setTimeout(() => wx.switchTab({ url: '/pages/wode/wode' }), 1500);
|
|
})
|
|
.catch((err) => {
|
|
wx.hideLoading();
|
|
wx.showToast({ title: (err && err.message) || '登录失败', icon: 'none', mask: true });
|
|
});
|
|
},
|
|
|
|
onlogout() {
|
|
if (!this.data.loginStatue) return;
|
|
wx.showModal({
|
|
title: store.cfg('common.dialog.title'),
|
|
content: store.cfg('login.confirm.logout'),
|
|
confirmColor: '#ff0000',
|
|
success: (res) => {
|
|
if (!res.confirm) return;
|
|
wx.showLoading({ title: '请稍候', mask: true });
|
|
api.logout().then(() => {
|
|
wx.hideLoading();
|
|
wx.switchTab({ url: '/pages/wode/wode' });
|
|
});
|
|
},
|
|
});
|
|
},
|
|
});
|