| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773 |
- import { PermissionButton } from '@/components';
- import { PageContainer } from '@ant-design/pro-layout';
- import { Card, Col, Row, AutoComplete } from 'antd';
- import styles from './index.less';
- import {
- ArrayCollapse,
- Form,
- FormButtonGroup,
- FormItem,
- Input,
- Select,
- Radio,
- Checkbox,
- FormCollapse,
- FormGrid,
- Switch,
- TreeSelect,
- ArrayTable,
- } from '@formily/antd';
- import { TreeSelect as ATreeSelect } from 'antd';
- import { useEffect, useState } from 'react';
- import { createSchemaField } from '@formily/react';
- import { createForm, Field, onFieldReact, onFieldValueChange, onFormInit } from '@formily/core';
- import { onlyMessage, randomString, useAsyncDataSource } from '@/utils/util';
- import { service } from '../index';
- import { PlusOutlined } from '@ant-design/icons';
- import { action } from '@formily/reactive';
- import type { Response } from '@/utils/typings';
- import usePermissions from '@/hooks/permission';
- import { useHistory, useLocation } from '@/hooks';
- import { getMenuPathByCode } from '@/utils/menu';
- import MenuPage from '../Menu';
- const Save = () => {
- const location = useLocation();
- const history = useHistory();
- const { permission: rolePermission } = usePermissions('system/Role');
- const { permission: deptPermission } = usePermissions('system/Department');
- const { permission } = PermissionButton.usePermission('system/Apply');
- const [view, setView] = useState<boolean>(false);
- const [id, setId] = useState<string>('');
- const [visible, setVisiable] = useState<boolean>(false);
- const [detail, setDetail] = useState<any>({});
- const provider1 = require('/public/images/apply/provider1.png');
- const provider2 = require('/public/images/apply/provider2.png');
- const provider3 = require('/public/images/apply/provider3.png');
- const provider4 = require('/public/images/apply/provider4.png');
- const provider5 = require('/public/images/apply/provider5.png');
- const providerType = new Map();
- providerType.set('internal-standalone', provider1); //内部独立
- providerType.set('internal-integrated', provider2); //内部集成
- providerType.set('dingtalk-ent-app', provider3); //钉钉
- providerType.set('wechat-webapp', provider4); //微信
- providerType.set('third-party', provider5); //三方
- const formCollapse = FormCollapse.createFormCollapse!();
- //接入方式
- const integrationModesList = [
- {
- label: '页面集成',
- value: 'page',
- },
- {
- label: 'API客户端',
- value: 'apiClient',
- },
- {
- label: 'API服务',
- value: 'apiServer',
- },
- {
- label: '单点登录',
- value: 'ssoClient',
- },
- ];
- const createImageLabel = (image: string, text: string) => {
- return (
- <div
- style={{ textAlign: 'center', marginTop: 10, fontSize: '14px', width: 115, height: 120 }}
- >
- <img height="64px" src={image} style={{ marginTop: 10 }} />
- <div
- style={{
- color: '#000000',
- marginTop: 5,
- }}
- >
- {text}
- </div>
- </div>
- );
- };
- const providerList = [
- {
- label: createImageLabel(providerType.get('internal-standalone'), '内部独立应用'),
- value: 'internal-standalone',
- },
- {
- label: createImageLabel(providerType.get('internal-integrated'), '内部集成应用'),
- value: 'internal-integrated',
- },
- {
- label: createImageLabel(providerType.get('wechat-webapp'), '微信网站应用'),
- value: 'wechat-webapp',
- },
- {
- label: createImageLabel(providerType.get('dingtalk-ent-app'), '钉钉企业内部应用'),
- value: 'dingtalk-ent-app',
- },
- {
- label: createImageLabel(providerType.get('third-party'), '第三方应用'),
- value: 'third-party',
- },
- ];
- const SchemaField = createSchemaField({
- components: {
- FormItem,
- Input,
- Select,
- Radio,
- Checkbox,
- ArrayCollapse,
- FormCollapse,
- FormGrid,
- Switch,
- TreeSelect,
- ArrayTable,
- AutoComplete,
- },
- });
- // const getProvidersAll = () => {
- // return service.getProvidersAll().then((res) => {
- // if (res.status === 200) {
- // return res.result.map((item: any) => ({
- // label: createImageLabel(providerType.get(item.provider), item.name),
- // value: item.provider,
- // }));
- // }
- // });
- // };
- const getRole = () => service.queryRoleList();
- const getOrg = () => service.queryOrgList();
- const useAsyncData = (api: any) => (fields: Field) => {
- fields.loading = true;
- api(fields).then(
- action.bound!((resp: Response<any>) => {
- fields.dataSource = resp.result?.map((item: Record<string, unknown>) => ({
- ...item,
- label: item.name,
- value: item.id,
- }));
- fields.loading = false;
- }),
- );
- };
- const form = createForm({
- validateFirst: true,
- effects() {
- onFormInit(async (formInit) => {
- if (!id) return;
- const resp = await service.detail(id);
- const integrationModes = resp.result.integrationModes.map((item: any) => item.value);
- formInit.setInitialValues({
- ...resp.result,
- integrationModes,
- 'apiServer.appId': id,
- });
- });
- onFieldValueChange('provider', (field, form1) => {
- const value = field.value;
- // console.log(value);
- if (field.modified) {
- switch (value) {
- case 'internal-standalone':
- form1.setFieldState('integrationModes', (f1) => {
- f1.value = [];
- f1.dataSource = integrationModesList;
- });
- break;
- case 'internal-integrated':
- form1.setFieldState('integrationModes', (f2) => {
- f2.value = [];
- f2.dataSource = integrationModesList?.filter(
- (item) => item.value === 'apiClient' || item.value === 'page',
- );
- });
- break;
- case 'dingtalk-ent-app':
- form1.setFieldState('integrationModes', (f3) => {
- f3.value = ['ssoClient'];
- f3.dataSource = integrationModesList?.filter((item) => item.value === 'ssoClient');
- });
- break;
- case 'wechat-webapp':
- form1.setFieldState('integrationModes', (f4) => {
- f4.value = ['ssoClient'];
- f4.dataSource = integrationModesList?.filter((item) => item.value === 'ssoClient');
- });
- break;
- case 'third-party':
- form1.setFieldState('integrationModes', (f5) => {
- f5.value = [];
- f5.dataSource = integrationModesList;
- });
- break;
- default:
- break;
- }
- }
- });
- onFieldValueChange('integrationModes', (field, form2) => {
- const value = field.value;
- formCollapse.activeKeys = field.value;
- const modes = ['page', 'apiClient', 'apiServer', 'ssoClient'];
- const items = modes.concat(field.value).filter((item) => !value?.includes(item)); //未被选中
- // console.log(value);
- items.forEach((i) => {
- form2.setFieldState(`config.${i}`, (state) => {
- state.visible = false;
- });
- });
- field.value?.forEach((parms: any) => {
- form2.setFieldState(`config.${parms}`, (state) => {
- state.visible = true;
- });
- });
- });
- onFieldReact('apiClient.authConfig.oauth2.clientId', (filed) => {
- const parms = filed.query('provider').get('value');
- // console.log(parms);
- if (id && parms === 'internal-standalone') {
- filed.componentProps = {
- disabled: true,
- };
- }
- });
- },
- });
- const handleSave = async () => {
- const data: any = await form.submit();
- //独立应用-api客户端 id?clientId:appId
- if (data.provider === 'internal-standalone') {
- if (data.integrationModes.includes('apiClient')) {
- data.id = data.apiClient.authConfig.oauth2.clientId;
- }
- if (
- data.integrationModes.includes('apiServer') &&
- !data.integrationModes.includes('apiClient')
- ) {
- data.id = data.apiServer.appId;
- }
- }
- //独立应用,单点登录需要api配置和单点登录配置
- if (
- data.provider === 'internal-standalone' &&
- data.integrationModes.includes('ssoClient') &&
- data.integrationModes.length === 1
- ) {
- onlyMessage('配置单点登录需同时配置api配置', 'warning');
- } else {
- if (id) {
- const resp: any = await service.modify(id, data);
- if (resp.status === 200) {
- const isPage = data.integrationModes.includes('page');
- if (isPage) {
- setVisiable(true);
- setDetail(data);
- } else {
- onlyMessage('保存成功');
- const url = getMenuPathByCode('system/Apply');
- history.push(url);
- }
- }
- } else {
- const res: any = await service.save(data);
- if (res.status === 200) {
- const isPage = data.integrationModes.includes('page');
- if (isPage) {
- setVisiable(true);
- setDetail(data);
- } else {
- onlyMessage('保存成功');
- const url = getMenuPathByCode('system/Apply');
- history.push(url);
- }
- }
- }
- }
- // console.log(data);
- };
- //单点登录
- //独立应用
- const ssoStandalone = {
- 'sso.configuration.oAuth2.authorizationUrl': {
- type: 'string',
- title: '授权地址',
- 'x-decorator': 'FormItem',
- 'x-decorator-props': {
- gridSpan: 2,
- layout: 'vertical',
- labelAlign: 'left',
- },
- required: true,
- 'x-component': 'Input',
- 'x-component-props': {
- placeholder: '请输入授权地址',
- },
- 'x-reactions': {
- dependencies: ['integrationModes'],
- fulfill: {
- state: {
- visible: '{{$deps[0] && !$deps[0].includes("apiClient")}}',
- },
- },
- },
- },
- 'sso.configuration.oAuth2.redirectUri': {
- type: 'string',
- title: '回调地址',
- 'x-decorator': 'FormItem',
- 'x-decorator-props': {
- gridSpan: 2,
- layout: 'vertical',
- labelAlign: 'left',
- },
- required: true,
- 'x-component': 'Input',
- 'x-component-props': {
- placeholder: '请输入回调地址',
- },
- 'x-reactions': {
- dependencies: ['integrationModes'],
- fulfill: {
- state: {
- visible: '{{$deps[0] && !$deps[0].includes("apiClient")}}',
- },
- },
- },
- },
- 'sso.configuration.oAuth2.clientId': {
- type: 'string',
- title: 'appId',
- 'x-decorator': 'FormItem',
- 'x-decorator-props': {
- gridSpan: 2,
- layout: 'vertical',
- labelAlign: 'left',
- },
- required: true,
- 'x-component': 'Input',
- 'x-component-props': {
- placeholder: '请输入appId',
- },
- 'x-reactions': {
- dependencies: ['integrationModes'],
- fulfill: {
- state: {
- visible: '{{$deps[0] && !$deps[0].includes("apiClient")}}',
- },
- },
- },
- },
- 'sso.configuration.oAuth2.clientSecret': {
- type: 'string',
- title: 'appKey',
- 'x-decorator': 'FormItem',
- 'x-decorator-props': {
- gridSpan: 2,
- layout: 'vertical',
- labelAlign: 'left',
- },
- required: true,
- 'x-component': 'Input',
- 'x-component-props': {
- placeholder: '请输入appKey',
- },
- 'x-reactions': {
- dependencies: ['integrationModes'],
- fulfill: {
- state: {
- visible: '{{$deps[0] && !$deps[0].includes("apiClient")}}',
- },
- },
- },
- },
- 'sso.autoCreateUser': {
- type: 'string',
- title: '自动创建用户',
- required: true,
- default: false,
- 'x-decorator': 'FormItem',
- 'x-decorator-props': {
- gridSpan: 2,
- layout: 'vertical',
- labelAlign: 'left',
- },
- 'x-component': 'Switch',
- },
- } as any;
- // 微信/钉钉
- const ssoConfig = {
- 'sso.configuration.appKey': {
- type: 'string',
- title: 'appKey',
- 'x-decorator': 'FormItem',
- 'x-decorator-props': {
- gridSpan: 2,
- layout: 'vertical',
- labelAlign: 'left',
- },
- 'x-reactions': {
- dependencies: ['provider'],
- fulfill: {
- state: {
- visible: '{{$deps[0]==="dingtalk-ent-app" }}',
- },
- },
- },
- required: true,
- 'x-component': 'Input',
- 'x-component-props': {
- placeholder: '请输入appKey',
- },
- },
- 'sso.configuration.appId': {
- type: 'string',
- title: 'appId',
- 'x-decorator': 'FormItem',
- 'x-decorator-props': {
- gridSpan: 2,
- layout: 'vertical',
- labelAlign: 'left',
- },
- required: true,
- 'x-component': 'Input',
- 'x-component-props': {
- placeholder: '请输入appId',
- },
- 'x-reactions': {
- dependencies: ['provider'],
- fulfill: {
- state: {
- visible: '{{$deps[0]==="wechat-webapp"}}',
- },
- },
- },
- },
- 'sso.configuration.appSecret': {
- type: 'string',
- title: 'appSecret',
- 'x-decorator': 'FormItem',
- 'x-decorator-props': {
- gridSpan: 2,
- layout: 'vertical',
- labelAlign: 'left',
- },
- required: true,
- 'x-component': 'Input',
- 'x-component-props': {
- placeholder: '请输入appSecret',
- },
- },
- 'sso.autoCreateUser': {
- type: 'string',
- title: '自动创建用户',
- required: true,
- default: false,
- 'x-decorator': 'FormItem',
- 'x-decorator-props': {
- gridSpan: 2,
- layout: 'vertical',
- labelAlign: 'left',
- },
- 'x-component': 'Switch',
- },
- } as any;
- //第三方平台
- const ssoThird = {
- 'sso.configuration.oauth2.type': {
- type: 'string',
- title: '认证方式',
- required: true,
- 'x-decorator': 'FormItem',
- 'x-decorator-props': {
- gridSpan: 2,
- layout: 'vertical',
- labelAlign: 'left',
- },
- 'x-component': 'Select',
- 'x-component-props': {
- placeholder: '请选择认证方式',
- },
- enum: [{ label: 'oauth2', value: 'oauth2' }],
- },
- 'sso.configuration.oauth2.scope': {
- type: 'string',
- title: 'scope',
- 'x-decorator': 'FormItem',
- 'x-decorator-props': {
- gridSpan: 2,
- layout: 'vertical',
- labelAlign: 'left',
- },
- 'x-component': 'Input',
- 'x-component-props': {
- placeholder: '请输入scope',
- },
- },
- 'sso.configuration.oauth2.clientId': {
- type: 'string',
- title: 'client_id',
- required: true,
- 'x-decorator': 'FormItem',
- 'x-decorator-props': {
- gridSpan: 2,
- layout: 'vertical',
- labelAlign: 'left',
- },
- 'x-component': 'Input',
- 'x-component-props': {
- placeholder: '请输入client_id',
- },
- },
- 'sso.configuration.oauth2.clientSecret': {
- type: 'string',
- title: 'client_secret',
- required: true,
- 'x-decorator': 'FormItem',
- 'x-decorator-props': {
- gridSpan: 2,
- layout: 'vertical',
- labelAlign: 'left',
- },
- 'x-component': 'Input',
- 'x-component-props': {
- placeholder: '请输入client_secret',
- },
- },
- 'sso.configuration.oauth2.authorizationUrl': {
- type: 'string',
- title: '授权地址',
- required: true,
- 'x-decorator': 'FormItem',
- 'x-decorator-props': {
- gridSpan: 2,
- layout: 'vertical',
- labelAlign: 'left',
- },
- 'x-component': 'Input',
- 'x-component-props': {
- placeholder: '请输入授权地址',
- },
- },
- 'sso.configuration.oauth2.tokenUrl': {
- type: 'string',
- title: 'token地址',
- required: true,
- 'x-decorator': 'FormItem',
- 'x-decorator-props': {
- gridSpan: 2,
- layout: 'vertical',
- labelAlign: 'left',
- },
- 'x-component': 'Input',
- 'x-component-props': {
- placeholder: '请输入token地址',
- },
- },
- 'sso.configuration.oauth2.userInfoUrl': {
- type: 'string',
- title: '用户信息地址',
- required: true,
- 'x-decorator': 'FormItem',
- 'x-decorator-props': {
- gridSpan: 2,
- layout: 'vertical',
- labelAlign: 'left',
- },
- 'x-component': 'Input',
- 'x-component-props': {
- placeholder: '请输入用户信息地址',
- },
- },
- 'sso.configuration.oauth2.userProperty': {
- type: 'object',
- properties: {
- userId: {
- type: 'string',
- title: '用户ID',
- required: true,
- 'x-decorator': 'FormItem',
- 'x-decorator-props': {
- gridSpan: 2,
- layout: 'vertical',
- labelAlign: 'left',
- tooltip: '通过jsonpath表达式从授权结果中获取第三方平台用户的唯一标识',
- },
- 'x-component': 'Input',
- 'x-component-props': {
- placeholder: '输入从用户信息接口返回数据中的用户ID字段。示例:result.id',
- },
- },
- username: {
- type: 'string',
- title: '用户名',
- required: true,
- 'x-decorator': 'FormItem',
- 'x-decorator-props': {
- gridSpan: 2,
- layout: 'vertical',
- labelAlign: 'left',
- },
- 'x-component': 'Input',
- 'x-component-props': {
- placeholder: '输入从用户信息接口返回数据中的用户名字段。示例:result.name',
- },
- },
- avatar: {
- type: 'string',
- title: '头像',
- 'x-decorator': 'FormItem',
- 'x-decorator-props': {
- gridSpan: 2,
- layout: 'vertical',
- labelAlign: 'left',
- },
- 'x-component': 'Input',
- 'x-component-props': {
- placeholder: '输入从用户信息接口返回数据中的用户头像字段。示例:result.avatar',
- },
- },
- },
- },
- 'sso.autoCreateUser': {
- type: 'string',
- title: '自动创建用户',
- required: true,
- default: false,
- 'x-decorator': 'FormItem',
- 'x-decorator-props': {
- gridSpan: 2,
- layout: 'vertical',
- labelAlign: 'left',
- },
- 'x-component': 'Switch',
- 'x-component-props': {
- placeholder: '请输入',
- },
- },
- } as any;
- //内部独立应用-客户端
- const clientStandalone = {
- 'apiClient.baseUrl': {
- type: 'string',
- title: '接口地址',
- 'x-decorator': 'FormItem',
- 'x-decorator-props': {
- gridSpan: 2,
- layout: 'vertical',
- labelAlign: 'left',
- tooltip: '访问Api服务的地址',
- },
- required: true,
- 'x-component': 'Input',
- 'x-component-props': {
- placeholder: '请输入接口地址',
- },
- },
- 'apiClient.authConfig.type': {
- type: 'string',
- title: '认证方式',
- 'x-hidden': true,
- 'x-decorator': 'FormItem',
- 'x-decorator-props': {
- gridSpan: 2,
- layout: 'vertical',
- labelAlign: 'left',
- },
- required: true,
- 'x-component': 'Input',
- default: 'oauth2',
- },
- 'apiClient.authConfig.oauth2.authorizationUrl': {
- type: 'string',
- title: '授权地址',
- 'x-decorator': 'FormItem',
- 'x-decorator-props': {
- gridSpan: 2,
- layout: 'vertical',
- labelAlign: 'left',
- },
- required: true,
- 'x-component': 'Input',
- 'x-component-props': {
- placeholder: '请输入授权地址',
- },
- },
- 'apiClient.authConfig.oauth2.redirectUri': {
- type: 'string',
- title: '回调地址',
- 'x-decorator': 'FormItem',
- 'x-decorator-props': {
- gridSpan: 2,
- layout: 'vertical',
- labelAlign: 'left',
- },
- required: true,
- 'x-component': 'Input',
- 'x-component-props': {
- placeholder: '请输入回调地址',
- },
- },
- 'apiClient.authConfig.oauth2.clientId': {
- type: 'string',
- title: 'appId',
- 'x-decorator': 'FormItem',
- 'x-decorator-props': {
- gridSpan: 2,
- layout: 'vertical',
- labelAlign: 'left',
- },
- required: true,
- 'x-component': 'Input',
- 'x-component-props': {
- placeholder: '请输入appId',
- },
- },
- 'apiClient.authConfig.oauth2.clientSecret': {
- type: 'string',
- title: 'appKey',
- 'x-decorator': 'FormItem',
- 'x-decorator-props': {
- gridSpan: 2,
- layout: 'vertical',
- labelAlign: 'left',
- },
- required: true,
- 'x-component': 'Input',
- 'x-component-props': {
- placeholder: '请输入appKey',
- },
- },
- } as any;
- //第三方平台-客户端
- const clientThird = {
- apiClient: {
- type: 'object',
- properties: {
- baseUrl: {
- type: 'string',
- title: '接口地址',
- 'x-decorator': 'FormItem',
- 'x-decorator-props': {
- gridSpan: 2,
- layout: 'vertical',
- labelAlign: 'left',
- tooltip: '访问iot平台接口的地址',
- },
- required: true,
- 'x-component': 'Input',
- 'x-component-props': {
- placeholder: '请输入接口地址',
- },
- },
- authConfig: {
- type: 'object',
- properties: {
- type: {
- type: 'string',
- title: '认证方式',
- 'x-decorator': 'FormItem',
- 'x-decorator-props': {
- gridSpan: 2,
- layout: 'vertical',
- labelAlign: 'left',
- },
- required: true,
- 'x-component': 'Select',
- default: 'oauth2',
- enum: [
- { label: 'OAuth2', value: 'oauth2' },
- { label: '基本认证', value: 'basic' },
- { label: 'bearer认证', value: 'bearer' },
- ],
- },
- bearer: {
- type: 'object',
- 'x-reactions': {
- dependencies: ['.type'],
- fulfill: {
- state: {
- visible: '{{$deps[0] ==="bearer"}}',
- },
- },
- },
- properties: {
- token: {
- type: 'string',
- title: 'token',
- 'x-decorator': 'FormItem',
- 'x-decorator-props': {
- gridSpan: 2,
- layout: 'vertical',
- labelAlign: 'left',
- },
- required: true,
- 'x-component': 'Input',
- 'x-component-props': {
- placeholder: '请输入token',
- },
- },
- },
- },
- basic: {
- type: 'object',
- 'x-reactions': {
- dependencies: ['.type'],
- fulfill: {
- state: {
- visible: '{{$deps[0] ==="basic"}}',
- },
- },
- },
- properties: {
- username: {
- type: 'string',
- title: '用户名',
- 'x-decorator': 'FormItem',
- 'x-decorator-props': {
- gridSpan: 2,
- layout: 'vertical',
- labelAlign: 'left',
- },
- required: true,
- 'x-component': 'Input',
- 'x-component-props': {
- placeholder: '请输入用户名',
- },
- },
- password: {
- type: 'string',
- title: '密码',
- 'x-decorator': 'FormItem',
- 'x-decorator-props': {
- gridSpan: 2,
- layout: 'vertical',
- labelAlign: 'left',
- },
- required: true,
- 'x-component': 'Input',
- 'x-component-props': {
- placeholder: '请输入密码',
- },
- },
- },
- },
- oauth2: {
- type: 'object',
- 'x-reactions': {
- dependencies: ['.type'],
- fulfill: {
- state: {
- visible: '{{$deps[0] ==="oauth2"}}',
- },
- },
- },
- properties: {
- authorizationUrl: {
- type: 'string',
- title: '授权地址',
- 'x-decorator': 'FormItem',
- 'x-decorator-props': {
- gridSpan: 2,
- layout: 'vertical',
- labelAlign: 'left',
- },
- required: true,
- 'x-component': 'Input',
- },
- tokenRequestType: {
- type: 'string',
- title: '请求方式',
- 'x-decorator': 'FormItem',
- 'x-decorator-props': {
- gridSpan: 2,
- layout: 'vertical',
- labelAlign: 'left',
- },
- required: true,
- 'x-component': 'Select',
- default: 'POST_BODY',
- enum: [
- { label: '请求体', value: 'POST_BODY' },
- { label: '请求头', value: 'POST_URI' },
- ],
- },
- // tokenRequest: {
- // type: 'string',
- // title: '请求类型',
- // 'x-decorator': 'FormItem',
- // 'x-decorator-props': {
- // gridSpan: 2,
- // layout: 'vertical',
- // labelAlign: 'left',
- // },
- // required: true,
- // 'x-component': 'Select',
- // default: 'POST_BODY',
- // enum: [
- // { label: '请求体', value: 'POST_BODY' },
- // { label: '请求头', value: 'POST_URI' },
- // ]
- // },
- clientId: {
- type: 'string',
- title: 'client_id',
- 'x-decorator': 'FormItem',
- 'x-decorator-props': {
- gridSpan: 2,
- layout: 'vertical',
- labelAlign: 'left',
- },
- required: true,
- 'x-component': 'Input',
- },
- clientSecret: {
- type: 'string',
- title: 'client_secret',
- 'x-decorator': 'FormItem',
- 'x-decorator-props': {
- gridSpan: 2,
- layout: 'vertical',
- labelAlign: 'left',
- },
- required: true,
- 'x-component': 'Input',
- },
- },
- },
- },
- },
- },
- },
- } as any;
- const schema = {
- type: 'object',
- properties: {
- name: {
- type: 'string',
- title: '名称',
- required: true,
- 'x-decorator': 'FormItem',
- 'x-component': 'Input',
- 'x-component-props': {
- placeholder: '请输入名称',
- },
- 'x-validator': [
- {
- max: 64,
- message: '最多可输入64个字符',
- },
- {
- required: true,
- message: '请输入名称',
- },
- ],
- },
- provider: {
- title: '应用',
- 'x-decorator': 'FormItem',
- 'x-component': 'Radio.Group',
- 'x-component-props': {
- optionType: 'button',
- placeholder: '请选择应用',
- },
- required: true,
- // 'x-reactions': '{{useAsyncDataSource(getProvidersAll)}}',
- 'x-decorator-props': {
- gridSpan: 1,
- },
- default: 'internal-standalone',
- enum: providerList,
- 'x-validator': [
- {
- required: true,
- message: '请选择应用',
- },
- ],
- },
- integrationModes: {
- type: 'array',
- title: '接入方式',
- // 'x-hidden': true,
- enum: integrationModesList,
- 'x-decorator': 'FormItem',
- 'x-component': 'Checkbox.Group',
- 'x-validator': [
- {
- required: true,
- message: '请选择接入方式',
- },
- ],
- },
- config: {
- type: 'void',
- // 'x-hidden': true,
- 'x-decorator': 'FormItem',
- 'x-decorator-props': {
- gridSpan: 2,
- },
- 'x-component': 'FormCollapse',
- 'x-reactions': {
- dependencies: ['integrationModes'],
- fulfill: {
- state: {
- visible: '{{$deps[0] && $deps[0].length!==0}}',
- },
- },
- },
- 'x-component-props': {
- formCollapse: '{{formCollapse}}',
- },
- properties: {
- apiServer: {
- type: 'void',
- 'x-component': 'FormCollapse.CollapsePanel',
- 'x-component-props': {
- header: 'API服务',
- },
- properties: {
- 'apiServer.appId': {
- type: 'string',
- title: 'appId',
- default: randomString(16),
- 'x-decorator': 'FormItem',
- 'x-decorator-props': {
- gridSpan: 2,
- layout: 'vertical',
- labelAlign: 'left',
- },
- required: true,
- 'x-component': 'Input',
- 'x-component-props': {
- disabled: true,
- },
- 'x-reactions': {
- dependencies: ['integrationModes'],
- fulfill: {
- state: {
- visible: '{{!$deps[0].includes("apiClient")}}',
- },
- },
- },
- },
- 'apiServer.secureKey': {
- type: 'string',
- title: 'secureKey',
- default: randomString(),
- 'x-decorator': 'FormItem',
- 'x-decorator-props': {
- gridSpan: 2,
- layout: 'vertical',
- labelAlign: 'left',
- },
- required: true,
- 'x-component': 'Input',
- 'x-component-props': {
- placeholder: '请输入secureKey',
- },
- },
- 'apiServer.redirectUri': {
- type: 'string',
- title: '回调地址',
- 'x-decorator': 'FormItem',
- 'x-decorator-props': {
- gridSpan: 2,
- layout: 'vertical',
- labelAlign: 'left',
- },
- required: true,
- 'x-component': 'Input',
- 'x-component-props': {
- placeholder: '请输入回调地址',
- },
- },
- 'apiServer.roleIdList': {
- title: '角色',
- 'x-decorator': 'FormItem',
- required: true,
- 'x-component': 'Select',
- 'x-component-props': {
- mode: 'multiple',
- showArrow: true,
- placeholder: '请选择角色',
- filterOption: (input: string, option: any) =>
- option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0,
- },
- 'x-reactions': ['{{useAsyncData(getRole)}}'],
- 'x-decorator-props': {
- gridSpan: 2,
- layout: 'vertical',
- labelAlign: 'left',
- addonAfter: (
- <PermissionButton
- type="link"
- style={{ padding: 0 }}
- isPermission={rolePermission.add}
- onClick={() => {
- const tab: any = window.open(`${origin}/#/system/role?save=true`);
- tab!.onTabSaveSuccess = (value: any) => {
- form.setFieldState('roleIdList', async (state) => {
- state.dataSource = await getRole().then((resp) =>
- resp.result?.map((item: Record<string, unknown>) => ({
- ...item,
- label: item.name,
- value: item.id,
- })),
- );
- state.value = [...(state.value || []), value.id];
- });
- };
- }}
- >
- <PlusOutlined />
- </PermissionButton>
- ),
- },
- },
- apiServerThird: {
- type: 'void',
- 'x-reactions': {
- dependencies: ['provider'],
- fulfill: {
- state: {
- visible: '{{$deps[0] && $deps[0]==="third-party"}}',
- },
- },
- },
- properties: {
- 'apiServer.redirectUri': {
- type: 'string',
- title: 'redirectUrl',
- 'x-decorator': 'FormItem',
- 'x-decorator-props': {
- gridSpan: 2,
- layout: 'vertical',
- labelAlign: 'left',
- tooltip: '授权后自动跳转的页面地址',
- },
- required: true,
- 'x-component': 'Input',
- 'x-component-props': {
- placeholder: '请输入redirectUrl',
- },
- },
- 'apiServer.ipWhiteList': {
- type: 'string',
- title: 'IP白名单',
- 'x-decorator': 'FormItem',
- 'x-decorator-props': {
- gridSpan: 2,
- layout: 'vertical',
- labelAlign: 'left',
- },
- 'x-component': 'Input.TextArea',
- 'x-component-props': {
- placeholder: '请输入IP白名单,多个地址回车分隔,不填默认均可访问',
- rows: 3,
- },
- },
- },
- },
- },
- },
- apiClient: {
- type: 'void',
- 'x-component': 'FormCollapse.CollapsePanel',
- 'x-component-props': {
- header: 'API客户端',
- },
- properties: {
- standaloneConfig: {
- type: 'void',
- 'x-reactions': {
- dependencies: ['provider'],
- fulfill: {
- state: {
- visible: '{{$deps[0] && $deps[0]==="internal-standalone"}}',
- },
- },
- },
- properties: { ...clientStandalone },
- },
- thirdConfig: {
- type: 'void',
- 'x-reactions': {
- dependencies: ['provider'],
- fulfill: {
- state: {
- visible: '{{$deps[0]==="third-party"}}',
- },
- },
- },
- properties: { ...clientThird },
- },
- integratedConfig: {
- type: 'void',
- 'x-reactions': {
- dependencies: ['provider'],
- fulfill: {
- state: {
- visible: '{{$deps[0]==="internal-integrated"}}',
- },
- },
- },
- properties: {
- 'apiClient.baseUrl': {
- type: 'string',
- title: '接口地址',
- 'x-decorator': 'FormItem',
- 'x-decorator-props': {
- gridSpan: 2,
- layout: 'vertical',
- labelAlign: 'left',
- tooltip: '访问Api服务的地址',
- },
- required: true,
- 'x-component': 'Input',
- 'x-component-props': {
- placeholder: '请输入接口地址',
- },
- },
- },
- },
- 'apiClient.headers': {
- type: 'array',
- default: [{}],
- title: '请求头',
- 'x-decorator': 'FormItem',
- // required: true,
- 'x-component': 'ArrayTable',
- 'x-reactions': {
- dependencies: ['provider'],
- fulfill: {
- state: {
- visible: '{{$deps[0] && $deps[0]!=="internal-integrated"}}',
- },
- },
- },
- 'x-decorator-props': {
- gridSpan: 2,
- layout: 'vertical',
- labelAlign: 'left',
- },
- items: {
- type: 'object',
- properties: {
- column1: {
- type: 'void',
- // required: true,
- 'x-component': 'ArrayTable.Column',
- 'x-component-props': { width: 100, title: 'key' },
- properties: {
- key: {
- // required: true,
- 'x-decorator': 'FormItem',
- 'x-component': 'Input',
- },
- },
- },
- column2: {
- type: 'void',
- 'x-component': 'ArrayTable.Column',
- 'x-component-props': { width: 100, title: 'value' },
- properties: {
- value: {
- // required: true,
- 'x-decorator': 'FormItem',
- 'x-component': 'Input',
- },
- },
- },
- column3: {
- type: 'void',
- 'x-component': 'ArrayTable.Column',
- 'x-component-props': { width: 30 },
- properties: {
- remove: {
- type: 'void',
- 'x-component': 'ArrayTable.Remove',
- },
- },
- },
- },
- },
- properties: {
- add: {
- type: 'void',
- 'x-component': 'ArrayTable.Addition',
- title: '添加请求头',
- },
- },
- },
- 'apiClient.parameters': {
- type: 'array',
- default: [{}],
- title: '参数',
- 'x-reactions': {
- dependencies: ['provider'],
- fulfill: {
- state: {
- visible: '{{$deps[0] && $deps[0]!=="internal-integrated"}}',
- },
- },
- },
- 'x-decorator': 'FormItem',
- // required: true,
- 'x-component': 'ArrayTable',
- 'x-decorator-props': {
- gridSpan: 2,
- layout: 'vertical',
- labelAlign: 'left',
- },
- items: {
- type: 'object',
- properties: {
- column1: {
- type: 'void',
- // required: true,
- 'x-component': 'ArrayTable.Column',
- 'x-component-props': { width: 100, title: 'key' },
- properties: {
- key: {
- // required: true,
- 'x-decorator': 'FormItem',
- 'x-component': 'Input',
- },
- },
- },
- column2: {
- type: 'void',
- 'x-component': 'ArrayTable.Column',
- 'x-component-props': { width: 100, title: 'value' },
- properties: {
- value: {
- // required: true,
- 'x-decorator': 'FormItem',
- 'x-component': 'Input',
- },
- },
- },
- column3: {
- type: 'void',
- 'x-component': 'ArrayTable.Column',
- 'x-component-props': { width: 30 },
- properties: {
- remove: {
- type: 'void',
- 'x-component': 'ArrayTable.Remove',
- },
- },
- },
- },
- },
- properties: {
- add: {
- type: 'void',
- 'x-component': 'ArrayTable.Addition',
- title: '添加参数',
- },
- },
- },
- },
- },
- page: {
- type: 'void',
- 'x-component': 'FormCollapse.CollapsePanel',
- 'x-component-props': {
- header: '页面集成',
- },
- properties: {
- 'page.baseUrl': {
- type: 'string',
- title: '接入地址',
- 'x-decorator': 'FormItem',
- 'x-decorator-props': {
- gridSpan: 2,
- layout: 'vertical',
- labelAlign: 'left',
- tooltip: '填写访问其它平台的地址',
- },
- required: true,
- 'x-component': 'Input',
- 'x-component-props': {
- placeholder: '请输入接入地址',
- },
- },
- 'page.routeType': {
- type: 'string',
- title: '路由方式',
- 'x-decorator': 'FormItem',
- // 'x-reactions': {
- // dependencies: ['provider'],
- // fulfill: {
- // state: {
- // visible: '{{$deps[0]==="internal-integrated"}}',
- // },
- // },
- // },
- 'x-decorator-props': {
- gridSpan: 2,
- layout: 'vertical',
- labelAlign: 'left',
- },
- required: true,
- 'x-component': 'Select',
- default: 'hash',
- enum: [
- { label: 'hash', value: 'hash' },
- { label: 'history', value: 'history' },
- ],
- },
- 'page.parameters': {
- type: 'array',
- default: [{}],
- title: '参数',
- 'x-decorator': 'FormItem',
- required: true,
- 'x-component': 'ArrayTable',
- 'x-reactions': {
- dependencies: ['provider'],
- fulfill: {
- state: {
- visible: '{{$deps[0]==="third-party"}}',
- },
- },
- },
- 'x-decorator-props': {
- gridSpan: 2,
- layout: 'vertical',
- labelAlign: 'left',
- tooltip: '自定义参数,格式${name}',
- },
- items: {
- type: 'object',
- properties: {
- column1: {
- type: 'void',
- // required: true,
- 'x-component': 'ArrayTable.Column',
- 'x-component-props': { width: 100, title: 'key' },
- properties: {
- key: {
- // required: true,
- 'x-decorator': 'FormItem',
- 'x-component': 'Input',
- },
- },
- },
- column2: {
- type: 'void',
- 'x-component': 'ArrayTable.Column',
- 'x-component-props': { width: 100, title: 'value' },
- properties: {
- value: {
- // required: true,
- 'x-decorator': 'FormItem',
- 'x-component': 'AutoComplete',
- 'x-component-props': {
- options: [{ value: '用户ID' }, { value: '用户名' }, { value: 'token' }],
- },
- },
- },
- },
- column3: {
- type: 'void',
- 'x-component': 'ArrayTable.Column',
- 'x-component-props': { width: 50 },
- properties: {
- remove: {
- type: 'void',
- 'x-component': 'ArrayTable.Remove',
- },
- },
- },
- },
- },
- properties: {
- add: {
- type: 'void',
- 'x-component': 'ArrayTable.Addition',
- title: '添加参数',
- },
- },
- },
- },
- },
- ssoClient: {
- type: 'void',
- 'x-component': 'FormCollapse.CollapsePanel',
- 'x-component-props': {
- header: '单点登录',
- },
- properties: {
- standaloneConfig: {
- type: 'void',
- 'x-reactions': {
- dependencies: ['provider'],
- fulfill: {
- state: {
- visible: '{{$deps[0] && $deps[0]==="internal-standalone"}}',
- },
- },
- },
- properties: { ...ssoStandalone },
- },
- ssoConfig: {
- type: 'void',
- 'x-reactions': {
- dependencies: ['provider'],
- fulfill: {
- state: {
- visible: '{{$deps[0]==="wechat-webapp" || $deps[0]==="dingtalk-ent-app"}}',
- },
- },
- },
- properties: { ...ssoConfig },
- },
- thirdConfig: {
- type: 'void',
- 'x-reactions': {
- dependencies: ['provider'],
- fulfill: {
- state: {
- visible: '{{$deps[0]==="third-party"}}',
- },
- },
- },
- properties: { ...ssoThird },
- },
- userConfig: {
- type: 'void',
- 'x-decorator': 'FormGrid',
- 'x-hidden': true,
- 'x-decorator-props': {
- maxColumns: 2,
- minColumns: 2,
- columnGap: 24,
- },
- 'x-reactions': {
- dependencies: ['sso.autoCreateUser'],
- fulfill: {
- state: {
- visible: '{{$deps[0]}}',
- },
- },
- },
- properties: {
- 'sso.usernamePrefix': {
- type: 'string',
- title: '用户名前缀',
- 'x-decorator': 'FormItem',
- 'x-decorator-props': {
- gridSpan: 2,
- layout: 'vertical',
- labelAlign: 'left',
- },
- required: true,
- 'x-component': 'Input',
- 'x-component-props': {
- placeholder: '请输入用户名前缀',
- },
- },
- 'sso.defaultPasswd': {
- type: 'string',
- title: '默认密码',
- 'x-decorator': 'FormItem',
- 'x-decorator-props': {
- gridSpan: 2,
- layout: 'vertical',
- labelAlign: 'left',
- },
- required: true,
- 'x-component': 'Input',
- 'x-component-props': {
- placeholder: '请输入默认密码',
- },
- },
- 'sso.roleIdList': {
- title: '角色',
- 'x-decorator': 'FormItem',
- 'x-component': 'Select',
- 'x-component-props': {
- mode: 'multiple',
- showArrow: true,
- placeholder: '请选择角色',
- filterOption: (input: string, option: any) =>
- option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0,
- },
- 'x-reactions': ['{{useAsyncData(getRole)}}'],
- 'x-decorator-props': {
- gridSpan: 2,
- layout: 'vertical',
- labelAlign: 'left',
- addonAfter: (
- <PermissionButton
- type="link"
- style={{ padding: 0 }}
- isPermission={rolePermission.add}
- onClick={() => {
- const tab: any = window.open(`${origin}/#/system/role?save=true`);
- tab!.onTabSaveSuccess = (value: any) => {
- form.setFieldState('roleIdList', async (state) => {
- state.dataSource = await getRole().then((resp) =>
- resp.result?.map((item: Record<string, unknown>) => ({
- ...item,
- label: item.name,
- value: item.id,
- })),
- );
- state.value = [...(state.value || []), value.id];
- });
- };
- }}
- >
- <PlusOutlined />
- </PermissionButton>
- ),
- },
- },
- 'sso.orgIdList': {
- title: '组织',
- 'x-decorator': 'FormItem',
- 'x-component': 'TreeSelect',
- 'x-component-props': {
- multiple: true,
- showArrow: true,
- placeholder: '请选择组织',
- showCheckedStrategy: ATreeSelect.SHOW_ALL,
- filterOption: (input: string, option: any) =>
- option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0,
- fieldNames: {
- label: 'name',
- value: 'id',
- },
- treeNodeFilterProp: 'name',
- },
- 'x-decorator-props': {
- gridSpan: 2,
- layout: 'vertical',
- labelAlign: 'left',
- addonAfter: (
- <PermissionButton
- type="link"
- style={{ padding: 0 }}
- isPermission={deptPermission.add}
- onClick={() => {
- const tab: any = window.open(`${origin}/#/system/department?save=true`);
- tab!.onTabSaveSuccess = (value: any) => {
- form.setFieldState('orgIdList', async (state) => {
- state.dataSource = await getOrg().then((resp) =>
- resp.result?.map((item: Record<string, unknown>) => ({
- ...item,
- label: item.name,
- value: item.id,
- })),
- );
- state.value = [...(state.value || []), value.id];
- });
- };
- }}
- >
- <PlusOutlined />
- </PermissionButton>
- ),
- },
- 'x-reactions': ['{{useAsyncData(getOrg)}}'],
- },
- },
- },
- },
- },
- },
- },
- description: {
- title: '说明',
- 'x-component': 'Input.TextArea',
- 'x-decorator': 'FormItem',
- 'x-component-props': {
- rows: 3,
- showCount: true,
- maxLength: 200,
- placeholder: '请输入说明',
- },
- },
- },
- };
- useEffect(() => {
- setView(false);
- const params = new URLSearchParams(location.search);
- const item = params.get('id');
- // console.log(id);
- if (item) {
- setId(item);
- }
- if (location && location.state) {
- setView(location.state.view);
- }
- }, [location]);
- return (
- <PageContainer>
- <Card>
- <Row gutter={24}>
- <Col span={14}>
- {/* <TitleComponent data={'基本信息'} /> */}
- <Form form={form} layout="vertical" className={styles.form}>
- <SchemaField
- schema={schema}
- scope={{
- formCollapse,
- useAsyncDataSource,
- useAsyncData,
- // getProvidersAll,
- getRole,
- getOrg,
- }}
- />
- <FormButtonGroup.Sticky>
- <FormButtonGroup.FormItem>
- {!view && (
- <PermissionButton
- type="primary"
- isPermission={permission.add || permission.update}
- onClick={() => handleSave()}
- >
- 保存
- </PermissionButton>
- )}
- </FormButtonGroup.FormItem>
- </FormButtonGroup.Sticky>
- </Form>
- </Col>
- <Col span={10} className={styles.apply}>
- <div className={styles.doc}>文档</div>
- </Col>
- </Row>
- </Card>
- {visible && (
- <MenuPage
- data={detail}
- close={() => {
- setVisiable(false);
- }}
- />
- )}
- </PageContainer>
- );
- };
- export default Save;
|