2026-03-18 16:10:41 +08:00
|
|
|
const express = require('express');
|
|
|
|
|
const db = require('../config/database');
|
|
|
|
|
const { authenticate } = require('../middleware/auth');
|
|
|
|
|
const { asyncHandler, AppError } = require('../middleware/errorHandler');
|
|
|
|
|
|
|
|
|
|
const router = express.Router();
|
|
|
|
|
|
2026-03-26 10:49:12 +08:00
|
|
|
// 转义 SQL LIKE 特殊字符
|
|
|
|
|
function escapeLikePattern(str) {
|
|
|
|
|
return str.replace(/[%_\\]/g, '\\$&');
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-18 16:10:41 +08:00
|
|
|
// 搜索账目
|
|
|
|
|
router.get('/', authenticate, asyncHandler(async (req, res) => {
|
|
|
|
|
const { q } = req.query;
|
|
|
|
|
|
|
|
|
|
if (!q) {
|
|
|
|
|
throw new AppError('请输入搜索关键词', 400, 'MISSING_QUERY');
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-26 10:49:12 +08:00
|
|
|
const escapedQ = escapeLikePattern(q);
|
2026-03-18 16:10:41 +08:00
|
|
|
const stmt = db.prepare(`
|
|
|
|
|
SELECT * FROM records
|
2026-03-26 10:49:12 +08:00
|
|
|
WHERE user_id = ? AND (category LIKE ? ESCAPE '\\' OR note LIKE ? ESCAPE '\\')
|
2026-03-18 16:10:41 +08:00
|
|
|
ORDER BY date DESC, id DESC
|
|
|
|
|
LIMIT 50
|
|
|
|
|
`);
|
|
|
|
|
|
2026-03-26 10:49:12 +08:00
|
|
|
const records = stmt.all(req.userId, `%${escapedQ}%`, `%${escapedQ}%`);
|
2026-03-18 16:10:41 +08:00
|
|
|
res.json(records);
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
module.exports = router;
|