diff --git a/common/constants.go b/common/constants.go index 26684e3..55cc793 100644 --- a/common/constants.go +++ b/common/constants.go @@ -82,6 +82,9 @@ var WeChatAccountQRCodeImageURL = "" var TurnstileSiteKey = "" var TurnstileSecretKey = "" +var TelegramBotToken = "" +var TelegramBotName = "" + var QuotaForNewUser = 0 var QuotaForInviter = 0 var QuotaForInvitee = 0 diff --git a/docker-compose.yml b/docker-compose.yml index 40da248..403f372 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -12,7 +12,7 @@ services: - ./data:/data - ./logs:/app/logs environment: - - SQL_DSN=root:123456@tcp(host.docker.internal:3306)/new-api # 修改此行,或注释掉以使用 SQLite 作为数据库 + # - SQL_DSN=root:123456@tcp(host.docker.internal:3306)/new-api # 修改此行,或注释掉以使用 SQLite 作为数据库 - REDIS_CONN_STRING=redis://redis - SESSION_SECRET=random_string # 修改为随机字符串 - TZ=Asia/Shanghai diff --git a/makefile b/makefile new file mode 100644 index 0000000..1df2b5c --- /dev/null +++ b/makefile @@ -0,0 +1,17 @@ +FRONTEND_DIR = ./web +BACKEND_DIR = . + +.PHONY: all start-frontend start-backend + +all: start-frontend start-backend + +# 启动前端开发服务器 +start-frontend: + @echo "Starting frontend dev server..." + @cd $(FRONTEND_DIR) && npm start & + +# 启动后端开发服务器 +start-backend: + @echo "Starting backend dev server..." + @cd $(BACKEND_DIR) && go run main.go & + diff --git a/model/option.go b/model/option.go index a651b85..dcb4c34 100644 --- a/model/option.go +++ b/model/option.go @@ -215,6 +215,10 @@ func updateOptionMap(key string, value string) (err error) { common.WeChatServerToken = value case "WeChatAccountQRCodeImageURL": common.WeChatAccountQRCodeImageURL = value + case "TelegramBotToken": + common.TelegramBotToken = value + case "TelegramBotName": + common.TelegramBotName = value case "TurnstileSiteKey": common.TurnstileSiteKey = value case "TurnstileSecretKey": diff --git a/web/src/components/SystemSetting.js b/web/src/components/SystemSetting.js index 197050e..a8956b7 100644 --- a/web/src/components/SystemSetting.js +++ b/web/src/components/SystemSetting.js @@ -1,6 +1,6 @@ -import React, {useEffect, useState} from 'react'; -import {Button, Divider, Form, Grid, Header, Modal, Message} from 'semantic-ui-react'; -import {API, removeTrailingSlash, showError, verifyJSON} from '../helpers'; +import React, { useEffect, useState } from 'react'; +import { Button, Divider, Form, Grid, Header, Modal, Message } from 'semantic-ui-react'; +import { API, removeTrailingSlash, showError, verifyJSON } from '../helpers'; const SystemSetting = () => { let [inputs, setInputs] = useState({ @@ -32,7 +32,11 @@ const SystemSetting = () => { TurnstileSecretKey: '', RegisterEnabled: '', EmailDomainRestrictionEnabled: '', - EmailDomainWhitelist: '' + EmailDomainWhitelist: '', + // telegram login + TelegramLoginEnabled: '', + TelegramBotToken: '', + TelegramBotName: '', }); const [originInputs, setOriginInputs] = useState({}); let [loading, setLoading] = useState(false); @@ -42,7 +46,7 @@ const SystemSetting = () => { const getOptions = async () => { const res = await API.get('/api/option/'); - const {success, message, data} = res.data; + const { success, message, data } = res.data; if (success) { let newInputs = {}; data.forEach((item) => { @@ -58,7 +62,7 @@ const SystemSetting = () => { setOriginInputs(newInputs); setEmailDomainWhitelist(newInputs.EmailDomainWhitelist.split(',').map((item) => { - return {key: item, text: item, value: item}; + return { key: item, text: item, value: item }; })); } else { showError(message); @@ -77,6 +81,7 @@ const SystemSetting = () => { case 'EmailVerificationEnabled': case 'GitHubOAuthEnabled': case 'WeChatAuthEnabled': + case 'TelegramLoginEnabled': case 'TurnstileCheckEnabled': case 'EmailDomainRestrictionEnabled': case 'RegisterEnabled': @@ -89,7 +94,7 @@ const SystemSetting = () => { key, value }); - const {success, message} = res.data; + const { success, message } = res.data; if (success) { if (key === 'EmailDomainWhitelist') { value = value.split(','); @@ -106,7 +111,7 @@ const SystemSetting = () => { setLoading(false); }; - const handleInputChange = async (e, {name, value}) => { + const handleInputChange = async (e, { name, value }) => { if (name === 'PasswordLoginEnabled' && inputs[name] === 'true') { // block disabling password login setShowPasswordWarningModal(true); @@ -130,7 +135,7 @@ const SystemSetting = () => { name === 'EmailDomainWhitelist' || name === 'TopupGroupRatio' ) { - setInputs((inputs) => ({...inputs, [name]: value})); + setInputs((inputs) => ({ ...inputs, [name]: value })); } else { await updateOption(name, value); } @@ -234,6 +239,12 @@ const SystemSetting = () => { } }; + const submitTelegramSettings = async () => { + await updateOption('TelegramLoginEnabled', inputs.TelegramLoginEnabled); + await updateOption('TelegramBotToken', inputs.TelegramBotToken); + await updateOption('TelegramBotName', inputs.TelegramBotName); + }; + const submitTurnstile = async () => { if (originInputs['TurnstileSiteKey'] !== inputs.TurnstileSiteKey) { await updateOption('TurnstileSiteKey', inputs.TurnstileSiteKey); @@ -279,7 +290,7 @@ const SystemSetting = () => {