优化消息配置

pull/82/head^2
awenes 2024-04-06 19:35:39 +08:00
parent 4f86c9700d
commit 289da3e46a
4 changed files with 205 additions and 179 deletions

View File

@ -51,6 +51,15 @@ export enum GEO_IP_PROVIDER {
DEFAULT = 'default', DEFAULT = 'default',
} }
export enum EMAIL_PROVIDER {
CUSTOMIZE = 'customize',
ALIYUN = 'aliyun',
TENCENT = 'tencent',
NET_EASE = 'netease',
}
/** /**
* *
*/ */
@ -65,12 +74,9 @@ export enum AppType {
* App Protocol * App Protocol
*/ */
export enum AppProtocolType { export enum AppProtocolType {
saml2 = 'saml2',
oidc = 'oidc', oidc = 'oidc',
cas = 'cas',
jwt = 'jwt', jwt = 'jwt',
form = 'form', form = 'form',
oauth2 = 'oauth2',
} }
export enum PolicyEffectType { export enum PolicyEffectType {

View File

@ -16,16 +16,17 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
import { Container } from '@/components/Container'; import { Container } from '@/components/Container';
import { SMS_PROVIDER } from '@/constant'; import { EMAIL_PROVIDER } from '@/constant';
import { disableMailProvider, getMailProviderConfig, saveMailProvider } from '../../service'; import { disableMailProvider, getMailProviderConfig, saveMailProvider } from '../../service';
import { EyeInvisibleOutlined, EyeTwoTone, WarningOutlined } from '@ant-design/icons'; import { EyeInvisibleOutlined, EyeTwoTone, WarningOutlined } from '@ant-design/icons';
import { import {
ProCard, ProCard,
ProForm, ProForm,
ProFormDependency,
ProFormDigit, ProFormDigit,
ProFormRadio, ProFormRadio,
ProFormSelect, ProFormSegmented,
ProFormSwitch, ProFormSwitch,
ProFormText, ProFormText,
} from '@ant-design/pro-components'; } from '@ant-design/pro-components';
@ -63,12 +64,11 @@ const tailFormItemLayout = {
}, },
}, },
}; };
const defaultProvider = 'customize';
export default (props: { visible: boolean }) => { export default (props: { visible: boolean }) => {
const [form] = Form.useForm(); const [form] = Form.useForm();
const { message, modal } = App.useApp(); const { message, modal } = App.useApp();
const { visible } = props; const { visible } = props;
const [provider, setProvider] = useState<string>(defaultProvider);
const [loading, setLoading] = useState<boolean>(false); const [loading, setLoading] = useState<boolean>(false);
const [enabled, setEnabled] = useState<boolean>(false); const [enabled, setEnabled] = useState<boolean>(false);
const intl = useIntl(); const intl = useIntl();
@ -79,12 +79,9 @@ export default (props: { visible: boolean }) => {
const { success, result } = await getMailProviderConfig(); const { success, result } = await getMailProviderConfig();
if (success && result && result.enabled) { if (success && result && result.enabled) {
setEnabled(result.enabled); setEnabled(result.enabled);
setProvider(result.provider);
form.setFieldsValue({ form.setFieldsValue({
...result, ...result,
}); });
} else {
form.setFieldsValue({ provider: provider });
} }
setLoading(false); setLoading(false);
return; return;
@ -126,11 +123,7 @@ export default (props: { visible: boolean }) => {
if (success) { if (success) {
setEnabled(checked); setEnabled(checked);
message.success(intl.formatMessage({ id: 'app.operation_success' })); message.success(intl.formatMessage({ id: 'app.operation_success' }));
setProvider(defaultProvider);
form.resetFields(); form.resetFields();
form.setFieldsValue({
provider: defaultProvider,
});
return; return;
} }
}, },
@ -148,16 +141,15 @@ export default (props: { visible: boolean }) => {
<ProForm <ProForm
form={form} form={form}
scrollToFirstError scrollToFirstError
initialValues={{ safetyType: 'ssl', provider: defaultProvider }} initialValues={{ safetyType: 'ssl', provider: 'customize' }}
onReset={() => { onReset={() => {
form.resetFields(); form.resetFields();
form.setFieldsValue({ provider });
}} }}
{...layout} {...layout}
layout={'horizontal'} layout={'horizontal'}
labelAlign={'right'} labelAlign={'right'}
submitter={{ submitter={{
render: (p, dom) => { render: (_p, dom) => {
return ( return (
<Form.Item {...tailFormItemLayout}> <Form.Item {...tailFormItemLayout}>
<Space>{dom}</Space> <Space>{dom}</Space>
@ -194,14 +186,41 @@ export default (props: { visible: boolean }) => {
} }
}} }}
> >
<ProFormSelect <ProFormSegmented
name="provider" name="provider"
label={intl.formatMessage({ id: 'pages.setting.message.mail_provider.provider' })} label={intl.formatMessage({ id: 'pages.setting.message.mail_provider.provider' })}
rules={[{ required: true }]} rules={[{ required: true }]}
request={async () => {
return [
{
value: EMAIL_PROVIDER.CUSTOMIZE,
label: intl.formatMessage({
id: 'pages.setting.message.mail_provider.provider.customize',
}),
},
{
value: EMAIL_PROVIDER.ALIYUN,
label: intl.formatMessage({
id: 'pages.setting.message.mail_provider.provider.aliyun',
}),
},
{
value: EMAIL_PROVIDER.TENCENT,
label: intl.formatMessage({
id: 'pages.setting.message.mail_provider.provider.tencent',
}),
},
{
value: EMAIL_PROVIDER.NET_EASE,
label: intl.formatMessage({
id: 'pages.setting.message.mail_provider.provider.net_ease',
}),
},
];
}}
fieldProps={{ fieldProps={{
onChange: async (value: string) => { onChange: async (value) => {
setLoading(true); setLoading(true);
setProvider(value);
form.resetFields(); form.resetFields();
form.setFieldsValue({ form.setFieldsValue({
provider: value, provider: value,
@ -216,138 +235,120 @@ export default (props: { visible: boolean }) => {
setLoading(false); setLoading(false);
}, },
}} }}
options={[
{
value: 'customize',
label: intl.formatMessage({
id: 'pages.setting.message.mail_provider.provider.customize',
}),
},
{
value: SMS_PROVIDER.ALIYUN,
label: intl.formatMessage({
id: 'pages.setting.message.mail_provider.provider.aliyun',
}),
},
{
value: SMS_PROVIDER.TENCENT,
label: intl.formatMessage({
id: 'pages.setting.message.mail_provider.provider.tencent',
}),
},
{
value: SMS_PROVIDER.NET_EASE,
label: intl.formatMessage({
id: 'pages.setting.message.mail_provider.provider.net_ease',
}),
},
]}
/>
{provider === 'customize' && (
<>
<ProFormText
name="smtpUrl"
label={intl.formatMessage({
id: 'pages.setting.message.mail_provider.provider.customize.smtp_url',
})}
placeholder={intl.formatMessage({
id: 'pages.setting.message.mail_provider.provider.customize.smtp_url.placeholder',
})}
rules={[
{
required: true,
message: intl.formatMessage({
id: 'pages.setting.message.mail_provider.provider.customize.smtp_url.placeholder',
}),
},
]}
fieldProps={{ autoComplete: 'off' }}
/>
<ProFormDigit
label={intl.formatMessage({
id: 'pages.setting.message.mail_provider.provider.customize.port',
})}
name="port"
rules={[
{
required: true,
message: intl.formatMessage({
id: 'pages.setting.message.mail_provider.provider.customize.port_rule_0.placeholder',
}),
},
]}
fieldProps={{ autoComplete: 'off' }}
min={0}
placeholder={intl.formatMessage({
id: 'pages.setting.message.mail_provider.provider.customize.port_rule_0.placeholder',
})}
/>
<ProFormRadio.Group
name="safetyType"
label={intl.formatMessage({
id: 'pages.setting.message.mail_provider.provider.customize.safety_type',
})}
rules={[{ required: true }]}
options={[
{
label: 'None',
value: 'none',
},
{
label: 'SSL',
value: 'ssl',
},
]}
/>
</>
)}
<ProFormText
name="username"
label={
provider === defaultProvider
? intl.formatMessage({
id: 'pages.setting.message.mail_provider.provider.username',
})
: intl.formatMessage({
id: 'pages.setting.message.mail_provider.provider.sender_mailbox',
})
}
placeholder={
provider === defaultProvider
? intl.formatMessage({
id: 'pages.setting.message.mail_provider.provider.username.placeholder',
})
: intl.formatMessage({
id: 'pages.setting.message.mail_provider.provider.sender_mailbox.placeholder',
})
}
rules={
provider === defaultProvider
? [
{
required: true,
message: intl.formatMessage({
id: 'pages.setting.message.mail_provider.provider.username.placeholder',
}),
},
]
: [
{
required: true,
message: intl.formatMessage({
id: 'pages.setting.message.mail_provider.provider.sender_mailbox.placeholder',
}),
},
{
type: 'email',
message: intl.formatMessage({
id: 'pages.setting.message.mail_provider.provider.sender_mailbox.rule.rule.0.message',
}),
},
]
}
fieldProps={{ autoComplete: 'off' }}
/> />
<ProFormDependency name={['provider']}>
{({ provider }) => {
return (
<>
{provider === EMAIL_PROVIDER.CUSTOMIZE && (
<>
<ProFormText
name="smtpUrl"
label={intl.formatMessage({
id: 'pages.setting.message.mail_provider.provider.customize.smtp_url',
})}
placeholder={intl.formatMessage({
id: 'pages.setting.message.mail_provider.provider.customize.smtp_url.placeholder',
})}
rules={[
{
required: true,
message: intl.formatMessage({
id: 'pages.setting.message.mail_provider.provider.customize.smtp_url.placeholder',
}),
},
]}
fieldProps={{ autoComplete: 'off' }}
/>
<ProFormDigit
label={intl.formatMessage({
id: 'pages.setting.message.mail_provider.provider.customize.port',
})}
name="port"
rules={[
{
required: true,
message: intl.formatMessage({
id: 'pages.setting.message.mail_provider.provider.customize.port_rule_0.placeholder',
}),
},
]}
fieldProps={{ autoComplete: 'off' }}
min={0}
placeholder={intl.formatMessage({
id: 'pages.setting.message.mail_provider.provider.customize.port_rule_0.placeholder',
})}
/>
<ProFormRadio.Group
name="safetyType"
label={intl.formatMessage({
id: 'pages.setting.message.mail_provider.provider.customize.safety_type',
})}
rules={[{ required: true }]}
options={[
{
label: 'None',
value: 'none',
},
{
label: 'SSL',
value: 'ssl',
},
]}
/>
</>
)}
<ProFormText
name="username"
label={
provider === EMAIL_PROVIDER.CUSTOMIZE
? intl.formatMessage({
id: 'pages.setting.message.mail_provider.provider.username',
})
: intl.formatMessage({
id: 'pages.setting.message.mail_provider.provider.sender_mailbox',
})
}
placeholder={
provider === EMAIL_PROVIDER.CUSTOMIZE
? intl.formatMessage({
id: 'pages.setting.message.mail_provider.provider.username.placeholder',
})
: intl.formatMessage({
id: 'pages.setting.message.mail_provider.provider.sender_mailbox.placeholder',
})
}
rules={
provider === EMAIL_PROVIDER.CUSTOMIZE
? [
{
required: true,
message: intl.formatMessage({
id: 'pages.setting.message.mail_provider.provider.username.placeholder',
}),
},
]
: [
{
required: true,
message: intl.formatMessage({
id: 'pages.setting.message.mail_provider.provider.sender_mailbox.placeholder',
}),
},
{
type: 'email',
message: intl.formatMessage({
id: 'pages.setting.message.mail_provider.provider.sender_mailbox.rule.rule.0.message',
}),
},
]
}
fieldProps={{ autoComplete: 'off' }}
/>
</>
);
}}
</ProFormDependency>
<ProFormText.Password <ProFormText.Password
name="secret" name="secret"
label={intl.formatMessage({ label={intl.formatMessage({

View File

@ -16,7 +16,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
import { SMS_PROVIDER } from '@/constant'; import { SMS_PROVIDER } from '@/constant';
import { Language } from '../../constant'; import { Language } from '@/pages/setting/Storage/constant';
import { import {
disableSmsProvider, disableSmsProvider,
getSmsProviderConfig, getSmsProviderConfig,
@ -33,7 +33,7 @@ import {
ModalForm, ModalForm,
ProCard, ProCard,
ProForm, ProForm,
ProFormSelect, ProFormSegmented,
ProFormSwitch, ProFormSwitch,
ProFormText, ProFormText,
} from '@ant-design/pro-components'; } from '@ant-design/pro-components';
@ -84,7 +84,7 @@ const TestModal = (props: {
modalProps={{ onCancel: onCancel, destroyOnClose: true }} modalProps={{ onCancel: onCancel, destroyOnClose: true }}
labelAlign={'left'} labelAlign={'left'}
labelCol={{ span: 4 }} labelCol={{ span: 4 }}
wrapperCol={{ span: 19 }} wrapperCol={{ span: 20 }}
key={data.type} key={data.type}
title={intl.formatMessage({ id: 'pages.setting.message.sms_provider.send_scene.modal.from' })} title={intl.formatMessage({ id: 'pages.setting.message.sms_provider.send_scene.modal.from' })}
initialValues={{ type: data.type, name: data.name, content: data.content }} initialValues={{ type: data.type, name: data.name, content: data.content }}
@ -376,14 +376,14 @@ export default (props: { visible: boolean }) => {
} }
}} }}
> >
<ProFormSelect <ProFormSegmented
name="provider" name="provider"
label={intl.formatMessage({ id: 'pages.setting.message.sms_provider.provider' })} label={intl.formatMessage({ id: 'pages.setting.message.sms_provider.provider' })}
rules={[{ required: true }]} rules={[{ required: true }]}
fieldProps={{ fieldProps={{
onChange: async (value: string) => { onChange: async (value) => {
setLoading(true); setLoading(true);
setProvider(value); setProvider(value as string);
//清理 //清理
form.resetFields(); form.resetFields();
form.setFieldsValue({ provider: value }); form.setFieldsValue({ provider: value });
@ -394,7 +394,7 @@ export default (props: { visible: boolean }) => {
form.setFieldsValue({ ...result.config }); form.setFieldsValue({ ...result.config });
setLanguage(result.language); setLanguage(result.language);
//获取模板 //获取模板
await fetchSmsTemplateList(result.language, value); await fetchSmsTemplateList(result.language, value as string);
result.templates?.forEach((i: { type: any; code: any }) => { result.templates?.forEach((i: { type: any; code: any }) => {
editorFormRef.current?.setFieldsValue({ [i.type]: { code: i.code } }); editorFormRef.current?.setFieldsValue({ [i.type]: { code: i.code } });
}); });
@ -402,31 +402,33 @@ export default (props: { visible: boolean }) => {
//已配置和选中配置不一致,走初始化流程 //已配置和选中配置不一致,走初始化流程
if (success && result && result.provider !== value) { if (success && result && result.provider !== value) {
setLanguage(Language.ZH); setLanguage(Language.ZH);
await fetchSmsTemplateList(Language.ZH, value); await fetchSmsTemplateList(Language.ZH, value as string);
} }
setLoading(false); setLoading(false);
}, },
}} }}
options={[ request={async () => {
{ return [
value: SMS_PROVIDER.ALIYUN, {
label: intl.formatMessage({ value: SMS_PROVIDER.ALIYUN,
id: 'pages.setting.message.sms_provider.provider.aliyun', label: intl.formatMessage({
}), id: 'pages.setting.message.sms_provider.provider.aliyun',
}, }),
{ },
value: SMS_PROVIDER.TENCENT, {
label: intl.formatMessage({ value: SMS_PROVIDER.TENCENT,
id: 'pages.setting.message.sms_provider.provider.tencent', label: intl.formatMessage({
}), id: 'pages.setting.message.sms_provider.provider.tencent',
}, }),
{ },
value: SMS_PROVIDER.QI_NIU, {
label: intl.formatMessage({ value: SMS_PROVIDER.QI_NIU,
id: 'pages.setting.message.sms_provider.provider.qi_niu', label: intl.formatMessage({
}), id: 'pages.setting.message.sms_provider.provider.qi_niu',
}, }),
]} },
];
}}
/> />
{provider === SMS_PROVIDER.ALIYUN && <AliCloud />} {provider === SMS_PROVIDER.ALIYUN && <AliCloud />}
{provider === SMS_PROVIDER.TENCENT && <Tencent />} {provider === SMS_PROVIDER.TENCENT && <Tencent />}

View File

@ -78,6 +78,23 @@ export default {
'请输入阿里云短信签名', '请输入阿里云短信签名',
'pages.setting.message.sms_provider.provider.aliyun.sign_name.rule.0.message': 'pages.setting.message.sms_provider.provider.aliyun.sign_name.rule.0.message':
'阿里云短信签名为必填项', '阿里云短信签名为必填项',
'pages.setting.storage_provider.provider.s3': 'S3',
'pages.setting.storage_provider.provider.s3.endpoint': 'S3域名',
'pages.setting.storage_provider.provider.s3.endpoint.placeholder': '请输入 S3域名',
'pages.setting.storage_provider.provider.s3.endpoint.rule.0.message': 'S3域名为必填项',
'pages.setting.storage_provider.provider.s3.domain': '外链域名',
'pages.setting.storage_provider.provider.s3.domain.placeholder': '请输入S3 外链域名',
'pages.setting.storage_provider.provider.s3.domain.rule.0.message': 'S3 外链域名为必填项',
'pages.setting.storage_provider.provider.s3.access_key_id.placeholder': '请输入S3 AccessKeyId',
'pages.setting.storage_provider.provider.s3.access_key_id.rule.0.message':
'S3 AccessKeyId为必填项',
'pages.setting.storage_provider.provider.s3.secret_access_key.placeholder':
'请输入S3 SecretAccessKey',
'pages.setting.storage_provider.provider.s3.secret_access_key.rule.0.message':
'S3 SecretAccessKey为必填项',
'pages.setting.storage_provider.provider.s3.region.placeholder': '请输入S3 Region',
'pages.setting.storage_provider.provider.s3.bucket.placeholder': '请输入S3 Bucket',
'pages.setting.storage_provider.provider.s3.bucket.rule.0.message': 'S3 Bucket为必填项',
'pages.setting.message.sms_provider.provider.tencent': '腾讯云', 'pages.setting.message.sms_provider.provider.tencent': '腾讯云',
'pages.setting.message.sms_provider.provider.tencent.region': '地域', 'pages.setting.message.sms_provider.provider.tencent.region': '地域',
'pages.setting.message.sms_provider.provider.tencent.region.placeholder': '请选择地域配置', 'pages.setting.message.sms_provider.provider.tencent.region.placeholder': '请选择地域配置',