Server: - Add Express framework, replace custom router/request parser - Create DAO layer (12 files) centralizing all 73 SQL queries - Rewrite 7 route files as thin Express controllers calling DAOs - Add SCF-to-Express adapter (lib/serverless.js) - Add auth middleware (middleware/auth.js) - Remove dead code from lib/auth.js Admin console: - Extract DataTable component (table + pagination) - Extract ConfirmModal component (modal + form styles) - Create listMixin for paginated list pages - Move form styles to common.css for slot compatibility - Refactor device + subscription pages as examples Miniprogram: - Split 734-line BLE monolith into 4 focused modules (protocol, connection, commands, barrel index) - Create API module (utils/api.js) with named functions - Create page utilities (utils/page.js) - Refactor index + profile pages to use API module
92 行
2.4 KiB
JavaScript
92 行
2.4 KiB
JavaScript
var api = require('../../utils/api')
|
|
var app = getApp()
|
|
|
|
Page({
|
|
data: {
|
|
userInfo: null,
|
|
subscription: null,
|
|
deviceCount: 0,
|
|
subRemaining: 0
|
|
},
|
|
|
|
onShow: function () {
|
|
this.loadProfile()
|
|
},
|
|
|
|
loadProfile: function () {
|
|
var self = this
|
|
api.getProfile().then(function (profile) {
|
|
self.setData({
|
|
userInfo: profile,
|
|
deviceCount: profile.device_count || 0
|
|
})
|
|
}).catch(function () {})
|
|
|
|
api.getSubscription().then(function (sub) {
|
|
self.setData({
|
|
subscription: sub,
|
|
subRemaining: sub.remaining_days || 0
|
|
})
|
|
}).catch(function () {})
|
|
},
|
|
|
|
onManageDevice: function () {
|
|
var self = this
|
|
if (this.data.deviceCount > 0) {
|
|
wx.showActionSheet({
|
|
itemList: ['解绑当前设备'],
|
|
success: function (res) {
|
|
if (res.tapIndex === 0) {
|
|
wx.showModal({
|
|
title: '确认解绑',
|
|
content: '解绑后将无法使用该设备,确定要解绑吗?',
|
|
success: function (modalRes) {
|
|
if (modalRes.confirm) {
|
|
api.unbindDevice().then(function () {
|
|
wx.showToast({ title: '已解绑', icon: 'success' })
|
|
self.loadProfile()
|
|
}).catch(function (err) {
|
|
wx.showToast({ title: err.message || '解绑失败', icon: 'none' })
|
|
})
|
|
}
|
|
}
|
|
})
|
|
}
|
|
}
|
|
})
|
|
} else {
|
|
wx.navigateTo({ url: '/pages/scan/scan' })
|
|
}
|
|
},
|
|
|
|
onViewSubscription: function () {
|
|
if (!this.data.subscription || this.data.subscription.status !== 'active') {
|
|
wx.navigateTo({ url: '/pages/subscribe-plans/subscribe-plans' })
|
|
} else {
|
|
var sub = this.data.subscription
|
|
wx.showModal({
|
|
title: '订阅信息',
|
|
content: '套餐类型:' + (sub.plan || '未知') + '\n剩余天数:' + (sub.remaining_days || 0) + '天',
|
|
showCancel: false
|
|
})
|
|
}
|
|
},
|
|
|
|
onViewHistory: function () {
|
|
wx.switchTab({ url: '/pages/history/history' })
|
|
},
|
|
|
|
onLogout: function () {
|
|
wx.showModal({
|
|
title: '退出登录',
|
|
content: '确定要退出登录吗?',
|
|
success: function (res) {
|
|
if (res.confirm) {
|
|
wx.removeStorageSync('token')
|
|
wx.reLaunch({ url: '/pages/login/login' })
|
|
}
|
|
}
|
|
})
|
|
}
|
|
})
|