diff --git a/server/admin/app/ra/App.tsx b/server/admin/app/ra/App.tsx
index 05808df5..150e7946 100644
--- a/server/admin/app/ra/App.tsx
+++ b/server/admin/app/ra/App.tsx
@@ -18,6 +18,7 @@ import { TailchatLayout } from './layout';
import { i18nProvider } from './i18n/index';
import { httpClient } from './request';
import { SocketIOAdmin } from './routes/socketio';
+import { SystemConfig } from './routes/system';
const dataProvider = jsonServerProvider(
// 'https://jsonplaceholder.typicode.com'
@@ -65,6 +66,7 @@ export const App = () => (
{/* 添加完毕以后还需要到 layout/Menu 增加侧边栏 */}
+ } />
} />
} />
diff --git a/server/admin/app/ra/i18n/custom.ts b/server/admin/app/ra/i18n/custom.ts
index 61ee9f04..26583849 100644
--- a/server/admin/app/ra/i18n/custom.ts
+++ b/server/admin/app/ra/i18n/custom.ts
@@ -11,6 +11,7 @@ export const englishCustom = {
menu: {
network: 'Tailchat Network',
socket: 'Socket.IO TCP',
+ system: 'System Config',
},
dashboard: {
welcomeTitle: 'Welcome to Tailchat Admin',
@@ -61,6 +62,10 @@ export const englishCustom = {
tip2: 'The account password is the account password of Tailchat Admin',
btn: 'Open the Admin platform',
},
+ config: {
+ uploadFileLimit: 'Upload file limit (KB)',
+ emailVerification: 'Mandatory Email Verification',
+ },
},
};
@@ -77,6 +82,7 @@ export const chineseCustom = {
menu: {
network: 'Tailchat 网络',
socket: 'Socket.IO 长链接',
+ system: '系统设置',
},
dashboard: {
welcomeTitle: '欢迎使用 Tailchat 后台管理程序',
@@ -125,5 +131,9 @@ export const chineseCustom = {
tip2: '账号密码为Tailchat后台的账号密码',
btn: '打开管理平台',
},
+ config: {
+ uploadFileLimit: '上传文件限制(KB)',
+ emailVerification: '邮箱强制验证',
+ },
},
};
diff --git a/server/admin/app/ra/layout/Menu.tsx b/server/admin/app/ra/layout/Menu.tsx
index e6753472..1a286ad5 100644
--- a/server/admin/app/ra/layout/Menu.tsx
+++ b/server/admin/app/ra/layout/Menu.tsx
@@ -8,6 +8,7 @@ import {
} from 'react-admin';
import FilterDramaIcon from '@mui/icons-material/FilterDrama';
import LinkIcon from '@mui/icons-material/Link';
+import SettingsIcon from '@mui/icons-material/Settings';
export const TailchatMenu: React.FC = React.memo((props) => {
const resources = useResourceDefinitions();
@@ -21,6 +22,12 @@ export const TailchatMenu: React.FC = React.memo((props) => {
.filter((name) => resources[name].hasList)
.map((name) => )}
+ }
+ />
+
{
+ const translate = useTranslate();
+ const { data: config, loading } = useRequest(async () => {
+ const { data } = await request('/config/client');
+
+ return data.config ?? {};
+ });
+
+ if (loading) {
+ return ;
+ }
+
+ return (
+
+
+
+ {translate('custom.config.uploadFileLimit')}
+
+
+ {config.uploadFileLimit}
+
+
+
+
+ {translate('custom.config.emailVerification')}
+
+
+ {config.emailVerification ? (
+
+ ) : (
+
+ )}
+
+
+
+ );
+});
+SystemConfig.displayName = 'SystemConfig';
diff --git a/server/admin/app/server/router/api.ts b/server/admin/app/server/router/api.ts
index 5afe6b8e..15b36b12 100644
--- a/server/admin/app/server/router/api.ts
+++ b/server/admin/app/server/router/api.ts
@@ -3,6 +3,7 @@ import raExpressMongoose from 'express-mongoose-ra-json-server';
import jwt from 'jsonwebtoken';
import { call } from '../broker';
import { adminAuth, auth, authSecret } from '../middleware/auth';
+import { configRouter } from './config';
import { networkRouter } from './network';
const router = Router();
@@ -39,6 +40,7 @@ router.post('/login', (req, res) => {
});
router.use('/network', networkRouter);
+router.use('/config', configRouter);
router.use(
'/users',
diff --git a/server/admin/app/server/router/config.ts b/server/admin/app/server/router/config.ts
new file mode 100644
index 00000000..992ffdac
--- /dev/null
+++ b/server/admin/app/server/router/config.ts
@@ -0,0 +1,19 @@
+/**
+ * Network 相关接口
+ */
+
+import { Router } from 'express';
+import { broker } from '../broker';
+import { auth } from '../middleware/auth';
+
+const router = Router();
+
+router.get('/client', auth(), async (req, res) => {
+ const config = await broker.call('config.client');
+
+ res.json({
+ config,
+ });
+});
+
+export { router as configRouter };