├── .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 |
2 |
3 |
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 |
7 |
8 |
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 |
2 |
3 |
位于主框架外的页面
4 |
Back
5 |
6 |
7 |
--------------------------------------------------------------------------------
/src/views/sys/login/GiteeBind.vue:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 |
gitee绑定
9 |
10 |
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 |
7 |
8 |
9 |
12 |
13 |
--------------------------------------------------------------------------------
/src/views/nocode/mf-screen/frame/FrameLayer.vue:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 |
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 |
7 |
8 |
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 |
2 |
3 |
4 |
5 |
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 |
2 |
3 |
4 | {{ title }}
5 |
6 |
7 |
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 |
2 |
3 |
4 |
5 |
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 |
7 |
8 |
9 |
10 |
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 |
7 |
8 |
9 |
10 |
11 |
15 |
--------------------------------------------------------------------------------
/src/views/sys/lock/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
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 |
7 |
8 |
9 |
10 |
11 |
15 |
16 |
--------------------------------------------------------------------------------
/src/layouts/default/trigger/SiderTrigger.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
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 |
8 |
9 |
10 |
11 |
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 |
7 |
8 |
9 |
10 |
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 |
2 |
3 |
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