mirror of
https://github.com/NapNeko/NapCatQQ.git
synced 2025-07-19 12:03:37 +00:00
feat: 提示修改默认密码
This commit is contained in:
@@ -9,14 +9,6 @@ export interface Log {
|
|||||||
message: string
|
message: string
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface TerminalSession {
|
|
||||||
id: string
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface TerminalInfo {
|
|
||||||
id: string
|
|
||||||
}
|
|
||||||
|
|
||||||
export default class WebUIManager {
|
export default class WebUIManager {
|
||||||
public static async checkWebUiLogined() {
|
public static async checkWebUiLogined() {
|
||||||
const { data } =
|
const { data } =
|
||||||
@@ -40,6 +32,13 @@ export default class WebUIManager {
|
|||||||
return data.data
|
return data.data
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static async checkUsingDefaultToken() {
|
||||||
|
const { data } = await serverRequest.get<ServerResponse<boolean>>(
|
||||||
|
'/auth/check_using_default_token'
|
||||||
|
)
|
||||||
|
return data.data
|
||||||
|
}
|
||||||
|
|
||||||
public static async proxy<T>(url = '') {
|
public static async proxy<T>(url = '') {
|
||||||
const data = await serverRequest.get<ServerResponse<string>>(
|
const data = await serverRequest.get<ServerResponse<string>>(
|
||||||
'/base/proxy?url=' + encodeURIComponent(url)
|
'/base/proxy?url=' + encodeURIComponent(url)
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
import { Card, CardBody } from '@heroui/card'
|
import { Card, CardBody } from '@heroui/card'
|
||||||
import { Tab, Tabs } from '@heroui/tabs'
|
import { Tab, Tabs } from '@heroui/tabs'
|
||||||
import { useMediaQuery } from 'react-responsive'
|
import { useMediaQuery } from 'react-responsive'
|
||||||
|
import { useNavigate, useSearchParams } from 'react-router-dom'
|
||||||
|
|
||||||
import ChangePasswordCard from './change_password'
|
import ChangePasswordCard from './change_password'
|
||||||
import OneBotConfigCard from './onebot'
|
import OneBotConfigCard from './onebot'
|
||||||
@@ -22,6 +23,11 @@ const ConfingPageItem: React.FC<ConfigPageProps> = ({ children }) => {
|
|||||||
|
|
||||||
export default function ConfigPage() {
|
export default function ConfigPage() {
|
||||||
const isMediumUp = useMediaQuery({ minWidth: 768 })
|
const isMediumUp = useMediaQuery({ minWidth: 768 })
|
||||||
|
const navigate = useNavigate()
|
||||||
|
const search = useSearchParams({
|
||||||
|
tab: 'onebot'
|
||||||
|
})[0]
|
||||||
|
const tab = search.get('tab') ?? 'onebot'
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<section className="w-[1000px] max-w-full md:mx-auto gap-4 py-8 px-2 md:py-10">
|
<section className="w-[1000px] max-w-full md:mx-auto gap-4 py-8 px-2 md:py-10">
|
||||||
@@ -30,6 +36,10 @@ export default function ConfigPage() {
|
|||||||
fullWidth
|
fullWidth
|
||||||
className="w-full"
|
className="w-full"
|
||||||
isVertical={isMediumUp}
|
isVertical={isMediumUp}
|
||||||
|
selectedKey={tab}
|
||||||
|
onSelectionChange={(key) => {
|
||||||
|
navigate(`/config?tab=${key}`)
|
||||||
|
}}
|
||||||
classNames={{
|
classNames={{
|
||||||
tabList: 'sticky flex top-14 bg-opacity-50 backdrop-blur-sm',
|
tabList: 'sticky flex top-14 bg-opacity-50 backdrop-blur-sm',
|
||||||
panel: 'w-full relative',
|
panel: 'w-full relative',
|
||||||
|
@@ -1,14 +1,46 @@
|
|||||||
import { Spinner } from '@heroui/spinner'
|
import { Spinner } from '@heroui/spinner'
|
||||||
import { AnimatePresence, motion } from 'motion/react'
|
import { AnimatePresence, motion } from 'motion/react'
|
||||||
import { Suspense } from 'react'
|
import { Suspense, useEffect } from 'react'
|
||||||
import { Outlet, useLocation } from 'react-router-dom'
|
import { Outlet, useLocation, useNavigate } from 'react-router-dom'
|
||||||
|
|
||||||
|
import useAuth from '@/hooks/auth'
|
||||||
|
import useDialog from '@/hooks/use-dialog'
|
||||||
|
|
||||||
|
import WebUIManager from '@/controllers/webui_manager'
|
||||||
import DefaultLayout from '@/layouts/default'
|
import DefaultLayout from '@/layouts/default'
|
||||||
|
|
||||||
|
const CheckDefaultPassword = () => {
|
||||||
|
const { isAuth } = useAuth()
|
||||||
|
const dialog = useDialog()
|
||||||
|
const navigate = useNavigate()
|
||||||
|
const checkDefaultPassword = async () => {
|
||||||
|
const data = await WebUIManager.checkUsingDefaultToken()
|
||||||
|
if (data) {
|
||||||
|
dialog.confirm({
|
||||||
|
title: '修改默认密码',
|
||||||
|
content: '检测到当前密码为默认密码,请尽快修改密码。',
|
||||||
|
confirmText: '前往修改',
|
||||||
|
onConfirm: () => {
|
||||||
|
navigate('/config?tab=token')
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (isAuth) {
|
||||||
|
checkDefaultPassword()
|
||||||
|
}
|
||||||
|
}, [isAuth])
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
export default function IndexPage() {
|
export default function IndexPage() {
|
||||||
const location = useLocation()
|
const location = useLocation()
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<DefaultLayout>
|
<DefaultLayout>
|
||||||
|
<CheckDefaultPassword />
|
||||||
<Suspense
|
<Suspense
|
||||||
fallback={
|
fallback={
|
||||||
<div className="flex justify-center px-10">
|
<div className="flex justify-center px-10">
|
||||||
|
@@ -10,7 +10,7 @@ import { WebUiConfigWrapper } from '@webapi/helper/config';
|
|||||||
import { ALLRouter } from '@webapi/router';
|
import { ALLRouter } from '@webapi/router';
|
||||||
import { cors } from '@webapi/middleware/cors';
|
import { cors } from '@webapi/middleware/cors';
|
||||||
import { createUrl } from '@webapi/utils/url';
|
import { createUrl } from '@webapi/utils/url';
|
||||||
import { sendError, sendSuccess } from '@webapi/utils/response';
|
import { sendError } from '@webapi/utils/response';
|
||||||
import { join } from 'node:path';
|
import { join } from 'node:path';
|
||||||
import { terminalManager } from '@webapi/terminal/terminal_manager';
|
import { terminalManager } from '@webapi/terminal/terminal_manager';
|
||||||
import multer from 'multer'; // 新增:引入multer用于错误捕获
|
import multer from 'multer'; // 新增:引入multer用于错误捕获
|
||||||
@@ -112,7 +112,9 @@ export async function InitWebUi(logger: LogWrapper, pathWrapper: NapCatPathWrapp
|
|||||||
`[NapCat] [WebUi] WebUi User Panel Url: ${createUrl(host, port.toString(), '/webui', searchParams)}`
|
`[NapCat] [WebUi] WebUi User Panel Url: ${createUrl(host, port.toString(), '/webui', searchParams)}`
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
logger.log(`[NapCat] [WebUi] WebUi Local Panel Url: ${createUrl('127.0.0.1', port.toString(), '/webui', searchParams)}`);
|
logger.log(
|
||||||
|
`[NapCat] [WebUi] WebUi Local Panel Url: ${createUrl('127.0.0.1', port.toString(), '/webui', searchParams)}`
|
||||||
|
);
|
||||||
});
|
});
|
||||||
// ------------Over!------------
|
// ------------Over!------------
|
||||||
}
|
}
|
||||||
|
@@ -7,6 +7,15 @@ import { WebUiDataRuntime } from '@webapi/helper/Data';
|
|||||||
import { sendSuccess, sendError } from '@webapi/utils/response';
|
import { sendSuccess, sendError } from '@webapi/utils/response';
|
||||||
import { isEmpty } from '@webapi/utils/check';
|
import { isEmpty } from '@webapi/utils/check';
|
||||||
|
|
||||||
|
// 检查是否使用默认Token
|
||||||
|
export const CheckDefaultTokenHandler: RequestHandler = async (_, res) => {
|
||||||
|
const webuiToken = await WebUiConfig.GetWebUIConfig();
|
||||||
|
if (webuiToken.token === 'napcat') {
|
||||||
|
return sendSuccess(res, true);
|
||||||
|
}
|
||||||
|
return sendSuccess(res, false);
|
||||||
|
};
|
||||||
|
|
||||||
// 登录
|
// 登录
|
||||||
export const LoginHandler: RequestHandler = async (req, res) => {
|
export const LoginHandler: RequestHandler = async (req, res) => {
|
||||||
// 获取WebUI配置
|
// 获取WebUI配置
|
||||||
@@ -93,7 +102,7 @@ export const UpdateTokenHandler: RequestHandler = async (req, res) => {
|
|||||||
try {
|
try {
|
||||||
// 注销当前的Token
|
// 注销当前的Token
|
||||||
if (authorization) {
|
if (authorization) {
|
||||||
const CredentialBase64: string = authorization.split(' ')[1];
|
const CredentialBase64: string = authorization.split(' ')[1] as string;
|
||||||
const Credential = JSON.parse(Buffer.from(CredentialBase64, 'base64').toString());
|
const Credential = JSON.parse(Buffer.from(CredentialBase64, 'base64').toString());
|
||||||
AuthHelper.revokeCredential(Credential);
|
AuthHelper.revokeCredential(Credential);
|
||||||
}
|
}
|
||||||
|
@@ -3,7 +3,8 @@ import { sendError, sendSuccess } from '../utils/response';
|
|||||||
import { WebUiConfigWrapper } from '../helper/config';
|
import { WebUiConfigWrapper } from '../helper/config';
|
||||||
import { logSubscription } from '@/common/log';
|
import { logSubscription } from '@/common/log';
|
||||||
import { terminalManager } from '../terminal/terminal_manager';
|
import { terminalManager } from '../terminal/terminal_manager';
|
||||||
|
// 判断是否是 macos
|
||||||
|
const isMacOS = process.platform === 'darwin';
|
||||||
// 日志记录
|
// 日志记录
|
||||||
export const LogHandler: RequestHandler = async (req, res) => {
|
export const LogHandler: RequestHandler = async (req, res) => {
|
||||||
const filename = req.query['id'];
|
const filename = req.query['id'];
|
||||||
@@ -43,6 +44,9 @@ export const LogRealTimeHandler: RequestHandler = async (req, res) => {
|
|||||||
|
|
||||||
// 终端相关处理器
|
// 终端相关处理器
|
||||||
export const CreateTerminalHandler: RequestHandler = async (req, res) => {
|
export const CreateTerminalHandler: RequestHandler = async (req, res) => {
|
||||||
|
if (isMacOS) {
|
||||||
|
return sendError(res, 'MacOS不支持终端');
|
||||||
|
}
|
||||||
try {
|
try {
|
||||||
const { cols, rows } = req.body;
|
const { cols, rows } = req.body;
|
||||||
const { id } = terminalManager.createTerminal(cols, rows);
|
const { id } = terminalManager.createTerminal(cols, rows);
|
||||||
|
@@ -1,6 +1,12 @@
|
|||||||
import { Router } from 'express';
|
import { Router } from 'express';
|
||||||
|
|
||||||
import { checkHandler, LoginHandler, LogoutHandler, UpdateTokenHandler } from '@webapi/api/Auth';
|
import {
|
||||||
|
CheckDefaultTokenHandler,
|
||||||
|
checkHandler,
|
||||||
|
LoginHandler,
|
||||||
|
LogoutHandler,
|
||||||
|
UpdateTokenHandler,
|
||||||
|
} from '@webapi/api/Auth';
|
||||||
|
|
||||||
const router = Router();
|
const router = Router();
|
||||||
// router:登录
|
// router:登录
|
||||||
@@ -11,5 +17,7 @@ router.post('/check', checkHandler);
|
|||||||
router.post('/logout', LogoutHandler);
|
router.post('/logout', LogoutHandler);
|
||||||
// router:更新token
|
// router:更新token
|
||||||
router.post('/update_token', UpdateTokenHandler);
|
router.post('/update_token', UpdateTokenHandler);
|
||||||
|
// router:检查默认token
|
||||||
|
router.get('/check_using_default_token', CheckDefaultTokenHandler);
|
||||||
|
|
||||||
export { router as AuthRouter };
|
export { router as AuthRouter };
|
||||||
|
Reference in New Issue
Block a user