Merge pull request #564 from Licoy/main

优化页面组件大小规格一致
This commit is contained in:
Calcium-Ion 2024-11-12 22:39:34 +08:00 committed by GitHub
commit 8baeece386
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
14 changed files with 337 additions and 328 deletions

View File

@ -144,11 +144,13 @@ var (
// All duration's unit is seconds // All duration's unit is seconds
// Shouldn't larger then RateLimitKeyExpirationDuration // Shouldn't larger then RateLimitKeyExpirationDuration
var ( var (
GlobalApiRateLimitEnable = GetEnvOrDefaultBool("GLOBAL_API_RATE_LIMIT_ENABLE", true)
GlobalApiRateLimitNum = GetEnvOrDefault("GLOBAL_API_RATE_LIMIT", 180) GlobalApiRateLimitNum = GetEnvOrDefault("GLOBAL_API_RATE_LIMIT", 180)
GlobalApiRateLimitDuration int64 = 3 * 60 GlobalApiRateLimitDuration = int64(GetEnvOrDefault("GLOBAL_API_RATE_LIMIT_DURATION", 180))
GlobalWebRateLimitEnable = GetEnvOrDefaultBool("GLOBAL_WEB_RATE_LIMIT_ENABLE", true)
GlobalWebRateLimitNum = GetEnvOrDefault("GLOBAL_WEB_RATE_LIMIT", 60) GlobalWebRateLimitNum = GetEnvOrDefault("GLOBAL_WEB_RATE_LIMIT", 60)
GlobalWebRateLimitDuration int64 = 3 * 60 GlobalWebRateLimitDuration = int64(GetEnvOrDefault("GLOBAL_WEB_RATE_LIMIT_DURATION", 180))
UploadRateLimitNum = 10 UploadRateLimitNum = 10
UploadRateLimitDuration int64 = 60 UploadRateLimitDuration int64 = 60

View File

@ -13,6 +13,10 @@ var timeFormat = "2006-01-02T15:04:05.000Z"
var inMemoryRateLimiter common.InMemoryRateLimiter var inMemoryRateLimiter common.InMemoryRateLimiter
var defNext = func(c *gin.Context) {
c.Next()
}
func redisRateLimiter(c *gin.Context, maxRequestNum int, duration int64, mark string) { func redisRateLimiter(c *gin.Context, maxRequestNum int, duration int64, mark string) {
ctx := context.Background() ctx := context.Background()
rdb := common.RDB rdb := common.RDB
@ -83,12 +87,18 @@ func rateLimitFactory(maxRequestNum int, duration int64, mark string) func(c *gi
} }
func GlobalWebRateLimit() func(c *gin.Context) { func GlobalWebRateLimit() func(c *gin.Context) {
if common.GlobalWebRateLimitEnable {
return rateLimitFactory(common.GlobalWebRateLimitNum, common.GlobalWebRateLimitDuration, "GW") return rateLimitFactory(common.GlobalWebRateLimitNum, common.GlobalWebRateLimitDuration, "GW")
} }
return defNext
}
func GlobalAPIRateLimit() func(c *gin.Context) { func GlobalAPIRateLimit() func(c *gin.Context) {
if common.GlobalApiRateLimitEnable {
return rateLimitFactory(common.GlobalApiRateLimitNum, common.GlobalApiRateLimitDuration, "GA") return rateLimitFactory(common.GlobalApiRateLimitNum, common.GlobalApiRateLimitDuration, "GA")
} }
return defNext
}
func CriticalRateLimit() func(c *gin.Context) { func CriticalRateLimit() func(c *gin.Context) {
return rateLimitFactory(common.CriticalRateLimitNum, common.CriticalRateLimitDuration, "CT") return rateLimitFactory(common.CriticalRateLimitNum, common.CriticalRateLimitDuration, "CT")

View File

@ -17,7 +17,7 @@ import {
renderQuota, renderQuota,
} from '../helpers/render'; } from '../helpers/render';
import { import {
Button, Button, Divider,
Dropdown, Dropdown,
Form, Form,
InputNumber, InputNumber,
@ -764,9 +764,18 @@ const ChannelsTable = () => {
</Space> </Space>
</div> </div>
</Form> </Form>
<div style={{ marginTop: 10, display: 'flex' }}> <Divider style={{marginBottom:15}}/>
<Space> <div
<Space> style={{
display: isMobile() ? '' : 'flex',
marginTop: isMobile() ? 0 : -45,
zIndex: 999,
pointerEvents: 'none',
}}
>
<Space
style={{pointerEvents: 'auto', marginTop: isMobile() ? 0 : 45}}
>
<Typography.Text strong>使用ID排序</Typography.Text> <Typography.Text strong>使用ID排序</Typography.Text>
<Switch <Switch
checked={idSort} checked={idSort}
@ -783,52 +792,6 @@ const ChannelsTable = () => {
}); });
}} }}
></Switch> ></Switch>
</Space>
</Space>
</div>
<Table
className={'channel-table'}
style={{ marginTop: 15 }}
columns={columns}
dataSource={pageData}
pagination={{
currentPage: activePage,
pageSize: pageSize,
total: channelCount,
pageSizeOpts: [10, 20, 50, 100],
showSizeChanger: true,
formatPageText: (page) => '',
onPageSizeChange: (size) => {
handlePageSizeChange(size).then();
},
onPageChange: handlePageChange,
}}
loading={loading}
onRow={handleRow}
rowSelection={
enableBatchDelete
? {
onChange: (selectedRowKeys, selectedRows) => {
// console.log(`selectedRowKeys: ${selectedRowKeys}`, 'selectedRows: ', selectedRows);
setSelectedChannels(selectedRows);
},
}
: null
}
/>
<div
style={{
display: isMobile() ? '' : 'flex',
marginTop: isMobile() ? 0 : -45,
zIndex: 999,
position: 'relative',
pointerEvents: 'none',
}}
>
<Space
style={{ pointerEvents: 'auto', marginTop: isMobile() ? 0 : 45 }}
>
<Button <Button
theme='light' theme='light'
type='primary' type='primary'
@ -881,9 +844,6 @@ const ChannelsTable = () => {
刷新 刷新
</Button> </Button>
</Space> </Space>
{/*<div style={{width: '100%', pointerEvents: 'none', position: 'absolute'}}>*/}
{/*</div>*/}
</div> </div>
<div style={{marginTop: 20}}> <div style={{marginTop: 20}}>
<Space> <Space>
@ -926,6 +886,37 @@ const ChannelsTable = () => {
</Popconfirm> </Popconfirm>
</Space> </Space>
</div> </div>
<Table
className={'channel-table'}
style={{marginTop: 15}}
columns={columns}
dataSource={pageData}
pagination={{
currentPage: activePage,
pageSize: pageSize,
total: channelCount,
pageSizeOpts: [10, 20, 50, 100],
showSizeChanger: true,
formatPageText: (page) => '',
onPageSizeChange: (size) => {
handlePageSizeChange(size).then();
},
onPageChange: handlePageChange,
}}
loading={loading}
onRow={handleRow}
rowSelection={
enableBatchDelete
? {
onChange: (selectedRowKeys, selectedRows) => {
// console.log(`selectedRowKeys: ${selectedRowKeys}`, 'selectedRows: ', selectedRows);
setSelectedChannels(selectedRows);
},
}
: null
}
/>
</> </>
); );
}; };

