diff --git a/eiam-console/src/main/console-fe/package.json b/eiam-console/src/main/console-fe/package.json index ad3770ce..5c3e62bc 100644 --- a/eiam-console/src/main/console-fe/package.json +++ b/eiam-console/src/main/console-fe/package.json @@ -47,7 +47,7 @@ "@ant-design/charts": "^1.4.2", "@ant-design/icons": "^5.2.6", "@ant-design/maps": "^1.0.7", - "@ant-design/pro-components": "^2.6.16", + "@ant-design/pro-components": "^2.6.18", "ahooks": "^3.7.8", "antd": "^5.8.6", "antd-img-crop": "^4.12.2", @@ -89,14 +89,14 @@ "@types/google-libphonenumber": "^7.4.26", "@types/history": "^4.7.11", "@types/js-yaml": "^4.0.5", - "@types/lodash": "^4.14.197", + "@types/lodash": "^4.14.198", "@types/numeral": "^2.0.2", "@types/qs": "^6.9.8", "@types/react": "^18.2.21", "@types/react-dom": "^18.2.7", "@types/react-helmet": "^6.1.6", - "@umijs/lint": "^4.0.79", - "@umijs/max": "^4.0.79", + "@umijs/lint": "^4.0.80", + "@umijs/max": "^4.0.80", "cross-env": "^7.0.3", "cross-port-killer": "^1.4.0", "eslint": "^8.48.0", diff --git a/eiam-console/src/main/console-fe/src/components/IconFont/lib/iconfont.js b/eiam-console/src/main/console-fe/src/components/IconFont/lib/iconfont.js index 90ee4748..43cd3bd7 100644 --- a/eiam-console/src/main/console-fe/src/components/IconFont/lib/iconfont.js +++ b/eiam-console/src/main/console-fe/src/components/IconFont/lib/iconfont.js @@ -15,4 +15,69 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ -window._iconfont_svg_string_3203993='',function(c){var l=(l=document.getElementsByTagName("script"))[l.length-1],a=l.getAttribute("data-injectcss"),l=l.getAttribute("data-disable-injectsvg");if(!l){var h,t,i,p,m,d=function(l,a){a.parentNode.insertBefore(l,a)};if(a&&!c.__iconfont__svg__cssinject__){c.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(l){console&&console.log(l)}}h=function(){let l,a=document.createElement("div");a.innerHTML=c._iconfont_svg_string_3203993,(a=a.getElementsByTagName("svg")[0])&&(a.setAttribute("aria-hidden","true"),a.style.position="absolute",a.style.width=0,a.style.height=0,a.style.overflow="hidden",a=a,(l=document.body).firstChild?d(a,l.firstChild):l.appendChild(a))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(h,0):(t=function(){document.removeEventListener("DOMContentLoaded",t,!1),h()},document.addEventListener("DOMContentLoaded",t,!1)):document.attachEvent&&(i=h,p=c.document,m=!1,o(),p.onreadystatechange=function(){"complete"==p.readyState&&(p.onreadystatechange=null,z())})}function z(){m||(m=!0,i())}function o(){try{p.documentElement.doScroll("left")}catch(l){return void setTimeout(o,50)}z()}}(window); +(window._iconfont_svg_string_3203993 = + ''), + (function (c) { + var l = (l = document.getElementsByTagName('script'))[l.length - 1], + a = l.getAttribute('data-injectcss'), + l = l.getAttribute('data-disable-injectsvg'); + if (!l) { + var h, + t, + i, + p, + m, + d = function (l, a) { + a.parentNode.insertBefore(l, a); + }; + if (a && !c.__iconfont__svg__cssinject__) { + c.__iconfont__svg__cssinject__ = !0; + try { + document.write( + '', + ); + } catch (l) { + console && console.log(l); + } + } + (h = function () { + let l, + a = document.createElement('div'); + (a.innerHTML = c._iconfont_svg_string_3203993), + (a = a.getElementsByTagName('svg')[0]) && + (a.setAttribute('aria-hidden', 'true'), + (a.style.position = 'absolute'), + (a.style.width = 0), + (a.style.height = 0), + (a.style.overflow = 'hidden'), + (a = a), + (l = document.body).firstChild ? d(a, l.firstChild) : l.appendChild(a)); + }), + document.addEventListener + ? ~['complete', 'loaded', 'interactive'].indexOf(document.readyState) + ? setTimeout(h, 0) + : ((t = function () { + document.removeEventListener('DOMContentLoaded', t, !1), h(); + }), + document.addEventListener('DOMContentLoaded', t, !1)) + : document.attachEvent && + ((i = h), + (p = c.document), + (m = !1), + o(), + (p.onreadystatechange = function () { + 'complete' == p.readyState && ((p.onreadystatechange = null), z()); + })); + } + function z() { + m || ((m = !0), i()); + } + function o() { + try { + p.documentElement.doScroll('left'); + } catch (l) { + return void setTimeout(o, 50); + } + z(); + } + })(window); diff --git a/eiam-console/src/main/console-fe/src/components/UserAvatar/UserAvatar.tsx b/eiam-console/src/main/console-fe/src/components/UserAvatar/UserAvatar.tsx index 078d52ea..499d4075 100644 --- a/eiam-console/src/main/console-fe/src/components/UserAvatar/UserAvatar.tsx +++ b/eiam-console/src/main/console-fe/src/components/UserAvatar/UserAvatar.tsx @@ -16,7 +16,7 @@ * along with this program. If not, see . */ import { Avatar, Image } from 'antd'; -import { AvatarSize } from 'antd/es/avatar/SizeContext'; +import { AvatarSize } from 'antd/es/avatar/AvatarContext'; export default (props: { avatar: string; diff --git a/eiam-console/src/main/console-fe/src/pages/account/UserDetail/UserDetail.tsx b/eiam-console/src/main/console-fe/src/pages/account/UserDetail/UserDetail.tsx index cb98e2ca..504bbb80 100644 --- a/eiam-console/src/main/console-fe/src/pages/account/UserDetail/UserDetail.tsx +++ b/eiam-console/src/main/console-fe/src/pages/account/UserDetail/UserDetail.tsx @@ -46,7 +46,7 @@ export default () => { history.push(`/account/user`); return; } - if (!type) { + if (!type || !UserDetailTabs[type]) { setTabActiveKey(UserDetailTabs.user_info); history.replace({ pathname: location.pathname, diff --git a/eiam-console/src/main/console-fe/src/pages/account/UserGroupDetail/UserGroupDetail.tsx b/eiam-console/src/main/console-fe/src/pages/account/UserGroupDetail/UserGroupDetail.tsx index 8cd23ffa..fee130d5 100644 --- a/eiam-console/src/main/console-fe/src/pages/account/UserGroupDetail/UserGroupDetail.tsx +++ b/eiam-console/src/main/console-fe/src/pages/account/UserGroupDetail/UserGroupDetail.tsx @@ -55,7 +55,7 @@ export default () => { history.push(`/account/user-group`); return; } - if (!type) { + if (!type || !UserGroupDetailTabs[type]) { setTabActiveKey(UserGroupDetailTabs.member); history.push({ pathname: location.pathname, diff --git a/eiam-console/src/main/console-fe/src/pages/account/UserGroupList/components/AddUserGroup/AddUserGroup.tsx b/eiam-console/src/main/console-fe/src/pages/account/UserGroupList/components/AddUserGroup/AddUserGroup.tsx index aba73683..de0a10bc 100644 --- a/eiam-console/src/main/console-fe/src/pages/account/UserGroupList/components/AddUserGroup/AddUserGroup.tsx +++ b/eiam-console/src/main/console-fe/src/pages/account/UserGroupList/components/AddUserGroup/AddUserGroup.tsx @@ -48,8 +48,10 @@ export default (props: { preserve={false} width="500px" open={visible} - onOpenChange={() => { - form.setFieldsValue({ code: random(9) }); + onOpenChange={(visible) => { + if (visible) { + form.setFieldsValue({ code: random(9) }); + } }} modalProps={{ maskClosable: true, @@ -58,9 +60,9 @@ export default (props: { }} onFinish={async (values: AccountAPI.BaseUserGroup) => { setLoading(true); - const result = await onFinish(values); - setLoading(false); - return !!result; + await onFinish(values).finally(() => { + setLoading(false); + }); }} > diff --git a/eiam-console/src/main/console-fe/src/pages/account/UserList/components/CreateUser/CreateUser.tsx b/eiam-console/src/main/console-fe/src/pages/account/UserList/components/CreateUser/CreateUser.tsx index ceee1ee9..f7c8ebfa 100644 --- a/eiam-console/src/main/console-fe/src/pages/account/UserList/components/CreateUser/CreateUser.tsx +++ b/eiam-console/src/main/console-fe/src/pages/account/UserList/components/CreateUser/CreateUser.tsx @@ -136,7 +136,7 @@ const CreateUser = (props: CreateUserProps) => { */ const cancel = async () => { if (onCancel) { - await onCancel(); + onCancel(); } setSubmitLoading(false); form.resetFields(); diff --git a/eiam-console/src/main/console-fe/src/pages/account/UserList/components/UpdateUser/UpdateUser.tsx b/eiam-console/src/main/console-fe/src/pages/account/UserList/components/UpdateUser/UpdateUser.tsx index 9dc91c65..a7a61cc4 100644 --- a/eiam-console/src/main/console-fe/src/pages/account/UserList/components/UpdateUser/UpdateUser.tsx +++ b/eiam-console/src/main/console-fe/src/pages/account/UserList/components/UpdateUser/UpdateUser.tsx @@ -99,7 +99,7 @@ const UpdateUser = (props: UpdateFormProps) => { */ const cancel = async () => { if (onCancel) { - await onCancel(); + onCancel(); } setSubmitLoading(false); form.resetFields(); diff --git a/eiam-console/src/main/console-fe/src/pages/app/AppConfig/data.d.ts b/eiam-console/src/main/console-fe/src/pages/app/AppConfig/data.d.ts index e708a4be..6e31e932 100644 --- a/eiam-console/src/main/console-fe/src/pages/app/AppConfig/data.d.ts +++ b/eiam-console/src/main/console-fe/src/pages/app/AppConfig/data.d.ts @@ -38,3 +38,105 @@ export type GetApp = { enabled: boolean; remark: string; }; + +/** + * 应用权限列表 + */ +export type AppAccessPolicyList = { + id: string; + //主体ID + subjectId: string; + //主体名称 + subjectName: string; + //主体类型 + subjectType: string; + //应用类型 + appType: string; + appProtocol: string; + //Effect + effect: string; +}; + +/** + * 角色列表 + */ +type AppPermissionRoleList = { + id: string; + name: string; + code: string; + enabled: boolean; + appId: string; + remark: string; +}; + +/** + * 角色列表 + */ +type GetAppPermissionRole = { + id: string; + name: string; + code: string; + enabled: boolean; + appId: string; + remark: string; +}; + +/** + * 资源列表 + */ +type AppPermissionResourceList = { + id: string; + name: string; + code: string; + enabled: boolean; + desc: string; + appId: string; +}; + +/** + * 权限资源点 + */ +type AppPermissionResourceActionList = { + id: string; + name: string; + code: string; + desc: string; + appId: string; + menus: { + access: string; + id: string; + name: string; + }[]; + datas: { + access: string; + id: string; + name: string; + }[]; + buttons: { + access: string; + id: string; + name: string; + }[]; + apis: { + access: string; + id: string; + name: string; + }[]; + others: { + access: string; + id: string; + name: string; + }[]; +}; + +/** + * 权限授权列表 + */ +type AppPermissionPolicyList = { + id: string; + name: string; + code: string; + enabled: boolean; + desc: string; + appId: string; +}; diff --git a/eiam-console/src/main/console-fe/src/pages/security/Administrator/Administrator.tsx b/eiam-console/src/main/console-fe/src/pages/security/Administrator/Administrator.tsx index b9288be5..cd907620 100644 --- a/eiam-console/src/main/console-fe/src/pages/security/Administrator/Administrator.tsx +++ b/eiam-console/src/main/console-fe/src/pages/security/Administrator/Administrator.tsx @@ -39,6 +39,7 @@ import CreateAdministrator from './components/CreateAdministrator'; import UpdateAdministrator from './components/UpdateAdministrator'; import ResetPassword from './components/ResetAdministratorPassword'; import Avatar from '@/components/UserAvatar'; +import { AdministratorList } from './data'; export const Administrator = () => { const intl = useIntl(); @@ -49,7 +50,7 @@ export const Administrator = () => { const [resetPasswordVisible, setResetPasswordVisible] = useState(false); const [id, setId] = useState(); const [loading, setLoading] = useState(false); - const columns: ProColumns[] = [ + const columns: ProColumns[] = [ { title: intl.formatMessage({ id: 'pages.setting.administrator.table.columns.username' }), dataIndex: 'username', @@ -289,7 +290,7 @@ export const Administrator = () => { } > <> - + actionRef={actionRef} columns={columns} rowKey={'id'} diff --git a/eiam-console/src/main/console-fe/src/pages/security/Setting/data.d.ts b/eiam-console/src/main/console-fe/src/pages/security/Setting/data.d.ts index 096e3414..d18cfe6f 100644 --- a/eiam-console/src/main/console-fe/src/pages/security/Setting/data.d.ts +++ b/eiam-console/src/main/console-fe/src/pages/security/Setting/data.d.ts @@ -18,3 +18,14 @@ export type SecurityDefensePolicyConfig = { contentSecurityPolicy: string; }; + +/** + * 安全基础配置 + */ +export type BasicSettingConfig = { + frequentRegisterCheck: boolean; + emailVerifiedDefault: boolean; + sendWelcomeEmail: boolean; + verifyOldEmail: boolean; + verifyOldPhone: boolean; +}; diff --git a/eiam-console/src/main/console-fe/src/pages/setting/Message/Message.tsx b/eiam-console/src/main/console-fe/src/pages/setting/Message/Message.tsx index ccbf1cea..a4062ee6 100644 --- a/eiam-console/src/main/console-fe/src/pages/setting/Message/Message.tsx +++ b/eiam-console/src/main/console-fe/src/pages/setting/Message/Message.tsx @@ -35,7 +35,7 @@ export default (): React.ReactNode => { const { type } = query as { type: TabType; }; - if (!type) { + if (!type || !TabType[type]) { setActiveKey(TabType.mail_template); history.replace({ pathname: location.pathname, diff --git a/eiam-console/src/main/console-fe/src/pages/setting/Message/components/MailTemplate/MailTemplate.tsx b/eiam-console/src/main/console-fe/src/pages/setting/Message/components/MailTemplate/MailTemplate.tsx index 21670230..01e81683 100644 --- a/eiam-console/src/main/console-fe/src/pages/setting/Message/components/MailTemplate/MailTemplate.tsx +++ b/eiam-console/src/main/console-fe/src/pages/setting/Message/components/MailTemplate/MailTemplate.tsx @@ -26,6 +26,7 @@ import MailTemplateConfig from './MailTemplateConfig'; import useStyle from './style'; import classnames from 'classnames'; import { useIntl } from '@umijs/max'; +import { EmailTemplateList } from '../../data.d'; const prefixCls = 'setting-mail-template'; @@ -36,7 +37,7 @@ export default (props: { visible: boolean }) => { const [content, setContent] = useState(''); const [configType, setConfigType] = useState(''); const [loading, setLoading] = useState(false); - const [dataSource, setDataSource] = useState([]); + const [dataSource, setDataSource] = useState([]); const [browseVisible, setBrowseVisible] = useState(false); const { styles } = useStyle(prefixCls); const intl = useIntl(); @@ -85,7 +86,7 @@ export default (props: { visible: boolean }) => {
- + rowKey="type" split cardProps={{ bodyStyle: { padding: 0 } }} diff --git a/eiam-console/src/main/console-fe/src/pages/setting/Message/components/SmsProvider/SmsProvider.tsx b/eiam-console/src/main/console-fe/src/pages/setting/Message/components/SmsProvider/SmsProvider.tsx index 8305fdb4..1c9731f1 100644 --- a/eiam-console/src/main/console-fe/src/pages/setting/Message/components/SmsProvider/SmsProvider.tsx +++ b/eiam-console/src/main/console-fe/src/pages/setting/Message/components/SmsProvider/SmsProvider.tsx @@ -45,6 +45,7 @@ import QiNiu from './QiNiu'; import Tencent from './Tencent'; import { Container } from '@/components/Container'; import { useIntl } from '@umijs/max'; +import { SmsTemplateList } from '@/pages/setting/Message/data'; const layout = { labelCol: { @@ -130,7 +131,7 @@ const TestModal = (props: { }; export default (props: { visible: boolean }) => { const [form] = Form.useForm(); - const editorFormRef = useRef>(); + const editorFormRef = useRef>(); const intl = useIntl(); const { message, modal } = App.useApp(); const actionRef = useRef(); @@ -144,7 +145,7 @@ export default (props: { visible: boolean }) => { const [enabled, setEnabled] = useState(false); const [language, setLanguage] = useState(Language.ZH); const [editableKeys, setEditableRowKeys] = useState(); - const [smsTemplateList, setSmsTemplateList] = useState(); + const [smsTemplateList, setSmsTemplateList] = useState(); const columns: ProColumns[] = [ { @@ -380,7 +381,7 @@ export default (props: { visible: boolean }) => { label={intl.formatMessage({ id: 'pages.setting.message.sms_provider.provider' })} rules={[{ required: true }]} fieldProps={{ - onChange: async (value) => { + onChange: async (value: string) => { setLoading(true); setProvider(value); //清理 diff --git a/eiam-console/src/main/console-fe/src/pages/setting/Storage/locales/zh-CN.ts b/eiam-console/src/main/console-fe/src/pages/setting/Storage/locales/zh-CN.ts index 90318df8..8ca0d852 100644 --- a/eiam-console/src/main/console-fe/src/pages/setting/Storage/locales/zh-CN.ts +++ b/eiam-console/src/main/console-fe/src/pages/setting/Storage/locales/zh-CN.ts @@ -99,27 +99,20 @@ export default { 'pages.setting.storage_provider.minio.bucket.rule.0.message': 'MinIO Bucket为必填项', '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.placeholder': '请输入 S3 域名', 'pages.setting.storage_provider.provider.qiniu_kodo.endpoint.rule.0.message': '七牛云Kodo 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.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.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为必填项', }; diff --git a/eiam-console/src/main/console-fe/src/services/app.ts b/eiam-console/src/main/console-fe/src/services/app.ts index 0d095409..f96d967b 100644 --- a/eiam-console/src/main/console-fe/src/services/app.ts +++ b/eiam-console/src/main/console-fe/src/services/app.ts @@ -21,18 +21,6 @@ import type { SortOrder } from 'antd/es/table/interface'; import { request } from '@umijs/max'; import type { UploadFile } from 'antd/es/upload/interface'; -/** - * Get Application Template FormSchema - */ -export async function getAppTemplateFormSchema( - code: string, -): Promise>> { - return request>(`/api/v1/app/template/form_schema`, { - method: 'GET', - params: { code: code }, - }); -} - /** * 获取应用列表 */ @@ -65,15 +53,6 @@ export async function updateApp(params: Record): Promise> { - return request>(`/api/v1/app/get/${id}`, { - method: 'GET', - }); -} - /** * Get Config */ diff --git a/eiam-console/src/main/console-fe/src/services/typings.d.ts b/eiam-console/src/main/console-fe/src/services/typings.d.ts index 6a725ab9..7e4300f5 100644 --- a/eiam-console/src/main/console-fe/src/services/typings.d.ts +++ b/eiam-console/src/main/console-fe/src/services/typings.d.ts @@ -422,28 +422,4 @@ declare namespace AppAPI { template: string; remark: string; }; - - /** - * 应用信息 - */ - export type GetApp = { - id: string; - type: string; - name: string; - icon: string; - template: string; - protocol: string; - protocolName: string; - clientId: string; - clientSecret: string; - //sso发起方 - initLoginType: string; - //sso登录链接 - initLoginUrl: string; - nameIdValueType: string; - //授权范围 - authorizationType: string; - enabled: boolean; - remark: string; - }; } diff --git a/eiam-console/src/main/java/cn/topiam/employee/console/controller/app/AppGroupController.java b/eiam-console/src/main/java/cn/topiam/employee/console/controller/app/AppGroupController.java index 0f635ae4..a99ec1fb 100644 --- a/eiam-console/src/main/java/cn/topiam/employee/console/controller/app/AppGroupController.java +++ b/eiam-console/src/main/java/cn/topiam/employee/console/controller/app/AppGroupController.java @@ -59,7 +59,7 @@ import static cn.topiam.employee.common.constant.AppConstants.APP_PATH; @Tag(name = "应用分组管理") @RestController @AllArgsConstructor -@RequestMapping(value = APP_PATH + "/app_group", produces = MediaType.APPLICATION_JSON_VALUE) +@RequestMapping(value = APP_PATH + "/group", produces = MediaType.APPLICATION_JSON_VALUE) public class AppGroupController { /** diff --git a/eiam-console/src/main/java/cn/topiam/employee/console/converter/app/AppGroupConverter.java b/eiam-console/src/main/java/cn/topiam/employee/console/converter/app/AppGroupConverter.java index 381b2fcd..3b3f1ee8 100644 --- a/eiam-console/src/main/java/cn/topiam/employee/console/converter/app/AppGroupConverter.java +++ b/eiam-console/src/main/java/cn/topiam/employee/console/converter/app/AppGroupConverter.java @@ -96,21 +96,7 @@ public interface AppGroupConverter { * @param entity {@link AppGroupEntity} * @return {@link AppGroupListResult} */ - default AppGroupListResult entityConvertToAppGroupListResult(AppGroupEntity entity) { - if (entity == null) { - return null; - } - - AppGroupListResult appGroupListResult = new AppGroupListResult(); - if (entity.getId() != null) { - appGroupListResult.setId(String.valueOf(entity.getId())); - } - appGroupListResult.setName(entity.getName()); - appGroupListResult.setCode(entity.getCode()); - appGroupListResult.setEnabled(entity.getEnabled()); - appGroupListResult.setRemark(entity.getRemark()); - return appGroupListResult; - } + AppGroupListResult entityConvertToAppGroupListResult(AppGroupEntity entity); /** * 实体转分组返回 @@ -118,20 +104,7 @@ public interface AppGroupConverter { * @param entity {@link AppGroupEntity} * @return {@link AppGroupGetResult} */ - default AppGroupGetResult entityConvertToAppGroupResult(AppGroupEntity entity) { - if (entity == null) { - return null; - } - AppGroupGetResult appGroupGetResult = new AppGroupGetResult(); - - if (entity.getId() != null) { - appGroupGetResult.setId(String.valueOf(entity.getId())); - } - appGroupGetResult.setName(entity.getName()); - appGroupGetResult.setEnabled(entity.getEnabled()); - appGroupGetResult.setCreateTime(entity.getCreateTime()); - return appGroupGetResult; - } + AppGroupGetResult entityConvertToAppGroupResult(AppGroupEntity entity); /** * 将分组修改对象转换为entity @@ -139,12 +112,12 @@ public interface AppGroupConverter { * @param param {@link AppGroupUpdateParam} * @return {@link AppGroupEntity} */ + @Mapping(target = "enabled", ignore = true) @Mapping(target = "deleted", ignore = true) @Mapping(target = "updateTime", ignore = true) @Mapping(target = "updateBy", ignore = true) @Mapping(target = "createTime", ignore = true) @Mapping(target = "createBy", ignore = true) - @Mapping(target = "enabled", ignore = false) AppGroupEntity appGroupUpdateParamConverterToEntity(AppGroupUpdateParam param); /** @@ -153,6 +126,7 @@ public interface AppGroupConverter { * @param param {@link AppAccountCreateParam} * @return {@link AppAccountEntity} */ + @Mapping(target = "enabled", expression = "java(Boolean.TRUE)") @Mapping(target = "deleted", ignore = true) @Mapping(target = "id", ignore = true) @Mapping(target = "updateTime", ignore = true) diff --git a/eiam-console/src/main/java/cn/topiam/employee/console/pojo/result/app/AppGroupListResult.java b/eiam-console/src/main/java/cn/topiam/employee/console/pojo/result/app/AppGroupListResult.java index c8acdbf5..e32cf3a6 100644 --- a/eiam-console/src/main/java/cn/topiam/employee/console/pojo/result/app/AppGroupListResult.java +++ b/eiam-console/src/main/java/cn/topiam/employee/console/pojo/result/app/AppGroupListResult.java @@ -18,6 +18,7 @@ package cn.topiam.employee.console.pojo.result.app; import java.io.Serializable; +import java.time.LocalDateTime; import lombok.Data; @@ -58,6 +59,12 @@ public class AppGroupListResult implements Serializable { @Parameter(description = "是否启用") private Boolean enabled; + /** + * 创建时间 + */ + @Parameter(description = "创建时间") + private LocalDateTime createTime; + /** * 备注 */ diff --git a/eiam-console/src/main/java/cn/topiam/employee/console/pojo/save/app/AppGroupCreateParam.java b/eiam-console/src/main/java/cn/topiam/employee/console/pojo/save/app/AppGroupCreateParam.java index b3210144..580f59d2 100644 --- a/eiam-console/src/main/java/cn/topiam/employee/console/pojo/save/app/AppGroupCreateParam.java +++ b/eiam-console/src/main/java/cn/topiam/employee/console/pojo/save/app/AppGroupCreateParam.java @@ -31,7 +31,7 @@ import jakarta.validation.constraints.NotBlank; * Created by support@topiam.cn on 2023/8/31 23:26 */ @Data -@Schema(description = "分组保存入参") +@Schema(description = "应用分组保存入参") public class AppGroupCreateParam implements Serializable { /** @@ -41,16 +41,17 @@ public class AppGroupCreateParam implements Serializable { @Schema(description = "分组名称") private String name; + /** + * 分组编码 + */ + @NotBlank(message = "分组编码不能为空") + @Schema(description = "分组编码") + private String code; + /** * 备注 */ @Schema(description = "备注") private String remark; - /** - * 分组编码 - */ - @Schema(description = "分组编码") - private String code; - } diff --git a/eiam-console/src/main/java/cn/topiam/employee/console/pojo/update/app/AppGroupUpdateParam.java b/eiam-console/src/main/java/cn/topiam/employee/console/pojo/update/app/AppGroupUpdateParam.java index b0fff9ec..903d74f1 100644 --- a/eiam-console/src/main/java/cn/topiam/employee/console/pojo/update/app/AppGroupUpdateParam.java +++ b/eiam-console/src/main/java/cn/topiam/employee/console/pojo/update/app/AppGroupUpdateParam.java @@ -53,12 +53,6 @@ public class AppGroupUpdateParam implements Serializable { @Schema(description = "分组编码") private String code; - /** - * 分组是否启用 - */ - @Schema(description = "分组是否启用") - private Boolean enabled; - /** * 备注 */ diff --git a/eiam-portal/src/main/java/cn/topiam/employee/portal/converter/AppGroupConverter.java b/eiam-portal/src/main/java/cn/topiam/employee/portal/converter/AppGroupConverter.java index ab6c80f0..73a3881a 100644 --- a/eiam-portal/src/main/java/cn/topiam/employee/portal/converter/AppGroupConverter.java +++ b/eiam-portal/src/main/java/cn/topiam/employee/portal/converter/AppGroupConverter.java @@ -30,6 +30,7 @@ import cn.topiam.employee.common.entity.app.AppGroupEntity; import cn.topiam.employee.common.entity.app.QAppGroupAssociationEntity; import cn.topiam.employee.common.entity.app.QAppGroupEntity; import cn.topiam.employee.portal.pojo.result.AppGroupListResult; +import org.mapstruct.Mapping; /** * 分组映射 @@ -61,9 +62,7 @@ public interface AppGroupConverter { */ default Predicate queryAppGroupAssociationPredicate() { QAppGroupAssociationEntity appGroupAssociation = QAppGroupAssociationEntity.appGroupAssociationEntity; - Predicate predicate = appGroupAssociation.deleted.eq(Boolean.FALSE); - //@formatter:on - return predicate; + return appGroupAssociation.deleted.eq(Boolean.FALSE); } /** @@ -78,9 +77,9 @@ public interface AppGroupConverter { List results = new ArrayList<>(); for (AppGroupEntity entity : list) { AppGroupListResult result = appGroupEntityConverterToResult(entity); - Long count = appGroupAssociationList.stream() + long count = appGroupAssociationList.stream() .filter(t -> t.getGroupId().equals(entity.getId())).count(); - result.setAppCount(Integer.valueOf(count.toString())); + result.setAppCount(Integer.valueOf(Long.toString(count))); results.add(result); } return results; @@ -92,6 +91,7 @@ public interface AppGroupConverter { * @param entity {@link AppGroupEntity} * @return {@link AppGroupEntity} */ + @Mapping(target = "appCount", ignore = true) AppGroupListResult appGroupEntityConverterToResult(AppGroupEntity entity); } diff --git a/eiam-portal/src/main/portal-fe/package.json b/eiam-portal/src/main/portal-fe/package.json index 07511d18..a05715f9 100644 --- a/eiam-portal/src/main/portal-fe/package.json +++ b/eiam-portal/src/main/portal-fe/package.json @@ -48,7 +48,7 @@ "@ant-design/charts": "^1.4.2", "@ant-design/icons": "^5.2.6", "@ant-design/maps": "^1.0.7", - "@ant-design/pro-components": "^2.6.16", + "@ant-design/pro-components": "^2.6.18", "ahooks": "^3.7.8", "antd": "^5.8.6", "antd-img-crop": "^4.12.2", @@ -84,14 +84,14 @@ "@types/google-libphonenumber": "^7.4.26", "@types/history": "^4.7.11", "@types/js-yaml": "^4.0.5", - "@types/lodash": "^4.14.197", + "@types/lodash": "^4.14.198", "@types/numeral": "^2.0.2", "@types/qs": "^6.9.8", "@types/react": "^18.2.21", "@types/react-dom": "^18.2.7", "@types/react-helmet": "^6.1.6", - "@umijs/lint": "^4.0.79", - "@umijs/max": "^4.0.79", + "@umijs/lint": "^4.0.80", + "@umijs/max": "^4.0.80", "cross-env": "^7.0.3", "cross-port-killer": "^1.4.0", "eslint": "^8.48.0", diff --git a/eiam-portal/src/main/portal-fe/src/pages/Account/Account.tsx b/eiam-portal/src/main/portal-fe/src/pages/Account/Account.tsx index 4cacf432..efe4a267 100644 --- a/eiam-portal/src/main/portal-fe/src/pages/Account/Account.tsx +++ b/eiam-portal/src/main/portal-fe/src/pages/Account/Account.tsx @@ -45,15 +45,15 @@ const AccountSettings = () => { const intl = useIntl(); const [initConfig, setInitConfig] = useState({ mode: 'inline', - selectKey: AccountSettingsStateKey.BASE, + selectKey: AccountSettingsStateKey.base, }); useAsyncEffect(async () => { - if (!type || !AccountSettingsStateKey[type.toUpperCase()]) { - setInitConfig({ ...initConfig, selectKey: AccountSettingsStateKey.BASE }); + if (!type || !AccountSettingsStateKey[type]) { + setInitConfig({ ...initConfig, selectKey: AccountSettingsStateKey.base }); history.replace({ pathname: location.pathname, - search: queryString.stringify({ type: AccountSettingsStateKey.BASE }), + search: queryString.stringify({ type: AccountSettingsStateKey.base }), }); return; } @@ -62,19 +62,19 @@ const AccountSettings = () => { const menu: ItemType[] = [ { - key: AccountSettingsStateKey.BASE, + key: AccountSettingsStateKey.base, label: intl.formatMessage({ id: 'page.account.menu.base', }), }, { - key: AccountSettingsStateKey.SECURITY, + key: AccountSettingsStateKey.security, label: intl.formatMessage({ id: 'page.account.menu.security', }), }, { - key: AccountSettingsStateKey.BIND, + key: AccountSettingsStateKey.bind, label: intl.formatMessage({ id: 'page.account.menu.bind', }), @@ -113,11 +113,11 @@ const AccountSettings = () => { const renderChildren = () => { const { selectKey } = initConfig; switch (selectKey) { - case AccountSettingsStateKey.BASE: + case AccountSettingsStateKey.base: return ; - case AccountSettingsStateKey.SECURITY: + case AccountSettingsStateKey.security: return ; - case AccountSettingsStateKey.BIND: + case AccountSettingsStateKey.bind: return ; default: return null; diff --git a/eiam-portal/src/main/portal-fe/src/pages/Account/components/ModifyPassword.tsx b/eiam-portal/src/main/portal-fe/src/pages/Account/components/ModifyPassword.tsx index ed952b13..67edece0 100644 --- a/eiam-portal/src/main/portal-fe/src/pages/Account/components/ModifyPassword.tsx +++ b/eiam-portal/src/main/portal-fe/src/pages/Account/components/ModifyPassword.tsx @@ -70,7 +70,7 @@ const ModifyPassword = (props: { destroyOnClose: true, maskClosable: false, onCancel: async () => { - await setVisible(false); + setVisible(false); }, }} onFinish={async (formData: Record) => { @@ -89,7 +89,7 @@ const ModifyPassword = (props: { ), ); if (success && result) { - await setVisible(false); + setVisible(false); message.success(intl.formatMessage({ id: 'page.account.modify_password.success' })); setRefresh(true); return Promise.resolve(); diff --git a/eiam-portal/src/main/portal-fe/src/pages/Account/data.d.ts b/eiam-portal/src/main/portal-fe/src/pages/Account/data.d.ts index 3e3a1893..7215cf53 100644 --- a/eiam-portal/src/main/portal-fe/src/pages/Account/data.d.ts +++ b/eiam-portal/src/main/portal-fe/src/pages/Account/data.d.ts @@ -40,7 +40,7 @@ export interface GetBoundIdpList { * 账户菜单类型 */ export enum AccountSettingsStateKey { - BASE = 'base', - SECURITY = 'security', - BIND = 'bind', + base = 'base', + security = 'security', + bind = 'bind', } diff --git a/eiam-portal/src/main/portal-fe/src/pages/Application/data.d.ts b/eiam-portal/src/main/portal-fe/src/pages/Application/data.d.ts index 88d8e7f0..ad21d5f4 100644 --- a/eiam-portal/src/main/portal-fe/src/pages/Application/data.d.ts +++ b/eiam-portal/src/main/portal-fe/src/pages/Application/data.d.ts @@ -31,9 +31,15 @@ export enum InitLoginType { /** * 仅允许应用发起 SSO */ - ONLY_APP_INIT_SSO = 'only_app_init_sso', + only_app_init_sso = 'only_app_init_sso', /** * 门户或应用发起 SSO */ - PORTAL_OR_APP_INIT_SSO = 'portal_or_app_init_sso', + portal_or_app_init_sso = 'portal_or_app_init_sso', } + +export type AppGroupList = { + id: string; + name: string; + appCount: number; +}; diff --git a/eiam-portal/src/main/portal-fe/src/pages/Login/data.d.ts b/eiam-portal/src/main/portal-fe/src/pages/Login/data.d.ts index 66a37a2b..c95ea070 100644 --- a/eiam-portal/src/main/portal-fe/src/pages/Login/data.d.ts +++ b/eiam-portal/src/main/portal-fe/src/pages/Login/data.d.ts @@ -15,7 +15,7 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ -import type { IDP_TYPE, MFA_FACTOR } from '@/constants'; +import type { IDP_TYPE } from '@/constants'; /** * 登录参数类型 @@ -44,9 +44,3 @@ export type IdpList = { export type LoginConfig = { idps: IdpList[]; }; - -export type MfaFactor = { - factor: MFA_FACTOR; - target?: string; - usable: boolean; -}; diff --git a/eiam-portal/src/main/portal-fe/src/pages/Login/service.ts b/eiam-portal/src/main/portal-fe/src/pages/Login/service.ts index 0f1a650a..fec3207c 100644 --- a/eiam-portal/src/main/portal-fe/src/pages/Login/service.ts +++ b/eiam-portal/src/main/portal-fe/src/pages/Login/service.ts @@ -16,16 +16,9 @@ * along with this program. If not, see . */ import { request } from '@umijs/max'; -import type { LoginConfig, LoginParamsType, MfaFactor } from './data.d'; +import type { LoginConfig, LoginParamsType } from './data.d'; import { stringify } from 'querystring'; -/** - * 获取 Mfa 因素 - */ -export async function getMfaFactors(): Promise> { - return request('/api/v1/login/mfa/factors'); -} - /** * 账户登录 * @@ -74,32 +67,6 @@ export async function sendLoginCaptchaOpt( }); } -/** - * 发送MFA短信验证码 - */ -export async function sendMfaSmsOtp(): Promise> { - return request(`/api/v1/login/mfa/send`, { - method: 'POST', - data: stringify({ channel: 'sms' }), - skipErrorHandler: true, - }).catch((e) => { - throw e; - }); -} - -/** - * 发送MFA邮件验证码 - */ -export async function sendMfaEmailOtp(): Promise> { - return request(`/api/v1/login/mfa/send`, { - method: 'POST', - data: stringify({ channel: 'mail' }), - skipErrorHandler: true, - }).catch((e) => { - throw e; - }); -} - /** * 获取钉钉授权URL * @@ -115,22 +82,6 @@ export async function getDingtalkAuthorizeUrl( }); } -/** - * 获取钉钉授权URL - * - * @param params - */ -export async function loginMfaValidate( - params: Record, -): Promise> { - return request(`/api/v1/login/mfa/validate`, { - params: params, - skipErrorHandler: true, - }).catch(({ response: { data } }) => { - return data; - }); -} - /** * Idp绑定用户 */