添加软件基础配置
This commit is contained in:
parent
9618ae6b14
commit
11a23c92df
@ -62,6 +62,20 @@ export default [
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: 'options',
|
||||||
|
path: '/options',
|
||||||
|
icon: 'Tool',
|
||||||
|
access: 'canOptions',
|
||||||
|
routes: [
|
||||||
|
{
|
||||||
|
name: 'laitoolOptions',
|
||||||
|
path: '/options/laitoolOptions',
|
||||||
|
component: './Options/LaitoolOptions/LaitoolOptions/index',
|
||||||
|
access: 'canLaitoolOptions',
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
path: '/roleManagement',
|
path: '/roleManagement',
|
||||||
name: 'roleManagement',
|
name: 'roleManagement',
|
||||||
|
|||||||
@ -17,6 +17,9 @@ export default function access(initialState: { currentUser?: API.CurrentUser } |
|
|||||||
isSuperAdmin: false,
|
isSuperAdmin: false,
|
||||||
isAdminOrSuperAdmin: false,
|
isAdminOrSuperAdmin: false,
|
||||||
|
|
||||||
|
canOptions: false,
|
||||||
|
canLaitoolOptions: false,
|
||||||
|
|
||||||
canMachineManagement: false,
|
canMachineManagement: false,
|
||||||
canAddMachine: true,
|
canAddMachine: true,
|
||||||
canEditMachine: false,
|
canEditMachine: false,
|
||||||
@ -61,6 +64,9 @@ export default function access(initialState: { currentUser?: API.CurrentUser } |
|
|||||||
isAdmin: true,
|
isAdmin: true,
|
||||||
isAdminOrSuperAdmin: true,
|
isAdminOrSuperAdmin: true,
|
||||||
|
|
||||||
|
canOptions: true,
|
||||||
|
canLaitoolOptions: true,
|
||||||
|
|
||||||
canMachineManagement: true,
|
canMachineManagement: true,
|
||||||
canEditMachine: true,
|
canEditMachine: true,
|
||||||
canDeleteMachine: true,
|
canDeleteMachine: true,
|
||||||
@ -81,6 +87,9 @@ export default function access(initialState: { currentUser?: API.CurrentUser } |
|
|||||||
isSuperAdmin: true,
|
isSuperAdmin: true,
|
||||||
isAdminOrSuperAdmin: true,
|
isAdminOrSuperAdmin: true,
|
||||||
|
|
||||||
|
canOptions: true,
|
||||||
|
canLaitoolOptions: true,
|
||||||
|
|
||||||
canMachineManagement: true,
|
canMachineManagement: true,
|
||||||
canEditMachine: true,
|
canEditMachine: true,
|
||||||
canDeleteMachine: true,
|
canDeleteMachine: true,
|
||||||
|
|||||||
@ -52,7 +52,6 @@ export async function getInitialState(): Promise<{
|
|||||||
|
|
||||||
// 如果不是登录页面,执行
|
// 如果不是登录页面,执行
|
||||||
const { location } = history;
|
const { location } = history;
|
||||||
debugger;
|
|
||||||
if (location.pathname !== loginPath && !location.pathname.startsWith('/user/register')) {
|
if (location.pathname !== loginPath && !location.pathname.startsWith('/user/register')) {
|
||||||
let currentUserString = localStorage.getItem('userInfo');
|
let currentUserString = localStorage.getItem('userInfo');
|
||||||
let currentUser = currentUserString ? JSON.parse(currentUserString) : null;
|
let currentUser = currentUserString ? JSON.parse(currentUserString) : null;
|
||||||
@ -184,7 +183,6 @@ export function rootContainer(container: React.ReactNode) {
|
|||||||
*/
|
*/
|
||||||
export const request = {
|
export const request = {
|
||||||
...errorConfig,
|
...errorConfig,
|
||||||
prefix: "https://localhost:44362",
|
|
||||||
timeout: 60000,
|
timeout: 60000,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -7,6 +7,9 @@ export default {
|
|||||||
'menu.prompt.prompt-type': '提示词类型',
|
'menu.prompt.prompt-type': '提示词类型',
|
||||||
'menu.prompt.prompt-management': '提示词管理',
|
'menu.prompt.prompt-management': '提示词管理',
|
||||||
|
|
||||||
|
'menu.options': '配置管理',
|
||||||
|
'menu.options.laitoolOptions': 'Laitool配置',
|
||||||
|
|
||||||
'menu.roleManagement': '角色管理',
|
'menu.roleManagement': '角色管理',
|
||||||
|
|
||||||
'menu.userManagement': '用户管理',
|
'menu.userManagement': '用户管理',
|
||||||
|
|||||||
101
src/pages/Options/LaitoolOptions/BasicOptions/index.tsx
Normal file
101
src/pages/Options/LaitoolOptions/BasicOptions/index.tsx
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
import { GetOptions, getOptionsStringValue, SaveOptions } from '@/services/services/options/optionsTool';
|
||||||
|
import { useOptionsStore } from '@/store/options';
|
||||||
|
import { useSoftStore } from '@/store/software';
|
||||||
|
import { Button, Card, Form, Input } from 'antd';
|
||||||
|
import TextArea from 'antd/es/input/TextArea';
|
||||||
|
import { message } from 'antd/lib';
|
||||||
|
import React, { useEffect } from 'react';
|
||||||
|
|
||||||
|
const BasicOptions: React.FC = () => {
|
||||||
|
|
||||||
|
const { setTopSpinning, setTopSpinTip } = useSoftStore();
|
||||||
|
const [messageApi, messageHolder] = message.useMessage();
|
||||||
|
const { laitoolOptions, setLaitoolOptions } = useOptionsStore();
|
||||||
|
const [form] = Form.useForm();
|
||||||
|
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
setTopSpinning(true);
|
||||||
|
setTopSpinTip("加载信息中");
|
||||||
|
// 这边加载所有的配音数据
|
||||||
|
GetOptions("software").then((res) => {
|
||||||
|
setLaitoolOptions(res);
|
||||||
|
form.setFieldsValue({
|
||||||
|
LaitoolHomePage: getOptionsStringValue(res, 'LaitoolHomePage', ""),
|
||||||
|
LaitoolUpdateContent: getOptionsStringValue(res, 'LaitoolUpdateContent', ""),
|
||||||
|
LaitoolNotice: getOptionsStringValue(res, 'LaitoolNotice', ""),
|
||||||
|
LaitoolVersion: getOptionsStringValue(res, 'LaitoolVersion', ""),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
).catch((err: any) => {
|
||||||
|
messageApi.error(err.message);
|
||||||
|
}).finally(() => {
|
||||||
|
console.log('finally');
|
||||||
|
setTopSpinning(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
|
||||||
|
async function onFinish(values: any): Promise<void> {
|
||||||
|
setTopSpinning(true);
|
||||||
|
setTopSpinTip("正在保存通用设置");
|
||||||
|
try {
|
||||||
|
// 这边保存所有的配音数据
|
||||||
|
await SaveOptions(values);
|
||||||
|
// 判断Option中的key是不是在属性上
|
||||||
|
for (let key in values) {
|
||||||
|
setLaitoolOptions(laitoolOptions.map((item: OptionModel.Option) => {
|
||||||
|
if (item.key === key) {
|
||||||
|
item.value = values[key]
|
||||||
|
}
|
||||||
|
return item
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
messageApi.success('设置成功');
|
||||||
|
} catch (error: any) {
|
||||||
|
messageApi.error(error.message);
|
||||||
|
} finally {
|
||||||
|
setTopSpinning(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<Card title="通用设置" bordered={false}>
|
||||||
|
<Form name="trigger" form={form} layout="vertical" autoComplete="off" onFinish={onFinish}>
|
||||||
|
<Form.Item
|
||||||
|
label="软件版本号"
|
||||||
|
name="LaitoolVersion"
|
||||||
|
>
|
||||||
|
<Input placeholder='请输入版本号' />
|
||||||
|
</Form.Item>
|
||||||
|
<Form.Item
|
||||||
|
label="首页内容"
|
||||||
|
name="LaitoolHomePage"
|
||||||
|
>
|
||||||
|
<TextArea autoSize={{ minRows: 3, maxRows: 6 }} placeholder="支持HTML和网址,网址用iframe,可以内嵌所有的网页" />
|
||||||
|
</Form.Item>
|
||||||
|
<Form.Item
|
||||||
|
label="更新内容"
|
||||||
|
name="LaitoolUpdateContent"
|
||||||
|
>
|
||||||
|
<TextArea autoSize={{ minRows: 3, maxRows: 6 }} placeholder="支持HTML和网址,网址用iframe" />
|
||||||
|
</Form.Item>
|
||||||
|
<Form.Item
|
||||||
|
label="通知"
|
||||||
|
name="LaitoolNotice"
|
||||||
|
>
|
||||||
|
<TextArea autoSize={{ minRows: 3, maxRows: 6 }} placeholder="支持HTML和网址,网址用iframe" />
|
||||||
|
</Form.Item>
|
||||||
|
<Form.Item>
|
||||||
|
<Button color="primary" variant="filled" htmlType="submit">设置通用设置</Button>
|
||||||
|
</Form.Item>
|
||||||
|
</Form>
|
||||||
|
</Card>
|
||||||
|
{messageHolder}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default BasicOptions;
|
||||||
@ -0,0 +1,64 @@
|
|||||||
|
import { getOptionsStringValue, SaveOptions } from '@/services/services/options/optionsTool';
|
||||||
|
import { useOptionsStore } from '@/store/options';
|
||||||
|
import { useSoftStore } from '@/store/software';
|
||||||
|
import { Button, Card, Col, Form, Input, message, Row } from 'antd';
|
||||||
|
import TextArea from 'antd/es/input/TextArea';
|
||||||
|
import React, { useEffect } from 'react';
|
||||||
|
|
||||||
|
const DubSettingTTsOptions: React.FC = () => {
|
||||||
|
|
||||||
|
const [form] = Form.useForm();
|
||||||
|
const { ttsOptions, setTTsOptions } = useOptionsStore();
|
||||||
|
const { topSpinning, setTopSpinning, topSpinTip, setTopSpinTip } = useSoftStore();
|
||||||
|
const [messageApi, messageHolder] = message.useMessage();
|
||||||
|
|
||||||
|
async function onFinish(values: any): Promise<void> {
|
||||||
|
console.log('Received values of form: ', values);
|
||||||
|
setTopSpinning(true);
|
||||||
|
setTopSpinTip("正在保存EdgeTTs配置");
|
||||||
|
try {
|
||||||
|
await SaveOptions(values);
|
||||||
|
setTTsOptions(ttsOptions.map((item: OptionModel.Option) => {
|
||||||
|
if (item.key === "EdgeTTsRoles") {
|
||||||
|
item.value = values.edgeTTsRoles
|
||||||
|
}
|
||||||
|
return item
|
||||||
|
}));
|
||||||
|
messageApi.success('设置成功');
|
||||||
|
} catch (error: any) {
|
||||||
|
messageApi.error(error.message);
|
||||||
|
} finally {
|
||||||
|
setTopSpinning(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
useEffect(() => {
|
||||||
|
console.log("DubSettingTTsOptions", ttsOptions)
|
||||||
|
form.setFieldsValue({ edgeTTsRoles: getOptionsStringValue(ttsOptions, 'EdgeTTsRoles', "{}") })
|
||||||
|
}, [ttsOptions])
|
||||||
|
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Card title="配置" >
|
||||||
|
<Form form={form} name="advanced_search" onFinish={onFinish} layout="vertical">
|
||||||
|
<Row gutter={24}>
|
||||||
|
<Col span={8}>
|
||||||
|
<Form.Item
|
||||||
|
label="语音合成角色"
|
||||||
|
name="edgeTTsRoles"
|
||||||
|
>
|
||||||
|
<TextArea placeholder="请输入EdgeTTs合成角色,JSON格式" autoSize={{ minRows: 6, maxRows: 6 }} />
|
||||||
|
</Form.Item>
|
||||||
|
</Col>
|
||||||
|
</Row>
|
||||||
|
<Form.Item wrapperCol={{ offset: 0, span: 16 }}>
|
||||||
|
<Button color="primary" variant="filled" htmlType="submit">
|
||||||
|
保存EdgeTTs配置
|
||||||
|
</Button>
|
||||||
|
</Form.Item>
|
||||||
|
</Form>
|
||||||
|
{messageHolder}
|
||||||
|
</Card>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default DubSettingTTsOptions;
|
||||||
51
src/pages/Options/LaitoolOptions/DubSetting/index.tsx
Normal file
51
src/pages/Options/LaitoolOptions/DubSetting/index.tsx
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
import { Card, Collapse, CollapseProps, Form } from 'antd';
|
||||||
|
import React, { useEffect } from 'react';
|
||||||
|
import DubSettingTTsOptions from './DubSettingTTsOptions';
|
||||||
|
import { useOptionsStore } from '@/store/options';
|
||||||
|
import { useSoftStore } from '@/store/software';
|
||||||
|
import { GetOptions } from '@/services/services/options/optionsTool';
|
||||||
|
|
||||||
|
|
||||||
|
const DubSetting: React.FC = () => {
|
||||||
|
const { ttsOptions, setTTsOptions } = useOptionsStore();
|
||||||
|
const { setTopSpinning, setTopSpinTip } = useSoftStore();
|
||||||
|
|
||||||
|
const onChange = (key: string | string[]) => {
|
||||||
|
console.log(key);
|
||||||
|
};
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
setTopSpinning(true);
|
||||||
|
setTopSpinTip("加载信息中");
|
||||||
|
// 这边加载所有的配音数据
|
||||||
|
GetOptions('tts').then((res) => {
|
||||||
|
setTTsOptions(res);
|
||||||
|
}
|
||||||
|
).catch((err) => {
|
||||||
|
console.log(err);
|
||||||
|
}).finally(() => {
|
||||||
|
console.log('finally');
|
||||||
|
setTopSpinning(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
const items: CollapseProps['items'] = [
|
||||||
|
{
|
||||||
|
key: '1',
|
||||||
|
label: '配置',
|
||||||
|
children: <p></p>,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: '2',
|
||||||
|
label: <strong>Edge TTS</strong>,
|
||||||
|
children: <DubSettingTTsOptions />,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Collapse items={items} bordered={false} ghost onChange={onChange} />
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default DubSetting;
|
||||||
38
src/pages/Options/LaitoolOptions/LaitoolOptions/index.tsx
Normal file
38
src/pages/Options/LaitoolOptions/LaitoolOptions/index.tsx
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
import TemplateContainer from '@/pages/TemplateContainer';
|
||||||
|
import { useModel } from '@umijs/max';
|
||||||
|
import { Tabs, TabsProps, theme } from 'antd';
|
||||||
|
import React from 'react';
|
||||||
|
import DubSetting from '../DubSetting';
|
||||||
|
import BasicOptions from '../BasicOptions';
|
||||||
|
|
||||||
|
|
||||||
|
const LaitoolOptions: React.FC = () => {
|
||||||
|
|
||||||
|
const { initialState } = useModel('@@initialState');
|
||||||
|
const [tabKey, setTabKey] = React.useState<string | undefined>(undefined);
|
||||||
|
|
||||||
|
const items = [{
|
||||||
|
label: `软件设置`,
|
||||||
|
key: "software",
|
||||||
|
children: <BasicOptions />,
|
||||||
|
style: undefined,
|
||||||
|
}, {
|
||||||
|
label: `配音设置`,
|
||||||
|
key: "dub",
|
||||||
|
children: <DubSetting />,
|
||||||
|
style: undefined,
|
||||||
|
destroyInactiveTabPane : true
|
||||||
|
}]
|
||||||
|
|
||||||
|
const onChange = (key: string) => {
|
||||||
|
setTabKey(key);
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<TemplateContainer title={false} navTheme={initialState?.settings?.navTheme ?? "realDark"}>
|
||||||
|
<Tabs defaultActiveKey="1" destroyInactiveTabPane={true} items={items} onChange={onChange} />
|
||||||
|
</TemplateContainer>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default LaitoolOptions;
|
||||||
@ -115,7 +115,7 @@ const PromptManagement: React.FC = () => {
|
|||||||
width: 220,
|
width: 220,
|
||||||
render: (dom, ent) => <>
|
render: (dom, ent) => <>
|
||||||
<Button size='middle' style={{ marginRight: "5px" }} type="primary" onClick={() => {
|
<Button size='middle' style={{ marginRight: "5px" }} type="primary" onClick={() => {
|
||||||
debugger
|
|
||||||
setEditData(ent)
|
setEditData(ent)
|
||||||
setType("edit")
|
setType("edit")
|
||||||
setOpen(true)
|
setOpen(true)
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import React from 'react';
|
import React, { useEffect } from 'react';
|
||||||
import { PageContainer } from '@ant-design/pro-layout';
|
import { PageContainer } from '@ant-design/pro-layout';
|
||||||
import { Card, Spin } from 'antd';
|
import { Card, Spin } from 'antd';
|
||||||
import { useSoftStore } from '@/store/software';
|
import { useSoftStore } from '@/store/software';
|
||||||
@ -7,9 +7,10 @@ interface TemplateContainerProps {
|
|||||||
children: React.ReactNode;
|
children: React.ReactNode;
|
||||||
navTheme: string;
|
navTheme: string;
|
||||||
style?: React.CSSProperties;
|
style?: React.CSSProperties;
|
||||||
|
title?: React.ReactNode | false;
|
||||||
}
|
}
|
||||||
|
|
||||||
const TemplateContainer: React.FC<TemplateContainerProps> = ({ children, navTheme, style }) => {
|
const TemplateContainer: React.FC<TemplateContainerProps> = ({ children, navTheme, style, title }) => {
|
||||||
|
|
||||||
const { topSpinning, topSpinTip } = useSoftStore();
|
const { topSpinning, topSpinTip } = useSoftStore();
|
||||||
|
|
||||||
@ -20,7 +21,7 @@ const TemplateContainer: React.FC<TemplateContainerProps> = ({ children, navThem
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<Spin spinning={topSpinning} tip={topSpinTip}>
|
<Spin spinning={topSpinning} tip={topSpinTip}>
|
||||||
<PageContainer>
|
<PageContainer title={title}>
|
||||||
<Card
|
<Card
|
||||||
style={{
|
style={{
|
||||||
...style,
|
...style,
|
||||||
|
|||||||
@ -27,8 +27,6 @@ const UserManagement: React.FC = () => {
|
|||||||
totalBoundaryShowSizeChanger: true,
|
totalBoundaryShowSizeChanger: true,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
const [modal, contextHolder] = Modal.useModal();
|
|
||||||
const [loading, setLoading] = useState<boolean>(true);
|
const [loading, setLoading] = useState<boolean>(true);
|
||||||
const [userId, setUserId] = useState<number>(0);
|
const [userId, setUserId] = useState<number>(0);
|
||||||
const [openModal, setOpenModal] = useState<boolean>(false);
|
const [openModal, setOpenModal] = useState<boolean>(false);
|
||||||
|
|||||||
@ -38,7 +38,7 @@ const refreshToken = async () => {
|
|||||||
"deviceInfo": "2"
|
"deviceInfo": "2"
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
debugger
|
|
||||||
if (response.code == 1) {
|
if (response.code == 1) {
|
||||||
localStorage.setItem('token', response.data);
|
localStorage.setItem('token', response.data);
|
||||||
return true;
|
return true;
|
||||||
@ -53,7 +53,7 @@ const refreshToken = async () => {
|
|||||||
const retryRequest = async (url: string, opts: RequestOptions) => {
|
const retryRequest = async (url: string, opts: RequestOptions) => {
|
||||||
if (url) {
|
if (url) {
|
||||||
try {
|
try {
|
||||||
debugger
|
|
||||||
const response = await request(url, {
|
const response = await request(url, {
|
||||||
...opts,
|
...opts,
|
||||||
headers: {
|
headers: {
|
||||||
@ -96,7 +96,7 @@ export const errorConfig: RequestConfig = {
|
|||||||
if (opts?.skipErrorHandler) throw error;
|
if (opts?.skipErrorHandler) throw error;
|
||||||
// 我们的 errorThrower 抛出的错误。
|
// 我们的 errorThrower 抛出的错误。
|
||||||
if (error.name === 'BizError') {
|
if (error.name === 'BizError') {
|
||||||
debugger
|
|
||||||
} else if (error.response) {
|
} else if (error.response) {
|
||||||
// 请求成功发出且服务器也响应了状态码,但状态代码超出了 2xx 的范围
|
// 请求成功发出且服务器也响应了状态码,但状态代码超出了 2xx 的范围
|
||||||
const { status } = error.response;
|
const { status } = error.response;
|
||||||
@ -150,13 +150,13 @@ export const errorConfig: RequestConfig = {
|
|||||||
// history.push('/user/login'); // 重定向到登录页面
|
// history.push('/user/login'); // 重定向到登录页面
|
||||||
}
|
}
|
||||||
} else if (error.request) {
|
} else if (error.request) {
|
||||||
debugger
|
|
||||||
// 请求已经成功发起,但没有收到响应
|
// 请求已经成功发起,但没有收到响应
|
||||||
// \`error.request\` 在浏览器中是 XMLHttpRequest 的实例,
|
// \`error.request\` 在浏览器中是 XMLHttpRequest 的实例,
|
||||||
// 而在node.js中是 http.ClientRequest 的实例
|
// 而在node.js中是 http.ClientRequest 的实例
|
||||||
message.error('None response! Please retry.');
|
message.error('None response! Please retry.');
|
||||||
} else {
|
} else {
|
||||||
debugger
|
|
||||||
// 发送请求时出了点问题
|
// 发送请求时出了点问题
|
||||||
message.error('Request error, please retry.');
|
message.error('Request error, please retry.');
|
||||||
}
|
}
|
||||||
@ -170,7 +170,7 @@ export const errorConfig: RequestConfig = {
|
|||||||
// 拦截请求配置,进行个性化处理。
|
// 拦截请求配置,进行个性化处理。
|
||||||
// 添加校验头
|
// 添加校验头
|
||||||
// config.baseURL = 'https://localhost:44362';
|
// config.baseURL = 'https://localhost:44362';
|
||||||
config.baseURL = 'http://101.35.233.173:5000';
|
config.baseURL = window.location.origin.includes('localhost') ? 'https://localhost:44362' : window.location.origin;
|
||||||
const headers = {
|
const headers = {
|
||||||
...config.headers, // 保留已有的请求头
|
...config.headers, // 保留已有的请求头
|
||||||
'Authorization': `Bearer ${localStorage.getItem('token')}`, // 添加新的请求头
|
'Authorization': `Bearer ${localStorage.getItem('token')}`, // 添加新的请求头
|
||||||
|
|||||||
5
src/services/enum/optionEnum.ts
Normal file
5
src/services/enum/optionEnum.ts
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
export enum OptionType {
|
||||||
|
String = 1,
|
||||||
|
JSON = 2,
|
||||||
|
Number = 3,
|
||||||
|
}
|
||||||
@ -1,9 +1,7 @@
|
|||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
/* eslint-disable */
|
/* eslint-disable */
|
||||||
import { request, useModel } from '@umijs/max';
|
import { request, useModel } from '@umijs/max';
|
||||||
import CryptoJS from 'crypto-js';
|
|
||||||
import { TokenStorage } from '../define/tokenStorage';
|
import { TokenStorage } from '../define/tokenStorage';
|
||||||
import { errorMessage, successMessage } from './response';
|
|
||||||
import { getCurrentUser } from './user';
|
import { getCurrentUser } from './user';
|
||||||
import forge from 'node-forge';
|
import forge from 'node-forge';
|
||||||
|
|
||||||
@ -124,14 +122,14 @@ export async function login(body: API.LoginParams, options?: { [key: string]: an
|
|||||||
export async function UserRegistr(params: UserModel.UserRegisterParams): Promise<void> {
|
export async function UserRegistr(params: UserModel.UserRegisterParams): Promise<void> {
|
||||||
let publicKey = await getPublicKey();
|
let publicKey = await getPublicKey();
|
||||||
// 加密密码
|
// 加密密码
|
||||||
debugger;
|
|
||||||
let secPassword = encryptPassword(publicKey.publicKey, params.password);
|
let secPassword = encryptPassword(publicKey.publicKey, params.password);
|
||||||
let bodyData = {
|
let bodyData = {
|
||||||
userName: params.userName,
|
userName: params.userName,
|
||||||
email: params.email ?? '',
|
email: params.email ?? '',
|
||||||
password: secPassword,
|
password: secPassword,
|
||||||
tokenId: publicKey.token,
|
tokenId: publicKey.token,
|
||||||
affiliateCode : params.affiliateCode
|
affiliateCode: params.affiliateCode
|
||||||
}
|
}
|
||||||
let res = await request<ApiResponse.SuccessItem<string>>('/lms/User/Register', {
|
let res = await request<ApiResponse.SuccessItem<string>>('/lms/User/Register', {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
|
|||||||
135
src/services/services/options/optionsTool.ts
Normal file
135
src/services/services/options/optionsTool.ts
Normal file
@ -0,0 +1,135 @@
|
|||||||
|
import { OptionType } from "@/services/enum/optionEnum";
|
||||||
|
import { isEmpty } from "lodash";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取指定键名的选项值。
|
||||||
|
*
|
||||||
|
* @template T - 返回值的类型。
|
||||||
|
* @param {OptionModel.Option[]} options - 选项数组。
|
||||||
|
* @param {string} keyName - 要查找的键名。
|
||||||
|
* @param {T} [defaultValue] - 默认值,当选项值为空时返回。
|
||||||
|
* @returns {T} - 指定键名的选项值。
|
||||||
|
* @throws {Error} - 当选项数组为空时抛出错误。
|
||||||
|
* @throws {Error} - 当找不到指定键名的选项时抛出错误。
|
||||||
|
* @throws {Error} - 当处理选项值时发生错误时抛出错误。
|
||||||
|
*/
|
||||||
|
export function getOptionsValue<T>(options: OptionModel.Option[], keyName: string, defaultValue?: T): T {
|
||||||
|
|
||||||
|
const option = options.find(x => x.key === keyName);
|
||||||
|
if (!option) {
|
||||||
|
throw new Error(`Option with key '${keyName}' not found`);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isEmpty(option.value) && defaultValue) {
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
switch (option.type) {
|
||||||
|
case OptionType.String:
|
||||||
|
return option.value as T;
|
||||||
|
case OptionType.JSON:
|
||||||
|
return JSON.parse(option.value) as T;
|
||||||
|
case OptionType.Number:
|
||||||
|
return Number(option.value) as T;
|
||||||
|
default:
|
||||||
|
throw new Error(`Unsupported option type: ${option.type}`);
|
||||||
|
}
|
||||||
|
} catch (error: any) {
|
||||||
|
throw new Error(`Error processing option '${keyName}': ${error.message}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取指定键名的选项字符串值。
|
||||||
|
*
|
||||||
|
* @param options - 包含选项的数组。
|
||||||
|
* @param keyName - 要查找的选项键名。
|
||||||
|
* @param defaultValue - 如果未找到选项或选项值为空时返回的默认值(可选)。
|
||||||
|
* @returns 对应键名的选项字符串值。
|
||||||
|
* @throws 如果选项数组为空时抛出错误。
|
||||||
|
* @throws 如果未找到指定键名的选项且未提供默认值时抛出错误。
|
||||||
|
* @throws 如果处理选项值时发生错误抛出错误。
|
||||||
|
*/
|
||||||
|
export function getOptionsStringValue(options: OptionModel.Option[], keyName: string, defaultValue?: string): string {
|
||||||
|
// if (options.length === 0) {
|
||||||
|
// throw new Error("Options array is empty");
|
||||||
|
// }
|
||||||
|
const option = options.find(x => x.key === keyName);
|
||||||
|
if (!option) {
|
||||||
|
if (defaultValue !== undefined) {
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
throw new Error(`Option with key '${keyName}' not found`);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isEmpty(option.value)) {
|
||||||
|
return defaultValue ?? "";
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
switch (option.type) {
|
||||||
|
case OptionType.String:
|
||||||
|
case OptionType.JSON:
|
||||||
|
return String(option.value);
|
||||||
|
case OptionType.Number:
|
||||||
|
return String(Number(option.value));
|
||||||
|
default:
|
||||||
|
throw new Error(`Unsupported option type: ${option.type}`);
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
if (error instanceof Error) {
|
||||||
|
throw new Error(`Error processing option '${keyName}': ${error.message}`);
|
||||||
|
}
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
import { request } from "@umijs/max";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取 TTS 选项
|
||||||
|
* @returns {Promise<OptionModel.Option[]>} 返回一个包含 OptionModel.Option 对象的 Promise
|
||||||
|
* @throws {Error} 如果响应代码不是 1,则抛出错误
|
||||||
|
*/
|
||||||
|
export async function GetOptions(optionsKey: string): Promise<OptionModel.Option[]> {
|
||||||
|
let res = await request<ApiResponse.SuccessItem<OptionModel.Option[]>>(`/lms/LaitoolOptions/GetAllOptions/${optionsKey}`, {
|
||||||
|
method: 'GET',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
}
|
||||||
|
});
|
||||||
|
console.log("GetTTSOptions", res)
|
||||||
|
if (res.code != 1) {
|
||||||
|
throw new Error(res.message);
|
||||||
|
}
|
||||||
|
return res.data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 保存选项
|
||||||
|
* @param {string} key 选项的键
|
||||||
|
* @param {string} value 选项的值
|
||||||
|
* @returns {Promise<void>} 返回一个 Promise
|
||||||
|
* @throws {Error} 如果响应代码不是 1,则抛出错误
|
||||||
|
*/
|
||||||
|
export async function SaveOptions(options: object): Promise<void> {
|
||||||
|
|
||||||
|
let data: { key: string; value: any; }[] = [];
|
||||||
|
Object.entries(options).reduce((acc, [key, value]) => {
|
||||||
|
data.push({ key: key, value: value });
|
||||||
|
return "";
|
||||||
|
}, {});
|
||||||
|
console.log("SaveOptionsDataParams", data)
|
||||||
|
|
||||||
|
let res = await request<ApiResponse.SuccessItem<boolean>>('/lms/LaitoolOptions/ModifyOptions', {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
},
|
||||||
|
data: data
|
||||||
|
});
|
||||||
|
if (res.code != 1) {
|
||||||
|
throw new Error(res.message);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -12,7 +12,7 @@ import { errorMessage } from './response';
|
|||||||
*/
|
*/
|
||||||
export async function getPromptSample(typeId: string, pageSize: number | undefined, current: number | undefined, options?: { [key: string]: any }): Promise<API.SuccessItem | API.ErrorItem> {
|
export async function getPromptSample(typeId: string, pageSize: number | undefined, current: number | undefined, options?: { [key: string]: any }): Promise<API.SuccessItem | API.ErrorItem> {
|
||||||
try {
|
try {
|
||||||
debugger
|
|
||||||
return await request(`/api/Prompt/GetPromptString/${typeId}/${pageSize}/${current}`, {
|
return await request(`/api/Prompt/GetPromptString/${typeId}/${pageSize}/${current}`, {
|
||||||
method: 'GET',
|
method: 'GET',
|
||||||
...(options || {}),
|
...(options || {}),
|
||||||
@ -24,7 +24,7 @@ export async function getPromptSample(typeId: string, pageSize: number | undefin
|
|||||||
|
|
||||||
export async function getPromptDetail(id: string): Promise<API.SuccessItem | API.ErrorItem> {
|
export async function getPromptDetail(id: string): Promise<API.SuccessItem | API.ErrorItem> {
|
||||||
try {
|
try {
|
||||||
debugger
|
|
||||||
return await request(`/api/Prompt/GetPromptDetailById/${id}`, {
|
return await request(`/api/Prompt/GetPromptDetailById/${id}`, {
|
||||||
method: 'GET',
|
method: 'GET',
|
||||||
});
|
});
|
||||||
@ -122,7 +122,7 @@ export async function addPromptType(data: Prompt.AddPromptType): Promise<API.Suc
|
|||||||
*/
|
*/
|
||||||
export async function editPromptType(data: Prompt.AddPromptType): Promise<API.SuccessItem | API.ErrorItem> {
|
export async function editPromptType(data: Prompt.AddPromptType): Promise<API.SuccessItem | API.ErrorItem> {
|
||||||
try {
|
try {
|
||||||
debugger
|
|
||||||
let res = await request('/api/Prompt/ModifyPromptType', {
|
let res = await request('/api/Prompt/ModifyPromptType', {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
data: {
|
data: {
|
||||||
|
|||||||
7
src/services/typing/access.d.ts
vendored
7
src/services/typing/access.d.ts
vendored
@ -18,6 +18,13 @@ declare namespace AccessType {
|
|||||||
isAdminOrSuperAdmin: boolean;
|
isAdminOrSuperAdmin: boolean;
|
||||||
//#endregion
|
//#endregion
|
||||||
|
|
||||||
|
//#region 软件配置项操作权限
|
||||||
|
/** 是不是可以操作配置型 */
|
||||||
|
canOptions : boolean;
|
||||||
|
/** 是不是可以操作软件配置项 */
|
||||||
|
canLaitoolOptions : boolean;
|
||||||
|
//#endregion
|
||||||
|
|
||||||
//#region 机器权限
|
//#region 机器权限
|
||||||
/** 是不是显示机器码管理的菜单 */
|
/** 是不是显示机器码管理的菜单 */
|
||||||
canMachineManagement: boolean
|
canMachineManagement: boolean
|
||||||
|
|||||||
15
src/services/typing/options/dub.d.ts
vendored
Normal file
15
src/services/typing/options/dub.d.ts
vendored
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
declare namespace DubModel {
|
||||||
|
|
||||||
|
//#region EdgeTTs
|
||||||
|
|
||||||
|
/** Edge TTS 的配音角色数据 */
|
||||||
|
type EdgeTTsRole = {
|
||||||
|
value: string,
|
||||||
|
gender: string | 'Female' | "Male",
|
||||||
|
label: string,
|
||||||
|
lang: string,
|
||||||
|
}
|
||||||
|
|
||||||
|
//#endregion
|
||||||
|
|
||||||
|
}
|
||||||
9
src/services/typing/options/option.d.ts
vendored
Normal file
9
src/services/typing/options/option.d.ts
vendored
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
|
||||||
|
declare namespace OptionModel {
|
||||||
|
|
||||||
|
type Option = {
|
||||||
|
key: string;
|
||||||
|
value: string;
|
||||||
|
type: OptionType;
|
||||||
|
}
|
||||||
|
}
|
||||||
13
src/store/options.ts
Normal file
13
src/store/options.ts
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
import { create } from 'zustand';
|
||||||
|
|
||||||
|
export const useOptionsStore = create((set: (arg0: any) => any) => ({
|
||||||
|
|
||||||
|
/**EdgeTTS role List */
|
||||||
|
ttsOptions: [] as OptionModel.Option[],
|
||||||
|
setTTsOptions: (value: string) => set({ ttsOptions: value }),
|
||||||
|
|
||||||
|
/** Laitool 基础配置 */
|
||||||
|
laitoolOptions: [] as OptionModel.Option[],
|
||||||
|
setLaitoolOptions: (value: string) => set({ laitoolOptions: value }),
|
||||||
|
|
||||||
|
})) as any;
|
||||||
@ -11,4 +11,5 @@ export const useSoftStore = create((set: (arg0: any) => any) => ({
|
|||||||
|
|
||||||
topSpinTip: "加载中...",
|
topSpinTip: "加载中...",
|
||||||
setTopSpinTip: (tip: string) => set({ topSpinTip: tip }),
|
setTopSpinTip: (tip: string) => set({ topSpinTip: tip }),
|
||||||
|
|
||||||
})) as any;
|
})) as any;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user