├── .stylelintignore ├── .gitattributes ├── .prettierrc.mjs ├── internal ├── vite-config │ ├── src │ │ ├── index.ts │ │ ├── utils │ │ │ └── Hash.ts │ │ ├── plugins │ │ │ ├── Html.ts │ │ │ ├── Visualizer.ts │ │ │ └── SvgSprite.ts │ │ └── config │ │ │ └── Common.ts │ ├── tsconfig.json │ └── build.config.ts ├── eslint-config │ ├── build.config.ts │ ├── tsconfig.json │ └── src │ │ ├── configs │ │ ├── Command.ts │ │ ├── index.ts │ │ ├── Turbo.ts │ │ ├── Prettier.ts │ │ ├── Regexp.ts │ │ ├── Comments.ts │ │ └── Disableds.ts │ │ ├── Util.ts │ │ └── index.ts ├── ts-config │ ├── vue-app.json │ ├── node.json │ ├── library.json │ ├── web.json │ ├── node-server.json │ ├── package.json │ └── base.json └── prettier-config │ ├── package.json │ └── index.mjs ├── packages ├── core │ ├── src │ │ ├── components │ │ │ ├── Tree │ │ │ │ ├── style │ │ │ │ │ └── index.ts │ │ │ │ ├── index.ts │ │ │ │ └── src │ │ │ │ │ └── TreeIcon.ts │ │ │ ├── Split │ │ │ │ └── index.ts │ │ │ ├── CodeEditor │ │ │ │ ├── src │ │ │ │ │ ├── Typing.ts │ │ │ │ │ └── json-preview │ │ │ │ │ │ └── JsonPreview.vue │ │ │ │ └── index.ts │ │ │ ├── ContextMenu │ │ │ │ ├── index.ts │ │ │ │ └── src │ │ │ │ │ └── Typing.ts │ │ │ ├── CountTo │ │ │ │ └── index.ts │ │ │ ├── CardList │ │ │ │ ├── index.ts │ │ │ │ └── src │ │ │ │ │ └── data.ts │ │ │ ├── Form │ │ │ │ ├── src │ │ │ │ │ ├── components │ │ │ │ │ │ └── EmptyCol.vue │ │ │ │ │ ├── types │ │ │ │ │ │ └── Hooks.ts │ │ │ │ │ └── hooks │ │ │ │ │ │ ├── UseFormContext.ts │ │ │ │ │ │ └── UseComponentRegister.ts │ │ │ │ └── index.ts │ │ │ ├── DragTree │ │ │ │ └── index.ts │ │ │ ├── Loading │ │ │ │ ├── index.ts │ │ │ │ └── src │ │ │ │ │ └── Typing.ts │ │ │ ├── DictTag │ │ │ │ └── index.ts │ │ │ ├── Scrollbar │ │ │ │ ├── index.ts │ │ │ │ └── src │ │ │ │ │ └── types.d.ts │ │ │ ├── StrengthMeter │ │ │ │ └── index.ts │ │ │ ├── Cropper │ │ │ │ ├── src │ │ │ │ │ └── typing.ts │ │ │ │ └── index.ts │ │ │ ├── Dropdown │ │ │ │ ├── index.ts │ │ │ │ └── src │ │ │ │ │ └── typing.ts │ │ │ ├── Draggable │ │ │ │ ├── index.ts │ │ │ │ └── DraggableType.ts │ │ │ ├── Upload │ │ │ │ ├── index.ts │ │ │ │ └── src │ │ │ │ │ └── ThumbUrl.vue │ │ │ ├── Icon │ │ │ │ └── index.ts │ │ │ ├── Description │ │ │ │ └── index.ts │ │ │ ├── Drawer │ │ │ │ └── index.ts │ │ │ ├── FileUpDown │ │ │ │ └── index.ts │ │ │ ├── CountDown │ │ │ │ └── index.ts │ │ │ ├── Table │ │ │ │ ├── src │ │ │ │ │ ├── types │ │ │ │ │ │ └── ComponentType.ts │ │ │ │ │ ├── components │ │ │ │ │ │ ├── EditTableHeaderIcon.vue │ │ │ │ │ │ ├── settings │ │ │ │ │ │ │ ├── RedoSetting.vue │ │ │ │ │ │ │ └── FullScreenSetting.vue │ │ │ │ │ │ └── editable │ │ │ │ │ │ │ └── Helper.ts │ │ │ │ │ ├── hooks │ │ │ │ │ │ ├── UseLoading.ts │ │ │ │ │ │ ├── UseTableContext.ts │ │ │ │ │ │ └── UseTableStyle.ts │ │ │ │ │ ├── Helper.ts │ │ │ │ │ └── Const.ts │ │ │ │ └── index.ts │ │ │ ├── Modal │ │ │ │ ├── index.ts │ │ │ │ └── src │ │ │ │ │ ├── hooks │ │ │ │ │ ├── UseModalContext.ts │ │ │ │ │ └── UseModalFullScreen.ts │ │ │ │ │ ├── components │ │ │ │ │ ├── ModalHeader.vue │ │ │ │ │ └── ModalFooter.vue │ │ │ │ │ └── index.less │ │ │ ├── Basic │ │ │ │ └── index.ts │ │ │ ├── RegisterGlobComponent.ts │ │ │ ├── Button │ │ │ │ ├── index.ts │ │ │ │ └── src │ │ │ │ │ └── props.ts │ │ │ └── Container │ │ │ │ ├── index.ts │ │ │ │ └── src │ │ │ │ └── typing.ts │ │ ├── assets │ │ │ └── images │ │ │ │ ├── logo.png │ │ │ │ └── noImage.png │ │ ├── utils │ │ │ ├── Uuid.ts │ │ │ ├── Utils.ts │ │ │ ├── Log.ts │ │ │ ├── HBuildUtils.ts │ │ │ ├── DateUtil.ts │ │ │ ├── http │ │ │ │ └── axios │ │ │ │ │ └── AxiosRetry.ts │ │ │ ├── OutsideOpenUtils.ts │ │ │ ├── auth │ │ │ │ └── index.ts │ │ │ └── helper │ │ │ │ └── TsxHelper.tsx │ │ ├── logics │ │ │ ├── theme │ │ │ │ ├── UpdateGrayMode.ts │ │ │ │ ├── UpdateColorWeak.ts │ │ │ │ ├── Util.ts │ │ │ │ ├── UpdateTheme.ts │ │ │ │ └── Dark.ts │ │ │ └── mitt │ │ │ │ └── RouteChange.ts │ │ ├── hooks │ │ │ ├── UseDesign.ts │ │ │ ├── core │ │ │ │ ├── OnMountedOrActivated.ts │ │ │ │ └── UseRefs.ts │ │ │ ├── web │ │ │ │ └── UseContextMenu.ts │ │ │ ├── UseAppContext.ts │ │ │ ├── component │ │ │ │ └── UsePageContext.ts │ │ │ ├── setting │ │ │ │ ├── UseMultipleTabSetting.ts │ │ │ │ └── UseFullContent.ts │ │ │ └── event │ │ │ │ └── UseWindowSizeFn.ts │ │ ├── i18n │ │ │ └── lang │ │ │ │ ├── en.ts │ │ │ │ ├── zh-CN.ts │ │ │ │ ├── zh-CN │ │ │ │ └── Common.ts │ │ │ │ └── en │ │ │ │ └── Common.ts │ │ ├── settings │ │ │ ├── EncryptionSetting.ts │ │ │ ├── SiteSetting.ts │ │ │ └── I18nSetting.ts │ │ ├── enums │ │ │ ├── index.ts │ │ │ ├── SizeEnum.ts │ │ │ ├── PageEnum.ts │ │ │ ├── ExceptionEnum.ts │ │ │ ├── BreakpointEnum.ts │ │ │ ├── HttpEnum.ts │ │ │ ├── CacheEnum.ts │ │ │ └── AppEnum.ts │ │ ├── directives │ │ │ ├── index.ts │ │ │ ├── ripple │ │ │ │ └── index.less │ │ │ └── Permission.ts │ │ ├── api │ │ │ ├── model │ │ │ │ └── BaseModel.ts │ │ │ ├── storage │ │ │ │ ├── model │ │ │ │ │ └── SysFileModel.ts │ │ │ │ └── Upload.ts │ │ │ ├── sys │ │ │ │ └── model │ │ │ │ │ ├── DictItemModel.ts │ │ │ │ │ ├── RoleModel.ts │ │ │ │ │ ├── DictCategoryModel.ts │ │ │ │ │ ├── SsoTenantModel.ts │ │ │ │ │ └── OrgModel.ts │ │ │ └── index.ts │ │ └── router │ │ │ ├── guard │ │ │ ├── ParamMenuGuard.ts │ │ │ └── StateGuard.ts │ │ │ └── Constant.ts │ └── tsconfig.json ├── styles │ ├── src │ │ ├── config.less │ │ ├── dark.less │ │ ├── transition │ │ │ ├── base.less │ │ │ ├── scale.less │ │ │ ├── index.less │ │ │ └── slide.less │ │ ├── ant │ │ │ └── input.less │ │ └── var │ │ │ ├── index.less │ │ │ ├── easing.less │ │ │ └── breakpoint.less │ ├── tsconfig.json │ └── package.json ├── types │ ├── src │ │ ├── type │ │ │ ├── utils.d.ts │ │ │ ├── global.d.ts │ │ │ └── store.d.ts │ │ └── BtnColor.ts │ ├── tsconfig.json │ └── README.md ├── nocode │ ├── core │ │ ├── MfCombineConfig.js │ │ ├── MfInputTextAreaConfig.js │ │ ├── MfDataTagStyleConfig.js │ │ ├── MfInputNumberDataConfig.js │ │ ├── MfScatterDataConfig.js │ │ ├── index5.js │ │ ├── MfPieDataConfig.js │ │ ├── MfMapChunksConfig.js │ │ ├── index10.js │ │ ├── index12.js │ │ ├── index13.js │ │ ├── index14.js │ │ ├── index15.js │ │ ├── index16.js │ │ ├── index17.js │ │ ├── index18.js │ │ ├── index19.js │ │ ├── index20.js │ │ ├── index21.js │ │ ├── index22.js │ │ ├── index23.js │ │ ├── index24.js │ │ ├── index27.js │ │ ├── index28.js │ │ ├── index30.js │ │ ├── index43.js │ │ ├── index44.js │ │ ├── index45.js │ │ ├── index46.js │ │ ├── index47.js │ │ ├── index48.js │ │ ├── index9.js │ │ ├── index31.js │ │ ├── index32.js │ │ ├── index36.js │ │ ├── index39.js │ │ ├── index49.js │ │ ├── index25.js │ │ ├── index26.js │ │ ├── index41.js │ │ ├── index38.js │ │ ├── index42.js │ │ ├── index11.js │ │ ├── index29.js │ │ ├── UseEventSelect.js │ │ ├── index35.js │ │ ├── index37.js │ │ ├── index34.js │ │ ├── MfMapScatterConfig.js │ │ ├── MfBorder4Config.js │ │ ├── index33.js │ │ ├── index40.js │ │ ├── MfDecoration8Config.js │ │ └── index54.js │ ├── tsconfig.json │ └── package.json ├── stores │ ├── tsconfig.json │ ├── src │ │ ├── index.ts │ │ └── modules │ │ │ ├── index.ts │ │ │ └── Dict.ts │ └── package.json └── custom-api │ ├── tsconfig.json │ └── package.json ├── src ├── views │ ├── sys │ │ ├── exception │ │ │ └── index.ts │ │ ├── iframe │ │ │ └── FrameBlank.vue │ │ ├── login │ │ │ └── GiteeBind.vue │ │ ├── account │ │ │ └── setting │ │ │ │ ├── TenantOrgSetting.vue │ │ │ │ ├── TenantRoleSetting.vue │ │ │ │ └── TenantUserSetting.vue │ │ ├── lock │ │ │ └── index.vue │ │ ├── database │ │ │ ├── index.vue │ │ │ └── DataBaseModal.vue │ │ ├── online │ │ │ └── online.data.ts │ │ └── redirect │ │ │ └── index.vue │ ├── demo │ │ ├── main-out │ │ │ └── index.vue │ │ └── flow-chart │ │ │ └── index.vue │ ├── nocode │ │ ├── mf-screen │ │ │ ├── frame │ │ │ │ ├── FrameChart.vue │ │ │ │ ├── FrameLayer.vue │ │ │ │ ├── FrameCanvas.vue │ │ │ │ └── FrameConfig.vue │ │ │ └── PreviewIndex.vue │ │ ├── api-folder │ │ │ └── index.vue │ │ ├── http-folder │ │ │ └── httpFolder.data.ts │ │ └── file-folder │ │ │ └── fileFolder.data.ts │ ├── workflow │ │ └── com │ │ │ ├── UseWorkflow.ts │ │ │ └── FlowImgPreview.vue │ └── dashboard │ │ └── workbench │ │ └── components │ │ └── QuickNav.vue ├── components │ ├── general │ │ ├── Menu │ │ │ ├── index.ts │ │ │ └── src │ │ │ │ ├── Types.ts │ │ │ │ ├── components │ │ │ │ └── BasicMenuItem.vue │ │ │ │ └── index.less │ │ ├── Qrcode │ │ │ ├── src │ │ │ │ ├── QrcodePlus.ts │ │ │ │ └── ToCanvas.ts │ │ │ └── index.ts │ │ ├── SimpleMenu │ │ │ ├── src │ │ │ │ ├── Types.ts │ │ │ │ └── components │ │ │ │ │ ├── UseSimpleMenuContext.ts │ │ │ │ │ └── Types.ts │ │ │ └── index.ts │ │ ├── FlowChart │ │ │ ├── index.ts │ │ │ └── src │ │ │ │ ├── Enum.ts │ │ │ │ ├── Types.ts │ │ │ │ └── UseFlowContext.ts │ │ ├── Application │ │ │ ├── src │ │ │ │ └── search │ │ │ │ │ └── AppSearchKeyItem.vue │ │ │ └── index.ts │ │ └── Page │ │ │ └── index.ts │ └── nocode │ │ └── common │ │ └── HeaderBar │ │ └── HeaderBarUtils.ts ├── api │ ├── ai │ │ ├── model │ │ │ └── AiRouterModel.ts │ │ └── AiRouter.ts │ ├── sys │ │ └── model │ │ │ ├── SysConfigModel.ts │ │ │ ├── DictModel.ts │ │ │ ├── SsoClientDetailsModel.ts │ │ │ ├── CodeBuildModel.ts │ │ │ └── SysLogModel.ts │ ├── demo │ │ ├── model │ │ │ ├── QuestionModel.ts │ │ │ ├── DemoDataScopeModel.ts │ │ │ └── DemoOrderDetailModel.ts │ │ └── chat.ts │ ├── scheduler │ │ └── model │ │ │ ├── JobSubscribeModel.ts │ │ │ ├── JobLogModel.ts │ │ │ └── JobModel.ts │ └── nocode │ │ └── model │ │ ├── MfFileModel.ts │ │ ├── FileFolderModel.ts │ │ └── HttpFolderModel.ts ├── hooks │ ├── UseAppInject.ts │ └── UseSortable.ts ├── routers │ ├── modules │ │ ├── nocode │ │ │ ├── MfApi.ts │ │ │ ├── MfScreen.ts │ │ │ ├── MfScreenPreview.ts │ │ │ └── MfScreenResource.ts │ │ └── demo │ │ │ ├── Flow.ts │ │ │ └── About.ts │ └── index.ts └── layouts │ ├── default │ ├── trigger │ │ ├── SiderTrigger.vue │ │ ├── HeaderTrigger.vue │ │ └── index.vue │ ├── tabs │ │ ├── types.ts │ │ └── components │ │ │ └── TabRedo.vue │ ├── content │ │ └── UseContentContext.ts │ ├── header │ │ └── components │ │ │ ├── index.ts │ │ │ ├── dropdown.less │ │ │ └── user-dropdown │ │ │ └── DropMenuItem.vue │ └── setting │ │ └── components │ │ └── index.ts │ └── iframe │ └── index.vue ├── public ├── favicon.ico ├── iconfont │ ├── iconfont.ttf │ ├── iconfont.woff │ └── iconfont.woff2 └── resource │ ├── img │ ├── logo.png │ ├── login-bg.png │ └── excel-data.png │ └── tinymce │ └── skins │ └── ui │ ├── oxide │ ├── fonts │ │ └── tinymce-mobile.woff │ ├── content.mobile.min.css │ └── skin.shadowdom.min.css │ └── oxide-dark │ ├── content.mobile.min.css │ └── skin.shadowdom.min.css ├── stylelint.config.mjs ├── eslint.config.mjs ├── .prettierignore ├── .env ├── uno.config.ts ├── docker-compose.yml ├── .npmrc ├── .gitlab-ci.yml ├── turbo.json ├── .env.test ├── .gitignore ├── vite.config.ts ├── Dockerfile ├── types ├── module.d.ts └── vue-router.d.ts └── tsconfig.json /.stylelintignore: -------------------------------------------------------------------------------- 1 | dist 2 | public 3 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | *.ts linguist-language=vue -------------------------------------------------------------------------------- /.prettierrc.mjs: -------------------------------------------------------------------------------- 1 | export { default } from "@mfish/prettier-config"; 2 | -------------------------------------------------------------------------------- /internal/vite-config/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./config/Application"; 2 | -------------------------------------------------------------------------------- /packages/core/src/components/Tree/style/index.ts: -------------------------------------------------------------------------------- 1 | import "./index.less"; 2 | -------------------------------------------------------------------------------- /src/views/sys/exception/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Exception } from "./Exception.vue"; 2 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mfish-qf/mfish-nocode-view/HEAD/public/favicon.ico -------------------------------------------------------------------------------- /packages/core/src/components/Split/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Split } from "./src/Split.vue"; 2 | -------------------------------------------------------------------------------- /src/components/general/Menu/index.ts: -------------------------------------------------------------------------------- 1 | export { default as BasicMenu } from "./src/BasicMenu.vue"; 2 | -------------------------------------------------------------------------------- /packages/styles/src/config.less: -------------------------------------------------------------------------------- 1 | @import (reference) "color.less"; 2 | @import (reference) "var/index.less"; 3 | -------------------------------------------------------------------------------- /stylelint.config.mjs: -------------------------------------------------------------------------------- 1 | export default { 2 | extends: ["@mfish/stylelint-config"], 3 | root: true 4 | }; 5 | -------------------------------------------------------------------------------- /public/iconfont/iconfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mfish-qf/mfish-nocode-view/HEAD/public/iconfont/iconfont.ttf -------------------------------------------------------------------------------- /public/resource/img/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mfish-qf/mfish-nocode-view/HEAD/public/resource/img/logo.png -------------------------------------------------------------------------------- /public/iconfont/iconfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mfish-qf/mfish-nocode-view/HEAD/public/iconfont/iconfont.woff -------------------------------------------------------------------------------- /public/iconfont/iconfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mfish-qf/mfish-nocode-view/HEAD/public/iconfont/iconfont.woff2 -------------------------------------------------------------------------------- /eslint.config.mjs: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | import { defineConfig } from "@mfish/eslint-config"; 3 | export default defineConfig(); 4 | -------------------------------------------------------------------------------- /public/resource/img/login-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mfish-qf/mfish-nocode-view/HEAD/public/resource/img/login-bg.png -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | /dist/* 2 | .local 3 | .output.js 4 | /node_modules/** 5 | 6 | **/*.svg 7 | **/*.sh 8 | 9 | /public/* 10 | -------------------------------------------------------------------------------- /public/resource/img/excel-data.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mfish-qf/mfish-nocode-view/HEAD/public/resource/img/excel-data.png -------------------------------------------------------------------------------- /packages/core/src/assets/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mfish-qf/mfish-nocode-view/HEAD/packages/core/src/assets/images/logo.png -------------------------------------------------------------------------------- /packages/core/src/assets/images/noImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mfish-qf/mfish-nocode-view/HEAD/packages/core/src/assets/images/noImage.png -------------------------------------------------------------------------------- /.env: -------------------------------------------------------------------------------- 1 | # port 2 | VITE_PORT = 5186 3 | 4 | # title 5 | VITE_GLOB_APP_TITLE = 摸鱼低代码平台 6 | 7 | # shortname 8 | VITE_GLOB_APP_SHORT_NAME = MFish NoCode 9 | -------------------------------------------------------------------------------- /packages/core/src/utils/Uuid.ts: -------------------------------------------------------------------------------- 1 | import { v4 } from "uuid"; 2 | 3 | export function buildUUID(): string { 4 | return v4().replaceAll("-", ""); 5 | } 6 | -------------------------------------------------------------------------------- /packages/core/src/components/CodeEditor/src/Typing.ts: -------------------------------------------------------------------------------- 1 | export enum MODE { 2 | JSON = "application/json", 3 | HTML = "htmlmixed", 4 | JS = "javascript" 5 | } 6 | -------------------------------------------------------------------------------- /src/components/general/Qrcode/src/QrcodePlus.ts: -------------------------------------------------------------------------------- 1 | // 参考 qr-code-with-logo 进行ts版本修改 2 | 3 | export * from "./Typing"; 4 | 5 | export { toCanvas } from "./ToCanvas"; 6 | -------------------------------------------------------------------------------- /packages/core/src/components/ContextMenu/index.ts: -------------------------------------------------------------------------------- 1 | export { createContextMenu, destroyContextMenu } from "./src/CreateContextMenu"; 2 | 3 | export * from "./src/Typing"; 4 | -------------------------------------------------------------------------------- /internal/vite-config/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "extends": "@mfish/ts-config/node.json", 4 | "include": ["src"] 5 | } 6 | -------------------------------------------------------------------------------- /src/components/general/SimpleMenu/src/Types.ts: -------------------------------------------------------------------------------- 1 | export interface MenuState { 2 | activeName: string; 3 | openNames: string[]; 4 | activeSubMenuNames: string[]; 5 | } 6 | -------------------------------------------------------------------------------- /src/components/general/SimpleMenu/index.ts: -------------------------------------------------------------------------------- 1 | export { default as SimpleMenu } from "./src/SimpleMenu.vue"; 2 | export { default as SimpleMenuTag } from "./src/SimpleMenuTag.vue"; 3 | -------------------------------------------------------------------------------- /src/views/sys/iframe/FrameBlank.vue: -------------------------------------------------------------------------------- 1 | 4 | 9 | -------------------------------------------------------------------------------- /uno.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig, presetTypography, presetUno } from "unocss"; 2 | 3 | export default defineConfig({ 4 | presets: [presetUno(), presetTypography()] 5 | }); 6 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | services: 2 | erp-admin-view: 3 | container_name: mfish-nocode-view 4 | image: mfish-nocode-view 5 | ports: 6 | - 11119:5186 7 | restart: always 8 | -------------------------------------------------------------------------------- /packages/core/src/components/CountTo/index.ts: -------------------------------------------------------------------------------- 1 | import { withInstall } from "@core/utils"; 2 | import countTo from "./src/CountTo.vue"; 3 | 4 | export const CountTo = withInstall(countTo); 5 | -------------------------------------------------------------------------------- /packages/types/src/type/utils.d.ts: -------------------------------------------------------------------------------- 1 | import type { ComputedRef, Ref } from "vue"; 2 | 3 | export type DynamicProps = { 4 | [P in keyof T]: Ref | T[P] | ComputedRef; 5 | }; 6 | -------------------------------------------------------------------------------- /public/resource/tinymce/skins/ui/oxide/fonts/tinymce-mobile.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mfish-qf/mfish-nocode-view/HEAD/public/resource/tinymce/skins/ui/oxide/fonts/tinymce-mobile.woff -------------------------------------------------------------------------------- /packages/core/src/components/CardList/index.ts: -------------------------------------------------------------------------------- 1 | import { withInstall } from "@core/utils"; 2 | import cardList from "./src/CardList.vue"; 3 | 4 | export const CardList = withInstall(cardList); 5 | -------------------------------------------------------------------------------- /packages/core/src/components/Form/src/components/EmptyCol.vue: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /packages/core/src/components/Form/src/types/Hooks.ts: -------------------------------------------------------------------------------- 1 | export interface AdvanceState { 2 | isAdvanced: boolean; 3 | hideAdvanceBtn: boolean; 4 | isLoad: boolean; 5 | actionSpan: number; 6 | } 7 | -------------------------------------------------------------------------------- /src/components/general/FlowChart/index.ts: -------------------------------------------------------------------------------- 1 | import { withInstall } from "@mfish/core/utils"; 2 | import flowChart from "./src/FlowChart.vue"; 3 | 4 | export const FlowChart = withInstall(flowChart); 5 | -------------------------------------------------------------------------------- /packages/core/src/components/DragTree/index.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @description: 拖动树 3 | * @author: mfish 4 | * @date: 2023/7/18 5 | */ 6 | export { default as DragFolderTree } from "./src/DragFolderTree.vue"; 7 | -------------------------------------------------------------------------------- /packages/styles/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "extends": "@mfish/ts-config/web.json", 4 | "include": ["src"], 5 | "exclude": ["node_modules"] 6 | } 7 | -------------------------------------------------------------------------------- /internal/eslint-config/build.config.ts: -------------------------------------------------------------------------------- 1 | import { defineBuildConfig } from "unbuild"; 2 | 3 | export default defineBuildConfig({ 4 | clean: true, 5 | declaration: true, 6 | entries: ["src/index"] 7 | }); 8 | -------------------------------------------------------------------------------- /internal/eslint-config/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "extends": "@mfish/ts-config/node.json", 4 | "include": ["src"], 5 | "exclude": ["node_modules"] 6 | } 7 | -------------------------------------------------------------------------------- /internal/vite-config/build.config.ts: -------------------------------------------------------------------------------- 1 | import { defineBuildConfig } from "unbuild"; 2 | 3 | export default defineBuildConfig({ 4 | clean: true, 5 | declaration: true, 6 | entries: ["src/index"] 7 | }); 8 | -------------------------------------------------------------------------------- /packages/core/src/components/Loading/index.ts: -------------------------------------------------------------------------------- 1 | export { useLoading } from "./src/UseLoading"; 2 | export { createLoading } from "./src/CreateLoading"; 3 | 4 | export { default as Loading } from "./src/Loading.vue"; 5 | -------------------------------------------------------------------------------- /packages/core/src/components/DictTag/index.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @description: 入口文件 3 | * @author: mfish 4 | * @date: 2025/4/10 5 | */ 6 | export { default as DictTag } from "./DictTag.vue"; 7 | export * from "./CommonTag"; 8 | -------------------------------------------------------------------------------- /packages/core/src/components/Scrollbar/index.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * copy from element-ui 3 | */ 4 | 5 | export type { ScrollbarType } from "./src/types"; 6 | 7 | export { default as Scrollbar } from "./src/Scrollbar.vue"; 8 | -------------------------------------------------------------------------------- /packages/core/src/components/StrengthMeter/index.ts: -------------------------------------------------------------------------------- 1 | import { withInstall } from "@core/utils"; 2 | import strengthMeter from "./src/StrengthMeter.vue"; 3 | 4 | export const StrengthMeter = withInstall(strengthMeter); 5 | -------------------------------------------------------------------------------- /src/components/general/Qrcode/index.ts: -------------------------------------------------------------------------------- 1 | import { withInstall } from "@mfish/core/utils"; 2 | import qrCode from "./src/Qrcode.vue"; 3 | 4 | export const QrCode = withInstall(qrCode); 5 | export * from "./src/Typing"; 6 | -------------------------------------------------------------------------------- /packages/core/src/components/Cropper/src/typing.ts: -------------------------------------------------------------------------------- 1 | import type Cropper from "cropperjs"; 2 | 3 | export interface CropperResult { 4 | imgBase64: string; 5 | imgInfo: Cropper.Data; 6 | } 7 | 8 | export type { Cropper }; 9 | -------------------------------------------------------------------------------- /packages/types/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "extends": "@mfish/ts-config/web.json", 4 | "include": ["src/**/*.d.ts", "src/*.ts"], 5 | "exclude": ["node_modules"] 6 | } 7 | -------------------------------------------------------------------------------- /packages/core/src/components/Dropdown/index.ts: -------------------------------------------------------------------------------- 1 | import { withInstall } from "../../utils"; 2 | import dropdown from "./src/Dropdown.vue"; 3 | 4 | export * from "./src/typing"; 5 | export const Dropdown = withInstall(dropdown); 6 | -------------------------------------------------------------------------------- /internal/eslint-config/src/configs/Command.ts: -------------------------------------------------------------------------------- 1 | import createCommand from "eslint-plugin-command/config"; 2 | 3 | export async function command() { 4 | return [ 5 | { 6 | ...createCommand() 7 | } 8 | ]; 9 | } 10 | -------------------------------------------------------------------------------- /packages/core/src/components/Draggable/index.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @description: 入口文件 3 | * @author: mfish 4 | * @date: 2025/4/10 5 | */ 6 | export { default as DraggableInput } from "./DraggableInput.vue"; 7 | export * from "./DraggableType"; 8 | -------------------------------------------------------------------------------- /packages/core/src/components/Upload/index.ts: -------------------------------------------------------------------------------- 1 | import { withInstall } from "@core/utils"; 2 | import basicUpload from "./src/BasicUpload.vue"; 3 | 4 | export const BasicUpload = withInstall(basicUpload); 5 | export * from "./src/Typing"; 6 | -------------------------------------------------------------------------------- /packages/types/src/BtnColor.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @description: 基础颜色 3 | * @author: mfish 4 | * @date: 2024/8/21 5 | */ 6 | export const colorSuccess = "#238636"; 7 | export const colorWarning = "#E6A23C"; 8 | export const colorError = "#DA3633"; 9 | -------------------------------------------------------------------------------- /packages/core/src/components/Tree/index.ts: -------------------------------------------------------------------------------- 1 | import "./style"; 2 | 3 | export type { ContextMenuItem } from "../../hooks/web/UseContextMenu"; 4 | export * from "./src/types/Tree"; 5 | 6 | export { default as BasicTree } from "./src/BasicTree.vue"; 7 | -------------------------------------------------------------------------------- /src/api/ai/model/AiRouterModel.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @description: AI路由 3 | * @author: mfish 4 | * @date: 2025-08-18 5 | * @version: V2.2.0 6 | */ 7 | export interface AiRouter { 8 | //日期 9 | path?: string; 10 | //温度 11 | name?: number; 12 | } 13 | -------------------------------------------------------------------------------- /internal/eslint-config/src/Util.ts: -------------------------------------------------------------------------------- 1 | export type Awaitable = Promise | T; 2 | 3 | export async function interopDefault(m: Awaitable): Promise { 4 | const resolved = await m; 5 | return (resolved as any).default || resolved; 6 | } 7 | -------------------------------------------------------------------------------- /packages/core/src/components/Icon/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Icon } from "./src/Icon.vue"; 2 | export { default as IconPicker } from "./src/IconPicker.vue"; 3 | export { default as SvgIcon } from "./src/SvgIcon.vue"; 4 | export { default as IconFont } from "./src/IconFont.vue"; 5 | -------------------------------------------------------------------------------- /src/components/general/FlowChart/src/Enum.ts: -------------------------------------------------------------------------------- 1 | export enum ToolbarTypeEnum { 2 | ZOOM_IN = "zoomIn", 3 | ZOOM_OUT = "zoomOut", 4 | RESET_ZOOM = "resetZoom", 5 | 6 | UNDO = "undo", 7 | REDO = "redo", 8 | 9 | SNAPSHOT = "snapshot", 10 | VIEW_DATA = "viewData" 11 | } 12 | -------------------------------------------------------------------------------- /src/views/demo/main-out/index.vue: -------------------------------------------------------------------------------- 1 | 7 | -------------------------------------------------------------------------------- /src/views/sys/login/GiteeBind.vue: -------------------------------------------------------------------------------- 1 | 6 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /packages/nocode/core/MfCombineConfig.js: -------------------------------------------------------------------------------- 1 | import { defineComponent as o, createBlock as e, openBlock as t } from "vue"; 2 | import { S as f } from "./StyleConfig.js"; 3 | const m = o({ __name: "MfCombineConfig", setup: (o2) => (o3, m2) => (t(), e(f)) }); 4 | export { 5 | m as default 6 | }; 7 | -------------------------------------------------------------------------------- /packages/core/src/components/Loading/src/Typing.ts: -------------------------------------------------------------------------------- 1 | import { SizeEnum } from "@core/enums"; 2 | 3 | export interface LoadingProps { 4 | tip: string; 5 | size: SizeEnum; 6 | absolute: boolean; 7 | loading: boolean; 8 | background: string; 9 | theme: "dark" | "light"; 10 | } 11 | -------------------------------------------------------------------------------- /internal/ts-config/vue-app.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "display": "Vue Application", 4 | "extends": "./base.json", 5 | "compilerOptions": { 6 | "jsx": "preserve", 7 | "lib": ["ESNext", "DOM"], 8 | "noImplicitAny": false 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /packages/core/src/components/Description/index.ts: -------------------------------------------------------------------------------- 1 | import { withInstall } from "@core/utils"; 2 | import description from "./src/Description.vue"; 3 | 4 | export * from "./src/Typing"; 5 | export { useDescription } from "./src/UseDescription"; 6 | export const Description = withInstall(description); 7 | -------------------------------------------------------------------------------- /packages/core/src/components/Drawer/index.ts: -------------------------------------------------------------------------------- 1 | import { withInstall } from "@core/utils"; 2 | import basicDrawer from "./src/BasicDrawer.vue"; 3 | 4 | export const BasicDrawer = withInstall(basicDrawer); 5 | export * from "./src/Typing"; 6 | export { useDrawer, useDrawerInner } from "./src/UseDrawer"; 7 | -------------------------------------------------------------------------------- /packages/core/src/components/Dropdown/src/typing.ts: -------------------------------------------------------------------------------- 1 | import { Fn } from "@mfish/types"; 2 | 3 | export interface DropMenu { 4 | onClick?: Fn; 5 | to?: string; 6 | icon?: string; 7 | event: string | number; 8 | text: string; 9 | disabled?: boolean; 10 | divider?: boolean; 11 | } 12 | -------------------------------------------------------------------------------- /packages/core/src/logics/theme/UpdateGrayMode.ts: -------------------------------------------------------------------------------- 1 | import { toggleClass } from "./Util.ts"; 2 | 3 | /** 4 | * Change project gray mode status 5 | * @param gray 6 | */ 7 | export function updateGrayMode(gray: boolean) { 8 | toggleClass(gray, "gray-mode", document.documentElement); 9 | } 10 | -------------------------------------------------------------------------------- /packages/core/src/utils/Utils.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @description: 通用方法 3 | * @author: mfish 4 | * @date: 2023/3/7 16:32 5 | */ 6 | 7 | /** 8 | * 随眠等待 9 | * @param time 10 | */ 11 | export function sleep(time: number) { 12 | return new Promise((resolve) => setTimeout(resolve, time)); 13 | } 14 | -------------------------------------------------------------------------------- /internal/vite-config/src/utils/Hash.ts: -------------------------------------------------------------------------------- 1 | import { createHash } from "node:crypto"; 2 | 3 | function createContentHash(content: string, hashLSize = 12) { 4 | const hash = createHash("sha256").update(content); 5 | return hash.digest("hex").slice(0, hashLSize); 6 | } 7 | 8 | export { createContentHash }; 9 | -------------------------------------------------------------------------------- /packages/core/src/components/FileUpDown/index.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @description: 入口文件 3 | * @author: mfish 4 | * @date: 2025/4/11 5 | */ 6 | export { default as FileHref } from "./FileHref.vue"; 7 | export { default as FilePreview } from "./FilePreview.vue"; 8 | export { default as FileUp } from "./FileUp.vue"; 9 | -------------------------------------------------------------------------------- /packages/styles/src/dark.less: -------------------------------------------------------------------------------- 1 | [data-theme="dark"] body { 2 | background-color: @black; 3 | color: #c9d1d9; 4 | } 5 | 6 | [data-theme="dark"] .bg-white { 7 | background-color: #151515 !important; 8 | } 9 | 10 | [data-theme="dark"] a[disabled] { 11 | color: rgba(255, 255, 255, 0.3); 12 | } 13 | -------------------------------------------------------------------------------- /packages/stores/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "extends": "@mfish/ts-config/web.json", 4 | "compilerOptions": { 5 | "paths": { 6 | "@/*": ["../../src/*"] 7 | } 8 | }, 9 | "include": ["src"], 10 | "exclude": ["node_modules"] 11 | } 12 | -------------------------------------------------------------------------------- /packages/nocode/core/MfInputTextAreaConfig.js: -------------------------------------------------------------------------------- 1 | import { defineComponent as t, createBlock as e, openBlock as o } from "vue"; 2 | import f from "./MfInputConfig.js"; 3 | const r = t({ __name: "MfInputTextAreaConfig", setup: (t2) => (t3, r2) => (o(), e(f, { "text-area": true })) }); 4 | export { 5 | r as default 6 | }; 7 | -------------------------------------------------------------------------------- /packages/core/src/hooks/UseDesign.ts: -------------------------------------------------------------------------------- 1 | import { useAppProviderContext } from "./UseAppContext"; 2 | 3 | export function useDesign(scope: string) { 4 | const values = useAppProviderContext(); 5 | 6 | return { 7 | prefixCls: `${values.prefixCls}-${scope}`, 8 | prefixVar: values.prefixCls 9 | }; 10 | } 11 | -------------------------------------------------------------------------------- /src/views/nocode/mf-screen/frame/FrameChart.vue: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /src/views/nocode/mf-screen/frame/FrameLayer.vue: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /packages/core/src/components/CountDown/index.ts: -------------------------------------------------------------------------------- 1 | import { withInstall } from "@core/utils"; 2 | import countButton from "./src/CountButton.vue"; 3 | import countdownInput from "./src/CountdownInput.vue"; 4 | 5 | export const CountdownInput = withInstall(countdownInput); 6 | export const CountButton = withInstall(countButton); 7 | -------------------------------------------------------------------------------- /src/views/nocode/mf-screen/frame/FrameCanvas.vue: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /packages/core/src/i18n/lang/en.ts: -------------------------------------------------------------------------------- 1 | import { genMessage } from "../Helper"; 2 | import antdLocale from "ant-design-vue/es/locale/en_US"; 3 | 4 | const modules = import.meta.glob("./en/**/*.ts", { eager: true }); 5 | 6 | export default { 7 | message: { 8 | ...genMessage(modules, "en"), 9 | antdLocale 10 | } 11 | }; 12 | -------------------------------------------------------------------------------- /packages/nocode/core/MfDataTagStyleConfig.js: -------------------------------------------------------------------------------- 1 | import { defineComponent as t, createBlock as e, openBlock as o } from "vue"; 2 | import i from "./MfTagConfig.js"; 3 | const a = t({ __name: "MfDataTagStyleConfig", setup: (t2) => (t3, a2) => (o(), e(i, { "hide-title": true, "hide-icon": true })) }); 4 | export { 5 | a as default 6 | }; 7 | -------------------------------------------------------------------------------- /src/hooks/UseAppInject.ts: -------------------------------------------------------------------------------- 1 | import { useAppProviderContext } from "@/components/general/Application"; 2 | import { computed, unref } from "vue"; 3 | 4 | export function useAppInject() { 5 | const values = useAppProviderContext(); 6 | 7 | return { 8 | getIsMobile: computed(() => unref(values.isMobile)) 9 | }; 10 | } 11 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | # registry = "https://registry.npmmirror.com" 2 | public-hoist-pattern[]=husky 3 | public-hoist-pattern[]=eslint 4 | public-hoist-pattern[]=prettier 5 | public-hoist-pattern[]=stylelint 6 | public-hoist-pattern[]=*postcss* 7 | 8 | strict-peer-dependencies=false 9 | auto-install-peers=true 10 | dedupe-peer-dependents=true 11 | -------------------------------------------------------------------------------- /internal/ts-config/node.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "display": "Node Config", 4 | "extends": "./base.json", 5 | "compilerOptions": { 6 | "composite": false, 7 | "lib": ["ESNext"], 8 | "baseUrl": "./", 9 | "types": ["node"], 10 | "noImplicitAny": true 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /packages/core/src/logics/theme/UpdateColorWeak.ts: -------------------------------------------------------------------------------- 1 | import { toggleClass } from "./Util.ts"; 2 | 3 | /** 4 | * Change the status of the project's color weakness mode 5 | * @param colorWeak 6 | */ 7 | export function updateColorWeak(colorWeak: boolean) { 8 | toggleClass(colorWeak, "color-weak", document.documentElement); 9 | } 10 | -------------------------------------------------------------------------------- /src/components/general/Application/src/search/AppSearchKeyItem.vue: -------------------------------------------------------------------------------- 1 | 6 | 13 | -------------------------------------------------------------------------------- /packages/core/src/i18n/lang/zh-CN.ts: -------------------------------------------------------------------------------- 1 | import { genMessage } from "../Helper"; 2 | import antdLocale from "ant-design-vue/es/locale/zh_CN"; 3 | 4 | const modules = import.meta.glob("./zh-CN/**/*.ts", { eager: true }); 5 | 6 | export default { 7 | message: { 8 | ...genMessage(modules, "zh-CN"), 9 | antdLocale 10 | } 11 | }; 12 | -------------------------------------------------------------------------------- /src/api/sys/model/SysConfigModel.ts: -------------------------------------------------------------------------------- 1 | import { BaseEntity } from "@mfish/core/api"; 2 | 3 | /** 4 | * @description: 界面配置 5 | * @author: mfish 6 | * @date: 2023-03-07 7 | * @version: V2.2.0 8 | */ 9 | export interface SysConfig extends BaseEntity { 10 | userId?: string; 11 | config?: string; 12 | type?: number; 13 | } 14 | -------------------------------------------------------------------------------- /packages/core/src/components/Cropper/index.ts: -------------------------------------------------------------------------------- 1 | import { withInstall } from "@core/utils"; 2 | import cropperImage from "./src/Cropper.vue"; 3 | import avatarCropper from "./src/CropperAvatar.vue"; 4 | 5 | export * from "./src/typing"; 6 | export const CropperImage = withInstall(cropperImage); 7 | export const CropperAvatar = withInstall(avatarCropper); 8 | -------------------------------------------------------------------------------- /packages/stores/src/index.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @description: 缓存主文件 3 | * @author: mfish 4 | * @date: 2022/9/26 15:29 5 | */ 6 | import { App } from "vue"; 7 | import { createPinia } from "pinia"; 8 | 9 | const store = createPinia(); 10 | 11 | export function setupStore(app: App) { 12 | app.use(store); 13 | } 14 | 15 | export { store }; 16 | -------------------------------------------------------------------------------- /packages/types/README.md: -------------------------------------------------------------------------------- 1 | # @mfish/types 2 | 3 | 用于多个公用的工具类型业务上有通用的类型定义可以放在这里。 4 | 5 | ## 用法 6 | 7 | ### 添加依赖 8 | 9 | ```bash 10 | # 进入目标应用目录,例如 apps/xxxx-app 11 | # cd apps/xxxx-app 12 | pnpm add @mfish/types --workspace 13 | ``` 14 | 15 | ### 使用 16 | 17 | ```ts 18 | // 推荐加上 type 19 | import type { Recordable } from "@mfish/types"; 20 | ``` 21 | -------------------------------------------------------------------------------- /packages/core/src/components/CodeEditor/index.ts: -------------------------------------------------------------------------------- 1 | import { withInstall } from "@core/utils"; 2 | import codeEditor from "./src/CodeEditor.vue"; 3 | import jsonPreview from "./src/json-preview/JsonPreview.vue"; 4 | 5 | export const CodeEditor = withInstall(codeEditor); 6 | export const JsonPreview = withInstall(jsonPreview); 7 | 8 | export * from "./src/Typing"; 9 | -------------------------------------------------------------------------------- /packages/nocode/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "extends": "@mfish/ts-config/web.json", 4 | "compilerOptions": { 5 | "allowImportingTsExtensions": true, 6 | "paths": { 7 | "@nocode/*": ["./src/*"], 8 | "@/*": ["../../src/*"] 9 | } 10 | }, 11 | "include": ["src", "src/**/*.ts"] 12 | } 13 | -------------------------------------------------------------------------------- /packages/core/src/components/Table/src/types/ComponentType.ts: -------------------------------------------------------------------------------- 1 | export type ComponentType = 2 | | "Input" 3 | | "InputNumber" 4 | | "Select" 5 | | "ApiSelect" 6 | | "AutoComplete" 7 | | "ApiTreeSelect" 8 | | "Checkbox" 9 | | "Switch" 10 | | "DatePicker" 11 | | "TimePicker" 12 | | "RadioGroup" 13 | | "RadioButtonGroup" 14 | | "ApiRadioGroup"; 15 | -------------------------------------------------------------------------------- /packages/core/src/settings/EncryptionSetting.ts: -------------------------------------------------------------------------------- 1 | import { isDevMode } from "../utils/Env"; 2 | 3 | // 默认缓存时间 4 | export const DEFAULT_CACHE_TIME = 60 * 60 * 24 * 7; 5 | 6 | // AES密钥 7 | export const cacheCipher = { 8 | key: "_11111000001111@", 9 | iv: "@11111000001111_" 10 | }; 11 | 12 | // 是否使用AES加密缓存 13 | export const enableStorageEncryption = !isDevMode(); 14 | -------------------------------------------------------------------------------- /packages/custom-api/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "extends": "@mfish/ts-config/web.json", 4 | "compilerOptions": { 5 | "allowImportingTsExtensions": true, 6 | "paths": { 7 | "@custom-api/*": ["./src/*"], 8 | "@/*": ["../../src/*"] 9 | } 10 | }, 11 | "include": ["src", "src/**/*.ts"] 12 | } 13 | -------------------------------------------------------------------------------- /packages/core/src/settings/SiteSetting.ts: -------------------------------------------------------------------------------- 1 | // 前端地址 2 | export const GITHUB_URL = "https://github.com/mfish-qf/mfish-nocode-view"; 3 | // 后端地址 4 | export const GITHUB_BACK_URL = "https://github.com/mfish-qf/mfish-nocode"; 5 | 6 | // mfish文档 7 | export const DOC_URL = "https://www.mfish.com.cn/"; 8 | 9 | // site url 10 | export const SITE_URL = "http://app.mfish.com.cn:11119"; 11 | -------------------------------------------------------------------------------- /packages/stores/src/modules/index.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @description: 基础store入口 3 | * @author: mfish 4 | * @date: 2025/4/7 5 | */ 6 | export * from "./App"; 7 | export * from "./Dict"; 8 | export * from "./ErrorLog"; 9 | export * from "./I18n"; 10 | export * from "./MultipleTab"; 11 | export * from "./Permission"; 12 | export * from "./TableSetting"; 13 | export * from "./User"; 14 | -------------------------------------------------------------------------------- /packages/core/src/components/Modal/index.ts: -------------------------------------------------------------------------------- 1 | import { withInstall } from "../../utils"; 2 | import "./src/index.less"; 3 | import basicModal from "./src/BasicModal.vue"; 4 | 5 | export const BasicModal = withInstall(basicModal); 6 | export { useModalContext } from "./src/hooks/UseModalContext"; 7 | export { useModal, useModalInner } from "./src/hooks/UseModal"; 8 | export * from "./src/Typing"; 9 | -------------------------------------------------------------------------------- /packages/core/src/enums/index.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @description: 枚举入口 3 | * @author: mfish 4 | * @date: 2025/4/8 5 | */ 6 | export * from "./AppEnum"; 7 | export * from "./BreakpointEnum"; 8 | export * from "./CacheEnum"; 9 | export * from "./ExceptionEnum"; 10 | export * from "./HttpEnum"; 11 | export * from "./MenuEnum"; 12 | export * from "./PageEnum"; 13 | export * from "./SizeEnum"; 14 | -------------------------------------------------------------------------------- /src/components/general/Page/index.ts: -------------------------------------------------------------------------------- 1 | import { withInstall } from "@mfish/core/utils"; 2 | 3 | import pageFooter from "./src/PageFooter.vue"; 4 | import pageWrapper from "./src/PageWrapper.vue"; 5 | 6 | export const PageFooter = withInstall(pageFooter); 7 | export const PageWrapper = withInstall(pageWrapper); 8 | 9 | export const PageWrapperFixedHeightKey = "PageWrapperFixedHeight"; 10 | -------------------------------------------------------------------------------- /packages/core/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "extends": "@mfish/ts-config/web.json", 4 | "compilerOptions": { 5 | "allowImportingTsExtensions": true, 6 | "paths": { 7 | "@core/*": ["./src/*"], 8 | "@/*": ["../../src/*"] 9 | } 10 | }, 11 | "include": ["src", "../../types"], 12 | "exclude": ["node_modules"] 13 | } 14 | -------------------------------------------------------------------------------- /packages/core/src/components/Basic/index.ts: -------------------------------------------------------------------------------- 1 | import { withInstall } from "../../utils"; 2 | import basicArrow from "./src/BasicArrow.vue"; 3 | import basicTitle from "./src/BasicTitle.vue"; 4 | import basicHelp from "./src/BasicHelp.vue"; 5 | 6 | export const BasicArrow = withInstall(basicArrow); 7 | export const BasicTitle = withInstall(basicTitle); 8 | export const BasicHelp = withInstall(basicHelp); 9 | -------------------------------------------------------------------------------- /packages/core/src/components/RegisterGlobComponent.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @description: 注册全局组件 3 | * @author: mfish 4 | * @date: 2022/10/11 11:28 5 | */ 6 | import { App } from "vue"; 7 | import { Input, Layout } from "ant-design-vue"; 8 | import { Button } from "@core/components/Button"; 9 | 10 | export function registerGlobComponent(app: App) { 11 | app.use(Input).use(Layout).use(Button); 12 | } 13 | -------------------------------------------------------------------------------- /packages/styles/src/transition/base.less: -------------------------------------------------------------------------------- 1 | .transition-default() { 2 | &-enter-active, 3 | &-leave-active { 4 | transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1) !important; 5 | } 6 | 7 | &-move { 8 | transition: transform 0.4s; 9 | } 10 | } 11 | 12 | .expand-transition { 13 | .transition-default(); 14 | } 15 | 16 | .expand-x-transition { 17 | .transition-default(); 18 | } 19 | -------------------------------------------------------------------------------- /src/components/general/Qrcode/src/ToCanvas.ts: -------------------------------------------------------------------------------- 1 | import { renderQrCode } from "./DrawCanvas"; 2 | import { drawLogo } from "./DrawLogo"; 3 | import { RenderQrCodeParams } from "./Typing"; 4 | 5 | export const toCanvas = (options: RenderQrCodeParams) => { 6 | return renderQrCode(options) 7 | .then(() => { 8 | return options; 9 | }) 10 | .then(drawLogo) as Promise; 11 | }; 12 | -------------------------------------------------------------------------------- /internal/ts-config/library.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "display": "Web Application", 4 | "extends": "./base.json", 5 | "compilerOptions": { 6 | "jsx": "preserve", 7 | "lib": ["ESNext", "DOM", "DOM.Iterable"], 8 | "useDefineForClassFields": true, 9 | "moduleResolution": "bundler", 10 | "declaration": true, 11 | "noEmit": false 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /packages/nocode/core/MfInputNumberDataConfig.js: -------------------------------------------------------------------------------- 1 | import { defineComponent as t, createBlock as a, openBlock as e, withCtx as o, renderSlot as s } from "vue"; 2 | import f from "./MfInputDataConfig.js"; 3 | const m = t({ __name: "MfInputNumberDataConfig", setup: (t2) => (t3, m2) => (e(), a(f, { "is-number": true }, { "data-select": o(() => [s(t3.$slots, "data-select")]), _: 3 })) }); 4 | export { 5 | m as default 6 | }; 7 | -------------------------------------------------------------------------------- /.gitlab-ci.yml: -------------------------------------------------------------------------------- 1 | stages: 2 | - build 3 | 4 | 5 | .standard-rules: 6 | rules: 7 | - if: $CI_PIPELINE_SOURCE == 'merge_request_event' 8 | - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH 9 | 10 | build-job: 11 | stage: build 12 | script: 13 | - docker build -t erp-admin-view . 14 | - docker compose up -d 15 | rules: 16 | - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH 17 | - when: manual 18 | -------------------------------------------------------------------------------- /packages/core/src/utils/Log.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @description: 记录错误日志 3 | * @author: mfish 4 | * @date: 2022/10/9 12:01 5 | */ 6 | const projectName = import.meta.env.VITE_GLOB_APP_TITLE; 7 | 8 | export function warn(message: string) { 9 | console.warn(`[${projectName} warn]:${message}`); 10 | } 11 | 12 | export function error(message: string) { 13 | throw new Error(`[${projectName} error]:${message}`); 14 | } 15 | -------------------------------------------------------------------------------- /src/components/general/FlowChart/src/Types.ts: -------------------------------------------------------------------------------- 1 | import { NodeConfig } from "@logicflow/core"; 2 | import { ToolbarTypeEnum } from "./Enum"; 3 | 4 | export interface NodeItem extends NodeConfig { 5 | icon: string; 6 | } 7 | 8 | export interface ToolbarConfig { 9 | type?: string | ToolbarTypeEnum; 10 | tooltip?: string | boolean; 11 | icon?: string; 12 | disabled?: boolean; 13 | separate?: boolean; 14 | } 15 | -------------------------------------------------------------------------------- /packages/core/src/components/Draggable/DraggableType.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @description: 拖动类型 3 | * @author: mfish 4 | * @date: 2023/8/22 5 | */ 6 | export interface DraggableType { 7 | name?: string; 8 | // 是否自己挂载组件 9 | slot?: boolean; 10 | // 隐藏关闭按钮 11 | hideClose?: boolean; 12 | } 13 | 14 | export interface DragMenu { 15 | name: string; 16 | value: T; 17 | icon: string; 18 | color?: string; 19 | } 20 | -------------------------------------------------------------------------------- /packages/core/src/i18n/lang/zh-CN/Common.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | okText: "确认", 3 | closeText: "关闭", 4 | cancelText: "取消", 5 | loadingText: "加载中...", 6 | saveText: "保存", 7 | delText: "删除", 8 | resetText: "重置", 9 | searchText: "搜索", 10 | queryText: "查询", 11 | 12 | inputText: "请输入", 13 | chooseText: "请选择", 14 | 15 | redo: "刷新", 16 | back: "返回", 17 | 18 | light: "亮色主题", 19 | dark: "黑暗主题" 20 | }; 21 | -------------------------------------------------------------------------------- /packages/nocode/core/MfScatterDataConfig.js: -------------------------------------------------------------------------------- 1 | import { defineComponent as t, createBlock as a, openBlock as e, withCtx as o, renderSlot as s } from "vue"; 2 | import f from "./MfBarLineDataConfig.js"; 3 | const r = t({ __name: "MfScatterDataConfig", setup: (t2) => (t3, r2) => (e(), a(f, { "x-title": "X轴 / 值", "y-max-count": 1 }, { "data-select": o(() => [s(t3.$slots, "data-select")]), _: 3 })) }); 4 | export { 5 | r as default 6 | }; 7 | -------------------------------------------------------------------------------- /packages/styles/src/transition/scale.less: -------------------------------------------------------------------------------- 1 | .scale-transition { 2 | .transition-default(); 3 | 4 | &-enter-from, 5 | &-leave, 6 | &-leave-to { 7 | opacity: 0; 8 | transform: scale(0); 9 | } 10 | } 11 | 12 | .scale-rotate-transition { 13 | .transition-default(); 14 | 15 | &-enter-from, 16 | &-leave, 17 | &-leave-to { 18 | opacity: 0; 19 | transform: scale(0) rotate(-45deg); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/api/demo/model/QuestionModel.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @description: 问题 3 | * @author: mfish 4 | * @date: 2023/2/8 20:19 5 | */ 6 | export interface QuestionModel { 7 | id: string; 8 | prompt: string; 9 | } 10 | 11 | export interface ChatsModel { 12 | id: string; 13 | user: string; 14 | chat: string; 15 | enter?: boolean; 16 | } 17 | 18 | export interface ChatResponseVo { 19 | id: string; 20 | content: string; 21 | } 22 | -------------------------------------------------------------------------------- /turbo.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://turbo.build/schema.json", 3 | "tasks": { 4 | "build": { 5 | "dependsOn": ["^build"], 6 | "outputs": ["dist/**"] 7 | }, 8 | "check-types": { 9 | "dependsOn": ["^check-types"] 10 | }, 11 | "dev": { 12 | "persistent": true, 13 | "cache": false 14 | }, 15 | "stub": { 16 | "cache": false 17 | }, 18 | "lint": {} 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /internal/vite-config/src/plugins/Html.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Plugin to minimize and use ejs template syntax in index.html. 3 | * https://github.com/anncwb/vite-plugin-html 4 | */ 5 | import type { PluginOption } from "vite"; 6 | import { createHtmlPlugin } from "vite-plugin-html"; 7 | 8 | export function configHtmlPlugin({ isBuild }: { isBuild: boolean }): PluginOption[] { 9 | return createHtmlPlugin({ 10 | minify: isBuild 11 | }); 12 | } 13 | -------------------------------------------------------------------------------- /packages/core/src/components/Scrollbar/src/types.d.ts: -------------------------------------------------------------------------------- 1 | export interface BarMapItem { 2 | offset: string; 3 | scroll: string; 4 | scrollSize: string; 5 | size: string; 6 | key: string; 7 | axis: string; 8 | client: string; 9 | direction: string; 10 | } 11 | 12 | export interface BarMap { 13 | vertical: BarMapItem; 14 | horizontal: BarMapItem; 15 | } 16 | 17 | export interface ScrollbarType { 18 | wrap: ElRef; 19 | } 20 | -------------------------------------------------------------------------------- /packages/core/src/components/Table/src/components/EditTableHeaderIcon.vue: -------------------------------------------------------------------------------- 1 | 8 | 17 | -------------------------------------------------------------------------------- /internal/eslint-config/src/configs/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./Command"; 2 | export * from "./Comments"; 3 | export * from "./Disableds"; 4 | export * from "./Ignores"; 5 | export * from "./Javascript"; 6 | export * from "./Jsdoc"; 7 | export * from "./Jsonc"; 8 | export * from "./Prettier"; 9 | export * from "./Regexp"; 10 | export * from "./Turbo"; 11 | export * from "./Typescript"; 12 | export * from "./Unicorn"; 13 | export * from "./Vue"; 14 | -------------------------------------------------------------------------------- /internal/vite-config/src/plugins/Visualizer.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Package file volume analysis 3 | */ 4 | import { visualizer } from "rollup-plugin-visualizer"; 5 | import { type PluginOption } from "vite"; 6 | 7 | export function configVisualizerConfig() { 8 | return visualizer({ 9 | filename: "./node_modules/.cache/visualizer/stats.html", 10 | open: true, 11 | gzipSize: true, 12 | brotliSize: true 13 | }) as PluginOption; 14 | } 15 | -------------------------------------------------------------------------------- /packages/types/src/type/global.d.ts: -------------------------------------------------------------------------------- 1 | import { Recordable } from "../index"; 2 | 3 | /** 4 | * @description: 全局配置信息定义 5 | * @author: mfish 6 | * @date: 2022/9/22 18:02 7 | */ 8 | declare global { 9 | const __APP_INFO__: { 10 | pkg: { 11 | name: string; 12 | version: string; 13 | dependencies: Recordable; 14 | devDependencies: Recordable; 15 | }; 16 | lastBuildTime: string; 17 | }; 18 | } 19 | -------------------------------------------------------------------------------- /src/views/demo/flow-chart/index.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 13 | -------------------------------------------------------------------------------- /.env.test: -------------------------------------------------------------------------------- 1 | NODE_ENV=production 2 | # Whether to open mock 3 | VITE_USE_MOCK = false 4 | 5 | #是否开启包分析 6 | VITE_USE_VISUALIZER = false 7 | 8 | # public path 9 | VITE_PUBLIC_PATH = / 10 | 11 | # Delete console 12 | VITE_DROP_CONSOLE = true 13 | 14 | # Basic interface address SPA 15 | VITE_GLOB_API_URL=/api 16 | 17 | # Whether to enable image compression 18 | VITE_USE_IMAGEMIN= true 19 | 20 | # Is it compatible with older browsers 21 | VITE_LEGACY = false -------------------------------------------------------------------------------- /internal/ts-config/web.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "display": "Web Package", 4 | "extends": "./base.json", 5 | "compilerOptions": { 6 | "jsx": "preserve", 7 | "jsxImportSource": "vue", 8 | "lib": ["ESNext", "DOM", "DOM.Iterable"], 9 | "useDefineForClassFields": true, 10 | "moduleResolution": "bundler", 11 | "types": ["vite/client"], 12 | "declaration": false 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /packages/core/src/directives/index.ts: -------------------------------------------------------------------------------- 1 | import type { App } from "vue"; 2 | import { setupPermissionDirective } from "./Permission"; 3 | import { setupLoadingDirective } from "./Loading"; 4 | 5 | /** 6 | * Configure and register global directives 7 | */ 8 | export function setupGlobDirectives(app: App) { 9 | setupPermissionDirective(app); 10 | setupLoadingDirective(app); 11 | } 12 | 13 | export { default as ClickOutside } from "./ClickOutside.ts"; 14 | -------------------------------------------------------------------------------- /src/views/sys/account/setting/TenantOrgSetting.vue: -------------------------------------------------------------------------------- 1 | 6 | 11 | 15 | -------------------------------------------------------------------------------- /packages/core/src/hooks/core/OnMountedOrActivated.ts: -------------------------------------------------------------------------------- 1 | import { nextTick, onActivated, onMounted } from "vue"; 2 | import { Fn } from "@mfish/types"; 3 | 4 | export function onMountedOrActivated(hook: Fn) { 5 | let mounted: boolean; 6 | 7 | onMounted(() => { 8 | hook(); 9 | nextTick(() => { 10 | mounted = true; 11 | }).then(); 12 | }); 13 | 14 | onActivated(() => { 15 | if (mounted) { 16 | hook(); 17 | } 18 | }); 19 | } 20 | -------------------------------------------------------------------------------- /packages/nocode/core/index5.js: -------------------------------------------------------------------------------- 1 | import { defineComponent as t, createBlock as a, openBlock as r } from "vue"; 2 | import { l as e } from "./index.js"; 3 | const n = t({ name: "MfDataTag", __name: "index", props: { chart: { type: Object, required: true }, chartContain: { type: Object, required: true } }, setup: (t2) => (n2, c) => (r(), a(e, { "chart-contain": t2.chartContain, chart: t2.chart }, null, 8, ["chart-contain", "chart"])) }); 4 | export { 5 | n as default 6 | }; 7 | -------------------------------------------------------------------------------- /src/components/general/FlowChart/src/UseFlowContext.ts: -------------------------------------------------------------------------------- 1 | import type LogicFlow from "@logicflow/core"; 2 | import { inject, provide } from "vue"; 3 | 4 | const key = Symbol("flow-chart"); 5 | 6 | interface Instance { 7 | logicFlow: LogicFlow; 8 | } 9 | 10 | export function createFlowChartContext(instance: Instance) { 11 | provide(key, instance); 12 | } 13 | 14 | export function useFlowChartContext(): Instance { 15 | return inject(key) as Instance; 16 | } 17 | -------------------------------------------------------------------------------- /src/views/sys/account/setting/TenantRoleSetting.vue: -------------------------------------------------------------------------------- 1 | 6 | 11 | 15 | -------------------------------------------------------------------------------- /src/views/sys/lock/index.vue: -------------------------------------------------------------------------------- 1 | 6 | 14 | -------------------------------------------------------------------------------- /packages/core/src/i18n/lang/en/Common.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | okText: "OK", 3 | closeText: "Close", 4 | cancelText: "Cancel", 5 | loadingText: "Loading...", 6 | saveText: "Save", 7 | delText: "Delete", 8 | resetText: "Reset", 9 | searchText: "Search", 10 | queryText: "Search", 11 | 12 | inputText: "Please enter", 13 | chooseText: "Please choose", 14 | 15 | redo: "Refresh", 16 | back: "Back", 17 | 18 | light: "Light", 19 | dark: "Dark" 20 | }; 21 | -------------------------------------------------------------------------------- /packages/core/src/components/Tree/src/TreeIcon.ts: -------------------------------------------------------------------------------- 1 | import type { VNode } from "vue"; 2 | import { h } from "vue"; 3 | import { isString } from "@vue/shared"; 4 | import { Icon } from "../../Icon"; 5 | 6 | export const TreeIcon = ({ props }: { props: { icon: VNode | string; color: string } }) => { 7 | if (!props) return null; 8 | if (isString(props.icon)) { 9 | return h(Icon, { icon: props.icon, class: "mr-1", color: props.color }); 10 | } 11 | return Icon; 12 | }; 13 | -------------------------------------------------------------------------------- /src/components/nocode/common/HeaderBar/HeaderBarUtils.ts: -------------------------------------------------------------------------------- 1 | import { Ref } from "vue"; 2 | 3 | /** 4 | * @description: 头部通用类 5 | * @author: mfish 6 | * @date: 2023/9/5 7 | */ 8 | export interface HeaderBarAction { 9 | showDivider?: boolean; 10 | hideLabel?: boolean; 11 | label?: string; 12 | icon?: string; 13 | color?: any; 14 | tooltip?: string; 15 | click?: (e) => void; 16 | disabled?: boolean | Ref; 17 | isLoading?: boolean | Ref; 18 | } 19 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | .DS_Store 12 | dist 13 | dist-ssr 14 | coverage 15 | *.local 16 | 17 | /cypress/videos/ 18 | /cypress/screenshots/ 19 | 20 | # Editor directories and files 21 | .vscode/* 22 | !.vscode/extensions.json 23 | .idea 24 | *.suo 25 | *.ntvs* 26 | *.njsproj 27 | *.sln 28 | *.sw? 29 | /mfish-nocode-view/ 30 | .turbo 31 | /.vite/ 32 | -------------------------------------------------------------------------------- /internal/eslint-config/src/configs/Turbo.ts: -------------------------------------------------------------------------------- 1 | import type { Linter } from "eslint"; 2 | 3 | import { interopDefault } from "../Util"; 4 | 5 | export async function turbo(): Promise { 6 | const [pluginTurbo] = await Promise.all([ 7 | // @ts-expect-error - no types 8 | interopDefault(import("eslint-config-turbo")) 9 | ] as const); 10 | 11 | return [ 12 | { 13 | plugins: { 14 | turbo: pluginTurbo 15 | } 16 | } 17 | ]; 18 | } 19 | -------------------------------------------------------------------------------- /src/api/ai/AiRouter.ts: -------------------------------------------------------------------------------- 1 | import { defHttp } from "@mfish/core/utils/http/axios"; 2 | import { AiRouter } from "@/api/ai/model/AiRouterModel"; 3 | 4 | /** 5 | * @description: 天气表 6 | * @author: mfish 7 | * @date: 2025-08-18 8 | * @version: V2.2.0 9 | */ 10 | enum Api { 11 | AiRouter = "/ai/router" 12 | } 13 | 14 | export const getAiRouter = (prompt?: string) => { 15 | return defHttp.get({ url: Api.AiRouter, params: { prompt } }, { errorMessageMode: "none" }); 16 | }; 17 | -------------------------------------------------------------------------------- /packages/core/src/directives/ripple/index.less: -------------------------------------------------------------------------------- 1 | .ripple-container { 2 | position: absolute; 3 | top: 0; 4 | left: 0; 5 | width: 0; 6 | height: 0; 7 | overflow: hidden; 8 | pointer-events: none; 9 | } 10 | 11 | .ripple-effect { 12 | position: relative; 13 | z-index: 9999; 14 | width: 1px; 15 | height: 1px; 16 | margin-top: 0; 17 | margin-left: 0; 18 | pointer-events: none; 19 | border-radius: 50%; 20 | transition: all 0.6s cubic-bezier(0.4, 0, 0.2, 1); 21 | } 22 | -------------------------------------------------------------------------------- /packages/core/src/components/Button/index.ts: -------------------------------------------------------------------------------- 1 | import { withInstall } from "../../utils"; 2 | import type { ExtractPropTypes } from "vue"; 3 | import button from "./src/BasicButton.vue"; 4 | import popConfirmButton from "./src/PopConfirmButton.vue"; 5 | import { buttonProps } from "./src/props"; 6 | 7 | export const Button = withInstall(button); 8 | export const PopConfirmButton = withInstall(popConfirmButton); 9 | export declare type ButtonProps = Partial>; 10 | -------------------------------------------------------------------------------- /packages/core/src/hooks/core/UseRefs.ts: -------------------------------------------------------------------------------- 1 | import type { Ref } from "vue"; 2 | import { onBeforeUpdate, ref } from "vue"; 3 | 4 | export function useRefs(): [Ref, (index: number) => (el: HTMLElement) => void] { 5 | const refs = ref([]) as Ref; 6 | 7 | onBeforeUpdate(() => { 8 | refs.value = []; 9 | }); 10 | 11 | const setRefs = (index: number) => (el: HTMLElement) => { 12 | refs.value[index] = el; 13 | }; 14 | 15 | return [refs, setRefs]; 16 | } 17 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineApplicationConfig } from "@mfish/vite-config"; 2 | 3 | export default defineApplicationConfig({ 4 | overrides: { 5 | optimizeDeps: { 6 | include: [ 7 | "echarts/core", 8 | "echarts/charts", 9 | "echarts/components", 10 | "echarts/renderers", 11 | "qrcode", 12 | "@iconify/vue", 13 | "ant-design-vue/es/locale/zh_CN", 14 | "ant-design-vue/es/locale/en_US" 15 | ] 16 | } 17 | } 18 | }); 19 | -------------------------------------------------------------------------------- /packages/nocode/core/MfPieDataConfig.js: -------------------------------------------------------------------------------- 1 | import { defineComponent as t, resolveDirective as a, withDirectives as e, createBlock as o, openBlock as s, withCtx as n, renderSlot as r } from "vue"; 2 | import f from "./MfBarLineDataConfig.js"; 3 | const i = t({ __name: "MfPieDataConfig", setup: (t2) => (t3, i2) => { 4 | const m = a("s"); 5 | return e((s(), o(f, { "y-max-count": 1 }, { "data-select": n(() => [r(t3.$slots, "data-select")]), _: 3 })), [[m]]); 6 | } }); 7 | export { 8 | i as default 9 | }; 10 | -------------------------------------------------------------------------------- /src/components/general/Menu/src/Types.ts: -------------------------------------------------------------------------------- 1 | export type Key = string | number; 2 | 3 | export interface MenuState { 4 | // 默认选中的列表 5 | defaultSelectedKeys: Key[]; 6 | 7 | // 模式 8 | // mode: MenuModeEnum; 9 | 10 | // // 主题 11 | // theme: ComputedRef | ThemeEnum; 12 | 13 | // 缩进 14 | inlineIndent?: number; 15 | 16 | // 展开数组 17 | openKeys: Key[]; 18 | 19 | // 当前选中的菜单项 key 数组 20 | selectedKeys: Key[]; 21 | 22 | // 收缩状态下展开的数组 23 | collapsedOpenKeys: Key[]; 24 | } 25 | -------------------------------------------------------------------------------- /src/routers/modules/nocode/MfApi.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @description: 自助API路由 3 | * @author: mfish 4 | * @date: 2023/8/4 5 | */ 6 | import type { AppRouteRecordRaw } from "@mfish/core/router"; 7 | 8 | const apiConfig: AppRouteRecordRaw = { 9 | path: "/low-code/mf-api/config", 10 | name: "ApiConfig", 11 | component: () => import("@/views/nocode/mf-api/index.vue"), 12 | meta: { 13 | menuSort: 999, 14 | hideMenu: true, 15 | title: "API配置" 16 | } 17 | }; 18 | 19 | export default apiConfig; 20 | -------------------------------------------------------------------------------- /packages/core/src/logics/theme/Util.ts: -------------------------------------------------------------------------------- 1 | const docEle = document.documentElement; 2 | 3 | export function toggleClass(flag: boolean, clsName: string, target?: HTMLElement) { 4 | const targetEl = target || document.body; 5 | let { className } = targetEl; 6 | className = className.replace(clsName, ""); 7 | targetEl.className = flag ? `${className} ${clsName} ` : className; 8 | } 9 | 10 | export function setCssVar(prop: string, val: any, dom = docEle) { 11 | dom.style.setProperty(prop, val); 12 | } 13 | -------------------------------------------------------------------------------- /internal/eslint-config/src/configs/Prettier.ts: -------------------------------------------------------------------------------- 1 | import type { Linter } from "eslint"; 2 | 3 | import { interopDefault } from "../Util"; 4 | 5 | export async function prettier(): Promise { 6 | const [pluginPrettier] = await Promise.all([interopDefault(import("eslint-plugin-prettier"))] as const); 7 | return [ 8 | { 9 | plugins: { 10 | prettier: pluginPrettier 11 | }, 12 | rules: { 13 | "prettier/prettier": "error" 14 | } 15 | } 16 | ]; 17 | } 18 | -------------------------------------------------------------------------------- /packages/core/src/logics/theme/UpdateTheme.ts: -------------------------------------------------------------------------------- 1 | import { setCssVar } from "@core/logics/theme/Util.ts"; 2 | import { darken, lighten } from "@core/utils/Color.ts"; 3 | 4 | const MAIN_COLOR = "--main-color"; 5 | const MAIN_COLOR_LIGHT = "--main-color-light"; 6 | const MAIN_COLOR_DARK = "--main-color-dark"; 7 | 8 | export async function changeTheme(color: string) { 9 | setCssVar(MAIN_COLOR, color); 10 | setCssVar(MAIN_COLOR_LIGHT, lighten(color, 6)); 11 | setCssVar(MAIN_COLOR_DARK, darken(color, 6)); 12 | } 13 | -------------------------------------------------------------------------------- /src/api/scheduler/model/JobSubscribeModel.ts: -------------------------------------------------------------------------------- 1 | import { PageResult } from "@mfish/core/api"; 2 | 3 | /** 4 | * @description: 任务订阅表 5 | * @author: mfish 6 | * @date: 2023-02-20 7 | * @version: V2.2.0 8 | */ 9 | export interface JobSubscribe { 10 | jobId: string; 11 | cron: string; 12 | startTime: string; 13 | endTime: string; 14 | status: number; 15 | } 16 | 17 | export interface ReqJobSubscribe { 18 | jobId: string; 19 | } 20 | 21 | export type JobSubscribePageModel = PageResult; 22 | -------------------------------------------------------------------------------- /src/routers/index.ts: -------------------------------------------------------------------------------- 1 | import { AppRouteRecordRaw } from "@mfish/core/router"; 2 | 3 | const modules = import.meta.glob("./modules/**/*.ts"); 4 | 5 | export const routeModuleList: AppRouteRecordRaw[] = []; 6 | // 加入到路由集合中 7 | Object.keys(modules).map((path) => 8 | modules[path]().then((module: any) => { 9 | const mod = module.default; 10 | if (!mod) { 11 | return; 12 | } 13 | const modList = Array.isArray(mod) ? [...mod] : [mod]; 14 | routeModuleList.push(...modList); 15 | }) 16 | ); 17 | -------------------------------------------------------------------------------- /internal/eslint-config/src/configs/Regexp.ts: -------------------------------------------------------------------------------- 1 | import type { Linter } from "eslint"; 2 | 3 | import { interopDefault } from "../Util"; 4 | 5 | export async function regexp(): Promise { 6 | const [pluginRegexp] = await Promise.all([interopDefault(import("eslint-plugin-regexp"))] as const); 7 | 8 | return [ 9 | { 10 | plugins: { 11 | regexp: pluginRegexp 12 | }, 13 | rules: { 14 | ...pluginRegexp.configs.recommended.rules 15 | } 16 | } 17 | ]; 18 | } 19 | -------------------------------------------------------------------------------- /packages/core/src/components/Container/index.ts: -------------------------------------------------------------------------------- 1 | import { withInstall } from "../../utils"; 2 | import collapseContainer from "./src/collapse/CollapseContainer.vue"; 3 | import scrollContainer from "./src/ScrollContainer.vue"; 4 | import lazyContainer from "./src/LazyContainer.vue"; 5 | 6 | export const CollapseContainer = withInstall(collapseContainer); 7 | export const ScrollContainer = withInstall(scrollContainer); 8 | export const LazyContainer = withInstall(lazyContainer); 9 | 10 | export * from "./src/typing"; 11 | -------------------------------------------------------------------------------- /packages/core/src/hooks/web/UseContextMenu.ts: -------------------------------------------------------------------------------- 1 | import { getCurrentInstance, onUnmounted } from "vue"; 2 | import { createContextMenu, destroyContextMenu } from "../../components/ContextMenu"; 3 | 4 | export function useContextMenu(authRemove = true) { 5 | if (getCurrentInstance() && authRemove) { 6 | onUnmounted(() => { 7 | destroyContextMenu(); 8 | }); 9 | } 10 | return [createContextMenu, destroyContextMenu]; 11 | } 12 | 13 | export { type ContextMenuItem } from "../../components/ContextMenu"; 14 | -------------------------------------------------------------------------------- /src/views/sys/account/setting/TenantUserSetting.vue: -------------------------------------------------------------------------------- 1 | 6 | 11 | 15 | 16 | -------------------------------------------------------------------------------- /src/layouts/default/trigger/SiderTrigger.vue: -------------------------------------------------------------------------------- 1 | 7 | 14 | -------------------------------------------------------------------------------- /src/routers/modules/nocode/MfScreen.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @description: 自助API路由 3 | * @author: mfish 4 | * @date: 2024/8/7 5 | */ 6 | import type { AppRouteRecordRaw } from "@mfish/core/router"; 7 | 8 | const screenConfig: AppRouteRecordRaw = { 9 | path: "/low-code/mf-screen/config", 10 | name: "ScreenConfig", 11 | component: () => import("@/views/nocode/mf-screen/index.vue"), 12 | meta: { 13 | menuSort: 999, 14 | hideMenu: true, 15 | title: "大屏配置" 16 | } 17 | }; 18 | 19 | export default screenConfig; 20 | -------------------------------------------------------------------------------- /src/views/nocode/api-folder/index.vue: -------------------------------------------------------------------------------- 1 | 7 | 12 | 18 | 19 | -------------------------------------------------------------------------------- /src/routers/modules/nocode/MfScreenPreview.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @description: 大屏预览路由 3 | * @author: mfish 4 | * @date: 2024/12/25 5 | */ 6 | import type { AppRouteRecordRaw } from "@mfish/core/router"; 7 | 8 | const screenPreview: AppRouteRecordRaw = { 9 | path: "/low-code/mf-screen/preview/:id?", 10 | name: "ScreenPreview", 11 | component: () => import("@/views/nocode/mf-screen/PreviewIndex.vue"), 12 | meta: { 13 | menuSort: 999, 14 | hideMenu: true, 15 | title: "大屏预览" 16 | } 17 | }; 18 | 19 | export default screenPreview; 20 | -------------------------------------------------------------------------------- /src/routers/modules/nocode/MfScreenResource.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @description: 大屏预览路由 3 | * @author: mfish 4 | * @date: 2024/12/25 5 | */ 6 | import type { AppRouteRecordRaw } from "@mfish/core/router"; 7 | 8 | const screenPreview: AppRouteRecordRaw = { 9 | path: "/low-code/mf-screen/resource", 10 | name: "ScreenResource", 11 | component: () => import("@/views/nocode/screen-resource/index.vue"), 12 | meta: { 13 | menuSort: 999, 14 | hideMenu: true, 15 | title: "资源中心" 16 | } 17 | }; 18 | 19 | export default screenPreview; 20 | -------------------------------------------------------------------------------- /internal/ts-config/node-server.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "display": "Node Server Config", 4 | "extends": "./base.json", 5 | "compilerOptions": { 6 | "module": "commonjs", 7 | "declaration": false, 8 | "removeComments": true, 9 | "emitDecoratorMetadata": true, 10 | "experimentalDecorators": true, 11 | "target": "es6", 12 | "sourceMap": false, 13 | "esModuleInterop": true, 14 | "outDir": "./dist", 15 | "baseUrl": "./" 16 | }, 17 | "exclude": ["node_modules"] 18 | } 19 | -------------------------------------------------------------------------------- /packages/core/src/enums/SizeEnum.ts: -------------------------------------------------------------------------------- 1 | export enum SizeEnum { 2 | DEFAULT = "default", 3 | SMALL = "small", 4 | LARGE = "large" 5 | } 6 | 7 | export enum SizeNumberEnum { 8 | DEFAULT = 48, 9 | SMALL = 16, 10 | LARGE = 64 11 | } 12 | 13 | export const sizeMap: Map = (() => { 14 | const map = new Map(); 15 | map.set(SizeEnum.DEFAULT, SizeNumberEnum.DEFAULT); 16 | map.set(SizeEnum.SMALL, SizeNumberEnum.SMALL); 17 | map.set(SizeEnum.LARGE, SizeNumberEnum.LARGE); 18 | return map; 19 | })(); 20 | -------------------------------------------------------------------------------- /src/api/sys/model/DictModel.ts: -------------------------------------------------------------------------------- 1 | import { BaseEntity, PageResult, ReqPage } from "@mfish/core/api"; 2 | 3 | /** 4 | * @description: 字典 5 | * @Author: mfish 6 | * @Date: 2023-01-03 7 | * @version: V2.2.0 8 | */ 9 | export interface Dict extends BaseEntity { 10 | dictName: string; 11 | dictCode: string; 12 | status: number; 13 | remark: string; 14 | } 15 | 16 | export interface ReqDict extends ReqPage { 17 | dictName?: string; 18 | dictCode?: string; 19 | status?: number; 20 | } 21 | 22 | export type DictPageModel = PageResult; 23 | -------------------------------------------------------------------------------- /packages/core/src/components/Modal/src/hooks/UseModalContext.ts: -------------------------------------------------------------------------------- 1 | import { InjectionKey } from "vue"; 2 | import { createContext, useContext } from "@core/hooks"; 3 | 4 | export interface ModalContextProps { 5 | redoModalHeight: () => void; 6 | } 7 | 8 | const key: InjectionKey = Symbol("modal-context"); 9 | 10 | export function createModalContext(context: ModalContextProps) { 11 | return createContext(context, key); 12 | } 13 | 14 | export function useModalContext() { 15 | return useContext(key); 16 | } 17 | -------------------------------------------------------------------------------- /src/views/sys/database/index.vue: -------------------------------------------------------------------------------- 1 | 6 | 11 | 12 | 18 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | # build stage 2 | FROM node as build-stage 3 | WORKDIR /app 4 | COPY package*.json ./ 5 | RUN npm config set registry https://registry.npmmirror.com 6 | RUN npm install -g pnpm 7 | RUN pnpm install 8 | COPY . . 9 | RUN npm run build 10 | 11 | # production stage 12 | FROM nginx:stable-alpine as production-stage 13 | COPY --from=build-stage /app/mfish-nocode-view /usr/share/nginx/html/mfish-nocode-view 14 | COPY --from=build-stage /app/config/mfish-nocode-view.conf /etc/nginx/conf.d/mfish-nocode-view.conf 15 | EXPOSE 5186 16 | CMD ["nginx", "-g", "daemon off;"] 17 | -------------------------------------------------------------------------------- /packages/core/src/components/CardList/src/data.ts: -------------------------------------------------------------------------------- 1 | import { ref } from "vue"; 2 | // 每行个数 3 | export const grid = ref(12); 4 | // slider属性 5 | export const useSlider = (min = 6, max = 12) => { 6 | // 每行显示个数滑动条 7 | const getMarks = () => { 8 | const l = {}; 9 | for (let i = min; i < max + 1; i++) { 10 | l[i] = { 11 | style: { 12 | color: "#fff" 13 | }, 14 | label: i 15 | }; 16 | } 17 | return l; 18 | }; 19 | return { 20 | min, 21 | max, 22 | marks: getMarks(), 23 | step: 1 24 | }; 25 | }; 26 | -------------------------------------------------------------------------------- /packages/core/src/enums/PageEnum.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @description: 页面枚举 3 | * @author: mfish 4 | * @date: 2022/10/11 15:32 5 | */ 6 | export enum PageEnum { 7 | // 登录页路径 8 | BASE_LOGIN = "/login", 9 | // oauth2登录页面 10 | OAUTH_LOGIN = "/oauth2", 11 | // oauth2登录出错后使用应急登录页面 12 | ERROR_LOGIN = "/error-login", 13 | // 首页路径 14 | BASE_HOME = "/dashboard", 15 | // 错误页路径 16 | ERROR_PAGE = "/exception", 17 | // 错误日志页 18 | ERROR_LOG_PAGE = "/error-log/list", 19 | //gitee登录页面 20 | GITEE_LOGIN = "/giteeOauth2", 21 | //github登录页面 22 | GITHUB_LOGIN = "/githubOauth2" 23 | } 24 | -------------------------------------------------------------------------------- /packages/styles/src/transition/index.less: -------------------------------------------------------------------------------- 1 | @import "base.less"; 2 | @import "fade.less"; 3 | @import "scale.less"; 4 | @import "slide.less"; 5 | @import "scroll.less"; 6 | @import "zoom.less"; 7 | 8 | .collapse-transition { 9 | transition: 10 | 0.2s height ease-in-out, 11 | 0.2s padding-top ease-in-out, 12 | 0.2s padding-bottom ease-in-out; 13 | } 14 | 15 | .collapse-transition-leave-active, 16 | .collapse-transition-enter-active { 17 | transition: 18 | 0.2s max-height ease-in-out, 19 | 0.2s padding-top ease-in-out, 20 | 0.2s margin-top ease-in-out; 21 | } 22 | -------------------------------------------------------------------------------- /packages/styles/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@mfish/styles", 3 | "version": "2.2.0", 4 | "private": true, 5 | "license": "Apache-2.0", 6 | "author": { 7 | "name": "mfish", 8 | "email": "qiufeng9862@qq.com", 9 | "url": "https://github.com/mfish-qf" 10 | }, 11 | "type": "module", 12 | "exports": { 13 | ".": { 14 | "types": "./src/index.less", 15 | "default": "./src/index.less" 16 | }, 17 | "./config": { 18 | "types": "./src/config.less", 19 | "default": "./src/config.less" 20 | } 21 | }, 22 | "main": "src/index.less" 23 | } 24 | -------------------------------------------------------------------------------- /packages/nocode/core/MfMapChunksConfig.js: -------------------------------------------------------------------------------- 1 | import { defineComponent as o, createBlock as r, openBlock as t } from "vue"; 2 | import { M as e } from "./MfMapConfig.js"; 3 | import { u as n } from "./index.js"; 4 | const s = o({ __name: "MfMapChunksConfig", setup(o2) { 5 | const s2 = n(); 6 | function i(o3) { 7 | s2.getCurConfigComponent.chart.options.series[0] && (s2.getCurConfigComponent.chart.options.series[0].itemStyle.borderColor = o3); 8 | } 9 | return (o3, n2) => (t(), r(e, { "show-scatter": false, onChangeBorderColor: i })); 10 | } }); 11 | export { 12 | s as default 13 | }; 14 | -------------------------------------------------------------------------------- /src/api/demo/chat.ts: -------------------------------------------------------------------------------- 1 | import { defHttp } from "@mfish/core/utils/http/axios"; 2 | import { ChatResponseVo, QuestionModel } from "@/api/demo/model/QuestionModel"; 3 | 4 | /** 5 | * @description: 聊天机器人 6 | * @author: mfish 7 | * @date: 2023/2/8 20:18 8 | */ 9 | enum Api { 10 | Question = "/ai/ollama/chat/stream" 11 | } 12 | 13 | export function answer(question: QuestionModel) { 14 | return defHttp.get( 15 | { 16 | url: Api.Question, 17 | params: question, 18 | timeout: 10 * 60 * 1000 19 | }, 20 | { successMessageMode: "none" } 21 | ); 22 | } 23 | -------------------------------------------------------------------------------- /src/layouts/default/tabs/types.ts: -------------------------------------------------------------------------------- 1 | import type { RouteLocationNormalized } from "vue-router"; 2 | 3 | export enum TabContentEnum { 4 | TAB_TYPE, 5 | EXTRA_TYPE 6 | } 7 | 8 | export interface TabContentProps { 9 | tabItem: RouteLocationNormalized; 10 | type?: TabContentEnum; 11 | trigger?: ("click" | "hover" | "contextmenu")[]; 12 | } 13 | 14 | export enum MenuEventEnum { 15 | REFRESH_PAGE, 16 | CLOSE_CURRENT, 17 | CLOSE_LEFT, 18 | CLOSE_RIGHT, 19 | CLOSE_OTHER, 20 | CLOSE_ALL, 21 | SCALE 22 | } 23 | 24 | export { type DropMenu } from "@mfish/core/components/Dropdown"; 25 | -------------------------------------------------------------------------------- /src/views/workflow/com/UseWorkflow.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @description: 工作流操作 3 | * @author: mfish 4 | * @date: 2025/10/20 5 | */ 6 | import ScreenReleaseAudit from "@/views/nocode/mf-screen/ScreenReleaseAudit.vue"; 7 | 8 | export interface AuditComponent { 9 | component: any; 10 | width: number; 11 | } 12 | export function useWorkflow() { 13 | const getAuditComponent = (key: string | undefined): AuditComponent | undefined => { 14 | if (key === "screen_release") { 15 | return { component: ScreenReleaseAudit, width: 800 }; 16 | } 17 | }; 18 | return { getAuditComponent }; 19 | } 20 | -------------------------------------------------------------------------------- /packages/core/src/components/Container/src/typing.ts: -------------------------------------------------------------------------------- 1 | import { Nullable, RefType } from "@mfish/types"; 2 | 3 | export type ScrollType = "default" | "main"; 4 | 5 | export interface CollapseContainerOptions { 6 | canExpand?: boolean; 7 | title?: string; 8 | helpMessage?: Array | string; 9 | } 10 | 11 | export interface ScrollContainerOptions { 12 | enableScroll?: boolean; 13 | type?: ScrollType; 14 | } 15 | 16 | export type ScrollActionType = RefType<{ 17 | scrollBottom: () => void; 18 | getScrollWrap: () => Nullable; 19 | scrollTo: (top: number) => void; 20 | }>; 21 | -------------------------------------------------------------------------------- /src/api/demo/model/DemoDataScopeModel.ts: -------------------------------------------------------------------------------- 1 | import { BaseEntity, PageResult } from "@mfish/core/api"; 2 | 3 | /** 4 | * @description: demo_data_scope 5 | * @author: mfish 6 | * @date: 2024-09-04 7 | * @version: V2.2.0 8 | */ 9 | export interface DemoDataScope extends BaseEntity { 10 | //角色id 11 | roleId?: string; 12 | //租户id 13 | tenantId?: string; 14 | //组织id 15 | orgId?: string; 16 | //名称 17 | name?: string; 18 | } 19 | 20 | export interface ReqDemoDataScope { 21 | id: string; 22 | } 23 | 24 | //分页结果集 25 | export type DemoDataScopePageModel = PageResult; 26 | -------------------------------------------------------------------------------- /packages/core/src/utils/HBuildUtils.ts: -------------------------------------------------------------------------------- 1 | import { h } from "vue"; 2 | import { JsonPreview } from "@core/components/CodeEditor"; 3 | /** 4 | * @description: vue通过h动态创建组件 5 | * @author: mfish 6 | * @date: 2023/2/28 21:03 7 | */ 8 | export function buildJsonPreview(data: any) { 9 | if (data === undefined || data === null || data === "" || (!data.startsWith("{") && !data.startsWith("["))) { 10 | return h("div", data); 11 | } 12 | try { 13 | const json = JSON.parse(data); 14 | return h(JsonPreview, { data: json, deep: 2 }); 15 | } catch { 16 | return h("div", data); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/views/sys/online/online.data.ts: -------------------------------------------------------------------------------- 1 | import { BasicColumn } from "@mfish/core/components/Table"; 2 | 3 | export const columns: BasicColumn[] = [ 4 | { 5 | title: "用户", 6 | dataIndex: "account", 7 | width: 200 8 | }, 9 | { 10 | title: "登录IP", 11 | dataIndex: "ip", 12 | width: 150 13 | }, 14 | { 15 | title: "登录模式", 16 | dataIndex: "loginMode", 17 | width: 150 18 | }, 19 | { 20 | title: "登录时间", 21 | dataIndex: "loginTime", 22 | width: 200 23 | }, 24 | { 25 | title: "过期时间", 26 | dataIndex: "expire", 27 | width: 180 28 | } 29 | ]; 30 | -------------------------------------------------------------------------------- /internal/vite-config/src/config/Common.ts: -------------------------------------------------------------------------------- 1 | import UnoCSS from "unocss/vite"; 2 | import { type UserConfig } from "vite"; 3 | 4 | const commonConfig: (mode: string) => UserConfig = (mode) => ({ 5 | server: { 6 | host: true 7 | }, 8 | esbuild: { 9 | drop: mode === "production" ? ["console", "debugger"] : [] 10 | }, 11 | build: { 12 | reportCompressedSize: false, 13 | chunkSizeWarningLimit: 1500, 14 | rollupOptions: { 15 | // TODO: Prevent memory overflow 16 | maxParallelFileOps: 3 17 | } 18 | }, 19 | plugins: [UnoCSS()] 20 | }); 21 | 22 | export { commonConfig }; 23 | -------------------------------------------------------------------------------- /packages/core/src/components/Form/src/hooks/UseFormContext.ts: -------------------------------------------------------------------------------- 1 | import type { InjectionKey } from "vue"; 2 | import { createContext, useContext } from "@core/hooks"; 3 | 4 | export interface FormContextProps { 5 | resetAction: () => Promise; 6 | submitAction: () => Promise; 7 | } 8 | 9 | const key: InjectionKey = Symbol("form-context"); 10 | 11 | export function createFormContext(context: FormContextProps) { 12 | return createContext(context, key); 13 | } 14 | 15 | export function useFormContext() { 16 | return useContext(key); 17 | } 18 | -------------------------------------------------------------------------------- /public/resource/tinymce/skins/ui/oxide/content.mobile.min.css: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Tiny Technologies, Inc. All rights reserved. 3 | * Licensed under the LGPL or a commercial license. 4 | * For LGPL see License.txt in the project root for license information. 5 | * For commercial licenses see https://www.tiny.cloud/ 6 | */ 7 | .tinymce-mobile-unfocused-selections .tinymce-mobile-unfocused-selection{background-color:green;display:inline-block;opacity:.5;position:absolute}body{-webkit-text-size-adjust:none}body img{max-width:96vw}body table img{max-width:95%}body{font-family:sans-serif}table{border-collapse:collapse} 8 | -------------------------------------------------------------------------------- /internal/ts-config/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@mfish/ts-config", 3 | "version": "2.2.0", 4 | "private": true, 5 | "license": "Apache-2.0", 6 | "author": { 7 | "name": "mfish", 8 | "email": "qiufeng9862@qq.com", 9 | "url": "https://github.com/mfish-qf" 10 | }, 11 | "type": "module", 12 | "files": [ 13 | "base.json", 14 | "library.json", 15 | "node.json", 16 | "node-server.json", 17 | "vue-app.json", 18 | "web.json" 19 | ], 20 | "dependencies": { 21 | "@types/node": "catalog:" 22 | }, 23 | "devDependencies": { 24 | "vite": "^7.2.2" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /internal/vite-config/src/plugins/SvgSprite.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Vite Plugin for fast creating SVG sprites. 3 | * https://github.com/anncwb/vite-plugin-svg-icons 4 | */ 5 | 6 | import { resolve } from "node:path"; 7 | 8 | import type { PluginOption } from "vite"; 9 | import { createSvgIconsPlugin } from "vite-plugin-svg-icons"; 10 | 11 | export function configSvgIconsPlugin({ isBuild }: { isBuild: boolean }) { 12 | const svgIconsPlugin = createSvgIconsPlugin({ 13 | iconDirs: [resolve(process.cwd(), "src/assets/icons")], 14 | svgoOptions: isBuild 15 | }); 16 | return svgIconsPlugin as PluginOption; 17 | } 18 | -------------------------------------------------------------------------------- /packages/core/src/hooks/UseAppContext.ts: -------------------------------------------------------------------------------- 1 | import { InjectionKey, Ref } from "vue"; 2 | import { createContext, useContext } from "./UseContext"; 3 | 4 | export interface AppProviderContextProps { 5 | prefixCls: Ref; 6 | isMobile: Ref; 7 | } 8 | 9 | const key: InjectionKey = Symbol("app-context"); 10 | 11 | export function createAppProviderContext(context: AppProviderContextProps) { 12 | return createContext(context, key); 13 | } 14 | 15 | export function useAppProviderContext() { 16 | return useContext(key); 17 | } 18 | -------------------------------------------------------------------------------- /public/resource/tinymce/skins/ui/oxide-dark/content.mobile.min.css: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Tiny Technologies, Inc. All rights reserved. 3 | * Licensed under the LGPL or a commercial license. 4 | * For LGPL see License.txt in the project root for license information. 5 | * For commercial licenses see https://www.tiny.cloud/ 6 | */ 7 | .tinymce-mobile-unfocused-selections .tinymce-mobile-unfocused-selection{background-color:green;display:inline-block;opacity:.5;position:absolute}body{-webkit-text-size-adjust:none}body img{max-width:96vw}body table img{max-width:95%}body{font-family:sans-serif}table{border-collapse:collapse} 8 | -------------------------------------------------------------------------------- /packages/core/src/api/model/BaseModel.ts: -------------------------------------------------------------------------------- 1 | import { Recordable } from "@mfish/types"; 2 | 3 | /** 4 | * 分页查询请求参数 5 | */ 6 | export interface ReqPage { 7 | pageNum?: number; 8 | pageSize?: number; 9 | } 10 | 11 | /** 12 | * 分页查询结果包装类 13 | */ 14 | export interface PageResult { 15 | pageNum: number; 16 | pageSize: number; 17 | pages: number; 18 | list: T[]; 19 | total: number; 20 | } 21 | 22 | /** 23 | * 对象基类 24 | */ 25 | export interface BaseEntity extends Recordable { 26 | id?: T; 27 | createBy?: string; 28 | createTime?: string; 29 | updateBy?: string; 30 | updateTime?: string; 31 | } 32 | -------------------------------------------------------------------------------- /src/views/nocode/http-folder/httpFolder.data.ts: -------------------------------------------------------------------------------- 1 | import { BasicColumn } from "@mfish/core/components/Table"; 2 | 3 | /** 4 | * @description: 文件目录 5 | * @author: mfish 6 | * @date: 2023/12/12 7 | */ 8 | export const columns: BasicColumn[] = [ 9 | { 10 | title: "名称", 11 | dataIndex: "name", 12 | width: 120 13 | }, 14 | { 15 | title: "请求地址", 16 | dataIndex: "requestUrl", 17 | width: 300 18 | }, 19 | { 20 | title: "创建时间", 21 | dataIndex: "createTime", 22 | width: 120 23 | }, 24 | { 25 | title: "创建人", 26 | dataIndex: "createBy", 27 | width: 120 28 | } 29 | ]; 30 | -------------------------------------------------------------------------------- /packages/core/src/components/CodeEditor/src/json-preview/JsonPreview.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 19 | -------------------------------------------------------------------------------- /types/module.d.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @description: 模块类型 3 | * @author: mfish 4 | * @date: 2022/10/10 11:51 5 | */ 6 | declare module "*.vue" { 7 | import { DefineComponent } from "vue"; 8 | const Component: DefineComponent; 9 | export default Component; 10 | } 11 | 12 | declare module "ant-design-vue/es/locale/*" { 13 | import { Locale } from "ant-design-vue/types/locale-provider"; 14 | const locale: Locale & ReadonlyRecordable; 15 | export default locale as Locale & ReadonlyRecordable; 16 | } 17 | 18 | declare module "virtual:*" { 19 | const result: any; 20 | export default result; 21 | } 22 | -------------------------------------------------------------------------------- /packages/styles/src/ant/input.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../color.less"; 2 | 3 | // input 4 | .ant-form-item { 5 | .ant-input { 6 | &-number, 7 | &-number-group-wrapper { 8 | min-width: 110px; 9 | width: 100%; 10 | max-width: 100%; 11 | } 12 | } 13 | } 14 | 15 | // 16 | //.ant-input-affix-wrapper .ant-input-suffix { 17 | // right: 9px; 18 | //} 19 | // 20 | //.ant-input-clear-icon { 21 | // margin-right: 5px; 22 | //} 23 | 24 | //.ant-input-affix-wrapper-textarea-with-clear-btn { 25 | // padding: 0 !important; 26 | // 27 | // textarea.ant-input { 28 | // padding: 4px; 29 | // } 30 | //} 31 | -------------------------------------------------------------------------------- /packages/core/src/components/Form/src/hooks/UseComponentRegister.ts: -------------------------------------------------------------------------------- 1 | import type { ComponentType } from "../types"; 2 | import { tryOnUnmounted } from "@vueuse/core"; 3 | import { add, del } from "../ComponentMap"; 4 | import type { Component } from "vue"; 5 | import { isPascalCase } from "@core/utils/Is"; 6 | 7 | export function useComponentRegister(compName: ComponentType | T, comp: R) { 8 | if (!isPascalCase(compName)) { 9 | throw new Error("compName must be in PascalCase"); 10 | } 11 | 12 | add(compName, comp); 13 | tryOnUnmounted(() => { 14 | del(compName); 15 | }); 16 | } 17 | -------------------------------------------------------------------------------- /packages/nocode/core/index10.js: -------------------------------------------------------------------------------- 1 | import { defineComponent as o, createBlock as e, openBlock as m, unref as r } from "vue"; 2 | import "ant-design-vue"; 3 | import "@mfish/core/hooks"; 4 | import { m as t } from "./index.js"; 5 | import "@vueuse/core"; 6 | import "@mfish/core/components/Icon"; 7 | import "lodash-es"; 8 | import "@mfish/core/enums"; 9 | import "@mfish/core/utils/Is"; 10 | import { _ as s } from "./index.vue_vue_type_script_setup_true_lang.js"; 11 | const i = o({ name: "MfBorder10", __name: "index", setup: (o2) => (o3, i2) => (m(), e(s, { component: r(t) }, null, 8, ["component"])) }); 12 | export { 13 | i as default 14 | }; 15 | -------------------------------------------------------------------------------- /packages/nocode/core/index12.js: -------------------------------------------------------------------------------- 1 | import { defineComponent as o, createBlock as e, openBlock as m, unref as r } from "vue"; 2 | import "ant-design-vue"; 3 | import "@mfish/core/hooks"; 4 | import { o as t } from "./index.js"; 5 | import "@vueuse/core"; 6 | import "@mfish/core/components/Icon"; 7 | import "lodash-es"; 8 | import "@mfish/core/enums"; 9 | import "@mfish/core/utils/Is"; 10 | import { _ as s } from "./index.vue_vue_type_script_setup_true_lang.js"; 11 | const i = o({ name: "MfBorder12", __name: "index", setup: (o2) => (o3, i2) => (m(), e(s, { component: r(t) }, null, 8, ["component"])) }); 12 | export { 13 | i as default 14 | }; 15 | -------------------------------------------------------------------------------- /packages/nocode/core/index13.js: -------------------------------------------------------------------------------- 1 | import { defineComponent as o, createBlock as e, openBlock as m, unref as r } from "vue"; 2 | import "ant-design-vue"; 3 | import "@mfish/core/hooks"; 4 | import { q as t } from "./index.js"; 5 | import "@vueuse/core"; 6 | import "@mfish/core/components/Icon"; 7 | import "lodash-es"; 8 | import "@mfish/core/enums"; 9 | import "@mfish/core/utils/Is"; 10 | import { _ as s } from "./index.vue_vue_type_script_setup_true_lang.js"; 11 | const i = o({ name: "MfBorder13", __name: "index", setup: (o2) => (o3, i2) => (m(), e(s, { component: r(t) }, null, 8, ["component"])) }); 12 | export { 13 | i as default 14 | }; 15 | -------------------------------------------------------------------------------- /packages/nocode/core/index14.js: -------------------------------------------------------------------------------- 1 | import { defineComponent as o, createBlock as e, openBlock as r, unref as m } from "vue"; 2 | import "ant-design-vue"; 3 | import "@mfish/core/hooks"; 4 | import { r as t } from "./index.js"; 5 | import "@vueuse/core"; 6 | import "@mfish/core/components/Icon"; 7 | import "lodash-es"; 8 | import "@mfish/core/enums"; 9 | import "@mfish/core/utils/Is"; 10 | import { _ as s } from "./index.vue_vue_type_script_setup_true_lang.js"; 11 | const i = o({ name: "MfBorder14", __name: "index", setup: (o2) => (o3, i2) => (r(), e(s, { component: m(t) }, null, 8, ["component"])) }); 12 | export { 13 | i as default 14 | }; 15 | -------------------------------------------------------------------------------- /packages/nocode/core/index15.js: -------------------------------------------------------------------------------- 1 | import { defineComponent as o, createBlock as e, openBlock as t, unref as m } from "vue"; 2 | import "ant-design-vue"; 3 | import "@mfish/core/hooks"; 4 | import { t as r } from "./index.js"; 5 | import "@vueuse/core"; 6 | import "@mfish/core/components/Icon"; 7 | import "lodash-es"; 8 | import "@mfish/core/enums"; 9 | import "@mfish/core/utils/Is"; 10 | import { _ as s } from "./index.vue_vue_type_script_setup_true_lang.js"; 11 | const i = o({ name: "MfBorder15", __name: "index", setup: (o2) => (o3, i2) => (t(), e(s, { component: m(r) }, null, 8, ["component"])) }); 12 | export { 13 | i as default 14 | }; 15 | -------------------------------------------------------------------------------- /packages/nocode/core/index16.js: -------------------------------------------------------------------------------- 1 | import { defineComponent as o, createBlock as e, openBlock as m, unref as r } from "vue"; 2 | import "ant-design-vue"; 3 | import "@mfish/core/hooks"; 4 | import { v as t } from "./index.js"; 5 | import "@vueuse/core"; 6 | import "@mfish/core/components/Icon"; 7 | import "lodash-es"; 8 | import "@mfish/core/enums"; 9 | import "@mfish/core/utils/Is"; 10 | import { _ as s } from "./index.vue_vue_type_script_setup_true_lang.js"; 11 | const i = o({ name: "MfBorder16", __name: "index", setup: (o2) => (o3, i2) => (m(), e(s, { component: r(t) }, null, 8, ["component"])) }); 12 | export { 13 | i as default 14 | }; 15 | -------------------------------------------------------------------------------- /packages/nocode/core/index17.js: -------------------------------------------------------------------------------- 1 | import { defineComponent as o, createBlock as e, openBlock as m, unref as r } from "vue"; 2 | import "ant-design-vue"; 3 | import "@mfish/core/hooks"; 4 | import { w as t } from "./index.js"; 5 | import "@vueuse/core"; 6 | import "@mfish/core/components/Icon"; 7 | import "lodash-es"; 8 | import "@mfish/core/enums"; 9 | import "@mfish/core/utils/Is"; 10 | import { _ as s } from "./index.vue_vue_type_script_setup_true_lang.js"; 11 | const i = o({ name: "MfBorder17", __name: "index", setup: (o2) => (o3, i2) => (m(), e(s, { component: r(t) }, null, 8, ["component"])) }); 12 | export { 13 | i as default 14 | }; 15 | -------------------------------------------------------------------------------- /packages/nocode/core/index18.js: -------------------------------------------------------------------------------- 1 | import { defineComponent as o, createBlock as e, openBlock as m, unref as r } from "vue"; 2 | import "ant-design-vue"; 3 | import "@mfish/core/hooks"; 4 | import { x as t } from "./index.js"; 5 | import "@vueuse/core"; 6 | import "@mfish/core/components/Icon"; 7 | import "lodash-es"; 8 | import "@mfish/core/enums"; 9 | import "@mfish/core/utils/Is"; 10 | import { _ as s } from "./index.vue_vue_type_script_setup_true_lang.js"; 11 | const i = o({ name: "MfBorder18", __name: "index", setup: (o2) => (o3, i2) => (m(), e(s, { component: r(t) }, null, 8, ["component"])) }); 12 | export { 13 | i as default 14 | }; 15 | -------------------------------------------------------------------------------- /packages/nocode/core/index19.js: -------------------------------------------------------------------------------- 1 | import { defineComponent as o, createBlock as e, openBlock as m, unref as r } from "vue"; 2 | import "ant-design-vue"; 3 | import "@mfish/core/hooks"; 4 | import { y as t } from "./index.js"; 5 | import "@vueuse/core"; 6 | import "@mfish/core/components/Icon"; 7 | import "lodash-es"; 8 | import "@mfish/core/enums"; 9 | import "@mfish/core/utils/Is"; 10 | import { _ as s } from "./index.vue_vue_type_script_setup_true_lang.js"; 11 | const i = o({ name: "MfBorder19", __name: "index", setup: (o2) => (o3, i2) => (m(), e(s, { component: r(t) }, null, 8, ["component"])) }); 12 | export { 13 | i as default 14 | }; 15 | -------------------------------------------------------------------------------- /packages/nocode/core/index20.js: -------------------------------------------------------------------------------- 1 | import { defineComponent as o, createBlock as e, openBlock as m, unref as r } from "vue"; 2 | import "ant-design-vue"; 3 | import "@mfish/core/hooks"; 4 | import { z as t } from "./index.js"; 5 | import "@vueuse/core"; 6 | import "@mfish/core/components/Icon"; 7 | import "lodash-es"; 8 | import "@mfish/core/enums"; 9 | import "@mfish/core/utils/Is"; 10 | import { _ as s } from "./index.vue_vue_type_script_setup_true_lang.js"; 11 | const i = o({ name: "MfBorder2", __name: "index", setup: (o2) => (o3, i2) => (m(), e(s, { component: r(t) }, null, 8, ["component"])) }); 12 | export { 13 | i as default 14 | }; 15 | -------------------------------------------------------------------------------- /packages/nocode/core/index21.js: -------------------------------------------------------------------------------- 1 | import { defineComponent as o, createBlock as e, openBlock as m, unref as r } from "vue"; 2 | import "ant-design-vue"; 3 | import "@mfish/core/hooks"; 4 | import { A as t } from "./index.js"; 5 | import "@vueuse/core"; 6 | import "@mfish/core/components/Icon"; 7 | import "lodash-es"; 8 | import "@mfish/core/enums"; 9 | import "@mfish/core/utils/Is"; 10 | import { _ as s } from "./index.vue_vue_type_script_setup_true_lang.js"; 11 | const i = o({ name: "MfBorder20", __name: "index", setup: (o2) => (o3, i2) => (m(), e(s, { component: r(t) }, null, 8, ["component"])) }); 12 | export { 13 | i as default 14 | }; 15 | -------------------------------------------------------------------------------- /packages/nocode/core/index22.js: -------------------------------------------------------------------------------- 1 | import { defineComponent as o, createBlock as e, openBlock as m, unref as r } from "vue"; 2 | import "ant-design-vue"; 3 | import "@mfish/core/hooks"; 4 | import { X as t } from "./index.js"; 5 | import "@vueuse/core"; 6 | import "@mfish/core/components/Icon"; 7 | import "lodash-es"; 8 | import "@mfish/core/enums"; 9 | import "@mfish/core/utils/Is"; 10 | import { _ as s } from "./index.vue_vue_type_script_setup_true_lang.js"; 11 | const i = o({ name: "MfBorder21", __name: "index", setup: (o2) => (o3, i2) => (m(), e(s, { component: r(t) }, null, 8, ["component"])) }); 12 | export { 13 | i as default 14 | }; 15 | -------------------------------------------------------------------------------- /packages/nocode/core/index23.js: -------------------------------------------------------------------------------- 1 | import { defineComponent as o, createBlock as e, openBlock as m, unref as r } from "vue"; 2 | import "ant-design-vue"; 3 | import "@mfish/core/hooks"; 4 | import { Y as t } from "./index.js"; 5 | import "@vueuse/core"; 6 | import "@mfish/core/components/Icon"; 7 | import "lodash-es"; 8 | import "@mfish/core/enums"; 9 | import "@mfish/core/utils/Is"; 10 | import { _ as s } from "./index.vue_vue_type_script_setup_true_lang.js"; 11 | const i = o({ name: "MfBorder22", __name: "index", setup: (o2) => (o3, i2) => (m(), e(s, { component: r(t) }, null, 8, ["component"])) }); 12 | export { 13 | i as default 14 | }; 15 | -------------------------------------------------------------------------------- /packages/nocode/core/index24.js: -------------------------------------------------------------------------------- 1 | import { defineComponent as o, createBlock as e, openBlock as m, unref as r } from "vue"; 2 | import "ant-design-vue"; 3 | import "@mfish/core/hooks"; 4 | import { Z as t } from "./index.js"; 5 | import "@vueuse/core"; 6 | import "@mfish/core/components/Icon"; 7 | import "lodash-es"; 8 | import "@mfish/core/enums"; 9 | import "@mfish/core/utils/Is"; 10 | import { _ as s } from "./index.vue_vue_type_script_setup_true_lang.js"; 11 | const i = o({ name: "MfBorder3", __name: "index", setup: (o2) => (o3, i2) => (m(), e(s, { component: r(t) }, null, 8, ["component"])) }); 12 | export { 13 | i as default 14 | }; 15 | -------------------------------------------------------------------------------- /packages/nocode/core/index27.js: -------------------------------------------------------------------------------- 1 | import { defineComponent as o, createBlock as e, openBlock as m, unref as r } from "vue"; 2 | import "ant-design-vue"; 3 | import "@mfish/core/hooks"; 4 | import { a1 as t } from "./index.js"; 5 | import "@vueuse/core"; 6 | import "@mfish/core/components/Icon"; 7 | import "lodash-es"; 8 | import "@mfish/core/enums"; 9 | import "@mfish/core/utils/Is"; 10 | import { _ as s } from "./index.vue_vue_type_script_setup_true_lang.js"; 11 | const i = o({ name: "MfBorder6", __name: "index", setup: (o2) => (o3, i2) => (m(), e(s, { component: r(t) }, null, 8, ["component"])) }); 12 | export { 13 | i as default 14 | }; 15 | -------------------------------------------------------------------------------- /packages/nocode/core/index28.js: -------------------------------------------------------------------------------- 1 | import { defineComponent as o, createBlock as e, openBlock as m, unref as r } from "vue"; 2 | import "ant-design-vue"; 3 | import "@mfish/core/hooks"; 4 | import { a2 as t } from "./index.js"; 5 | import "@vueuse/core"; 6 | import "@mfish/core/components/Icon"; 7 | import "lodash-es"; 8 | import "@mfish/core/enums"; 9 | import "@mfish/core/utils/Is"; 10 | import { _ as s } from "./index.vue_vue_type_script_setup_true_lang.js"; 11 | const i = o({ name: "MfBorder7", __name: "index", setup: (o2) => (o3, i2) => (m(), e(s, { component: r(t) }, null, 8, ["component"])) }); 12 | export { 13 | i as default 14 | }; 15 | -------------------------------------------------------------------------------- /packages/nocode/core/index30.js: -------------------------------------------------------------------------------- 1 | import { defineComponent as o, createBlock as e, openBlock as m, unref as r } from "vue"; 2 | import "ant-design-vue"; 3 | import "@mfish/core/hooks"; 4 | import { a4 as t } from "./index.js"; 5 | import "@vueuse/core"; 6 | import "@mfish/core/components/Icon"; 7 | import "lodash-es"; 8 | import "@mfish/core/enums"; 9 | import "@mfish/core/utils/Is"; 10 | import { _ as s } from "./index.vue_vue_type_script_setup_true_lang.js"; 11 | const i = o({ name: "MfBorder9", __name: "index", setup: (o2) => (o3, i2) => (m(), e(s, { component: r(t) }, null, 8, ["component"])) }); 12 | export { 13 | i as default 14 | }; 15 | -------------------------------------------------------------------------------- /packages/nocode/core/index43.js: -------------------------------------------------------------------------------- 1 | import { defineComponent as e, createBlock as o, openBlock as m, unref as t } from "vue"; 2 | import "ant-design-vue"; 3 | import "@mfish/core/hooks"; 4 | import { ai as r } from "./index.js"; 5 | import "@vueuse/core"; 6 | import "@mfish/core/components/Icon"; 7 | import "lodash-es"; 8 | import "@mfish/core/enums"; 9 | import "@mfish/core/utils/Is"; 10 | import { _ as s } from "./index.vue_vue_type_script_setup_true_lang.js"; 11 | const i = e({ name: "MfHeader1", __name: "index", setup: (e2) => (e3, i2) => (m(), o(s, { component: t(r) }, null, 8, ["component"])) }); 12 | export { 13 | i as default 14 | }; 15 | -------------------------------------------------------------------------------- /packages/nocode/core/index44.js: -------------------------------------------------------------------------------- 1 | import { defineComponent as e, createBlock as o, openBlock as m, unref as t } from "vue"; 2 | import "ant-design-vue"; 3 | import "@mfish/core/hooks"; 4 | import { aj as r } from "./index.js"; 5 | import "@vueuse/core"; 6 | import "@mfish/core/components/Icon"; 7 | import "lodash-es"; 8 | import "@mfish/core/enums"; 9 | import "@mfish/core/utils/Is"; 10 | import { _ as s } from "./index.vue_vue_type_script_setup_true_lang.js"; 11 | const i = e({ name: "MfHeader2", __name: "index", setup: (e2) => (e3, i2) => (m(), o(s, { component: t(r) }, null, 8, ["component"])) }); 12 | export { 13 | i as default 14 | }; 15 | -------------------------------------------------------------------------------- /packages/nocode/core/index45.js: -------------------------------------------------------------------------------- 1 | import { defineComponent as e, createBlock as o, openBlock as m, unref as t } from "vue"; 2 | import "ant-design-vue"; 3 | import "@mfish/core/hooks"; 4 | import { ak as r } from "./index.js"; 5 | import "@vueuse/core"; 6 | import "@mfish/core/components/Icon"; 7 | import "lodash-es"; 8 | import "@mfish/core/enums"; 9 | import "@mfish/core/utils/Is"; 10 | import { _ as s } from "./index.vue_vue_type_script_setup_true_lang.js"; 11 | const i = e({ name: "MfHeader3", __name: "index", setup: (e2) => (e3, i2) => (m(), o(s, { component: t(r) }, null, 8, ["component"])) }); 12 | export { 13 | i as default 14 | }; 15 | -------------------------------------------------------------------------------- /packages/nocode/core/index46.js: -------------------------------------------------------------------------------- 1 | import { defineComponent as e, createBlock as o, openBlock as m, unref as t } from "vue"; 2 | import "ant-design-vue"; 3 | import "@mfish/core/hooks"; 4 | import { al as r } from "./index.js"; 5 | import "@vueuse/core"; 6 | import "@mfish/core/components/Icon"; 7 | import "lodash-es"; 8 | import "@mfish/core/enums"; 9 | import "@mfish/core/utils/Is"; 10 | import { _ as s } from "./index.vue_vue_type_script_setup_true_lang.js"; 11 | const i = e({ name: "MfHeader4", __name: "index", setup: (e2) => (e3, i2) => (m(), o(s, { component: t(r) }, null, 8, ["component"])) }); 12 | export { 13 | i as default 14 | }; 15 | -------------------------------------------------------------------------------- /packages/nocode/core/index47.js: -------------------------------------------------------------------------------- 1 | import { defineComponent as e, createBlock as o, openBlock as m, unref as t } from "vue"; 2 | import "ant-design-vue"; 3 | import "@mfish/core/hooks"; 4 | import { am as r } from "./index.js"; 5 | import "@vueuse/core"; 6 | import "@mfish/core/components/Icon"; 7 | import "lodash-es"; 8 | import "@mfish/core/enums"; 9 | import "@mfish/core/utils/Is"; 10 | import { _ as s } from "./index.vue_vue_type_script_setup_true_lang.js"; 11 | const i = e({ name: "MfHeader5", __name: "index", setup: (e2) => (e3, i2) => (m(), o(s, { component: t(r) }, null, 8, ["component"])) }); 12 | export { 13 | i as default 14 | }; 15 | -------------------------------------------------------------------------------- /packages/nocode/core/index48.js: -------------------------------------------------------------------------------- 1 | import { defineComponent as e, createBlock as o, openBlock as m, unref as t } from "vue"; 2 | import "ant-design-vue"; 3 | import "@mfish/core/hooks"; 4 | import { an as r } from "./index.js"; 5 | import "@vueuse/core"; 6 | import "@mfish/core/components/Icon"; 7 | import "lodash-es"; 8 | import "@mfish/core/enums"; 9 | import "@mfish/core/utils/Is"; 10 | import { _ as s } from "./index.vue_vue_type_script_setup_true_lang.js"; 11 | const i = e({ name: "MfHeader6", __name: "index", setup: (e2) => (e3, i2) => (m(), o(s, { component: t(r) }, null, 8, ["component"])) }); 12 | export { 13 | i as default 14 | }; 15 | -------------------------------------------------------------------------------- /packages/nocode/core/index9.js: -------------------------------------------------------------------------------- 1 | import { defineComponent as o, createBlock as e, openBlock as m, unref as r } from "vue"; 2 | import "ant-design-vue"; 3 | import "@mfish/core/hooks"; 4 | import { B as t } from "./index.js"; 5 | import "@vueuse/core"; 6 | import "@mfish/core/components/Icon"; 7 | import "lodash-es"; 8 | import "@mfish/core/enums"; 9 | import "@mfish/core/utils/Is"; 10 | import { _ as s } from "./index.vue_vue_type_script_setup_true_lang.js"; 11 | const i = o({ name: "MfBorder1", __name: "index", setup: (o2) => (o3, i2) => (m(), e(s, { component: r(t) }, null, 8, ["component"])) }); 12 | export { 13 | i as default 14 | }; 15 | -------------------------------------------------------------------------------- /packages/nocode/core/index31.js: -------------------------------------------------------------------------------- 1 | import { defineComponent as o, createBlock as e, openBlock as t, unref as m } from "vue"; 2 | import "ant-design-vue"; 3 | import "@mfish/core/hooks"; 4 | import { a5 as r } from "./index.js"; 5 | import "@vueuse/core"; 6 | import "@mfish/core/components/Icon"; 7 | import "lodash-es"; 8 | import "@mfish/core/enums"; 9 | import "@mfish/core/utils/Is"; 10 | import { _ as s } from "./index.vue_vue_type_script_setup_true_lang.js"; 11 | const i = o({ name: "MfDecoration1", __name: "index", setup: (o2) => (o3, i2) => (t(), e(s, { component: m(r) }, null, 8, ["component"])) }); 12 | export { 13 | i as default 14 | }; 15 | -------------------------------------------------------------------------------- /packages/nocode/core/index32.js: -------------------------------------------------------------------------------- 1 | import { defineComponent as o, createBlock as e, openBlock as t, unref as m } from "vue"; 2 | import "ant-design-vue"; 3 | import "@mfish/core/hooks"; 4 | import { a6 as r } from "./index.js"; 5 | import "@vueuse/core"; 6 | import "@mfish/core/components/Icon"; 7 | import "lodash-es"; 8 | import "@mfish/core/enums"; 9 | import "@mfish/core/utils/Is"; 10 | import { _ as s } from "./index.vue_vue_type_script_setup_true_lang.js"; 11 | const i = o({ name: "MfDecoration10", __name: "index", setup: (o2) => (o3, i2) => (t(), e(s, { component: m(r) }, null, 8, ["component"])) }); 12 | export { 13 | i as default 14 | }; 15 | -------------------------------------------------------------------------------- /packages/nocode/core/index36.js: -------------------------------------------------------------------------------- 1 | import { defineComponent as o, createBlock as e, openBlock as t, unref as m } from "vue"; 2 | import "ant-design-vue"; 3 | import "@mfish/core/hooks"; 4 | import { ab as r } from "./index.js"; 5 | import "@vueuse/core"; 6 | import "@mfish/core/components/Icon"; 7 | import "lodash-es"; 8 | import "@mfish/core/enums"; 9 | import "@mfish/core/utils/Is"; 10 | import { _ as s } from "./index.vue_vue_type_script_setup_true_lang.js"; 11 | const i = o({ name: "MfDecoration3", __name: "index", setup: (o2) => (o3, i2) => (t(), e(s, { component: m(r) }, null, 8, ["component"])) }); 12 | export { 13 | i as default 14 | }; 15 | -------------------------------------------------------------------------------- /packages/nocode/core/index39.js: -------------------------------------------------------------------------------- 1 | import { defineComponent as o, createBlock as e, openBlock as t, unref as m } from "vue"; 2 | import "ant-design-vue"; 3 | import "@mfish/core/hooks"; 4 | import { ae as r } from "./index.js"; 5 | import "@vueuse/core"; 6 | import "@mfish/core/components/Icon"; 7 | import "lodash-es"; 8 | import "@mfish/core/enums"; 9 | import "@mfish/core/utils/Is"; 10 | import { _ as s } from "./index.vue_vue_type_script_setup_true_lang.js"; 11 | const i = o({ name: "MfDecoration6", __name: "index", setup: (o2) => (o3, i2) => (t(), e(s, { component: m(r) }, null, 8, ["component"])) }); 12 | export { 13 | i as default 14 | }; 15 | -------------------------------------------------------------------------------- /packages/core/src/enums/ExceptionEnum.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @description: 异常枚举 3 | * @author: mfish 4 | * @date: 2022/10/11 15:24 5 | */ 6 | export enum ExceptionEnum { 7 | // page not access 8 | PAGE_NOT_ACCESS = 403, 9 | 10 | // page not found 11 | PAGE_NOT_FOUND = 404, 12 | 13 | // error 14 | ERROR = 500, 15 | 16 | // net work error 17 | NET_WORK_ERROR = 10_000, 18 | 19 | // No data on the page. In fact, it is not an exception page 20 | PAGE_NOT_DATA = 10_100 21 | } 22 | 23 | export enum ErrorTypeEnum { 24 | VUE = "vue", 25 | SCRIPT = "script", 26 | RESOURCE = "resource", 27 | AJAX = "ajax", 28 | PROMISE = "promise" 29 | } 30 | -------------------------------------------------------------------------------- /src/api/nocode/model/MfFileModel.ts: -------------------------------------------------------------------------------- 1 | import { BaseEntity, PageResult, ReqPage } from "@mfish/core/api"; 2 | 3 | /** 4 | * @description: 文件数据源 5 | * @author: mfish 6 | * @date: 2023-12-13 7 | * @version: V2.2.0 8 | */ 9 | export interface MfFile extends BaseEntity { 10 | // 目录id 11 | folderId?: string; 12 | // 租户ID 13 | tenantId?: string; 14 | // 文件名 15 | fileName?: string; 16 | // 文件大小 17 | fileSize?: number; 18 | } 19 | 20 | export interface ReqMfFile extends ReqPage { 21 | // 文件名称 22 | name?: string; 23 | // 目录id 24 | folderId?: string; 25 | } 26 | 27 | // 分页结果集 28 | export type MfFilePageModel = PageResult; 29 | -------------------------------------------------------------------------------- /packages/core/src/api/storage/model/SysFileModel.ts: -------------------------------------------------------------------------------- 1 | import { BaseEntity, PageResult } from "@core/api/model/BaseModel.ts"; 2 | 3 | /** 4 | * @description: 文件存储 5 | * @author: mfish 6 | * @date: 2023-03-02 7 | * @version: V2.2.0 8 | */ 9 | export interface SysFile extends BaseEntity { 10 | fileKey: string; 11 | fileName: string; 12 | fileType: string; 13 | fileSize: number; 14 | fileUrl: string; 15 | filePath: string; 16 | isPrivate: number; 17 | delFlag: number; 18 | } 19 | 20 | export interface ReqSysFile { 21 | fileName?: string; 22 | fileType?: string; 23 | } 24 | 25 | export type SysFilePageModel = PageResult; 26 | -------------------------------------------------------------------------------- /packages/core/src/components/Table/src/hooks/UseLoading.ts: -------------------------------------------------------------------------------- 1 | import { computed, ComputedRef, ref, unref, watch } from "vue"; 2 | import type { BasicTableProps } from "../types/Table"; 3 | 4 | export function useLoading(props: ComputedRef) { 5 | const loadingRef = ref(unref(props).loading); 6 | 7 | watch( 8 | () => unref(props).loading, 9 | (loading) => { 10 | loadingRef.value = loading; 11 | } 12 | ); 13 | 14 | const getLoading = computed(() => unref(loadingRef)); 15 | 16 | function setLoading(loading: boolean) { 17 | loadingRef.value = loading; 18 | } 19 | 20 | return { getLoading, setLoading }; 21 | } 22 | -------------------------------------------------------------------------------- /src/components/general/Menu/src/components/BasicMenuItem.vue: -------------------------------------------------------------------------------- 1 | 6 | 22 | -------------------------------------------------------------------------------- /src/api/scheduler/model/JobLogModel.ts: -------------------------------------------------------------------------------- 1 | import { BaseEntity, PageResult } from "@mfish/core/api"; 2 | 3 | /** 4 | * @description: 任务日志 5 | * @author: mfish 6 | * @date: 2023-02-14 7 | * @version: V2.2.0 8 | */ 9 | export interface JobLog extends BaseEntity { 10 | jobId: string; 11 | jobName: string; 12 | jobGroup: string; 13 | jobType: number; 14 | className: string; 15 | methodName: string; 16 | params: string; 17 | status: number; 18 | remark: string; 19 | } 20 | 21 | export interface ReqJobLog { 22 | jobType?: number; 23 | jobName?: string; 24 | jobGroup?: string; 25 | } 26 | 27 | export type JobLogPageModel = PageResult; 28 | -------------------------------------------------------------------------------- /src/hooks/UseSortable.ts: -------------------------------------------------------------------------------- 1 | import type { Ref } from "vue"; 2 | import { nextTick, unref } from "vue"; 3 | import type { Options } from "sortablejs"; 4 | 5 | export function useSortable(el: HTMLElement | Ref, options?: Options) { 6 | function initSortable() { 7 | nextTick(async () => { 8 | if (!el) return; 9 | const sortablejs = await import("sortablejs"); 10 | const Sortable = sortablejs.default; 11 | Sortable.create(unref(el), { 12 | animation: 500, 13 | delay: 400, 14 | delayOnTouchOnly: true, 15 | ...options 16 | }); 17 | }).then(); 18 | } 19 | 20 | return { initSortable }; 21 | } 22 | -------------------------------------------------------------------------------- /internal/prettier-config/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@mfish/prettier-config", 3 | "version": "2.2.0", 4 | "private": true, 5 | "license": "Apache-2.0", 6 | "author": { 7 | "name": "mfish", 8 | "email": "qiufeng9862@qq.com", 9 | "url": "https://github.com/mfish-qf" 10 | }, 11 | "type": "module", 12 | "exports": { 13 | ".": { 14 | "default": "./index.mjs" 15 | } 16 | }, 17 | "main": "./index.mjs", 18 | "module": "./index.mjs", 19 | "files": [ 20 | "dist" 21 | ], 22 | "dependencies": { 23 | "prettier": "catalog:" 24 | }, 25 | "devDependencies": { 26 | "prettier-plugin-packagejson": "catalog:" 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /packages/nocode/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@mfish/nocode", 3 | "version": "2.2.0", 4 | "private": true, 5 | "license": "Apache-2.0", 6 | "author": { 7 | "name": "mfish", 8 | "email": "qiufeng9862@qq.com", 9 | "url": "https://github.com/mfish-qf" 10 | }, 11 | "type": "module", 12 | "main": "./core/index.mjs", 13 | "module": "./core/index.mjs", 14 | "types": "./core/index.mjs", 15 | "files": [ 16 | "core" 17 | ], 18 | "exports": { 19 | ".": { 20 | "types": "./core/index.mjs", 21 | "import": "./core/index.mjs" 22 | } 23 | }, 24 | "devDependencies": { 25 | "vite-plugin-style-inject": "catalog:" 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/layouts/default/content/UseContentContext.ts: -------------------------------------------------------------------------------- 1 | import type { ComputedRef, InjectionKey } from "vue"; 2 | import { createContext, useContext } from "@mfish/core/hooks"; 3 | 4 | export interface ContentContextProps { 5 | contentHeight: ComputedRef; 6 | setPageHeight: (height: number) => Promise; 7 | } 8 | 9 | const key: InjectionKey = Symbol("content-context"); 10 | 11 | export function createContentContext(context: ContentContextProps) { 12 | return createContext(context, key, { native: true }); 13 | } 14 | 15 | export function useContentContext() { 16 | return useContext(key); 17 | } 18 | -------------------------------------------------------------------------------- /packages/core/src/components/Modal/src/components/ModalHeader.vue: -------------------------------------------------------------------------------- 1 | 6 | 23 | -------------------------------------------------------------------------------- /packages/core/src/hooks/component/UsePageContext.ts: -------------------------------------------------------------------------------- 1 | import type { ComputedRef, InjectionKey, Ref } from "vue"; 2 | import { createContext, useContext } from "@core/hooks"; 3 | 4 | export interface PageContextProps { 5 | contentHeight: ComputedRef; 6 | pageHeight: Ref; 7 | setPageHeight: (height: number) => Promise; 8 | } 9 | 10 | const key: InjectionKey = Symbol("page-context"); 11 | 12 | export function createPageContext(context: PageContextProps) { 13 | return createContext(context, key, { native: true }); 14 | } 15 | 16 | export function usePageContext() { 17 | return useContext(key); 18 | } 19 | -------------------------------------------------------------------------------- /packages/custom-api/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@mfish/custom-api", 3 | "version": "2.2.0", 4 | "private": true, 5 | "license": "Apache-2.0", 6 | "author": { 7 | "name": "mfish", 8 | "email": "qiufeng9862@qq.com", 9 | "url": "https://github.com/mfish-qf" 10 | }, 11 | "type": "module", 12 | "exports": { 13 | ".": { 14 | "types": "./core/index.mjs", 15 | "import": "./core/index.mjs" 16 | } 17 | }, 18 | "main": "./core/index.mjs", 19 | "module": "./core/index.mjs", 20 | "types": "./core/index.mjs", 21 | "files": [ 22 | "core" 23 | ], 24 | "devDependencies": { 25 | "vite-plugin-style-inject": "catalog:" 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/routers/modules/demo/Flow.ts: -------------------------------------------------------------------------------- 1 | import type { AppRouteRecordRaw } from "@mfish/core/router"; 2 | import { LAYOUT } from "@mfish/core/router"; 3 | 4 | const flows: AppRouteRecordRaw = { 5 | path: "/workflow", 6 | name: "FlowDemo", 7 | component: LAYOUT, 8 | redirect: "/workflow/flowChart", 9 | meta: { 10 | menuSort: 998, 11 | icon: "tabler:chart-dots", 12 | title: "图形编辑器" 13 | }, 14 | children: [ 15 | { 16 | path: "flowChart", 17 | name: "flowChartDemo", 18 | component: () => import("@/views/demo/flow-chart/index.vue"), 19 | meta: { 20 | title: "流程图" 21 | } 22 | } 23 | ] 24 | }; 25 | 26 | export default flows; 27 | -------------------------------------------------------------------------------- /packages/stores/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@mfish/stores", 3 | "version": "2.2.0", 4 | "private": true, 5 | "license": "Apache-2.0", 6 | "author": { 7 | "name": "mfish", 8 | "email": "qiufeng9862@qq.com", 9 | "url": "https://github.com/mfish-qf" 10 | }, 11 | "type": "module", 12 | "exports": { 13 | ".": { 14 | "types": "./src/index.ts", 15 | "default": "./src/index.ts" 16 | }, 17 | "./modules": { 18 | "types": "./src/modules/index.ts", 19 | "default": "./src/modules/index.ts" 20 | }, 21 | "./screen": { 22 | "types": "./src/screen/index.ts", 23 | "default": "./src/screen/index.ts" 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /packages/core/src/components/Button/src/props.ts: -------------------------------------------------------------------------------- 1 | import { PropType } from "vue"; 2 | 3 | export const buttonProps = { 4 | color: { 5 | type: String 6 | }, 7 | loading: { type: Boolean }, 8 | disabled: { type: Boolean }, 9 | /** 10 | * Text before icon. 11 | */ 12 | preIcon: { type: String }, 13 | /** 14 | * Text after icon. 15 | */ 16 | postIcon: { type: String }, 17 | /** 18 | * preIcon and postIcon icon size. 19 | * @default: 14 20 | */ 21 | iconSize: { type: Number, default: 16 }, 22 | iconColor: { type: String }, 23 | onClick: { type: [Function, Array] as PropType<(() => any) | (() => any)[]>, default: null }, 24 | text: { type: String } 25 | }; 26 | -------------------------------------------------------------------------------- /packages/core/src/enums/BreakpointEnum.ts: -------------------------------------------------------------------------------- 1 | export enum sizeEnum { 2 | XS = "XS", 3 | SM = "SM", 4 | MD = "MD", 5 | LG = "LG", 6 | XL = "XL", 7 | XXL = "XXL" 8 | } 9 | 10 | export enum screenEnum { 11 | XS = 480, 12 | SM = 576, 13 | MD = 768, 14 | LG = 992, 15 | XL = 1200, 16 | XXL = 1600 17 | } 18 | 19 | const screenMap = new Map(); 20 | 21 | screenMap.set(sizeEnum.XS, screenEnum.XS); 22 | screenMap.set(sizeEnum.SM, screenEnum.SM); 23 | screenMap.set(sizeEnum.MD, screenEnum.MD); 24 | screenMap.set(sizeEnum.LG, screenEnum.LG); 25 | screenMap.set(sizeEnum.XL, screenEnum.XL); 26 | screenMap.set(sizeEnum.XXL, screenEnum.XXL); 27 | 28 | export { screenMap }; 29 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "extends": "@mfish/ts-config/vue-app.json", 4 | "compilerOptions": { 5 | "baseUrl": ".", 6 | "declaration": false, 7 | "types": ["vite/client"], 8 | "paths": { 9 | "@/*": ["src/*"], 10 | "#/*": ["types/*"] 11 | } 12 | }, 13 | "include": [ 14 | "tests/**/*.ts", 15 | "src/**/*.ts", 16 | "src/**/*.d.ts", 17 | "src/**/*.tsx", 18 | "src/**/*.vue", 19 | "types/**/*.d.ts", 20 | "types/**/*.ts", 21 | "build/**/*.ts", 22 | "build/**/*.d.ts", 23 | "mock/**/*.ts", 24 | "vite.config.ts" 25 | ], 26 | "exclude": ["node_modules", "dist", "**/*.js"] 27 | } 28 | -------------------------------------------------------------------------------- /packages/core/src/components/Table/index.ts: -------------------------------------------------------------------------------- 1 | export { default as BasicTable } from "./src/BasicTable.vue"; 2 | export { default as TableAction } from "./src/components/TableAction.vue"; 3 | export { default as EditTableHeaderIcon } from "./src/components/EditTableHeaderIcon.vue"; 4 | export { default as TableImage } from "./src/components/TableImage.vue"; 5 | 6 | export * from "./src/types/Table"; 7 | export * from "./src/types/Pagination"; 8 | export * from "./src/types/TableAction"; 9 | export { useTable } from "./src/hooks/UseTable"; 10 | export * from "./src/Const"; 11 | export type { FormSchemaInner as FormSchema, FormProps } from "../Form/src/types/Form"; 12 | export type { EditRecordRow } from "./src/components/editable"; 13 | -------------------------------------------------------------------------------- /packages/core/src/components/Table/src/components/settings/RedoSetting.vue: -------------------------------------------------------------------------------- 1 | 9 | 24 | -------------------------------------------------------------------------------- /packages/nocode/core/index49.js: -------------------------------------------------------------------------------- 1 | import { defineComponent as e, useTemplateRef as t, onMounted as r, createElementBlock as a, openBlock as n, mergeProps as i, toHandlers as o, unref as s } from "vue"; 2 | import { i as c, as as f } from "./index.js"; 3 | const m = e({ name: "MfBar", __name: "index", props: { chart: { type: Object, required: true }, chartContain: { type: Object, required: true } }, setup(e2) { 4 | const m2 = e2, h = t("mfBarRef"), { commonEvents: p } = c(m2.chart); 5 | return r(() => { 6 | f(h.value, m2.chart, m2.chartContain); 7 | }), (e3, t2) => (n(), a("div", i({ ref_key: "mfBarRef", ref: h, style: { width: "100%", height: "100%" } }, o(s(p), true)), null, 16)); 8 | } }); 9 | export { 10 | m as default 11 | }; 12 | -------------------------------------------------------------------------------- /src/components/general/Application/index.ts: -------------------------------------------------------------------------------- 1 | import { withInstall } from "@mfish/core/utils"; 2 | 3 | import appLogo from "./src/AppLogo.vue"; 4 | import appProvider from "./src/AppProvider.vue"; 5 | import appSearch from "./src/search/AppSearch.vue"; 6 | import appLocalePicker from "./src/AppLocalePicker.vue"; 7 | import appDarkModeToggle from "./src/AppDarkModeToggle.vue"; 8 | 9 | export { useAppProviderContext } from "@mfish/core/hooks"; 10 | 11 | export const AppLogo = withInstall(appLogo); 12 | export const AppProvider = withInstall(appProvider); 13 | export const AppSearch = withInstall(appSearch); 14 | export const AppLocalePicker = withInstall(appLocalePicker); 15 | export const AppDarkModeToggle = withInstall(appDarkModeToggle); 16 | -------------------------------------------------------------------------------- /packages/nocode/core/index25.js: -------------------------------------------------------------------------------- 1 | import { defineComponent as e, createBlock as r, openBlock as o, unref as t } from "vue"; 2 | import "ant-design-vue"; 3 | import "@mfish/core/hooks"; 4 | import { $ as s } from "./index.js"; 5 | import "@vueuse/core"; 6 | import "@mfish/core/components/Icon"; 7 | import "lodash-es"; 8 | import "@mfish/core/enums"; 9 | import "@mfish/core/utils/Is"; 10 | import { _ as m } from "./index.vue_vue_type_script_setup_true_lang.js"; 11 | const p = e({ name: "MfBorder4", __name: "index", props: { chart: { type: Object } }, setup: (e2) => (p2, i) => (o(), r(m, { component: t(s), chart: e2.chart, reverse: e2.chart?.options.reverse }, null, 8, ["component", "chart", "reverse"])) }); 12 | export { 13 | p as default 14 | }; 15 | -------------------------------------------------------------------------------- /src/layouts/default/header/components/index.ts: -------------------------------------------------------------------------------- 1 | import { createAsyncComponent } from "@mfish/core/utils/factory/CreateAsyncComponent"; 2 | 3 | export const TenantDropDown = createAsyncComponent(() => import("./tenant-dropdown/index.vue"), { 4 | loading: true 5 | }); 6 | 7 | export const UserDropDown = createAsyncComponent(() => import("./user-dropdown/index.vue"), { 8 | loading: true 9 | }); 10 | 11 | export const LayoutBreadcrumb = createAsyncComponent(() => import("./Breadcrumb.vue")); 12 | 13 | export const Notify = createAsyncComponent(() => import("./notify/index.vue")); 14 | 15 | export const ErrorAction = createAsyncComponent(() => import("./ErrorAction.vue")); 16 | 17 | export { default as FullScreen } from "./FullScreen.vue"; 18 | -------------------------------------------------------------------------------- /packages/nocode/core/index26.js: -------------------------------------------------------------------------------- 1 | import { defineComponent as e, createBlock as r, openBlock as o, unref as t } from "vue"; 2 | import "ant-design-vue"; 3 | import "@mfish/core/hooks"; 4 | import { a0 as s } from "./index.js"; 5 | import "@vueuse/core"; 6 | import "@mfish/core/components/Icon"; 7 | import "lodash-es"; 8 | import "@mfish/core/enums"; 9 | import "@mfish/core/utils/Is"; 10 | import { _ as m } from "./index.vue_vue_type_script_setup_true_lang.js"; 11 | const p = e({ name: "MfBorder5", __name: "index", props: { chart: { type: Object } }, setup: (e2) => (p2, i) => (o(), r(m, { component: t(s), chart: e2.chart, reverse: e2.chart?.options.reverse }, null, 8, ["component", "chart", "reverse"])) }); 12 | export { 13 | p as default 14 | }; 15 | -------------------------------------------------------------------------------- /packages/nocode/core/index41.js: -------------------------------------------------------------------------------- 1 | import { defineComponent as e, createBlock as o, openBlock as r, unref as t } from "vue"; 2 | import "ant-design-vue"; 3 | import "@mfish/core/hooks"; 4 | import { ag as s } from "./index.js"; 5 | import "@vueuse/core"; 6 | import "@mfish/core/components/Icon"; 7 | import "lodash-es"; 8 | import "@mfish/core/enums"; 9 | import "@mfish/core/utils/Is"; 10 | import { _ as m } from "./index.vue_vue_type_script_setup_true_lang.js"; 11 | const i = e({ name: "MfDecoration8", __name: "index", props: { chart: { type: Object } }, setup: (e2) => (i2, p) => (r(), o(m, { component: t(s), chart: e2.chart, reverse: e2.chart?.options.reverse }, null, 8, ["component", "chart", "reverse"])) }); 12 | export { 13 | i as default 14 | }; 15 | -------------------------------------------------------------------------------- /src/api/scheduler/model/JobModel.ts: -------------------------------------------------------------------------------- 1 | import { BaseEntity, PageResult } from "@mfish/core/api"; 2 | 3 | /** 4 | * @description: 定时调度任务 5 | * @author: mfish 6 | * @date: 2023-02-20 7 | * @version: V2.2.0 8 | */ 9 | export interface Job extends BaseEntity { 10 | jobName: string; 11 | jobGroup: string; 12 | jobType: number; 13 | className: string; 14 | methodName: string; 15 | params: string; 16 | allowConcurrent: number; 17 | misfireHandler: number; 18 | status: number; 19 | timeZone: string; 20 | priority: number; 21 | remark: string; 22 | } 23 | 24 | export interface ReqJob { 25 | jobType?: number; 26 | jobName?: string; 27 | jobGroup?: string; 28 | } 29 | 30 | export type JobPageModel = PageResult; 31 | -------------------------------------------------------------------------------- /src/layouts/default/setting/components/index.ts: -------------------------------------------------------------------------------- 1 | import { createAsyncComponent } from "@mfish/core/utils/factory/CreateAsyncComponent"; 2 | 3 | export const TypePicker = createAsyncComponent(() => import("./TypePicker.vue")); 4 | export const ThemeColorPicker = createAsyncComponent(() => import("./ThemeColorPicker.vue")); 5 | export const SettingSave = createAsyncComponent(() => import("./SettingSave.vue")); 6 | export const SwitchItem = createAsyncComponent(() => import("./SwitchItem.vue")); 7 | export const SelectItem = createAsyncComponent(() => import("./SelectItem.vue")); 8 | export const InputNumberItem = createAsyncComponent(() => import("./InputNumberItem.vue")); 9 | export const Animation = createAsyncComponent(() => import("./Animation.vue")); 10 | -------------------------------------------------------------------------------- /src/layouts/default/trigger/HeaderTrigger.vue: -------------------------------------------------------------------------------- 1 | 6 | 18 | -------------------------------------------------------------------------------- /packages/core/src/components/Modal/src/index.less: -------------------------------------------------------------------------------- 1 | /* stylelint-disable media-feature-range-notation */ 2 | .fullscreen-modal { 3 | overflow: hidden; 4 | 5 | .ant-modal { 6 | inset: 0 !important; 7 | width: 100% !important; 8 | height: 100%; 9 | 10 | &-content { 11 | height: 100%; 12 | } 13 | } 14 | 15 | .ant-modal-footer { 16 | margin-top: 0; 17 | } 18 | } 19 | 20 | .ant-modal { 21 | .ant-modal-body > .scrollbar { 22 | padding: 6px 12px 6px 12px; 23 | } 24 | 25 | &-header { 26 | padding: 4px 12px 0 6px; 27 | } 28 | 29 | &-content { 30 | padding: 12px 8px !important; 31 | } 32 | 33 | &-close { 34 | width: auto !important; 35 | background: transparent !important; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/routers/modules/demo/About.ts: -------------------------------------------------------------------------------- 1 | import type { AppRouteRecordRaw } from "@mfish/core/router"; 2 | import { LAYOUT } from "@mfish/core/router"; 3 | 4 | const abouts: AppRouteRecordRaw = { 5 | name: "About", 6 | path: "/about", 7 | component: LAYOUT, 8 | meta: { 9 | title: "关于", 10 | icon: "simple-icons:aboutdotme", 11 | hideMenu: false, 12 | menuSort: 999, 13 | keepAlive: true, 14 | hideChildrenInMenu: true 15 | }, 16 | children: [ 17 | { 18 | path: "", 19 | name: "AboutChild", 20 | meta: { 21 | title: "关于", 22 | icon: "simple-icons:aboutdotme" 23 | }, 24 | component: () => import("@/views/sys/about/index.vue") 25 | } 26 | ] 27 | }; 28 | 29 | export default abouts; 30 | -------------------------------------------------------------------------------- /src/views/nocode/mf-screen/PreviewIndex.vue: -------------------------------------------------------------------------------- 1 | 6 | 9 | 23 | 24 | -------------------------------------------------------------------------------- /src/views/nocode/mf-screen/frame/FrameConfig.vue: -------------------------------------------------------------------------------- 1 | 6 | 13 | 24 | 25 | -------------------------------------------------------------------------------- /packages/styles/src/var/index.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../color.less"; 2 | @import "easing"; 3 | @import "breakpoint"; 4 | 5 | @namespace: "mfish"; 6 | 7 | // tabs 8 | @multiple-height: 32px; 9 | 10 | // headers 11 | @header-height: 42px; 12 | 13 | // logo width 14 | @logo-width: 32px; 15 | 16 | // 17 | @side-drag-z-index: 200; 18 | 19 | @page-loading-z-index: 10000; 20 | 21 | @lock-page-z-index: 3000; 22 | 23 | @layout-header-fixed-z-index: 500; 24 | 25 | @multiple-tab-fixed-z-index: 505; 26 | 27 | @layout-sider-fixed-z-index: 510; 28 | 29 | @layout-mix-sider-fixed-z-index: 550; 30 | 31 | @preview-comp-z-index: 1000; 32 | 33 | @page-footer-z-index: 99; 34 | 35 | .bem(@n; @content) { 36 | @{namespace-1}-@{n} { 37 | @content(); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /packages/styles/src/transition/slide.less: -------------------------------------------------------------------------------- 1 | .slide-y-transition { 2 | .transition-default(); 3 | 4 | &-enter-from, 5 | &-leave-to { 6 | opacity: 0; 7 | transform: translateY(-15px); 8 | } 9 | } 10 | 11 | .slide-y-reverse-transition { 12 | .transition-default(); 13 | 14 | &-enter-from, 15 | &-leave-to { 16 | opacity: 0; 17 | transform: translateY(15px); 18 | } 19 | } 20 | 21 | .slide-x-transition { 22 | .transition-default(); 23 | 24 | &-enter-from, 25 | &-leave-to { 26 | opacity: 0; 27 | transform: translateX(-15px); 28 | } 29 | } 30 | 31 | .slide-x-reverse-transition { 32 | .transition-default(); 33 | 34 | &-enter-from, 35 | &-leave-to { 36 | opacity: 0; 37 | transform: translateX(15px); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/api/sys/model/SsoClientDetailsModel.ts: -------------------------------------------------------------------------------- 1 | import { BaseEntity, PageResult, ReqPage } from "@mfish/core/api"; 2 | 3 | /** 4 | * @description: 客户端信息 5 | * @author: mfish 6 | * @date: 2023-05-12 7 | * @version: V2.2.0 8 | */ 9 | export interface SsoClientDetails extends BaseEntity { 10 | clientId: string; 11 | clientName: string; 12 | resourceIds: string; 13 | clientSecret: string; 14 | scope: string; 15 | grantTypes: string; 16 | grantTypeGroup: string[]; 17 | redirectUrl: string; 18 | authorities: string; 19 | autoApprove: string; 20 | } 21 | 22 | export interface ReqSsoClientDetails extends ReqPage { 23 | clientName: string; 24 | clientId: string; 25 | } 26 | 27 | export type SsoClientDetailsPageModel = PageResult; 28 | -------------------------------------------------------------------------------- /packages/core/src/api/sys/model/DictItemModel.ts: -------------------------------------------------------------------------------- 1 | import { BaseEntity, PageResult, ReqPage } from "@core/api/model/BaseModel.ts"; 2 | 3 | /** 4 | * @description: 字典项 5 | * @Author: mfish 6 | * @Date: 2023-01-03 7 | * @version: V2.2.0 8 | */ 9 | export interface DictItem extends BaseEntity { 10 | dictCode: string; 11 | dictLabel: string; 12 | dictValue: string; 13 | valueType: number; 14 | dictSort: number; 15 | icon: string; 16 | color: string; 17 | status: number; 18 | remark: string; 19 | } 20 | 21 | export interface ReqDictItem extends ReqPage { 22 | dictId?: string; 23 | dictCode?: string; 24 | dictLabel?: string; 25 | dictValue?: string; 26 | status?: number; 27 | } 28 | 29 | export type DictItemPageModel = PageResult; 30 | -------------------------------------------------------------------------------- /packages/core/src/api/sys/model/RoleModel.ts: -------------------------------------------------------------------------------- 1 | import { PageResult, ReqPage } from "@core/api/model/BaseModel.ts"; 2 | 3 | /** 4 | * @description: 角色信息 5 | * @author: mfish 6 | * @date: 2022/11/14 16:24 7 | */ 8 | export interface SsoRole { 9 | id: string; 10 | tenantId: string; 11 | roleName: string; 12 | roleCode: string; 13 | roleSort: number; 14 | status: number; 15 | remark: string; 16 | delFlag: number; 17 | createBy: string; 18 | createTime: string; 19 | updateBy: string; 20 | updateTime: string; 21 | } 22 | 23 | export interface ReqSsoRole extends ReqPage { 24 | tenantId?: string; 25 | orgIds?: string; 26 | roleName?: string; 27 | roleCode?: string; 28 | status?: number; 29 | } 30 | 31 | export type RolePageModel = PageResult; 32 | -------------------------------------------------------------------------------- /internal/eslint-config/src/configs/Comments.ts: -------------------------------------------------------------------------------- 1 | import type { Linter } from "eslint"; 2 | 3 | import { interopDefault } from "../Util"; 4 | 5 | export async function comments(): Promise { 6 | const [pluginComments] = await Promise.all([ 7 | // @ts-expect-error - no types 8 | interopDefault(import("eslint-plugin-eslint-comments")) 9 | ] as const); 10 | 11 | return [ 12 | { 13 | plugins: { 14 | "eslint-comments": pluginComments 15 | }, 16 | rules: { 17 | "eslint-comments/no-aggregating-enable": "error", 18 | "eslint-comments/no-duplicate-disable": "error", 19 | "eslint-comments/no-unlimited-disable": "error", 20 | "eslint-comments/no-unused-enable": "error" 21 | } 22 | } 23 | ]; 24 | } 25 | -------------------------------------------------------------------------------- /packages/nocode/core/index38.js: -------------------------------------------------------------------------------- 1 | import { defineComponent as o, createBlock as t, openBlock as r, unref as e } from "vue"; 2 | import "ant-design-vue"; 3 | import "@mfish/core/hooks"; 4 | import { ad as i } from "./index.js"; 5 | import "@vueuse/core"; 6 | import "@mfish/core/components/Icon"; 7 | import "lodash-es"; 8 | import "@mfish/core/enums"; 9 | import "@mfish/core/utils/Is"; 10 | import { _ as n } from "./index.vue_vue_type_script_setup_true_lang.js"; 11 | const s = o({ name: "MfDecoration5", __name: "index", props: { chart: { type: Object } }, setup: (o2) => (s2, m) => (r(), t(n, { component: e(i), chart: o2.chart, duration: o2.chart?.options.duration ? o2.chart?.options.duration : 3 }, null, 8, ["component", "chart", "duration"])) }); 12 | export { 13 | s as default 14 | }; 15 | -------------------------------------------------------------------------------- /packages/nocode/core/index42.js: -------------------------------------------------------------------------------- 1 | import { defineComponent as o, createBlock as t, openBlock as r, unref as e } from "vue"; 2 | import "ant-design-vue"; 3 | import "@mfish/core/hooks"; 4 | import { ah as i } from "./index.js"; 5 | import "@vueuse/core"; 6 | import "@mfish/core/components/Icon"; 7 | import "lodash-es"; 8 | import "@mfish/core/enums"; 9 | import "@mfish/core/utils/Is"; 10 | import { _ as n } from "./index.vue_vue_type_script_setup_true_lang.js"; 11 | const s = o({ name: "MfDecoration9", __name: "index", props: { chart: { type: Object } }, setup: (o2) => (s2, m) => (r(), t(n, { component: e(i), chart: o2.chart, duration: o2.chart?.options.duration ? o2.chart?.options.duration : 3 }, null, 8, ["component", "chart", "duration"])) }); 12 | export { 13 | s as default 14 | }; 15 | -------------------------------------------------------------------------------- /src/api/sys/model/CodeBuildModel.ts: -------------------------------------------------------------------------------- 1 | import { BaseEntity, PageResult, ReqPage } from "@mfish/core/api"; 2 | 3 | /** 4 | * @description: 代码构建 5 | * @author: mfish 6 | * @date: 2023-04-11 7 | * @version: V2.2.0 8 | */ 9 | export interface CodeBuild extends BaseEntity { 10 | connectId: string; 11 | tableName: string; 12 | apiPrefix: string; 13 | entityName: string; 14 | packageName: string; 15 | tableComment: string; 16 | queryParams: string; 17 | } 18 | 19 | export interface CodeVo { 20 | path: string; 21 | name: string; 22 | code: string; 23 | } 24 | 25 | export interface ReqCodeBuild extends ReqPage { 26 | tableName?: string; 27 | apiPrefix?: string; 28 | entityName?: string; 29 | } 30 | 31 | export type CodeBuildPageModel = PageResult; 32 | -------------------------------------------------------------------------------- /src/layouts/default/trigger/index.vue: -------------------------------------------------------------------------------- 1 | 5 | 23 | -------------------------------------------------------------------------------- /packages/core/src/router/guard/ParamMenuGuard.ts: -------------------------------------------------------------------------------- 1 | import type { Router } from "vue-router"; 2 | import { configureDynamicParamsMenu, Menu } from "@core/router"; 3 | import { usePermissionStoreWithOut } from "@mfish/stores/modules"; 4 | 5 | export function createParamMenuGuard(router: Router) { 6 | const permissionStore = usePermissionStoreWithOut(); 7 | router.beforeEach(async (to, _, next) => { 8 | // 过滤没有name的路由 9 | if (!to.name) { 10 | next(); 11 | return; 12 | } 13 | // 是否已经动态添加路由 14 | if (!permissionStore.getIsDynamicAddedRoute) { 15 | next(); 16 | return; 17 | } 18 | const menus: Menu[] = permissionStore.getMenuList; 19 | menus.forEach((item) => configureDynamicParamsMenu(item, to.params)); 20 | next(); 21 | }); 22 | } 23 | -------------------------------------------------------------------------------- /src/components/general/SimpleMenu/src/components/UseSimpleMenuContext.ts: -------------------------------------------------------------------------------- 1 | import type { InjectionKey, Ref } from "vue"; 2 | import type { Emitter } from "@mfish/core/utils/Mitt"; 3 | import { createContext, useContext } from "@mfish/core/hooks"; 4 | 5 | export interface SimpleRootMenuContextProps { 6 | rootMenuEmitter: Emitter; 7 | activeName: Ref; 8 | } 9 | 10 | const key: InjectionKey = Symbol("simple-menu-context"); 11 | 12 | export function createSimpleRootMenuContext(context: SimpleRootMenuContextProps) { 13 | return createContext(context, key, { readonly: false, native: true }); 14 | } 15 | 16 | export function useSimpleRootMenuContext() { 17 | return useContext(key); 18 | } 19 | -------------------------------------------------------------------------------- /packages/nocode/core/index11.js: -------------------------------------------------------------------------------- 1 | import { defineComponent as t, createBlock as e, openBlock as o, unref as i } from "vue"; 2 | import "ant-design-vue"; 3 | import "@mfish/core/hooks"; 4 | import { n as r } from "./index.js"; 5 | import "@vueuse/core"; 6 | import "@mfish/core/components/Icon"; 7 | import "lodash-es"; 8 | import "@mfish/core/enums"; 9 | import "@mfish/core/utils/Is"; 10 | import { _ as s } from "./index.vue_vue_type_script_setup_true_lang.js"; 11 | const m = t({ name: "MfBorder11", __name: "index", props: { chart: { type: Object } }, setup: (t2) => (m2, p) => (o(), e(s, { component: i(r), chart: t2.chart, title: t2.chart?.options.title, "title-width": t2.chart?.options.titleWidth }, null, 8, ["component", "chart", "title", "title-width"])) }); 12 | export { 13 | m as default 14 | }; 15 | -------------------------------------------------------------------------------- /src/api/nocode/model/FileFolderModel.ts: -------------------------------------------------------------------------------- 1 | import { BaseEntity, PageResult, ReqPage } from "@mfish/core/api"; 2 | 3 | /** 4 | * @description: 文件目录 5 | * @author: mfish 6 | * @date: 2023-12-11 7 | * @version: V2.2.0 8 | */ 9 | export interface FileFolder extends BaseEntity { 10 | parentId?: string; 11 | tenantId?: string; 12 | name?: string; 13 | folderSort?: number; 14 | delFlag?: number; 15 | children?: FileFolder[]; 16 | } 17 | 18 | export interface ReqFolder extends ReqPage { 19 | parentId?: string; 20 | name?: string; 21 | } 22 | 23 | export interface FileFolderVo extends BaseEntity { 24 | parentId?: string; 25 | name?: string; 26 | fileSize?: string; 27 | fType?: number; 28 | } 29 | 30 | export type FileFolderPageModel = PageResult; 31 | -------------------------------------------------------------------------------- /types/vue-router.d.ts: -------------------------------------------------------------------------------- 1 | export {}; 2 | declare module "vue-router" { 3 | interface RouteMeta extends Record { 4 | //菜单排序 5 | menuSort?: number; 6 | // title 7 | title: string; 8 | // dynamic router level. 9 | dynamicLevel?: number; 10 | // dynamic router real route path (For performance). 11 | realPath?: string; 12 | // Whether to ignore permissions 13 | ignoreAuth?: boolean; 14 | // Whether cache 15 | keepAlive?: boolean; 16 | // icon on tab 17 | icon?: string; 18 | // Currently active menu 19 | currentActiveMenu?: string; 20 | // Never show in menu 21 | hideMenu?: boolean; 22 | // Is it fixed on tab 23 | affix?: boolean; 24 | //iframe方式 25 | frameSrc?: string; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /packages/core/src/components/Table/src/hooks/UseTableContext.ts: -------------------------------------------------------------------------------- 1 | import type { Ref } from "vue"; 2 | import { ComputedRef, inject, provide } from "vue"; 3 | import type { BasicTableProps, TableActionType } from "../types/Table"; 4 | import { Nullable, Recordable } from "@mfish/types"; 5 | 6 | const key = Symbol("basic-table"); 7 | 8 | type Instance = TableActionType & { 9 | wrapRef: Ref>; 10 | getBindValues: ComputedRef; 11 | }; 12 | 13 | type RetInstance = Omit & { 14 | getBindValues: ComputedRef; 15 | }; 16 | 17 | export function createTableContext(instance: Instance) { 18 | provide(key, instance); 19 | } 20 | 21 | export function useTableContext(): RetInstance { 22 | return inject(key) as RetInstance; 23 | } 24 | -------------------------------------------------------------------------------- /src/api/nocode/model/HttpFolderModel.ts: -------------------------------------------------------------------------------- 1 | import { BaseEntity, PageResult, ReqPage } from "@mfish/core/api"; 2 | 3 | /** 4 | * @description: 文件目录 5 | * @author: mfish 6 | * @date: 2023-12-11 7 | * @version: V2.2.0 8 | */ 9 | export interface HttpFolder extends BaseEntity { 10 | parentId?: string; 11 | tenantId?: string; 12 | name?: string; 13 | folderSort?: number; 14 | delFlag?: number; 15 | children?: HttpFolder[]; 16 | } 17 | 18 | export interface ReqFolder extends ReqPage { 19 | parentId?: string; 20 | name?: string; 21 | } 22 | 23 | export interface HttpFolderVo extends BaseEntity { 24 | parentId?: string; 25 | name?: string; 26 | requestMethod?: string; 27 | fType?: number; 28 | } 29 | 30 | export type HttpFolderPageModel = PageResult; 31 | -------------------------------------------------------------------------------- /packages/core/src/enums/HttpEnum.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @description: HTTP请求枚举 3 | * @author: mfish 4 | * @date: 2022/10/11 17:08 5 | */ 6 | // 请求结果 7 | export enum ResultEnum { 8 | SUCCESS = 200, 9 | ERROR = -1, 10 | TIMEOUT = 401, 11 | TYPE = "success" 12 | } 13 | 14 | // 请求方法 15 | export enum RequestEnum { 16 | GET = "GET", 17 | POST = "POST", 18 | PUT = "PUT", 19 | DELETE = "DELETE" 20 | } 21 | 22 | // ContentType类型 23 | export enum ContentTypeEnum { 24 | // json 25 | JSON = "application/json;charset=UTF-8", 26 | // form-data qs 27 | FORM_URLENCODED = "application/x-www-form-urlencoded;charset=UTF-8", 28 | // form-data upload 29 | FORM_DATA = "multipart/form-data;charset=UTF-8", 30 | // OCTET_STREAM download 31 | OCTET_STREAM = "application/octet-stream;charset=UTF-8" 32 | } 33 | -------------------------------------------------------------------------------- /internal/eslint-config/src/configs/Disableds.ts: -------------------------------------------------------------------------------- 1 | import type { Linter } from "eslint"; 2 | 3 | export async function disableds(): Promise { 4 | return [ 5 | { 6 | files: ["**/__tests__/**/*.?([cm])[jt]s?(x)"], 7 | name: "disables/test", 8 | rules: { 9 | "@typescript-eslint/ban-ts-comment": "off", 10 | "no-console": "off" 11 | } 12 | }, 13 | { 14 | files: ["**/*.d.ts"], 15 | name: "disables/dts", 16 | rules: { 17 | "@typescript-eslint/triple-slash-reference": "off" 18 | } 19 | }, 20 | { 21 | files: ["**/*.js", "**/*.mjs", "**/*.cjs"], 22 | name: "disables/js", 23 | rules: { 24 | "@typescript-eslint/explicit-module-boundary-types": "off" 25 | } 26 | } 27 | ]; 28 | } 29 | -------------------------------------------------------------------------------- /packages/core/src/components/Upload/src/ThumbUrl.vue: -------------------------------------------------------------------------------- 1 | 6 | 19 | 30 | -------------------------------------------------------------------------------- /packages/core/src/settings/I18nSetting.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @description: 国际化设置 3 | * @author: mfish 4 | * @date: 2022/10/9 17:37 5 | */ 6 | import type { LocaleSetting, LocaleType } from "@mfish/types/src/type/config"; 7 | 8 | export const LOCALE: { [key: string]: LocaleType } = { 9 | ZH_CN: "zh-CN", 10 | EN_US: "en" 11 | }; 12 | 13 | export const localeSetting: LocaleSetting = { 14 | showPicker: true, 15 | // Locale 16 | locale: LOCALE.ZH_CN, 17 | // Default locale 18 | fallback: LOCALE.ZH_CN, 19 | // available Locales 20 | availableLocales: [LOCALE.ZH_CN, LOCALE.EN_US] 21 | }; 22 | 23 | // locale list 24 | export const localeList: any[] = [ 25 | { 26 | text: "简体中文", 27 | event: LOCALE.ZH_CN 28 | }, 29 | { 30 | text: "English", 31 | event: LOCALE.EN_US 32 | } 33 | ]; 34 | -------------------------------------------------------------------------------- /src/components/general/SimpleMenu/src/components/Types.ts: -------------------------------------------------------------------------------- 1 | import { Ref } from "vue"; 2 | 3 | export interface Props { 4 | theme: string; 5 | activeName?: string | number | undefined; 6 | openNames: string[]; 7 | accordion: boolean; 8 | width: string; 9 | collapsedWidth: string; 10 | indentSize: number; 11 | collapse: boolean; 12 | activeSubMenuNames: (string | number)[]; 13 | } 14 | 15 | export interface SubMenuProvider { 16 | addSubMenu: (name: string | number, update?: boolean) => void; 17 | removeSubMenu: (name: string | number, update?: boolean) => void; 18 | removeAll: () => void; 19 | sliceIndex: (index: number) => void; 20 | isRemoveAllPopup: Ref; 21 | getOpenNames: () => (string | number)[]; 22 | handleMouseleave?: Fn; 23 | level: number; 24 | props: Props; 25 | } 26 | -------------------------------------------------------------------------------- /src/views/sys/redirect/index.vue: -------------------------------------------------------------------------------- 1 | 4 | 30 | -------------------------------------------------------------------------------- /packages/core/src/utils/DateUtil.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Independent time operation tool to facilitate subsequent switch to dayjs 3 | */ 4 | import dayjs from "dayjs"; 5 | import "dayjs/locale/zh-cn"; 6 | import { useLocaleStoreWithOut } from "@mfish/stores/modules"; 7 | 8 | const localeStore = useLocaleStoreWithOut(); 9 | dayjs.locale(localeStore.getLocale); 10 | 11 | const DATE_TIME_FORMAT = "YYYY-MM-DD HH:mm:ss"; 12 | const DATE_FORMAT = "YYYY-MM-DD"; 13 | 14 | export function formatToDateTime(date: dayjs.Dayjs | undefined = undefined, format = DATE_TIME_FORMAT): string { 15 | return dayjs(date).format(format); 16 | } 17 | 18 | export function formatToDate(date: dayjs.Dayjs | string | undefined = undefined, format = DATE_FORMAT): string { 19 | return dayjs(date).format(format); 20 | } 21 | 22 | export const dateUtil = dayjs; 23 | -------------------------------------------------------------------------------- /packages/nocode/core/index29.js: -------------------------------------------------------------------------------- 1 | import { defineComponent as o, createBlock as r, openBlock as e, unref as t } from "vue"; 2 | import "ant-design-vue"; 3 | import "@mfish/core/hooks"; 4 | import { a3 as s } from "./index.js"; 5 | import "@vueuse/core"; 6 | import "@mfish/core/components/Icon"; 7 | import "lodash-es"; 8 | import "@mfish/core/enums"; 9 | import "@mfish/core/utils/Is"; 10 | import { _ as i } from "./index.vue_vue_type_script_setup_true_lang.js"; 11 | const n = o({ name: "MfBorder8", __name: "index", props: { chart: { type: Object } }, setup: (o2) => (n2, p) => (e(), r(i, { component: t(s), chart: o2.chart, reverse: o2.chart?.options.reverse, duration: o2.chart?.options.duration ? o2.chart?.options.duration : 3 }, null, 8, ["component", "chart", "reverse", "duration"])) }); 12 | export { 13 | n as default 14 | }; 15 | -------------------------------------------------------------------------------- /packages/nocode/core/UseEventSelect.js: -------------------------------------------------------------------------------- 1 | import { u as t, D as n } from "./index.js"; 2 | import { cloneDeep as o } from "lodash-es"; 3 | function e() { 4 | const e2 = t(); 5 | return { getEventComponents: function(t2) { 6 | const s = [], r = (n2) => n2.chart.events && n2.chart.events.emits && n2.chart.events.emits.length > 0 && (t2 && n2.chart.id !== e2.getCurConfigComponent.chart.id || !t2); 7 | for (const t3 of e2.getComponentList) { 8 | if (t3.chart.type !== n.MfCombine) { 9 | r(t3) && s.push(o(t3)); 10 | continue; 11 | } 12 | const e3 = o(t3); 13 | e3.chart.options.components = e3.chart.options.components.filter((t4) => r(t4)), (e3.chart.options.components.length > 0 || r(e3)) && s.push(e3); 14 | } 15 | return s; 16 | } }; 17 | } 18 | export { 19 | e as u 20 | }; 21 | -------------------------------------------------------------------------------- /packages/nocode/core/index35.js: -------------------------------------------------------------------------------- 1 | import { defineComponent as o, createBlock as e, openBlock as r, unref as t } from "vue"; 2 | import "ant-design-vue"; 3 | import "@mfish/core/hooks"; 4 | import { aa as s } from "./index.js"; 5 | import "@vueuse/core"; 6 | import "@mfish/core/components/Icon"; 7 | import "lodash-es"; 8 | import "@mfish/core/enums"; 9 | import "@mfish/core/utils/Is"; 10 | import { _ as i } from "./index.vue_vue_type_script_setup_true_lang.js"; 11 | const n = o({ name: "MfDecoration2", __name: "index", props: { chart: { type: Object } }, setup: (o2) => (n2, p) => (r(), e(i, { component: t(s), chart: o2.chart, reverse: o2.chart?.options.reverse, duration: o2.chart?.options.duration ? o2.chart?.options.duration : 3 }, null, 8, ["component", "chart", "reverse", "duration"])) }); 12 | export { 13 | n as default 14 | }; 15 | -------------------------------------------------------------------------------- /packages/nocode/core/index37.js: -------------------------------------------------------------------------------- 1 | import { defineComponent as o, createBlock as e, openBlock as r, unref as t } from "vue"; 2 | import "ant-design-vue"; 3 | import "@mfish/core/hooks"; 4 | import { ac as s } from "./index.js"; 5 | import "@vueuse/core"; 6 | import "@mfish/core/components/Icon"; 7 | import "lodash-es"; 8 | import "@mfish/core/enums"; 9 | import "@mfish/core/utils/Is"; 10 | import { _ as i } from "./index.vue_vue_type_script_setup_true_lang.js"; 11 | const n = o({ name: "MfDecoration4", __name: "index", props: { chart: { type: Object } }, setup: (o2) => (n2, p) => (r(), e(i, { component: t(s), chart: o2.chart, reverse: o2.chart?.options.reverse, duration: o2.chart?.options.duration ? o2.chart?.options.duration : 3 }, null, 8, ["component", "chart", "reverse", "duration"])) }); 12 | export { 13 | n as default 14 | }; 15 | -------------------------------------------------------------------------------- /src/views/dashboard/workbench/components/QuickNav.vue: -------------------------------------------------------------------------------- 1 | 11 | 23 | -------------------------------------------------------------------------------- /packages/nocode/core/index34.js: -------------------------------------------------------------------------------- 1 | import { defineComponent as o, createBlock as t, openBlock as r, unref as e } from "vue"; 2 | import "ant-design-vue"; 3 | import "@mfish/core/hooks"; 4 | import { a9 as n } from "./index.js"; 5 | import "@vueuse/core"; 6 | import "@mfish/core/components/Icon"; 7 | import "lodash-es"; 8 | import "@mfish/core/enums"; 9 | import "@mfish/core/utils/Is"; 10 | import { _ as a } from "./index.vue_vue_type_script_setup_true_lang.js"; 11 | const i = o({ name: "MfDecoration12", __name: "index", props: { chart: { type: Object } }, setup: (o2) => (i2, s) => (r(), t(a, { component: e(n), chart: o2.chart, "scan-duration": o2.chart?.options.scanDuration, "halo-duration": o2.chart?.options.haloDuration }, null, 8, ["component", "chart", "scan-duration", "halo-duration"])) }); 12 | export { 13 | i as default 14 | }; 15 | -------------------------------------------------------------------------------- /packages/core/src/directives/Permission.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Global authority directive 3 | * Used for fine-grained control of component permissions 4 | * @Example 5 | */ 6 | import type { App, Directive, DirectiveBinding } from "vue"; 7 | import { usePermission } from "@core/hooks"; 8 | 9 | function isAuth(el: Element, binding: any) { 10 | const { hasPermission } = usePermission(); 11 | const value = binding.value; 12 | if (!value) return; 13 | if (!hasPermission(value)) { 14 | el.remove(); 15 | } 16 | } 17 | 18 | const mounted = (el: Element, binding: DirectiveBinding) => { 19 | isAuth(el, binding); 20 | }; 21 | 22 | const authDirective: Directive = { 23 | mounted 24 | }; 25 | 26 | export function setupPermissionDirective(app: App) { 27 | app.directive("auth", authDirective); 28 | } 29 | 30 | export default authDirective; 31 | -------------------------------------------------------------------------------- /packages/core/src/router/Constant.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @description: 常量 3 | * @author: mfish 4 | * @date: 2022/10/8 18:07 5 | */ 6 | export const REDIRECT_NAME = "Redirect"; 7 | 8 | export const PARENT_LAYOUT_NAME = "ParentLayout"; 9 | 10 | export const PAGE_NOT_FOUND_NAME = "PageNotFound"; 11 | 12 | export const EXCEPTION_COMPONENT = () => import("@/views/sys/exception/Exception.vue"); 13 | 14 | /** 15 | * @description: 默认布局 16 | */ 17 | export const LAYOUT = () => import("@/layouts/default/index.vue"); 18 | export const IFRAME = () => import("@/views/sys/iframe/FrameBlank.vue"); 19 | 20 | /** 21 | * @description: 父布局 22 | */ 23 | export const getParentLayout = (_name?: string) => { 24 | return () => 25 | new Promise((resolve) => { 26 | resolve({ 27 | name: _name || PARENT_LAYOUT_NAME 28 | }); 29 | }); 30 | }; 31 | -------------------------------------------------------------------------------- /public/resource/tinymce/skins/ui/oxide/skin.shadowdom.min.css: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Tiny Technologies, Inc. All rights reserved. 3 | * Licensed under the LGPL or a commercial license. 4 | * For LGPL see License.txt in the project root for license information. 5 | * For commercial licenses see https://www.tiny.cloud/ 6 | */ 7 | body.tox-dialog__disable-scroll{overflow:hidden}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;-ms-scroll-chaining:none;overscroll-behavior:none;padding:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201} 8 | -------------------------------------------------------------------------------- /src/layouts/default/header/components/dropdown.less: -------------------------------------------------------------------------------- 1 | .@{prefix-cls} { 2 | height: 28px; 3 | border-radius: 14px; 4 | transition: background 0.5s ease; 5 | overflow: hidden; 6 | font-size: 14px; 7 | cursor: pointer; 8 | align-items: center; 9 | margin: 2px; 10 | padding: 6px; 11 | 12 | img { 13 | width: 24px; 14 | height: 24px; 15 | margin-right: 6px; 16 | } 17 | 18 | &__header { 19 | border-radius: 50%; 20 | } 21 | 22 | &__name { 23 | display: flex; 24 | font-size: 14px; 25 | } 26 | 27 | &:hover { 28 | background-color: @header-bg-hover-color; 29 | } 30 | 31 | &--light { 32 | .@{prefix-cls}__name { 33 | color: @text-color-base; 34 | } 35 | } 36 | 37 | &-dropdown-overlay { 38 | .ant-dropdown-menu-item { 39 | min-width: 160px; 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/layouts/default/header/components/user-dropdown/DropMenuItem.vue: -------------------------------------------------------------------------------- 1 | 9 | 24 | -------------------------------------------------------------------------------- /public/resource/tinymce/skins/ui/oxide-dark/skin.shadowdom.min.css: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Tiny Technologies, Inc. All rights reserved. 3 | * Licensed under the LGPL or a commercial license. 4 | * For LGPL see License.txt in the project root for license information. 5 | * For commercial licenses see https://www.tiny.cloud/ 6 | */ 7 | body.tox-dialog__disable-scroll{overflow:hidden}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;-ms-scroll-chaining:none;overscroll-behavior:none;padding:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201} 8 | -------------------------------------------------------------------------------- /src/views/nocode/file-folder/fileFolder.data.ts: -------------------------------------------------------------------------------- 1 | import { BasicColumn } from "@mfish/core/components/Table"; 2 | import { calcSize } from "@mfish/core/utils/file/FileUtils"; 3 | 4 | /** 5 | * @description: 文件目录 6 | * @author: mfish 7 | * @date: 2023/12/12 8 | */ 9 | export const columns: BasicColumn[] = [ 10 | { 11 | title: "名称", 12 | dataIndex: "name", 13 | width: 120 14 | }, 15 | { 16 | title: "大小", 17 | dataIndex: "fileSize", 18 | width: 120, 19 | customRender: ({ record }) => { 20 | if (record.fileSize) { 21 | return calcSize(record.fileSize, 1); 22 | } 23 | return ""; 24 | } 25 | }, 26 | { 27 | title: "创建时间", 28 | dataIndex: "createTime", 29 | width: 120 30 | }, 31 | { 32 | title: "创建人", 33 | dataIndex: "createBy", 34 | width: 120 35 | } 36 | ]; 37 | -------------------------------------------------------------------------------- /packages/core/src/enums/CacheEnum.ts: -------------------------------------------------------------------------------- 1 | // token key 2 | export const TOKEN_KEY = "TOKEN__"; 3 | // refreshToken key 4 | export const REFRESH_TOKEN_KEY = "REFRESH__TOKEN__"; 5 | 6 | export const TENANT_ID_KEY = "TENANT__ID__"; 7 | export const LOCALE_KEY = "LOCALE__"; 8 | 9 | // project config key 10 | export const PROJ_CFG_KEY = "PROJ__CFG__KEY__"; 11 | 12 | // lock info 13 | export const LOCK_INFO_KEY = "LOCK__INFO__KEY__"; 14 | 15 | export const MULTIPLE_TABS_KEY = "MULTIPLE_TABS__KEY__"; 16 | 17 | // base global local key 18 | export const APP_LOCAL_CACHE_KEY = "COMMON__LOCAL__KEY__"; 19 | 20 | // base global session key 21 | export const APP_SESSION_CACHE_KEY = "COMMON__SESSION__KEY__"; 22 | 23 | // application dark mode key 24 | export const APP_DARK_MODE_KEY = "__APP__DARK__MODE__"; 25 | 26 | export enum CacheTypeEnum { 27 | SESSION, 28 | LOCAL 29 | } 30 | -------------------------------------------------------------------------------- /packages/core/src/components/Table/src/Helper.ts: -------------------------------------------------------------------------------- 1 | import { ROW_KEY } from "./Const"; 2 | import type { BasicTableProps } from "./types/Table"; 3 | 4 | export function parseRowKey( 5 | rowKey: BasicTableProps["rowKey"], 6 | record: RecordType, 7 | autoCreateKey?: boolean 8 | ): number | string { 9 | if (autoCreateKey) { 10 | return ROW_KEY; 11 | } else { 12 | if (typeof rowKey === "string") { 13 | return rowKey; 14 | } else if (rowKey) { 15 | return rowKey(record); 16 | } else { 17 | return ROW_KEY; 18 | } 19 | } 20 | } 21 | 22 | export function parseRowKeyValue( 23 | rowKey: BasicTableProps["rowKey"], 24 | record: RecordType, 25 | autoCreateKey?: boolean 26 | ): number | string { 27 | //@ts-ignore 忽略类型错误 28 | return record[parseRowKey(rowKey, record, autoCreateKey)]; 29 | } 30 | -------------------------------------------------------------------------------- /packages/core/src/enums/AppEnum.ts: -------------------------------------------------------------------------------- 1 | export const SIDE_BAR_MINI_WIDTH = 48; 2 | export const SIDE_BAR_SHOW_TIT_MINI_WIDTH = 80; 3 | 4 | export enum ContentEnum { 5 | // auto width 6 | FULL = "full", 7 | // fixed width 8 | FIXED = "fixed" 9 | } 10 | 11 | // menu theme enum 12 | export enum ThemeEnum { 13 | DARK = "dark", 14 | LIGHT = "light", 15 | SYSTEM = "system" 16 | } 17 | 18 | export enum SettingButtonPositionEnum { 19 | AUTO = "auto", 20 | HEADER = "header", 21 | FIXED = "fixed" 22 | } 23 | 24 | // Route switching animation 25 | // 路由切换动画 26 | export enum RouterTransitionEnum { 27 | FADE = "fade", 28 | FADE_SIDE_LEFT = "fade-slide-left", 29 | FADE_SIDE_RIGHT = "fade-slide-right", 30 | FADE_UP = "fade-up", 31 | FADE_DOWN = "fade-down", 32 | FADE_SCALE = "fade-scale", 33 | ZOOM_FADE = "zoom-fade", 34 | ZOOM_OUT = "zoom-out" 35 | } 36 | -------------------------------------------------------------------------------- /packages/stores/src/modules/Dict.ts: -------------------------------------------------------------------------------- 1 | import { defineStore } from "pinia"; 2 | import { DictItem, getDictItems } from "@mfish/core/api"; 3 | import { ref, Ref } from "vue"; 4 | 5 | /** 6 | * @description: 字典缓存 7 | * @author: mfish 8 | * @date: 2024/3/26 9 | */ 10 | interface DictState { 11 | dictMap: Map>; 12 | } 13 | 14 | export const useDictStore = defineStore("dict", { 15 | state: (): DictState => ({ 16 | dictMap: new Map>() 17 | }), 18 | actions: { 19 | getDict(key: string): Ref | undefined { 20 | if (!this.dictMap.has(key)) { 21 | const item = ref([]); 22 | this.dictMap.set(key, item); 23 | getDictItems(key).then((res: any) => { 24 | item.value = res; 25 | }); 26 | } 27 | return this.dictMap.get(key); 28 | } 29 | } 30 | }); 31 | -------------------------------------------------------------------------------- /src/api/sys/model/SysLogModel.ts: -------------------------------------------------------------------------------- 1 | import { BaseEntity, PageResult, ReqPage } from "@mfish/core/api"; 2 | 3 | /** 4 | * @description: 系统日志 5 | * @author: mfish 6 | * @date: 2023-01-08 7 | * @version: V2.2.0 8 | */ 9 | export interface SysLog extends BaseEntity { 10 | title: string; 11 | method: string; 12 | reqType: string; 13 | reqUri: string; 14 | reqParam: string; 15 | reqSource: number; 16 | operType: string; 17 | operIp: string; 18 | operStatus: number; 19 | remark: string; 20 | } 21 | 22 | export interface ReqSysLog extends ReqPage { 23 | title?: string; 24 | method?: string; 25 | reqType?: string; 26 | reqUri?: string; 27 | reqSource?: number; 28 | operType?: string; 29 | operIp?: string; 30 | operStatus?: number; 31 | startTime?: string; 32 | endTime?: string; 33 | } 34 | 35 | export type SysLogPageModel = PageResult; 36 | -------------------------------------------------------------------------------- /packages/core/src/components/Table/src/hooks/UseTableStyle.ts: -------------------------------------------------------------------------------- 1 | import type { ComputedRef } from "vue"; 2 | import { unref } from "vue"; 3 | import type { BasicTableProps, TableCustomRecord } from "../types/Table"; 4 | import { isFunction } from "@core/utils/Is"; 5 | 6 | export function useTableStyle(propsRef: ComputedRef, prefixCls: string) { 7 | function getRowClassName(record: TableCustomRecord, index: number) { 8 | const { striped, rowClassName } = unref(propsRef); 9 | const classNames: string[] = []; 10 | if (striped) { 11 | classNames.push((index || 0) % 2 === 1 ? `${prefixCls}-row__striped` : ""); 12 | } 13 | if (rowClassName && isFunction(rowClassName)) { 14 | classNames.push(rowClassName(record, index)); 15 | } 16 | return classNames.filter((cls) => !!cls).join(" "); 17 | } 18 | 19 | return { getRowClassName }; 20 | } 21 | -------------------------------------------------------------------------------- /packages/core/src/utils/http/axios/AxiosRetry.ts: -------------------------------------------------------------------------------- 1 | import { AxiosInstance } from "axios"; 2 | 3 | /** 4 | * 请求重试机制 5 | */ 6 | 7 | export class AxiosRetry { 8 | /** 9 | * 重试 10 | */ 11 | retry(axiosInstance: AxiosInstance, error: any) { 12 | const { config } = error.response; 13 | const { waitTime, count } = config.requestOptions.retryRequest; 14 | config.__retryCount = config.__retryCount || 0; 15 | if (config.__retryCount >= count) { 16 | return Promise.reject(error); 17 | } 18 | config.__retryCount += 1; 19 | // 请求返回后config的header不正确造成重试请求失败,删除返回headers采用默认headers 20 | delete config.headers; 21 | return this.delay(waitTime).then(() => axiosInstance(config)); 22 | } 23 | 24 | /** 25 | * 延迟 26 | */ 27 | private delay(waitTime: number) { 28 | return new Promise((resolve) => setTimeout(resolve, waitTime)); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /packages/core/src/components/Table/src/components/editable/Helper.ts: -------------------------------------------------------------------------------- 1 | import { ComponentType } from "../../types/ComponentType"; 2 | import { useI18n } from "@core/hooks"; 3 | 4 | const { t } = useI18n(); 5 | 6 | /** 7 | * @description: 生成placeholder 8 | */ 9 | export function createPlaceholderMessage(component: ComponentType) { 10 | if (component.includes("Input") || component.includes("AutoComplete")) { 11 | return t("common.inputText"); 12 | } 13 | if (component.includes("Picker")) { 14 | return t("common.chooseText"); 15 | } 16 | 17 | if ( 18 | component.includes("Select") || 19 | component.includes("Checkbox") || 20 | component.includes("Radio") || 21 | component.includes("Switch") || 22 | component.includes("DatePicker") || 23 | component.includes("TimePicker") 24 | ) { 25 | return t("common.chooseText"); 26 | } 27 | return ""; 28 | } 29 | -------------------------------------------------------------------------------- /packages/core/src/router/guard/StateGuard.ts: -------------------------------------------------------------------------------- 1 | import type { Router } from "vue-router"; 2 | import { useAppStore, useMultipleTabStore, usePermissionStore, useUserStore } from "@mfish/stores/modules"; 3 | import { PageEnum } from "@core/enums"; 4 | import { removeTabChangeListener } from "@core/logics/mitt/RouteChange"; 5 | 6 | export function createStateGuard(router: Router) { 7 | router.afterEach((to) => { 8 | // 只需进入登录页面并清除身份验证信息 9 | if (to.path === PageEnum.BASE_LOGIN) { 10 | const userStore = useUserStore(); 11 | const appStore = useAppStore(); 12 | const permissionStore = usePermissionStore(); 13 | const tabStore = useMultipleTabStore(); 14 | appStore.resetAllState().then(); 15 | permissionStore.resetState(); 16 | tabStore.resetState(); 17 | userStore.resetState(); 18 | removeTabChangeListener(); 19 | } 20 | }); 21 | } 22 | -------------------------------------------------------------------------------- /internal/prettier-config/index.mjs: -------------------------------------------------------------------------------- 1 | export default { 2 | printWidth: 120, 3 | semi: true, //句末使用分号 4 | vueIndentScriptAndStyle: true, //不对vue中的script及style标签缩进 5 | singleQuote: false, //是否使用单引号 6 | trailingComma: "none", //all 多行最后带逗号 none不要最后逗号 7 | proseWrap: "never", 8 | htmlWhitespaceSensitivity: "strict", //对HTML全局空白不敏感 9 | endOfLine: "auto", //结束行形式 10 | // tabWidth: 2, //缩进长度 11 | useTabs: false, //使用空格代替tab缩进 12 | quoteProps: "as-needed", //仅在必需时为对象的key添加引号 13 | jsxSingleQuote: true, // jsx中使用单引号 14 | bracketSpacing: true, //在对象前后添加空格-eg: { foo: bar } 15 | // jsxBracketSameLine: true, //多属性html标签的‘>’折行放置 16 | // arrowParens: 'always', //单参数箭头函数参数周围使用圆括号-eg: (x) => x 17 | requirePragma: false, //无需顶部注释即可格式化 18 | // insertPragma: false, //在已被prettier格式化的文件顶部加上标注 19 | embeddedLanguageFormatting: "auto", //对引用代码进行格式化 20 | plugins: ["prettier-plugin-packagejson"] 21 | }; 22 | -------------------------------------------------------------------------------- /internal/ts-config/base.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "display": "Base", 4 | "compilerOptions": { 5 | "target": "ESNext", 6 | "module": "ESNext", 7 | "moduleResolution": "bundler", 8 | "strict": true, 9 | "declaration": true, 10 | "noImplicitOverride": true, 11 | "noUnusedLocals": true, 12 | "esModuleInterop": true, 13 | "useUnknownInCatchVariables": false, 14 | "composite": false, 15 | "declarationMap": false, 16 | "forceConsistentCasingInFileNames": true, 17 | "inlineSources": false, 18 | "isolatedModules": true, 19 | "skipLibCheck": true, 20 | "noUnusedParameters": false, 21 | "preserveWatchOutput": true, 22 | "experimentalDecorators": true, 23 | "resolveJsonModule": true, 24 | "removeComments": true 25 | }, 26 | "exclude": ["**/node_modules/**", "**/dist/**", "**/.turbo/**"] 27 | } 28 | -------------------------------------------------------------------------------- /packages/core/src/components/Form/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./src/types/Form"; 2 | export * from "./src/types/FormItem"; 3 | export * from "./src/types/index.ts"; 4 | export { useComponentRegister } from "./src/hooks/UseComponentRegister"; 5 | export { useForm } from "./src/hooks/UseForm"; 6 | export { default as ApiSelect } from "./src/components/ApiSelect.vue"; 7 | export { default as RadioButtonGroup } from "./src/components/RadioButtonGroup.vue"; 8 | export { default as ApiTreeSelect } from "./src/components/ApiTreeSelect.vue"; 9 | export { default as ApiTree } from "./src/components/ApiTree.vue"; 10 | export { default as ApiRadioGroup } from "./src/components/ApiRadioGroup.vue"; 11 | export { default as ApiCascader } from "./src/components/ApiCascader.vue"; 12 | export { default as ApiTransfer } from "./src/components/ApiTransfer.vue"; 13 | 14 | export { default as BasicForm } from "./src/BasicForm.vue"; 15 | -------------------------------------------------------------------------------- /packages/core/src/components/ContextMenu/src/Typing.ts: -------------------------------------------------------------------------------- 1 | import { Fn } from "@mfish/types"; 2 | 3 | export interface Axis { 4 | x: number; 5 | y: number; 6 | } 7 | 8 | export interface ContextMenuItem { 9 | label: string; 10 | icon?: string; 11 | hidden?: boolean; 12 | disabled?: boolean; 13 | handler?: Fn; 14 | divider?: boolean; 15 | children?: ContextMenuItem[]; 16 | } 17 | 18 | export interface CreateContextOptions { 19 | event: MouseEvent; 20 | icon?: string; 21 | styles?: any; 22 | items?: ContextMenuItem[]; 23 | } 24 | 25 | export interface ContextMenuProps { 26 | event?: MouseEvent; 27 | styles?: any; 28 | items: ContextMenuItem[]; 29 | customEvent?: MouseEvent; 30 | axis?: Axis; 31 | width?: number; 32 | showIcon?: boolean; 33 | } 34 | 35 | export interface ItemContentProps { 36 | showIcon: boolean | undefined; 37 | item: ContextMenuItem; 38 | handler: Fn; 39 | } 40 | -------------------------------------------------------------------------------- /packages/core/src/api/sys/model/DictCategoryModel.ts: -------------------------------------------------------------------------------- 1 | import { BaseEntity, PageResult, ReqPage } from "@core/api/model/BaseModel.ts"; 2 | 3 | /** 4 | * @description: 属性分类字典 5 | * @author: mfish 6 | * @date: 2024-03-12 7 | * @version: V2.2.0 8 | */ 9 | export interface DictCategory extends BaseEntity { 10 | // 父分类id 11 | parentId?: string; 12 | // 分类编码 13 | categoryCode: string; 14 | // 分类名称 15 | categoryName: string; 16 | // 分类树编码(系统自动编码) 17 | treeCode?: string; 18 | // 分类树层级(自动生成) 19 | treeLevel: number; 20 | //图标 21 | icon?: string; 22 | //备注 23 | remark?: string; 24 | // 排序 25 | sort?: number; 26 | children?: DictCategory[]; 27 | } 28 | 29 | export interface ReqDictCategory extends ReqPage { 30 | // 分类名称 31 | categoryName?: string; 32 | // 分类编码 33 | categoryCode?: string; 34 | } 35 | 36 | // 分页结果集 37 | export type DictCategoryPageModel = PageResult; 38 | -------------------------------------------------------------------------------- /packages/core/src/components/Modal/src/hooks/UseModalFullScreen.ts: -------------------------------------------------------------------------------- 1 | import { computed, Ref, ref, unref } from "vue"; 2 | import { ComponentRef } from "@mfish/types"; 3 | 4 | export interface UseFullScreenContext { 5 | wrapClassName: Ref; 6 | modalWrapperRef: Ref; 7 | extHeightRef: Ref; 8 | } 9 | 10 | export function useFullScreen(context: UseFullScreenContext) { 11 | // const formerHeightRef = ref(0); 12 | const fullScreenRef = ref(false); 13 | 14 | const getWrapClassName = computed(() => { 15 | const clsName = unref(context.wrapClassName) || ""; 16 | return unref(fullScreenRef) ? `fullscreen-modal ${clsName} ` : unref(clsName); 17 | }); 18 | 19 | function handleFullScreen(e: Event) { 20 | e && e.stopPropagation(); 21 | fullScreenRef.value = !unref(fullScreenRef); 22 | } 23 | 24 | return { getWrapClassName, handleFullScreen, fullScreenRef }; 25 | } 26 | -------------------------------------------------------------------------------- /packages/core/src/utils/OutsideOpenUtils.ts: -------------------------------------------------------------------------------- 1 | import { onMounted, onUnmounted } from "vue"; 2 | import { buildUUID } from "./Uuid"; 3 | 4 | /** 5 | * @description: 外部打开窗体完成后触发通用类 6 | * @author: mfish 7 | * @date: 2024/8/7 8 | */ 9 | export const useOutsideOpen = (constant: string, complete?: () => void) => { 10 | onMounted(() => { 11 | globalThis.addEventListener("storage", onStorageHandle); 12 | }); 13 | onUnmounted(() => { 14 | globalThis.removeEventListener("storage", onStorageHandle); 15 | }); 16 | 17 | function onStorageHandle(e: any) { 18 | if (e.key !== constant) return; 19 | complete && complete(); 20 | } 21 | 22 | function open(routeData: any) { 23 | localStorage.setItem(constant, buildUUID()); 24 | window.open(routeData.href, "_blank"); 25 | } 26 | 27 | function end() { 28 | localStorage.setItem(constant, buildUUID()); 29 | } 30 | 31 | return { open, end }; 32 | }; 33 | -------------------------------------------------------------------------------- /packages/core/src/api/storage/Upload.ts: -------------------------------------------------------------------------------- 1 | import { defHttp } from "@core/utils/http/axios"; 2 | import { UploadFileParams } from "@mfish/types/src/type/axios"; 3 | import { AxiosProgressEvent } from "axios"; 4 | import { SysFile } from "@core/api"; 5 | 6 | /** 7 | * @description: Upload interface 8 | */ 9 | export function uploadApi(params: UploadFileParams, onUploadProgress?: (progressEvent: AxiosProgressEvent) => void) { 10 | return defHttp.upload({ 11 | url: "/storage/file", 12 | params, 13 | onUploadProgress 14 | }); 15 | } 16 | 17 | /** 18 | * 上传更新文件 19 | * @param params 参数 20 | * @param onUploadProgress 上传进度 21 | */ 22 | export function uploadUpdateApi( 23 | params: UploadFileParams, 24 | onUploadProgress?: (progressEvent: AxiosProgressEvent) => void 25 | ) { 26 | return defHttp.upload({ 27 | url: `/storage/file/update`, 28 | params, 29 | onUploadProgress 30 | }); 31 | } 32 | -------------------------------------------------------------------------------- /packages/core/src/api/sys/model/SsoTenantModel.ts: -------------------------------------------------------------------------------- 1 | import { BaseEntity, PageResult, ReqPage } from "@core/api/model/BaseModel.ts"; 2 | 3 | /** 4 | * @description: 租户信息表 5 | * @author: mfish 6 | * @date: 2023-05-31 7 | * @version: V2.2.0 8 | */ 9 | export interface SsoTenant extends BaseEntity { 10 | name?: string; 11 | city?: string; 12 | province?: string; 13 | county?: string; 14 | address?: string; 15 | corpSize?: string; 16 | corpYears?: string; 17 | trade?: string; 18 | status?: number; 19 | logo?: string; 20 | domain?: string; 21 | delFlag?: number; 22 | userId?: string; 23 | tenantType?: number; 24 | } 25 | 26 | export interface TenantVo extends SsoTenant { 27 | account?: string; 28 | master?: number; 29 | } 30 | 31 | export interface ReqSsoTenant extends ReqPage { 32 | domain?: string; 33 | name?: string; 34 | } 35 | 36 | export type SsoTenantPageModel = PageResult; 37 | -------------------------------------------------------------------------------- /packages/styles/src/var/easing.less: -------------------------------------------------------------------------------- 1 | // ================================= 2 | // ==============动画函数-=========== 3 | // ================================= 4 | 5 | @ease-base-out: cubic-bezier(0.7, 0.3, 0.1, 1); 6 | @ease-base-in: cubic-bezier(0.9, 0, 0.3, 0.7); 7 | @ease-out: cubic-bezier(0.215, 0.61, 0.355, 1); 8 | @ease-in: cubic-bezier(0.55, 0.055, 0.675, 0.19); 9 | @ease-in-out: cubic-bezier(0.645, 0.045, 0.355, 1); 10 | @ease-out-back: cubic-bezier(0.12, 0.4, 0.29, 1.46); 11 | @ease-in-back: cubic-bezier(0.71, -0.46, 0.88, 0.6); 12 | @ease-in-out-back: cubic-bezier(0.71, -0.46, 0.29, 1.46); 13 | @ease-out-circ: cubic-bezier(0.08, 0.82, 0.17, 1); 14 | @ease-in-circ: cubic-bezier(0.6, 0.04, 0.98, 0.34); 15 | @ease-in-out-circ: cubic-bezier(0.78, 0.14, 0.15, 0.86); 16 | @ease-out-quint: cubic-bezier(0.23, 1, 0.32, 1); 17 | @ease-in-quint: cubic-bezier(0.755, 0.05, 0.855, 0.06); 18 | @ease-in-out-quint: cubic-bezier(0.86, 0, 0.07, 1); 19 | -------------------------------------------------------------------------------- /packages/nocode/core/MfMapScatterConfig.js: -------------------------------------------------------------------------------- 1 | import { defineComponent as o, ref as e, watch as t, createBlock as n, openBlock as i, withCtx as r, createVNode as f } from "vue"; 2 | import { M as a } from "./MfMapConfig.js"; 3 | import { M as s } from "./MfEffectScatterConfig.js"; 4 | import { u as p } from "./index.js"; 5 | const u = o({ __name: "MfMapScatterConfig", setup(o2) { 6 | const u2 = p(), C = e(); 7 | function g(o3) { 8 | u2.getCurConfigComponent.chart.options.series[0] = o3; 9 | } 10 | return t(() => u2.getCurConfigComponent, (o3) => { 11 | o3 && u2.getCurConfigComponent.chart.options.series?.length > 0 && (C.value = u2.getCurConfigComponent.chart.options.series[0]); 12 | }, { immediate: true }), (o3, e2) => (i(), n(a, null, { default: r(() => [f(s, { "allow-check": false, "default-expand": true, config: C.value, onChange: g }, null, 8, ["config"])]), _: 1 })); 13 | } }); 14 | export { 15 | u as default 16 | }; 17 | -------------------------------------------------------------------------------- /packages/core/src/components/Table/src/components/settings/FullScreenSetting.vue: -------------------------------------------------------------------------------- 1 | 10 | 23 | -------------------------------------------------------------------------------- /packages/core/src/hooks/setting/UseMultipleTabSetting.ts: -------------------------------------------------------------------------------- 1 | import type { MultiTabsSetting } from "@mfish/types/src/type/config"; 2 | import { computed } from "vue"; 3 | import { useAppStore } from "@mfish/stores/modules"; 4 | 5 | export function useMultipleTabSetting() { 6 | const appStore = useAppStore(); 7 | const getShowMultipleTab = computed(() => appStore.getMultiTabsSetting.show); 8 | const getShowQuick = computed(() => appStore.getMultiTabsSetting.showQuick); 9 | const getShowRedo = computed(() => appStore.getMultiTabsSetting.showRedo); 10 | const getShowFold = computed(() => appStore.getMultiTabsSetting.showFold); 11 | 12 | function setMultipleTabSetting(multiTabsSetting: Partial) { 13 | appStore.setProjectConfig({ multiTabsSetting }); 14 | } 15 | 16 | return { 17 | setMultipleTabSetting, 18 | getShowMultipleTab, 19 | getShowQuick, 20 | getShowRedo, 21 | getShowFold 22 | }; 23 | } 24 | -------------------------------------------------------------------------------- /src/views/sys/database/DataBaseModal.vue: -------------------------------------------------------------------------------- 1 | 6 | 15 | 25 | -------------------------------------------------------------------------------- /packages/nocode/core/MfBorder4Config.js: -------------------------------------------------------------------------------- 1 | import { defineComponent as e, createBlock as o, openBlock as r, normalizeClass as t, unref as s, withCtx as n, createVNode as c, createTextVNode as f } from "vue"; 2 | import { Checkbox as i } from "ant-design-vue"; 3 | import a from "./MfBorderConfig.js"; 4 | import { useDesign as d } from "@mfish/core/hooks"; 5 | import { u as m, _ as p } from "./index.js"; 6 | const u = p(e({ __name: "MfBorder4Config", setup(e2) { 7 | const { prefixCls: p2 } = d("border4-config"), u2 = m(); 8 | return (e3, d2) => (r(), o(a, { class: t(s(p2)) }, { default: n(() => [c(s(i), { checked: s(u2).getCurConfigComponent.chart.options.reverse, "onUpdate:checked": d2[0] || (d2[0] = (e4) => s(u2).getCurConfigComponent.chart.options.reverse = e4) }, { default: n(() => [...d2[1] || (d2[1] = [f(" 是否反转", -1)])]), _: 1 }, 8, ["checked"])]), _: 1 }, 8, ["class"])); 9 | } }), [["__scopeId", "data-v-7564c18c"]]); 10 | export { 11 | u as default 12 | }; 13 | -------------------------------------------------------------------------------- /packages/nocode/core/index33.js: -------------------------------------------------------------------------------- 1 | import { defineComponent as t, computed as e, createBlock as o, openBlock as r, unref as s, withCtx as i, createElementVNode as m, normalizeStyle as p, toDisplayString as a } from "vue"; 2 | import "ant-design-vue"; 3 | import "@mfish/core/hooks"; 4 | import { a7 as n, a8 as c } from "./index.js"; 5 | import "@vueuse/core"; 6 | import "@mfish/core/components/Icon"; 7 | import "lodash-es"; 8 | import "@mfish/core/enums"; 9 | import "@mfish/core/utils/Is"; 10 | import { _ as u } from "./index.vue_vue_type_script_setup_true_lang.js"; 11 | const h = t({ name: "MfDecoration11", __name: "index", props: { chart: { type: Object } }, setup(t2) { 12 | const h2 = t2, f = e(() => n(h2?.chart)); 13 | return (e2, n2) => (r(), o(u, { component: s(c), chart: t2.chart }, { default: i(() => [m("div", { style: p(f.value) }, a(t2.chart?.options.title), 5)]), _: 1 }, 8, ["component", "chart"])); 14 | } }); 15 | export { 16 | h as default 17 | }; 18 | -------------------------------------------------------------------------------- /packages/nocode/core/index40.js: -------------------------------------------------------------------------------- 1 | import { defineComponent as t, computed as e, createBlock as o, openBlock as r, unref as s, withCtx as i, createElementVNode as m, normalizeStyle as p, toDisplayString as a } from "vue"; 2 | import "ant-design-vue"; 3 | import "@mfish/core/hooks"; 4 | import { a7 as n, af as c } from "./index.js"; 5 | import "@vueuse/core"; 6 | import "@mfish/core/components/Icon"; 7 | import "lodash-es"; 8 | import "@mfish/core/enums"; 9 | import "@mfish/core/utils/Is"; 10 | import { _ as u } from "./index.vue_vue_type_script_setup_true_lang.js"; 11 | const h = t({ name: "MfDecoration7", __name: "index", props: { chart: { type: Object } }, setup(t2) { 12 | const h2 = t2, f = e(() => n(h2?.chart)); 13 | return (e2, n2) => (r(), o(u, { component: s(c), chart: t2.chart }, { default: i(() => [m("div", { style: p(f.value) }, a(t2.chart?.options.title), 5)]), _: 1 }, 8, ["component", "chart"])); 14 | } }); 15 | export { 16 | h as default 17 | }; 18 | -------------------------------------------------------------------------------- /packages/types/src/type/store.d.ts: -------------------------------------------------------------------------------- 1 | import { ErrorTypeEnum, MenuModeEnum, MenuTypeEnum } from "@mfish/core/enums"; 2 | 3 | /** 4 | * @description: 缓存定义 5 | * @author: mfish 6 | * @date: 2022/10/11 15:23 7 | */ 8 | // 锁屏信息 9 | export interface LockInfo { 10 | // Password required 11 | pwd?: string | undefined; 12 | // Is it locked? 13 | isLock?: boolean; 14 | } 15 | 16 | // 错误日志信息 17 | export interface ErrorLogInfo { 18 | // Type of error 19 | type: ErrorTypeEnum; 20 | // Error file 21 | file: string; 22 | // Error name 23 | name?: string; 24 | // Error message 25 | message: string; 26 | // Error stack 27 | stack?: string; 28 | // Error detail 29 | detail: string; 30 | // Error url 31 | url: string; 32 | // Error time 33 | time?: string; 34 | } 35 | 36 | export interface BeforeMiniState { 37 | menuCollapsed?: boolean; 38 | menuSplit?: boolean; 39 | menuMode?: MenuModeEnum; 40 | menuType?: MenuTypeEnum; 41 | } 42 | -------------------------------------------------------------------------------- /src/api/demo/model/DemoOrderDetailModel.ts: -------------------------------------------------------------------------------- 1 | import { BaseEntity, PageResult, ReqPage } from "@mfish/core/api"; 2 | 3 | /** 4 | * @description: 销售订单明细 5 | * @author: mfish 6 | * @date: 2024-09-02 7 | * @version: V2.2.0 8 | */ 9 | export interface DemoOrderDetail extends BaseEntity { 10 | //订单号 11 | orderId: string; 12 | //商品名称 13 | goodsName?: string; 14 | //商品货品图片或者商品图片 15 | picUrl?: string; 16 | //商品单价 17 | goodsPrice?: number; 18 | //商品原价 19 | goodsPricePro?: number; 20 | //购买数量 21 | goodsCount?: number; 22 | //发货时间 23 | sendTime?: string; 24 | //收货时间 25 | receiveTime?: string; 26 | //实际支付金额 27 | payAmount?: number; 28 | //商品优惠总金额 29 | discount?: number; 30 | //优惠券扣减金额 31 | couponDiscount?: number; 32 | } 33 | 34 | export interface ReqDemoOrderDetail extends ReqPage { 35 | //订单号 36 | orderId?: string; 37 | } 38 | 39 | //分页结果集 40 | export type DemoOrderDetailPageModel = PageResult; 41 | -------------------------------------------------------------------------------- /packages/core/src/utils/auth/index.ts: -------------------------------------------------------------------------------- 1 | import { BasicKeys, Persistent } from "../cache/Persistent"; 2 | import { CacheTypeEnum, TOKEN_KEY } from "../../enums"; 3 | import projectSetting from "../../settings/ProjectSetting"; 4 | 5 | const { permissionCacheType } = projectSetting; 6 | const isLocal = permissionCacheType === CacheTypeEnum.LOCAL; 7 | 8 | export function getToken() { 9 | return getAuthCache(TOKEN_KEY); 10 | } 11 | 12 | export function getAuthCache(key: BasicKeys | string) { 13 | const fn = isLocal ? Persistent.getLocal : Persistent.getSession; 14 | return fn(key) as T; 15 | } 16 | 17 | export function setAuthCache(key: BasicKeys | string, value: any) { 18 | const fn = isLocal ? Persistent.setLocal : Persistent.setSession; 19 | return fn(key, value, true); 20 | } 21 | 22 | export function clearAuthCache(immediate = true) { 23 | const fn = isLocal ? Persistent.clearLocal : Persistent.clearSession; 24 | return fn(immediate); 25 | } 26 | -------------------------------------------------------------------------------- /packages/styles/src/var/breakpoint.less: -------------------------------------------------------------------------------- 1 | // ================================= 2 | // ==============屏幕断点============ 3 | // ================================= 4 | 5 | // Extra small screen / phone 6 | @screen-xs: 480px; 7 | @screen-xs-min: @screen-xs; 8 | 9 | // Small screen / tablet 10 | @screen-sm: 576px; 11 | @screen-sm-min: @screen-sm; 12 | 13 | // Medium screen / desktop 14 | @screen-md: 768px; 15 | @screen-md-min: @screen-md; 16 | 17 | // Large screen / wide desktop 18 | @screen-lg: 992px; 19 | @screen-lg-min: @screen-lg; 20 | 21 | // Extra large screen / full hd 22 | @screen-xl: 1200px; 23 | @screen-xl-min: @screen-xl; 24 | 25 | // Extra extra large screen / large desktop 26 | @screen-2xl: 1600px; 27 | @screen-2xl-min: @screen-2xl; 28 | 29 | @screen-xs-max: (@screen-sm-min - 1px); 30 | @screen-sm-max: (@screen-md-min - 1px); 31 | @screen-md-max: (@screen-lg-min - 1px); 32 | @screen-lg-max: (@screen-xl-min - 1px); 33 | @screen-xl-max: (@screen-2xl-min - 1px); 34 | -------------------------------------------------------------------------------- /packages/nocode/core/MfDecoration8Config.js: -------------------------------------------------------------------------------- 1 | import { defineComponent as o, createBlock as e, openBlock as t, normalizeClass as r, unref as n, withCtx as s, createVNode as i, createTextVNode as a } from "vue"; 2 | import { Checkbox as c } from "ant-design-vue"; 3 | import f from "./MfDecorationConfig.js"; 4 | import { useDesign as m } from "@mfish/core/hooks"; 5 | import { u as p, _ as d } from "./index.js"; 6 | const u = d(o({ __name: "MfDecoration8Config", setup(o2) { 7 | const { prefixCls: d2 } = m("decoration2-config"), u2 = p(); 8 | return (o3, m2) => (t(), e(f, { class: r(n(d2)) }, { default: s(() => [i(n(c), { checked: n(u2).getCurConfigComponent.chart.options.reverse, "onUpdate:checked": m2[0] || (m2[0] = (o4) => n(u2).getCurConfigComponent.chart.options.reverse = o4) }, { default: s(() => [...m2[1] || (m2[1] = [a(" 是否反转", -1)])]), _: 1 }, 8, ["checked"])]), _: 1 }, 8, ["class"])); 9 | } }), [["__scopeId", "data-v-0e946656"]]); 10 | export { 11 | u as default 12 | }; 13 | -------------------------------------------------------------------------------- /src/layouts/iframe/index.vue: -------------------------------------------------------------------------------- 1 | 12 | 27 | -------------------------------------------------------------------------------- /packages/core/src/api/index.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @description: api入口 3 | * @author: mfish 4 | * @date: 2025/4/15 5 | */ 6 | export * from "./model/BaseModel.ts"; 7 | export * from "./sys/model/DbConnectModel.ts"; 8 | export * from "./sys/model/DictItemModel.ts"; 9 | export * from "./sys/model/UserModel.ts"; 10 | export * from "./sys/model/RoleModel.ts"; 11 | export * from "./sys/model/MenuModel.ts"; 12 | export * from "./sys/model/OrgModel.ts"; 13 | export * from "./sys/model/DictCategoryModel.ts"; 14 | export * from "./sys/model/SsoTenantModel.ts"; 15 | export * from "./sys/DictCategory.ts"; 16 | export * from "./sys/DictItem.ts"; 17 | export * from "./sys/User.ts"; 18 | export * from "./sys/Role.ts"; 19 | export * from "./sys/Menu.ts"; 20 | export * from "./sys/Org.ts"; 21 | export * from "./sys/SsoTenant.ts"; 22 | export * from "./sys/DbConnect.ts"; 23 | export * from "./storage/model/SysFileModel.ts"; 24 | export * from "./storage/SysFile.ts"; 25 | export * from "./storage/Upload.ts"; 26 | -------------------------------------------------------------------------------- /packages/core/src/hooks/setting/UseFullContent.ts: -------------------------------------------------------------------------------- 1 | import { computed, unref } from "vue"; 2 | import { useAppStore } from "@mfish/stores/modules"; 3 | import { useRouter } from "vue-router"; 4 | 5 | /** 6 | * @description: Full screen display content 7 | */ 8 | export const useFullContent = () => { 9 | const appStore = useAppStore(); 10 | const router = useRouter(); 11 | const { currentRoute } = router; 12 | 13 | // Whether to display the content in full screen without displaying the menu 14 | const getFullContent = computed(() => { 15 | // Query parameters, the full screen is displayed when the address bar has a full parameter 16 | const route = unref(currentRoute); 17 | const query = route.query; 18 | if (query && Reflect.has(query, "__full__")) { 19 | return true; 20 | } 21 | // Return to the configuration in the configuration file 22 | return appStore.getProjectConfig.fullContent; 23 | }); 24 | 25 | return { getFullContent }; 26 | }; 27 | -------------------------------------------------------------------------------- /packages/core/src/utils/helper/TsxHelper.tsx: -------------------------------------------------------------------------------- 1 | import { Slots } from "vue"; 2 | import { isFunction } from "../../utils/Is"; 3 | 4 | /** 5 | * @description: 获取插槽 6 | */ 7 | export function getSlot(slots: Slots, slot = "default", data?: any) { 8 | if (!slots || !Reflect.has(slots, slot)) { 9 | return null; 10 | } 11 | if (!isFunction(slots[slot])) { 12 | console.error(`${slot} is not a function!`); 13 | return null; 14 | } 15 | const slotFn = slots[slot]; 16 | if (!slotFn) return null; 17 | return slotFn(data); 18 | } 19 | 20 | /** 21 | * extends slots 22 | * @param slots 23 | * @param excludeKeys 24 | */ 25 | export function extendSlots(slots: Slots, excludeKeys: string[] = []) { 26 | const slotKeys = Object.keys(slots); 27 | const ret: any = {}; 28 | slotKeys.map((key) => { 29 | if (excludeKeys.includes(key)) { 30 | return null; 31 | } 32 | ret[key] = (data?: any) => getSlot(slots, key, data); 33 | }); 34 | return ret; 35 | } 36 | -------------------------------------------------------------------------------- /internal/eslint-config/src/index.ts: -------------------------------------------------------------------------------- 1 | import type { Linter } from "eslint"; 2 | 3 | import { 4 | command, 5 | comments, 6 | disableds, 7 | ignores, 8 | javascript, 9 | jsdoc, 10 | jsonc, 11 | prettier, 12 | regexp, 13 | turbo, 14 | typescript, 15 | unicorn, 16 | vue 17 | } from "./configs"; 18 | 19 | type FlatConfig = Linter.Config; 20 | 21 | type FlatConfigPromise = FlatConfig | FlatConfig[] | Promise | Promise; 22 | 23 | async function defineConfig(config: FlatConfig[] = []) { 24 | const configs: FlatConfigPromise[] = [ 25 | vue(), 26 | javascript(), 27 | ignores(), 28 | prettier(), 29 | typescript(), 30 | jsonc(), 31 | disableds(), 32 | comments(), 33 | jsdoc(), 34 | unicorn(), 35 | regexp(), 36 | command(), 37 | turbo(), 38 | ...config 39 | ]; 40 | 41 | const resolved = await Promise.all(configs); 42 | 43 | return resolved.flat(); 44 | } 45 | 46 | export { defineConfig }; 47 | -------------------------------------------------------------------------------- /packages/core/src/hooks/event/UseWindowSizeFn.ts: -------------------------------------------------------------------------------- 1 | import { tryOnMounted, tryOnUnmounted, useDebounceFn } from "@vueuse/core"; 2 | import type { Fn } from "@mfish/types"; 3 | 4 | interface WindowSizeOptions { 5 | wait?: number; 6 | once?: boolean; 7 | immediate?: boolean; 8 | listenerOptions?: AddEventListenerOptions | boolean; 9 | } 10 | 11 | export function useWindowSizeFn(fn: Fn, options: WindowSizeOptions = {}) { 12 | const { wait = 150, immediate } = options; 13 | let handler = () => { 14 | fn(); 15 | }; 16 | 17 | handler = useDebounceFn(handler, wait); 18 | 19 | const start = () => { 20 | if (immediate) { 21 | handler(); 22 | } 23 | window.addEventListener("resize", handler); 24 | }; 25 | 26 | const stop = () => { 27 | window.removeEventListener("resize", handler); 28 | }; 29 | 30 | tryOnMounted(() => { 31 | start(); 32 | }); 33 | 34 | tryOnUnmounted(() => { 35 | stop(); 36 | }); 37 | return { start, stop }; 38 | } 39 | -------------------------------------------------------------------------------- /packages/core/src/components/Modal/src/components/ModalFooter.vue: -------------------------------------------------------------------------------- 1 | 14 | 29 | -------------------------------------------------------------------------------- /packages/core/src/components/Table/src/Const.ts: -------------------------------------------------------------------------------- 1 | import componentSetting from "@core/settings/ComponentSetting"; 2 | 3 | const { table } = componentSetting; 4 | 5 | const { pageSizeOptions, defaultPageSize, fetchSetting, defaultSize, defaultSortFn, defaultFilterFn } = table; 6 | 7 | export const ROW_KEY = "key"; 8 | 9 | // Optional display number per page; 10 | export const PAGE_SIZE_OPTIONS = pageSizeOptions; 11 | 12 | // Number of items displayed per page 13 | export const PAGE_SIZE = defaultPageSize; 14 | 15 | // Common interface field settings 16 | export const FETCH_SETTING = fetchSetting; 17 | 18 | // Default Size 19 | export const DEFAULT_SIZE = defaultSize; 20 | 21 | // Configure general sort function 22 | export const DEFAULT_SORT_FN = defaultSortFn; 23 | 24 | export const DEFAULT_FILTER_FN = defaultFilterFn; 25 | 26 | // Default layout of table cells 27 | export const DEFAULT_ALIGN = "center"; 28 | 29 | export const INDEX_COLUMN_FLAG = "INDEX"; 30 | 31 | export const ACTION_COLUMN_FLAG = "ACTION"; 32 | -------------------------------------------------------------------------------- /packages/core/src/logics/theme/Dark.ts: -------------------------------------------------------------------------------- 1 | import { addClass, hasClass, removeClass } from "@core/utils/DomUtils.ts"; 2 | import { changeTheme } from "./UpdateTheme.ts"; 3 | import { useAppStore } from "@mfish/stores/modules"; 4 | import { APP_DARK_MODE_KEY } from "@core/enums"; 5 | 6 | export async function updateDarkTheme(mode: string = "light") { 7 | const mainHtml = document.querySelector("#mainHtml"); 8 | if (!mainHtml) { 9 | return; 10 | } 11 | const hasDarkClass = hasClass(mainHtml, "dark"); 12 | const color = useAppStore().getProjectConfig.themeColor; 13 | changeTheme(color).then(); 14 | if (mode === "dark") { 15 | //@ts-ignore 忽略属性不存在的错误 16 | mainHtml.dataset.theme = "dark"; 17 | if (!hasDarkClass) { 18 | addClass(mainHtml, "dark"); 19 | } 20 | } else { 21 | //@ts-ignore 忽略属性不存在的错误 22 | mainHtml.dataset.theme = "light"; 23 | if (hasDarkClass) { 24 | removeClass(mainHtml, "dark"); 25 | } 26 | } 27 | localStorage.setItem(APP_DARK_MODE_KEY, mode); 28 | } 29 | -------------------------------------------------------------------------------- /packages/nocode/core/index54.js: -------------------------------------------------------------------------------- 1 | import { defineComponent as a, useTemplateRef as t, onMounted as r, createElementBlock as e, openBlock as o, mergeProps as n, toHandlers as i, unref as s } from "vue"; 2 | import { i as d, as as c } from "./index.js"; 3 | import { cloneDeep as m } from "lodash-es"; 4 | const p = a({ name: "MfRadar", __name: "index", props: { chart: { type: Object, required: true }, chartContain: { type: Object, required: true } }, setup(a2) { 5 | const p2 = a2, f = t("mfRadarRef"), { commonEvents: h } = d(p2.chart); 6 | function u(a3, t2) { 7 | const r2 = { ...m(p2.chart.options), backgroundColor: "transparent" }; 8 | r2.radar = { ...r2.radar, indicator: m(t2?.indicator) }, r2.series[0].data = m(t2?.data), a3?.setOption(r2, true); 9 | } 10 | return r(() => { 11 | c(f.value, p2.chart, p2.chartContain, u); 12 | }), (a3, t2) => (o(), e("div", n({ ref: "mfRadarRef", style: { width: "100%", height: "100%" } }, i(s(h), true)), null, 16)); 13 | } }); 14 | export { 15 | p as default 16 | }; 17 | -------------------------------------------------------------------------------- /src/components/general/Menu/src/index.less: -------------------------------------------------------------------------------- 1 | @basic-menu-prefix-cls: ~"@{namespace}-basic-menu"; 2 | 3 | .app-top-menu-popup { 4 | min-width: 150px; 5 | } 6 | 7 | .@{basic-menu-prefix-cls} { 8 | width: 100%; 9 | 10 | .ant-menu-item { 11 | transition: unset; 12 | } 13 | 14 | &__sidebar-hor { 15 | &.ant-menu-horizontal { 16 | display: flex; 17 | align-items: center; 18 | 19 | &.ant-menu { 20 | background-color: transparent; 21 | color: @header-color; 22 | border-bottom: none; 23 | 24 | .ant-menu-submenu-active { 25 | color: @main-color; 26 | } 27 | 28 | .ant-menu-title-content { 29 | &:hover { 30 | color: @main-color; 31 | } 32 | } 33 | } 34 | } 35 | } 36 | 37 | .ant-menu-submenu, 38 | .ant-menu-submenu-inline { 39 | transition: unset; 40 | } 41 | 42 | .ant-menu-inline.ant-menu-sub { 43 | box-shadow: unset !important; 44 | transition: unset; 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/layouts/default/tabs/components/TabRedo.vue: -------------------------------------------------------------------------------- 1 | 6 | 34 | -------------------------------------------------------------------------------- /src/views/workflow/com/FlowImgPreview.vue: -------------------------------------------------------------------------------- 1 | 6 | 16 | 37 | 38 | -------------------------------------------------------------------------------- /packages/core/src/logics/mitt/RouteChange.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Used to monitor routing changes to change the status of menus and tabs. There is no need to monitor the route, because the route status change is affected by the page rendering time, which will be slow 3 | */ 4 | 5 | import { mitt } from "../../utils/Mitt"; 6 | import type { RouteLocationNormalized } from "vue-router"; 7 | import { getRawRoute } from "../../utils"; 8 | 9 | const emitter = mitt(); 10 | 11 | const key = Symbol("routeKey"); 12 | 13 | let lastChangeTab: RouteLocationNormalized; 14 | 15 | export function setRouteChange(lastChangeRoute: RouteLocationNormalized) { 16 | const r = getRawRoute(lastChangeRoute); 17 | emitter.emit(key, r); 18 | lastChangeTab = r; 19 | } 20 | 21 | export function listenerRouteChange(callback: (route: RouteLocationNormalized) => void, immediate = true) { 22 | emitter.on(key, callback); 23 | immediate && lastChangeTab && callback(lastChangeTab); 24 | } 25 | 26 | export function removeTabChangeListener() { 27 | emitter.clear(); 28 | } 29 | -------------------------------------------------------------------------------- /packages/core/src/api/sys/model/OrgModel.ts: -------------------------------------------------------------------------------- 1 | import { PageResult, ReqPage } from "@core/api/model/BaseModel.ts"; 2 | 3 | /** 4 | * @description: 组织结构信息 5 | * @author: mfish 6 | * @date: 2022/11/9 18:14 7 | */ 8 | export interface SsoOrg { 9 | id: string; 10 | parentId: string; 11 | tenantId: string; 12 | orgCode: string; 13 | orgLevel: number; 14 | orgName: string; 15 | orgSort: number; 16 | leader: string; 17 | phone: string; 18 | email: string; 19 | status: number; 20 | delFlag: number; 21 | createBy: string; 22 | createTime: string; 23 | updateBy: string; 24 | updateTime: string; 25 | children: SsoOrg[]; 26 | roleIds: string[]; 27 | } 28 | 29 | export interface ReqSsoOrg extends ReqPage { 30 | tenantId?: string; 31 | orgName?: string; 32 | leader?: string; 33 | phone?: string; 34 | status?: number; 35 | } 36 | 37 | export interface ReqOrgUser extends ReqPage { 38 | nickname?: string; 39 | phone?: string; 40 | account?: string; 41 | } 42 | 43 | export type SsoOrgPageModel = PageResult; 44 | --------------------------------------------------------------------------------