View File

@ -767,6 +767,22 @@ const LogsTable = () => {
<Form.Section></Form.Section> <Form.Section></Form.Section>
</> </>
</Form> </Form>
<div style={{marginTop:10}}>
<Select
defaultValue='0'
style={{ width: 120 }}
onChange={(value) => {
setLogType(parseInt(value));
loadLogs(0, pageSize, parseInt(value));
}}
>
<Select.Option value='0'>全部</Select.Option>
<Select.Option value='1'>充值</Select.Option>
<Select.Option value='2'>消费</Select.Option>
<Select.Option value='3'>管理</Select.Option>
<Select.Option value='4'>系统</Select.Option>
</Select>
</div>
<Table <Table
style={{ marginTop: 5 }} style={{ marginTop: 5 }}
columns={columns} columns={columns}
@ -786,20 +802,6 @@ const LogsTable = () => {
onPageChange: handlePageChange, onPageChange: handlePageChange,
}} }}
/> />
<Select
defaultValue='0'
style={{ width: 120 }}
onChange={(value) => {
setLogType(parseInt(value));
loadLogs(0, pageSize, parseInt(value));
}}
>
<Select.Option value='0'>全部</Select.Option>
<Select.Option value='1'>充值</Select.Option>
<Select.Option value='2'>消费</Select.Option>
<Select.Option value='3'>管理</Select.Option>
<Select.Option value='4'>系统</Select.Option>
</Select>
</Layout> </Layout>
</> </>
); );

View File

