fix(我的): 修复状态栏遮挡与退出登录被底栏遮住, 新增访问 IP 展示
Docker Build and Push / build-image (push) Successful in 3m26s
Docker Build and Push / build-image (push) Successful in 3m26s
This commit is contained in:
@@ -17,6 +17,7 @@ import projectsRouter, { columnRouter } from './routes/projects.js'
|
||||
import tasksRouter from './routes/tasks.js'
|
||||
import powersyncRouter from './routes/powersync.js'
|
||||
import mcpTokensRouter from './routes/mcp-tokens.js'
|
||||
import systemRouter from './routes/system.js'
|
||||
import mcpRouter from './mcp/index.js'
|
||||
import { powersyncProxy } from './powersync-proxy.js'
|
||||
|
||||
@@ -25,6 +26,9 @@ const DIST_DIR = path.join(process.cwd(), 'dist')
|
||||
const HAS_DIST = fs.existsSync(DIST_DIR)
|
||||
|
||||
const app = express()
|
||||
// 生产环境前面只有一层 NPM 反向代理: 信任 1 跳, 让 req.ip 取到真实客户端 IP
|
||||
// (否则拿到的是反代/容器网段地址, 「我」页的访问 IP 会显示错误)
|
||||
app.set('trust proxy', 1)
|
||||
// 同步服务同域反代必须最先挂载 (流式长连接, 不能经过 json/cors 中间件)
|
||||
app.use(powersyncProxy())
|
||||
app.use(cors())
|
||||
@@ -35,6 +39,8 @@ app.get('/api/health', (_req, res) => res.json({ ok: true, ts: Date.now() }))
|
||||
|
||||
// 业务路由
|
||||
app.use('/api/auth', authRouter)
|
||||
// 系统信息 (当前访问 IP 等)
|
||||
app.use('/api/system', systemRouter)
|
||||
// OTA 接口是公开的 (检查/下载更新不需要登录), 必须挂载在带 authRequired 的 router 之前,
|
||||
// 否则 /api/ota/* 请求会先进入 dataRouter 等并被 authRequired 以 401 拦截
|
||||
app.use('/api', otaRouter)
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
// 系统信息: 当前访问者 IP 等
|
||||
// 仅供「我」页展示, 需要登录后访问
|
||||
import { Router } from 'express'
|
||||
import { authRequired } from '../middleware.js'
|
||||
|
||||
const router = Router()
|
||||
router.use(authRequired)
|
||||
router.use((_req, res, next) => {
|
||||
res.set('Cache-Control', 'no-store')
|
||||
next()
|
||||
})
|
||||
|
||||
// 去掉 IPv4-mapped IPv6 前缀 (::ffff:1.2.3.4 → 1.2.3.4), 便于展示
|
||||
function normalizeIp(ip) {
|
||||
const s = String(ip || '').trim()
|
||||
return s.startsWith('::ffff:') ? s.slice(7) : s
|
||||
}
|
||||
|
||||
// GET /api/system/client-ip 服务器看到的当前访问 IP
|
||||
// 依赖 index.js 里的 trust proxy 设置解析 X-Forwarded-For (生产经 NPM 反代)
|
||||
router.get('/client-ip', (req, res) => {
|
||||
res.json({ ip: normalizeIp(req.ip || req.socket?.remoteAddress) })
|
||||
})
|
||||
|
||||
export default router
|
||||
Reference in New Issue
Block a user