feat(oidc): 接入统一认证登录与身份自助绑定

- 登录页接入统一认证入口并处理认证回调
- 个人中心新增认证身份区块,支持自助绑定与解绑
- 头像菜单与应用中心新增认证身份入口
- 应用中心删除经营管理分组,业务系统卡片指向统一认证授权地址
- 用户管理页移除认证身份代绑入口与弹窗
- 身份关联接口从用户域移到认证域
This commit is contained in:
Ray.Hao
2026-10-28 08:21:27 +08:00
parent 9cddb95fb7
commit b5bacd2cbf
205 changed files with 6705 additions and 7079 deletions

1002
types/auto-imports.d.ts vendored

File diff suppressed because it is too large Load Diff

4
types/axios.d.ts vendored
View File

@@ -2,7 +2,11 @@ import "axios";
declare module "axios" {
interface AxiosRequestConfig {
/** 可选接口只对明确不支持的 HTTP 状态静默,由调用方决定是否回退。 */
silentErrorStatuses?: readonly number[];
// 匿名请求:不注入访问令牌,也不触发令牌续期
anonymous?: boolean;
/** 请求发起时的登录会话,隔离旧请求的认证副作用。 */
sessionRevision?: number;
}
}

54
types/components.d.ts vendored
View File

@@ -12,15 +12,26 @@ export {};
declare module 'vue' {
export interface GlobalComponents {
AppLink: typeof import('./../src/components/AppLink/index.vue')['default']
ApprovalFlowTimeline: typeof import('./../src/views/workflow/components/ApprovalFlowTimeline.vue')['default']
ApprovalTimeline: typeof import('./../src/views/workflow/components/ApprovalTimeline.vue')['default']
BaseChart: typeof import('./../src/views/demo/data-screen/components/base-chart.vue')['default']
BasicConfigStep: typeof import('./../src/views/codegen/components/BasicConfigStep.vue')['default']
BatteryHealth: typeof import('./../src/views/demo/data-screen/components/battery-health.vue')['default']
BpmnDesigner: typeof import('./../src/views/workflow/components/BpmnDesigner.vue')['default']
BpmnViewer: typeof import('./../src/views/workflow/components/BpmnViewer.vue')['default']
Breadcrumb: typeof import('./../src/components/Breadcrumb/index.vue')['default']
CenterCharts: typeof import('./../src/views/demo/data-screen/components/center-charts.vue')['default']
CommandPalette: typeof import('./../src/components/CommandPalette/index.vue')['default']
CopyButton: typeof import('./../src/components/CopyButton/index.vue')['default']
CrudModal: typeof import('./../src/components/Crud/CrudModal.vue')['default']
CrudForm: typeof import('./../src/components/Crud/CrudForm.vue')['default']
CrudPage: typeof import('./../src/components/Crud/CrudPage.vue')['default']
CrudSearch: typeof import('./../src/components/Crud/CrudSearch.vue')['default']
CrudTable: typeof import('./../src/components/Crud/CrudTable.vue')['default']
DataScreenHeader: typeof import('./../src/views/demo/data-screen/components/DataScreenHeader.vue')['default']
DictItemPanel: typeof import('./../src/views/system/dict/components/DictItemPanel.vue')['default']
DictSelect: typeof import('./../src/components/DictSelect/index.vue')['default']
DictTag: typeof import('./../src/components/DictTag/index.vue')['default']
DoneTab: typeof import('./../src/views/workflow/task/components/DoneTab.vue')['default']
ECharts: typeof import('./../src/components/ECharts/index.vue')['default']
ElAlert: typeof import('element-plus/es')['ElAlert']
ElAvatar: typeof import('element-plus/es')['ElAvatar']
@@ -30,11 +41,13 @@ declare module 'vue' {
ElBreadcrumbItem: typeof import('element-plus/es')['ElBreadcrumbItem']
ElButton: typeof import('element-plus/es')['ElButton']
ElCard: typeof import('element-plus/es')['ElCard']
ElCascader: typeof import('element-plus/es')['ElCascader']
ElCheckbox: typeof import('element-plus/es')['ElCheckbox']
ElCheckboxButton: typeof import('element-plus/es')['ElCheckboxButton']
ElCheckboxGroup: typeof import('element-plus/es')['ElCheckboxGroup']
ElCol: typeof import('element-plus/es')['ElCol']
ElCollapse: typeof import('element-plus/es')['ElCollapse']
ElCollapseItem: typeof import('element-plus/es')['ElCollapseItem']
ElCollapseTransition: typeof import('element-plus/es')['ElCollapseTransition']
ElColorPicker: typeof import('element-plus/es')['ElColorPicker']
ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider']
ElDatePicker: typeof import('element-plus/es')['ElDatePicker']
@@ -46,6 +59,7 @@ declare module 'vue' {
ElDropdown: typeof import('element-plus/es')['ElDropdown']
ElDropdownItem: typeof import('element-plus/es')['ElDropdownItem']
ElDropdownMenu: typeof import('element-plus/es')['ElDropdownMenu']
ElectricityUsageMode: typeof import('./../src/views/demo/data-screen/components/electricity-usage-mode.vue')['default']
ElEmpty: typeof import('element-plus/es')['ElEmpty']
ElForm: typeof import('element-plus/es')['ElForm']
ElFormItem: typeof import('element-plus/es')['ElFormItem']
@@ -64,11 +78,12 @@ declare module 'vue' {
ElRadio: typeof import('element-plus/es')['ElRadio']
ElRadioButton: typeof import('element-plus/es')['ElRadioButton']
ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup']
ElResult: typeof import('element-plus/es')['ElResult']
ElRow: typeof import('element-plus/es')['ElRow']
ElScrollbar: typeof import('element-plus/es')['ElScrollbar']
ElSegmented: typeof import('element-plus/es')['ElSegmented']
ElSelect: typeof import('element-plus/es')['ElSelect']
ElSkeleton: typeof import('element-plus/es')['ElSkeleton']
ElSkeletonItem: typeof import('element-plus/es')['ElSkeletonItem']
ElSpace: typeof import('element-plus/es')['ElSpace']
ElStep: typeof import('element-plus/es')['ElStep']
ElSteps: typeof import('element-plus/es')['ElSteps']
@@ -87,40 +102,73 @@ declare module 'vue' {
ElTreeSelect: typeof import('element-plus/es')['ElTreeSelect']
ElUpload: typeof import('element-plus/es')['ElUpload']
ElWatermark: typeof import('element-plus/es')['ElWatermark']
EntryConfigStep: typeof import('./../src/views/dynamic-form/components/publish/EntryConfigStep.vue')['default']
EntrySection: typeof import('./../src/views/dynamic-form/components/publish/EntrySection.vue')['default']
ErrorPage: typeof import('./../src/views/internal/error/components/ErrorPage.vue')['default']
FieldConfigStep: typeof import('./../src/views/codegen/components/FieldConfigStep.vue')['default']
FileUpload: typeof import('./../src/components/Upload/FileUpload.vue')['default']
FormDetail: typeof import('./../src/views/workflow/components/FormDetail.vue')['default']
FormRenderer: typeof import('./../src/views/dynamic-form/components/FormRenderer.vue')['default']
Fullscreen: typeof import('./../src/components/Fullscreen/index.vue')['default']
GeneratorDrawer: typeof import('./../src/views/codegen/components/GeneratorDrawer.vue')['default']
Hamburger: typeof import('./../src/components/Hamburger/index.vue')['default']
IconSelect: typeof import('./../src/components/IconSelect/index.vue')['default']
InputTag: typeof import('./../src/components/InputTag/index.vue')['default']
InstanceDetailDrawer: typeof import('./../src/views/workflow/components/InstanceDetailDrawer.vue')['default']
LangSelect: typeof import('./../src/components/LangSelect/index.vue')['default']
LayoutLogo: typeof import('./../src/layouts/components/LayoutLogo.vue')['default']
LayoutMain: typeof import('./../src/layouts/components/LayoutMain.vue')['default']
LayoutMenuIcon: typeof import('./../src/layouts/components/LayoutMenuIcon.vue')['default']
LayoutNavbar: typeof import('./../src/layouts/components/LayoutNavbar.vue')['default']
LayoutSettings: typeof import('./../src/layouts/components/LayoutSettings.vue')['default']
LayoutSidebar: typeof import('./../src/layouts/components/LayoutSidebar.vue')['default']
LayoutSidebarItem: typeof import('./../src/layouts/components/LayoutSidebarItem.vue')['default']
LayoutTagsView: typeof import('./../src/layouts/components/LayoutTagsView.vue')['default']
LayoutToolbar: typeof import('./../src/layouts/components/LayoutToolbar.vue')['default']
LeftCharts: typeof import('./../src/views/demo/data-screen/components/left-charts.vue')['default']
LevelOnePanel: typeof import('./../src/views/demo/route/multi-level/components/LevelOnePanel.vue')['default']
LevelTwoPanel: typeof import('./../src/views/demo/route/multi-level/components/LevelTwoPanel.vue')['default']
MapChart: typeof import('./../src/views/demo/data-screen/components/map-chart.vue')['default']
MethodStep: typeof import('./../src/views/dynamic-form/components/publish/MethodStep.vue')['default']
MileageEnergyConsumption: typeof import('./../src/views/demo/data-screen/components/mileage-energy-consumption.vue')['default']
MineTab: typeof import('./../src/views/workflow/task/components/MineTab.vue')['default']
MultiImageUpload: typeof import('./../src/components/Upload/MultiImageUpload.vue')['default']
NoticeCenter: typeof import('./../src/components/NoticeCenter/index.vue')['default']
NoticeDetailDialog: typeof import('./../src/components/NoticeDetailDialog/index.vue')['default']
OidcIdentityDialog: typeof import('./../src/views/system/user/components/OidcIdentityDialog.vue')['default']
OperationColumn: typeof import('./../src/components/OperationColumn/index.vue')['default']
Pagination: typeof import('./../src/components/Pagination/index.vue')['default']
PreviewStep: typeof import('./../src/views/codegen/components/PreviewStep.vue')['default']
ProcessStages: typeof import('./../src/views/workflow/components/ProcessStages.vue')['default']
PublishDialog: typeof import('./../src/views/dynamic-form/components/PublishDialog.vue')['default']
PublishResultStep: typeof import('./../src/views/dynamic-form/components/publish/PublishResultStep.vue')['default']
QrCodeLogin: typeof import('./../src/views/login/components/QrCodeLogin.vue')['default']
RealTimeAlarm: typeof import('./../src/views/demo/data-screen/components/real-time-alarm.vue')['default']
RealTimeOperation: typeof import('./../src/views/demo/data-screen/components/real-time-operation.vue')['default']
RealTimeStatus: typeof import('./../src/views/demo/data-screen/components/real-time-status.vue')['default']
RegionalOperation: typeof import('./../src/views/demo/data-screen/components/regional-operation.vue')['default']
Register: typeof import('./../src/views/login/components/Register.vue')['default']
ResetPwd: typeof import('./../src/views/login/components/ResetPwd.vue')['default']
RightCharts: typeof import('./../src/views/demo/data-screen/components/right-charts.vue')['default']
RouterLink: typeof import('vue-router')['RouterLink']
RouterView: typeof import('vue-router')['RouterView']
SectionTitle: typeof import('./../src/components/SectionTitle/index.vue')['default']
SingleImageUpload: typeof import('./../src/components/Upload/SingleImageUpload.vue')['default']
SizeSelect: typeof import('./../src/components/SizeSelect/index.vue')['default']
TableActions: typeof import('./../src/components/TableActions/index.vue')['default']
TableList: typeof import('./../src/views/codegen/components/TableList.vue')['default']
TableSelect: typeof import('./../src/components/TableSelect/index.vue')['default']
TenantSwitcher: typeof import('./../src/components/TenantSwitcher/index.vue')['default']
TextCarousel: typeof import('./../src/views/demo/data-screen/components/text-carousel.vue')['default']
TextScroll: typeof import('./../src/components/TextScroll/index.vue')['default']
ThemeSwitcher: typeof import('./../src/components/ThemeSwitcher/index.vue')['default']
TodoTab: typeof import('./../src/views/workflow/task/components/TodoTab.vue')['default']
UserDeptTree: typeof import('./../src/views/system/user/components/UserDeptTree.vue')['default']
UserImportDialog: typeof import('./../src/views/system/user/components/UserImportDialog.vue')['default']
VehicleChargingChart: typeof import('./../src/views/demo/data-screen/components/vehicle-charging-chart.vue')['default']
VehicleDistribution: typeof import('./../src/views/demo/data-screen/components/vehicle-distribution.vue')['default']
WangEditor: typeof import('./../src/components/WangEditor/index.vue')['default']
WriteLocalDialog: typeof import('./../src/views/codegen/components/WriteLocalDialog.vue')['default']
}
export interface GlobalDirectives {
vLoading: typeof import('element-plus/es')['ElLoadingDirective']

3
types/env.d.ts vendored
View File

@@ -4,12 +4,11 @@
* Vite 环境变量类型定义
*/
interface ImportMetaEnv {
readonly VITE_APP_PORT: string;
readonly VITE_API_BASE: string;
readonly VITE_PROXY_TARGET: string;
readonly VITE_APP_TITLE?: string;
readonly VITE_TENANT_ENABLED?: string;
readonly VITE_AI_ENABLED?: string;
readonly VITE_OIDC_ENABLED?: string;
readonly VITE_MOCK_ENABLED?: string;
}