暂存-设置项管理

This commit is contained in:
sijinhui 2024-04-24 18:28:38 +08:00
parent 304a96a4ff
commit 8c5bbf1cf0
6 changed files with 125 additions and 5 deletions

View File

@ -0,0 +1,25 @@
import { NextRequest, NextResponse } from "next/server";
import prisma from "@/lib/prisma";
async function handle(
req: NextRequest,
{ params }: { params: { path: string[] } },
) {
// 判断网址和请求方法
const method = req.method;
// const url = req.url;
const { pathname, searchParams } = new URL(req.url);
// console.log('----', pathname, searchParams, params.path)
if (method === "GET" && !params.path) {
const all_setting = await prisma.setting.findMany();
console.log("all_setting,", all_setting);
return NextResponse.json({ result: all_setting });
}
return NextResponse.json({ error: "当前方法不支持" }, { status: 405 });
}
export const GET = handle;
export const POST = handle;
export const PUT = handle;
export const DELETE = handle;

View File

@ -0,0 +1,9 @@
import { Flex } from "antd";
import SettingForm from "../../components/admin-setting-table";
export default async function SettingPage() {
return (
<Flex>
<SettingForm />
</Flex>
);
}

View File

@ -0,0 +1,50 @@
"use client";
import type { FormProps } from "antd";
import { Button, Checkbox, Form, Input, Table } from "antd";
import { useEffect, useState } from "react";
import { Setting } from "@prisma/client";
function SettingForm() {
const [setting, setSetting] = useState<Setting[]>([]);
useEffect(() => {
fetch("/api/admin/setting", {
headers: { "Content-Type": "application/json" },
credentials: "include",
})
.then((response) => response.json())
.then((result) => {
setSetting(result["result"]);
});
}, []);
const columns = [
{
title: "key",
dataIndex: "key",
key: "key",
},
{
title: "value",
dataIndex: "value",
},
{
title: "type",
dataIndex: "type",
},
{
title: "action",
dataIndex: "",
key: "key",
render: (_, record) => (
<>
<Button></Button>
</>
),
},
];
return <Table dataSource={setting} columns={columns} />;
}
export default SettingForm;

View File

@ -38,6 +38,7 @@ const items: MenuItem[] = [
getItem("管理", "manage", <AppstoreOutlined />, [
getItem("用户管理", "/admin/users"),
getItem("系统设置", "/admin/setting"),
]),
// getItem("Navigation Three", "sub4", <SettingOutlined />, [

View File

@ -96,10 +96,13 @@ export const authOptions: NextAuthOptions = {
// 目前用户不存在,则会创建新用户。
let existingUser = await existUser(user); // await insertUser(user)
if (!existingUser) {
// 如果不存在,则报错
// throw new Error("用户名或密码不正确")
// 如果不存在,则创建
existingUser = await insertUser(user);
if (await getSetting("allowNewUser")) {
// 如果不存在,则创建
existingUser = await insertUser(user);
} else {
// 如果不存在,则报错
throw new Error("未知用户")
}
}
// 有密码就校验密码,没有就直接返回用户
(password || existingUser.password) && validatePassword(password, existingUser.password);
@ -158,7 +161,7 @@ export const authOptions: NextAuthOptions = {
// 过滤不存在的用户
async signIn({ user, account, profile, email, credentials }) {
const existingUser = await existUser(user as User);
console.log('---', user, 'account', account, 'email', email, 'exist', existingUser)
// console.log('---', user, 'account', account, 'email', email, 'exist', existingUser)
// 顺便过滤掉不允许登录的用户
return !!existingUser && existingUser.allowToLogin;
}
@ -210,6 +213,28 @@ export function validatePassword(password: string, hashPassword: string | null |
}
}
async function getSetting(key: string) {
const setting = await prisma.setting.findUnique({
where: {
key: key
}
})
console.log('setting,------', setting)
if (!setting) {
return null;
}
// 根据类型字段转换值
switch (setting.type) {
case 'boolean':
return setting.value === 'true';
case 'number':
return Number(setting.value);
case 'string':
default:
return setting.value;
}
}
async function existUser(user: {[key: string]: string} | User ) {
const conditions = [];
if (user?.name) {

View File

@ -136,3 +136,13 @@ model VerificationToken {
// image String? @db.Text
// imageBlurhash String? @db.Text
// }
model Setting {
key String @id
value String
type String
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @default(now()) @updatedAt @map("updated_at")
@@map("settings")
}