@ -10,7 +10,7 @@ import {
import { ITEMS_PER_PAGE } from '../constants'; import { ITEMS_PER_PAGE } from '../constants';
import { renderQuota } from '../helpers/render'; import { renderQuota } from '../helpers/render';
import { import {
Button, Button, Divider,
Form, Form,
Modal, Modal,
Popconfirm, Popconfirm,
@ -391,29 +391,8 @@ const RedemptionsTable = () => {
onChange={handleKeywordChange} onChange={handleKeywordChange}
/> />
</Form> </Form>
<Divider style={{margin:'5px 0 15px 0'}}/>
<Table <div>
style={{ marginTop: 20 }}
columns={columns}
dataSource={pageData}
pagination={{
currentPage: activePage,
pageSize: ITEMS_PER_PAGE,
total: tokenCount,
// showSizeChanger: true,
// pageSizeOptions: [10, 20, 50, 100],
formatPageText: (page) =>
`${page.currentStart} - ${page.currentEnd} 条,共 ${redemptions.length}`,
// onPageSizeChange: (size) => {
// setPageSize(size);
// setActivePage(1);
// },
onPageChange: handlePageChange,
}}
loading={loading}
rowSelection={rowSelection}
onRow={handleRow}
></Table>
<Button <Button
theme='light' theme='light'
type='primary' type='primary'
@ -444,6 +423,30 @@ const RedemptionsTable = () => {
> >
复制所选兑换码到剪贴板 复制所选兑换码到剪贴板
</Button> </Button>
</div>
<Table
style={{ marginTop: 20 }}
columns={columns}
dataSource={pageData}
pagination={{
currentPage: activePage,
pageSize: ITEMS_PER_PAGE,
total: tokenCount,
// showSizeChanger: true,
// pageSizeOptions: [10, 20, 50, 100],
formatPageText: (page) =>
`${page.currentStart} - ${page.currentEnd} 条,共 ${redemptions.length}`,
// onPageSizeChange: (size) => {
// setPageSize(size);
// setActivePage(1);
// },
onPageChange: handlePageChange,
}}
loading={loading}
rowSelection={rowSelection}
onRow={handleRow}
></Table>
</> </>
); );
}; };

View File

@ -10,7 +10,7 @@ import {
import { ITEMS_PER_PAGE } from '../constants'; import { ITEMS_PER_PAGE } from '../constants';
import {renderGroup, renderQuota} from '../helpers/render'; import {renderGroup, renderQuota} from '../helpers/render';
import { import {
Button, Button, Divider,
Dropdown, Dropdown,
Form, Form,
Modal, Modal,
@ -596,29 +596,8 @@ const TokensTable = () => {
查询 查询
</Button> </Button>
</Form> </Form>
<Divider style={{margin:'15px 0'}}/>
<Table <div>
style={{ marginTop: 20 }}
columns={columns}
dataSource={pageData}
pagination={{
currentPage: activePage,
pageSize: pageSize,
total: tokenCount,
showSizeChanger: true,
pageSizeOptions: [10, 20, 50, 100],
formatPageText: (page) =>
`${page.currentStart} - ${page.currentEnd} 条,共 ${tokens.length}`,
onPageSizeChange: (size) => {
setPageSize(size);
setActivePage(1);
},
onPageChange: handlePageChange,
}}
loading={loading}
rowSelection={rowSelection}
onRow={handleRow}
></Table>
<Button <Button
theme='light' theme='light'
type='primary' type='primary'
@ -650,6 +629,30 @@ const TokensTable = () => {
> >
复制所选令牌到剪贴板 复制所选令牌到剪贴板
</Button> </Button>
</div>
<Table
style={{ marginTop: 20 }}
columns={columns}
dataSource={pageData}
pagination={{
currentPage: activePage,
pageSize: pageSize,
total: tokenCount,
showSizeChanger: true,
pageSizeOptions: [10, 20, 50, 100],
formatPageText: (page) =>
`${page.currentStart} - ${page.currentEnd} 条,共 ${tokens.length}`,
onPageSizeChange: (size) => {
setPageSize(size);
setActivePage(1);
},
onPageChange: handlePageChange,
}}
loading={loading}
rowSelection={rowSelection}
onRow={handleRow}
></Table>
</> </>
); );
}; };

View File

@ -476,10 +476,18 @@ const UsersTable = () => {
type='primary' type='primary'
htmlType='submit' htmlType='submit'
className='btn-margin-right' className='btn-margin-right'
style={{ marginRight: 8 }}
> >
查询 查询
</Button> </Button>
<Button
theme='light'
type='primary'
onClick={() => {
setShowAddUser(true);
}}
>
添加用户
</Button>
</Space> </Space>
</div> </div>
</Form> </Form>
@ -496,16 +504,6 @@ const UsersTable = () => {
}} }}
loading={loading} loading={loading}
/> />
<Button
theme='light'
type='primary'
style={{ marginRight: 8 }}
onClick={() => {
setShowAddUser(true);
}}
>
添加用户
</Button>
</> </>
); );
}; };

