mirror of
https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web.git
synced 2025-10-02 16:16:39 +08:00
commit
2bc5d620f7
25
app/api/admin/setting/[[...path]]/route.ts
Normal file
25
app/api/admin/setting/[[...path]]/route.ts
Normal 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;
|
9
app/app/(admin)/admin/setting/page.tsx
Normal file
9
app/app/(admin)/admin/setting/page.tsx
Normal 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>
|
||||||
|
);
|
||||||
|
}
|
50
app/app/(admin)/components/admin-setting-table.tsx
Normal file
50
app/app/(admin)/components/admin-setting-table.tsx
Normal 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;
|
@ -38,6 +38,7 @@ const items: MenuItem[] = [
|
|||||||
|
|
||||||
getItem("管理", "manage", <AppstoreOutlined />, [
|
getItem("管理", "manage", <AppstoreOutlined />, [
|
||||||
getItem("用户管理", "/admin/users"),
|
getItem("用户管理", "/admin/users"),
|
||||||
|
getItem("系统设置", "/admin/setting"),
|
||||||
]),
|
]),
|
||||||
|
|
||||||
// getItem("Navigation Three", "sub4", <SettingOutlined />, [
|
// getItem("Navigation Three", "sub4", <SettingOutlined />, [
|
||||||
|
35
lib/auth.ts
35
lib/auth.ts
@ -96,10 +96,13 @@ export const authOptions: NextAuthOptions = {
|
|||||||
// 目前用户不存在,则会创建新用户。
|
// 目前用户不存在,则会创建新用户。
|
||||||
let existingUser = await existUser(user); // await insertUser(user)
|
let existingUser = await existUser(user); // await insertUser(user)
|
||||||
if (!existingUser) {
|
if (!existingUser) {
|
||||||
// 如果不存在,则报错
|
if (await getSetting("allowNewUser")) {
|
||||||
// throw new Error("用户名或密码不正确")
|
// 如果不存在,则创建
|
||||||
// 如果不存在,则创建
|
existingUser = await insertUser(user);
|
||||||
existingUser = await insertUser(user);
|
} else {
|
||||||
|
// 如果不存在,则报错
|
||||||
|
throw new Error("未知用户")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// 有密码就校验密码,没有就直接返回用户
|
// 有密码就校验密码,没有就直接返回用户
|
||||||
(password || existingUser.password) && validatePassword(password, existingUser.password);
|
(password || existingUser.password) && validatePassword(password, existingUser.password);
|
||||||
@ -158,7 +161,7 @@ export const authOptions: NextAuthOptions = {
|
|||||||
// 过滤不存在的用户
|
// 过滤不存在的用户
|
||||||
async signIn({ user, account, profile, email, credentials }) {
|
async signIn({ user, account, profile, email, credentials }) {
|
||||||
const existingUser = await existUser(user as User);
|
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;
|
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 ) {
|
async function existUser(user: {[key: string]: string} | User ) {
|
||||||
const conditions = [];
|
const conditions = [];
|
||||||
if (user?.name) {
|
if (user?.name) {
|
||||||
|
@ -136,3 +136,13 @@ model VerificationToken {
|
|||||||
// image String? @db.Text
|
// image String? @db.Text
|
||||||
// imageBlurhash 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")
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user