feat(nav-category): support dynamic home grid categories in admin and uniapp
这个提交包含在:
@@ -851,6 +851,154 @@ export class MysqlRepository {
|
||||
return res.affectedRows > 0;
|
||||
}
|
||||
|
||||
async getNavCategories(): Promise<any[]> {
|
||||
const [rows]: any = await pool.query(`
|
||||
SELECT
|
||||
id, code, name, icon, bg_class as bgClass, cat,
|
||||
target_url as targetUrl, badge_text as badgeText,
|
||||
sort_order as sortOrder, status,
|
||||
created_at as createdAt, updated_at as updatedAt
|
||||
FROM nav_categories
|
||||
WHERE status = 1
|
||||
ORDER BY sort_order ASC, id ASC
|
||||
`);
|
||||
return rows;
|
||||
}
|
||||
|
||||
async getAdminNavCategories(): Promise<any[]> {
|
||||
const [rows]: any = await pool.query(`
|
||||
SELECT
|
||||
id, code, name, icon, bg_class as bgClass, cat,
|
||||
target_url as targetUrl, badge_text as badgeText,
|
||||
sort_order as sortOrder, status,
|
||||
created_at as createdAt, updated_at as updatedAt
|
||||
FROM nav_categories
|
||||
ORDER BY sort_order ASC, id ASC
|
||||
`);
|
||||
return rows;
|
||||
}
|
||||
|
||||
async createNavCategory(data: {
|
||||
code?: string;
|
||||
name: string;
|
||||
icon: string;
|
||||
bgClass?: string;
|
||||
cat?: string;
|
||||
targetUrl?: string;
|
||||
badgeText?: string;
|
||||
sortOrder?: number;
|
||||
status?: number;
|
||||
}): Promise<any> {
|
||||
const code = data.code || `cat_${Date.now()}`;
|
||||
const name = data.name;
|
||||
const icon = data.icon;
|
||||
const bgClass = data.bgClass || 'bg-indigo';
|
||||
const cat = data.cat || 'all';
|
||||
const targetUrl = data.targetUrl || '/pages/activity/list?category=ALL';
|
||||
const badgeText = data.badgeText || '';
|
||||
const sortOrder = Number(data.sortOrder) || 0;
|
||||
const status = data.status !== undefined ? Number(data.status) : 1;
|
||||
|
||||
const [res]: any = await pool.query(`
|
||||
INSERT INTO nav_categories (code, name, icon, bg_class, cat, target_url, badge_text, sort_order, status)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
||||
`, [code, name, icon, bgClass, cat, targetUrl, badgeText, sortOrder, status]);
|
||||
|
||||
const newId = res.insertId;
|
||||
const [rows]: any = await pool.query(`
|
||||
SELECT
|
||||
id, code, name, icon, bg_class as bgClass, cat,
|
||||
target_url as targetUrl, badge_text as badgeText,
|
||||
sort_order as sortOrder, status,
|
||||
created_at as createdAt, updated_at as updatedAt
|
||||
FROM nav_categories
|
||||
WHERE id = ?
|
||||
`, [newId]);
|
||||
return rows[0];
|
||||
}
|
||||
|
||||
async updateNavCategory(id: number | string, data: Partial<{
|
||||
name: string;
|
||||
icon: string;
|
||||
bgClass: string;
|
||||
cat: string;
|
||||
targetUrl: string;
|
||||
badgeText: string;
|
||||
sortOrder: number;
|
||||
status: number;
|
||||
}>): Promise<any> {
|
||||
const fields: string[] = [];
|
||||
const values: any[] = [];
|
||||
|
||||
if (data.name !== undefined) {
|
||||
fields.push('name = ?');
|
||||
values.push(data.name);
|
||||
}
|
||||
if (data.icon !== undefined) {
|
||||
fields.push('icon = ?');
|
||||
values.push(data.icon);
|
||||
}
|
||||
if (data.bgClass !== undefined) {
|
||||
fields.push('bg_class = ?');
|
||||
values.push(data.bgClass);
|
||||
}
|
||||
if (data.cat !== undefined) {
|
||||
fields.push('cat = ?');
|
||||
values.push(data.cat);
|
||||
}
|
||||
if (data.targetUrl !== undefined) {
|
||||
fields.push('target_url = ?');
|
||||
values.push(data.targetUrl);
|
||||
}
|
||||
if (data.badgeText !== undefined) {
|
||||
fields.push('badge_text = ?');
|
||||
values.push(data.badgeText);
|
||||
}
|
||||
if (data.sortOrder !== undefined) {
|
||||
fields.push('sort_order = ?');
|
||||
values.push(Number(data.sortOrder));
|
||||
}
|
||||
if (data.status !== undefined) {
|
||||
fields.push('status = ?');
|
||||
values.push(Number(data.status));
|
||||
}
|
||||
|
||||
if (fields.length > 0) {
|
||||
values.push(id);
|
||||
await pool.query(`UPDATE nav_categories SET ${fields.join(', ')} WHERE id = ?`, values);
|
||||
}
|
||||
|
||||
const [rows]: any = await pool.query(`
|
||||
SELECT
|
||||
id, code, name, icon, bg_class as bgClass, cat,
|
||||
target_url as targetUrl, badge_text as badgeText,
|
||||
sort_order as sortOrder, status,
|
||||
created_at as createdAt, updated_at as updatedAt
|
||||
FROM nav_categories
|
||||
WHERE id = ?
|
||||
`, [id]);
|
||||
return rows[0] || null;
|
||||
}
|
||||
|
||||
async updateNavCategoryStatus(id: number | string, status: number): Promise<any> {
|
||||
await pool.query('UPDATE nav_categories SET status = ? WHERE id = ?', [Number(status), id]);
|
||||
const [rows]: any = await pool.query(`
|
||||
SELECT
|
||||
id, code, name, icon, bg_class as bgClass, cat,
|
||||
target_url as targetUrl, badge_text as badgeText,
|
||||
sort_order as sortOrder, status,
|
||||
created_at as createdAt, updated_at as updatedAt
|
||||
FROM nav_categories
|
||||
WHERE id = ?
|
||||
`, [id]);
|
||||
return rows[0] || null;
|
||||
}
|
||||
|
||||
async deleteNavCategory(id: number | string): Promise<boolean> {
|
||||
const [res]: any = await pool.query('DELETE FROM nav_categories WHERE id = ?', [id]);
|
||||
return res.affectedRows > 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
async getArbitrations(): Promise<any[]> {
|
||||
|
||||
在新工单中引用
屏蔽一个用户