View File

@ -144,7 +144,7 @@ export default function SettingsCreditLimit(props) {
</Row> </Row>
<Row> <Row>
<Button size='large' onClick={onSubmit}> <Button size='default' onClick={onSubmit}>
保存额度设置 保存额度设置
</Button> </Button>
</Row> </Row>

View File

@ -87,7 +87,7 @@ export default function DataDashboard(props) {
<Form.Switch <Form.Switch
field={'DataExportEnabled'} field={'DataExportEnabled'}
label={'启用数据看板(实验性)'} label={'启用数据看板(实验性)'}
size='large' size='default'
checkedText='' checkedText=''
uncheckedText='' uncheckedText=''
onChange={(value) => { onChange={(value) => {
@ -135,7 +135,7 @@ export default function DataDashboard(props) {
</Col> </Col>
</Row> </Row>
<Row> <Row>
<Button size='large' onClick={onSubmit}> <Button size='default' onClick={onSubmit}>
保存数据看板设置 保存数据看板设置
</Button> </Button>
</Row> </Row>

View File

@ -81,7 +81,7 @@ export default function SettingsDrawing(props) {
<Form.Switch <Form.Switch
field={'DrawingEnabled'} field={'DrawingEnabled'}
label={'启用绘图功能'} label={'启用绘图功能'}
size='large' size='default'
checkedText='' checkedText=''
uncheckedText='' uncheckedText=''
onChange={(value) => { onChange={(value) => {
@ -96,7 +96,7 @@ export default function SettingsDrawing(props) {
<Form.Switch <Form.Switch
field={'MjNotifyEnabled'} field={'MjNotifyEnabled'}
label={'允许回调(会泄露服务器 IP 地址)'} label={'允许回调(会泄露服务器 IP 地址)'}
size='large' size='default'
checkedText='' checkedText=''
uncheckedText='' uncheckedText=''
onChange={(value) => onChange={(value) =>
@ -111,7 +111,7 @@ export default function SettingsDrawing(props) {
<Form.Switch <Form.Switch
field={'MjAccountFilterEnabled'} field={'MjAccountFilterEnabled'}
label={'允许 AccountFilter 参数'} label={'允许 AccountFilter 参数'}
size='large' size='default'
checkedText='' checkedText=''
uncheckedText='' uncheckedText=''
onChange={(value) => onChange={(value) =>
@ -126,7 +126,7 @@ export default function SettingsDrawing(props) {
<Form.Switch <Form.Switch
field={'MjForwardUrlEnabled'} field={'MjForwardUrlEnabled'}
label={'开启之后将上游地址替换为服务器地址'} label={'开启之后将上游地址替换为服务器地址'}
size='large' size='default'
checkedText='' checkedText=''
uncheckedText='' uncheckedText=''
onChange={(value) => onChange={(value) =>
@ -146,7 +146,7 @@ export default function SettingsDrawing(props) {
<Tag>--relax</Tag> <Tag>--turbo</Tag> <Tag>--relax</Tag> <Tag>--turbo</Tag>
</> </>
} }
size='large' size='default'
checkedText='' checkedText=''
uncheckedText='' uncheckedText=''
onChange={(value) => onChange={(value) =>
@ -165,7 +165,7 @@ export default function SettingsDrawing(props) {
检测必须等待绘图成功才能进行放大等操作 检测必须等待绘图成功才能进行放大等操作
</> </>
} }
size='large' size='default'
checkedText='' checkedText=''
uncheckedText='' uncheckedText=''
onChange={(value) => onChange={(value) =>
@ -178,7 +178,7 @@ export default function SettingsDrawing(props) {
</Col> </Col>
</Row> </Row>
<Row> <Row>
<Button size='large' onClick={onSubmit}> <Button size='default' onClick={onSubmit}>
保存绘图设置 保存绘图设置
</Button> </Button>
</Row> </Row>

View File

@ -141,7 +141,7 @@ export default function GeneralSettings(props) {
<Form.Switch <Form.Switch
field={'DisplayInCurrencyEnabled'} field={'DisplayInCurrencyEnabled'}
label={'以货币形式显示额度'} label={'以货币形式显示额度'}
size='large' size='default'
checkedText='' checkedText=''
uncheckedText='' uncheckedText=''
onChange={(value) => { onChange={(value) => {
@ -156,7 +156,7 @@ export default function GeneralSettings(props) {
<Form.Switch <Form.Switch
field={'DisplayTokenStatEnabled'} field={'DisplayTokenStatEnabled'}
label={'Billing 相关 API 显示令牌额度而非用户额度'} label={'Billing 相关 API 显示令牌额度而非用户额度'}
size='large' size='default'
checkedText='' checkedText=''
uncheckedText='' uncheckedText=''
onChange={(value) => onChange={(value) =>
@ -171,7 +171,7 @@ export default function GeneralSettings(props) {
<Form.Switch <Form.Switch
field={'DefaultCollapseSidebar'} field={'DefaultCollapseSidebar'}
label={'默认折叠侧边栏'} label={'默认折叠侧边栏'}
size='large' size='default'
checkedText='' checkedText=''
uncheckedText='' uncheckedText=''
onChange={(value) => onChange={(value) =>
@ -184,7 +184,7 @@ export default function GeneralSettings(props) {
</Col> </Col>
</Row> </Row>
<Row> <Row>
<Button size='large' onClick={onSubmit}> <Button size='default' onClick={onSubmit}>
保存通用设置 保存通用设置
</Button> </Button>
</Row> </Row>

View File

@ -102,7 +102,7 @@ export default function SettingsLog(props) {
<Form.Switch <Form.Switch
field={'LogConsumeEnabled'} field={'LogConsumeEnabled'}
label={'启用额度消费日志记录'} label={'启用额度消费日志记录'}
size='large' size='default'
checkedText='' checkedText=''
uncheckedText='' uncheckedText=''
onChange={(value) => { onChange={(value) => {
@ -135,7 +135,7 @@ export default function SettingsLog(props) {
</Row> </Row>
<Row> <Row>
<Button size='large' onClick={onSubmit}> <Button size='default' onClick={onSubmit}>
保存日志设置 保存日志设置
</Button> </Button>
</Row> </Row>

View File

@ -114,7 +114,7 @@ export default function SettingsMonitoring(props) {
<Form.Switch <Form.Switch
field={'AutomaticDisableChannelEnabled'} field={'AutomaticDisableChannelEnabled'}
label={'失败时自动禁用通道'} label={'失败时自动禁用通道'}
size='large' size='default'
checkedText='' checkedText=''
uncheckedText='' uncheckedText=''
onChange={(value) => { onChange={(value) => {
@ -129,7 +129,7 @@ export default function SettingsMonitoring(props) {
<Form.Switch <Form.Switch
field={'AutomaticEnableChannelEnabled'} field={'AutomaticEnableChannelEnabled'}
label={'成功时自动启用通道'} label={'成功时自动启用通道'}
size='large' size='default'
checkedText='' checkedText=''
uncheckedText='' uncheckedText=''
onChange={(value) => onChange={(value) =>
@ -142,7 +142,7 @@ export default function SettingsMonitoring(props) {
</Col> </Col>
</Row> </Row>
<Row> <Row>
<Button size='large' onClick={onSubmit}> <Button size='default' onClick={onSubmit}>
保存监控设置 保存监控设置
</Button> </Button>
</Row> </Row>

View File

@ -77,7 +77,7 @@ export default function SettingsSensitiveWords(props) {
<Form.Switch <Form.Switch
field={'CheckSensitiveEnabled'} field={'CheckSensitiveEnabled'}
label={'启用屏蔽词过滤功能'} label={'启用屏蔽词过滤功能'}
size='large' size='default'
checkedText='' checkedText=''
uncheckedText='' uncheckedText=''
onChange={(value) => { onChange={(value) => {
@ -92,7 +92,7 @@ export default function SettingsSensitiveWords(props) {
<Form.Switch <Form.Switch
field={'CheckSensitiveOnPromptEnabled'} field={'CheckSensitiveOnPromptEnabled'}
label={'启用 Prompt 检查'} label={'启用 Prompt 检查'}
size='large' size='default'
checkedText='' checkedText=''
uncheckedText='' uncheckedText=''
onChange={(value) => onChange={(value) =>
@ -123,7 +123,7 @@ export default function SettingsSensitiveWords(props) {
</Col> </Col>
</Row> </Row>
<Row> <Row>
<Button size='large' onClick={onSubmit}> <Button size='default' onClick={onSubmit}>
保存屏蔽词过滤设置 保存屏蔽词过滤设置
</Button> </Button>
</Row> </Row>