├── .editorconfig ├── .env ├── .env.dev ├── .env.local ├── .env.prod ├── .env.stage ├── .env.test ├── .eslintignore ├── .eslintrc-auto-import.json ├── .eslintrc.js ├── .gitignore ├── .prettierignore ├── .stylelintignore ├── .vscode ├── extensions.json ├── launch.json └── settings.json ├── LICENSE ├── README.md ├── build ├── js │ ├── gddt_main.js │ └── xlsx.full.min.js ├── monacoEditor │ ├── index.ts │ ├── main.i18n.json │ └── nls │ │ └── index.ts └── vite │ ├── index.ts │ └── optimize.ts ├── index.html ├── package.json ├── pnpm-lock.yaml ├── postcss.config.js ├── prettier.config.js ├── public ├── favicon.ico ├── home.png ├── img │ ├── 11.jpg │ ├── avatar1.png │ ├── bd1.png │ ├── bd2.png │ ├── bd3.png │ ├── bi.png │ ├── blackfyzd.png │ ├── blackhyzm.png │ ├── blacklltz.png │ ├── blacksptg.png │ ├── fxsc.png │ ├── gdfw.png │ ├── gj.png │ ├── gj1.png │ ├── gj2.png │ ├── hq1.png │ ├── huo.png │ ├── huo1.png │ ├── img1.svg │ ├── img2.svg │ ├── img3.svg │ ├── img4.svg │ ├── img5.svg │ ├── jdt.png │ ├── jdt1.png │ ├── lq1.png │ ├── null.svg │ ├── pin.png │ ├── sjhy1.png │ ├── sjhy2.png │ ├── sjhy3.png │ ├── sjhy4.png │ ├── sjkf.png │ ├── sjsy1.jpeg │ ├── sl.jpg │ ├── sygl1.png │ ├── tb.png │ ├── tb1.png │ ├── tb1.svg │ ├── tb2.png │ ├── tb2.svg │ ├── tb3.png │ ├── tb3.svg │ ├── tb4.png │ ├── tb4.svg │ ├── tb5.svg │ ├── tb6.svg │ ├── time.jpg │ ├── user.jpg │ ├── whitefyzd.png │ ├── whitehyzm.png │ ├── whitelltz.png │ ├── whitesptg.png │ ├── wxxcx1.png │ ├── xc.png │ ├── xm.svg │ ├── xmgl.jpg │ ├── xs.png │ ├── xs1.png │ ├── xxjl.png │ ├── zhts.png │ ├── zmkf.png │ ├── zwgl.jpg │ └── zxkf.png └── logo.gif ├── src ├── App.vue ├── api │ ├── bpm │ │ ├── activity │ │ │ └── index.ts │ │ ├── definition │ │ │ └── index.ts │ │ ├── model │ │ │ └── index.ts │ │ ├── processInstance │ │ │ └── index.ts │ │ ├── task │ │ │ └── index.ts │ │ ├── taskAssignRule │ │ │ └── index.ts │ │ └── userGroup │ │ │ └── index.ts │ ├── design │ │ ├── dic │ │ │ └── index.ts │ │ ├── form │ │ │ └── index.ts │ │ ├── general │ │ │ └── index.ts │ │ ├── report │ │ │ └── index.ts │ │ ├── sys │ │ │ └── index.ts │ │ └── table │ │ │ ├── auth.ts │ │ │ ├── customButton.ts │ │ │ ├── index.ts │ │ │ ├── javaEnhance.ts │ │ │ ├── jsEnhance.ts │ │ │ └── qslEnhance.ts │ ├── infra │ │ ├── config │ │ │ └── index.ts │ │ ├── dataSourceConfig │ │ │ └── index.ts │ │ ├── dbDoc │ │ │ └── index.ts │ │ ├── file │ │ │ └── index.ts │ │ ├── fileConfig │ │ │ └── index.ts │ │ ├── job │ │ │ └── index.ts │ │ ├── jobLog │ │ │ └── index.ts │ │ └── redis │ │ │ ├── index.ts │ │ │ └── types.ts │ ├── login │ │ ├── index.ts │ │ ├── oauth2 │ │ │ └── index.ts │ │ └── types.ts │ └── system │ │ ├── apiLog │ │ └── index.ts │ │ ├── area │ │ └── index.ts │ │ ├── dept │ │ └── index.ts │ │ ├── dict │ │ ├── dict.data.ts │ │ └── dict.type.ts │ │ ├── errorCode │ │ └── index.ts │ │ ├── loginLog │ │ └── index.ts │ │ ├── mail │ │ ├── account │ │ │ └── index.ts │ │ ├── log │ │ │ └── index.ts │ │ └── template │ │ │ └── index.ts │ │ ├── menu │ │ └── index.ts │ │ ├── notice │ │ └── index.ts │ │ ├── notify │ │ ├── message │ │ │ └── index.ts │ │ └── template │ │ │ └── index.ts │ │ ├── oauth2 │ │ ├── client.ts │ │ └── token.ts │ │ ├── operatelog │ │ └── index.ts │ │ ├── permission │ │ └── index.ts │ │ ├── post │ │ └── index.ts │ │ ├── role │ │ └── index.ts │ │ ├── sensitiveWord │ │ └── index.ts │ │ ├── sms │ │ ├── smsChannel │ │ │ └── index.ts │ │ ├── smsLog │ │ │ └── index.ts │ │ └── smsTemplate │ │ │ └── index.ts │ │ ├── social │ │ ├── client │ │ │ └── index.ts │ │ └── user │ │ │ └── index.ts │ │ ├── tenant │ │ └── index.ts │ │ ├── tenantPackage │ │ └── index.ts │ │ └── user │ │ ├── index.ts │ │ ├── profile.ts │ │ └── socialUser.ts ├── assets │ ├── imgs │ │ ├── avatar.gif │ │ ├── avatar.jpg │ │ ├── default_image.png │ │ ├── khgl.svg │ │ ├── login │ │ │ ├── login_right_bg.png │ │ │ ├── login_right_bg_1.png │ │ │ ├── login_right_bg_2.png │ │ │ ├── login_sutra_1.png │ │ │ ├── login_sutra_2.png │ │ │ └── login_text.png │ │ ├── loginBj.png │ │ ├── logo.png │ │ ├── logo_min.png │ │ ├── logo_white.png │ │ ├── profile.jpg │ │ ├── tb1.svg │ │ ├── tb2.svg │ │ ├── tb3.svg │ │ ├── tb4.svg │ │ ├── tb5.svg │ │ └── wechat.png │ ├── json │ │ └── login_left.json │ └── svgs │ │ ├── 403.svg │ │ ├── 404.svg │ │ ├── 500.svg │ │ ├── bottom.svg │ │ ├── external │ │ └── external_bg.svg │ │ ├── gitee │ │ ├── JeeLowCode-1.0.0-red.svg │ │ ├── Spring Boot-2.7.18-yellow.svg │ │ ├── Vue-3.2-blue.svg │ │ ├── commercial_free.svg │ │ └── license-Apache 2.0-green.svg │ │ ├── pay │ │ └── icon │ │ │ ├── alipay_app.svg │ │ │ ├── alipay_bar.svg │ │ │ ├── alipay_pc.svg │ │ │ ├── alipay_qr.svg │ │ │ ├── alipay_wap.svg │ │ │ ├── mock.svg │ │ │ ├── wx_app.svg │ │ │ ├── wx_bar.svg │ │ │ ├── wx_lite.svg │ │ │ ├── wx_native.svg │ │ │ └── wx_pub.svg │ │ └── top.svg ├── components │ ├── Backtop │ │ ├── index.ts │ │ └── src │ │ │ └── Backtop.vue │ ├── ConfigGlobal │ │ ├── index.ts │ │ └── src │ │ │ └── ConfigGlobal.vue │ ├── ContentWrap │ │ ├── index.ts │ │ └── src │ │ │ └── ContentWrap.vue │ ├── CountTo │ │ ├── index.ts │ │ └── src │ │ │ └── CountTo.vue │ ├── Crontab │ │ ├── index.ts │ │ └── src │ │ │ └── Crontab.vue │ ├── Cropper │ │ ├── index.ts │ │ └── src │ │ │ ├── CopperModal.vue │ │ │ ├── Cropper.vue │ │ │ ├── CropperAvatar.vue │ │ │ └── types.ts │ ├── Dialog │ │ ├── index.ts │ │ └── src │ │ │ └── Dialog.vue │ ├── DictTag │ │ ├── index.ts │ │ └── src │ │ │ └── DictTag.vue │ ├── Echart │ │ ├── index.ts │ │ └── src │ │ │ └── Echart.vue │ ├── Error │ │ ├── index.ts │ │ └── src │ │ │ └── Error.vue │ ├── Highlight │ │ ├── index.ts │ │ └── src │ │ │ └── Highlight.vue │ ├── IFrame │ │ ├── index.ts │ │ └── src │ │ │ └── IFrame.vue │ ├── Icon │ │ ├── index.ts │ │ └── src │ │ │ ├── Icon.vue │ │ │ ├── IconSelect.vue │ │ │ └── data.ts │ ├── ImageViewer │ │ ├── index.ts │ │ └── src │ │ │ ├── ImageViewer.vue │ │ │ └── types.ts │ ├── Infotip │ │ ├── index.ts │ │ └── src │ │ │ └── Infotip.vue │ ├── InputPassword │ │ ├── index.ts │ │ └── src │ │ │ └── InputPassword.vue │ ├── LowDesign │ │ ├── index.ts │ │ └── src │ │ │ ├── ControlView.vue │ │ │ ├── DesignPopup.vue │ │ │ ├── FormView.vue │ │ │ ├── LowForm │ │ │ ├── components │ │ │ │ ├── ButtonList.vue │ │ │ │ ├── ComboBox.vue │ │ │ │ ├── CustomTest.vue │ │ │ │ ├── FormTable.vue │ │ │ │ ├── FormTabs.vue │ │ │ │ └── index.ts │ │ │ └── index.vue │ │ │ ├── LowReport │ │ │ └── index.vue │ │ │ ├── LowTable │ │ │ ├── components │ │ │ │ ├── InlineSearch.vue │ │ │ │ ├── SubForm.vue │ │ │ │ ├── SubTable.vue │ │ │ │ ├── SummaryTop.vue │ │ │ │ ├── TableButton.vue │ │ │ │ ├── TableCellUpload.vue │ │ │ │ ├── import │ │ │ │ │ ├── importData.vue │ │ │ │ │ ├── importHistory.vue │ │ │ │ │ └── importView.vue │ │ │ │ └── index.ts │ │ │ └── index.vue │ │ │ ├── TableView.vue │ │ │ ├── TabsControl.vue │ │ │ ├── TabsView.vue │ │ │ ├── controlPath.ts │ │ │ ├── shareControl │ │ │ ├── AvueSlot.vue │ │ │ ├── DeptSelect.vue │ │ │ ├── DicTableSelect.vue │ │ │ ├── IconSelectInput.vue │ │ │ ├── InputNumberRange.vue │ │ │ ├── MarkDown.vue │ │ │ ├── UserSelect.vue │ │ │ └── index.ts │ │ │ ├── styles │ │ │ └── form.scss │ │ │ ├── types │ │ │ └── designPopup.ts │ │ │ └── utils │ │ │ ├── aes.ts │ │ │ ├── controlOption.ts │ │ │ ├── defaultUseUtil.ts │ │ │ ├── enhanceTip.ts │ │ │ ├── example.ts │ │ │ ├── formUtil.ts │ │ │ ├── getName.ts │ │ │ ├── iconData.ts │ │ │ ├── registerComponent.ts │ │ │ ├── tableUtil.ts │ │ │ ├── tipView.ts │ │ │ ├── util.ts │ │ │ └── verifyOption.ts │ ├── LowFormDesign │ │ ├── components │ │ │ ├── DesignConfig │ │ │ │ ├── components │ │ │ │ │ ├── ControlConfig.vue │ │ │ │ │ ├── FormConfig.vue │ │ │ │ │ ├── TableDicOption.vue │ │ │ │ │ ├── config │ │ │ │ │ │ ├── Array.vue │ │ │ │ │ │ ├── ButtonList.vue │ │ │ │ │ │ ├── Color.vue │ │ │ │ │ │ ├── CustomControl.vue │ │ │ │ │ │ ├── DateTime.vue │ │ │ │ │ │ ├── DeptSelect.vue │ │ │ │ │ │ ├── DicTableSelect.vue │ │ │ │ │ │ ├── Input.vue │ │ │ │ │ │ ├── LayoutGroup.vue │ │ │ │ │ │ ├── LayoutTable.vue │ │ │ │ │ │ ├── LayoutTabs.vue │ │ │ │ │ │ ├── Map.vue │ │ │ │ │ │ ├── MarkDown.vue │ │ │ │ │ │ ├── MonacoEditor.vue │ │ │ │ │ │ ├── Rate.vue │ │ │ │ │ │ ├── RegionSelect.vue │ │ │ │ │ │ ├── Select.vue │ │ │ │ │ │ ├── Slider.vue │ │ │ │ │ │ ├── Switch.vue │ │ │ │ │ │ ├── Table.vue │ │ │ │ │ │ ├── Title.vue │ │ │ │ │ │ ├── Tree.vue │ │ │ │ │ │ ├── Ueditor.vue │ │ │ │ │ │ ├── Upload.vue │ │ │ │ │ │ ├── UserSelect.vue │ │ │ │ │ │ └── index.ts │ │ │ │ │ └── index.ts │ │ │ │ └── index.vue │ │ │ ├── DesignControl │ │ │ │ ├── controlConfig.js │ │ │ │ └── index.vue │ │ │ ├── DesignLayout │ │ │ │ ├── LayoutButton.vue │ │ │ │ ├── LayoutComboBox.vue │ │ │ │ ├── LayoutGroup.vue │ │ │ │ ├── LayoutItem.vue │ │ │ │ ├── LayoutTable.vue │ │ │ │ ├── LayoutTabs.vue │ │ │ │ └── index.vue │ │ │ └── index.ts │ │ ├── index.ts │ │ ├── index.vue │ │ ├── styles │ │ │ └── index.scss │ │ └── utils │ │ │ ├── convert.ts │ │ │ ├── generate.ts │ │ │ └── util.ts │ ├── MonacoEditor │ │ ├── index.ts │ │ └── src │ │ │ ├── DeffEditor.vue │ │ │ └── MonacoEditor.vue │ ├── Qrcode │ │ ├── index.ts │ │ └── src │ │ │ └── Qrcode.vue │ ├── RouterSearch │ │ └── index.vue │ ├── Sticky │ │ ├── index.ts │ │ └── src │ │ │ └── Sticky.vue │ ├── UploadFile │ │ ├── index.ts │ │ └── src │ │ │ ├── UploadFile.vue │ │ │ ├── UploadImg.vue │ │ │ ├── UploadImgs.vue │ │ │ └── useUpload.ts │ ├── Verifition │ │ ├── index.ts │ │ └── src │ │ │ ├── Verify.vue │ │ │ ├── Verify │ │ │ ├── VerifyPoints.vue │ │ │ ├── VerifySlide.vue │ │ │ └── index.ts │ │ │ └── utils │ │ │ ├── ase.ts │ │ │ └── util.ts │ ├── XButton │ │ ├── index.ts │ │ └── src │ │ │ ├── XButton.vue │ │ │ └── XTextButton.vue │ ├── bpmnProcessDesigner │ │ ├── package │ │ │ ├── designer │ │ │ │ ├── ProcessDesigner.vue │ │ │ │ ├── ProcessViewer.vue │ │ │ │ ├── index.ts │ │ │ │ ├── index2.ts │ │ │ │ └── plugins │ │ │ │ │ ├── content-pad │ │ │ │ │ ├── contentPadProvider.js │ │ │ │ │ └── index.js │ │ │ │ │ ├── defaultEmpty.js │ │ │ │ │ ├── descriptor │ │ │ │ │ ├── activitiDescriptor.json │ │ │ │ │ ├── camundaDescriptor.json │ │ │ │ │ └── flowableDescriptor.json │ │ │ │ │ ├── extension-moddle │ │ │ │ │ ├── activiti │ │ │ │ │ │ ├── activitiExtension.js │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── camunda │ │ │ │ │ │ ├── extension.js │ │ │ │ │ │ └── index.js │ │ │ │ │ └── flowable │ │ │ │ │ │ ├── flowableExtension.js │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── palette │ │ │ │ │ ├── CustomPalette.js │ │ │ │ │ ├── index.js │ │ │ │ │ └── paletteProvider.js │ │ │ │ │ └── translate │ │ │ │ │ ├── customTranslate.js │ │ │ │ │ └── zh.js │ │ │ ├── index.ts │ │ │ ├── palette │ │ │ │ └── ProcessPalette.vue │ │ │ ├── penal │ │ │ │ ├── PropertiesPanel.vue │ │ │ │ ├── base │ │ │ │ │ └── ElementBaseInfo.vue │ │ │ │ ├── flow-condition │ │ │ │ │ └── FlowCondition.vue │ │ │ │ ├── form │ │ │ │ │ └── ElementForm.vue │ │ │ │ ├── index.js │ │ │ │ ├── listeners │ │ │ │ │ ├── ElementListeners.vue │ │ │ │ │ ├── UserTaskListeners.vue │ │ │ │ │ ├── template.js │ │ │ │ │ └── utilSelf.ts │ │ │ │ ├── multi-instance │ │ │ │ │ └── ElementMultiInstance.vue │ │ │ │ ├── other │ │ │ │ │ └── ElementOtherConfig.vue │ │ │ │ ├── properties │ │ │ │ │ └── ElementProperties.vue │ │ │ │ ├── signal-message │ │ │ │ │ └── SignalAndMessage.vue │ │ │ │ └── task │ │ │ │ │ ├── ElementTask.vue │ │ │ │ │ └── task-components │ │ │ │ │ ├── ReceiveTask.vue │ │ │ │ │ ├── ScriptTask.vue │ │ │ │ │ └── UserTask.vue │ │ │ ├── theme │ │ │ │ ├── element-variables.scss │ │ │ │ ├── index.scss │ │ │ │ ├── process-designer.scss │ │ │ │ └── process-panel.scss │ │ │ └── utils.ts │ │ └── src │ │ │ ├── highlight │ │ │ └── index.js │ │ │ ├── modules │ │ │ ├── custom-renderer │ │ │ │ ├── CustomRenderer.js │ │ │ │ └── index.js │ │ │ └── rules │ │ │ │ ├── CustomRules.js │ │ │ │ └── index.js │ │ │ ├── translations.ts │ │ │ └── utils │ │ │ ├── directive │ │ │ └── clickOutSide.js │ │ │ ├── index.js │ │ │ └── xml2json.js │ └── index.ts ├── config │ └── axios │ │ ├── config.ts │ │ ├── errorCode.ts │ │ ├── index.ts │ │ └── service.ts ├── directives │ ├── index.ts │ ├── permission │ │ ├── hasPermi.ts │ │ └── hasRole.ts │ └── resize │ │ └── ResizeObserver.ts ├── hooks │ ├── design │ │ ├── useAvueUpload.ts │ │ ├── useCopyText.ts │ │ ├── useCrudHeight.ts │ │ ├── useCrudPermi.ts │ │ ├── useDrageed.ts │ │ ├── useGroup.ts │ │ ├── useMEDialog.ts │ │ └── useMonacoEditor.ts │ ├── event │ │ └── useScrollTo.ts │ ├── login │ │ └── loginApi.ts │ └── web │ │ ├── useCache.ts │ │ ├── useConfigGlobal.ts │ │ ├── useDesign.ts │ │ ├── useEmitt.ts │ │ ├── useGuide.ts │ │ ├── useI18n.ts │ │ ├── useIcon.ts │ │ ├── useLocale.ts │ │ ├── useMessage.ts │ │ ├── useNProgress.ts │ │ ├── useNetwork.ts │ │ ├── useNow.ts │ │ ├── usePageLoading.ts │ │ ├── useTagsView.ts │ │ ├── useTimeAgo.ts │ │ ├── useTitle.ts │ │ ├── useValidator.ts │ │ └── useWatermark.ts ├── layout │ ├── Layout.vue │ └── components │ │ ├── AppView.vue │ │ ├── Breadcrumb │ │ ├── index.ts │ │ └── src │ │ │ ├── Breadcrumb.vue │ │ │ └── helper.ts │ │ ├── ClearCache │ │ ├── index.ts │ │ └── src │ │ │ └── ClearCache.vue │ │ ├── Collapse │ │ ├── index.ts │ │ └── src │ │ │ └── Collapse.vue │ │ ├── ContextMenu │ │ ├── index.ts │ │ └── src │ │ │ └── ContextMenu.vue │ │ ├── Footer │ │ ├── index.ts │ │ └── src │ │ │ └── Footer.vue │ │ ├── LocaleDropdown │ │ ├── index.ts │ │ └── src │ │ │ └── LocaleDropdown.vue │ │ ├── Logo │ │ ├── index.ts │ │ └── src │ │ │ └── Logo.vue │ │ ├── Menu │ │ ├── index.ts │ │ └── src │ │ │ ├── Menu.vue │ │ │ ├── components │ │ │ ├── useRenderMenuItem.tsx │ │ │ └── useRenderMenuTitle.tsx │ │ │ └── helper.ts │ │ ├── Message │ │ ├── index.ts │ │ └── src │ │ │ └── Message.vue │ │ ├── Screenfull │ │ ├── index.ts │ │ └── src │ │ │ └── Screenfull.vue │ │ ├── Setting │ │ ├── index.ts │ │ └── src │ │ │ ├── Setting.vue │ │ │ └── components │ │ │ ├── ColorRadioPicker.vue │ │ │ ├── InterfaceDisplay.vue │ │ │ └── LayoutRadioPicker.vue │ │ ├── SizeDropdown │ │ ├── index.ts │ │ └── src │ │ │ └── SizeDropdown.vue │ │ ├── TabMenu │ │ ├── index.ts │ │ └── src │ │ │ ├── TabMenu.vue │ │ │ └── helper.ts │ │ ├── TagsView │ │ ├── index.ts │ │ └── src │ │ │ ├── TagsView.vue │ │ │ └── helper.ts │ │ ├── ThemeSwitch │ │ ├── index.ts │ │ └── src │ │ │ └── ThemeSwitch.vue │ │ ├── ToolHeader.vue │ │ ├── UserInfo │ │ ├── index.ts │ │ └── src │ │ │ └── UserInfo.vue │ │ └── useRenderLayout.tsx ├── locales │ ├── en.ts │ └── zh-CN.ts ├── main.ts ├── permission.ts ├── plugins │ ├── animate.css │ │ └── index.ts │ ├── avue │ │ └── index.ts │ ├── echarts │ │ └── index.ts │ ├── lowDesagn │ │ └── index.ts │ ├── md │ │ ├── editor │ │ │ └── index.ts │ │ └── preview │ │ │ └── index.ts │ ├── svgIcon │ │ └── index.ts │ ├── tongji │ │ └── index.ts │ ├── unocss │ │ └── index.ts │ └── vueI18n │ │ ├── helper.ts │ │ └── index.ts ├── router │ ├── index.ts │ └── modules │ │ └── remaining.ts ├── store │ ├── index.ts │ └── modules │ │ ├── app.ts │ │ ├── dict.ts │ │ ├── locale.ts │ │ ├── low.ts │ │ ├── permission.ts │ │ ├── tagsView.ts │ │ └── user.ts ├── styles │ ├── avueForm.scss │ ├── avueTable.scss │ ├── global.module.scss │ ├── index.scss │ ├── mixin.scss │ ├── theme.scss │ ├── var.css │ └── variables.scss ├── types │ ├── auto-components.d.ts │ ├── auto-imports.d.ts │ ├── components.d.ts │ ├── configGlobal.d.ts │ ├── contextMenu.d.ts │ ├── elementPlus.d.ts │ ├── icon.d.ts │ ├── infoTip.d.ts │ ├── layout.d.ts │ ├── localeDropdown.d.ts │ ├── qrcode.d.ts │ └── theme.d.ts ├── utils │ ├── Logger.ts │ ├── auth.ts │ ├── color.ts │ ├── constants.ts │ ├── dict.ts │ ├── domUtils.ts │ ├── download.ts │ ├── filt.ts │ ├── formRules.ts │ ├── formatTime.ts │ ├── formatter.ts │ ├── index.ts │ ├── is.ts │ ├── jsencrypt.ts │ ├── lowDesign.ts │ ├── permission.ts │ ├── propTypes.ts │ ├── routerHelper.ts │ ├── symbols.ts │ ├── tree.ts │ └── tsxHelper.ts └── views │ ├── Error │ ├── 403.vue │ ├── 404.vue │ └── 500.vue │ ├── Home │ ├── Index.vue │ ├── Index10.vue │ ├── Index11.vue │ ├── Index2.vue │ ├── Index3.vue │ ├── Index4.vue │ ├── Index5.vue │ ├── Index6.vue │ ├── Index7.vue │ ├── Index8.vue │ ├── Index9.vue │ ├── components │ │ └── table.vue │ ├── echarts-data.ts │ └── types.ts │ ├── Login │ ├── Login.vue │ ├── SocialLogin.vue │ ├── components │ │ ├── LoginForm.vue │ │ ├── LoginFormTitle.vue │ │ ├── MobileForm.vue │ │ ├── QrCodeForm.vue │ │ ├── SSOLogin.vue │ │ ├── index.ts │ │ └── useLogin.ts │ └── sutra │ │ └── Login.vue │ ├── Profile │ ├── Index.vue │ └── components │ │ ├── BasicInfo.vue │ │ ├── ProfileUser.vue │ │ ├── ResetPwd.vue │ │ ├── UserAvatar.vue │ │ ├── UserSocial.vue │ │ └── index.ts │ ├── Redirect │ └── Redirect.vue │ ├── bpm │ ├── definition │ │ └── index.vue │ ├── group │ │ └── index.vue │ ├── model │ │ ├── ModelImportForm.vue │ │ ├── editor │ │ │ └── index.vue │ │ └── index.vue │ ├── processInstance │ │ ├── create │ │ │ └── index.vue │ │ ├── detail │ │ │ ├── ProcessInstanceBpmnViewer.vue │ │ │ ├── ProcessInstanceChildrenTaskList.vue │ │ │ ├── ProcessInstanceTaskList.vue │ │ │ ├── TaskAddSignDialogForm.vue │ │ │ ├── TaskCCDialogForm.vue │ │ │ ├── TaskDelegateForm.vue │ │ │ ├── TaskReturnDialogForm.vue │ │ │ ├── TaskSubSignDialogForm.vue │ │ │ ├── TaskUpdateAssigneeForm.vue │ │ │ └── index.vue │ │ └── index.vue │ ├── task │ │ ├── done │ │ │ └── index.vue │ │ └── todo │ │ │ └── index.vue │ └── taskAssignRule │ │ ├── TaskAssignRuleForm.vue │ │ └── index.vue │ ├── infra │ ├── config │ │ └── index.vue │ ├── dataSourceConfig │ │ └── index.vue │ ├── dbDoc │ │ └── index.vue │ ├── druid │ │ └── index.vue │ ├── file │ │ ├── FileForm.vue │ │ └── index.vue │ ├── fileConfig │ │ └── index.vue │ ├── job │ │ ├── index.vue │ │ └── logger │ │ │ └── index.vue │ ├── redis │ │ └── index.vue │ ├── server │ │ └── index.vue │ ├── skywalking │ │ └── index.vue │ ├── swagger │ │ └── index.vue │ └── webSocket │ │ └── index.vue │ ├── lowTemplate │ └── generalPage │ │ ├── album │ │ └── albumForm.vue │ │ ├── feature │ │ ├── feature_grzx1.vue │ │ └── feature_grzx2.vue │ │ ├── form │ │ ├── form_hxfb.vue │ │ └── form_zxfb.vue │ │ ├── group │ │ ├── group_gjsxy.vue │ │ ├── group_gjxqy.vue │ │ ├── group_jcxqy.vue │ │ ├── group_sjbby.vue │ │ └── group_zlsz.vue │ │ ├── journal │ │ └── journal.vue │ │ ├── post │ │ └── postForm.vue │ │ ├── project │ │ ├── jdt.vue │ │ ├── project.vue │ │ ├── projectForm.vue │ │ └── update.vue │ │ ├── riendshipForum │ │ ├── components │ │ │ ├── article.vue │ │ │ └── topicList.vue │ │ └── index.vue │ │ ├── schedule │ │ └── schedule.vue │ │ ├── staffManagement │ │ ├── index.vue │ │ └── staffView.vue │ │ ├── taskManagement │ │ └── index.vue │ │ ├── team │ │ └── team.vue │ │ ├── teamDetails │ │ └── index.vue │ │ ├── userManagement │ │ └── index.vue │ │ └── workReport │ │ ├── components │ │ ├── alert.vue │ │ ├── index.vue │ │ └── steps.vue │ │ └── index.vue │ ├── lowdesign │ ├── formDesign │ │ └── index.vue │ ├── formView │ │ └── index.vue │ ├── general │ │ └── components │ │ │ ├── TipView.vue │ │ │ ├── VerifyOption.vue │ │ │ ├── index.ts │ │ │ └── useRenderVxeColumn.tsx │ ├── reportDesign │ │ ├── components │ │ │ ├── TableInfo.vue │ │ │ └── index.ts │ │ ├── designData.ts │ │ └── index.vue │ ├── reportView │ │ └── index.vue │ ├── tableDesign │ │ ├── components │ │ │ ├── AuthConfig.vue │ │ │ ├── ConfigOption.vue │ │ │ ├── CustomButton.vue │ │ │ ├── DataOriginOption.vue │ │ │ ├── FormattingOption.vue │ │ │ ├── InfoVxeTable.vue │ │ │ ├── InfoVxeTopBtn.vue │ │ │ ├── JavaEnhance.vue │ │ │ ├── JsEnhanceHistory.vue │ │ │ ├── SearchOption.vue │ │ │ ├── SortOption.vue │ │ │ ├── SqlEnhance.vue │ │ │ ├── SqlOption.vue │ │ │ ├── TableInfo.vue │ │ │ └── index.ts │ │ ├── designData.ts │ │ └── index.vue │ └── tableView │ │ └── index.vue │ ├── lowexample │ └── form │ │ ├── AcrossForm.vue │ │ ├── OrderForm.vue │ │ ├── OrderFormView.vue │ │ ├── TabsCardForm.vue │ │ ├── TabsForm.vue │ │ ├── WorkOrderForm.vue │ │ ├── step │ │ ├── StepHorizontalForm.vue │ │ └── StepVerticalForm.vue │ │ └── workOrder.vue │ ├── system │ ├── apilog │ │ ├── failurelog │ │ │ └── index.vue │ │ └── successlog │ │ │ └── index.vue │ ├── area │ │ └── index.vue │ ├── dept │ │ └── index.vue │ ├── dict │ │ ├── data │ │ │ └── index.vue │ │ └── index.vue │ ├── errorCode │ │ └── index.vue │ ├── loginlog │ │ └── index.vue │ ├── mail │ │ ├── account │ │ │ └── index.vue │ │ ├── log │ │ │ └── index.vue │ │ └── template │ │ │ └── index.vue │ ├── menu │ │ └── index.vue │ ├── notice │ │ └── index.vue │ ├── notify │ │ ├── message │ │ │ └── index.vue │ │ ├── my │ │ │ └── index.vue │ │ └── template │ │ │ └── index.vue │ ├── oauth2 │ │ ├── client │ │ │ └── index.vue │ │ └── token │ │ │ └── index.vue │ ├── operatelog │ │ └── index.vue │ ├── post │ │ └── index.vue │ ├── role │ │ ├── RoleAssignMenuForm.vue │ │ ├── RoleDataPermissionForm.vue │ │ └── index.vue │ ├── sensitiveWord │ │ └── index.vue │ ├── sms │ │ ├── channel │ │ │ └── index.vue │ │ ├── log │ │ │ └── index.vue │ │ └── template │ │ │ └── index.vue │ ├── social │ │ ├── client │ │ │ └── index.vue │ │ └── user │ │ │ └── index.vue │ ├── tenant │ │ └── index.vue │ ├── tenantPackage │ │ └── index.vue │ └── user │ │ ├── UserAssignRoleForm.vue │ │ ├── UserImportForm.vue │ │ └── index.vue │ └── test │ └── index.vue ├── stylelint.config.js ├── tsconfig.json ├── types ├── avue.d.ts ├── components.d.ts ├── env.d.ts ├── global.d.ts └── router.d.ts ├── uno.config.ts └── vite.config.ts /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | [*.{js,ts,vue}] 3 | charset = utf-8 # 设置文件字符集为 utf-8 4 | end_of_line = lf # 控制换行类型(lf | cr | crlf) 5 | insert_final_newline = true # 始终在文件末尾插入一个新行 6 | indent_style = space # 缩进风格(tab | space) 7 | indent_size = 2 # 缩进大小 8 | max_line_length = 100 # 最大行长度 9 | 10 | [*.md] # 仅 md 文件适用以下规则 11 | max_line_length = off # 关闭最大行长度限制 12 | trim_trailing_whitespace = false # 关闭末尾空格修剪 13 | -------------------------------------------------------------------------------- /.env: -------------------------------------------------------------------------------- 1 | # 标题 2 | VITE_APP_TITLE=JeeLowCode 3 | 4 | # 项目本地运行端口号 5 | VITE_PORT=80 6 | 7 | # open 运行 npm run dev 时自动打开浏览器 8 | VITE_OPEN=true 9 | 10 | # 租户开关 11 | VITE_APP_TENANT_ENABLE=true 12 | 13 | # 验证码的开关 14 | VITE_APP_CAPTCHA_ENABLE=true 15 | 16 | # 文档地址的开关 17 | VITE_APP_DOCALERT_ENABLE=true 18 | 19 | # 百度统计 20 | VITE_APP_BAIDU_CODE = a1ff8825baa73c3a78eb96aa40325abc 21 | -------------------------------------------------------------------------------- /.env.dev: -------------------------------------------------------------------------------- 1 | # 开发环境:本地只启动前端项目,依赖开发环境(后端、APP) 2 | VITE_NODE_ENV=development 3 | 4 | VITE_DEV=true 5 | 6 | # 请求路径 注:/api 正常不需要 当前是访问演示环境nginx转发用 7 | VITE_BASE_URL='https://demo.jeelowcode.com/api' 8 | 9 | # 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持S3服务 10 | VITE_UPLOAD_TYPE=server 11 | 12 | # 接口地址 13 | VITE_API_URL=/admin-api 14 | 15 | # 是否删除debugger 16 | VITE_DROP_DEBUGGER=false 17 | 18 | # 是否删除console.log 19 | VITE_DROP_CONSOLE=false 20 | 21 | # 是否sourcemap 22 | VITE_SOURCEMAP=true 23 | 24 | # 打包路径 25 | VITE_BASE_PATH=/ 26 | 27 | # 输出路径 28 | VITE_OUT_DIR=dist 29 | 30 | # 是否隐藏全局设置按钮 31 | VITE_HIDE_GLOBAL_SETTING=true 32 | 33 | # 验证码的开关 34 | VITE_APP_CAPTCHA_ENABLE=false 35 | -------------------------------------------------------------------------------- /.env.local: -------------------------------------------------------------------------------- 1 | # 本地开发环境:本地启动所有项目(前端、后端、APP)时使用,不依赖外部环境 2 | NODE_ENV=development 3 | 4 | VITE_DEV=true 5 | 6 | # 请求路径 注:/api 正常不需要 当前是访问演示环境nginx转发用 7 | VITE_BASE_URL='https://demo.jeelowcode.com/api' 8 | 9 | # 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持 S3 服务 10 | VITE_UPLOAD_TYPE=server 11 | 12 | # 接口前缀 13 | VITE_API_BASEPATH=/dev-api 14 | 15 | # 接口地址 16 | VITE_API_URL=/admin-api 17 | 18 | # 是否删除debugger 19 | VITE_DROP_DEBUGGER=false 20 | 21 | # 是否删除console.log 22 | VITE_DROP_CONSOLE=false 23 | 24 | # 是否sourcemap 25 | VITE_SOURCEMAP=false 26 | 27 | # 打包路径 28 | VITE_BASE_PATH=/ 29 | 30 | # 是否隐藏全局设置按钮 31 | VITE_HIDE_GLOBAL_SETTING=false 32 | 33 | # 验证码的开关 34 | VITE_APP_CAPTCHA_ENABLE=false 35 | -------------------------------------------------------------------------------- /.env.prod: -------------------------------------------------------------------------------- 1 | # 生产环境:只在打包时使用 2 | VITE_NODE_ENV=production 3 | 4 | VITE_DEV=false 5 | 6 | # 请求路径 7 | VITE_BASE_URL='/api' 8 | 9 | # 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持S3服务 10 | VITE_UPLOAD_TYPE=server 11 | 12 | # 接口地址 13 | VITE_API_URL=/admin-api 14 | 15 | # 是否删除debugger 16 | VITE_DROP_DEBUGGER=true 17 | 18 | # 是否删除console.log 19 | VITE_DROP_CONSOLE=true 20 | 21 | # 是否sourcemap 22 | VITE_SOURCEMAP=false 23 | 24 | # 打包路径 25 | VITE_BASE_PATH=/ 26 | 27 | # 输出路径 28 | VITE_OUT_DIR=dist-prod 29 | 30 | # 是否隐藏全局设置按钮 31 | VITE_HIDE_GLOBAL_SETTING=false 32 | 33 | # 演示登录账号 34 | VITE_LOGIN_USERNAME=JeeLowCode 35 | 36 | # 演示登录密码 37 | VITE_LOGIN_PASSWORD=JeeLowCode123 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /.env.stage: -------------------------------------------------------------------------------- 1 | # 预发布环境:只在打包时使用 2 | VITE_NODE_ENV=production 3 | 4 | VITE_DEV=false 5 | 6 | # 请求路径 7 | VITE_BASE_URL='/api' 8 | 9 | # 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持S3服务 10 | VITE_UPLOAD_TYPE=server 11 | 12 | # 接口地址 13 | VITE_API_URL=/admin-api 14 | 15 | # 是否删除debugger 16 | VITE_DROP_DEBUGGER=true 17 | 18 | # 是否删除console.log 19 | VITE_DROP_CONSOLE=true 20 | 21 | # 是否sourcemap 22 | VITE_SOURCEMAP=false 23 | 24 | # 打包路径 25 | VITE_BASE_PATH='/' 26 | 27 | # 输出路径 28 | VITE_OUT_DIR=dist-stage 29 | 30 | # 是否隐藏全局设置按钮 31 | VITE_HIDE_GLOBAL_SETTING=false 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /.env.test: -------------------------------------------------------------------------------- 1 | # 测试环境:只在打包时使用 2 | VITE_NODE_ENV=production 3 | 4 | VITE_DEV=false 5 | 6 | # 请求路径 7 | VITE_BASE_URL='/api' 8 | 9 | # 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持S3服务 10 | VITE_UPLOAD_TYPE=server 11 | 12 | # 接口地址 13 | VITE_API_URL=/admin-api 14 | 15 | # 是否删除debugger 16 | VITE_DROP_DEBUGGER=true 17 | 18 | # 是否删除console.log 19 | VITE_DROP_CONSOLE=true 20 | 21 | # 是否sourcemap 22 | VITE_SOURCEMAP=false 23 | 24 | # 打包路径 25 | VITE_BASE_PATH=/ 26 | 27 | # 输出路径 28 | VITE_OUT_DIR=dist-test 29 | 30 | # 是否隐藏全局设置按钮 31 | VITE_HIDE_GLOBAL_SETTING=false 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | /build/ 2 | /config/ 3 | /dist/ 4 | /*.js 5 | /test/unit/coverage/ 6 | /node_modules/* 7 | /dist* 8 | /src/main.ts 9 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store 3 | dist 4 | dist-ssr 5 | *.local 6 | /dist* 7 | *-lock.* 8 | pnpm-debug 9 | auto-*.d.ts 10 | .idea 11 | .history 12 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | /node_modules/** 2 | /dist/ 3 | /dist* 4 | /public/* 5 | /docs/* 6 | /vite.config.ts 7 | /src/types/env.d.ts 8 | /src/types/auto-components.d.ts 9 | /src/types/auto-imports.d.ts 10 | /docs/**/* 11 | CHANGELOG 12 | -------------------------------------------------------------------------------- /.stylelintignore: -------------------------------------------------------------------------------- 1 | /dist/* 2 | /public/* 3 | public/* 4 | /dist* 5 | /src/types/env.d.ts 6 | /docs/**/* 7 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "christian-kohler.path-intellisense", 4 | "vscode-icons-team.vscode-icons", 5 | "davidanson.vscode-markdownlint", 6 | "stylelint.vscode-stylelint", 7 | "dbaeumer.vscode-eslint", 8 | "esbenp.prettier-vscode", 9 | "mrmlnc.vscode-less", 10 | "lokalise.i18n-ally", 11 | "redhat.vscode-yaml", 12 | "csstools.postcss", 13 | "mikestead.dotenv", 14 | "eamodio.gitlens", 15 | "antfu.iconify", 16 | "antfu.unocss", 17 | "Vue.volar" 18 | ] 19 | } 20 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "type": "msedge", 9 | "request": "launch", 10 | "name": "jeelowcode", 11 | "url": "http://localhost:81", 12 | "webRoot": "${workspaceFolder}/src", 13 | "sourceMaps": true 14 | } 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /build/monacoEditor/index.ts: -------------------------------------------------------------------------------- 1 | import i18n from './main.i18n.json'; 2 | import nlsPlugin, { Languages, esbuildPluginMonacoEditorNls } from './nls'; 3 | 4 | export default { i18n, nlsPlugin, Languages, esbuildPluginMonacoEditorNls } -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | autoprefixer: {} 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /prettier.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | printWidth: 100, // 每行代码长度(默认80) 3 | tabWidth: 2, // 每个tab相当于多少个空格(默认2)ab进行缩进(默认false) 4 | useTabs: false, // 是否使用tab 5 | semi: false, // 声明结尾使用分号(默认true) 6 | vueIndentScriptAndStyle: false, 7 | singleQuote: true, // 使用单引号(默认false) 8 | quoteProps: 'as-needed', 9 | bracketSpacing: true, // 对象字面量的大括号间使用空格(默认true) 10 | trailingComma: 'none', // 多行使用拖尾逗号(默认none) 11 | jsxSingleQuote: false, 12 | // 箭头函数参数括号 默认avoid 可选 avoid| always 13 | // avoid 能省略括号的时候就省略 例如x => x 14 | // always 总是有括号 15 | arrowParens: 'always', 16 | insertPragma: false, 17 | requirePragma: false, 18 | proseWrap: 'never', 19 | htmlWhitespaceSensitivity: 'strict', 20 | endOfLine: 'auto', 21 | rangeStart: 0 22 | } 23 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/public/favicon.ico -------------------------------------------------------------------------------- /public/home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/public/home.png -------------------------------------------------------------------------------- /public/img/11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/public/img/11.jpg -------------------------------------------------------------------------------- /public/img/avatar1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/public/img/avatar1.png -------------------------------------------------------------------------------- /public/img/bd1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/public/img/bd1.png -------------------------------------------------------------------------------- /public/img/bd2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/public/img/bd2.png -------------------------------------------------------------------------------- /public/img/bd3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/public/img/bd3.png -------------------------------------------------------------------------------- /public/img/bi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/public/img/bi.png -------------------------------------------------------------------------------- /public/img/blackfyzd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/public/img/blackfyzd.png -------------------------------------------------------------------------------- /public/img/blackhyzm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/public/img/blackhyzm.png -------------------------------------------------------------------------------- /public/img/blacklltz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/public/img/blacklltz.png -------------------------------------------------------------------------------- /public/img/blacksptg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/public/img/blacksptg.png -------------------------------------------------------------------------------- /public/img/fxsc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/public/img/fxsc.png -------------------------------------------------------------------------------- /public/img/gdfw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/public/img/gdfw.png -------------------------------------------------------------------------------- /public/img/gj.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/public/img/gj.png -------------------------------------------------------------------------------- /public/img/gj1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/public/img/gj1.png -------------------------------------------------------------------------------- /public/img/gj2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/public/img/gj2.png -------------------------------------------------------------------------------- /public/img/hq1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/public/img/hq1.png -------------------------------------------------------------------------------- /public/img/huo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/public/img/huo.png -------------------------------------------------------------------------------- /public/img/huo1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/public/img/huo1.png -------------------------------------------------------------------------------- /public/img/img1.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/img/img3.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/img/img4.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/img/jdt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/public/img/jdt.png -------------------------------------------------------------------------------- /public/img/jdt1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/public/img/jdt1.png -------------------------------------------------------------------------------- /public/img/lq1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/public/img/lq1.png -------------------------------------------------------------------------------- /public/img/pin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/public/img/pin.png -------------------------------------------------------------------------------- /public/img/sjhy1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/public/img/sjhy1.png -------------------------------------------------------------------------------- /public/img/sjhy2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/public/img/sjhy2.png -------------------------------------------------------------------------------- /public/img/sjhy3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/public/img/sjhy3.png -------------------------------------------------------------------------------- /public/img/sjhy4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/public/img/sjhy4.png -------------------------------------------------------------------------------- /public/img/sjkf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/public/img/sjkf.png -------------------------------------------------------------------------------- /public/img/sjsy1.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/public/img/sjsy1.jpeg -------------------------------------------------------------------------------- /public/img/sl.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/public/img/sl.jpg -------------------------------------------------------------------------------- /public/img/sygl1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/public/img/sygl1.png -------------------------------------------------------------------------------- /public/img/tb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/public/img/tb.png -------------------------------------------------------------------------------- /public/img/tb1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/public/img/tb1.png -------------------------------------------------------------------------------- /public/img/tb1.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/img/tb2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/public/img/tb2.png -------------------------------------------------------------------------------- /public/img/tb2.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/img/tb3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/public/img/tb3.png -------------------------------------------------------------------------------- /public/img/tb3.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/img/tb4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/public/img/tb4.png -------------------------------------------------------------------------------- /public/img/tb5.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/img/tb6.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/img/time.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/public/img/time.jpg -------------------------------------------------------------------------------- /public/img/user.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/public/img/user.jpg -------------------------------------------------------------------------------- /public/img/whitefyzd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/public/img/whitefyzd.png -------------------------------------------------------------------------------- /public/img/whitehyzm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/public/img/whitehyzm.png -------------------------------------------------------------------------------- /public/img/whitelltz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/public/img/whitelltz.png -------------------------------------------------------------------------------- /public/img/whitesptg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/public/img/whitesptg.png -------------------------------------------------------------------------------- /public/img/wxxcx1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/public/img/wxxcx1.png -------------------------------------------------------------------------------- /public/img/xc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/public/img/xc.png -------------------------------------------------------------------------------- /public/img/xmgl.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/public/img/xmgl.jpg -------------------------------------------------------------------------------- /public/img/xs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/public/img/xs.png -------------------------------------------------------------------------------- /public/img/xs1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/public/img/xs1.png -------------------------------------------------------------------------------- /public/img/xxjl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/public/img/xxjl.png -------------------------------------------------------------------------------- /public/img/zhts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/public/img/zhts.png -------------------------------------------------------------------------------- /public/img/zmkf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/public/img/zmkf.png -------------------------------------------------------------------------------- /public/img/zwgl.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/public/img/zwgl.jpg -------------------------------------------------------------------------------- /public/img/zxkf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/public/img/zxkf.png -------------------------------------------------------------------------------- /public/logo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/public/logo.gif -------------------------------------------------------------------------------- /src/api/bpm/activity/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | export const getActivityList = async (params) => { 4 | return await request.get({ 5 | url: '/bpm/activity/list', 6 | params 7 | }) 8 | } 9 | -------------------------------------------------------------------------------- /src/api/bpm/definition/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | export const getProcessDefinitionBpmnXML = async (id: number) => { 4 | return await request.get({ 5 | url: '/bpm/process-definition/get-bpmn-xml?id=' + id 6 | }) 7 | } 8 | 9 | export const getProcessDefinitionPage = async (params) => { 10 | return await request.get({ 11 | url: '/bpm/process-definition/page', 12 | params 13 | }) 14 | } 15 | 16 | export const getProcessDefinitionList = async (params) => { 17 | return await request.get({ 18 | url: '/bpm/process-definition/list', 19 | params 20 | }) 21 | } 22 | -------------------------------------------------------------------------------- /src/api/bpm/taskAssignRule/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | export type TaskAssignVO = { 4 | id: number 5 | modelId: string 6 | processDefinitionId: string 7 | taskDefinitionKey: string 8 | taskDefinitionName: string 9 | options: string[] 10 | type: number 11 | } 12 | 13 | export const getTaskAssignRuleList = async (params) => { 14 | return await request.get({ url: '/bpm/task-assign-rule/list', params }) 15 | } 16 | 17 | export const createTaskAssignRule = async (data: TaskAssignVO) => { 18 | return await request.post({ 19 | url: '/bpm/task-assign-rule/create', 20 | data: data 21 | }) 22 | } 23 | 24 | export const updateTaskAssignRule = async (data: TaskAssignVO) => { 25 | return await request.put({ 26 | url: '/bpm/task-assign-rule/update', 27 | data: data 28 | }) 29 | } 30 | -------------------------------------------------------------------------------- /src/api/bpm/userGroup/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | export type UserGroupVO = { 4 | id: number 5 | name: string 6 | description: string 7 | memberUserIds: number[] 8 | status: number 9 | remark: string 10 | createTime: string 11 | } 12 | 13 | // 创建用户组 14 | export const createUserGroup = async (data: UserGroupVO) => { 15 | return await request.post({ 16 | url: '/bpm/user-group/create', 17 | data: data 18 | }) 19 | } 20 | 21 | // 更新用户组 22 | export const updateUserGroup = async (data: UserGroupVO) => { 23 | return await request.put({ 24 | url: '/bpm/user-group/update', 25 | data: data 26 | }) 27 | } 28 | 29 | // 删除用户组 30 | export const deleteUserGroup = async (id: number) => { 31 | return await request.delete({ url: '/bpm/user-group/delete?id=' + id }) 32 | } 33 | 34 | // 获得用户组 35 | export const getUserGroup = async (id: number) => { 36 | return await request.get({ url: '/bpm/user-group/get?id=' + id }) 37 | } 38 | 39 | // 获得用户组分页 40 | export const getUserGroupPage = async (params) => { 41 | return await request.get({ url: '/bpm/user-group/page', params }) 42 | } 43 | 44 | // 获取用户组精简信息列表 45 | export const getSimpleUserGroupList = async (): Promise => { 46 | return await request.get({ url: '/bpm/user-group/list-all-simple' }) 47 | } 48 | -------------------------------------------------------------------------------- /src/api/design/dic/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | 4 | //获取字典表格选择器配置 5 | export const getDicTableConfig = (tableId, dicConfigStr) => { 6 | return request.post({ 7 | url: `/jeelowcode/dbform/get/dict-table-web-config/${tableId}`, data: { 8 | jeeLowCode_dictTableField: dicConfigStr 9 | } 10 | }) 11 | } 12 | 13 | //获取字典表格选择器值回显文本 14 | export const getDicTableText = (data) => { 15 | return request.post({ url: `/jeelowcode/dbform/get/table-label`, data }) 16 | } 17 | 18 | //获取用户选择器列表数据 19 | export const getUserSelectList = (data) => { 20 | return request.post({ url: `/jeelowcode/adapter/user/list`, data }) 21 | } 22 | 23 | //获取用户选择器的部门列表 24 | export const getUserSelectDeptList = (type) => { 25 | return request.get({ url: `/jeelowcode/adapter/dept/list?type=${type}` }) 26 | } 27 | 28 | //获取用户选择器的角色列表 29 | export const getUserSelectRoleList = () => { 30 | return request.get({ url: `/jeelowcode/adapter/role/list` }) 31 | } -------------------------------------------------------------------------------- /src/api/design/general/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | export const getActionApi = (url, option) => { 4 | return request.get({ url, ...option }) 5 | } 6 | 7 | export const postActionApi = (url, option) => { 8 | return request.post({ url, ...option }) 9 | } 10 | 11 | export const putActionApi = (url, option) => { 12 | return request.put({ url, ...option }) 13 | } 14 | 15 | export const deleteActionApi = (url, option) => { 16 | return request.delete({ url, ...option }) 17 | } 18 | 19 | export const downloadActionApi = (url, option) => { 20 | return request.download({ url, ...option }) 21 | } 22 | 23 | export const uploadActionApi = (url, option) => { 24 | return request.upload({ url, ...option }) 25 | } 26 | 27 | 28 | // 获取历史Js增强/SQL增强/表单设计版本列表 type: desform js sql 29 | export const getHistoryList = (params) => { 30 | return request.get({ url: `/jeelowcode/history/page`, params }) 31 | } 32 | 33 | //获取历史Js增强/SQL增强/表单设计版本详情 34 | export const getHistoryDetail = (params) => { 35 | return request.get({ url: `/jeelowcode/history/getDetail`, params }) 36 | } 37 | 38 | -------------------------------------------------------------------------------- /src/api/design/sys/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | //获取表单设计详情数据 4 | export const clearCache = () => { 5 | return request.get({ url: '/jeelowcode/dbform/clear-cache' }) 6 | } 7 | -------------------------------------------------------------------------------- /src/api/design/table/customButton.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | 4 | //获取自定义按钮列表 5 | export const getBtnList = (params) => { 6 | return request.get({ url: `/jeelowcode/enhance/button/${params.pageSize ? 'page' : 'list'}`, params }) 7 | } 8 | 9 | //新增自定义按钮 10 | export const saveBtnData = (data) => { 11 | return request.post({ url: '/jeelowcode/enhance/button/save', data }) 12 | } 13 | 14 | //修改自定义按钮 15 | export const updateBtnData = (data) => { 16 | return request.put({ url: '/jeelowcode/enhance/button/update', data }) 17 | } 18 | 19 | //获取自定义按钮详情数据 20 | export const getBtnDetail = (id) => { 21 | return request.get({ url: `/jeelowcode/enhance/button/detail?id=${id}` }) 22 | } 23 | 24 | //删除自定义按钮数据 25 | export const deleteBtnData = (ids) => { 26 | return request.delete({ url: `/jeelowcode/enhance/button/delete`, data: ids }) 27 | } 28 | -------------------------------------------------------------------------------- /src/api/design/table/javaEnhance.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | 4 | //获取Java增强列表 5 | export const getJavaList = (params) => { 6 | return request.get({ url: `/jeelowcode/enhance/java/${params.pageSize ? 'page' : 'list'}`, params }) 7 | } 8 | 9 | //新增Java增强 10 | export const saveJavaData = (data) => { 11 | return request.post({ url: '/jeelowcode/enhance/java/save', data }) 12 | } 13 | 14 | //修改Java增强 15 | export const updateJavaData = (data) => { 16 | return request.put({ url: '/jeelowcode/enhance/java/update', data }) 17 | } 18 | 19 | //获取Java增强详情数据 20 | export const getJavaDetail = (id) => { 21 | return request.get({ url: `/jeelowcode/enhance/java/detail?id=${id}` }) 22 | } 23 | 24 | //删除Java增强数据 25 | export const deleteJavaData = (ids) => { 26 | return request.delete({ url: '/jeelowcode/enhance/java/delete', data: ids }) 27 | } 28 | 29 | -------------------------------------------------------------------------------- /src/api/design/table/jsEnhance.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | import { encryptAES } from '@/components/LowDesign/src/utils/aes' 3 | 4 | //新增Js增强 5 | export const saveJsData = (data) => { 6 | data = encryptAES(JSON.stringify(data)) 7 | return request.post({ url: '/jeelowcode/enhance/js/save', data }) 8 | } 9 | 10 | //修改Js增强 11 | export const updateJsData = (data) => { 12 | data = encryptAES(JSON.stringify(data)) 13 | return request.put({ url: '/jeelowcode/enhance/js/update', data }) 14 | } 15 | 16 | //获取Js增强详情数据 17 | export const getJsDetail = (params) => { 18 | return request.get({ url: `/jeelowcode/enhance/js/detail`, params }) 19 | } 20 | 21 | //解除Js增强锁定 22 | export const unlockJs = (dbformId, type) => { 23 | return request.post({ url: `/jeelowcode/enhance/js/unlock/${dbformId}?type=${type}` }) 24 | } 25 | -------------------------------------------------------------------------------- /src/api/design/table/qslEnhance.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | 4 | //获取SQL增强列表 5 | export const getSqlList = (params) => { 6 | return request.get({ url: `/jeelowcode/enhance/sql/${params.pageSize ? 'page' : 'list'}`, params }) 7 | } 8 | 9 | //新增SQL增强 10 | export const saveSqlData = (data) => { 11 | return request.post({ url: '/jeelowcode/enhance/sql/save', data }) 12 | } 13 | 14 | //修改SQL增强 15 | export const updateSqlData = (data) => { 16 | return request.put({ url: '/jeelowcode/enhance/sql/update', data }) 17 | } 18 | 19 | //获取SQL增强详情数据 20 | export const getSqlDetail = (id) => { 21 | return request.get({ url: `/jeelowcode/enhance/sql/detail?id=${id}` }) 22 | } 23 | 24 | //删除SQL增强数据 25 | export const deleteSqlData = (ids) => { 26 | return request.delete({ url: '/jeelowcode/enhance/sql/delete', data: ids }) 27 | } 28 | -------------------------------------------------------------------------------- /src/api/infra/config/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | export interface ConfigVO { 4 | id: number | undefined 5 | category: string 6 | name: string 7 | key: string 8 | value: string 9 | type: number 10 | visible: boolean 11 | remark: string 12 | createTime: Date 13 | } 14 | 15 | // 查询参数列表 16 | export const getConfigPage = (params: PageParam) => { 17 | return request.get({ url: '/infra/config/page', params }) 18 | } 19 | 20 | // 查询参数详情 21 | export const getConfig = (id: number) => { 22 | return request.get({ url: '/infra/config/get?id=' + id }) 23 | } 24 | 25 | // 根据参数键名查询参数值 26 | export const getConfigKey = (configKey: string) => { 27 | return request.get({ url: '/infra/config/get-value-by-key?key=' + configKey }) 28 | } 29 | 30 | // 新增参数 31 | export const createConfig = (data: ConfigVO) => { 32 | return request.post({ url: '/infra/config/create', data }) 33 | } 34 | 35 | // 修改参数 36 | export const updateConfig = (data: ConfigVO) => { 37 | return request.put({ url: '/infra/config/update', data }) 38 | } 39 | 40 | // 删除参数 41 | export const deleteConfig = (id: number) => { 42 | return request.delete({ url: '/infra/config/delete?id=' + id }) 43 | } 44 | 45 | // 导出参数 46 | export const exportConfig = (params) => { 47 | return request.download({ url: '/infra/config/export', params }) 48 | } 49 | -------------------------------------------------------------------------------- /src/api/infra/dataSourceConfig/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | export interface DataSourceConfigVO { 4 | id: number | undefined 5 | name: string 6 | url: string 7 | username: string 8 | password: string 9 | createTime?: Date 10 | } 11 | 12 | // 新增数据源配置 13 | export const createDataSourceConfig = (data: DataSourceConfigVO) => { 14 | return request.post({ url: '/infra/data-source-config/create', data }) 15 | } 16 | 17 | // 修改数据源配置 18 | export const updateDataSourceConfig = (data: DataSourceConfigVO) => { 19 | return request.put({ url: '/infra/data-source-config/update', data }) 20 | } 21 | 22 | // 删除数据源配置 23 | export const deleteDataSourceConfig = (id: number) => { 24 | return request.delete({ url: '/infra/data-source-config/delete?id=' + id }) 25 | } 26 | 27 | // 查询数据源配置详情 28 | export const getDataSourceConfig = (id: number) => { 29 | return request.get({ url: '/infra/data-source-config/get?id=' + id }) 30 | } 31 | 32 | // 查询数据源配置列表 33 | export const getDataSourceConfigList = () => { 34 | return request.get({ url: '/infra/data-source-config/list' }) 35 | } 36 | -------------------------------------------------------------------------------- /src/api/infra/dbDoc/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | // 导出Html 4 | export const exportHtml = () => { 5 | return request.download({ url: '/infra/db-doc/export-html' }) 6 | } 7 | 8 | // 导出Word 9 | export const exportWord = () => { 10 | return request.download({ url: '/infra/db-doc/export-word' }) 11 | } 12 | 13 | // 导出Markdown 14 | export const exportMarkdown = () => { 15 | return request.download({ url: '/infra/db-doc/export-markdown' }) 16 | } 17 | -------------------------------------------------------------------------------- /src/api/infra/file/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | export interface FilePageReqVO extends PageParam { 4 | path?: string 5 | type?: string 6 | createTime?: Date[] 7 | } 8 | 9 | // 文件预签名地址 Response VO 10 | export interface FilePresignedUrlRespVO { 11 | // 文件配置编号 12 | configId: number 13 | // 文件上传 URL 14 | uploadUrl: string 15 | // 文件 URL 16 | url: string 17 | } 18 | 19 | // 查询文件列表 20 | export const getFilePage = (params: FilePageReqVO) => { 21 | return request.get({ url: '/infra/file/page', params }) 22 | } 23 | 24 | // 删除文件 25 | export const deleteFile = (id: number) => { 26 | return request.delete({ url: '/infra/file/delete?id=' + id }) 27 | } 28 | 29 | // 获取文件预签名地址 30 | export const getFilePresignedUrl = (path: string) => { 31 | return request.get({ 32 | url: '/infra/file/presigned-url', 33 | params: { path } 34 | }) 35 | } 36 | 37 | // 创建文件 38 | export const createFile = (data: any) => { 39 | return request.post({ url: '/infra/file/create', data }) 40 | } 41 | 42 | // 上传文件 43 | export const updateFile = (data: any) => { 44 | return request.upload({ url: '/infra/file/upload', data }) 45 | } 46 | 47 | -------------------------------------------------------------------------------- /src/api/infra/jobLog/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | export interface JobLogVO { 4 | id: number 5 | jobId: number 6 | handlerName: string 7 | handlerParam: string 8 | cronExpression: string 9 | executeIndex: string 10 | beginTime: Date 11 | endTime: Date 12 | duration: string 13 | status: number 14 | createTime: string 15 | } 16 | 17 | // 任务日志列表 18 | export const getJobLogPage = (params: PageParam) => { 19 | return request.get({ url: '/infra/job-log/page', params }) 20 | } 21 | 22 | // 任务日志详情 23 | export const getJobLog = (id: number) => { 24 | return request.get({ url: '/infra/job-log/get?id=' + id }) 25 | } 26 | 27 | // 导出定时任务日志 28 | export const exportJobLog = (params) => { 29 | return request.download({ 30 | url: '/infra/job-log/export-excel', 31 | params 32 | }) 33 | } 34 | -------------------------------------------------------------------------------- /src/api/infra/redis/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | /** 4 | * 获取redis 监控信息 5 | */ 6 | export const getCache = () => { 7 | return request.get({ url: '/infra/redis/get-monitor-info' }) 8 | } 9 | -------------------------------------------------------------------------------- /src/api/login/oauth2/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | // 获得授权信息 4 | export const getAuthorize = (clientId: string) => { 5 | return request.get({ url: '/system/oauth2/authorize?clientId=' + clientId }) 6 | } 7 | 8 | // 发起授权 9 | export const authorize = ( 10 | responseType: string, 11 | clientId: string, 12 | redirectUri: string, 13 | state: string, 14 | autoApprove: boolean, 15 | checkedScopes: string[], 16 | uncheckedScopes: string[] 17 | ) => { 18 | // 构建 scopes 19 | const scopes = {} 20 | for (const scope of checkedScopes) { 21 | scopes[scope] = true 22 | } 23 | for (const scope of uncheckedScopes) { 24 | scopes[scope] = false 25 | } 26 | // 发起请求 27 | return request.post({ 28 | url: '/system/oauth2/authorize', 29 | headers: { 30 | 'Content-type': 'application/x-www-form-urlencoded' 31 | }, 32 | params: { 33 | response_type: responseType, 34 | client_id: clientId, 35 | redirect_uri: redirectUri, 36 | state: state, 37 | auto_approve: autoApprove, 38 | scope: JSON.stringify(scopes) 39 | } 40 | }) 41 | } 42 | -------------------------------------------------------------------------------- /src/api/login/types.ts: -------------------------------------------------------------------------------- 1 | export type UserLoginVO = { 2 | username: string 3 | password: string 4 | captchaVerification: string 5 | socialType?: string 6 | socialCode?: string 7 | socialState?: string 8 | } 9 | 10 | export type TokenType = { 11 | id: number // 编号 12 | accessToken: string // 访问令牌 13 | refreshToken: string // 刷新令牌 14 | userId: number // 用户编号 15 | userType: number //用户类型 16 | clientId: string //客户端编号 17 | expiresTime: number //过期时间 18 | } 19 | 20 | export type UserVO = { 21 | id: number 22 | username: string 23 | nickname: string 24 | deptId: number 25 | email: string 26 | mobile: string 27 | sex: number 28 | avatar: string 29 | loginIp: string 30 | loginDate: string 31 | } 32 | -------------------------------------------------------------------------------- /src/api/system/apiLog/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | type LogType = 'info' | 'error' 4 | 5 | // 获取请求日志列表 6 | export const getLogPage = (logType: LogType, params) => { 7 | return request.get({ url: `/jeelowcode/apilog/page`, params: { logType, ...params } }) 8 | } 9 | 10 | // 获取日志详情 11 | export const getLogDetail = (logType: LogType, id: string) => { 12 | return request.get({ url: `/jeelowcode/apilog/detail?logType=${logType}&id=${id}`, }) 13 | } 14 | 15 | // 清除日志记录 16 | export const deleteLog = (logType: LogType, delDate: string) => { 17 | return request.delete({ url: `/jeelowcode/apilog/delete?logType=${logType}&delDate=${delDate}`, }) 18 | } 19 | 20 | -------------------------------------------------------------------------------- /src/api/system/area/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | // 获得地区树 4 | export const getAreaTree = async () => { 5 | return await request.get({ url: '/system/area/tree' }) 6 | } 7 | 8 | // 获得 IP 对应的地区名 9 | export const getAreaByIp = async (ip: string) => { 10 | return await request.get({ url: '/system/area/get-by-ip?ip=' + ip }) 11 | } 12 | -------------------------------------------------------------------------------- /src/api/system/dept/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | export interface DeptVO { 4 | id?: number 5 | name: string 6 | parentId: number 7 | status: number 8 | sort: number 9 | leaderUserId: number 10 | phone: string 11 | email: string 12 | createTime: Date 13 | } 14 | 15 | // 查询部门(精简)列表 16 | export const getSimpleDeptList = async (): Promise => { 17 | return await request.get({ url: '/system/dept/simple-list' }) 18 | } 19 | 20 | // 查询部门列表 21 | export const getDeptPage = async (params: PageParam) => { 22 | return await request.get({ url: '/system/dept/list', params }) 23 | } 24 | 25 | // 查询部门详情 26 | export const getDept = async (id: number) => { 27 | return await request.get({ url: '/system/dept/get?id=' + id }) 28 | } 29 | 30 | // 新增部门 31 | export const createDept = async (data: DeptVO) => { 32 | return await request.post({ url: '/system/dept/create', data: data }) 33 | } 34 | 35 | // 修改部门 36 | export const updateDept = async (params: DeptVO) => { 37 | return await request.put({ url: '/system/dept/update', data: params }) 38 | } 39 | 40 | // 删除部门 41 | export const deleteDept = async (id: number) => { 42 | return await request.delete({ url: '/system/dept/delete?id=' + id }) 43 | } 44 | -------------------------------------------------------------------------------- /src/api/system/dict/dict.data.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | import axios from 'axios' 3 | import { getAccessToken } from '@/utils/auth' 4 | 5 | 6 | export type DictDataVO = { 7 | id: number | undefined 8 | sort: number | undefined 9 | label: string 10 | value: string 11 | dictType: string 12 | status: number 13 | colorType: string 14 | cssClass: string 15 | remark: string 16 | createTime: Date 17 | } 18 | 19 | // 查询字典数据(精简)列表 20 | export const getSimpleDictDataList = () => { 21 | return request.get({ url: '/system/dict-data/simple-list' }) 22 | } 23 | 24 | // 查询字典数据列表 25 | export const getDictDataPage = (params: PageParam) => { 26 | return request.get({ url: '/system/dict-data/page', params }) 27 | } 28 | 29 | // 查询字典数据详情 30 | export const getDictData = (id: number) => { 31 | return request.get({ url: '/system/dict-data/get?id=' + id }) 32 | } 33 | 34 | // 新增字典数据 35 | export const createDictData = (data: DictDataVO) => { 36 | return request.post({ url: '/system/dict-data/create', data }) 37 | } 38 | 39 | // 修改字典数据 40 | export const updateDictData = (data: DictDataVO) => { 41 | return request.put({ url: '/system/dict-data/update', data }) 42 | } 43 | 44 | // 删除字典数据 45 | export const deleteDictData = (id: number) => { 46 | return request.delete({ url: '/system/dict-data/delete?id=' + id }) 47 | } 48 | 49 | // 导出字典类型数据 50 | export const exportDictData = (params) => { 51 | return request.download({ url: '/system/dict-data/export', params }) 52 | } 53 | -------------------------------------------------------------------------------- /src/api/system/dict/dict.type.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | export type DictTypeVO = { 4 | id: number | undefined 5 | name: string 6 | type: string 7 | status: number 8 | remark: string 9 | createTime: Date 10 | } 11 | 12 | // 查询字典(精简)列表 13 | export const getSimpleDictTypeList = () => { 14 | return request.get({ url: '/system/dict-type/list-all-simple' }) 15 | } 16 | 17 | // 查询字典列表 18 | export const getDictTypePage = (params: PageParam) => { 19 | return request.get({ url: '/system/dict-type/page', params }) 20 | } 21 | 22 | // 查询字典详情 23 | export const getDictType = (id: number) => { 24 | return request.get({ url: '/system/dict-type/get?id=' + id }) 25 | } 26 | 27 | // 新增字典 28 | export const createDictType = (data: DictTypeVO) => { 29 | return request.post({ url: '/system/dict-type/create', data }) 30 | } 31 | 32 | // 修改字典 33 | export const updateDictType = (data: DictTypeVO) => { 34 | return request.put({ url: '/system/dict-type/update', data }) 35 | } 36 | 37 | // 删除字典 38 | export const deleteDictType = (id: number) => { 39 | return request.delete({ url: '/system/dict-type/delete?id=' + id }) 40 | } 41 | // 导出字典类型 42 | export const exportDictType = (params) => { 43 | return request.download({ url: '/system/dict-type/export', params }) 44 | } 45 | -------------------------------------------------------------------------------- /src/api/system/errorCode/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | export interface ErrorCodeVO { 4 | id: number | undefined 5 | type: number 6 | applicationName: string 7 | code: number | undefined 8 | message: string 9 | memo: string 10 | createTime: Date 11 | } 12 | 13 | // 查询错误码列表 14 | export const getErrorCodePage = (params: PageParam) => { 15 | return request.get({ url: '/system/error-code/page', params }) 16 | } 17 | 18 | // 查询错误码详情 19 | export const getErrorCode = (id: number) => { 20 | return request.get({ url: '/system/error-code/get?id=' + id }) 21 | } 22 | 23 | // 新增错误码 24 | export const createErrorCode = (data: ErrorCodeVO) => { 25 | return request.post({ url: '/system/error-code/create', data }) 26 | } 27 | 28 | // 修改错误码 29 | export const updateErrorCode = (data: ErrorCodeVO) => { 30 | return request.put({ url: '/system/error-code/update', data }) 31 | } 32 | 33 | // 删除错误码 34 | export const deleteErrorCode = (id: number) => { 35 | return request.delete({ url: '/system/error-code/delete?id=' + id }) 36 | } 37 | // 导出错误码 38 | export const excelErrorCode = (params) => { 39 | return request.download({ url: '/system/error-code/export-excel', params }) 40 | } 41 | -------------------------------------------------------------------------------- /src/api/system/loginLog/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | export interface LoginLogVO { 4 | id: number 5 | logType: number 6 | traceId: number 7 | userId: number 8 | userType: number 9 | username: string 10 | result: number 11 | status: number 12 | userIp: string 13 | userAgent: string 14 | createTime: Date 15 | } 16 | 17 | // 查询登录日志列表 18 | export const getLoginLogPage = (params: PageParam) => { 19 | return request.get({ url: '/system/login-log/page', params }) 20 | } 21 | 22 | // 导出登录日志 23 | export const exportLoginLog = (params) => { 24 | return request.download({ url: '/system/login-log/export', params }) 25 | } 26 | -------------------------------------------------------------------------------- /src/api/system/mail/account/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | export interface MailAccountVO { 4 | id: number 5 | mail: string 6 | username: string 7 | password: string 8 | host: string 9 | port: number 10 | sslEnable: boolean 11 | } 12 | 13 | // 查询邮箱账号列表 14 | export const getMailAccountPage = async (params: PageParam) => { 15 | return await request.get({ url: '/system/mail-account/page', params }) 16 | } 17 | 18 | // 查询邮箱账号详情 19 | export const getMailAccount = async (id: number) => { 20 | return await request.get({ url: '/system/mail-account/get?id=' + id }) 21 | } 22 | 23 | // 新增邮箱账号 24 | export const createMailAccount = async (data: MailAccountVO) => { 25 | return await request.post({ url: '/system/mail-account/create', data }) 26 | } 27 | 28 | // 修改邮箱账号 29 | export const updateMailAccount = async (data: MailAccountVO) => { 30 | return await request.put({ url: '/system/mail-account/update', data }) 31 | } 32 | 33 | // 删除邮箱账号 34 | export const deleteMailAccount = async (id: number) => { 35 | return await request.delete({ url: '/system/mail-account/delete?id=' + id }) 36 | } 37 | 38 | // 获得邮箱账号精简列表 39 | export const getSimpleMailAccountList = async () => { 40 | return request.get({ url: '/system/mail-account/simple-list' }) 41 | } 42 | -------------------------------------------------------------------------------- /src/api/system/mail/log/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | export interface MailLogVO { 4 | id: number 5 | userId: number 6 | userType: number 7 | toMail: string 8 | accountId: number 9 | fromMail: string 10 | templateId: number 11 | templateCode: string 12 | templateNickname: string 13 | templateTitle: string 14 | templateContent: string 15 | templateParams: string 16 | sendStatus: number 17 | sendTime: Date 18 | sendMessageId: string 19 | sendException: string 20 | } 21 | 22 | // 查询邮件日志列表 23 | export const getMailLogPage = async (params: PageParam) => { 24 | return await request.get({ url: '/system/mail-log/page', params }) 25 | } 26 | 27 | // 查询邮件日志详情 28 | export const getMailLog = async (id: number) => { 29 | return await request.get({ url: '/system/mail-log/get?id=' + id }) 30 | } 31 | -------------------------------------------------------------------------------- /src/api/system/mail/template/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | export interface MailTemplateVO { 4 | id: number 5 | name: string 6 | code: string 7 | accountId: number 8 | nickname: string 9 | title: string 10 | content: string 11 | params: string 12 | status: number 13 | remark: string 14 | } 15 | 16 | export interface MailSendReqVO { 17 | mail: string 18 | templateCode: string 19 | templateParams: Map 20 | } 21 | 22 | // 查询邮件模版列表 23 | export const getMailTemplatePage = async (params: PageParam) => { 24 | return await request.get({ url: '/system/mail-template/page', params }) 25 | } 26 | 27 | // 查询邮件模版详情 28 | export const getMailTemplate = async (id: number) => { 29 | return await request.get({ url: '/system/mail-template/get?id=' + id }) 30 | } 31 | 32 | // 新增邮件模版 33 | export const createMailTemplate = async (data: MailTemplateVO) => { 34 | return await request.post({ url: '/system/mail-template/create', data }) 35 | } 36 | 37 | // 修改邮件模版 38 | export const updateMailTemplate = async (data: MailTemplateVO) => { 39 | return await request.put({ url: '/system/mail-template/update', data }) 40 | } 41 | 42 | // 删除邮件模版 43 | export const deleteMailTemplate = async (id: number) => { 44 | return await request.delete({ url: '/system/mail-template/delete?id=' + id }) 45 | } 46 | 47 | // 发送邮件 48 | export const sendMail = (data: MailSendReqVO) => { 49 | return request.post({ url: '/system/mail-template/send-mail', data }) 50 | } 51 | -------------------------------------------------------------------------------- /src/api/system/menu/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | export interface MenuVO { 4 | id: number 5 | name: string 6 | permission: string 7 | type: number 8 | sort: number 9 | parentId: number 10 | path: string 11 | icon: string 12 | component: string 13 | componentName?: string 14 | status: number 15 | visible: boolean 16 | keepAlive: boolean 17 | alwaysShow?: boolean 18 | createTime: Date 19 | } 20 | 21 | // 查询菜单(精简)列表 22 | export const getSimpleMenusList = () => { 23 | return request.get({ url: '/system/menu/simple-list' }) 24 | } 25 | 26 | // 查询菜单列表 27 | export const getMenuList = (params) => { 28 | return request.get({ url: '/system/menu/list', params }) 29 | } 30 | 31 | // 获取菜单详情 32 | export const getMenu = (id: number) => { 33 | return request.get({ url: '/system/menu/get?id=' + id }) 34 | } 35 | 36 | // 新增菜单 37 | export const createMenu = (data: MenuVO) => { 38 | return request.post({ url: '/system/menu/create', data }) 39 | } 40 | 41 | //批量新增菜单 42 | export const batchCreateMenu = (data: Array) => { 43 | return request.post({ url: '/system/menu/batch/create', data }) 44 | } 45 | 46 | // 修改菜单 47 | export const updateMenu = (data: MenuVO) => { 48 | return request.put({ url: '/system/menu/update', data }) 49 | } 50 | 51 | // 删除菜单 52 | export const deleteMenu = (id: number, type?: number) => { 53 | return request.delete({ url: '/system/menu/delete', params: { id, type } }) 54 | } 55 | -------------------------------------------------------------------------------- /src/api/system/notice/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | export interface NoticeVO { 4 | id: number | undefined 5 | title: string 6 | type: number 7 | content: string 8 | status: number 9 | remark: string 10 | creator: string 11 | createTime: Date 12 | } 13 | 14 | // 查询公告列表 15 | export const getNoticePage = (params: PageParam) => { 16 | return request.get({ url: '/system/notice/page', params }) 17 | } 18 | 19 | // 查询公告详情 20 | export const getNotice = (id: number) => { 21 | return request.get({ url: '/system/notice/get?id=' + id }) 22 | } 23 | 24 | // 新增公告 25 | export const createNotice = (data: NoticeVO) => { 26 | return request.post({ url: '/system/notice/create', data }) 27 | } 28 | 29 | // 修改公告 30 | export const updateNotice = (data: NoticeVO) => { 31 | return request.put({ url: '/system/notice/update', data }) 32 | } 33 | 34 | // 删除公告 35 | export const deleteNotice = (id: number) => { 36 | return request.delete({ url: '/system/notice/delete?id=' + id }) 37 | } 38 | 39 | // 推送公告 40 | export const pushNotice = (id: number) => { 41 | return request.post({ url: '/system/notice/push?id=' + id }) 42 | } 43 | -------------------------------------------------------------------------------- /src/api/system/oauth2/client.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | export interface OAuth2ClientVO { 4 | id: number 5 | clientId: string 6 | secret: string 7 | name: string 8 | logo: string 9 | description: string 10 | status: number 11 | accessTokenValiditySeconds: number 12 | refreshTokenValiditySeconds: number 13 | redirectUris: string[] 14 | autoApprove: boolean 15 | authorizedGrantTypes: string[] 16 | scopes: string[] 17 | authorities: string[] 18 | resourceIds: string[] 19 | additionalInformation: string 20 | isAdditionalInformationJson: boolean 21 | createTime: Date 22 | } 23 | 24 | // 查询 OAuth2 客户端的列表 25 | export const getOAuth2ClientPage = (params: PageParam) => { 26 | return request.get({ url: '/system/oauth2-client/page', params }) 27 | } 28 | 29 | // 查询 OAuth2 客户端的详情 30 | export const getOAuth2Client = (id: number) => { 31 | return request.get({ url: '/system/oauth2-client/get?id=' + id }) 32 | } 33 | 34 | // 新增 OAuth2 客户端 35 | export const createOAuth2Client = (data: OAuth2ClientVO) => { 36 | return request.post({ url: '/system/oauth2-client/create', data }) 37 | } 38 | 39 | // 修改 OAuth2 客户端 40 | export const updateOAuth2Client = (data: OAuth2ClientVO) => { 41 | return request.put({ url: '/system/oauth2-client/update', data }) 42 | } 43 | 44 | // 删除 OAuth2 45 | export const deleteOAuth2Client = (id: number) => { 46 | return request.delete({ url: '/system/oauth2-client/delete?id=' + id }) 47 | } 48 | -------------------------------------------------------------------------------- /src/api/system/oauth2/token.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | export interface OAuth2TokenVO { 4 | id: number 5 | accessToken: string 6 | refreshToken: string 7 | userId: number 8 | userType: number 9 | clientId: string 10 | createTime: Date 11 | expiresTime: Date 12 | } 13 | 14 | // 查询 token列表 15 | export const getAccessTokenPage = (params: PageParam) => { 16 | return request.get({ url: '/system/oauth2-token/page', params }) 17 | } 18 | 19 | // 删除 token 20 | export const deleteAccessToken = (accessToken: string) => { 21 | return request.delete({ url: '/system/oauth2-token/delete?accessToken=' + accessToken }) 22 | } 23 | -------------------------------------------------------------------------------- /src/api/system/operatelog/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | export type OperateLogVO = { 4 | id: number 5 | userNickname: string 6 | traceId: string 7 | userId: number 8 | module: string 9 | name: string 10 | type: number 11 | content: string 12 | exts: Map 13 | requestMethod: string 14 | requestUrl: string 15 | userIp: string 16 | userAgent: string 17 | javaMethod: string 18 | javaMethodArgs: string 19 | startTime: Date 20 | duration: number 21 | resultCode: number 22 | resultMsg: string 23 | resultData: string 24 | } 25 | 26 | export type OperateLogV2VO = { 27 | id: number 28 | userNickname: string 29 | traceId: string 30 | userType: number 31 | userId: number 32 | userName: string 33 | type: string 34 | subType: string 35 | bizId: number 36 | action: string 37 | extra: string 38 | requestMethod: string 39 | requestUrl: string 40 | userIp: string 41 | userAgent: string 42 | creator: string 43 | creatorName: string 44 | createTime: Date 45 | // 数据扩展,渲染时使用 46 | title: string // 操作标题(如果为空则取 name 值) 47 | colSize: number // 变更记录行数 48 | contentStrList: string[] 49 | tagsContentList: string[] 50 | } 51 | 52 | // 查询操作日志列表 53 | export const getOperateLogPage = (params: PageParam) => { 54 | return request.get({ url: '/system/operate-log/page', params }) 55 | } 56 | // 导出操作日志 57 | export const exportOperateLog = (params) => { 58 | return request.download({ url: '/system/operate-log/export', params }) 59 | } 60 | -------------------------------------------------------------------------------- /src/api/system/permission/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | export interface PermissionAssignUserRoleReqVO { 4 | userId: number 5 | roleIds: number[] 6 | } 7 | 8 | export interface PermissionAssignRoleMenuReqVO { 9 | roleId: number 10 | menuIds: number[] 11 | } 12 | 13 | export interface PermissionAssignRoleDataScopeReqVO { 14 | roleId: number 15 | dataScope: number 16 | dataScopeDeptIds: number[] 17 | } 18 | 19 | // 查询角色拥有的菜单权限 20 | export const getRoleMenuList = async (roleId: number) => { 21 | return await request.get({ url: '/system/permission/list-role-menus?roleId=' + roleId }) 22 | } 23 | 24 | // 赋予角色菜单权限 25 | export const assignRoleMenu = async (data: PermissionAssignRoleMenuReqVO) => { 26 | return await request.post({ url: '/system/permission/assign-role-menu', data }) 27 | } 28 | 29 | // 赋予角色数据权限 30 | export const assignRoleDataScope = async (data: PermissionAssignRoleDataScopeReqVO) => { 31 | return await request.post({ url: '/system/permission/assign-role-data-scope', data }) 32 | } 33 | 34 | // 查询用户拥有的角色数组 35 | export const getUserRoleList = async (userId: number) => { 36 | return await request.get({ url: '/system/permission/list-user-roles?userId=' + userId }) 37 | } 38 | 39 | // 赋予用户角色 40 | export const assignUserRole = async (data: PermissionAssignUserRoleReqVO) => { 41 | return await request.post({ url: '/system/permission/assign-user-role', data }) 42 | } 43 | -------------------------------------------------------------------------------- /src/api/system/post/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | export interface PostVO { 4 | id?: number 5 | name: string 6 | code: string 7 | sort: number 8 | status: number 9 | remark: string 10 | createTime?: Date 11 | } 12 | 13 | // 查询岗位列表 14 | export const getPostPage = async (params: PageParam) => { 15 | return await request.get({ url: '/system/post/page', params }) 16 | } 17 | 18 | // 获取岗位精简信息列表 19 | export const getSimplePostList = async (): Promise => { 20 | return await request.get({ url: '/system/post/simple-list' }) 21 | } 22 | 23 | // 查询岗位详情 24 | export const getPost = async (id: number) => { 25 | return await request.get({ url: '/system/post/get?id=' + id }) 26 | } 27 | 28 | // 新增岗位 29 | export const createPost = async (data: PostVO) => { 30 | return await request.post({ url: '/system/post/create', data }) 31 | } 32 | 33 | // 修改岗位 34 | export const updatePost = async (data: PostVO) => { 35 | return await request.put({ url: '/system/post/update', data }) 36 | } 37 | 38 | // 删除岗位 39 | export const deletePost = async (id: number) => { 40 | return await request.delete({ url: '/system/post/delete?id=' + id }) 41 | } 42 | 43 | // 导出岗位 44 | export const exportPost = async (params) => { 45 | return await request.download({ url: '/system/post/export', params }) 46 | } 47 | -------------------------------------------------------------------------------- /src/api/system/sms/smsChannel/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | export interface SmsChannelVO { 4 | id: number 5 | code: string 6 | status: number 7 | signature: string 8 | remark: string 9 | apiKey: string 10 | apiSecret: string 11 | callbackUrl: string 12 | createTime: Date 13 | } 14 | 15 | // 查询短信渠道列表 16 | export const getSmsChannelPage = (params: PageParam) => { 17 | return request.get({ url: '/system/sms-channel/page', params }) 18 | } 19 | 20 | // 获得短信渠道精简列表 21 | export function getSimpleSmsChannelList() { 22 | return request.get({ url: '/system/sms-channel/simple-list' }) 23 | } 24 | 25 | // 查询短信渠道详情 26 | export const getSmsChannel = (id: number) => { 27 | return request.get({ url: '/system/sms-channel/get?id=' + id }) 28 | } 29 | 30 | // 新增短信渠道 31 | export const createSmsChannel = (data: SmsChannelVO) => { 32 | return request.post({ url: '/system/sms-channel/create', data }) 33 | } 34 | 35 | // 修改短信渠道 36 | export const updateSmsChannel = (data: SmsChannelVO) => { 37 | return request.put({ url: '/system/sms-channel/update', data }) 38 | } 39 | 40 | // 删除短信渠道 41 | export const deleteSmsChannel = (id: number) => { 42 | return request.delete({ url: '/system/sms-channel/delete?id=' + id }) 43 | } 44 | -------------------------------------------------------------------------------- /src/api/system/sms/smsLog/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | export interface SmsLogVO { 4 | id: number | null 5 | channelId: number | null 6 | channelCode: string 7 | templateId: number | null 8 | templateCode: string 9 | templateType: number | null 10 | templateContent: string 11 | templateParams: Map | null 12 | apiTemplateId: string 13 | mobile: string 14 | userId: number | null 15 | userType: number | null 16 | sendStatus: number | null 17 | sendTime: Date | null 18 | apiSendCode: string 19 | apiSendMsg: string 20 | apiRequestId: string 21 | apiSerialNo: string 22 | receiveStatus: number | null 23 | receiveTime: Date | null 24 | apiReceiveCode: string 25 | apiReceiveMsg: string 26 | createTime: Date | null 27 | } 28 | 29 | // 查询短信日志列表 30 | export const getSmsLogPage = (params: PageParam) => { 31 | return request.get({ url: '/system/sms-log/page', params }) 32 | } 33 | 34 | // 导出短信日志 35 | export const exportSmsLog = (params) => { 36 | return request.download({ url: '/system/sms-log/export-excel', params }) 37 | } 38 | -------------------------------------------------------------------------------- /src/api/system/social/client/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | export interface SocialClientVO { 4 | id: number 5 | name: string 6 | socialType: number 7 | userType: number 8 | clientId: string 9 | clientSecret: string 10 | agentId: string 11 | status: number 12 | } 13 | 14 | // 查询社交客户端列表 15 | export const getSocialClientPage = async (params) => { 16 | return await request.get({ url: `/system/social-client/page`, params }) 17 | } 18 | 19 | // 查询社交客户端详情 20 | export const getSocialClient = async (id: number) => { 21 | return await request.get({ url: `/system/social-client/get?id=` + id }) 22 | } 23 | 24 | // 新增社交客户端 25 | export const createSocialClient = async (data: SocialClientVO) => { 26 | return await request.post({ url: `/system/social-client/create`, data }) 27 | } 28 | 29 | // 修改社交客户端 30 | export const updateSocialClient = async (data: SocialClientVO) => { 31 | return await request.put({ url: `/system/social-client/update`, data }) 32 | } 33 | 34 | // 删除社交客户端 35 | export const deleteSocialClient = async (id: number) => { 36 | return await request.delete({ url: `/system/social-client/delete?id=` + id }) 37 | } 38 | -------------------------------------------------------------------------------- /src/api/system/social/user/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | export interface SocialUserVO { 4 | id: number 5 | type: number 6 | openid: string 7 | token: string 8 | rawTokenInfo: string 9 | nickname: string 10 | avatar: string 11 | rawUserInfo: string 12 | code: string 13 | state: string 14 | } 15 | 16 | // 查询社交用户列表 17 | export const getSocialUserPage = async (params) => { 18 | return await request.get({ url: `/system/social-user/page`, params }) 19 | } 20 | 21 | // 查询社交用户详情 22 | export const getSocialUser = async (id: number) => { 23 | return await request.get({ url: `/system/social-user/get?id=` + id }) 24 | } 25 | -------------------------------------------------------------------------------- /src/api/system/tenantPackage/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | export interface TenantPackageVO { 4 | id: number 5 | name: string 6 | status: number 7 | remark: string 8 | creator: string 9 | updater: string 10 | updateTime: string 11 | menuIds: number[] 12 | createTime: Date 13 | } 14 | 15 | // 查询租户套餐列表 16 | export const getTenantPackagePage = (params: PageParam) => { 17 | return request.get({ url: '/system/tenant-package/page', params }) 18 | } 19 | 20 | // 获得租户 21 | export const getTenantPackage = (id: number) => { 22 | return request.get({ url: '/system/tenant-package/get?id=' + id }) 23 | } 24 | 25 | // 新增租户套餐 26 | export const createTenantPackage = (data: TenantPackageVO) => { 27 | return request.post({ url: '/system/tenant-package/create', data }) 28 | } 29 | 30 | // 修改租户套餐 31 | export const updateTenantPackage = (data: TenantPackageVO) => { 32 | return request.put({ url: '/system/tenant-package/update', data }) 33 | } 34 | 35 | // 删除租户套餐 36 | export const deleteTenantPackage = (id: number) => { 37 | return request.delete({ url: '/system/tenant-package/delete?id=' + id }) 38 | } 39 | // 获取租户套餐精简信息列表 40 | export const getTenantPackageList = () => { 41 | return request.get({ url: '/system/tenant-package/simple-list' }) 42 | } 43 | -------------------------------------------------------------------------------- /src/api/system/user/socialUser.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | // 社交绑定,使用 code 授权码 4 | export const socialBind = (type, code, state) => { 5 | return request.post({ 6 | url: '/system/social-user/bind', 7 | data: { 8 | type, 9 | code, 10 | state 11 | } 12 | }) 13 | } 14 | 15 | // 取消社交绑定 16 | export const socialUnbind = (type, openid) => { 17 | return request.delete({ 18 | url: '/system/social-user/unbind', 19 | data: { 20 | type, 21 | openid 22 | } 23 | }) 24 | } 25 | 26 | // 社交授权的跳转 27 | export const socialAuthRedirect = (type, redirectUri) => { 28 | return request.get({ 29 | url: '/system/auth/social-auth-redirect?type=' + type + '&redirectUri=' + redirectUri 30 | }) 31 | } 32 | -------------------------------------------------------------------------------- /src/assets/imgs/avatar.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/src/assets/imgs/avatar.gif -------------------------------------------------------------------------------- /src/assets/imgs/avatar.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/src/assets/imgs/avatar.jpg -------------------------------------------------------------------------------- /src/assets/imgs/default_image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/src/assets/imgs/default_image.png -------------------------------------------------------------------------------- /src/assets/imgs/khgl.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/imgs/login/login_right_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/src/assets/imgs/login/login_right_bg.png -------------------------------------------------------------------------------- /src/assets/imgs/login/login_right_bg_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/src/assets/imgs/login/login_right_bg_1.png -------------------------------------------------------------------------------- /src/assets/imgs/login/login_right_bg_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/src/assets/imgs/login/login_right_bg_2.png -------------------------------------------------------------------------------- /src/assets/imgs/login/login_sutra_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/src/assets/imgs/login/login_sutra_1.png -------------------------------------------------------------------------------- /src/assets/imgs/login/login_sutra_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/src/assets/imgs/login/login_sutra_2.png -------------------------------------------------------------------------------- /src/assets/imgs/login/login_text.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/src/assets/imgs/login/login_text.png -------------------------------------------------------------------------------- /src/assets/imgs/loginBj.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/src/assets/imgs/loginBj.png -------------------------------------------------------------------------------- /src/assets/imgs/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/src/assets/imgs/logo.png -------------------------------------------------------------------------------- /src/assets/imgs/logo_min.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/src/assets/imgs/logo_min.png -------------------------------------------------------------------------------- /src/assets/imgs/logo_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/src/assets/imgs/logo_white.png -------------------------------------------------------------------------------- /src/assets/imgs/profile.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/src/assets/imgs/profile.jpg -------------------------------------------------------------------------------- /src/assets/imgs/tb1.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/imgs/tb4.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/imgs/wechat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeelowcode/jeelowcode-ui-admin-vue3/e602ee13727944e5de46edc14d03966303de0c32/src/assets/imgs/wechat.png -------------------------------------------------------------------------------- /src/assets/svgs/bottom.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/assets/svgs/gitee/JeeLowCode-1.0.0-red.svg: -------------------------------------------------------------------------------- 1 | JeeLowCode: 1.0.0JeeLowCode1.0.0 -------------------------------------------------------------------------------- /src/assets/svgs/gitee/Spring Boot-2.7.18-yellow.svg: -------------------------------------------------------------------------------- 1 | Spring Boot: 2.7.18Spring Boot2.7.18 -------------------------------------------------------------------------------- /src/assets/svgs/gitee/Vue-3.2-blue.svg: -------------------------------------------------------------------------------- 1 | Vue: 3.2Vue3.2 -------------------------------------------------------------------------------- /src/assets/svgs/gitee/commercial_free.svg: -------------------------------------------------------------------------------- 1 | 可商用: 免费可商用免费 -------------------------------------------------------------------------------- /src/assets/svgs/gitee/license-Apache 2.0-green.svg: -------------------------------------------------------------------------------- 1 | license: Apache 2.0licenseApache 2.0 -------------------------------------------------------------------------------- /src/assets/svgs/pay/icon/alipay_pc.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/svgs/pay/icon/alipay_wap.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/svgs/pay/icon/mock.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/svgs/pay/icon/wx_lite.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/svgs/top.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/components/Backtop/index.ts: -------------------------------------------------------------------------------- 1 | import Backtop from './src/Backtop.vue' 2 | 3 | export { Backtop } 4 | -------------------------------------------------------------------------------- /src/components/Backtop/src/Backtop.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 18 | -------------------------------------------------------------------------------- /src/components/ConfigGlobal/index.ts: -------------------------------------------------------------------------------- 1 | import ConfigGlobal from './src/ConfigGlobal.vue' 2 | 3 | export { ConfigGlobal } 4 | -------------------------------------------------------------------------------- /src/components/ContentWrap/index.ts: -------------------------------------------------------------------------------- 1 | import ContentWrap from './src/ContentWrap.vue' 2 | 3 | export { ContentWrap } 4 | -------------------------------------------------------------------------------- /src/components/ContentWrap/src/ContentWrap.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 35 | -------------------------------------------------------------------------------- /src/components/CountTo/index.ts: -------------------------------------------------------------------------------- 1 | import CountTo from './src/CountTo.vue' 2 | 3 | export { CountTo } 4 | -------------------------------------------------------------------------------- /src/components/Crontab/index.ts: -------------------------------------------------------------------------------- 1 | import Crontab from './src/Crontab.vue' 2 | export { Crontab } 3 | -------------------------------------------------------------------------------- /src/components/Cropper/index.ts: -------------------------------------------------------------------------------- 1 | import CropperImage from './src/Cropper.vue' 2 | import CropperAvatar from './src/CropperAvatar.vue' 3 | 4 | export { CropperImage, CropperAvatar } 5 | -------------------------------------------------------------------------------- /src/components/Cropper/src/types.ts: -------------------------------------------------------------------------------- 1 | import type Cropper from 'cropperjs' 2 | 3 | export interface CropendResult { 4 | imgBase64: string 5 | imgInfo: Cropper.Data 6 | } 7 | 8 | export type { Cropper } 9 | -------------------------------------------------------------------------------- /src/components/Dialog/index.ts: -------------------------------------------------------------------------------- 1 | import Dialog from './src/Dialog.vue' 2 | 3 | export { Dialog } 4 | -------------------------------------------------------------------------------- /src/components/DictTag/index.ts: -------------------------------------------------------------------------------- 1 | import DictTag from './src/DictTag.vue' 2 | 3 | export { DictTag } 4 | -------------------------------------------------------------------------------- /src/components/Echart/index.ts: -------------------------------------------------------------------------------- 1 | import Echart from './src/Echart.vue' 2 | 3 | export { Echart } 4 | -------------------------------------------------------------------------------- /src/components/Error/index.ts: -------------------------------------------------------------------------------- 1 | import Error from './src/Error.vue' 2 | 3 | export { Error } 4 | -------------------------------------------------------------------------------- /src/components/Highlight/index.ts: -------------------------------------------------------------------------------- 1 | import Highlight from './src/Highlight.vue' 2 | 3 | export { Highlight } 4 | -------------------------------------------------------------------------------- /src/components/IFrame/index.ts: -------------------------------------------------------------------------------- 1 | import IFrame from './src/IFrame.vue' 2 | 3 | export { IFrame } 4 | -------------------------------------------------------------------------------- /src/components/IFrame/src/IFrame.vue: -------------------------------------------------------------------------------- 1 | 30 | 48 | -------------------------------------------------------------------------------- /src/components/Icon/index.ts: -------------------------------------------------------------------------------- 1 | import Icon from './src/Icon.vue' 2 | import IconSelect from './src/IconSelect.vue' 3 | 4 | export { Icon, IconSelect } 5 | -------------------------------------------------------------------------------- /src/components/ImageViewer/index.ts: -------------------------------------------------------------------------------- 1 | import ImageViewer from './src/ImageViewer.vue' 2 | import { isClient } from '@/utils/is' 3 | import { createVNode, render, VNode } from 'vue' 4 | import { ImageViewerProps } from './src/types' 5 | 6 | let instance: Nullable = null 7 | 8 | export function createImageViewer(options: ImageViewerProps) { 9 | if (!isClient) return 10 | const { 11 | urlList, 12 | initialIndex = 0, 13 | infinite = true, 14 | hideOnClickModal = false, 15 | appendToBody = false, 16 | zIndex = 2000, 17 | show = true 18 | } = options 19 | 20 | const propsData: Partial = {} 21 | const container = document.createElement('div') 22 | propsData.urlList = urlList 23 | propsData.initialIndex = initialIndex 24 | propsData.infinite = infinite 25 | propsData.hideOnClickModal = hideOnClickModal 26 | propsData.appendToBody = appendToBody 27 | propsData.zIndex = zIndex 28 | propsData.show = show 29 | 30 | document.body.appendChild(container) 31 | instance = createVNode(ImageViewer, propsData) 32 | render(instance, container) 33 | } 34 | -------------------------------------------------------------------------------- /src/components/ImageViewer/src/ImageViewer.vue: -------------------------------------------------------------------------------- 1 | 32 | 33 | 36 | -------------------------------------------------------------------------------- /src/components/ImageViewer/src/types.ts: -------------------------------------------------------------------------------- 1 | export interface ImageViewerProps { 2 | urlList?: string[] 3 | zIndex?: number 4 | initialIndex?: number 5 | infinite?: boolean 6 | hideOnClickModal?: boolean 7 | appendToBody?: boolean 8 | show?: boolean 9 | } 10 | -------------------------------------------------------------------------------- /src/components/Infotip/index.ts: -------------------------------------------------------------------------------- 1 | import Infotip from './src/Infotip.vue' 2 | 3 | export { Infotip } 4 | -------------------------------------------------------------------------------- /src/components/InputPassword/index.ts: -------------------------------------------------------------------------------- 1 | import InputPassword from './src/InputPassword.vue' 2 | 3 | export { InputPassword } 4 | -------------------------------------------------------------------------------- /src/components/LowDesign/index.ts: -------------------------------------------------------------------------------- 1 | 2 | import DesignPopup from './src/DesignPopup.vue'; 3 | import LowForm from './src/LowForm/index.vue'; 4 | import LowTable from './src/LowTable/index.vue'; 5 | import LowReport from './src/LowReport/index.vue'; 6 | 7 | import FormView from './src/FormView.vue'; 8 | import TableView from './src/TableView.vue'; 9 | import ControlView from './src/ControlView.vue'; 10 | import TabsView from './src/TabsView.vue'; 11 | 12 | 13 | export { DesignPopup, LowForm, LowTable, LowReport, FormView, TableView, ControlView, TabsView } 14 | -------------------------------------------------------------------------------- /src/components/LowDesign/src/LowForm/components/CustomTest.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /src/components/LowDesign/src/LowForm/components/index.ts: -------------------------------------------------------------------------------- 1 | import ButtonList from './ButtonList.vue'; 2 | import FormTable from './FormTable.vue'; 3 | import FormTabs from './FormTabs.vue'; 4 | 5 | export { ButtonList,FormTable,FormTabs } -------------------------------------------------------------------------------- /src/components/LowDesign/src/LowTable/components/index.ts: -------------------------------------------------------------------------------- 1 | import SubTable from './SubTable.vue'; 2 | import SubForm from './SubForm.vue'; 3 | import TableButton from './TableButton.vue'; 4 | import TableCellUpload from './TableCellUpload.vue'; 5 | import ImportData from './import/importData.vue'; 6 | import SummaryTop from './SummaryTop.vue'; 7 | import InlineSearch from './InlineSearch.vue'; 8 | 9 | export { SubTable, SubForm, TableButton, TableCellUpload, ImportData, SummaryTop, InlineSearch } -------------------------------------------------------------------------------- /src/components/LowDesign/src/controlPath.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | FormView: { 3 | path: 'components/LowDesign/src/FormView.vue', 4 | name: '表单设计控件' 5 | }, 6 | TableView: { 7 | path: 'components/LowDesign/src/TableView.vue', 8 | name: '表单开发控件' 9 | }, 10 | ControlView: { 11 | path: 'components/LowDesign/src/ControlView.vue', 12 | name: '自定义控件' 13 | }, 14 | TabsView: { 15 | path: 'components/LowDesign/src/TabsView.vue', 16 | name: '标签页控件' 17 | }, 18 | } -------------------------------------------------------------------------------- /src/components/LowDesign/src/shareControl/index.ts: -------------------------------------------------------------------------------- 1 | import UserSelect from './UserSelect.vue'; 2 | import DeptSelect from './DeptSelect.vue'; 3 | import DicTableSelect from './DicTableSelect.vue'; 4 | import IconSelectInput from './IconSelectInput.vue'; 5 | import InputNumberRange from './InputNumberRange.vue'; 6 | import MarkDown from './MarkDown.vue'; 7 | import AvueSlot from './AvueSlot.vue'; 8 | 9 | export { UserSelect, DeptSelect, DicTableSelect, IconSelectInput, InputNumberRange, MarkDown, AvueSlot } -------------------------------------------------------------------------------- /src/components/LowDesign/src/types/designPopup.ts: -------------------------------------------------------------------------------- 1 | export interface BtnList { 2 | name: string 3 | params?: Record 4 | prop?: string 5 | display?: boolean 6 | loading?: boolean 7 | icon?: string 8 | clickFun: (loading: Function) => void 9 | } 10 | export interface designPopup { 11 | title?: string 12 | width?: string | number 13 | controlType?: 'dialog' | 'drawer' 14 | fullscreen?: boolean 15 | showFull?: boolean 16 | isBodyFull?: boolean 17 | isFooter?: boolean 18 | isHeader?: boolean 19 | headerBtn?: BtnList[] 20 | footerBtn?: BtnList[] 21 | handleClose?: (done: () => void) => void 22 | dialogParams?: object 23 | } -------------------------------------------------------------------------------- /src/components/LowDesign/src/utils/aes.ts: -------------------------------------------------------------------------------- 1 | import CryptoJS from 'crypto-js' 2 | 3 | const aesKey = 'O2BEeIv399qHQNhD6aGW8R8DEj4bqHXm' 4 | export const encryptAES = (data, key = aesKey) => { 5 | const dataBytes = CryptoJS.enc.Utf8.parse(data); 6 | const keyBytes = CryptoJS.enc.Utf8.parse(key); 7 | const encrypted = CryptoJS.AES.encrypt(dataBytes, keyBytes, { 8 | iv: keyBytes, 9 | mode: CryptoJS.mode.CBC, 10 | padding: CryptoJS.pad.Pkcs7 11 | }); 12 | return CryptoJS.enc.Base64.stringify(encrypted.ciphertext); 13 | } 14 | 15 | export const decryptAES = (data, key = aesKey) => { 16 | const keyBytes = CryptoJS.enc.Utf8.parse(key); 17 | const decrypted = CryptoJS.AES.decrypt(data, keyBytes, { 18 | iv: keyBytes, 19 | mode: CryptoJS.mode.CBC, 20 | padding: CryptoJS.pad.Pkcs7 21 | }); 22 | return CryptoJS.enc.Utf8.stringify(decrypted); 23 | } 24 | -------------------------------------------------------------------------------- /src/components/LowDesign/src/utils/defaultUseUtil.ts: -------------------------------------------------------------------------------- 1 | import { callApiFun } from './util' 2 | import { importFile } from './registerComponent' 3 | import { cloneDeep } from 'lodash-es' 4 | import { listToTree } from '@/utils/tree'; 5 | import { formatDate, formatPast, betweenDay } from '@/utils/formatTime' 6 | import { encryptAES, decryptAES } from '@/components/LowDesign/src/utils/aes' 7 | import { useUserStoreWithOut } from '@/store/modules/user' 8 | 9 | 10 | export default { 11 | /** 12 | * 接口调用 13 | * @param Method 'get' | 'post' | 'put' | 'delete' 请求方式 14 | * @param url 请求地址 15 | * @param options 请求配置 如:{ params:{ text:'测试' } } 16 | */ 17 | requestApi: (Method, url, options) => callApiFun(Method, url, options), 18 | cloneDeep, //深拷贝 19 | listToTree,//列表转树结构 20 | formatDate,//时间格式化 21 | formatPast,//将时间转换为 `几秒前`、`几分钟前`、`几小时前`、`几天前` 22 | betweenDay,//计算两个日期间隔天数 23 | encryptAES,//aes加密 24 | decryptAES,//aes解密 25 | useUserStoreWithOut, //用户信息 26 | dynamicImport: async (path) => { //动态导入模块 27 | const file = importFile(path) 28 | if (file) { 29 | const module = await file() 30 | return module 31 | } 32 | return file 33 | }, 34 | } -------------------------------------------------------------------------------- /src/components/LowFormDesign/components/DesignConfig/components/config/LayoutGroup.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /src/components/LowFormDesign/components/DesignConfig/components/config/RegionSelect.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /src/components/LowFormDesign/components/DesignConfig/components/config/Slider.vue: -------------------------------------------------------------------------------- 1 | 24 | 25 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /src/components/LowFormDesign/components/DesignConfig/components/config/index.ts: -------------------------------------------------------------------------------- 1 | import type { DefineComponent } from 'vue'; 2 | interface ComponentModule { 3 | default: DefineComponent<{}, {}, any>; 4 | } 5 | const modules = import.meta.glob('./*.vue', { eager: true }); 6 | const componentData = Object.entries(modules).reduce((acc, [path, module]) => { 7 | const fileName = path.replace(/^\.\/(.*)\.vue$/, '$1'); 8 | const componentName = `Config${fileName.replace(/(?:^|\.?)([A-Z])/g, (x, y) => y.toUpperCase())}`; 9 | acc[componentName] = module.default; 10 | return acc; 11 | }, {} as Record>); 12 | export default componentData -------------------------------------------------------------------------------- /src/components/LowFormDesign/components/DesignConfig/components/index.ts: -------------------------------------------------------------------------------- 1 | import ControlConfig from './ControlConfig.vue'; 2 | import FormConfig from './FormConfig.vue'; 3 | import TableDicOption from './TableDicOption.vue'; 4 | 5 | export { ControlConfig, FormConfig, TableDicOption } -------------------------------------------------------------------------------- /src/components/LowFormDesign/components/index.ts: -------------------------------------------------------------------------------- 1 | import DesignControl from './DesignControl/index.vue'; 2 | import DesignConfig from './DesignConfig/index.vue'; 3 | import DesignLayout from './DesignLayout/index.vue'; 4 | import LayoutItem from './DesignLayout/LayoutItem.vue'; 5 | import LayoutGroup from './DesignLayout/LayoutGroup.vue'; 6 | import LayoutTable from './DesignLayout/LayoutTable.vue'; 7 | import LayoutTabs from './DesignLayout/LayoutTabs.vue'; 8 | import LayoutButton from './DesignLayout/LayoutButton.vue'; 9 | import LayoutComboBox from './DesignLayout/LayoutComboBox.vue'; 10 | 11 | export { DesignControl, DesignConfig, DesignLayout, LayoutItem, LayoutGroup, LayoutTable, LayoutTabs, LayoutButton, LayoutComboBox } -------------------------------------------------------------------------------- /src/components/LowFormDesign/index.ts: -------------------------------------------------------------------------------- 1 | 2 | import LowFormDesign from './index.vue'; 3 | 4 | export { LowFormDesign } 5 | -------------------------------------------------------------------------------- /src/components/LowFormDesign/utils/util.ts: -------------------------------------------------------------------------------- 1 | 2 | export const calcCount = (column) => { 3 | const propCount = {} 4 | let count = 0 5 | const spanDefault = 12 6 | const spanAll = 24 7 | column.forEach((item, index) => { 8 | count = count + (item.span || spanDefault) + (item.offset || 0) 9 | if (count === spanAll) { 10 | count = 0 11 | } else if (count > spanAll) { 12 | count = 0 + (item.span || spanDefault) + (item.offset || 0) 13 | } else if (count < spanAll && column[index + 1] && column[index + 1].span > spanAll - count) { 14 | count = 0 15 | } else if (item.row && count !== spanAll) { 16 | propCount[item.prop] = spanAll - count 17 | count = 0 18 | } 19 | }) 20 | return propCount 21 | } 22 | 23 | export const dictTextFormatter = [ 24 | { label: '字典Code-字典Text', value: '{dicCode}-{dicText}' }, 25 | { label: '字典Text-字典Code', value: '{dicText}-{dicCode}' }, 26 | { label: '字典Text(字典Code)', value: '{dicText}({dicCode})' }, 27 | { label: '字典Text[字典Code]', value: '{dicText}[{dicCode}]' }, 28 | { label: '其他格式请自行输入', value: 'custom-tip-1', disabled: true }, 29 | { label: '例如:code:{dicCode},text:{dicText}', value: 'custom-tip-2', disabled: true }, 30 | { label: '效果:code:1001,text:小明', value: 'custom-tip-3', disabled: true } 31 | ] -------------------------------------------------------------------------------- /src/components/MonacoEditor/index.ts: -------------------------------------------------------------------------------- 1 | import MonacoEditor from './src/MonacoEditor.vue' 2 | import DeffEditor from './src/DeffEditor.vue' 3 | 4 | export { MonacoEditor,DeffEditor } 5 | -------------------------------------------------------------------------------- /src/components/Qrcode/index.ts: -------------------------------------------------------------------------------- 1 | import Qrcode from './src/Qrcode.vue' 2 | 3 | export { Qrcode } 4 | -------------------------------------------------------------------------------- /src/components/Sticky/index.ts: -------------------------------------------------------------------------------- 1 | import Sticky from './src/Sticky.vue' 2 | 3 | export { Sticky } 4 | -------------------------------------------------------------------------------- /src/components/UploadFile/index.ts: -------------------------------------------------------------------------------- 1 | import UploadImg from './src/UploadImg.vue' 2 | import UploadImgs from './src/UploadImgs.vue' 3 | import UploadFile from './src/UploadFile.vue' 4 | 5 | export { UploadImg, UploadImgs, UploadFile } 6 | -------------------------------------------------------------------------------- /src/components/Verifition/index.ts: -------------------------------------------------------------------------------- 1 | import Verify from './src/Verify.vue' 2 | 3 | export { Verify } 4 | -------------------------------------------------------------------------------- /src/components/Verifition/src/Verify/index.ts: -------------------------------------------------------------------------------- 1 | import VerifySlide from './VerifySlide.vue' 2 | import VerifyPoints from './VerifyPoints.vue' 3 | 4 | export { VerifySlide, VerifyPoints } 5 | -------------------------------------------------------------------------------- /src/components/Verifition/src/utils/ase.ts: -------------------------------------------------------------------------------- 1 | import CryptoJS from 'crypto-js' 2 | /** 3 | * @word 要加密的内容 4 | * @keyWord String 服务器随机返回的关键字 5 | * */ 6 | export function aesEncrypt(word, keyWord = 'XwKsGlMcdPMEhR1B') { 7 | const key = CryptoJS.enc.Utf8.parse(keyWord) 8 | const srcs = CryptoJS.enc.Utf8.parse(word) 9 | const encrypted = CryptoJS.AES.encrypt(srcs, key, { 10 | mode: CryptoJS.mode.ECB, 11 | padding: CryptoJS.pad.Pkcs7 12 | }) 13 | return encrypted.toString() 14 | } 15 | -------------------------------------------------------------------------------- /src/components/XButton/index.ts: -------------------------------------------------------------------------------- 1 | import XButton from './src/XButton.vue' 2 | import XTextButton from './src/XTextButton.vue' 3 | 4 | export { XButton, XTextButton } 5 | -------------------------------------------------------------------------------- /src/components/bpmnProcessDesigner/package/designer/index.ts: -------------------------------------------------------------------------------- 1 | import MyProcessDesigner from './ProcessDesigner.vue' 2 | 3 | MyProcessDesigner.install = function (Vue) { 4 | Vue.component(MyProcessDesigner.name, MyProcessDesigner) 5 | } 6 | 7 | // 流程图的设计器,可编辑 8 | export default MyProcessDesigner 9 | -------------------------------------------------------------------------------- /src/components/bpmnProcessDesigner/package/designer/index2.ts: -------------------------------------------------------------------------------- 1 | import MyProcessViewer from './ProcessViewer.vue' 2 | 3 | MyProcessViewer.install = function (Vue) { 4 | Vue.component(MyProcessViewer.name, MyProcessViewer) 5 | } 6 | 7 | // 流程图的查看器,不可编辑 8 | export default MyProcessViewer 9 | -------------------------------------------------------------------------------- /src/components/bpmnProcessDesigner/package/designer/plugins/content-pad/index.js: -------------------------------------------------------------------------------- 1 | import CustomContextPadProvider from './contentPadProvider' 2 | 3 | export default { 4 | __init__: ['contextPadProvider'], 5 | contextPadProvider: ['type', CustomContextPadProvider] 6 | } 7 | -------------------------------------------------------------------------------- /src/components/bpmnProcessDesigner/package/designer/plugins/defaultEmpty.js: -------------------------------------------------------------------------------- 1 | export default (key, name, type) => { 2 | if (!type) type = 'camunda' 3 | const TYPE_TARGET = { 4 | activiti: 'http://activiti.org/bpmn', 5 | camunda: 'http://bpmn.io/schema/bpmn', 6 | flowable: 'http://flowable.org/bpmn' 7 | } 8 | return ` 9 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | ` 24 | } 25 | -------------------------------------------------------------------------------- /src/components/bpmnProcessDesigner/package/designer/plugins/extension-moddle/activiti/index.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @author igdianov 3 | * address https://github.com/igdianov/activiti-bpmn-moddle 4 | * */ 5 | 6 | import activitiExtension from './activitiExtension' 7 | 8 | export default { 9 | __init__: ['ActivitiModdleExtension'], 10 | ActivitiModdleExtension: ['type', activitiExtension] 11 | } 12 | -------------------------------------------------------------------------------- /src/components/bpmnProcessDesigner/package/designer/plugins/extension-moddle/camunda/index.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | import extension from './extension' 4 | 5 | export default { 6 | __init__: ['camundaModdleExtension'], 7 | camundaModdleExtension: ['type', extension] 8 | } 9 | -------------------------------------------------------------------------------- /src/components/bpmnProcessDesigner/package/designer/plugins/extension-moddle/flowable/index.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @author igdianov 3 | * address https://github.com/igdianov/activiti-bpmn-moddle 4 | * */ 5 | import flowableExtension from './flowableExtension' 6 | 7 | export default { 8 | __init__: ['FlowableModdleExtension'], 9 | FlowableModdleExtension: ['type', flowableExtension] 10 | } 11 | -------------------------------------------------------------------------------- /src/components/bpmnProcessDesigner/package/designer/plugins/palette/index.js: -------------------------------------------------------------------------------- 1 | // import PaletteModule from "diagram-js/lib/features/palette"; 2 | // import CreateModule from "diagram-js/lib/features/create"; 3 | // import SpaceToolModule from "diagram-js/lib/features/space-tool"; 4 | // import LassoToolModule from "diagram-js/lib/features/lasso-tool"; 5 | // import HandToolModule from "diagram-js/lib/features/hand-tool"; 6 | // import GlobalConnectModule from "diagram-js/lib/features/global-connect"; 7 | // import translate from "diagram-js/lib/i18n/translate"; 8 | // 9 | // import PaletteProvider from "./paletteProvider"; 10 | // 11 | // export default { 12 | // __depends__: [PaletteModule, CreateModule, SpaceToolModule, LassoToolModule, HandToolModule, GlobalConnectModule, translate], 13 | // __init__: ["paletteProvider"], 14 | // paletteProvider: ["type", PaletteProvider] 15 | // }; 16 | 17 | import CustomPalette from './CustomPalette' 18 | 19 | export default { 20 | __init__: ['paletteProvider'], 21 | paletteProvider: ['type', CustomPalette] 22 | } 23 | -------------------------------------------------------------------------------- /src/components/bpmnProcessDesigner/package/index.ts: -------------------------------------------------------------------------------- 1 | import MyProcessDesigner from './designer' 2 | import MyProcessPenal from './penal' 3 | import MyProcessViewer from './designer/index2' 4 | 5 | import './theme/index.scss' 6 | import 'bpmn-js/dist/assets/diagram-js.css' 7 | import 'bpmn-js/dist/assets/bpmn-font/css/bpmn.css' 8 | import 'bpmn-js/dist/assets/bpmn-font/css/bpmn-codes.css' 9 | import 'bpmn-js/dist/assets/bpmn-font/css/bpmn-embedded.css' 10 | 11 | export { MyProcessDesigner, MyProcessPenal, MyProcessViewer } 12 | -------------------------------------------------------------------------------- /src/components/bpmnProcessDesigner/package/palette/ProcessPalette.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 28 | 29 | 43 | -------------------------------------------------------------------------------- /src/components/bpmnProcessDesigner/package/penal/index.js: -------------------------------------------------------------------------------- 1 | import MyPropertiesPanel from './PropertiesPanel.vue' 2 | 3 | MyPropertiesPanel.install = function (Vue) { 4 | Vue.component(MyPropertiesPanel.name, MyPropertiesPanel) 5 | } 6 | 7 | export default MyPropertiesPanel 8 | -------------------------------------------------------------------------------- /src/components/bpmnProcessDesigner/package/theme/index.scss: -------------------------------------------------------------------------------- 1 | @import './process-designer.scss'; 2 | @import './process-panel.scss'; 3 | -------------------------------------------------------------------------------- /src/components/bpmnProcessDesigner/src/highlight/index.js: -------------------------------------------------------------------------------- 1 | const hljs = require('highlight.js/lib/core') 2 | hljs.registerLanguage('xml', require('highlight.js/lib/languages/xml')) 3 | hljs.registerLanguage('json', require('highlight.js/lib/languages/json')) 4 | 5 | module.exports = hljs 6 | -------------------------------------------------------------------------------- /src/components/bpmnProcessDesigner/src/modules/custom-renderer/CustomRenderer.js: -------------------------------------------------------------------------------- 1 | import BpmnRenderer from 'bpmn-js/lib/draw/BpmnRenderer' 2 | 3 | export default function CustomRenderer(config, eventBus, styles, pathMap, canvas, textRenderer) { 4 | BpmnRenderer.call(this, config, eventBus, styles, pathMap, canvas, textRenderer, 2000) 5 | 6 | this.handlers['label'] = function () { 7 | return null 8 | } 9 | } 10 | 11 | const F = function () {} // 核心,利用空对象作为中介; 12 | F.prototype = BpmnRenderer.prototype // 核心,将父类的原型赋值给空对象F; 13 | CustomRenderer.prototype = new F() // 核心,将 F的实例赋值给子类; 14 | CustomRenderer.prototype.constructor = CustomRenderer // 修复子类CustomRenderer的构造器指向,防止原型链的混乱; 15 | -------------------------------------------------------------------------------- /src/components/bpmnProcessDesigner/src/modules/custom-renderer/index.js: -------------------------------------------------------------------------------- 1 | import CustomRenderer from './CustomRenderer' 2 | 3 | export default { 4 | __init__: ['customRenderer'], 5 | customRenderer: ['type', CustomRenderer] 6 | } 7 | -------------------------------------------------------------------------------- /src/components/bpmnProcessDesigner/src/modules/rules/CustomRules.js: -------------------------------------------------------------------------------- 1 | import BpmnRules from 'bpmn-js/lib/features/rules/BpmnRules' 2 | import inherits from 'inherits' 3 | 4 | export default function CustomRules(eventBus) { 5 | BpmnRules.call(this, eventBus) 6 | } 7 | 8 | inherits(CustomRules, BpmnRules) 9 | 10 | CustomRules.prototype.canDrop = function () { 11 | return false 12 | } 13 | 14 | CustomRules.prototype.canMove = function () { 15 | return false 16 | } 17 | -------------------------------------------------------------------------------- /src/components/bpmnProcessDesigner/src/modules/rules/index.js: -------------------------------------------------------------------------------- 1 | import CustomRules from './CustomRules' 2 | 3 | export default { 4 | __init__: ['customRules'], 5 | customRules: ['type', CustomRules] 6 | } 7 | -------------------------------------------------------------------------------- /src/components/bpmnProcessDesigner/src/translations.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * This is a sample file that should be replaced with the actual translation. 3 | * 4 | * Checkout https://github.com/bpmn-io/bpmn-js-i18n for a list of available 5 | * translations and labels to translate. 6 | */ 7 | export default { 8 | 'Exclusive Gateway': 'Exklusives Gateway', 9 | 'Parallel Gateway': 'Paralleles Gateway', 10 | 'Inclusive Gateway': 'Inklusives Gateway', 11 | 'Complex Gateway': 'Komplexes Gateway', 12 | 'Event based Gateway': 'Ereignis-basiertes Gateway', 13 | 'Message Start Event': '消息启动事件', 14 | 'Timer Start Event': '定时启动事件', 15 | 'Conditional Start Event': '条件启动事件', 16 | 'Signal Start Event': '信号启动事件', 17 | 'Error Start Event': '错误启动事件', 18 | 'Escalation Start Event': '升级启动事件', 19 | 'Compensation Start Event': '补偿启动事件', 20 | 'Message Start Event (non-interrupting)': '消息启动事件 (非中断)', 21 | 'Timer Start Event (non-interrupting)': '定时启动事件 (非中断)', 22 | 'Conditional Start Event (non-interrupting)': '条件启动事件 (非中断)', 23 | 'Signal Start Event (non-interrupting)': '信号启动事件 (非中断)', 24 | 'Escalation Start Event (non-interrupting)': '升级启动事件 (非中断)' 25 | } 26 | -------------------------------------------------------------------------------- /src/components/bpmnProcessDesigner/src/utils/directive/clickOutSide.js: -------------------------------------------------------------------------------- 1 | //outside.js 2 | 3 | const ctx = '@@clickoutsideContext' 4 | 5 | export default { 6 | bind(el, binding, vnode) { 7 | const ele = el 8 | const documentHandler = (e) => { 9 | if (!vnode.context || ele.contains(e.target)) { 10 | return false 11 | } 12 | // 调用指令回调 13 | if (binding.expression) { 14 | vnode.context[el[ctx].methodName](e) 15 | } else { 16 | el[ctx].bindingFn(e) 17 | } 18 | } 19 | // 将方法添加到ele 20 | ele[ctx] = { 21 | documentHandler, 22 | methodName: binding.expression, 23 | bindingFn: binding.value 24 | } 25 | 26 | setTimeout(() => { 27 | document.addEventListener('touchstart', documentHandler) // 为document绑定事件 28 | }) 29 | }, 30 | update(el, binding) { 31 | const ele = el 32 | ele[ctx].methodName = binding.expression 33 | ele[ctx].bindingFn = binding.value 34 | }, 35 | unbind(el) { 36 | document.removeEventListener('touchstart', el[ctx].documentHandler) // 解绑 37 | delete el[ctx] 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/components/bpmnProcessDesigner/src/utils/index.js: -------------------------------------------------------------------------------- 1 | export function debounce(fn, delay = 500) { 2 | let timer 3 | return function (...args) { 4 | if (timer) { 5 | clearTimeout(timer) 6 | timer = null 7 | } 8 | timer = setTimeout(fn.bind(this, ...args), delay) 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/components/bpmnProcessDesigner/src/utils/xml2json.js: -------------------------------------------------------------------------------- 1 | function xmlStr2XmlObj(xmlStr) { 2 | let xmlObj = {} 3 | if (document.all) { 4 | const xmlDom = new window.ActiveXObject('Microsoft.XMLDOM') 5 | xmlDom.loadXML(xmlStr) 6 | xmlObj = xmlDom 7 | } else { 8 | xmlObj = new DOMParser().parseFromString(xmlStr, 'text/xml') 9 | } 10 | return xmlObj 11 | } 12 | 13 | function xml2json(xml) { 14 | try { 15 | let obj = {} 16 | if (xml.children.length > 0) { 17 | for (let i = 0; i < xml.children.length; i++) { 18 | const item = xml.children.item(i) 19 | const nodeName = item.nodeName 20 | if (typeof obj[nodeName] == 'undefined') { 21 | obj[nodeName] = xml2json(item) 22 | } else { 23 | if (typeof obj[nodeName].push == 'undefined') { 24 | const old = obj[nodeName] 25 | obj[nodeName] = [] 26 | obj[nodeName].push(old) 27 | } 28 | obj[nodeName].push(xml2json(item)) 29 | } 30 | } 31 | } else { 32 | obj = xml.textContent 33 | } 34 | return obj 35 | } catch (e) { 36 | console.log(e.message) 37 | } 38 | } 39 | 40 | function xmlObj2json(xml) { 41 | const xmlObj = xmlStr2XmlObj(xml) 42 | let jsonObj = {} 43 | if (xmlObj.childNodes.length > 0) { 44 | jsonObj = xml2json(xmlObj) 45 | } 46 | return jsonObj 47 | } 48 | 49 | export default xmlObj2json 50 | -------------------------------------------------------------------------------- /src/components/index.ts: -------------------------------------------------------------------------------- 1 | import type { App } from 'vue' 2 | import { Icon } from './Icon' 3 | 4 | export const setupGlobCom = (app: App): void => { 5 | app.component('Icon', Icon) 6 | } 7 | -------------------------------------------------------------------------------- /src/config/axios/config.ts: -------------------------------------------------------------------------------- 1 | const config: { 2 | base_url: string 3 | result_code: number | string 4 | default_headers: AxiosHeaders 5 | request_timeout: number 6 | } = { 7 | /** 8 | * api请求基础路径 9 | */ 10 | base_url: import.meta.env.VITE_BASE_URL + import.meta.env.VITE_API_URL, 11 | /** 12 | * 接口成功返回状态码 13 | */ 14 | result_code: 200, 15 | 16 | /** 17 | * 接口请求超时时间 18 | */ 19 | request_timeout: 30000, 20 | 21 | /** 22 | * 默认接口请求类型 23 | * 可选值:application/x-www-form-urlencoded multipart/form-data 24 | */ 25 | default_headers: 'application/json' 26 | } 27 | 28 | export { config } 29 | -------------------------------------------------------------------------------- /src/config/axios/errorCode.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | '401': '认证失败,无法访问系统资源', 3 | '403': '当前操作没有权限', 4 | '404': '访问资源不存在', 5 | default: '系统未知错误,请反馈给管理员' 6 | } 7 | -------------------------------------------------------------------------------- /src/directives/index.ts: -------------------------------------------------------------------------------- 1 | import type { App } from 'vue' 2 | import { hasRole } from './permission/hasRole' 3 | import { hasPermi } from './permission/hasPermi' 4 | import { hasResize } from './resize/ResizeObserver' 5 | 6 | /** 7 | * 导出指令:v-xxx 8 | * @methods hasRole 用户权限,用法: v-hasRole 9 | * @methods hasPermi 按钮权限,用法: v-hasPermi 10 | */ 11 | export const setupAuth = (app: App) => { 12 | hasRole(app) 13 | hasPermi(app) 14 | hasResize(app) 15 | } 16 | -------------------------------------------------------------------------------- /src/directives/permission/hasPermi.ts: -------------------------------------------------------------------------------- 1 | import type { App } from 'vue' 2 | import { CACHE_KEY, useCache } from '@/hooks/web/useCache' 3 | 4 | const { t } = useI18n() // 国际化 5 | 6 | export function hasPermi(app: App) { 7 | app.directive('hasPermi', (el, binding) => { 8 | const { wsCache } = useCache() 9 | const { value } = binding 10 | const all_permission = '*:*:*' 11 | const permissions = wsCache.get(CACHE_KEY.USER).permissions 12 | 13 | if (value && value instanceof Array && value.length > 0) { 14 | const permissionFlag = value 15 | 16 | let hasPermissions = false 17 | permissionFlag.forEach(permiKey => { 18 | if (all_permission === permiKey || permissions[permiKey]) hasPermissions = true 19 | }) 20 | if (!hasPermissions) { 21 | el.parentNode && el.parentNode.removeChild(el) 22 | } 23 | } else { 24 | throw new Error(t('permission.hasPermission')) 25 | } 26 | }) 27 | } 28 | -------------------------------------------------------------------------------- /src/directives/permission/hasRole.ts: -------------------------------------------------------------------------------- 1 | import type { App } from 'vue' 2 | import { CACHE_KEY, useCache } from '@/hooks/web/useCache' 3 | 4 | const { t } = useI18n() // 国际化 5 | 6 | export function hasRole(app: App) { 7 | app.directive('hasRole', (el, binding) => { 8 | const { wsCache } = useCache() 9 | const { value } = binding 10 | const super_admin = 'admin' 11 | const roles = wsCache.get(CACHE_KEY.USER).roles 12 | 13 | if (value && value instanceof Array && value.length > 0) { 14 | const roleFlag = value 15 | 16 | const hasRole = roles.some((role: string) => { 17 | return super_admin === role || roleFlag.includes(role) 18 | }) 19 | 20 | if (!hasRole) { 21 | el.parentNode && el.parentNode.removeChild(el) 22 | } 23 | } else { 24 | throw new Error(t('permission.hasRole')) 25 | } 26 | }) 27 | } 28 | -------------------------------------------------------------------------------- /src/directives/resize/ResizeObserver.ts: -------------------------------------------------------------------------------- 1 | import type { App } from 'vue' 2 | const map = new WeakMap() 3 | const ob = new ResizeObserver((entries) => { 4 | for (const entry of entries) { 5 | // 获取dom元素的回调 6 | const handler = map.get(entry.target) 7 | //存在回调函数 8 | if (handler) { 9 | // 将监听的值给回调函数 10 | handler({ 11 | width: entry.borderBoxSize[0].inlineSize, 12 | height: entry.borderBoxSize[0].blockSize 13 | }) 14 | } 15 | } 16 | }) 17 | 18 | export function hasResize(app: App) { 19 | app.directive('hasResize', { 20 | mounted(el, binding) { 21 | map.set(el, binding.value) 22 | ob.observe(el) 23 | }, 24 | unmounted(el) { 25 | ob.unobserve(el) 26 | } 27 | }) 28 | 29 | } 30 | 31 | export default hasResize -------------------------------------------------------------------------------- /src/hooks/design/useCopyText.ts: -------------------------------------------------------------------------------- 1 | 2 | import { useClipboard } from '@vueuse/core' 3 | export default function () { 4 | const { t } = useI18n() // 国际化 5 | const message = useMessage() // 消息弹窗 6 | const copy = async (text: string) => { 7 | if (navigator.clipboard) { 8 | const { copy, copied, isSupported } = useClipboard({ source: text }) 9 | if (!isSupported) { 10 | message.error(t('common.copyError')) 11 | return 12 | } 13 | await copy() 14 | if (unref(copied)) { 15 | message.success(t('common.copySuccess')) 16 | } 17 | } else { 18 | const textarea = document.createElement('textarea'); 19 | textarea.value = text; 20 | document.body.appendChild(textarea); 21 | textarea.select(); 22 | document.execCommand('copy'); 23 | document.body.removeChild(textarea); 24 | message.success(t('common.copySuccess')); 25 | } 26 | } 27 | return { copyText: copy } 28 | } -------------------------------------------------------------------------------- /src/hooks/design/useCrudHeight.ts: -------------------------------------------------------------------------------- 1 | import { useWindowSize } from '@vueuse/core' 2 | 3 | export const useCrudHeight = (crudRef) => { 4 | const windowSize = useWindowSize() 5 | const crudHeightTimer = ref(null) 6 | 7 | const initTableLayout = () => { 8 | if (crudHeightTimer.value) clearTimeout(crudHeightTimer.value) 9 | crudHeightTimer.value = setTimeout(() => { 10 | if (crudRef instanceof Array) { 11 | crudRef.forEach(itemRef => { 12 | if (itemRef.value) itemRef.value.getTableHeight() 13 | }) 14 | } else if (crudRef.value) crudRef.value.getTableHeight() 15 | }, 100) 16 | } 17 | 18 | watch( 19 | () => windowSize.height.value, 20 | () => { 21 | initTableLayout() 22 | } 23 | ) 24 | 25 | return { initTableLayout, windowSize } 26 | } 27 | -------------------------------------------------------------------------------- /src/hooks/design/useCrudPermi.ts: -------------------------------------------------------------------------------- 1 | import { CACHE_KEY, useCache } from '@/hooks/web/useCache' 2 | 3 | export const useCrudPermi = () => { 4 | const { wsCache } = useCache() 5 | const all_permission = '*:*' 6 | const permissions = wsCache.get(CACHE_KEY.USER).permissions 7 | const crudBtnObj = { 8 | query: 'viewBtn', 9 | create: 'addBtn', 10 | update: 'editBtn', 11 | delete: 'delBtn', 12 | } 13 | 14 | const getCurrPermi = (permiArr: string[]) => { 15 | const crudPermission = {} 16 | permiArr.forEach(permiKey => { 17 | for (const key in crudBtnObj) { 18 | crudPermission[crudBtnObj[key]] = permiKey === all_permission || permissions[`${permiKey}:${key}`] 19 | } 20 | }) 21 | return crudPermission 22 | } 23 | return { getCurrPermi } 24 | } 25 | -------------------------------------------------------------------------------- /src/hooks/event/useScrollTo.ts: -------------------------------------------------------------------------------- 1 | export interface ScrollToParams { 2 | el: HTMLElement 3 | to: number 4 | position: string 5 | duration?: number 6 | callback?: () => void 7 | } 8 | 9 | const easeInOutQuad = (t: number, b: number, c: number, d: number) => { 10 | t /= d / 2 11 | if (t < 1) { 12 | return (c / 2) * t * t + b 13 | } 14 | t-- 15 | return (-c / 2) * (t * (t - 2) - 1) + b 16 | } 17 | const move = (el: HTMLElement, position: string, amount: number) => { 18 | el[position] = amount 19 | } 20 | 21 | export function useScrollTo({ 22 | el, 23 | position = 'scrollLeft', 24 | to, 25 | duration = 500, 26 | callback 27 | }: ScrollToParams) { 28 | const isActiveRef = ref(false) 29 | const start = el[position] 30 | const change = to - start 31 | const increment = 20 32 | let currentTime = 0 33 | 34 | function animateScroll() { 35 | if (!unref(isActiveRef)) { 36 | return 37 | } 38 | currentTime += increment 39 | const val = easeInOutQuad(currentTime, start, change, duration) 40 | move(el, position, val) 41 | if (currentTime < duration && unref(isActiveRef)) { 42 | requestAnimationFrame(animateScroll) 43 | } else { 44 | if (callback) { 45 | callback() 46 | } 47 | } 48 | } 49 | 50 | function run() { 51 | isActiveRef.value = true 52 | animateScroll() 53 | } 54 | 55 | function stop() { 56 | isActiveRef.value = false 57 | } 58 | 59 | return { start: run, stop } 60 | } 61 | -------------------------------------------------------------------------------- /src/hooks/login/loginApi.ts: -------------------------------------------------------------------------------- 1 | export function isValidPhoneNumber(phoneNumber: string): boolean { 2 | const regex = /^1[3-9]\d{9}$/; 3 | return regex.test(phoneNumber); 4 | } -------------------------------------------------------------------------------- /src/hooks/web/useCache.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * 配置浏览器本地存储的方式,可直接存储对象数组。 3 | */ 4 | 5 | import WebStorageCache from 'web-storage-cache' 6 | 7 | type CacheType = 'localStorage' | 'sessionStorage' 8 | 9 | export const CACHE_KEY = { 10 | IS_DARK: 'isDark', 11 | DARK_BEFORE_COLOR:'darkBeforeColor', 12 | USER: 'user', 13 | LANG: 'lang', 14 | THEME: 'theme', 15 | LAYOUT: 'layout', 16 | LOW_REGION: 'lowRegion', 17 | ROLE_ROUTERS: 'roleRouters', 18 | DICT_CACHE: 'dictCache' 19 | } 20 | 21 | export const useCache = (type: CacheType = 'localStorage') => { 22 | const wsCache: WebStorageCache = new WebStorageCache({ 23 | storage: type 24 | }) 25 | 26 | return { 27 | wsCache 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/hooks/web/useConfigGlobal.ts: -------------------------------------------------------------------------------- 1 | import { ConfigGlobalTypes } from '@/types/configGlobal' 2 | 3 | export const useConfigGlobal = () => { 4 | const configGlobal = inject('configGlobal', {}) as ConfigGlobalTypes 5 | 6 | return { 7 | configGlobal 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/hooks/web/useDesign.ts: -------------------------------------------------------------------------------- 1 | import variables from '@/styles/global.module.scss' 2 | 3 | export const useDesign = () => { 4 | const scssVariables = variables 5 | 6 | /** 7 | * @param scope 类名 8 | * @returns 返回空间名-类名 9 | */ 10 | const getPrefixCls = (scope: string) => { 11 | return `${scssVariables.namespace}-${scope}` 12 | } 13 | 14 | return { 15 | variables: scssVariables, 16 | getPrefixCls 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/hooks/web/useEmitt.ts: -------------------------------------------------------------------------------- 1 | import mitt from 'mitt' 2 | 3 | interface Option { 4 | name: string // 事件名称 5 | callback: Fn // 回调 6 | } 7 | 8 | const emitter = mitt() 9 | 10 | export const useEmitt = (option?: Option) => { 11 | if (option) { 12 | emitter.on(option.name, option.callback) 13 | 14 | onBeforeUnmount(() => { 15 | emitter.off(option.name) 16 | }) 17 | } 18 | 19 | return { 20 | emitter 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/hooks/web/useGuide.ts: -------------------------------------------------------------------------------- 1 | import { Config, driver } from 'driver.js' 2 | import 'driver.js/dist/driver.css' 3 | import { useDesign } from '@/hooks/web/useDesign' 4 | import { useI18n } from '@/hooks/web/useI18n' 5 | 6 | const { t } = useI18n() 7 | 8 | const { variables } = useDesign() 9 | 10 | export const useGuide = (options?: Config) => { 11 | const driverObj = driver( 12 | options || { 13 | showProgress: true, 14 | nextBtnText: t('common.nextLabel'), 15 | prevBtnText: t('common.prevLabel'), 16 | doneBtnText: t('common.doneLabel'), 17 | steps: [ 18 | { 19 | element: `#${variables.namespace}-menu`, 20 | popover: { 21 | title: t('common.menu'), 22 | description: t('common.menuDes'), 23 | side: 'right' 24 | } 25 | }, 26 | { 27 | element: `#${variables.namespace}-tool-header`, 28 | popover: { 29 | title: t('common.tool'), 30 | description: t('common.toolDes'), 31 | side: 'left' 32 | } 33 | }, 34 | { 35 | element: `#${variables.namespace}-tags-view`, 36 | popover: { 37 | title: t('common.tagsView'), 38 | description: t('common.tagsViewDes'), 39 | side: 'bottom' 40 | } 41 | } 42 | ] 43 | } 44 | ) 45 | 46 | return { 47 | ...driverObj 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/hooks/web/useI18n.ts: -------------------------------------------------------------------------------- 1 | import { i18n } from '@/plugins/vueI18n' 2 | 3 | type I18nGlobalTranslation = { 4 | (key: string): string 5 | (key: string, locale: string): string 6 | (key: string, locale: string, list: unknown[]): string 7 | (key: string, locale: string, named: Record): string 8 | (key: string, list: unknown[]): string 9 | (key: string, named: Record): string 10 | } 11 | 12 | type I18nTranslationRestParameters = [string, any] 13 | 14 | const getKey = (namespace: string | undefined, key: string) => { 15 | if (!namespace) { 16 | return key 17 | } 18 | if (key.startsWith(namespace)) { 19 | return key 20 | } 21 | return `${namespace}.${key}` 22 | } 23 | 24 | export const useI18n = ( 25 | namespace?: string 26 | ): { 27 | t: I18nGlobalTranslation 28 | } => { 29 | const normalFn = { 30 | t: (key: string) => { 31 | return getKey(namespace, key) 32 | } 33 | } 34 | 35 | if (!i18n) { 36 | return normalFn 37 | } 38 | 39 | const { t, ...methods } = i18n.global 40 | 41 | const tFn: I18nGlobalTranslation = (key: string, ...arg: any[]) => { 42 | if (!key) return '' 43 | if (!key.includes('.') && !namespace) return key 44 | //@ts-ignore 45 | return t(getKey(namespace, key), ...(arg as I18nTranslationRestParameters)) 46 | } 47 | return { 48 | ...methods, 49 | t: tFn 50 | } 51 | } 52 | 53 | export const t = (key: string) => key 54 | -------------------------------------------------------------------------------- /src/hooks/web/useIcon.ts: -------------------------------------------------------------------------------- 1 | import { h } from 'vue' 2 | import type { VNode } from 'vue' 3 | import { Icon } from '@/components/Icon' 4 | import { IconTypes } from '@/types/icon' 5 | 6 | export const useIcon = (props: IconTypes): VNode => { 7 | return h(Icon, props) 8 | } 9 | -------------------------------------------------------------------------------- /src/hooks/web/useLocale.ts: -------------------------------------------------------------------------------- 1 | import { i18n } from '@/plugins/vueI18n' 2 | import { useLocaleStoreWithOut } from '@/store/modules/locale' 3 | import { setHtmlPageLang } from '@/plugins/vueI18n/helper' 4 | 5 | const setI18nLanguage = (locale: LocaleType) => { 6 | const localeStore = useLocaleStoreWithOut() 7 | 8 | if (i18n.mode === 'legacy') { 9 | i18n.global.locale = locale 10 | } else { 11 | ;(i18n.global.locale as any).value = locale 12 | } 13 | localeStore.setCurrentLocale({ 14 | lang: locale 15 | }) 16 | setHtmlPageLang(locale) 17 | } 18 | 19 | export const useLocale = () => { 20 | // Switching the language will change the locale of useI18n 21 | // And submit to configuration modification 22 | const changeLocale = async (locale: LocaleType) => { 23 | const globalI18n = i18n.global 24 | 25 | const langModule = await import(`../../locales/${locale}.ts`) 26 | 27 | globalI18n.setLocaleMessage(locale, langModule.default) 28 | 29 | setI18nLanguage(locale) 30 | } 31 | 32 | return { 33 | changeLocale 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/hooks/web/useNProgress.ts: -------------------------------------------------------------------------------- 1 | import { useCssVar } from '@vueuse/core' 2 | import type { NProgressOptions } from 'nprogress' 3 | import NProgress from 'nprogress' 4 | import 'nprogress/nprogress.css' 5 | 6 | const primaryColor = useCssVar('--el-color-primary', document.documentElement) 7 | 8 | export const useNProgress = () => { 9 | NProgress.configure({ showSpinner: false } as NProgressOptions) 10 | 11 | const initColor = async () => { 12 | await nextTick() 13 | const bar = document.getElementById('nprogress')?.getElementsByClassName('bar')[0] as ElRef 14 | if (bar) { 15 | bar.style.background = unref(primaryColor.value) 16 | } 17 | } 18 | 19 | initColor() 20 | 21 | const start = () => { 22 | NProgress.start() 23 | } 24 | 25 | const done = () => { 26 | NProgress.done() 27 | } 28 | 29 | return { 30 | start, 31 | done 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/hooks/web/useNetwork.ts: -------------------------------------------------------------------------------- 1 | import { ref, onBeforeUnmount } from 'vue' 2 | 3 | const useNetwork = () => { 4 | const online = ref(true) 5 | 6 | const updateNetwork = () => { 7 | online.value = navigator.onLine 8 | } 9 | 10 | window.addEventListener('online', updateNetwork) 11 | window.addEventListener('offline', updateNetwork) 12 | 13 | onBeforeUnmount(() => { 14 | window.removeEventListener('online', updateNetwork) 15 | window.removeEventListener('offline', updateNetwork) 16 | }) 17 | 18 | return { online } 19 | } 20 | 21 | export { useNetwork } 22 | -------------------------------------------------------------------------------- /src/hooks/web/useNow.ts: -------------------------------------------------------------------------------- 1 | import dayjs from 'dayjs' 2 | import { reactive, toRefs } from 'vue' 3 | import { tryOnMounted, tryOnUnmounted } from '@vueuse/core' 4 | 5 | export const useNow = (immediate = true) => { 6 | let timer: IntervalHandle 7 | 8 | const state = reactive({ 9 | year: 0, 10 | month: 0, 11 | week: '', 12 | day: 0, 13 | hour: '', 14 | minute: '', 15 | second: 0, 16 | meridiem: '' 17 | }) 18 | 19 | const update = () => { 20 | const now = dayjs() 21 | 22 | const h = now.format('HH') 23 | const m = now.format('mm') 24 | const s = now.get('s') 25 | 26 | state.year = now.get('y') 27 | state.month = now.get('M') + 1 28 | state.week = '星期' + ['日', '一', '二', '三', '四', '五', '六'][now.day()] 29 | state.day = now.get('date') 30 | state.hour = h 31 | state.minute = m 32 | state.second = s 33 | 34 | state.meridiem = now.format('A') 35 | } 36 | 37 | function start() { 38 | update() 39 | clearInterval(timer) 40 | timer = setInterval(() => update(), 1000) 41 | } 42 | 43 | function stop() { 44 | clearInterval(timer) 45 | } 46 | 47 | tryOnMounted(() => { 48 | immediate && start() 49 | }) 50 | 51 | tryOnUnmounted(() => { 52 | stop() 53 | }) 54 | 55 | return { 56 | ...toRefs(state), 57 | start, 58 | stop 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /src/hooks/web/usePageLoading.ts: -------------------------------------------------------------------------------- 1 | import { useAppStoreWithOut } from '@/store/modules/app' 2 | 3 | 4 | 5 | export const usePageLoading = () => { 6 | const loadStart = () => { 7 | const appStore = useAppStoreWithOut() 8 | appStore.setPageLoading(true) 9 | } 10 | 11 | const loadDone = () => { 12 | const appStore = useAppStoreWithOut() 13 | appStore.setPageLoading(false) 14 | } 15 | 16 | return { 17 | loadStart, 18 | loadDone 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/hooks/web/useTitle.ts: -------------------------------------------------------------------------------- 1 | import { watch, ref } from 'vue' 2 | import { isString } from '@/utils/is' 3 | import { useAppStoreWithOut } from '@/store/modules/app' 4 | 5 | 6 | export const useTitle = (newTitle?: string) => { 7 | const { t } = useI18n() 8 | const appStore = useAppStoreWithOut() 9 | 10 | const title = ref( 11 | newTitle ? `${appStore.getTitle} - ${t(newTitle as string)}` : appStore.getTitle 12 | ) 13 | 14 | watch( 15 | title, 16 | (n, o) => { 17 | if (isString(n) && n !== o && document) { 18 | document.title = n 19 | } 20 | }, 21 | { immediate: true } 22 | ) 23 | 24 | return title 25 | } 26 | -------------------------------------------------------------------------------- /src/layout/components/AppView.vue: -------------------------------------------------------------------------------- 1 | 29 | 30 | 46 | -------------------------------------------------------------------------------- /src/layout/components/Breadcrumb/index.ts: -------------------------------------------------------------------------------- 1 | import Breadcrumb from './src/Breadcrumb.vue' 2 | 3 | export { Breadcrumb } 4 | -------------------------------------------------------------------------------- /src/layout/components/Breadcrumb/src/helper.ts: -------------------------------------------------------------------------------- 1 | import { pathResolve } from '@/utils/routerHelper' 2 | import type { RouteMeta } from 'vue-router' 3 | 4 | export const filterBreadcrumb = ( 5 | routes: AppRouteRecordRaw[], 6 | parentPath = '' 7 | ): AppRouteRecordRaw[] => { 8 | const res: AppRouteRecordRaw[] = [] 9 | 10 | for (const route of routes) { 11 | const meta = route?.meta as RouteMeta 12 | if (meta.hidden && !meta.canTo) { 13 | continue 14 | } 15 | 16 | const data: AppRouteRecordRaw = 17 | !meta.alwaysShow && route.children?.length === 1 18 | ? { ...route.children[0], path: pathResolve(route.path, route.children[0].path) } 19 | : { ...route } 20 | 21 | data.path = pathResolve(parentPath, data.path) 22 | 23 | if (data.children) { 24 | data.children = filterBreadcrumb(data.children, data.path) 25 | } 26 | if (data) { 27 | res.push(data) 28 | } 29 | } 30 | return res 31 | } 32 | -------------------------------------------------------------------------------- /src/layout/components/ClearCache/index.ts: -------------------------------------------------------------------------------- 1 | import ClearCache from './src/ClearCache.vue' 2 | 3 | export { ClearCache } 4 | -------------------------------------------------------------------------------- /src/layout/components/ClearCache/src/ClearCache.vue: -------------------------------------------------------------------------------- 1 | import { Message } from '../../Message'; 2 | 19 | 20 | 31 | -------------------------------------------------------------------------------- /src/layout/components/Collapse/index.ts: -------------------------------------------------------------------------------- 1 | import Collapse from './src/Collapse.vue' 2 | 3 | export { Collapse } 4 | -------------------------------------------------------------------------------- /src/layout/components/Collapse/src/Collapse.vue: -------------------------------------------------------------------------------- 1 | 25 | 26 | 36 | -------------------------------------------------------------------------------- /src/layout/components/ContextMenu/index.ts: -------------------------------------------------------------------------------- 1 | import ContextMenu from './src/ContextMenu.vue' 2 | import { ElDropdown } from 'element-plus' 3 | import type { RouteLocationNormalizedLoaded } from 'vue-router' 4 | 5 | export interface ContextMenuExpose { 6 | elDropdownMenuRef: ComponentRef 7 | tagItem: RouteLocationNormalizedLoaded 8 | } 9 | 10 | export { ContextMenu } 11 | -------------------------------------------------------------------------------- /src/layout/components/Footer/index.ts: -------------------------------------------------------------------------------- 1 | import Footer from './src/Footer.vue' 2 | 3 | export { Footer } 4 | -------------------------------------------------------------------------------- /src/layout/components/Footer/src/Footer.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 25 | -------------------------------------------------------------------------------- /src/layout/components/LocaleDropdown/index.ts: -------------------------------------------------------------------------------- 1 | import LocaleDropdown from './src/LocaleDropdown.vue' 2 | 3 | export { LocaleDropdown } 4 | -------------------------------------------------------------------------------- /src/layout/components/Logo/index.ts: -------------------------------------------------------------------------------- 1 | import Logo from './src/Logo.vue' 2 | 3 | export { Logo } 4 | -------------------------------------------------------------------------------- /src/layout/components/Menu/index.ts: -------------------------------------------------------------------------------- 1 | import Menu from './src/Menu.vue' 2 | 3 | export { Menu } 4 | -------------------------------------------------------------------------------- /src/layout/components/Menu/src/components/useRenderMenuTitle.tsx: -------------------------------------------------------------------------------- 1 | import type { RouteMeta } from 'vue-router' 2 | import { Icon } from '@/components/Icon' 3 | 4 | export const useRenderMenuTitle = () => { 5 | const renderMenuTitle = (meta: RouteMeta) => { 6 | const { t } = useI18n() 7 | const { title = 'Please set title', icon } = meta 8 | 9 | return icon ? ( 10 | <> 11 | 12 | 13 | {t(title as string)} 14 | 15 | 16 | ) : ( 17 | 18 | {t(title as string)} 19 | 20 | ) 21 | } 22 | 23 | return { 24 | renderMenuTitle 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/layout/components/Message/index.ts: -------------------------------------------------------------------------------- 1 | import Message from './src/Message.vue' 2 | 3 | export { Message } 4 | -------------------------------------------------------------------------------- /src/layout/components/Screenfull/index.ts: -------------------------------------------------------------------------------- 1 | import Screenfull from './src/Screenfull.vue' 2 | 3 | export { Screenfull } 4 | -------------------------------------------------------------------------------- /src/layout/components/Screenfull/src/Screenfull.vue: -------------------------------------------------------------------------------- 1 | 23 | 24 | 33 | -------------------------------------------------------------------------------- /src/layout/components/Setting/index.ts: -------------------------------------------------------------------------------- 1 | import Setting from './src/Setting.vue' 2 | 3 | export { Setting } 4 | -------------------------------------------------------------------------------- /src/layout/components/SizeDropdown/index.ts: -------------------------------------------------------------------------------- 1 | import SizeDropdown from './src/SizeDropdown.vue' 2 | 3 | export { SizeDropdown } 4 | -------------------------------------------------------------------------------- /src/layout/components/SizeDropdown/src/SizeDropdown.vue: -------------------------------------------------------------------------------- 1 | 28 | 29 | 41 | -------------------------------------------------------------------------------- /src/layout/components/TabMenu/index.ts: -------------------------------------------------------------------------------- 1 | import TabMenu from './src/TabMenu.vue' 2 | 3 | export { TabMenu } 4 | -------------------------------------------------------------------------------- /src/layout/components/TagsView/index.ts: -------------------------------------------------------------------------------- 1 | import TagsView from './src/TagsView.vue' 2 | 3 | export { TagsView } 4 | -------------------------------------------------------------------------------- /src/layout/components/TagsView/src/helper.ts: -------------------------------------------------------------------------------- 1 | import type { RouteMeta, RouteLocationNormalizedLoaded } from 'vue-router' 2 | import { pathResolve } from '@/utils/routerHelper' 3 | 4 | export const filterAffixTags = (routes: AppRouteRecordRaw[], parentPath = '') => { 5 | let tags: RouteLocationNormalizedLoaded[] = [] 6 | routes.forEach((route) => { 7 | const meta = route.meta as RouteMeta 8 | const tagPath = pathResolve(parentPath, route.path) 9 | if (meta?.affix) { 10 | tags.push({ ...route, path: tagPath, fullPath: tagPath } as RouteLocationNormalizedLoaded) 11 | } 12 | if (route.children) { 13 | const tempTags: RouteLocationNormalizedLoaded[] = filterAffixTags(route.children, tagPath) 14 | if (tempTags.length >= 1) { 15 | tags = [...tags, ...tempTags] 16 | } 17 | } 18 | }) 19 | 20 | return tags 21 | } 22 | -------------------------------------------------------------------------------- /src/layout/components/ThemeSwitch/index.ts: -------------------------------------------------------------------------------- 1 | import ThemeSwitch from './src/ThemeSwitch.vue' 2 | 3 | export { ThemeSwitch } 4 | -------------------------------------------------------------------------------- /src/layout/components/UserInfo/index.ts: -------------------------------------------------------------------------------- 1 | import UserInfo from './src/UserInfo.vue' 2 | 3 | export { UserInfo } 4 | -------------------------------------------------------------------------------- /src/plugins/animate.css/index.ts: -------------------------------------------------------------------------------- 1 | import 'animate.css' 2 | -------------------------------------------------------------------------------- /src/plugins/avue/index.ts: -------------------------------------------------------------------------------- 1 | import type { App } from 'vue' 2 | import Avue from '@smallwei/avue'; 3 | import { service } from '@/config/axios/service' 4 | 5 | import '@smallwei/avue/lib/index.css'; 6 | import '@/styles/avueTable.scss' 7 | import '@/styles/avueForm.scss' 8 | 9 | export const setupAvue = async (app: App) => { 10 | app.use(Avue, { 11 | axios: service, 12 | crudOption: { 13 | align: 'center', 14 | headerAlign: 'center', 15 | border: true, 16 | gridBtn: false, 17 | height: 'auto', 18 | calcHeight: 130, 19 | searchSpan: 6, 20 | searchMenuSpan: 6, 21 | searchMenuPosition: 'left', 22 | searchIndex: 3, 23 | searchIcon: true, 24 | labelSuffix: ' ', 25 | dialogEscape: false, 26 | dialogWidth: '80%', 27 | }, 28 | formOption: { 29 | labelSuffix: ' ', 30 | labelWidth: 120, 31 | }, 32 | }) 33 | } -------------------------------------------------------------------------------- /src/plugins/echarts/index.ts: -------------------------------------------------------------------------------- 1 | import * as echarts from 'echarts/core' 2 | 3 | import { 4 | BarChart, 5 | LineChart, 6 | PieChart, 7 | MapChart, 8 | PictorialBarChart, 9 | RadarChart, 10 | GaugeChart 11 | } from 'echarts/charts' 12 | 13 | import { 14 | TitleComponent, 15 | TooltipComponent, 16 | GridComponent, 17 | PolarComponent, 18 | AriaComponent, 19 | ParallelComponent, 20 | LegendComponent, 21 | ToolboxComponent, 22 | VisualMapComponent 23 | } from 'echarts/components' 24 | 25 | import { CanvasRenderer } from 'echarts/renderers' 26 | 27 | echarts.use([ 28 | LegendComponent, 29 | TitleComponent, 30 | TooltipComponent, 31 | ToolboxComponent, 32 | GridComponent, 33 | PolarComponent, 34 | AriaComponent, 35 | ParallelComponent, 36 | VisualMapComponent, 37 | BarChart, 38 | LineChart, 39 | PieChart, 40 | MapChart, 41 | CanvasRenderer, 42 | PictorialBarChart, 43 | RadarChart, 44 | GaugeChart 45 | ]) 46 | 47 | export default echarts 48 | -------------------------------------------------------------------------------- /src/plugins/lowDesagn/index.ts: -------------------------------------------------------------------------------- 1 | import type { App } from 'vue' 2 | import Sortable from 'sortablejs'; 3 | import AvueUeditor from 'avue-plugin-ueditor' 4 | 5 | window['Sortable'] = Sortable 6 | 7 | export const setupLowDesagn = async (app: App) => { 8 | app.use(AvueUeditor) 9 | } 10 | -------------------------------------------------------------------------------- /src/plugins/md/preview/index.ts: -------------------------------------------------------------------------------- 1 | import type { App } from 'vue' 2 | 3 | import VMdPreview from '@kangc/v-md-editor/lib/preview'; 4 | import '@kangc/v-md-editor/lib/style/preview.css'; 5 | import githubTheme from '@kangc/v-md-editor/lib/theme/github.js'; 6 | import '@kangc/v-md-editor/lib/theme/style/github.css'; 7 | 8 | //任务列表 9 | import createTodoListPlugin from '@kangc/v-md-editor/lib/plugins/todo-list/index'; 10 | import '@kangc/v-md-editor/lib/plugins/todo-list/todo-list.css'; 11 | //提示信息 12 | import createTipPlugin from '@kangc/v-md-editor/lib/plugins/tip/index'; 13 | import '@kangc/v-md-editor/lib/plugins/tip/tip.css'; 14 | // highlightjs 15 | import hljs from 'highlight.js'; 16 | 17 | VMdPreview.use(githubTheme, { 18 | Hljs: hljs, 19 | }); 20 | VMdPreview.use(createTodoListPlugin()); 21 | VMdPreview.use(createTipPlugin()); 22 | 23 | export const setupMdPreview = async (app: App) => { 24 | app.use(VMdPreview) 25 | } 26 | -------------------------------------------------------------------------------- /src/plugins/svgIcon/index.ts: -------------------------------------------------------------------------------- 1 | import 'virtual:svg-icons-register' 2 | 3 | import '@purge-icons/generated' 4 | -------------------------------------------------------------------------------- /src/plugins/tongji/index.ts: -------------------------------------------------------------------------------- 1 | import router from '@/router' 2 | 3 | // 用于 router push 4 | window._hmt = window._hmt || [] 5 | // HM_ID 6 | const HM_ID = import.meta.env.VITE_APP_BAIDU_CODE 7 | ;(function () { 8 | // 有值的时候,才开启 9 | if (!HM_ID) { 10 | return 11 | } 12 | const hm = document.createElement('script') 13 | hm.src = 'https://hm.baidu.com/hm.js?' + HM_ID 14 | const s = document.getElementsByTagName('script')[0] 15 | s.parentNode.insertBefore(hm, s) 16 | })() 17 | 18 | router.afterEach(function (to) { 19 | if (!HM_ID) { 20 | return 21 | } 22 | _hmt.push(['_trackPageview', to.fullPath]) 23 | }) 24 | -------------------------------------------------------------------------------- /src/plugins/unocss/index.ts: -------------------------------------------------------------------------------- 1 | import 'virtual:uno.css' 2 | -------------------------------------------------------------------------------- /src/plugins/vueI18n/helper.ts: -------------------------------------------------------------------------------- 1 | export const setHtmlPageLang = (locale: LocaleType) => { 2 | document.querySelector('html')?.setAttribute('lang', locale) 3 | } 4 | -------------------------------------------------------------------------------- /src/plugins/vueI18n/index.ts: -------------------------------------------------------------------------------- 1 | import type { App } from 'vue' 2 | import { createI18n } from 'vue-i18n' 3 | import { useLocaleStoreWithOut } from '@/store/modules/locale' 4 | import type { I18n, I18nOptions } from 'vue-i18n' 5 | import { setHtmlPageLang } from './helper' 6 | 7 | export let i18n: ReturnType 8 | 9 | const createI18nOptions = async (): Promise => { 10 | const localeStore = useLocaleStoreWithOut() 11 | const locale = localeStore.getCurrentLocale 12 | const localeMap = localeStore.getLocaleMap 13 | const defaultLocal = await import(`../../locales/${locale.lang}.ts`) 14 | const message = defaultLocal.default ?? {} 15 | 16 | setHtmlPageLang(locale.lang) 17 | 18 | localeStore.setCurrentLocale({ 19 | lang: locale.lang 20 | // elLocale: elLocal 21 | }) 22 | 23 | return { 24 | legacy: false, 25 | locale: locale.lang, 26 | fallbackLocale: locale.lang, 27 | messages: { 28 | [locale.lang]: message 29 | }, 30 | availableLocales: localeMap.map((v) => v.lang), 31 | sync: true, 32 | silentTranslationWarn: true, 33 | missingWarn: false, 34 | silentFallbackWarn: true 35 | } 36 | } 37 | 38 | export const setupI18n = async (app: App) => { 39 | const options = await createI18nOptions() 40 | i18n = createI18n(options) as I18n 41 | app.use(i18n) 42 | } 43 | -------------------------------------------------------------------------------- /src/router/index.ts: -------------------------------------------------------------------------------- 1 | import type { App } from 'vue' 2 | import type { RouteRecordRaw } from 'vue-router' 3 | import { createRouter, createWebHistory } from 'vue-router' 4 | import remainingRouter from './modules/remaining' 5 | 6 | // 创建路由实例 7 | const router = createRouter({ 8 | history: createWebHistory(import.meta.env.VITE_BASE_PATH), // createWebHashHistory URL带#,createWebHistory URL不带# 9 | strict: true, 10 | routes: remainingRouter as RouteRecordRaw[], 11 | scrollBehavior: () => ({ left: 0, top: 0 }) 12 | }) 13 | 14 | export const resetRouter = (): void => { 15 | const resetWhiteNameList = ['Redirect', 'Login', 'NoFind', 'Root'] 16 | router.getRoutes().forEach((route) => { 17 | const { name } = route 18 | if (name && !resetWhiteNameList.includes(name as string)) { 19 | router.hasRoute(name) && router.removeRoute(name) 20 | } 21 | }) 22 | } 23 | 24 | export const setupRouter = (app: App) => { 25 | app.use(router) 26 | } 27 | 28 | export default router 29 | -------------------------------------------------------------------------------- /src/store/index.ts: -------------------------------------------------------------------------------- 1 | import type { App } from 'vue' 2 | import { createPinia } from 'pinia' 3 | import piniaPluginPersistedstate from 'pinia-plugin-persistedstate' 4 | 5 | const store = createPinia() 6 | 7 | store.use(piniaPluginPersistedstate) 8 | 9 | export const setupStore = (app: App) => { 10 | app.use(store) 11 | } 12 | 13 | export { store } 14 | -------------------------------------------------------------------------------- /src/styles/global.module.scss: -------------------------------------------------------------------------------- 1 | @import './variables.scss'; 2 | // 导出变量 3 | :export { 4 | namespace: $namespace; 5 | elNamespace: $elNamespace; 6 | } 7 | -------------------------------------------------------------------------------- /src/styles/mixin.scss: -------------------------------------------------------------------------------- 1 | @mixin scrollBar { 2 | ::-webkit-scrollbar-track-piece { 3 | background-color: transparent; 4 | } 5 | ::-webkit-scrollbar { 6 | width: 7px; 7 | height: 7px; 8 | background-color: transparent; 9 | } 10 | ::-webkit-scrollbar-thumb { 11 | border-radius: 5px; 12 | background-color: hsla(220, 4%, 58%, .3); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/styles/theme.scss: -------------------------------------------------------------------------------- 1 | // .text-color { 2 | // color: var(--el-text-color-regular); 3 | // } 4 | // .dark .dark\:text-color { 5 | // color: rgba(255, 255, 255, var(--dark-text-color)); 6 | // } 7 | -------------------------------------------------------------------------------- /src/styles/var.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --login-bg-color: #293146; 3 | 4 | --left-menu-max-width: 200px; 5 | 6 | --left-menu-min-width: 64px; 7 | 8 | --left-menu-bg-color: #001529; 9 | 10 | --left-menu-bg-light-color: #0f2438; 11 | 12 | --left-menu-bg-active-color: var(--el-color-primary); 13 | 14 | --left-menu-text-color: #bfcbd9; 15 | 16 | --left-menu-text-active-color: #fff; 17 | 18 | --left-menu-collapse-bg-active-color: var(--el-color-primary); 19 | /* left menu end */ 20 | 21 | /* logo start */ 22 | --logo-height: 50px; 23 | 24 | --logo-title-text-color: #fff; 25 | /* logo end */ 26 | 27 | /* header start */ 28 | --top-header-bg-color: '#fff'; 29 | 30 | --top-header-text-color: 'inherit'; 31 | 32 | --top-header-hover-color: #f6f6f6; 33 | 34 | --top-tool-height: var(--logo-height); 35 | 36 | --top-tool-p-x: 0; 37 | 38 | --tags-view-height: 35px; 39 | /* header start */ 40 | 41 | /* tab menu start */ 42 | --tab-menu-max-width: 80px; 43 | 44 | --tab-menu-min-width: 30px; 45 | 46 | --tab-menu-collapse-height: 36px; 47 | /* tab menu end */ 48 | 49 | --app-content-padding: 20px; 50 | 51 | --app-content-bg-color: #f5f7f9; 52 | 53 | --app-footer-height: 50px; 54 | 55 | --transition-time-02: 0.2s; 56 | } 57 | 58 | .dark { 59 | --app-content-bg-color: var(--el-bg-color); 60 | } 61 | 62 | html, 63 | body { 64 | -webkit-font-smoothing: antialiased; 65 | -moz-osx-font-smoothing: grayscale; 66 | } 67 | -------------------------------------------------------------------------------- /src/styles/variables.scss: -------------------------------------------------------------------------------- 1 | // 命名空间 2 | $namespace: v; 3 | // el命名空间 4 | $elNamespace: el; 5 | -------------------------------------------------------------------------------- /src/types/components.d.ts: -------------------------------------------------------------------------------- 1 | export type ComponentName = 2 | | 'Radio' 3 | | 'RadioButton' 4 | | 'Checkbox' 5 | | 'CheckboxButton' 6 | | 'Input' 7 | | 'Autocomplete' 8 | | 'InputNumber' 9 | | 'Select' 10 | | 'Cascader' 11 | | 'Switch' 12 | | 'Slider' 13 | | 'TimePicker' 14 | | 'DatePicker' 15 | | 'Rate' 16 | | 'ColorPicker' 17 | | 'Transfer' 18 | | 'Divider' 19 | | 'TimeSelect' 20 | | 'SelectV2' 21 | | 'TreeSelect' 22 | | 'InputPassword' 23 | | 'UploadImg' 24 | | 'UploadImgs' 25 | | 'UploadFile' 26 | 27 | export type ColProps = { 28 | span?: number 29 | xs?: number 30 | sm?: number 31 | md?: number 32 | lg?: number 33 | xl?: number 34 | tag?: string 35 | } 36 | 37 | export type ComponentOptions = { 38 | label?: string 39 | value?: FormValueType 40 | disabled?: boolean 41 | key?: string | number 42 | children?: ComponentOptions[] 43 | options?: ComponentOptions[] 44 | } & Recordable 45 | 46 | export type ComponentOptionsAlias = { 47 | labelField?: string 48 | valueField?: string 49 | } 50 | 51 | export type ComponentProps = { 52 | optionsAlias?: ComponentOptionsAlias 53 | options?: ComponentOptions[] 54 | optionsSlot?: boolean 55 | } & Recordable 56 | -------------------------------------------------------------------------------- /src/types/configGlobal.d.ts: -------------------------------------------------------------------------------- 1 | import { ElementPlusSize } from './elementPlus' 2 | export interface ConfigGlobalTypes { 3 | size?: ElementPlusSize 4 | } 5 | -------------------------------------------------------------------------------- /src/types/contextMenu.d.ts: -------------------------------------------------------------------------------- 1 | export type contextMenuSchema = { 2 | disabled?: boolean 3 | divided?: boolean 4 | icon?: string 5 | label: string 6 | command?: (item: contextMenuSchema) => void 7 | } 8 | -------------------------------------------------------------------------------- /src/types/elementPlus.d.ts: -------------------------------------------------------------------------------- 1 | export type ElementPlusSize = 'default' | 'small' | 'large' 2 | 3 | export type ElementPlusInfoType = 'success' | 'info' | 'warning' | 'danger' 4 | -------------------------------------------------------------------------------- /src/types/icon.d.ts: -------------------------------------------------------------------------------- 1 | export interface IconTypes { 2 | size?: number 3 | color?: string 4 | icon: string 5 | } 6 | -------------------------------------------------------------------------------- /src/types/infoTip.d.ts: -------------------------------------------------------------------------------- 1 | export interface TipSchema { 2 | label: string 3 | keys?: string[] 4 | } 5 | -------------------------------------------------------------------------------- /src/types/layout.d.ts: -------------------------------------------------------------------------------- 1 | export type LayoutType = 'classic' | 'topLeft' | 'top' | 'cutMenu' 2 | -------------------------------------------------------------------------------- /src/types/localeDropdown.d.ts: -------------------------------------------------------------------------------- 1 | export interface Language { 2 | el: Recordable 3 | name: string 4 | } 5 | 6 | export interface LocaleDropdownType { 7 | lang: LocaleType 8 | name?: string 9 | elLocale?: Language 10 | } 11 | -------------------------------------------------------------------------------- /src/types/qrcode.d.ts: -------------------------------------------------------------------------------- 1 | export interface QrcodeLogo { 2 | src?: string 3 | logoSize?: number 4 | bgColor?: string 5 | borderSize?: number 6 | crossOrigin?: string 7 | borderRadius?: number 8 | logoRadius?: number 9 | } 10 | -------------------------------------------------------------------------------- /src/types/theme.d.ts: -------------------------------------------------------------------------------- 1 | export type ThemeTypes = { 2 | elColorPrimary?: string 3 | leftMenuBorderColor?: string 4 | leftMenuBgColor?: string 5 | leftMenuBgLightColor?: string 6 | leftMenuBgActiveColor?: string 7 | leftMenuCollapseBgActiveColor?: string 8 | leftMenuTextColor?: string 9 | leftMenuTextActiveColor?: string 10 | logoTitleTextColor?: string 11 | logoBorderColor?: string 12 | topHeaderBgColor?: string 13 | topHeaderTextColor?: string 14 | topHeaderHoverColor?: string 15 | topToolBorderColor?: string 16 | } 17 | 18 | 19 | export type DarkBeforeColor = { 20 | menu: string 21 | topHeader: string 22 | } 23 | -------------------------------------------------------------------------------- /src/utils/download.ts: -------------------------------------------------------------------------------- 1 | const download0 = (data: Blob, fileName: string, mineType: string) => { 2 | // 创建 blob 3 | const blob = new Blob([data], { type: mineType }) 4 | // 创建 href 超链接,点击进行下载 5 | window.URL = window.URL || window.webkitURL 6 | const href = URL.createObjectURL(blob) 7 | const downA = document.createElement('a') 8 | downA.href = href 9 | downA.download = fileName 10 | downA.click() 11 | // 销毁超连接 12 | window.URL.revokeObjectURL(href) 13 | } 14 | 15 | const download = { 16 | // 下载 Excel 方法 17 | excel: (data: Blob, fileName: string, type?: 'xls' | 'xlsx') => { 18 | download0(data, fileName, type == 'xlsx' ? 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' : 'application/vnd.ms-excel') 19 | }, 20 | // 下载 Word 方法 21 | word: (data: Blob, fileName: string) => { 22 | download0(data, fileName, 'application/msword') 23 | }, 24 | // 下载 Zip 方法 25 | zip: (data: Blob, fileName: string) => { 26 | download0(data, fileName, 'application/zip') 27 | }, 28 | // 下载 Html 方法 29 | html: (data: Blob, fileName: string) => { 30 | download0(data, fileName, 'text/html') 31 | }, 32 | // 下载 Markdown 方法 33 | markdown: (data: Blob, fileName: string) => { 34 | download0(data, fileName, 'text/markdown') 35 | } 36 | } 37 | 38 | export default download 39 | -------------------------------------------------------------------------------- /src/utils/formRules.ts: -------------------------------------------------------------------------------- 1 | const { t } = useI18n() 2 | 3 | // 必填项 4 | export const required = { 5 | required: true, 6 | message: t('common.required') 7 | } 8 | -------------------------------------------------------------------------------- /src/utils/formatter.ts: -------------------------------------------------------------------------------- 1 | import { floatToFixed2 } from '@/utils' 2 | 3 | // 格式化金额【分转元】 4 | // @ts-ignore 5 | export const fenToYuanFormat = (_, __, cellValue: any, ___) => { 6 | return `¥${floatToFixed2(cellValue)}` 7 | } 8 | -------------------------------------------------------------------------------- /src/utils/jsencrypt.ts: -------------------------------------------------------------------------------- 1 | import { JSEncrypt } from 'jsencrypt' 2 | 3 | // 密钥对生成 http://web.chacuo.net/netrsakeypair 4 | 5 | const publicKey = 6 | 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdH\n' + 7 | 'nzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ==' 8 | 9 | const privateKey = 10 | 'MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAqhHyZfSsYourNxaY\n' + 11 | '7Nt+PrgrxkiA50efORdI5U5lsW79MmFnusUA355oaSXcLhu5xxB38SMSyP2KvuKN\n' + 12 | 'PuH3owIDAQABAkAfoiLyL+Z4lf4Myxk6xUDgLaWGximj20CUf+5BKKnlrK+Ed8gA\n' + 13 | 'kM0HqoTt2UZwA5E2MzS4EI2gjfQhz5X28uqxAiEA3wNFxfrCZlSZHb0gn2zDpWow\n' + 14 | 'cSxQAgiCstxGUoOqlW8CIQDDOerGKH5OmCJ4Z21v+F25WaHYPxCFMvwxpcw99Ecv\n' + 15 | 'DQIgIdhDTIqD2jfYjPTY8Jj3EDGPbH2HHuffvflECt3Ek60CIQCFRlCkHpi7hthh\n' + 16 | 'YhovyloRYsM+IS9h/0BzlEAuO0ktMQIgSPT3aFAgJYwKpqRYKlLDVcflZFCKY7u3\n' + 17 | 'UP8iWi1Qw0Y=' 18 | 19 | // 加密 20 | export const encrypt = (txt: string) => { 21 | const encryptor = new JSEncrypt() 22 | encryptor.setPublicKey(publicKey) // 设置公钥 23 | return encryptor.encrypt(txt) // 对数据进行加密 24 | } 25 | 26 | // 解密 27 | export const decrypt = (txt: string) => { 28 | const encryptor = new JSEncrypt() 29 | encryptor.setPrivateKey(privateKey) // 设置私钥 30 | return encryptor.decrypt(txt) // 对数据进行解密 31 | } 32 | -------------------------------------------------------------------------------- /src/utils/lowDesign.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | /** 4 | * 对字符串函数的内容进行格式化 5 | * @param strFun 字符串函数 6 | */ 7 | export const formattingStrFunction = (strFun) => { 8 | if (import.meta.env.PROD) strFun = strFun.replace(/console\.log/g, '//console.log') 9 | strFun = strFun.replace(/(? ((callData?:object) => object | void) | boolean = (strFun) => { 20 | strFun = formattingStrFunction(strFun) 21 | try { 22 | return eval(`(${strFun})`) 23 | } catch (error) { 24 | setTimeout(() => { console.error(error) }); 25 | return false 26 | } 27 | } 28 | 29 | /** 30 | * 解析字符串对象 31 | * @param strObj 字符串对象 32 | * @param errTip 解析错误提示文本 33 | * @param callData 字符串对象内部可用值/方法 34 | */ 35 | export const handleStrObj: (strObj: string, errTip?: string,callData?:object) => object = (strObj, errTip,callData) => { 36 | const fun = analysisStrFunction(`function getData(callData){ 37 | ${strObj} 38 | }`) 39 | if (typeof fun == 'boolean') { 40 | console.warn(errTip) 41 | return {} 42 | } 43 | const obj = fun(callData) 44 | if (obj instanceof Object) return obj 45 | return {} 46 | } -------------------------------------------------------------------------------- /src/utils/permission.ts: -------------------------------------------------------------------------------- 1 | import { CACHE_KEY, useCache } from '@/hooks/web/useCache' 2 | 3 | const { t } = useI18n() // 国际化 4 | 5 | /** 6 | * 字符权限校验 7 | * @param {Array} value 校验值 8 | * @returns {Boolean} 9 | */ 10 | export function checkPermi(value: string[]) { 11 | if (value && value instanceof Array && value.length > 0) { 12 | const { wsCache } = useCache() 13 | const permissionDatas = value 14 | const all_permission = '*:*:*' 15 | const permissions = wsCache.get(CACHE_KEY.USER).permissions 16 | let hasPermission = false 17 | permissionDatas.forEach(permiKey => { 18 | if (all_permission === permiKey || permissions[permiKey]) hasPermission = true 19 | }) 20 | return hasPermission 21 | } else { 22 | console.error(t('permission.hasPermission')) 23 | return false 24 | } 25 | } 26 | 27 | /** 28 | * 角色权限校验 29 | * @param {string[]} value 校验值 30 | * @returns {Boolean} 31 | */ 32 | export function checkRole(value: string[]) { 33 | if (value && value instanceof Array && value.length > 0) { 34 | const { wsCache } = useCache() 35 | const permissionRoles = value 36 | const super_admin = 'admin' 37 | const roles = wsCache.get(CACHE_KEY.USER).roles 38 | const hasRole = roles.some((role) => { 39 | return super_admin === role || permissionRoles.includes(role) 40 | }) 41 | return !!hasRole 42 | } else { 43 | console.error(t('permission.hasRole')) 44 | return false 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/utils/propTypes.ts: -------------------------------------------------------------------------------- 1 | import { VueTypeValidableDef, VueTypesInterface, createTypes, toValidableType } from 'vue-types' 2 | import { CSSProperties } from 'vue' 3 | 4 | type PropTypes = VueTypesInterface & { 5 | readonly style: VueTypeValidableDef 6 | } 7 | const newPropTypes = createTypes({ 8 | func: undefined, 9 | bool: undefined, 10 | string: undefined, 11 | number: undefined, 12 | object: undefined, 13 | integer: undefined 14 | }) as PropTypes 15 | 16 | class propTypes extends newPropTypes { 17 | static get style() { 18 | return toValidableType('style', { 19 | type: [String, Object] 20 | }) 21 | } 22 | } 23 | 24 | export { propTypes } 25 | -------------------------------------------------------------------------------- /src/utils/symbols.ts: -------------------------------------------------------------------------------- 1 | 2 | import { DictTypeVO } from '@/api/system/dict/dict.type' 3 | import { exampleType } from '@/components/LowDesign/src/utils/example' 4 | import { RouteLocationNormalizedLoaded, Router } from 'vue-router' 5 | 6 | interface ParentData { 7 | type: string 8 | prop: string 9 | tabsIndex: number | null 10 | } 11 | 12 | export interface lowFormDesignType { 13 | formOption: Ref 14 | parentData: Ref 15 | dictOptions: Ref 16 | tableDbOptions: Ref 17 | tableSubDb: Ref, 18 | tableSubDbOptions: Ref 19 | example: exampleType 20 | setParentData: (type: string, prop: string, tabsIndex?: number | null) => void 21 | historyCommit: () => void 22 | setConfigTab: (type: 'control' | 'form') => void 23 | } 24 | export interface LowFormType { 25 | controlObj: Ref 26 | rulesObj: Ref 27 | useFun: object 28 | useImport: object 29 | enhanceData: object 30 | message: object, 31 | formData: Ref 32 | viewLoading: Ref 33 | rendControlData: Ref 34 | Vue: any 35 | route: RouteLocationNormalizedLoaded 36 | routes: Router 37 | getComponent: () => Ref 38 | enhanceErrorTip: (tip: string, error) => any 39 | handleMonacoEditorClick: (params: object, fun: Function) => any 40 | } 41 | export const lowFormDesignKey = Symbol('lowFormDesign') 42 | export const lowFormKey = Symbol('lowFormKey') 43 | -------------------------------------------------------------------------------- /src/utils/tsxHelper.ts: -------------------------------------------------------------------------------- 1 | import { Slots } from 'vue' 2 | import { isFunction } from '@/utils/is' 3 | 4 | export const getSlot = (slots: Slots, slot = 'default', data?: Recordable) => { 5 | // Reflect.has 判断一个对象是否存在某个属性 6 | if (!slots || !Reflect.has(slots, slot)) { 7 | return null 8 | } 9 | if (!isFunction(slots[slot])) { 10 | console.error(`${slot} is not a function!`) 11 | return null 12 | } 13 | const slotFn = slots[slot] 14 | if (!slotFn) return null 15 | return slotFn(data) 16 | } 17 | -------------------------------------------------------------------------------- /src/views/Error/403.vue: -------------------------------------------------------------------------------- 1 | 4 | 9 | -------------------------------------------------------------------------------- /src/views/Error/404.vue: -------------------------------------------------------------------------------- 1 | 4 | 8 | -------------------------------------------------------------------------------- /src/views/Error/500.vue: -------------------------------------------------------------------------------- 1 | 4 | 8 | -------------------------------------------------------------------------------- /src/views/Home/types.ts: -------------------------------------------------------------------------------- 1 | export type WorkplaceTotal = { 2 | project: number 3 | access: number 4 | todo: number 5 | } 6 | 7 | export type Project = { 8 | name: string 9 | icon: string 10 | message: string 11 | personal: string 12 | time: Date | number | string 13 | } 14 | 15 | export type Notice = { 16 | title: string 17 | type: string 18 | keys: string[] 19 | date: Date | number | string 20 | } 21 | 22 | export type Shortcut = { 23 | name: string 24 | icon: string 25 | url: string 26 | } 27 | 28 | export type RadarData = { 29 | personal: number 30 | team: number 31 | max: number 32 | name: string 33 | } 34 | export type AnalysisTotalTypes = { 35 | users: number 36 | messages: number 37 | moneys: number 38 | shoppings: number 39 | } 40 | 41 | export type UserAccessSource = { 42 | value: number 43 | name: string 44 | } 45 | 46 | export type WeeklyUserActivity = { 47 | value: number 48 | name: string 49 | } 50 | 51 | export type MonthlySales = { 52 | name: string 53 | estimate: number 54 | actual: number 55 | } 56 | -------------------------------------------------------------------------------- /src/views/Login/components/LoginFormTitle.vue: -------------------------------------------------------------------------------- 1 | 6 | 27 | -------------------------------------------------------------------------------- /src/views/Login/components/QrCodeForm.vue: -------------------------------------------------------------------------------- 1 | 23 | 35 | -------------------------------------------------------------------------------- /src/views/Login/components/index.ts: -------------------------------------------------------------------------------- 1 | import LoginForm from './LoginForm.vue' 2 | import MobileForm from './MobileForm.vue' 3 | import LoginFormTitle from './LoginFormTitle.vue' 4 | import QrCodeForm from './QrCodeForm.vue' 5 | import SSOLoginVue from './SSOLogin.vue' 6 | 7 | export { LoginForm, MobileForm, LoginFormTitle, QrCodeForm, SSOLoginVue } 8 | -------------------------------------------------------------------------------- /src/views/Login/components/useLogin.ts: -------------------------------------------------------------------------------- 1 | import { Ref } from 'vue' 2 | 3 | export enum LoginStateEnum { 4 | LOGIN, 5 | REGISTER, 6 | RESET_PASSWORD, 7 | MOBILE, 8 | QR_CODE, 9 | SSO 10 | } 11 | 12 | const currentState = ref(LoginStateEnum.LOGIN) 13 | 14 | export function useLoginState() { 15 | function setLoginState(state: LoginStateEnum) { 16 | currentState.value = state 17 | } 18 | const getLoginState = computed(() => currentState.value) 19 | 20 | function handleBackLogin() { 21 | setLoginState(LoginStateEnum.LOGIN) 22 | } 23 | 24 | return { 25 | setLoginState, 26 | getLoginState, 27 | handleBackLogin 28 | } 29 | } 30 | 31 | export function useFormValid(formRef: Ref) { 32 | async function validForm() { 33 | const form = unref(formRef) 34 | if (!form) return 35 | const data = await form.validate() 36 | return data as T 37 | } 38 | 39 | return { 40 | validForm 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/views/Profile/components/UserAvatar.vue: -------------------------------------------------------------------------------- 1 | 13 | 36 | 37 | 46 | -------------------------------------------------------------------------------- /src/views/Profile/components/index.ts: -------------------------------------------------------------------------------- 1 | import BasicInfo from './BasicInfo.vue' 2 | import ProfileUser from './ProfileUser.vue' 3 | import ResetPwd from './ResetPwd.vue' 4 | import UserAvatarVue from './UserAvatar.vue' 5 | import UserSocial from './UserSocial.vue' 6 | 7 | export { BasicInfo, ProfileUser, ResetPwd, UserAvatarVue, UserSocial } 8 | -------------------------------------------------------------------------------- /src/views/Redirect/Redirect.vue: -------------------------------------------------------------------------------- 1 | 4 | 29 | -------------------------------------------------------------------------------- /src/views/infra/druid/index.vue: -------------------------------------------------------------------------------- 1 |