feat: 数据概览/操作日志/批量操作 + 首页合格档案数
后台新增「数据概览」(商品/合格/按状态/品牌/分类/待审核) 与「操作日志」(全局审计分页);商品列表支持多选批量改状态/分类。公开首页标题改为「天工」并展示合格档案数;新增公开接口 /api/v1/stats 与后台 /api/stats、/api/audit、/api/products/bulk。合格口径=quality_score≥0.6 且在用。 Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
@@ -30,7 +30,14 @@ export interface SearchFilters {
|
||||
country?: string;
|
||||
}
|
||||
|
||||
export interface Stats {
|
||||
total: number;
|
||||
qualified: number;
|
||||
min_score: number;
|
||||
}
|
||||
|
||||
export const api = {
|
||||
stats: () => req<Stats>(`/api/v1/stats`),
|
||||
search: (q: string, page = 1, size = 20, filters: SearchFilters = {}) => {
|
||||
const params = new URLSearchParams({
|
||||
q,
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { useState } from "react";
|
||||
import { useEffect, useState } from "react";
|
||||
import { Search, PlusCircle, Code2 } from "lucide-react";
|
||||
import { api } from "../api";
|
||||
import type { ProductSummary } from "../types";
|
||||
@@ -20,6 +20,14 @@ export default function Home({
|
||||
const [searched, setSearched] = useState(false);
|
||||
const [loading, setLoading] = useState(false);
|
||||
const [error, setError] = useState("");
|
||||
const [qualified, setQualified] = useState<number | null>(null);
|
||||
|
||||
useEffect(() => {
|
||||
api
|
||||
.stats()
|
||||
.then((s) => setQualified(s.qualified))
|
||||
.catch(() => setQualified(null));
|
||||
}, []);
|
||||
|
||||
async function run(e?: React.FormEvent) {
|
||||
e?.preventDefault();
|
||||
@@ -43,10 +51,19 @@ export default function Home({
|
||||
return (
|
||||
<div>
|
||||
<div className="text-center py-10">
|
||||
<h1 className="text-3xl font-bold text-gray-800">天工商品档案公共仓</h1>
|
||||
<h1 className="text-3xl font-bold text-gray-800">天工</h1>
|
||||
<p className="mt-2 text-gray-500">
|
||||
输入商品名称或条码,检索客观、可溯源的商品资料。人人可查,人人可贡献。
|
||||
</p>
|
||||
{qualified != null && (
|
||||
<p className="mt-3 text-sm text-gray-500">
|
||||
目前已收录
|
||||
<span className="mx-1 font-semibold text-emerald-600">
|
||||
{qualified.toLocaleString()}
|
||||
</span>
|
||||
条合格商品档案
|
||||
</p>
|
||||
)}
|
||||
<form onSubmit={run} className="mt-6 max-w-2xl mx-auto flex gap-2">
|
||||
<div className="flex-1 flex items-center gap-2 bg-white border rounded-lg px-3 shadow-sm focus-within:ring-2 focus-within:ring-emerald-400">
|
||||
<Search className="w-5 h-5 text-gray-400" />
|
||||
|
||||
Reference in New Issue
Block a user