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
这个提交包含在:
Guoguo
2026-04-29 05:58:20 -07:00
父节点 9f0e629c82
当前提交 bb4b80f867
修改 46 个文件,包含 4306 行新增2020 行删除
+81
查看文件
@@ -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()
}
}
}
}