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 行删除
+28 -27
查看文件
@@ -1,34 +1,35 @@
const Router = require('./lib/router')
const { createContext } = require('./lib/request')
const { ok, fail, http } = require('./lib/response')
const express = require('express')
const { ok, fail } = require('./lib/response')
const { authMiddleware } = require('./middleware/auth')
const router = new Router()
const app = express()
require('./routes/auth')(router)
require('./routes/user')(router)
require('./routes/device')(router)
require('./routes/subscription')(router)
require('./routes/treatment')(router)
require('./routes/admin')(router)
require('./routes/firmware')(router)
app.use(express.json())
app.use((req, res, next) => {
res.header('Access-Control-Allow-Origin', '*')
res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, X-Device-Id, X-App-Version, X-Platform')
res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS')
if (req.method === 'OPTIONS') return res.sendStatus(204)
next()
})
async function handle(event) {
const ctx = createContext(event || {})
if (ctx.method === 'OPTIONS') return http(204, {})
if (ctx.path === '/health') return http(200, ok({ status: 'ok' }))
app.use(authMiddleware)
const match = router.match(ctx.method, ctx.path)
if (!match) return http(404, fail(404, 'not_found'))
app.get('/health', (req, res) => res.json(ok({ status: 'ok' })))
ctx.params = match.params
app.use('/api/v1', require('./routes/auth'))
app.use('/api/v1', require('./routes/user'))
app.use('/api/v1', require('./routes/device'))
app.use('/api/v1', require('./routes/subscription'))
app.use('/api/v1', require('./routes/treatment'))
app.use('/api/v1/admin', require('./routes/admin'))
app.use('/api/v1', require('./routes/firmware'))
try {
const body = await match.handler(ctx)
return http(200, body)
} catch (err) {
console.error('[ERROR]', ctx.method, ctx.path, err.code || '', err.sqlMessage || err.message, err.stack)
return http(500, fail(3001, 'server_error'))
}
}
app.use((req, res) => res.status(404).json(fail(404, 'not_found')))
module.exports = { handle }
app.use((err, req, res, _next) => {
console.error('[ERROR]', req.method, req.path, err.code || '', err.sqlMessage || err.message, err.stack)
res.status(500).json(fail(3001, 'server_error'))
})
module.exports = app