From 8e678637fb0ee951da1e4f3a402069a073948f42 Mon Sep 17 00:00:00 2001 From: Zhang Minghan Date: Fri, 19 Jan 2024 13:09:58 +0800 Subject: [PATCH] feat: support initial user quota (#41) --- app/src/admin/api/system.ts | 10 ++++++ app/src/assets/ui.less | 14 ++++++++ app/src/components/Paragraph.tsx | 8 ++++- app/src/resources/i18n/cn.json | 7 +++- app/src/resources/i18n/en.json | 7 +++- app/src/resources/i18n/ja.json | 7 +++- app/src/resources/i18n/ru.json | 7 +++- app/src/routes/admin/System.tsx | 62 ++++++++++++++++++++++++++++++++ app/src/utils/form.ts | 12 ++++--- auth/auth.go | 3 ++ auth/quota.go | 12 ++++++- channel/system.go | 29 ++++++++++----- 12 files changed, 159 insertions(+), 19 deletions(-) diff --git a/app/src/admin/api/system.ts b/app/src/admin/api/system.ts index 5273d98..0963222 100644 --- a/app/src/admin/api/system.ts +++ b/app/src/admin/api/system.ts @@ -23,8 +23,14 @@ export type SearchState = { query: number; }; +export type SiteState = { + quota: number; + announcement: string; +}; + export type SystemProps = { general: GeneralState; + site: SiteState; mail: MailState; search: SearchState; }; @@ -70,6 +76,10 @@ export const initialSystemState: SystemProps = { docs: "", file: "", }, + site: { + quota: 0, + announcement: "", + }, mail: { host: "", port: 465, diff --git a/app/src/assets/ui.less b/app/src/assets/ui.less index 34aaefb..1658fd6 100644 --- a/app/src/assets/ui.less +++ b/app/src/assets/ui.less @@ -218,6 +218,20 @@ input[type="number"] { align-items: center; font-size: 0.9rem; + &.row-layout { + align-items: flex-start !important; + flex-direction: column !important; + + & > * { + margin-right: 0 !important; + margin-bottom: 0.75rem; + + &:last-child { + margin-bottom: 0; + } + } + } + label { font-size: 0.9rem; font-weight: normal; diff --git a/app/src/components/Paragraph.tsx b/app/src/components/Paragraph.tsx index 98d64c1..32c0bb7 100644 --- a/app/src/components/Paragraph.tsx +++ b/app/src/components/Paragraph.tsx @@ -71,11 +71,17 @@ function Paragraph({ function ParagraphItem({ children, className, + rowLayout, }: { children: React.ReactNode; className?: string; + rowLayout?: boolean; }) { - return
{children}
; + return ( +
+ {children} +
+ ); } export function ParagraphDescription({ children }: { children: string }) { diff --git a/app/src/resources/i18n/cn.json b/app/src/resources/i18n/cn.json index d6b8e65..14c69ac 100644 --- a/app/src/resources/i18n/cn.json +++ b/app/src/resources/i18n/cn.json @@ -507,6 +507,7 @@ "system": { "general": "常规设置", "search": "联网搜索", + "site": "站点设置", "mail": "SMTP 发件设置", "save": "保存", "updateRoot": "修改 Root 密码", @@ -533,7 +534,11 @@ "mailFrom": "发件人", "searchEndpoint": "搜索接入点", "searchQuery": "最大搜索结果数", - "searchTip": "DuckDuckGo 搜索接入点,如不填写自动使用 WebPilot 和 New Bing 逆向进行搜索功能(速度较慢)。\nDuckDuckGo API 项目搭建:[duckduckgo-api](https://github.com/binjie09/duckduckgo-api)。" + "searchTip": "DuckDuckGo 搜索接入点,如不填写自动使用 WebPilot 和 New Bing 逆向进行搜索功能(速度较慢)。\nDuckDuckGo API 项目搭建:[duckduckgo-api](https://github.com/binjie09/duckduckgo-api)。", + "quota": "用户初始点数", + "quotaTip": "用户注册后赠送的点数", + "announcement": "站点公告", + "announcementPlaceholder": "请输入站点公告 (支持 Markdown / HTML 格式)" }, "logger": { "title": "服务日志", diff --git a/app/src/resources/i18n/en.json b/app/src/resources/i18n/en.json index e4ff906..040f770 100644 --- a/app/src/resources/i18n/en.json +++ b/app/src/resources/i18n/en.json @@ -433,7 +433,12 @@ "docsTip": "Document link, leave blank for default https://docs.chatnio.net", "file": "File Parsing Service", "filePlaceholder": "File parsing service, leave blank for default https://blob.chatnio.net (stability not guaranteed)", - "fileTip": "For file parsing services, please refer to the [chatnio-blob-service] (https://github.com/Deeptrain-Community/chatnio-blob-service) project to build." + "fileTip": "For file parsing services, please refer to the [chatnio-blob-service] (https://github.com/Deeptrain-Community/chatnio-blob-service) project to build.", + "site": "Site Ayarları", + "quota": "User Initial Points", + "quotaTip": "Credits given after user registration", + "announcement": "Site Announcement", + "announcementPlaceholder": "Please enter a site announcement (Markdown/HTML format supported)" }, "user": "User Management", "invitation-code": "Invitation Code", diff --git a/app/src/resources/i18n/ja.json b/app/src/resources/i18n/ja.json index d52bf5f..a7a8ae7 100644 --- a/app/src/resources/i18n/ja.json +++ b/app/src/resources/i18n/ja.json @@ -433,7 +433,12 @@ "docsTip": "ドキュメントリンク、デフォルトの場合は空白のままhttps://docs.chatnio.net", "file": "ファイル解析サービス", "filePlaceholder": "ファイル解析サービス、デフォルトの場合は空白のままhttps://blob.chatnio.net (安定性は保証されていません)", - "fileTip": "ファイル解析サービスについては、[chatnio-blob-service ]( https://github.com/Deeptrain-Community/chatnio-blob-service)プロジェクトを参照して構築してください。" + "fileTip": "ファイル解析サービスについては、[chatnio-blob-service ]( https://github.com/Deeptrain-Community/chatnio-blob-service)プロジェクトを参照して構築してください。", + "site": "サイト設定", + "quota": "ユーザーの初期ポイント", + "quotaTip": "ユーザー登録後に付与されたクレジット", + "announcement": "サイトのお知らせ", + "announcementPlaceholder": "サイトのお知らせを入力してください( Markdown/HTML形式に対応)" }, "user": "ユーザー管理", "invitation-code": "招待コード", diff --git a/app/src/resources/i18n/ru.json b/app/src/resources/i18n/ru.json index 4bce37f..7babadc 100644 --- a/app/src/resources/i18n/ru.json +++ b/app/src/resources/i18n/ru.json @@ -433,7 +433,12 @@ "docsTip": "Ссылка на документ, оставьте пустым для по умолчанию https://docs.chatnio.net", "file": "Служба разбора файлов", "filePlaceholder": "Служба разбора файлов, оставьте пустым для по умолчанию https://blob.chatnio.net (стабильность не гарантируется)", - "fileTip": "Для получения услуг по разбору файлов обратитесь к проекту [chatnio-blob-service] (https://github.com/Deeptrain-Community/chatnio-blob-service) для сборки." + "fileTip": "Для получения услуг по разбору файлов обратитесь к проекту [chatnio-blob-service] (https://github.com/Deeptrain-Community/chatnio-blob-service) для сборки.", + "site": "Настройки сайта", + "quota": "Начальные точки пользователя", + "quotaTip": "Кредиты, предоставленные после регистрации пользователя", + "announcement": "Объявление о площадке", + "announcementPlaceholder": "Введите объявление сайта (поддерживается формат Markdown/HTML)" }, "user": "Управление пользователями", "invitation-code": "Код приглашения", diff --git a/app/src/routes/admin/System.tsx b/app/src/routes/admin/System.tsx index c4d1896..8fe3c42 100644 --- a/app/src/routes/admin/System.tsx +++ b/app/src/routes/admin/System.tsx @@ -23,6 +23,7 @@ import { MailState, SearchState, setConfig, + SiteState, SystemProps, updateRootPassword, } from "@/admin/api/system.ts"; @@ -41,6 +42,8 @@ import { import { DialogTitle } from "@radix-ui/react-dialog"; import Require from "@/components/Require.tsx"; import { Loader2 } from "lucide-react"; +import { Textarea } from "@/components/ui/textarea.tsx"; +import Tips from "@/components/Tips.tsx"; type CompProps = { data: T; @@ -366,6 +369,64 @@ function Mail({ data, dispatch, onChange }: CompProps) { ); } +function Site({ data, dispatch, onChange }: CompProps) { + const { t } = useTranslation(); + + // export type SiteState = { + // quota: number; + // announcement: string; + // } + + return ( + + + + + dispatch({ type: "update:site.quota", value }) + } + placeholder={`5`} + min={0} + /> + + + +