添加密码登录&调整接口数据展示&配置底部导航跳转

This commit is contained in:
Eamon-meng
2025-07-01 11:32:37 +08:00
parent b096e20fcd
commit bae4ee9b92
9 changed files with 175 additions and 92 deletions

View File

@@ -12,7 +12,7 @@ import zod from 'zod'
import {merge} from '@/lib/utils'
import {Button} from '@/components/ui/button'
import {useState} from 'react'
import {listAccount} from '@/actions/dashboard'
import {statisticsResourceUsage} from '@/actions/dashboard'
import {ExtraResp} from '@/lib/api'
import {toast} from 'sonner'
import {addDays, format} from 'date-fns'
@@ -20,19 +20,13 @@ import {Label} from '@/components/ui/label'
import {ChartConfig, ChartContainer} from '@/components/ui/chart'
import {CartesianGrid, XAxis, YAxis, Tooltip, Area, AreaChart, Legend} from 'recharts'
type ChartDataItem = {
date: string
count: number
count2?: number
}
type ChartsProps = {
initialData?: ExtraResp<typeof listAccount>
initialData?: ExtraResp<typeof statisticsResourceUsage>
}
export default function Charts({initialData}: ChartsProps) {
// const [submittedData, setSubmittedData] = useState<ExtraReq<typeof listAccount>>()
const [submittedData, setSubmittedData] = useState<ExtraResp<typeof listAccount>>(initialData || [])
const [submittedData, setSubmittedData] = useState<ExtraResp<typeof statisticsResourceUsage>>(initialData || [])
const formSchema = zod.object({
resource_no: zod.string().optional(),
create_after: zod.date().optional(),
@@ -58,7 +52,7 @@ export default function Charts({initialData}: ChartsProps) {
create_before: value.create_before ?? today,
}
const resp = await listAccount(res)
const resp = await statisticsResourceUsage(res)
if (!resp.success) {
toast.error('接口请求失败:' + resp.message)
return
@@ -149,7 +143,7 @@ const config = {
} satisfies ChartConfig
type DashboardChartProps = {
data: ExtraResp<typeof listAccount>
data: ExtraResp<typeof statisticsResourceUsage>
}
function DashboardChart(props: DashboardChartProps) {

View File

@@ -9,7 +9,7 @@ import Charts from './_client/charts'
import UserCenter from './_client/userCenter'
import soon from './_assets/coming-soon.svg'
import mask from './_assets/Mask group.webp'
import {Button} from '@/components/ui/button'
import {ExtraResp} from '@/lib/api'
export type DashboardPageProps = {}
@@ -43,12 +43,7 @@ export default async function DashboardPage(props: DashboardPageProps) {
{/* 磁贴集 */}
{initData && (
<Pins
short_term={String(initData.free.short.ResourceCount)}
short_term_monthly={String(initData.free.short.ResourceQuotaSum)}
long_term={String(initData.free.long.ResourceCount)}
long_term_monthly={String(initData.free.long.ResourceDailyFreeSum)}
/>
<Pins {...initData.free}/>
)}
{/* 图表 */}
@@ -69,13 +64,9 @@ export default async function DashboardPage(props: DashboardPageProps) {
</Page>
)
}
type DashboardChartProps = {
short_term: string
short_term_monthly: string
long_term: string
long_term_monthly: string
}
function Pins(props: DashboardChartProps) {
type DashboardPinsProps = ExtraResp<typeof listInitialization>['free']
function Pins(props: DashboardPinsProps) {
return (
<div className="flex md:row-start-2 md:col-start-1 md:col-span-3 gap-4 max-md:flex-col">
{/* 短效 */}
@@ -91,7 +82,7 @@ function Pins(props: DashboardChartProps) {
<h4></h4>
<p className="flex flex-col items-end">
<span className="text-sm text-weak"></span>
<span className="text-sm">{props.short_term}</span>
<span className="text-sm">{props.short.resource_daily_free_sum}</span>
</p>
</div>
<div className="border-b"></div>
@@ -99,7 +90,7 @@ function Pins(props: DashboardChartProps) {
<h4 className="text-balance"></h4>
<p className="flex flex-col items-end">
<span className="text-sm text-weak"></span>
<span className="text-sm">{props.short_term_monthly}</span>
<span className="text-sm">{props.short.resource_quota_sum}</span>
</p>
</div>
</CardContent>
@@ -118,7 +109,7 @@ function Pins(props: DashboardChartProps) {
<h4 className="text-balance"></h4>
<p className="flex flex-col items-end">
<span className="text-sm text-weak" ></span>
<span className="text-sm">{props.long_term}</span>
<span className="text-sm">{props.long.resource_daily_free_sum}</span>
</p>
</div>
<div className="border-b"></div>
@@ -126,7 +117,7 @@ function Pins(props: DashboardChartProps) {
<h4 className="text-balance"></h4>
<p className="flex flex-col items-end">
<span className="text-sm text-weak"></span>
<span className="text-sm">{props.long_term_monthly}</span>
<span className="text-sm">{props.long.resource_quota_sum}</span>
</p>
</div>
</CardContent>

View File

@@ -324,7 +324,16 @@ function PasswordForm(props: {
type Schema = z.infer<typeof schema>
const form = useForm<Schema>({
resolver: zodResolver(schema),
resolver: zodResolver(
schema.refine(
data =>
/^(?=.*[a-z])(?=.*[A-Z]).{6,}$/.test(data.password),
{
message: '密码需包含大小写字母且不少于6位',
path: ['password'],
},
),
),
defaultValues: {
phone: '',
captcha: '',
@@ -333,6 +342,7 @@ function PasswordForm(props: {
confirm_password: '',
},
})
const router = useRouter()
const handler = form.handleSubmit(async (value) => {
try {
const resp = await updatePassword({
@@ -344,8 +354,10 @@ function PasswordForm(props: {
throw new Error(resp.message)
}
toast.success(`保存成功`)
toast.success(`保存成功,请重新登录`)
setOpen(false)
// 立即跳转到登录页
router.replace('/login')
}
catch (e) {
console.error(e)

View File

@@ -230,14 +230,14 @@ export default function WhitelistPage(props: WhitelistPageProps) {
<Plus/>
</Button>
<Button
{/* <Button
theme="fail"
className="ml-2"
disabled={selection.size === 0 || wait}
onClick={() => confirmRemove()}>
<Trash2/>
删除选中
</Button>
</Button> */}
</section>
{/* 数据表 */}