refactor: restructure entire project for human maintainability
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
这个提交包含在:
@@ -0,0 +1,81 @@
|
||||
import { get } from './request'
|
||||
|
||||
/**
|
||||
* Creates a mixin for paginated list pages.
|
||||
*
|
||||
* Eliminates the repeated data/computed/methods boilerplate for:
|
||||
* - records[], total, page, pageSize, totalPages
|
||||
* - loadList(), onPage(), onSearch()
|
||||
*
|
||||
* Usage:
|
||||
* import { listMixin } from '../../utils/useList'
|
||||
*
|
||||
* export default {
|
||||
* mixins: [listMixin('/api/v1/admin/devices')],
|
||||
* methods: {
|
||||
* reload() {
|
||||
* this.loadList({ keyword: this.keyword })
|
||||
* }
|
||||
* }
|
||||
* }
|
||||
*
|
||||
* @param {string} apiPath - API endpoint path (passed to get())
|
||||
* @param {object} opts
|
||||
* @param {number} [opts.pageSize=20] - Items per page
|
||||
*/
|
||||
export function listMixin(apiPath, opts = {}) {
|
||||
return {
|
||||
data() {
|
||||
return {
|
||||
records: [],
|
||||
total: 0,
|
||||
page: 1,
|
||||
pageSize: opts.pageSize || 20
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
totalPages() {
|
||||
return Math.ceil(this.total / this.pageSize) || 1
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
async loadList(extraParams = {}) {
|
||||
try {
|
||||
var params = { page: this.page, page_size: this.pageSize }
|
||||
// Merge extra params, dropping falsy values to keep request clean
|
||||
var keys = Object.keys(extraParams)
|
||||
for (var i = 0; i < keys.length; i++) {
|
||||
var k = keys[i]
|
||||
if (extraParams[k] !== '' && extraParams[k] != null) {
|
||||
params[k] = extraParams[k]
|
||||
}
|
||||
}
|
||||
var data = await get(apiPath, params)
|
||||
this.records = data.records || []
|
||||
this.total = data.total || 0
|
||||
this.onListLoaded(data)
|
||||
} catch (e) {
|
||||
uni.showToast({ title: '加载失败', icon: 'none' })
|
||||
}
|
||||
},
|
||||
/**
|
||||
* Override in page to handle extra response data (e.g. stats).
|
||||
*/
|
||||
onListLoaded(_data) {},
|
||||
onPage(p) {
|
||||
this.page = p
|
||||
this.reload()
|
||||
},
|
||||
onSearch() {
|
||||
this.page = 1
|
||||
this.reload()
|
||||
},
|
||||
/**
|
||||
* Override in page to call loadList() with current filters.
|
||||
*/
|
||||
reload() {
|
||||
this.loadList()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
在新工单中引用
屏蔽一个用户