├── .editorconfig ├── .env ├── .env.dev ├── .env.local ├── .env.prod ├── .env.stage ├── .env.test ├── .eslintignore ├── .eslintrc-auto-import.json ├── .eslintrc.js ├── .gitignore ├── .image ├── Java监控.jpg ├── MySQL.jpg ├── OA请假-列表.jpg ├── OA请假-发起.jpg ├── OA请假-详情.jpg ├── Redis.jpg ├── admin-uniapp │ ├── 01.png │ ├── 02.png │ ├── 03.png │ ├── 04.png │ ├── 05.png │ ├── 06.png │ ├── 07.png │ ├── 08.png │ └── 09.png ├── common │ ├── ai-feature.png │ ├── ai-preview.gif │ ├── bpm-feature.png │ ├── crm-feature.png │ ├── erp-feature.png │ ├── infra-feature.png │ ├── mall-feature.png │ ├── mall-preview.png │ ├── project-vs.png │ ├── ruoyi-vue-pro-architecture.png │ ├── ruoyi-vue-pro-biz.png │ ├── system-feature.png │ ├── yudao-cloud-architecture.png │ └── yudao-roadmap.png ├── demo │ └── vue3-ep.png ├── 个人中心.jpg ├── 代码生成.jpg ├── 令牌管理.jpg ├── 任务列表-审批.jpg ├── 任务列表-已办.jpg ├── 任务列表-待办.jpg ├── 任务日志.jpg ├── 商户信息.jpg ├── 在线用户.jpg ├── 大屏设计器-列表.jpg ├── 大屏设计器-编辑.jpg ├── 大屏设计器-预览.jpg ├── 字典数据.jpg ├── 字典类型.jpg ├── 定时任务.jpg ├── 岗位管理.jpg ├── 工作流设计器-bpmn.jpg ├── 工作流设计器-simple.jpg ├── 应用信息-列表.jpg ├── 应用信息-编辑.jpg ├── 应用管理.jpg ├── 我的流程-列表.jpg ├── 我的流程-发起.jpg ├── 我的流程-详情.jpg ├── 报表设计器-图形报表.jpg ├── 报表设计器-打印设计.jpg ├── 报表设计器-数据报表.jpg ├── 操作日志.jpg ├── 支付订单.jpg ├── 敏感词.jpg ├── 数据库文档.jpg ├── 文件管理.jpg ├── 文件管理2.jpg ├── 文件配置.jpg ├── 日志中心.jpg ├── 流程模型-列表.jpg ├── 流程模型-定义.jpg ├── 流程模型-设计.jpg ├── 流程表单.jpg ├── 生成效果.jpg ├── 用户分组.jpg ├── 用户管理.jpg ├── 登录.jpg ├── 登录日志.jpg ├── 短信日志.jpg ├── 短信模板.jpg ├── 短信渠道.jpg ├── 租户套餐.png ├── 租户管理.jpg ├── 系统接口.jpg ├── 菜单管理.jpg ├── 表单构建.jpg ├── 角色管理.jpg ├── 访问日志.jpg ├── 退款订单.jpg ├── 通知公告.jpg ├── 部门管理.jpg ├── 配置管理.jpg ├── 链路追踪.jpg ├── 错误日志.jpg ├── 错误码管理.jpg └── 首页.jpg ├── .prettierignore ├── .stylelintignore ├── .vscode ├── extensions.json ├── launch.json └── settings.json ├── LICENSE ├── README.md ├── build └── vite │ ├── index.ts │ └── optimize.ts ├── index.html ├── package.json ├── pnpm-lock.yaml ├── postcss.config.js ├── prettier.config.js ├── public ├── favicon.ico └── logo.gif ├── src ├── App.vue ├── api │ ├── ai │ │ ├── chat │ │ │ ├── conversation │ │ │ │ └── index.ts │ │ │ └── message │ │ │ │ └── index.ts │ │ ├── image │ │ │ └── index.ts │ │ ├── knowledge │ │ │ ├── document │ │ │ │ └── index.ts │ │ │ ├── knowledge │ │ │ │ └── index.ts │ │ │ └── segment │ │ │ │ └── index.ts │ │ ├── mindmap │ │ │ └── index.ts │ │ ├── model │ │ │ ├── apiKey │ │ │ │ └── index.ts │ │ │ ├── chatRole │ │ │ │ └── index.ts │ │ │ ├── model │ │ │ │ └── index.ts │ │ │ └── tool │ │ │ │ └── index.ts │ │ ├── music │ │ │ └── index.ts │ │ ├── workflow │ │ │ └── index.ts │ │ └── write │ │ │ └── index.ts │ ├── bpm │ │ ├── category │ │ │ └── index.ts │ │ ├── definition │ │ │ └── index.ts │ │ ├── form │ │ │ └── index.ts │ │ ├── leave │ │ │ └── index.ts │ │ ├── model │ │ │ └── index.ts │ │ ├── processExpression │ │ │ └── index.ts │ │ ├── processInstance │ │ │ └── index.ts │ │ ├── processListener │ │ │ └── index.ts │ │ ├── simple │ │ │ └── index.ts │ │ ├── task │ │ │ └── index.ts │ │ └── userGroup │ │ │ └── index.ts │ ├── crm │ │ ├── business │ │ │ ├── index.ts │ │ │ └── status │ │ │ │ └── index.ts │ │ ├── clue │ │ │ └── index.ts │ │ ├── contact │ │ │ └── index.ts │ │ ├── contract │ │ │ ├── config │ │ │ │ └── index.ts │ │ │ └── index.ts │ │ ├── customer │ │ │ ├── index.ts │ │ │ ├── limitConfig │ │ │ │ └── index.ts │ │ │ └── poolConfig │ │ │ │ └── index.ts │ │ ├── followup │ │ │ └── index.ts │ │ ├── operateLog │ │ │ └── index.ts │ │ ├── permission │ │ │ └── index.ts │ │ ├── product │ │ │ ├── category │ │ │ │ └── index.ts │ │ │ └── index.ts │ │ ├── receivable │ │ │ ├── index.ts │ │ │ └── plan │ │ │ │ └── index.ts │ │ └── statistics │ │ │ ├── customer.ts │ │ │ ├── funnel.ts │ │ │ ├── performance.ts │ │ │ ├── portrait.ts │ │ │ └── rank.ts │ ├── erp │ │ ├── finance │ │ │ ├── account │ │ │ │ └── index.ts │ │ │ ├── payment │ │ │ │ └── index.ts │ │ │ └── receipt │ │ │ │ └── index.ts │ │ ├── product │ │ │ ├── category │ │ │ │ └── index.ts │ │ │ ├── product │ │ │ │ └── index.ts │ │ │ └── unit │ │ │ │ └── index.ts │ │ ├── purchase │ │ │ ├── in │ │ │ │ └── index.ts │ │ │ ├── order │ │ │ │ └── index.ts │ │ │ ├── return │ │ │ │ └── index.ts │ │ │ └── supplier │ │ │ │ └── index.ts │ │ ├── sale │ │ │ ├── customer │ │ │ │ └── index.ts │ │ │ ├── order │ │ │ │ └── index.ts │ │ │ ├── out │ │ │ │ └── index.ts │ │ │ └── return │ │ │ │ └── index.ts │ │ ├── statistics │ │ │ ├── purchase │ │ │ │ └── index.ts │ │ │ └── sale │ │ │ │ └── index.ts │ │ └── stock │ │ │ ├── check │ │ │ └── index.ts │ │ │ ├── in │ │ │ └── index.ts │ │ │ ├── move │ │ │ └── index.ts │ │ │ ├── out │ │ │ └── index.ts │ │ │ ├── record │ │ │ └── index.ts │ │ │ ├── stock │ │ │ └── index.ts │ │ │ └── warehouse │ │ │ └── index.ts │ ├── infra │ │ ├── apiAccessLog │ │ │ └── index.ts │ │ ├── apiErrorLog │ │ │ └── index.ts │ │ ├── codegen │ │ │ └── index.ts │ │ ├── config │ │ │ └── index.ts │ │ ├── dataSourceConfig │ │ │ └── index.ts │ │ ├── demo │ │ │ ├── demo01 │ │ │ │ └── index.ts │ │ │ ├── demo02 │ │ │ │ └── index.ts │ │ │ └── demo03 │ │ │ │ ├── erp │ │ │ │ └── index.ts │ │ │ │ ├── inner │ │ │ │ └── index.ts │ │ │ │ └── normal │ │ │ │ └── index.ts │ │ ├── file │ │ │ └── index.ts │ │ ├── fileConfig │ │ │ └── index.ts │ │ ├── job │ │ │ └── index.ts │ │ ├── jobLog │ │ │ └── index.ts │ │ └── redis │ │ │ ├── index.ts │ │ │ └── types.ts │ ├── iot │ │ ├── device │ │ │ ├── device │ │ │ │ └── index.ts │ │ │ └── group │ │ │ │ └── index.ts │ │ ├── plugin │ │ │ └── index.ts │ │ ├── product │ │ │ ├── category │ │ │ │ └── index.ts │ │ │ └── product │ │ │ │ └── index.ts │ │ ├── rule │ │ │ └── databridge │ │ │ │ └── index.ts │ │ ├── statistics │ │ │ └── index.ts │ │ └── thingmodel │ │ │ └── index.ts │ ├── login │ │ ├── index.ts │ │ ├── oauth2 │ │ │ └── index.ts │ │ └── types.ts │ ├── mall │ │ ├── market │ │ │ └── banner │ │ │ │ └── index.ts │ │ ├── product │ │ │ ├── brand.ts │ │ │ ├── category.ts │ │ │ ├── comment.ts │ │ │ ├── favorite.ts │ │ │ ├── history.ts │ │ │ ├── property.ts │ │ │ └── spu.ts │ │ ├── promotion │ │ │ ├── article │ │ │ │ └── index.ts │ │ │ ├── articleCategory │ │ │ │ └── index.ts │ │ │ ├── bargain │ │ │ │ ├── bargainActivity.ts │ │ │ │ ├── bargainHelp.ts │ │ │ │ └── bargainRecord.ts │ │ │ ├── combination │ │ │ │ ├── combinationActivity.ts │ │ │ │ └── combinationRecord.ts │ │ │ ├── coupon │ │ │ │ ├── coupon.ts │ │ │ │ └── couponTemplate.ts │ │ │ ├── discount │ │ │ │ └── discountActivity.ts │ │ │ ├── diy │ │ │ │ ├── page.ts │ │ │ │ └── template.ts │ │ │ ├── kefu │ │ │ │ ├── conversation │ │ │ │ │ └── index.ts │ │ │ │ └── message │ │ │ │ │ └── index.ts │ │ │ ├── point │ │ │ │ └── index.ts │ │ │ ├── reward │ │ │ │ └── rewardActivity.ts │ │ │ └── seckill │ │ │ │ ├── seckillActivity.ts │ │ │ │ └── seckillConfig.ts │ │ ├── statistics │ │ │ ├── common.ts │ │ │ ├── member.ts │ │ │ ├── pay.ts │ │ │ ├── product.ts │ │ │ └── trade.ts │ │ └── trade │ │ │ ├── afterSale │ │ │ └── index.ts │ │ │ ├── brokerage │ │ │ ├── record │ │ │ │ └── index.ts │ │ │ ├── user │ │ │ │ └── index.ts │ │ │ └── withdraw │ │ │ │ └── index.ts │ │ │ ├── config │ │ │ └── index.ts │ │ │ ├── delivery │ │ │ ├── express │ │ │ │ └── index.ts │ │ │ ├── expressTemplate │ │ │ │ └── index.ts │ │ │ └── pickUpStore │ │ │ │ └── index.ts │ │ │ └── order │ │ │ └── index.ts │ ├── member │ │ ├── address │ │ │ └── index.ts │ │ ├── config │ │ │ └── index.ts │ │ ├── experience-record │ │ │ └── index.ts │ │ ├── group │ │ │ └── index.ts │ │ ├── level │ │ │ └── index.ts │ │ ├── point │ │ │ └── record │ │ │ │ └── index.ts │ │ ├── signin │ │ │ ├── config │ │ │ │ └── index.ts │ │ │ └── record │ │ │ │ └── index.ts │ │ ├── tag │ │ │ └── index.ts │ │ └── user │ │ │ └── index.ts │ ├── mp │ │ ├── account │ │ │ └── index.ts │ │ ├── autoReply │ │ │ └── index.ts │ │ ├── draft │ │ │ └── index.ts │ │ ├── freePublish │ │ │ └── index.ts │ │ ├── material │ │ │ └── index.ts │ │ ├── menu │ │ │ └── index.ts │ │ ├── message │ │ │ └── index.ts │ │ ├── statistics │ │ │ └── index.ts │ │ ├── tag │ │ │ └── index.ts │ │ └── user │ │ │ └── index.ts │ ├── pay │ │ ├── app │ │ │ └── index.ts │ │ ├── channel │ │ │ └── index.ts │ │ ├── demo │ │ │ ├── index.ts │ │ │ └── transfer │ │ │ │ └── index.ts │ │ ├── notify │ │ │ └── index.ts │ │ ├── order │ │ │ └── index.ts │ │ ├── refund │ │ │ └── index.ts │ │ ├── transfer │ │ │ └── index.ts │ │ └── wallet │ │ │ ├── balance │ │ │ └── index.ts │ │ │ ├── rechargePackage │ │ │ └── index.ts │ │ │ └── transaction │ │ │ └── index.ts │ └── system │ │ ├── area │ │ └── index.ts │ │ ├── dept │ │ └── index.ts │ │ ├── dict │ │ ├── dict.data.ts │ │ └── dict.type.ts │ │ ├── loginLog │ │ └── index.ts │ │ ├── mail │ │ ├── account │ │ │ └── index.ts │ │ ├── log │ │ │ └── index.ts │ │ └── template │ │ │ └── index.ts │ │ ├── menu │ │ └── index.ts │ │ ├── notice │ │ └── index.ts │ │ ├── notify │ │ ├── message │ │ │ └── index.ts │ │ └── template │ │ │ └── index.ts │ │ ├── oauth2 │ │ ├── client.ts │ │ └── token.ts │ │ ├── operatelog │ │ └── index.ts │ │ ├── permission │ │ └── index.ts │ │ ├── post │ │ └── index.ts │ │ ├── role │ │ └── index.ts │ │ ├── sms │ │ ├── smsChannel │ │ │ └── index.ts │ │ ├── smsLog │ │ │ └── index.ts │ │ └── smsTemplate │ │ │ └── index.ts │ │ ├── social │ │ ├── client │ │ │ └── index.ts │ │ └── user │ │ │ └── index.ts │ │ ├── tenant │ │ └── index.ts │ │ ├── tenantPackage │ │ └── index.ts │ │ └── user │ │ ├── index.ts │ │ ├── profile.ts │ │ └── socialUser.ts ├── assets │ ├── ai │ │ ├── copy-style2.svg │ │ ├── copy.svg │ │ ├── dall2.jpg │ │ ├── dall3.jpg │ │ ├── delete.svg │ │ ├── gpt.svg │ │ ├── qingxi.jpg │ │ └── ziran.jpg │ ├── audio │ │ └── response.mp3 │ ├── imgs │ │ ├── avatar.gif │ │ ├── avatar.jpg │ │ ├── diy │ │ │ ├── app-nav-bar-mp.png │ │ │ └── statusBar.png │ │ ├── iot │ │ │ └── device.png │ │ ├── logo.png │ │ ├── profile.jpg │ │ └── wechat.png │ ├── map │ │ └── json │ │ │ └── china.json │ └── svgs │ │ ├── 403.svg │ │ ├── 404.svg │ │ ├── 500.svg │ │ ├── bpm │ │ ├── add-user.svg │ │ ├── approve.svg │ │ ├── auditor.svg │ │ ├── cancel.svg │ │ ├── child-process.svg │ │ ├── condition.svg │ │ ├── copy.svg │ │ ├── delay.svg │ │ ├── finish.svg │ │ ├── parallel.svg │ │ ├── reject.svg │ │ ├── running.svg │ │ ├── simple-process-bg.svg │ │ ├── starter.svg │ │ └── transactor.svg │ │ ├── icon.svg │ │ ├── iot │ │ ├── card-fill.svg │ │ └── cube.svg │ │ ├── login-bg.svg │ │ ├── login-box-bg.svg │ │ ├── member_balance.svg │ │ ├── member_expenditure_balance.svg │ │ ├── member_level.svg │ │ ├── member_point.svg │ │ ├── member_recharge_balance.svg │ │ ├── message.svg │ │ ├── money.svg │ │ ├── pay │ │ └── icon │ │ │ ├── alipay_app.svg │ │ │ ├── alipay_bar.svg │ │ │ ├── alipay_pc.svg │ │ │ ├── alipay_qr.svg │ │ │ ├── alipay_wap.svg │ │ │ ├── mock.svg │ │ │ ├── wx_app.svg │ │ │ ├── wx_bar.svg │ │ │ ├── wx_lite.svg │ │ │ ├── wx_native.svg │ │ │ └── wx_pub.svg │ │ ├── peoples.svg │ │ ├── send.svg │ │ └── shopping.svg ├── components │ ├── AppLinkInput │ │ ├── AppLinkSelectDialog.vue │ │ ├── data.ts │ │ └── index.vue │ ├── Backtop │ │ ├── index.ts │ │ └── src │ │ │ └── Backtop.vue │ ├── Card │ │ ├── index.ts │ │ └── src │ │ │ └── CardTitle.vue │ ├── ColorInput │ │ └── index.vue │ ├── ConfigGlobal │ │ ├── index.ts │ │ └── src │ │ │ └── ConfigGlobal.vue │ ├── ContentDetailWrap │ │ ├── index.ts │ │ └── src │ │ │ └── ContentDetailWrap.vue │ ├── ContentWrap │ │ ├── index.ts │ │ └── src │ │ │ └── ContentWrap.vue │ ├── CountTo │ │ ├── index.ts │ │ └── src │ │ │ └── CountTo.vue │ ├── Crontab │ │ ├── index.ts │ │ └── src │ │ │ └── Crontab.vue │ ├── Cropper │ │ ├── index.ts │ │ └── src │ │ │ ├── CopperModal.vue │ │ │ ├── Cropper.vue │ │ │ ├── CropperAvatar.vue │ │ │ └── types.ts │ ├── DeptSelectForm │ │ └── index.vue │ ├── Descriptions │ │ ├── index.ts │ │ └── src │ │ │ ├── Descriptions.vue │ │ │ └── DescriptionsItemLabel.vue │ ├── Dialog │ │ ├── index.ts │ │ └── src │ │ │ └── Dialog.vue │ ├── DictTag │ │ ├── index.ts │ │ └── src │ │ │ └── DictTag.vue │ ├── DiyEditor │ │ ├── components │ │ │ ├── ComponentContainer.vue │ │ │ ├── ComponentContainerProperty.vue │ │ │ ├── ComponentLibrary.vue │ │ │ └── mobile │ │ │ │ ├── Carousel │ │ │ │ ├── config.ts │ │ │ │ ├── index.vue │ │ │ │ └── property.vue │ │ │ │ ├── CouponCard │ │ │ │ ├── component.tsx │ │ │ │ ├── config.ts │ │ │ │ ├── index.vue │ │ │ │ └── property.vue │ │ │ │ ├── Divider │ │ │ │ ├── config.ts │ │ │ │ ├── index.vue │ │ │ │ └── property.vue │ │ │ │ ├── FloatingActionButton │ │ │ │ ├── config.ts │ │ │ │ ├── index.vue │ │ │ │ └── property.vue │ │ │ │ ├── HotZone │ │ │ │ ├── components │ │ │ │ │ └── HotZoneEditDialog │ │ │ │ │ │ ├── controller.ts │ │ │ │ │ │ └── index.vue │ │ │ │ ├── config.ts │ │ │ │ ├── index.vue │ │ │ │ └── property.vue │ │ │ │ ├── ImageBar │ │ │ │ ├── config.ts │ │ │ │ ├── index.vue │ │ │ │ └── property.vue │ │ │ │ ├── MagicCube │ │ │ │ ├── config.ts │ │ │ │ ├── index.vue │ │ │ │ └── property.vue │ │ │ │ ├── MenuGrid │ │ │ │ ├── config.ts │ │ │ │ ├── index.vue │ │ │ │ └── property.vue │ │ │ │ ├── MenuList │ │ │ │ ├── config.ts │ │ │ │ ├── index.vue │ │ │ │ └── property.vue │ │ │ │ ├── MenuSwiper │ │ │ │ ├── config.ts │ │ │ │ ├── index.vue │ │ │ │ └── property.vue │ │ │ │ ├── NavigationBar │ │ │ │ ├── components │ │ │ │ │ └── CellProperty.vue │ │ │ │ ├── config.ts │ │ │ │ ├── index.vue │ │ │ │ └── property.vue │ │ │ │ ├── NoticeBar │ │ │ │ ├── config.ts │ │ │ │ ├── index.vue │ │ │ │ └── property.vue │ │ │ │ ├── PageConfig │ │ │ │ ├── config.ts │ │ │ │ └── property.vue │ │ │ │ ├── Popover │ │ │ │ ├── config.ts │ │ │ │ ├── index.vue │ │ │ │ └── property.vue │ │ │ │ ├── ProductCard │ │ │ │ ├── config.ts │ │ │ │ ├── index.vue │ │ │ │ └── property.vue │ │ │ │ ├── ProductList │ │ │ │ ├── config.ts │ │ │ │ ├── index.vue │ │ │ │ └── property.vue │ │ │ │ ├── PromotionArticle │ │ │ │ ├── config.ts │ │ │ │ ├── index.vue │ │ │ │ └── property.vue │ │ │ │ ├── PromotionCombination │ │ │ │ ├── config.ts │ │ │ │ ├── index.vue │ │ │ │ └── property.vue │ │ │ │ ├── PromotionPoint │ │ │ │ ├── config.ts │ │ │ │ ├── index.vue │ │ │ │ └── property.vue │ │ │ │ ├── PromotionSeckill │ │ │ │ ├── config.ts │ │ │ │ ├── index.vue │ │ │ │ └── property.vue │ │ │ │ ├── SearchBar │ │ │ │ ├── config.ts │ │ │ │ ├── index.vue │ │ │ │ └── property.vue │ │ │ │ ├── TabBar │ │ │ │ ├── config.ts │ │ │ │ ├── index.vue │ │ │ │ └── property.vue │ │ │ │ ├── TitleBar │ │ │ │ ├── config.ts │ │ │ │ ├── index.vue │ │ │ │ └── property.vue │ │ │ │ ├── UserCard │ │ │ │ ├── config.ts │ │ │ │ ├── index.vue │ │ │ │ └── property.vue │ │ │ │ ├── UserCoupon │ │ │ │ ├── config.ts │ │ │ │ ├── index.vue │ │ │ │ └── property.vue │ │ │ │ ├── UserOrder │ │ │ │ ├── config.ts │ │ │ │ ├── index.vue │ │ │ │ └── property.vue │ │ │ │ ├── UserWallet │ │ │ │ ├── config.ts │ │ │ │ ├── index.vue │ │ │ │ └── property.vue │ │ │ │ ├── VideoPlayer │ │ │ │ ├── config.ts │ │ │ │ ├── index.vue │ │ │ │ └── property.vue │ │ │ │ └── index.ts │ │ ├── index.vue │ │ └── util.ts │ ├── DocAlert │ │ └── index.vue │ ├── Draggable │ │ └── index.vue │ ├── Echart │ │ ├── index.ts │ │ └── src │ │ │ └── Echart.vue │ ├── Editor │ │ ├── index.ts │ │ └── src │ │ │ └── Editor.vue │ ├── Error │ │ ├── index.ts │ │ └── src │ │ │ └── Error.vue │ ├── Form │ │ ├── index.ts │ │ └── src │ │ │ ├── Form.vue │ │ │ ├── componentMap.ts │ │ │ ├── components │ │ │ ├── useRenderCheckbox.tsx │ │ │ ├── useRenderRadio.tsx │ │ │ └── useRenderSelect.tsx │ │ │ ├── helper.ts │ │ │ └── types.ts │ ├── FormCreate │ │ ├── index.ts │ │ └── src │ │ │ ├── components │ │ │ ├── DictSelect.vue │ │ │ └── useApiSelect.tsx │ │ │ ├── config │ │ │ ├── index.ts │ │ │ ├── selectRule.ts │ │ │ ├── useDictSelectRule.ts │ │ │ ├── useEditorRule.ts │ │ │ ├── useSelectRule.ts │ │ │ ├── useUploadFileRule.ts │ │ │ ├── useUploadImgRule.ts │ │ │ └── useUploadImgsRule.ts │ │ │ ├── type │ │ │ └── index.ts │ │ │ ├── useFormCreateDesigner.ts │ │ │ └── utils │ │ │ └── index.ts │ ├── Highlight │ │ ├── index.ts │ │ └── src │ │ │ └── Highlight.vue │ ├── IFrame │ │ ├── index.ts │ │ └── src │ │ │ └── IFrame.vue │ ├── Icon │ │ ├── index.ts │ │ └── src │ │ │ ├── Icon.vue │ │ │ ├── IconSelect.vue │ │ │ └── data.ts │ ├── ImageViewer │ │ ├── index.ts │ │ └── src │ │ │ ├── ImageViewer.vue │ │ │ └── types.ts │ ├── Infotip │ │ ├── index.ts │ │ └── src │ │ │ └── Infotip.vue │ ├── InputPassword │ │ ├── index.ts │ │ └── src │ │ │ └── InputPassword.vue │ ├── InputWithColor │ │ └── index.vue │ ├── MagicCubeEditor │ │ ├── index.vue │ │ └── util.ts │ ├── MarkdownView │ │ └── index.vue │ ├── OperateLogV2 │ │ ├── index.ts │ │ └── src │ │ │ └── OperateLogV2.vue │ ├── Pagination │ │ └── index.vue │ ├── Qrcode │ │ ├── index.ts │ │ └── src │ │ │ └── Qrcode.vue │ ├── RouterSearch │ │ └── index.vue │ ├── Search │ │ ├── index.ts │ │ └── src │ │ │ └── Search.vue │ ├── ShortcutDateRangePicker │ │ └── index.vue │ ├── SimpleProcessDesignerV2 │ │ ├── src │ │ │ ├── NodeHandler.vue │ │ │ ├── ProcessNodeTree.vue │ │ │ ├── SimpleProcessDesigner.vue │ │ │ ├── SimpleProcessModel.vue │ │ │ ├── SimpleProcessViewer.vue │ │ │ ├── consts.ts │ │ │ ├── index.ts │ │ │ ├── node.ts │ │ │ ├── nodes-config │ │ │ │ ├── ChildProcessNodeConfig.vue │ │ │ │ ├── ConditionNodeConfig.vue │ │ │ │ ├── CopyTaskNodeConfig.vue │ │ │ │ ├── DelayTimerNodeConfig.vue │ │ │ │ ├── RouterNodeConfig.vue │ │ │ │ ├── StartUserNodeConfig.vue │ │ │ │ ├── TriggerNodeConfig.vue │ │ │ │ ├── UserTaskNodeConfig.vue │ │ │ │ └── components │ │ │ │ │ ├── Condition.vue │ │ │ │ │ ├── ConditionDialog.vue │ │ │ │ │ ├── HttpRequestParamSetting.vue │ │ │ │ │ ├── HttpRequestSetting.vue │ │ │ │ │ └── UserTaskListener.vue │ │ │ ├── nodes │ │ │ │ ├── ChildProcessNode.vue │ │ │ │ ├── CopyTaskNode.vue │ │ │ │ ├── DelayTimerNode.vue │ │ │ │ ├── EndEventNode.vue │ │ │ │ ├── ExclusiveNode.vue │ │ │ │ ├── InclusiveNode.vue │ │ │ │ ├── ParallelNode.vue │ │ │ │ ├── RouterNode.vue │ │ │ │ ├── StartUserNode.vue │ │ │ │ ├── TriggerNode.vue │ │ │ │ └── UserTaskNode.vue │ │ │ └── utils.ts │ │ └── theme │ │ │ ├── iconfont.ttf │ │ │ ├── iconfont.woff │ │ │ ├── iconfont.woff2 │ │ │ └── simple-process-designer.scss │ ├── Sticky │ │ ├── index.ts │ │ └── src │ │ │ └── Sticky.vue │ ├── SummaryCard │ │ └── index.vue │ ├── Table │ │ ├── index.ts │ │ └── src │ │ │ ├── Table.vue │ │ │ ├── TableSelectForm.vue │ │ │ ├── helper.ts │ │ │ └── types.ts │ ├── Tinyflow │ │ ├── Tinyflow.vue │ │ └── ui │ │ │ ├── index.css │ │ │ ├── index.d.ts │ │ │ ├── index.js │ │ │ └── index.umd.js │ ├── Tooltip │ │ ├── index.ts │ │ └── src │ │ │ └── Tooltip.vue │ ├── UploadFile │ │ ├── index.ts │ │ └── src │ │ │ ├── UploadFile.vue │ │ │ ├── UploadImg.vue │ │ │ ├── UploadImgs.vue │ │ │ └── useUpload.ts │ ├── UserSelectForm │ │ └── index.vue │ ├── Verifition │ │ ├── index.ts │ │ └── src │ │ │ ├── Verify.vue │ │ │ ├── Verify │ │ │ ├── VerifyPoints.vue │ │ │ ├── VerifySlide.vue │ │ │ └── index.ts │ │ │ └── utils │ │ │ ├── ase.ts │ │ │ └── util.ts │ ├── VerticalButtonGroup │ │ └── index.vue │ ├── XButton │ │ ├── index.ts │ │ └── src │ │ │ ├── XButton.vue │ │ │ └── XTextButton.vue │ ├── bpmnProcessDesigner │ │ ├── package │ │ │ ├── designer │ │ │ │ ├── ProcessDesigner.vue │ │ │ │ ├── ProcessViewer.vue │ │ │ │ ├── index.ts │ │ │ │ ├── index2.ts │ │ │ │ └── plugins │ │ │ │ │ ├── content-pad │ │ │ │ │ ├── contentPadProvider.js │ │ │ │ │ └── index.js │ │ │ │ │ ├── defaultEmpty.js │ │ │ │ │ ├── descriptor │ │ │ │ │ ├── activitiDescriptor.json │ │ │ │ │ ├── camundaDescriptor.json │ │ │ │ │ └── flowableDescriptor.json │ │ │ │ │ ├── extension-moddle │ │ │ │ │ ├── activiti │ │ │ │ │ │ ├── activitiExtension.js │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── camunda │ │ │ │ │ │ ├── extension.js │ │ │ │ │ │ └── index.js │ │ │ │ │ └── flowable │ │ │ │ │ │ ├── flowableExtension.js │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── palette │ │ │ │ │ ├── CustomPalette.js │ │ │ │ │ ├── index.js │ │ │ │ │ └── paletteProvider.js │ │ │ │ │ └── translate │ │ │ │ │ ├── customTranslate.js │ │ │ │ │ └── zh.js │ │ │ ├── index.ts │ │ │ ├── palette │ │ │ │ └── ProcessPalette.vue │ │ │ ├── penal │ │ │ │ ├── PropertiesPanel.vue │ │ │ │ ├── base │ │ │ │ │ └── ElementBaseInfo.vue │ │ │ │ ├── custom-config │ │ │ │ │ ├── ElementCustomConfig.vue │ │ │ │ │ ├── components │ │ │ │ │ │ ├── BoundaryEventTimer.vue │ │ │ │ │ │ └── UserTaskCustomConfig.vue │ │ │ │ │ └── data.ts │ │ │ │ ├── flow-condition │ │ │ │ │ └── FlowCondition.vue │ │ │ │ ├── form │ │ │ │ │ └── ElementForm.vue │ │ │ │ ├── index.js │ │ │ │ ├── listeners │ │ │ │ │ ├── ElementListeners.vue │ │ │ │ │ ├── ProcessListenerDialog.vue │ │ │ │ │ ├── UserTaskListeners.vue │ │ │ │ │ ├── template.js │ │ │ │ │ └── utilSelf.ts │ │ │ │ ├── multi-instance │ │ │ │ │ └── ElementMultiInstance.vue │ │ │ │ ├── other │ │ │ │ │ └── ElementOtherConfig.vue │ │ │ │ ├── properties │ │ │ │ │ └── ElementProperties.vue │ │ │ │ ├── signal-message │ │ │ │ │ └── SignalAndMessage.vue │ │ │ │ └── task │ │ │ │ │ ├── ElementTask.vue │ │ │ │ │ ├── data.ts │ │ │ │ │ └── task-components │ │ │ │ │ ├── CallActivity.vue │ │ │ │ │ ├── ProcessExpressionDialog.vue │ │ │ │ │ ├── ReceiveTask.vue │ │ │ │ │ ├── ScriptTask.vue │ │ │ │ │ ├── ServiceTask.vue │ │ │ │ │ └── UserTask.vue │ │ │ ├── theme │ │ │ │ ├── element-variables.scss │ │ │ │ ├── index.scss │ │ │ │ ├── process-designer.scss │ │ │ │ └── process-panel.scss │ │ │ └── utils.ts │ │ └── src │ │ │ ├── highlight │ │ │ └── index.js │ │ │ ├── modules │ │ │ ├── custom-renderer │ │ │ │ ├── CustomRenderer.js │ │ │ │ └── index.js │ │ │ └── rules │ │ │ │ ├── CustomRules.js │ │ │ │ └── index.js │ │ │ ├── translations.ts │ │ │ └── utils │ │ │ ├── directive │ │ │ └── clickOutSide.js │ │ │ ├── index.js │ │ │ └── xml2json.js │ └── index.ts ├── config │ └── axios │ │ ├── config.ts │ │ ├── errorCode.ts │ │ ├── index.ts │ │ └── service.ts ├── directives │ ├── index.ts │ └── permission │ │ ├── hasPermi.ts │ │ └── hasRole.ts ├── hooks │ ├── event │ │ └── useScrollTo.ts │ └── web │ │ ├── useCache.ts │ │ ├── useConfigGlobal.ts │ │ ├── useCrudSchemas.ts │ │ ├── useDesign.ts │ │ ├── useEmitt.ts │ │ ├── useForm.ts │ │ ├── useGuide.ts │ │ ├── useI18n.ts │ │ ├── useIcon.ts │ │ ├── useLocale.ts │ │ ├── useMessage.ts │ │ ├── useNProgress.ts │ │ ├── useNetwork.ts │ │ ├── useNow.ts │ │ ├── usePageLoading.ts │ │ ├── useTable.ts │ │ ├── useTagsView.ts │ │ ├── useTimeAgo.ts │ │ ├── useTitle.ts │ │ ├── useValidator.ts │ │ └── useWatermark.ts ├── layout │ ├── Layout.vue │ └── components │ │ ├── AppView.vue │ │ ├── Breadcrumb │ │ ├── index.ts │ │ └── src │ │ │ ├── Breadcrumb.vue │ │ │ └── helper.ts │ │ ├── Collapse │ │ ├── index.ts │ │ └── src │ │ │ └── Collapse.vue │ │ ├── ContextMenu │ │ ├── index.ts │ │ └── src │ │ │ └── ContextMenu.vue │ │ ├── Footer │ │ ├── index.ts │ │ └── src │ │ │ └── Footer.vue │ │ ├── LocaleDropdown │ │ ├── index.ts │ │ └── src │ │ │ └── LocaleDropdown.vue │ │ ├── Logo │ │ ├── index.ts │ │ └── src │ │ │ └── Logo.vue │ │ ├── Menu │ │ ├── index.ts │ │ └── src │ │ │ ├── Menu.vue │ │ │ ├── components │ │ │ ├── useRenderMenuItem.tsx │ │ │ └── useRenderMenuTitle.tsx │ │ │ └── helper.ts │ │ ├── Message │ │ ├── index.ts │ │ └── src │ │ │ └── Message.vue │ │ ├── Screenfull │ │ ├── index.ts │ │ └── src │ │ │ └── Screenfull.vue │ │ ├── Setting │ │ ├── index.ts │ │ └── src │ │ │ ├── Setting.vue │ │ │ └── components │ │ │ ├── ColorRadioPicker.vue │ │ │ ├── InterfaceDisplay.vue │ │ │ └── LayoutRadioPicker.vue │ │ ├── SizeDropdown │ │ ├── index.ts │ │ └── src │ │ │ └── SizeDropdown.vue │ │ ├── TabMenu │ │ ├── index.ts │ │ └── src │ │ │ ├── TabMenu.vue │ │ │ └── helper.ts │ │ ├── TagsView │ │ ├── index.ts │ │ └── src │ │ │ ├── TagsView.vue │ │ │ └── helper.ts │ │ ├── TenantVisit │ │ └── index.vue │ │ ├── ThemeSwitch │ │ ├── index.ts │ │ └── src │ │ │ └── ThemeSwitch.vue │ │ ├── ToolHeader.vue │ │ ├── UserInfo │ │ ├── index.ts │ │ └── src │ │ │ ├── UserInfo.vue │ │ │ └── components │ │ │ ├── LockDialog.vue │ │ │ └── LockPage.vue │ │ └── useRenderLayout.tsx ├── locales │ ├── en.ts │ └── zh-CN.ts ├── main.ts ├── permission.ts ├── plugins │ ├── animate.css │ │ └── index.ts │ ├── echarts │ │ └── index.ts │ ├── elementPlus │ │ └── index.ts │ ├── formCreate │ │ └── index.ts │ ├── svgIcon │ │ └── index.ts │ ├── tongji │ │ └── index.ts │ ├── unocss │ │ └── index.ts │ └── vueI18n │ │ ├── helper.ts │ │ └── index.ts ├── router │ ├── index.ts │ └── modules │ │ └── remaining.ts ├── store │ ├── index.ts │ └── modules │ │ ├── app.ts │ │ ├── bpm │ │ └── simpleWorkflow.ts │ │ ├── dict.ts │ │ ├── locale.ts │ │ ├── lock.ts │ │ ├── mall │ │ └── kefu.ts │ │ ├── permission.ts │ │ ├── tagsView.ts │ │ └── user.ts ├── styles │ ├── FormCreate │ │ ├── fonts │ │ │ └── fontello.woff │ │ └── index.scss │ ├── global.module.scss │ ├── index.scss │ ├── theme.scss │ ├── var.css │ └── variables.scss ├── types │ ├── components.d.ts │ ├── configGlobal.d.ts │ ├── contextMenu.d.ts │ ├── descriptions.d.ts │ ├── elementPlus.d.ts │ ├── form.d.ts │ ├── icon.d.ts │ ├── infoTip.d.ts │ ├── layout.d.ts │ ├── localeDropdown.d.ts │ ├── qrcode.d.ts │ ├── table.d.ts │ └── theme.d.ts ├── utils │ ├── Logger.ts │ ├── auth.ts │ ├── color.ts │ ├── constants.ts │ ├── dateUtil.ts │ ├── dict.ts │ ├── domUtils.ts │ ├── download.ts │ ├── filt.ts │ ├── formCreate.ts │ ├── formRules.ts │ ├── formatTime.ts │ ├── formatter.ts │ ├── index.ts │ ├── is.ts │ ├── jsencrypt.ts │ ├── permission.ts │ ├── propTypes.ts │ ├── routerHelper.ts │ ├── tree.ts │ └── tsxHelper.ts └── views │ ├── Error │ ├── 403.vue │ ├── 404.vue │ └── 500.vue │ ├── Home │ ├── Index.vue │ ├── Index2.vue │ ├── echarts-data.ts │ └── types.ts │ ├── Login │ ├── Login.vue │ ├── SocialLogin.vue │ └── components │ │ ├── ForgetPasswordForm.vue │ │ ├── LoginForm.vue │ │ ├── LoginFormTitle.vue │ │ ├── MobileForm.vue │ │ ├── QrCodeForm.vue │ │ ├── RegisterForm.vue │ │ ├── SSOLogin.vue │ │ ├── index.ts │ │ └── useLogin.ts │ ├── Profile │ ├── Index.vue │ └── components │ │ ├── BasicInfo.vue │ │ ├── ProfileUser.vue │ │ ├── ResetPwd.vue │ │ ├── UserAvatar.vue │ │ ├── UserSocial.vue │ │ └── index.ts │ ├── Redirect │ └── Redirect.vue │ ├── ai │ ├── chat │ │ ├── index │ │ │ ├── components │ │ │ │ ├── conversation │ │ │ │ │ ├── ConversationList.vue │ │ │ │ │ └── ConversationUpdateForm.vue │ │ │ │ ├── message │ │ │ │ │ ├── MessageKnowledge.vue │ │ │ │ │ ├── MessageList.vue │ │ │ │ │ ├── MessageListEmpty.vue │ │ │ │ │ ├── MessageLoading.vue │ │ │ │ │ └── MessageNewConversation.vue │ │ │ │ └── role │ │ │ │ │ ├── RoleCategoryList.vue │ │ │ │ │ ├── RoleHeader.vue │ │ │ │ │ ├── RoleList.vue │ │ │ │ │ └── RoleRepository.vue │ │ │ └── index.vue │ │ └── manager │ │ │ ├── ChatConversationList.vue │ │ │ ├── ChatMessageList.vue │ │ │ └── index.vue │ ├── image │ │ ├── index │ │ │ ├── components │ │ │ │ ├── ImageCard.vue │ │ │ │ ├── ImageDetail.vue │ │ │ │ ├── ImageList.vue │ │ │ │ ├── common │ │ │ │ │ └── index.vue │ │ │ │ ├── dall3 │ │ │ │ │ └── index.vue │ │ │ │ ├── midjourney │ │ │ │ │ └── index.vue │ │ │ │ └── stableDiffusion │ │ │ │ │ └── index.vue │ │ │ └── index.vue │ │ ├── manager │ │ │ └── index.vue │ │ └── square │ │ │ └── index.vue │ ├── knowledge │ │ ├── document │ │ │ ├── form │ │ │ │ ├── ProcessStep.vue │ │ │ │ ├── SplitStep.vue │ │ │ │ ├── UploadStep.vue │ │ │ │ └── index.vue │ │ │ └── index.vue │ │ ├── knowledge │ │ │ ├── KnowledgeForm.vue │ │ │ ├── index.vue │ │ │ └── retrieval │ │ │ │ └── index.vue │ │ └── segment │ │ │ ├── KnowledgeSegmentForm.vue │ │ │ └── index.vue │ ├── mindmap │ │ ├── index │ │ │ ├── components │ │ │ │ ├── Left.vue │ │ │ │ └── Right.vue │ │ │ └── index.vue │ │ └── manager │ │ │ └── index.vue │ ├── model │ │ ├── apiKey │ │ │ ├── ApiKeyForm.vue │ │ │ └── index.vue │ │ ├── chatRole │ │ │ ├── ChatRoleForm.vue │ │ │ └── index.vue │ │ ├── model │ │ │ ├── ModelForm.vue │ │ │ └── index.vue │ │ └── tool │ │ │ ├── ToolForm.vue │ │ │ └── index.vue │ ├── music │ │ ├── index │ │ │ ├── index.vue │ │ │ ├── list │ │ │ │ ├── audioBar │ │ │ │ │ └── index.vue │ │ │ │ ├── index.vue │ │ │ │ ├── songCard │ │ │ │ │ └── index.vue │ │ │ │ └── songInfo │ │ │ │ │ └── index.vue │ │ │ ├── mode │ │ │ │ ├── desc.vue │ │ │ │ ├── index.vue │ │ │ │ └── lyric.vue │ │ │ └── title │ │ │ │ └── index.vue │ │ └── manager │ │ │ └── index.vue │ ├── utils │ │ ├── constants.ts │ │ └── utils.ts │ ├── workflow │ │ ├── form │ │ │ ├── BasicInfo.vue │ │ │ ├── WorkflowDesign.vue │ │ │ └── index.vue │ │ └── index.vue │ └── write │ │ ├── index │ │ ├── components │ │ │ ├── Left.vue │ │ │ ├── Right.vue │ │ │ └── Tag.vue │ │ └── index.vue │ │ └── manager │ │ └── index.vue │ ├── bpm │ ├── category │ │ ├── CategoryForm.vue │ │ └── index.vue │ ├── form │ │ ├── editor │ │ │ └── index.vue │ │ └── index.vue │ ├── group │ │ ├── UserGroupForm.vue │ │ └── index.vue │ ├── model │ │ ├── CategoryDraggableModel.vue │ │ ├── definition │ │ │ └── index.vue │ │ ├── form │ │ │ ├── BasicInfo.vue │ │ │ ├── ExtraSettings.vue │ │ │ ├── FormDesign.vue │ │ │ ├── ProcessDesign.vue │ │ │ ├── editor │ │ │ │ └── index.vue │ │ │ └── index.vue │ │ └── index.vue │ ├── oa │ │ └── leave │ │ │ ├── create.vue │ │ │ ├── detail.vue │ │ │ └── index.vue │ ├── processExpression │ │ ├── ProcessExpressionForm.vue │ │ └── index.vue │ ├── processInstance │ │ ├── create │ │ │ ├── ProcessDefinitionDetail.vue │ │ │ └── index.vue │ │ ├── detail │ │ │ ├── ProcessInstanceBpmnViewer.vue │ │ │ ├── ProcessInstanceOperationButton.vue │ │ │ ├── ProcessInstanceSimpleViewer.vue │ │ │ ├── ProcessInstanceTaskList.vue │ │ │ ├── ProcessInstanceTimeline.vue │ │ │ ├── SignDialog.vue │ │ │ └── index.vue │ │ ├── index.vue │ │ ├── manager │ │ │ └── index.vue │ │ └── report │ │ │ └── index.vue │ ├── processListener │ │ ├── ProcessListenerForm.vue │ │ └── index.vue │ ├── simple │ │ └── SimpleModelDesign.vue │ └── task │ │ ├── copy │ │ └── index.vue │ │ ├── done │ │ └── index.vue │ │ ├── manager │ │ └── index.vue │ │ └── todo │ │ └── index.vue │ ├── crm │ ├── backlog │ │ ├── components │ │ │ ├── ClueFollowList.vue │ │ │ ├── ContractAuditList.vue │ │ │ ├── ContractRemindList.vue │ │ │ ├── CustomerFollowList.vue │ │ │ ├── CustomerPutPoolRemindList.vue │ │ │ ├── CustomerTodayContactList.vue │ │ │ ├── ReceivableAuditList.vue │ │ │ ├── ReceivablePlanRemindList.vue │ │ │ └── common.ts │ │ └── index.vue │ ├── business │ │ ├── BusinessForm.vue │ │ ├── BusinessUpdateStatusForm.vue │ │ ├── components │ │ │ ├── BusinessList.vue │ │ │ ├── BusinessListModal.vue │ │ │ └── BusinessProductForm.vue │ │ ├── detail │ │ │ ├── BusinessDetailsHeader.vue │ │ │ ├── BusinessDetailsInfo.vue │ │ │ ├── BusinessProductList.vue │ │ │ └── index.vue │ │ ├── index.vue │ │ └── status │ │ │ ├── BusinessStatusForm.vue │ │ │ └── index.vue │ ├── clue │ │ ├── ClueForm.vue │ │ ├── detail │ │ │ ├── ClueDetailsHeader.vue │ │ │ ├── ClueDetailsInfo.vue │ │ │ └── index.vue │ │ └── index.vue │ ├── contact │ │ ├── ContactForm.vue │ │ ├── components │ │ │ ├── ContactList.vue │ │ │ └── ContactListModal.vue │ │ ├── detail │ │ │ ├── ContactDetailsHeader.vue │ │ │ ├── ContactDetailsInfo.vue │ │ │ └── index.vue │ │ └── index.vue │ ├── contract │ │ ├── ContractForm.vue │ │ ├── components │ │ │ ├── ContractList.vue │ │ │ └── ContractProductForm.vue │ │ ├── config │ │ │ └── index.vue │ │ ├── detail │ │ │ ├── ContractDetailsHeader.vue │ │ │ ├── ContractDetailsInfo.vue │ │ │ ├── ContractProductList.vue │ │ │ └── index.vue │ │ └── index.vue │ ├── customer │ │ ├── CustomerForm.vue │ │ ├── CustomerImportForm.vue │ │ ├── detail │ │ │ ├── CustomerDetailsHeader.vue │ │ │ ├── CustomerDetailsInfo.vue │ │ │ └── index.vue │ │ ├── index.vue │ │ ├── limitConfig │ │ │ ├── CustomerLimitConfigForm.vue │ │ │ ├── CustomerLimitConfigList.vue │ │ │ └── index.vue │ │ ├── pool │ │ │ ├── CustomerDistributeForm.vue │ │ │ └── index.vue │ │ └── poolConfig │ │ │ └── index.vue │ ├── followup │ │ ├── FollowUpRecordForm.vue │ │ ├── components │ │ │ ├── FollowUpRecordBusinessForm.vue │ │ │ └── FollowUpRecordContactForm.vue │ │ └── index.vue │ ├── permission │ │ └── components │ │ │ ├── PermissionForm.vue │ │ │ ├── PermissionList.vue │ │ │ └── TransferForm.vue │ ├── product │ │ ├── ProductForm.vue │ │ ├── category │ │ │ ├── ProductCategoryForm.vue │ │ │ └── index.vue │ │ ├── detail │ │ │ ├── ProductDetailsHeader.vue │ │ │ ├── ProductDetailsInfo.vue │ │ │ └── index.vue │ │ └── index.vue │ ├── receivable │ │ ├── ReceivableForm.vue │ │ ├── components │ │ │ └── ReceivableList.vue │ │ ├── detail │ │ │ ├── ReceivableDetailsHeader.vue │ │ │ ├── ReceivableDetailsInfo.vue │ │ │ └── index.vue │ │ ├── index.vue │ │ └── plan │ │ │ ├── ReceivablePlanForm.vue │ │ │ ├── components │ │ │ └── ReceivablePlanList.vue │ │ │ ├── detail │ │ │ ├── ReceivablePlanDetailsHeader.vue │ │ │ ├── ReceivablePlanDetailsInfo.vue │ │ │ └── index.vue │ │ │ └── index.vue │ └── statistics │ │ ├── customer │ │ ├── components │ │ │ ├── CustomerConversionStat.vue │ │ │ ├── CustomerDealCycleByArea.vue │ │ │ ├── CustomerDealCycleByProduct.vue │ │ │ ├── CustomerDealCycleByUser.vue │ │ │ ├── CustomerFollowUpSummary.vue │ │ │ ├── CustomerFollowUpType.vue │ │ │ ├── CustomerPoolSummary.vue │ │ │ └── CustomerSummary.vue │ │ └── index.vue │ │ ├── funnel │ │ ├── components │ │ │ ├── BusinessInversionRateSummary.vue │ │ │ ├── BusinessSummary.vue │ │ │ └── FunnelBusiness.vue │ │ └── index.vue │ │ ├── performance │ │ ├── components │ │ │ ├── ContractCountPerformance.vue │ │ │ ├── ContractPricePerformance.vue │ │ │ └── ReceivablePricePerformance.vue │ │ └── index.vue │ │ ├── portrait │ │ ├── components │ │ │ ├── PortraitCustomerArea.vue │ │ │ ├── PortraitCustomerIndustry.vue │ │ │ ├── PortraitCustomerLevel.vue │ │ │ └── PortraitCustomerSource.vue │ │ └── index.vue │ │ └── rank │ │ ├── components │ │ ├── ContactCountRank.vue │ │ ├── ContractCountRank.vue │ │ ├── ContractPriceRank.vue │ │ ├── CustomerCountRank.vue │ │ ├── FollowCountRank.vue │ │ ├── FollowCustomerCountRank.vue │ │ ├── ProductSalesRank.vue │ │ └── ReceivablePriceRank.vue │ │ └── index.vue │ ├── erp │ ├── finance │ │ ├── account │ │ │ ├── AccountForm.vue │ │ │ └── index.vue │ │ ├── payment │ │ │ ├── FinancePaymentForm.vue │ │ │ ├── components │ │ │ │ └── FinancePaymentItemForm.vue │ │ │ └── index.vue │ │ └── receipt │ │ │ ├── FinanceReceiptForm.vue │ │ │ ├── components │ │ │ └── FinanceReceiptItemForm.vue │ │ │ └── index.vue │ ├── home │ │ ├── components │ │ │ ├── SummaryCard.vue │ │ │ └── TimeSummaryChart.vue │ │ └── index.vue │ ├── product │ │ ├── category │ │ │ ├── ProductCategoryForm.vue │ │ │ └── index.vue │ │ ├── product │ │ │ ├── ProductForm.vue │ │ │ └── index.vue │ │ └── unit │ │ │ ├── ProductUnitForm.vue │ │ │ └── index.vue │ ├── purchase │ │ ├── in │ │ │ ├── PurchaseInForm.vue │ │ │ ├── components │ │ │ │ ├── PurchaseInItemForm.vue │ │ │ │ └── PurchaseInPaymentEnableList.vue │ │ │ └── index.vue │ │ ├── order │ │ │ ├── PurchaseOrderForm.vue │ │ │ ├── components │ │ │ │ ├── PurchaseOrderInEnableList.vue │ │ │ │ ├── PurchaseOrderItemForm.vue │ │ │ │ └── PurchaseOrderReturnEnableList.vue │ │ │ └── index.vue │ │ ├── return │ │ │ ├── PurchaseReturnForm.vue │ │ │ ├── components │ │ │ │ ├── PurchaseReturnItemForm.vue │ │ │ │ └── PurchaseReturnRefundEnableList.vue │ │ │ └── index.vue │ │ └── supplier │ │ │ ├── SupplierForm.vue │ │ │ └── index.vue │ ├── sale │ │ ├── customer │ │ │ ├── CustomerForm.vue │ │ │ └── index.vue │ │ ├── order │ │ │ ├── SaleOrderForm.vue │ │ │ ├── components │ │ │ │ ├── SaleOrderItemForm.vue │ │ │ │ ├── SaleOrderOutEnableList.vue │ │ │ │ └── SaleOrderReturnEnableList.vue │ │ │ └── index.vue │ │ ├── out │ │ │ ├── SaleOutForm.vue │ │ │ ├── components │ │ │ │ ├── SaleOutItemForm.vue │ │ │ │ └── SaleOutReceiptEnableList.vue │ │ │ └── index.vue │ │ └── return │ │ │ ├── SaleReturnForm.vue │ │ │ ├── components │ │ │ ├── SaleReturnItemForm.vue │ │ │ └── SaleReturnRefundEnableList.vue │ │ │ └── index.vue │ └── stock │ │ ├── check │ │ ├── StockCheckForm.vue │ │ ├── components │ │ │ └── StockCheckItemForm.vue │ │ └── index.vue │ │ ├── in │ │ ├── StockInForm.vue │ │ ├── components │ │ │ └── StockInItemForm.vue │ │ └── index.vue │ │ ├── move │ │ ├── StockMoveForm.vue │ │ ├── components │ │ │ └── StockMoveItemForm.vue │ │ └── index.vue │ │ ├── out │ │ ├── StockOutForm.vue │ │ ├── components │ │ │ └── StockOutItemForm.vue │ │ └── index.vue │ │ ├── record │ │ └── index.vue │ │ ├── stock │ │ └── index.vue │ │ └── warehouse │ │ ├── WarehouseForm.vue │ │ └── index.vue │ ├── infra │ ├── apiAccessLog │ │ ├── ApiAccessLogDetail.vue │ │ └── index.vue │ ├── apiErrorLog │ │ ├── ApiErrorLogDetail.vue │ │ └── index.vue │ ├── build │ │ └── index.vue │ ├── codegen │ │ ├── EditTable.vue │ │ ├── ImportTable.vue │ │ ├── PreviewCode.vue │ │ ├── components │ │ │ ├── BasicInfoForm.vue │ │ │ ├── ColumInfoForm.vue │ │ │ ├── GenerateInfoForm.vue │ │ │ └── index.ts │ │ └── index.vue │ ├── config │ │ ├── ConfigForm.vue │ │ └── index.vue │ ├── dataSourceConfig │ │ ├── DataSourceConfigForm.vue │ │ └── index.vue │ ├── demo │ │ ├── demo01 │ │ │ ├── Demo01ContactForm.vue │ │ │ └── index.vue │ │ ├── demo02 │ │ │ ├── Demo02CategoryForm.vue │ │ │ └── index.vue │ │ └── demo03 │ │ │ ├── erp │ │ │ ├── Demo03StudentForm.vue │ │ │ ├── components │ │ │ │ ├── Demo03CourseForm.vue │ │ │ │ ├── Demo03CourseList.vue │ │ │ │ ├── Demo03GradeForm.vue │ │ │ │ └── Demo03GradeList.vue │ │ │ └── index.vue │ │ │ ├── inner │ │ │ ├── Demo03StudentForm.vue │ │ │ ├── components │ │ │ │ ├── Demo03CourseForm.vue │ │ │ │ ├── Demo03CourseList.vue │ │ │ │ ├── Demo03GradeForm.vue │ │ │ │ └── Demo03GradeList.vue │ │ │ └── index.vue │ │ │ └── normal │ │ │ ├── Demo03StudentForm.vue │ │ │ ├── components │ │ │ ├── Demo03CourseForm.vue │ │ │ └── Demo03GradeForm.vue │ │ │ └── index.vue │ ├── druid │ │ └── index.vue │ ├── file │ │ ├── FileForm.vue │ │ └── index.vue │ ├── fileConfig │ │ ├── FileConfigForm.vue │ │ └── index.vue │ ├── job │ │ ├── JobDetail.vue │ │ ├── JobForm.vue │ │ ├── index.vue │ │ └── logger │ │ │ ├── JobLogDetail.vue │ │ │ └── index.vue │ ├── redis │ │ └── index.vue │ ├── server │ │ └── index.vue │ ├── skywalking │ │ └── index.vue │ ├── swagger │ │ └── index.vue │ └── webSocket │ │ └── index.vue │ ├── iot │ ├── device │ │ ├── device │ │ │ ├── DeviceForm.vue │ │ │ ├── DeviceGroupForm.vue │ │ │ ├── DeviceImportForm.vue │ │ │ ├── detail │ │ │ │ ├── DeviceDataDetail.vue │ │ │ │ ├── DeviceDetailConfig.vue │ │ │ │ ├── DeviceDetailsHeader.vue │ │ │ │ ├── DeviceDetailsInfo.vue │ │ │ │ ├── DeviceDetailsLog.vue │ │ │ │ ├── DeviceDetailsModel.vue │ │ │ │ ├── DeviceDetailsSimulator.vue │ │ │ │ └── index.vue │ │ │ └── index.vue │ │ └── group │ │ │ ├── DeviceGroupForm.vue │ │ │ └── index.vue │ ├── home │ │ └── index.vue │ ├── plugin │ │ ├── PluginConfigForm.vue │ │ ├── detail │ │ │ ├── PluginImportForm.vue │ │ │ └── index.vue │ │ └── index.vue │ ├── product │ │ ├── category │ │ │ ├── ProductCategoryForm.vue │ │ │ └── index.vue │ │ └── product │ │ │ ├── ProductForm.vue │ │ │ ├── detail │ │ │ ├── ProductDetailsHeader.vue │ │ │ ├── ProductDetailsInfo.vue │ │ │ ├── ProductTopic.vue │ │ │ └── index.vue │ │ │ └── index.vue │ ├── rule │ │ └── databridge │ │ │ ├── IoTDataBridgeForm.vue │ │ │ ├── config │ │ │ ├── HttpConfigForm.vue │ │ │ ├── KafkaMQConfigForm.vue │ │ │ ├── MqttConfigForm.vue │ │ │ ├── RabbitMQConfigForm.vue │ │ │ ├── RedisStreamMQConfigForm.vue │ │ │ ├── RocketMQConfigForm.vue │ │ │ ├── components │ │ │ │ └── KeyValueEditor.vue │ │ │ └── index.ts │ │ │ └── index.vue │ ├── thingmodel │ │ ├── ThingModelEvent.vue │ │ ├── ThingModelForm.vue │ │ ├── ThingModelInputOutputParam.vue │ │ ├── ThingModelProperty.vue │ │ ├── ThingModelService.vue │ │ ├── components │ │ │ ├── DataDefinition.vue │ │ │ └── index.ts │ │ ├── config.ts │ │ ├── dataSpecs │ │ │ ├── ThingModelArrayDataSpecs.vue │ │ │ ├── ThingModelEnumDataSpecs.vue │ │ │ ├── ThingModelNumberDataSpecs.vue │ │ │ ├── ThingModelStructDataSpecs.vue │ │ │ └── index.ts │ │ └── index.vue │ └── utils │ │ └── constants.ts │ ├── mall │ ├── home │ │ ├── components │ │ │ ├── ComparisonCard.vue │ │ │ ├── MemberStatisticsCard.vue │ │ │ ├── OperationDataCard.vue │ │ │ ├── ShortcutCard.vue │ │ │ └── TradeTrendCard.vue │ │ └── index.vue │ ├── product │ │ ├── brand │ │ │ ├── BrandForm.vue │ │ │ └── index.vue │ │ ├── category │ │ │ ├── CategoryForm.vue │ │ │ ├── components │ │ │ │ └── ProductCategorySelect.vue │ │ │ └── index.vue │ │ ├── comment │ │ │ ├── CommentForm.vue │ │ │ ├── ReplyForm.vue │ │ │ └── index.vue │ │ ├── property │ │ │ ├── PropertyForm.vue │ │ │ ├── index.vue │ │ │ └── value │ │ │ │ ├── ValueForm.vue │ │ │ │ └── index.vue │ │ └── spu │ │ │ ├── components │ │ │ ├── SkuList.vue │ │ │ ├── SkuTableSelect.vue │ │ │ ├── SpuShowcase.vue │ │ │ ├── SpuTableSelect.vue │ │ │ └── index.ts │ │ │ ├── form │ │ │ ├── DeliveryForm.vue │ │ │ ├── DescriptionForm.vue │ │ │ ├── InfoForm.vue │ │ │ ├── OtherForm.vue │ │ │ ├── ProductAttributes.vue │ │ │ ├── ProductPropertyAddForm.vue │ │ │ ├── SkuForm.vue │ │ │ └── index.vue │ │ │ └── index.vue │ ├── promotion │ │ ├── article │ │ │ ├── ArticleForm.vue │ │ │ ├── category │ │ │ │ ├── ArticleCategoryForm.vue │ │ │ │ └── index.vue │ │ │ └── index.vue │ │ ├── banner │ │ │ ├── BannerForm.vue │ │ │ └── index.vue │ │ ├── bargain │ │ │ ├── activity │ │ │ │ ├── BargainActivityForm.vue │ │ │ │ ├── bargainActivity.data.ts │ │ │ │ └── index.vue │ │ │ └── record │ │ │ │ ├── BargainRecordListDialog.vue │ │ │ │ └── index.vue │ │ ├── combination │ │ │ ├── activity │ │ │ │ ├── CombinationActivityForm.vue │ │ │ │ ├── combinationActivity.data.ts │ │ │ │ └── index.vue │ │ │ ├── components │ │ │ │ ├── CombinationShowcase.vue │ │ │ │ └── CombinationTableSelect.vue │ │ │ └── record │ │ │ │ ├── CombinationRecordListDialog.vue │ │ │ │ └── index.vue │ │ ├── components │ │ │ ├── SpuAndSkuList.vue │ │ │ ├── SpuSelect.vue │ │ │ └── index.ts │ │ ├── coupon │ │ │ ├── components │ │ │ │ ├── CouponSelect.vue │ │ │ │ ├── CouponSendForm.vue │ │ │ │ └── index.ts │ │ │ ├── formatter.ts │ │ │ ├── index.vue │ │ │ └── template │ │ │ │ ├── CouponTemplateForm.vue │ │ │ │ └── index.vue │ │ ├── discountActivity │ │ │ ├── DiscountActivityForm.vue │ │ │ ├── discountActivity.data.ts │ │ │ └── index.vue │ │ ├── diy │ │ │ ├── page │ │ │ │ ├── DiyPageForm.vue │ │ │ │ ├── decorate.vue │ │ │ │ └── index.vue │ │ │ └── template │ │ │ │ ├── DiyTemplateForm.vue │ │ │ │ ├── decorate.vue │ │ │ │ └── index.vue │ │ ├── kefu │ │ │ ├── components │ │ │ │ ├── KeFuConversationList.vue │ │ │ │ ├── KeFuMessageList.vue │ │ │ │ ├── asserts │ │ │ │ │ ├── a.png │ │ │ │ │ ├── aini.png │ │ │ │ │ ├── aixin.png │ │ │ │ │ ├── baiyan.png │ │ │ │ │ ├── bizui.png │ │ │ │ │ ├── buhaoyisi.png │ │ │ │ │ ├── bukesiyi.png │ │ │ │ │ ├── dajing.png │ │ │ │ │ ├── danao.png │ │ │ │ │ ├── daxiao.png │ │ │ │ │ ├── dianzan.png │ │ │ │ │ ├── emo.png │ │ │ │ │ ├── esi.png │ │ │ │ │ ├── fadai.png │ │ │ │ │ ├── fankun.png │ │ │ │ │ ├── feiwen.png │ │ │ │ │ ├── fennu.png │ │ │ │ │ ├── ganga.png │ │ │ │ │ ├── ganmao.png │ │ │ │ │ ├── hanyan.png │ │ │ │ │ ├── haochi.png │ │ │ │ │ ├── hongxin.png │ │ │ │ │ ├── huaixiao.png │ │ │ │ │ ├── jingkong.png │ │ │ │ │ ├── jingshu.png │ │ │ │ │ ├── jingya.png │ │ │ │ │ ├── kaixin.png │ │ │ │ │ ├── keai.png │ │ │ │ │ ├── keshui.png │ │ │ │ │ ├── kun.png │ │ │ │ │ ├── lengku.png │ │ │ │ │ ├── liuhan.png │ │ │ │ │ ├── liukoushui.png │ │ │ │ │ ├── liulei.png │ │ │ │ │ ├── mengbi.png │ │ │ │ │ ├── mianwubiaoqing.png │ │ │ │ │ ├── nanguo.png │ │ │ │ │ ├── outu.png │ │ │ │ │ ├── picture.svg │ │ │ │ │ ├── shengqi.png │ │ │ │ │ ├── shuizhuo.png │ │ │ │ │ ├── tianshi.png │ │ │ │ │ ├── xiaodiaoya.png │ │ │ │ │ ├── xiaoku.png │ │ │ │ │ ├── xinsui.png │ │ │ │ │ ├── xiong.png │ │ │ │ │ ├── yiwen.png │ │ │ │ │ ├── yun.png │ │ │ │ │ └── ziya.png │ │ │ │ ├── index.ts │ │ │ │ ├── member │ │ │ │ │ ├── MemberInfo.vue │ │ │ │ │ ├── OrderBrowsingHistory.vue │ │ │ │ │ └── ProductBrowsingHistory.vue │ │ │ │ ├── message │ │ │ │ │ ├── MessageItem.vue │ │ │ │ │ ├── OrderItem.vue │ │ │ │ │ └── ProductItem.vue │ │ │ │ └── tools │ │ │ │ │ ├── EmojiSelectPopover.vue │ │ │ │ │ ├── PictureSelectUpload.vue │ │ │ │ │ ├── constants.ts │ │ │ │ │ └── emoji.ts │ │ │ └── index.vue │ │ ├── point │ │ │ ├── activity │ │ │ │ ├── PointActivityForm.vue │ │ │ │ ├── index.vue │ │ │ │ └── pointActivity.data.ts │ │ │ └── components │ │ │ │ ├── PointShowcase.vue │ │ │ │ └── PointTableSelect.vue │ │ ├── rewardActivity │ │ │ ├── RewardForm.vue │ │ │ ├── components │ │ │ │ ├── RewardRule.vue │ │ │ │ └── RewardRuleCouponSelect.vue │ │ │ └── index.vue │ │ └── seckill │ │ │ ├── activity │ │ │ ├── SeckillActivityForm.vue │ │ │ ├── index.vue │ │ │ └── seckillActivity.data.ts │ │ │ ├── components │ │ │ ├── SeckillShowcase.vue │ │ │ └── SeckillTableSelect.vue │ │ │ └── config │ │ │ ├── SeckillConfigForm.vue │ │ │ └── index.vue │ ├── statistics │ │ ├── member │ │ │ ├── components │ │ │ │ ├── MemberFunnelCard.vue │ │ │ │ └── MemberTerminalCard.vue │ │ │ └── index.vue │ │ ├── product │ │ │ ├── components │ │ │ │ ├── ProductRank.vue │ │ │ │ └── ProductSummary.vue │ │ │ └── index.vue │ │ └── trade │ │ │ ├── components │ │ │ └── TradeStatisticValue.vue │ │ │ └── index.vue │ └── trade │ │ ├── afterSale │ │ ├── detail │ │ │ └── index.vue │ │ ├── form │ │ │ └── AfterSaleDisagreeForm.vue │ │ └── index.vue │ │ ├── brokerage │ │ ├── record │ │ │ └── index.vue │ │ ├── user │ │ │ ├── BrokerageOrderListDialog.vue │ │ │ ├── BrokerageUserCreateForm.vue │ │ │ ├── BrokerageUserListDialog.vue │ │ │ ├── BrokerageUserUpdateForm.vue │ │ │ └── index.vue │ │ └── withdraw │ │ │ ├── BrokerageWithdrawRejectForm.vue │ │ │ └── index.vue │ │ ├── config │ │ └── index.vue │ │ ├── delivery │ │ ├── express │ │ │ ├── ExpressForm.vue │ │ │ └── index.vue │ │ ├── expressTemplate │ │ │ ├── ExpressTemplateForm.vue │ │ │ └── index.vue │ │ ├── pickUpOrder │ │ │ └── index.vue │ │ └── pickUpStore │ │ │ ├── DeliveryPickUpStoreBindForm.vue │ │ │ ├── PickUpStoreForm.vue │ │ │ ├── components │ │ │ └── StoreStaffTableSelect.vue │ │ │ └── index.vue │ │ └── order │ │ ├── components │ │ ├── OrderTableColumn.vue │ │ └── index.ts │ │ ├── detail │ │ └── index.vue │ │ ├── form │ │ ├── OrderDeliveryForm.vue │ │ ├── OrderPickUpForm.vue │ │ ├── OrderUpdateAddressForm.vue │ │ ├── OrderUpdatePriceForm.vue │ │ └── OrderUpdateRemarkForm.vue │ │ └── index.vue │ ├── member │ ├── config │ │ └── index.vue │ ├── group │ │ ├── GroupForm.vue │ │ ├── components │ │ │ └── MemberGroupSelect.vue │ │ └── index.vue │ ├── level │ │ ├── LevelForm.vue │ │ ├── components │ │ │ └── MemberLevelSelect.vue │ │ └── index.vue │ ├── point │ │ └── record │ │ │ └── index.vue │ ├── signin │ │ ├── config │ │ │ ├── SignInConfigForm.vue │ │ │ └── index.vue │ │ └── record │ │ │ └── index.vue │ ├── tag │ │ ├── TagForm.vue │ │ ├── components │ │ │ └── MemberTagSelect.vue │ │ └── index.vue │ └── user │ │ ├── UserForm.vue │ │ ├── components │ │ ├── UserBalanceUpdateForm.vue │ │ ├── UserLevelUpdateForm.vue │ │ └── UserPointUpdateForm.vue │ │ ├── detail │ │ ├── UserAccountInfo.vue │ │ ├── UserAddressList.vue │ │ ├── UserAftersaleList.vue │ │ ├── UserBalanceList.vue │ │ ├── UserBasicInfo.vue │ │ ├── UserBrokerageList.vue │ │ ├── UserCouponList.vue │ │ ├── UserExperienceRecordList.vue │ │ ├── UserFavoriteList.vue │ │ ├── UserOrderList.vue │ │ ├── UserPointList.vue │ │ ├── UserSignList.vue │ │ └── index.vue │ │ └── index.vue │ ├── mp │ ├── account │ │ ├── AccountForm.vue │ │ └── index.vue │ ├── autoReply │ │ ├── components │ │ │ ├── ReplyForm.vue │ │ │ ├── ReplyTable.vue │ │ │ └── types.ts │ │ └── index.vue │ ├── components │ │ ├── wx-account-select │ │ │ ├── index.ts │ │ │ └── main.vue │ │ ├── wx-location │ │ │ ├── index.ts │ │ │ └── main.vue │ │ ├── wx-material-select │ │ │ ├── index.ts │ │ │ ├── main.vue │ │ │ └── types.ts │ │ ├── wx-msg │ │ │ ├── card.scss │ │ │ ├── comment.scss │ │ │ ├── components │ │ │ │ ├── Msg.vue │ │ │ │ ├── MsgEvent.vue │ │ │ │ └── MsgList.vue │ │ │ ├── index.ts │ │ │ ├── main.vue │ │ │ └── types.ts │ │ ├── wx-music │ │ │ ├── index.ts │ │ │ └── main.vue │ │ ├── wx-news │ │ │ ├── index.ts │ │ │ └── main.vue │ │ ├── wx-reply │ │ │ ├── components │ │ │ │ ├── TabImage.vue │ │ │ │ ├── TabMusic.vue │ │ │ │ ├── TabNews.vue │ │ │ │ ├── TabText.vue │ │ │ │ ├── TabVideo.vue │ │ │ │ ├── TabVoice.vue │ │ │ │ └── types.ts │ │ │ ├── index.ts │ │ │ └── main.vue │ │ ├── wx-video-play │ │ │ ├── index.ts │ │ │ └── main.vue │ │ └── wx-voice-play │ │ │ ├── index.ts │ │ │ └── main.vue │ ├── draft │ │ ├── components │ │ │ ├── CoverSelect.vue │ │ │ ├── DraftTable.vue │ │ │ ├── NewsForm.vue │ │ │ ├── index.ts │ │ │ └── types.ts │ │ ├── editor-config.ts │ │ ├── index.vue │ │ └── mock.js │ ├── freePublish │ │ └── index.vue │ ├── hooks │ │ └── useUpload.ts │ ├── material │ │ ├── components │ │ │ ├── ImageTable.vue │ │ │ ├── UploadFile.vue │ │ │ ├── UploadVideo.vue │ │ │ ├── VideoTable.vue │ │ │ ├── VoiceTable.vue │ │ │ └── upload.ts │ │ └── index.vue │ ├── menu │ │ ├── assets │ │ │ ├── iphone_backImg.png │ │ │ ├── menu_foot.png │ │ │ └── menu_head.png │ │ ├── components │ │ │ ├── MenuEditor.vue │ │ │ ├── MenuPreviewer.vue │ │ │ ├── menuOptions.ts │ │ │ └── types.ts │ │ └── index.vue │ ├── message │ │ ├── MessageTable.vue │ │ └── index.vue │ ├── statistics │ │ └── index.vue │ ├── tag │ │ ├── TagForm.vue │ │ └── index.vue │ └── user │ │ ├── UserForm.vue │ │ └── index.vue │ ├── pay │ ├── app │ │ ├── components │ │ │ ├── AppForm.vue │ │ │ └── channel │ │ │ │ ├── AlipayChannelForm.vue │ │ │ │ ├── MockChannelForm.vue │ │ │ │ ├── WalletChannelForm.vue │ │ │ │ └── WeixinChannelForm.vue │ │ └── index.vue │ ├── cashier │ │ └── index.vue │ ├── demo │ │ ├── order │ │ │ └── index.vue │ │ └── transfer │ │ │ ├── DemoTransferForm.vue │ │ │ └── index.vue │ ├── notify │ │ ├── NotifyDetail.vue │ │ └── index.vue │ ├── order │ │ ├── OrderDetail.vue │ │ └── index.vue │ ├── refund │ │ ├── RefundDetail.vue │ │ └── index.vue │ ├── transfer │ │ ├── CreatePayTransfer.vue │ │ ├── TransferDetail.vue │ │ └── index.vue │ └── wallet │ │ ├── balance │ │ ├── WalletForm.vue │ │ └── index.vue │ │ ├── rechargePackage │ │ ├── WalletRechargePackageForm.vue │ │ └── index.vue │ │ └── transaction │ │ └── WalletTransactionList.vue │ ├── report │ ├── goview │ │ └── index.vue │ └── jmreport │ │ ├── bi.vue │ │ └── index.vue │ └── system │ ├── area │ ├── AreaForm.vue │ └── index.vue │ ├── dept │ ├── DeptForm.vue │ └── index.vue │ ├── dict │ ├── DictTypeForm.vue │ ├── data │ │ ├── DictDataForm.vue │ │ └── index.vue │ └── index.vue │ ├── loginlog │ ├── LoginLogDetail.vue │ └── index.vue │ ├── mail │ ├── account │ │ ├── MailAccountDetail.vue │ │ ├── MailAccountForm.vue │ │ ├── account.data.ts │ │ └── index.vue │ ├── log │ │ ├── MailLogDetail.vue │ │ ├── index.vue │ │ └── log.data.ts │ └── template │ │ ├── MailTemplateForm.vue │ │ ├── MailTemplateSendForm.vue │ │ ├── index.vue │ │ └── template.data.ts │ ├── menu │ ├── MenuForm.vue │ └── index.vue │ ├── notice │ ├── NoticeForm.vue │ └── index.vue │ ├── notify │ ├── message │ │ ├── NotifyMessageDetail.vue │ │ └── index.vue │ ├── my │ │ ├── MyNotifyMessageDetail.vue │ │ └── index.vue │ └── template │ │ ├── NotifyTemplateForm.vue │ │ ├── NotifyTemplateSendForm.vue │ │ └── index.vue │ ├── oauth2 │ ├── client │ │ ├── ClientForm.vue │ │ └── index.vue │ └── token │ │ └── index.vue │ ├── operatelog │ ├── OperateLogDetail.vue │ └── index.vue │ ├── post │ ├── PostForm.vue │ └── index.vue │ ├── role │ ├── RoleAssignMenuForm.vue │ ├── RoleDataPermissionForm.vue │ ├── RoleForm.vue │ └── index.vue │ ├── sms │ ├── channel │ │ ├── SmsChannelForm.vue │ │ └── index.vue │ ├── log │ │ ├── SmsLogDetail.vue │ │ └── index.vue │ └── template │ │ ├── SmsTemplateForm.vue │ │ ├── SmsTemplateSendForm.vue │ │ └── index.vue │ ├── social │ ├── client │ │ ├── SocialClientForm.vue │ │ └── index.vue │ └── user │ │ ├── SocialUserDetail.vue │ │ └── index.vue │ ├── tenant │ ├── TenantForm.vue │ └── index.vue │ ├── tenantPackage │ ├── TenantPackageForm.vue │ └── index.vue │ └── user │ ├── DeptTree.vue │ ├── UserAssignRoleForm.vue │ ├── UserForm.vue │ ├── UserImportForm.vue │ └── index.vue ├── stylelint.config.js ├── tsconfig.json ├── types ├── components.d.ts ├── custom-types.d.ts ├── env.d.ts ├── global.d.ts └── router.d.ts ├── uno.config.ts ├── vite.config.ts └── web-types.json /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | [*.{js,ts,vue}] 3 | charset = utf-8 # 设置文件字符集为 utf-8 4 | end_of_line = lf # 控制换行类型(lf | cr | crlf) 5 | insert_final_newline = true # 始终在文件末尾插入一个新行 6 | indent_style = space # 缩进风格(tab | space) 7 | indent_size = 2 # 缩进大小 8 | max_line_length = 100 # 最大行长度 9 | 10 | [*.md] # 仅 md 文件适用以下规则 11 | max_line_length = off # 关闭最大行长度限制 12 | trim_trailing_whitespace = false # 关闭末尾空格修剪 13 | -------------------------------------------------------------------------------- /.env: -------------------------------------------------------------------------------- 1 | # 标题 2 | VITE_APP_TITLE=芋道管理系统 3 | 4 | # 项目本地运行端口号 5 | VITE_PORT=80 6 | 7 | # open 运行 npm run dev 时自动打开浏览器 8 | VITE_OPEN=true 9 | 10 | # 租户开关 11 | VITE_APP_TENANT_ENABLE=true 12 | 13 | # 验证码的开关 14 | VITE_APP_CAPTCHA_ENABLE=true 15 | 16 | # 文档地址的开关 17 | VITE_APP_DOCALERT_ENABLE=true 18 | 19 | # 百度统计 20 | VITE_APP_BAIDU_CODE = a1ff8825baa73c3a78eb96aa40325abc 21 | 22 | # 默认账户密码 23 | VITE_APP_DEFAULT_LOGIN_TENANT = 芋道源码 24 | VITE_APP_DEFAULT_LOGIN_USERNAME = admin 25 | VITE_APP_DEFAULT_LOGIN_PASSWORD = admin123 26 | -------------------------------------------------------------------------------- /.env.dev: -------------------------------------------------------------------------------- 1 | # 开发环境:本地只启动前端项目,依赖开发环境(后端、APP) 2 | NODE_ENV=production 3 | 4 | VITE_DEV=true 5 | 6 | # 请求路径 7 | VITE_BASE_URL='http://api-dashboard.yudao.iocoder.cn' 8 | 9 | # 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持S3服务 10 | VITE_UPLOAD_TYPE=server 11 | 12 | # 接口地址 13 | VITE_API_URL=/admin-api 14 | 15 | # 是否删除debugger 16 | VITE_DROP_DEBUGGER=false 17 | 18 | # 是否删除console.log 19 | VITE_DROP_CONSOLE=false 20 | 21 | # 是否sourcemap 22 | VITE_SOURCEMAP=true 23 | 24 | # 打包路径 25 | VITE_BASE_PATH=/ 26 | 27 | # 输出路径 28 | VITE_OUT_DIR=dist 29 | 30 | # 商城H5会员端域名 31 | VITE_MALL_H5_DOMAIN='http://mall.yudao.iocoder.cn' 32 | 33 | # 验证码的开关 34 | VITE_APP_CAPTCHA_ENABLE=true 35 | 36 | # GoView域名 37 | VITE_GOVIEW_URL='http://127.0.0.1:3000' -------------------------------------------------------------------------------- /.env.local: -------------------------------------------------------------------------------- 1 | # 本地开发环境:本地启动所有项目(前端、后端、APP)时使用,不依赖外部环境 2 | NODE_ENV=development 3 | 4 | VITE_DEV=true 5 | 6 | # 请求路径 7 | VITE_BASE_URL='http://localhost:48080' 8 | 9 | # 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持 S3 服务 10 | VITE_UPLOAD_TYPE=server 11 | 12 | # 接口地址 13 | VITE_API_URL=/admin-api 14 | 15 | # 是否删除debugger 16 | VITE_DROP_DEBUGGER=false 17 | 18 | # 是否删除console.log 19 | VITE_DROP_CONSOLE=false 20 | 21 | # 是否sourcemap 22 | VITE_SOURCEMAP=false 23 | 24 | # 打包路径 25 | VITE_BASE_PATH=/ 26 | 27 | # 商城H5会员端域名 28 | VITE_MALL_H5_DOMAIN='http://localhost:3000' 29 | 30 | # 验证码的开关 31 | VITE_APP_CAPTCHA_ENABLE=false 32 | 33 | # GoView域名 34 | VITE_GOVIEW_URL='http://127.0.0.1:3000' -------------------------------------------------------------------------------- /.env.prod: -------------------------------------------------------------------------------- 1 | # 生产环境:只在打包时使用 2 | NODE_ENV=production 3 | 4 | VITE_DEV=false 5 | 6 | # 请求路径 7 | VITE_BASE_URL='http://localhost:48080' 8 | 9 | # 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持S3服务 10 | VITE_UPLOAD_TYPE=server 11 | 12 | # 接口地址 13 | VITE_API_URL=/admin-api 14 | 15 | # 是否删除debugger 16 | VITE_DROP_DEBUGGER=true 17 | 18 | # 是否删除console.log 19 | VITE_DROP_CONSOLE=true 20 | 21 | # 是否sourcemap 22 | VITE_SOURCEMAP=false 23 | 24 | # 打包路径 25 | VITE_BASE_PATH=/ 26 | 27 | # 输出路径 28 | VITE_OUT_DIR=dist-prod 29 | 30 | # 商城H5会员端域名 31 | VITE_MALL_H5_DOMAIN='http://mall.yudao.iocoder.cn' 32 | 33 | # GoView域名 34 | VITE_GOVIEW_URL='http://127.0.0.1:3000' -------------------------------------------------------------------------------- /.env.stage: -------------------------------------------------------------------------------- 1 | # 预发布环境:只在打包时使用 2 | NODE_ENV=production 3 | 4 | VITE_DEV=false 5 | 6 | # 请求路径 7 | VITE_BASE_URL='http://api-dashboard.yudao.iocoder.cn' 8 | 9 | # 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持S3服务 10 | VITE_UPLOAD_TYPE=server 11 | 12 | # 接口地址 13 | VITE_API_URL=/admin-api 14 | 15 | # 是否删除debugger 16 | VITE_DROP_DEBUGGER=true 17 | 18 | # 是否删除console.log 19 | VITE_DROP_CONSOLE=true 20 | 21 | # 是否sourcemap 22 | VITE_SOURCEMAP=false 23 | 24 | # 打包路径 25 | VITE_BASE_PATH='http://static-vue3.yudao.iocoder.cn/' 26 | 27 | # 输出路径 28 | VITE_OUT_DIR=dist-stage 29 | 30 | # 商城H5会员端域名 31 | VITE_MALL_H5_DOMAIN='http://mall.yudao.iocoder.cn' 32 | 33 | # GoView域名 34 | VITE_GOVIEW_URL='http://127.0.0.1:3000' -------------------------------------------------------------------------------- /.env.test: -------------------------------------------------------------------------------- 1 | # 测试环境:只在打包时使用 2 | NODE_ENV=production 3 | 4 | VITE_DEV=false 5 | 6 | # 请求路径 7 | VITE_BASE_URL='http://localhost:48080' 8 | 9 | # 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持S3服务 10 | VITE_UPLOAD_TYPE=server 11 | 12 | # 接口地址 13 | VITE_API_URL=/admin-api 14 | 15 | # 是否删除debugger 16 | VITE_DROP_DEBUGGER=true 17 | 18 | # 是否删除console.log 19 | VITE_DROP_CONSOLE=true 20 | 21 | # 是否sourcemap 22 | VITE_SOURCEMAP=false 23 | 24 | # 打包路径 25 | VITE_BASE_PATH=/admin-ui-vue3/ 26 | 27 | # 输出路径 28 | VITE_OUT_DIR=dist-test 29 | 30 | # 商城H5会员端域名 31 | VITE_MALL_H5_DOMAIN='http://mall.yudao.iocoder.cn' 32 | 33 | # GoView域名 34 | VITE_GOVIEW_URL='http://127.0.0.1:3000' -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | /build/ 2 | /config/ 3 | /dist/ 4 | /*.js 5 | /test/unit/coverage/ 6 | /node_modules/* 7 | /dist* 8 | /src/main.ts 9 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store 3 | dist 4 | dist-ssr 5 | /dist* 6 | pnpm-debug 7 | auto-*.d.ts 8 | .idea 9 | .history 10 | -------------------------------------------------------------------------------- /.image/Java监控.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/Java监控.jpg -------------------------------------------------------------------------------- /.image/MySQL.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/MySQL.jpg -------------------------------------------------------------------------------- /.image/OA请假-列表.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/OA请假-列表.jpg -------------------------------------------------------------------------------- /.image/OA请假-发起.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/OA请假-发起.jpg -------------------------------------------------------------------------------- /.image/OA请假-详情.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/OA请假-详情.jpg -------------------------------------------------------------------------------- /.image/Redis.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/Redis.jpg -------------------------------------------------------------------------------- /.image/admin-uniapp/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/admin-uniapp/01.png -------------------------------------------------------------------------------- /.image/admin-uniapp/02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/admin-uniapp/02.png -------------------------------------------------------------------------------- /.image/admin-uniapp/03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/admin-uniapp/03.png -------------------------------------------------------------------------------- /.image/admin-uniapp/04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/admin-uniapp/04.png -------------------------------------------------------------------------------- /.image/admin-uniapp/05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/admin-uniapp/05.png -------------------------------------------------------------------------------- /.image/admin-uniapp/06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/admin-uniapp/06.png -------------------------------------------------------------------------------- /.image/admin-uniapp/07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/admin-uniapp/07.png -------------------------------------------------------------------------------- /.image/admin-uniapp/08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/admin-uniapp/08.png -------------------------------------------------------------------------------- /.image/admin-uniapp/09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/admin-uniapp/09.png -------------------------------------------------------------------------------- /.image/common/ai-feature.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/common/ai-feature.png -------------------------------------------------------------------------------- /.image/common/ai-preview.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/common/ai-preview.gif -------------------------------------------------------------------------------- /.image/common/bpm-feature.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/common/bpm-feature.png -------------------------------------------------------------------------------- /.image/common/crm-feature.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/common/crm-feature.png -------------------------------------------------------------------------------- /.image/common/erp-feature.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/common/erp-feature.png -------------------------------------------------------------------------------- /.image/common/infra-feature.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/common/infra-feature.png -------------------------------------------------------------------------------- /.image/common/mall-feature.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/common/mall-feature.png -------------------------------------------------------------------------------- /.image/common/mall-preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/common/mall-preview.png -------------------------------------------------------------------------------- /.image/common/project-vs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/common/project-vs.png -------------------------------------------------------------------------------- /.image/common/ruoyi-vue-pro-architecture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/common/ruoyi-vue-pro-architecture.png -------------------------------------------------------------------------------- /.image/common/ruoyi-vue-pro-biz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/common/ruoyi-vue-pro-biz.png -------------------------------------------------------------------------------- /.image/common/system-feature.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/common/system-feature.png -------------------------------------------------------------------------------- /.image/common/yudao-cloud-architecture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/common/yudao-cloud-architecture.png -------------------------------------------------------------------------------- /.image/common/yudao-roadmap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/common/yudao-roadmap.png -------------------------------------------------------------------------------- /.image/demo/vue3-ep.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/demo/vue3-ep.png -------------------------------------------------------------------------------- /.image/个人中心.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/个人中心.jpg -------------------------------------------------------------------------------- /.image/代码生成.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/代码生成.jpg -------------------------------------------------------------------------------- /.image/令牌管理.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/令牌管理.jpg -------------------------------------------------------------------------------- /.image/任务列表-审批.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/任务列表-审批.jpg -------------------------------------------------------------------------------- /.image/任务列表-已办.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/任务列表-已办.jpg -------------------------------------------------------------------------------- /.image/任务列表-待办.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/任务列表-待办.jpg -------------------------------------------------------------------------------- /.image/任务日志.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/任务日志.jpg -------------------------------------------------------------------------------- /.image/商户信息.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/商户信息.jpg -------------------------------------------------------------------------------- /.image/在线用户.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/在线用户.jpg -------------------------------------------------------------------------------- /.image/大屏设计器-列表.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/大屏设计器-列表.jpg -------------------------------------------------------------------------------- /.image/大屏设计器-编辑.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/大屏设计器-编辑.jpg -------------------------------------------------------------------------------- /.image/大屏设计器-预览.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/大屏设计器-预览.jpg -------------------------------------------------------------------------------- /.image/字典数据.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/字典数据.jpg -------------------------------------------------------------------------------- /.image/字典类型.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/字典类型.jpg -------------------------------------------------------------------------------- /.image/定时任务.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/定时任务.jpg -------------------------------------------------------------------------------- /.image/岗位管理.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/岗位管理.jpg -------------------------------------------------------------------------------- /.image/工作流设计器-bpmn.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/工作流设计器-bpmn.jpg -------------------------------------------------------------------------------- /.image/工作流设计器-simple.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/工作流设计器-simple.jpg -------------------------------------------------------------------------------- /.image/应用信息-列表.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/应用信息-列表.jpg -------------------------------------------------------------------------------- /.image/应用信息-编辑.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/应用信息-编辑.jpg -------------------------------------------------------------------------------- /.image/应用管理.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/应用管理.jpg -------------------------------------------------------------------------------- /.image/我的流程-列表.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/我的流程-列表.jpg -------------------------------------------------------------------------------- /.image/我的流程-发起.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/我的流程-发起.jpg -------------------------------------------------------------------------------- /.image/我的流程-详情.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/我的流程-详情.jpg -------------------------------------------------------------------------------- /.image/报表设计器-图形报表.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/报表设计器-图形报表.jpg -------------------------------------------------------------------------------- /.image/报表设计器-打印设计.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/报表设计器-打印设计.jpg -------------------------------------------------------------------------------- /.image/报表设计器-数据报表.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/报表设计器-数据报表.jpg -------------------------------------------------------------------------------- /.image/操作日志.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/操作日志.jpg -------------------------------------------------------------------------------- /.image/支付订单.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/支付订单.jpg -------------------------------------------------------------------------------- /.image/敏感词.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/敏感词.jpg -------------------------------------------------------------------------------- /.image/数据库文档.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/数据库文档.jpg -------------------------------------------------------------------------------- /.image/文件管理.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/文件管理.jpg -------------------------------------------------------------------------------- /.image/文件管理2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/文件管理2.jpg -------------------------------------------------------------------------------- /.image/文件配置.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/文件配置.jpg -------------------------------------------------------------------------------- /.image/日志中心.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/日志中心.jpg -------------------------------------------------------------------------------- /.image/流程模型-列表.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/流程模型-列表.jpg -------------------------------------------------------------------------------- /.image/流程模型-定义.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/流程模型-定义.jpg -------------------------------------------------------------------------------- /.image/流程模型-设计.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/流程模型-设计.jpg -------------------------------------------------------------------------------- /.image/流程表单.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/流程表单.jpg -------------------------------------------------------------------------------- /.image/生成效果.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/生成效果.jpg -------------------------------------------------------------------------------- /.image/用户分组.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/用户分组.jpg -------------------------------------------------------------------------------- /.image/用户管理.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/用户管理.jpg -------------------------------------------------------------------------------- /.image/登录.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/登录.jpg -------------------------------------------------------------------------------- /.image/登录日志.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/登录日志.jpg -------------------------------------------------------------------------------- /.image/短信日志.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/短信日志.jpg -------------------------------------------------------------------------------- /.image/短信模板.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/短信模板.jpg -------------------------------------------------------------------------------- /.image/短信渠道.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/短信渠道.jpg -------------------------------------------------------------------------------- /.image/租户套餐.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/租户套餐.png -------------------------------------------------------------------------------- /.image/租户管理.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/租户管理.jpg -------------------------------------------------------------------------------- /.image/系统接口.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/系统接口.jpg -------------------------------------------------------------------------------- /.image/菜单管理.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/菜单管理.jpg -------------------------------------------------------------------------------- /.image/表单构建.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/表单构建.jpg -------------------------------------------------------------------------------- /.image/角色管理.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/角色管理.jpg -------------------------------------------------------------------------------- /.image/访问日志.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/访问日志.jpg -------------------------------------------------------------------------------- /.image/退款订单.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/退款订单.jpg -------------------------------------------------------------------------------- /.image/通知公告.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/通知公告.jpg -------------------------------------------------------------------------------- /.image/部门管理.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/部门管理.jpg -------------------------------------------------------------------------------- /.image/配置管理.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/配置管理.jpg -------------------------------------------------------------------------------- /.image/链路追踪.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/链路追踪.jpg -------------------------------------------------------------------------------- /.image/错误日志.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/错误日志.jpg -------------------------------------------------------------------------------- /.image/错误码管理.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/错误码管理.jpg -------------------------------------------------------------------------------- /.image/首页.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/.image/首页.jpg -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | /node_modules/** 2 | /dist/ 3 | /dist* 4 | /public/* 5 | /docs/* 6 | /vite.config.ts 7 | /src/types/env.d.ts 8 | /src/types/auto-components.d.ts 9 | /src/types/auto-imports.d.ts 10 | /docs/**/* 11 | CHANGELOG 12 | -------------------------------------------------------------------------------- /.stylelintignore: -------------------------------------------------------------------------------- 1 | /dist/* 2 | /public/* 3 | public/* 4 | /dist* 5 | /src/types/env.d.ts 6 | /docs/**/* 7 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "christian-kohler.path-intellisense", 4 | "vscode-icons-team.vscode-icons", 5 | "davidanson.vscode-markdownlint", 6 | "dbaeumer.vscode-eslint", 7 | "esbenp.prettier-vscode", 8 | "mrmlnc.vscode-less", 9 | "lokalise.i18n-ally", 10 | "redhat.vscode-yaml", 11 | "csstools.postcss", 12 | "mikestead.dotenv", 13 | "eamodio.gitlens", 14 | "antfu.iconify", 15 | "antfu.unocss", 16 | "Vue.volar" 17 | ] 18 | } 19 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "type": "msedge", 9 | "request": "launch", 10 | "name": "Launch Edge against localhost", 11 | "url": "http://localhost", 12 | "webRoot": "${workspaceFolder}/src", 13 | "sourceMaps": true 14 | } 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | autoprefixer: {} 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /prettier.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | printWidth: 100, // 每行代码长度(默认80) 3 | tabWidth: 2, // 每个tab相当于多少个空格(默认2)ab进行缩进(默认false) 4 | useTabs: false, // 是否使用tab 5 | semi: false, // 声明结尾使用分号(默认true) 6 | vueIndentScriptAndStyle: false, 7 | singleQuote: true, // 使用单引号(默认false) 8 | quoteProps: 'as-needed', 9 | bracketSpacing: true, // 对象字面量的大括号间使用空格(默认true) 10 | trailingComma: 'none', // 多行使用拖尾逗号(默认none) 11 | jsxSingleQuote: false, 12 | // 箭头函数参数括号 默认avoid 可选 avoid| always 13 | // avoid 能省略括号的时候就省略 例如x => x 14 | // always 总是有括号 15 | arrowParens: 'always', 16 | insertPragma: false, 17 | requirePragma: false, 18 | proseWrap: 'never', 19 | htmlWhitespaceSensitivity: 'strict', 20 | endOfLine: 'auto', 21 | rangeStart: 0 22 | } 23 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/public/favicon.ico -------------------------------------------------------------------------------- /public/logo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/public/logo.gif -------------------------------------------------------------------------------- /src/api/ai/workflow/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | export const getWorkflowPage = async (params) => { 4 | return await request.get({ url: '/ai/workflow/page', params }) 5 | } 6 | 7 | export const getWorkflow = async (id) => { 8 | return await request.get({ url: '/ai/workflow/get?id=' + id }) 9 | } 10 | 11 | export const createWorkflow = async (data) => { 12 | return await request.post({ url: '/ai/workflow/create', data }) 13 | } 14 | 15 | export const updateWorkflow = async (data) => { 16 | return await request.put({ url: '/ai/workflow/update', data }) 17 | } 18 | 19 | export const deleteWorkflow = async (id) => { 20 | return await request.delete({ url: '/ai/workflow/delete?id=' + id }) 21 | } 22 | 23 | export const testWorkflow = async (data) => { 24 | return await request.post({ url: '/ai/workflow/test', data }) 25 | } 26 | -------------------------------------------------------------------------------- /src/api/bpm/definition/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | export const getProcessDefinition = async (id?: string, key?: string) => { 4 | return await request.get({ 5 | url: '/bpm/process-definition/get', 6 | params: { id, key } 7 | }) 8 | } 9 | 10 | export const getProcessDefinitionPage = async (params) => { 11 | return await request.get({ 12 | url: '/bpm/process-definition/page', 13 | params 14 | }) 15 | } 16 | 17 | export const getProcessDefinitionList = async (params) => { 18 | return await request.get({ 19 | url: '/bpm/process-definition/list', 20 | params 21 | }) 22 | } 23 | 24 | export const getSimpleProcessDefinitionList = async () => { 25 | return await request.get({ 26 | url: '/bpm/process-definition/simple-list' 27 | }) 28 | } 29 | -------------------------------------------------------------------------------- /src/api/bpm/leave/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | export type LeaveVO = { 4 | id: number 5 | status: number 6 | type: number 7 | reason: string 8 | processInstanceId: string 9 | startTime: string 10 | endTime: string 11 | createTime: string 12 | } 13 | 14 | // 创建请假申请 15 | export const createLeave = async (data: LeaveVO) => { 16 | return await request.post({ url: '/bpm/oa/leave/create', data: data }) 17 | } 18 | 19 | // 获得请假申请 20 | export const getLeave = async (id: number) => { 21 | return await request.get({ url: '/bpm/oa/leave/get?id=' + id }) 22 | } 23 | 24 | // 获得请假申请分页 25 | export const getLeavePage = async (params: PageParam) => { 26 | return await request.get({ url: '/bpm/oa/leave/page', params }) 27 | } 28 | -------------------------------------------------------------------------------- /src/api/bpm/simple/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | 4 | export const updateBpmSimpleModel = async (data) => { 5 | return await request.post({ 6 | url: '/bpm/model/simple/update', 7 | data: data 8 | }) 9 | } 10 | 11 | export const getBpmSimpleModel = async (id) => { 12 | return await request.get({ 13 | url: '/bpm/model/simple/get?id=' + id 14 | }) 15 | } 16 | -------------------------------------------------------------------------------- /src/api/crm/contract/config/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | export interface ContractConfigVO { 4 | notifyEnabled?: boolean 5 | notifyDays?: number 6 | } 7 | 8 | // 获取合同配置 9 | export const getContractConfig = async () => { 10 | return await request.get({ url: `/crm/contract-config/get` }) 11 | } 12 | 13 | // 更新合同配置 14 | export const saveContractConfig = async (data: ContractConfigVO) => { 15 | return await request.put({ url: `/crm/contract-config/save`, data }) 16 | } 17 | -------------------------------------------------------------------------------- /src/api/crm/customer/poolConfig/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | export interface CustomerPoolConfigVO { 4 | enabled?: boolean 5 | contactExpireDays?: number 6 | dealExpireDays?: number 7 | notifyEnabled?: boolean 8 | notifyDays?: number 9 | } 10 | 11 | // 获取客户公海规则设置 12 | export const getCustomerPoolConfig = async () => { 13 | return await request.get({ url: `/crm/customer-pool-config/get` }) 14 | } 15 | 16 | // 更新客户公海规则设置 17 | export const saveCustomerPoolConfig = async (data: CustomerPoolConfigVO) => { 18 | return await request.put({ url: `/crm/customer-pool-config/save`, data }) 19 | } 20 | -------------------------------------------------------------------------------- /src/api/crm/operateLog/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | export interface OperateLogVO extends PageParam { 4 | bizType: number 5 | bizId: number 6 | } 7 | 8 | // 获得操作日志 9 | export const getOperateLogPage = async (params: OperateLogVO) => { 10 | return await request.get({ url: `/crm/operate-log/page`, params }) 11 | } 12 | -------------------------------------------------------------------------------- /src/api/crm/statistics/performance.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | export interface StatisticsPerformanceRespVO { 4 | time: string 5 | currentMonthCount: number 6 | lastMonthCount: number 7 | lastYearCount: number 8 | } 9 | 10 | // 排行 API 11 | export const StatisticsPerformanceApi = { 12 | // 员工获得合同金额统计 13 | getContractPricePerformance: (params: any) => { 14 | return request.get({ 15 | url: '/crm/statistics-performance/get-contract-price-performance', 16 | params 17 | }) 18 | }, 19 | // 员工获得回款统计 20 | getReceivablePricePerformance: (params: any) => { 21 | return request.get({ 22 | url: '/crm/statistics-performance/get-receivable-price-performance', 23 | params 24 | }) 25 | }, 26 | //员工获得签约合同数量统计 27 | getContractCountPerformance: (params: any) => { 28 | return request.get({ 29 | url: '/crm/statistics-performance/get-contract-count-performance', 30 | params 31 | }) 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/api/erp/statistics/purchase/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | // ERP 采购全局统计 VO 4 | export interface ErpPurchaseSummaryRespVO { 5 | todayPrice: number // 今日采购金额 6 | yesterdayPrice: number // 昨日采购金额 7 | monthPrice: number // 本月采购金额 8 | yearPrice: number // 今年采购金额 9 | } 10 | 11 | // ERP 采购时间段统计 VO 12 | export interface ErpPurchaseTimeSummaryRespVO { 13 | time: string // 时间 14 | price: number // 采购金额 15 | } 16 | 17 | // ERP 采购统计 API 18 | export const PurchaseStatisticsApi = { 19 | // 获得采购统计 20 | getPurchaseSummary: async (): Promise => { 21 | return await request.get({ url: `/erp/purchase-statistics/summary` }) 22 | }, 23 | 24 | // 获得采购时间段统计 25 | getPurchaseTimeSummary: async (): Promise => { 26 | return await request.get({ url: `/erp/purchase-statistics/time-summary` }) 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/api/erp/statistics/sale/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | // ERP 销售全局统计 VO 4 | export interface ErpSaleSummaryRespVO { 5 | todayPrice: number // 今日销售金额 6 | yesterdayPrice: number // 昨日销售金额 7 | monthPrice: number // 本月销售金额 8 | yearPrice: number // 今年销售金额 9 | } 10 | 11 | // ERP 销售时间段统计 VO 12 | export interface ErpSaleTimeSummaryRespVO { 13 | time: string // 时间 14 | price: number // 销售金额 15 | } 16 | 17 | // ERP 销售统计 API 18 | export const SaleStatisticsApi = { 19 | // 获得销售统计 20 | getSaleSummary: async (): Promise => { 21 | return await request.get({ url: `/erp/sale-statistics/summary` }) 22 | }, 23 | 24 | // 获得销售时间段统计 25 | getSaleTimeSummary: async (): Promise => { 26 | return await request.get({ url: `/erp/sale-statistics/time-summary` }) 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/api/erp/stock/record/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | // ERP 产品库存明细 VO 4 | export interface StockRecordVO { 5 | id: number // 编号 6 | productId: number // 产品编号 7 | warehouseId: number // 仓库编号 8 | count: number // 出入库数量 9 | totalCount: number // 总库存量 10 | bizType: number // 业务类型 11 | bizId: number // 业务编号 12 | bizItemId: number // 业务项编号 13 | bizNo: string // 业务单号 14 | } 15 | 16 | // ERP 产品库存明细 API 17 | export const StockRecordApi = { 18 | // 查询产品库存明细分页 19 | getStockRecordPage: async (params: any) => { 20 | return await request.get({ url: `/erp/stock-record/page`, params }) 21 | }, 22 | 23 | // 查询产品库存明细详情 24 | getStockRecord: async (id: number) => { 25 | return await request.get({ url: `/erp/stock-record/get?id=` + id }) 26 | }, 27 | 28 | // 导出产品库存明细 Excel 29 | exportStockRecord: async (params) => { 30 | return await request.download({ url: `/erp/stock-record/export-excel`, params }) 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/api/infra/apiAccessLog/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | export interface ApiAccessLogVO { 4 | id: number 5 | traceId: string 6 | userId: number 7 | userType: number 8 | applicationName: string 9 | requestMethod: string 10 | requestParams: string 11 | responseBody: string 12 | requestUrl: string 13 | userIp: string 14 | userAgent: string 15 | operateModule: string 16 | operateName: string 17 | operateType: number 18 | beginTime: Date 19 | endTime: Date 20 | duration: number 21 | resultCode: number 22 | resultMsg: string 23 | createTime: Date 24 | } 25 | 26 | // 查询列表API 访问日志 27 | export const getApiAccessLogPage = (params: PageParam) => { 28 | return request.get({ url: '/infra/api-access-log/page', params }) 29 | } 30 | 31 | // 导出API 访问日志 32 | export const exportApiAccessLog = (params) => { 33 | return request.download({ url: '/infra/api-access-log/export-excel', params }) 34 | } 35 | -------------------------------------------------------------------------------- /src/api/infra/jobLog/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | export interface JobLogVO { 4 | id: number 5 | jobId: number 6 | handlerName: string 7 | handlerParam: string 8 | cronExpression: string 9 | executeIndex: string 10 | beginTime: Date 11 | endTime: Date 12 | duration: string 13 | status: number 14 | createTime: string 15 | result: string 16 | } 17 | 18 | // 任务日志列表 19 | export const getJobLogPage = (params: PageParam) => { 20 | return request.get({ url: '/infra/job-log/page', params }) 21 | } 22 | 23 | // 任务日志详情 24 | export const getJobLog = (id: number) => { 25 | return request.get({ url: '/infra/job-log/get?id=' + id }) 26 | } 27 | 28 | // 导出定时任务日志 29 | export const exportJobLog = (params) => { 30 | return request.download({ 31 | url: '/infra/job-log/export-excel', 32 | params 33 | }) 34 | } 35 | -------------------------------------------------------------------------------- /src/api/infra/redis/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | /** 4 | * 获取redis 监控信息 5 | */ 6 | export const getCache = () => { 7 | return request.get({ url: '/infra/redis/get-monitor-info' }) 8 | } 9 | -------------------------------------------------------------------------------- /src/api/login/types.ts: -------------------------------------------------------------------------------- 1 | export type UserLoginVO = { 2 | username: string 3 | password: string 4 | captchaVerification: string 5 | socialType?: string 6 | socialCode?: string 7 | socialState?: string 8 | } 9 | 10 | export type TokenType = { 11 | id: number // 编号 12 | accessToken: string // 访问令牌 13 | refreshToken: string // 刷新令牌 14 | userId: number // 用户编号 15 | userType: number //用户类型 16 | clientId: string //客户端编号 17 | expiresTime: number //过期时间 18 | } 19 | 20 | export type UserVO = { 21 | id: number 22 | username: string 23 | nickname: string 24 | deptId: number 25 | email: string 26 | mobile: string 27 | sex: number 28 | avatar: string 29 | loginIp: string 30 | loginDate: string 31 | } 32 | 33 | export type RegisterVO = { 34 | tenantName: string 35 | username: string 36 | password: string 37 | captchaVerification: string 38 | } 39 | -------------------------------------------------------------------------------- /src/api/mall/product/favorite.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | export interface Favorite { 4 | id?: number 5 | userId?: string // 用户编号 6 | spuId?: number | null // 商品 SPU 编号 7 | } 8 | 9 | // 获得 ProductFavorite 列表 10 | export const getFavoritePage = (params: PageParam) => { 11 | return request.get({ url: '/product/favorite/page', params }) 12 | } 13 | -------------------------------------------------------------------------------- /src/api/mall/product/history.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | /** 4 | * 获得商品浏览记录分页 5 | * 6 | * @param params 请求参数 7 | */ 8 | export const getBrowseHistoryPage = (params: any) => { 9 | return request.get({ url: '/product/browse-history/page', params }) 10 | } 11 | -------------------------------------------------------------------------------- /src/api/mall/promotion/bargain/bargainHelp.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | export interface BargainHelpVO { 4 | id: number 5 | record: number 6 | userId: number 7 | reducePrice: number 8 | endTime: Date 9 | } 10 | 11 | // 查询砍价记录列表 12 | export const getBargainHelpPage = async (params) => { 13 | return await request.get({ url: `/promotion/bargain-help/page`, params }) 14 | } 15 | -------------------------------------------------------------------------------- /src/api/mall/promotion/bargain/bargainRecord.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | export interface BargainRecordVO { 4 | id: number 5 | activityId: number 6 | userId: number 7 | spuId: number 8 | skuId: number 9 | bargainFirstPrice: number 10 | bargainPrice: number 11 | status: number 12 | orderId: number 13 | endTime: Date 14 | } 15 | 16 | // 查询砍价记录列表 17 | export const getBargainRecordPage = async (params) => { 18 | return await request.get({ url: `/promotion/bargain-record/page`, params }) 19 | } 20 | -------------------------------------------------------------------------------- /src/api/mall/promotion/combination/combinationRecord.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | export interface CombinationRecordVO { 4 | id: number // 拼团记录编号 5 | activityId: number // 拼团活动编号 6 | nickname: string // 用户昵称 7 | avatar: string // 用户头像 8 | headId: number // 团长编号 9 | expireTime: string // 过期时间 10 | userSize: number // 可参团人数 11 | userCount: number // 已参团人数 12 | status: number // 拼团状态 13 | spuName: string // 商品名字 14 | picUrl: string // 商品图片 15 | virtualGroup: boolean // 是否虚拟成团 16 | startTime: string // 开始时间 (订单付款后开始的时间) 17 | endTime: string // 结束时间(成团时间/失败时间) 18 | } 19 | 20 | // 查询拼团记录列表 21 | export const getCombinationRecordPage = async (params: any) => { 22 | return await request.get({ url: '/promotion/combination-record/page', params }) 23 | } 24 | 25 | // 获得拼团记录的概要信息 26 | export const getCombinationRecordSummary = async () => { 27 | return await request.get({ url: '/promotion/combination-record/get-summary' }) 28 | } 29 | -------------------------------------------------------------------------------- /src/api/mall/promotion/coupon/coupon.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | // TODO @dhb52:vo 缺少 4 | 5 | // 删除优惠劵 6 | export const deleteCoupon = async (id: number) => { 7 | return request.delete({ 8 | url: `/promotion/coupon/delete?id=${id}` 9 | }) 10 | } 11 | 12 | // 获得优惠劵分页 13 | export const getCouponPage = async (params: PageParam) => { 14 | return request.get({ 15 | url: '/promotion/coupon/page', 16 | params: params 17 | }) 18 | } 19 | 20 | // 发送优惠券 21 | export const sendCoupon = async (data: any) => { 22 | return request.post({ 23 | url: '/promotion/coupon/send', 24 | data: data 25 | }) 26 | } 27 | -------------------------------------------------------------------------------- /src/api/mall/statistics/common.ts: -------------------------------------------------------------------------------- 1 | /** 数据对照 Response VO */ 2 | export interface DataComparisonRespVO { 3 | value: T 4 | reference: T 5 | } 6 | -------------------------------------------------------------------------------- /src/api/mall/statistics/pay.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | /** 支付统计 */ 4 | export interface PaySummaryRespVO { 5 | /** 充值金额,单位分 */ 6 | rechargePrice: number 7 | } 8 | 9 | /** 获取钱包充值金额 */ 10 | export const getWalletRechargePrice = async () => { 11 | return await request.get({ url: `/statistics/pay/summary` }) 12 | } 13 | -------------------------------------------------------------------------------- /src/api/mall/trade/brokerage/record/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | // 查询佣金记录列表 4 | export const getBrokerageRecordPage = async (params: any) => { 5 | return await request.get({ url: `/trade/brokerage-record/page`, params }) 6 | } 7 | 8 | // 查询佣金记录详情 9 | export const getBrokerageRecord = async (id: number) => { 10 | return await request.get({ url: `/trade/brokerage-record/get?id=` + id }) 11 | } 12 | -------------------------------------------------------------------------------- /src/api/mall/trade/config/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | export interface ConfigVO { 4 | brokerageEnabled: boolean 5 | brokerageEnabledCondition: number 6 | brokerageBindMode: number 7 | brokeragePosterUrls: string 8 | brokerageFirstPercent: number 9 | brokerageSecondPercent: number 10 | brokerageWithdrawMinPrice: number 11 | brokerageFrozenDays: number 12 | brokerageWithdrawTypes: string 13 | } 14 | 15 | // 查询交易中心配置详情 16 | export const getTradeConfig = async () => { 17 | return await request.get({ url: `/trade/config/get` }) 18 | } 19 | 20 | // 保存交易中心配置 21 | export const saveTradeConfig = async (data: ConfigVO) => { 22 | return await request.put({ url: `/trade/config/save`, data }) 23 | } 24 | -------------------------------------------------------------------------------- /src/api/member/address/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | export interface AddressVO { 4 | id: number 5 | name: string 6 | mobile: string 7 | areaId: number 8 | detailAddress: string 9 | defaultStatus: boolean 10 | } 11 | 12 | // 查询用户收件地址列表 13 | export const getAddressList = async (params) => { 14 | return await request.get({ url: `/member/address/list`, params }) 15 | } 16 | -------------------------------------------------------------------------------- /src/api/member/config/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | export interface ConfigVO { 4 | id: number 5 | pointTradeDeductEnable: number 6 | pointTradeDeductUnitPrice: number 7 | pointTradeDeductMaxPrice: number 8 | pointTradeGivePoint: number 9 | } 10 | 11 | // 查询积分设置详情 12 | export const getConfig = async () => { 13 | return await request.get({ url: `/member/config/get` }) 14 | } 15 | 16 | // 新增修改积分设置 17 | export const saveConfig = async (data: ConfigVO) => { 18 | return await request.put({ url: `/member/config/save`, data }) 19 | } 20 | -------------------------------------------------------------------------------- /src/api/member/experience-record/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | export interface ExperienceRecordVO { 4 | id: number 5 | userId: number 6 | bizId: string 7 | bizType: number 8 | title: string 9 | description: string 10 | experience: number 11 | totalExperience: number 12 | } 13 | 14 | // 查询会员经验记录列表 15 | export const getExperienceRecordPage = async (params) => { 16 | return await request.get({ url: `/member/experience-record/page`, params }) 17 | } 18 | 19 | // 查询会员经验记录详情 20 | export const getExperienceRecord = async (id: number) => { 21 | return await request.get({ url: `/member/experience-record/get?id=` + id }) 22 | } 23 | -------------------------------------------------------------------------------- /src/api/member/point/record/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | export interface RecordVO { 4 | id: number 5 | bizId: string 6 | bizType: string 7 | title: string 8 | description: string 9 | point: number 10 | totalPoint: number 11 | userId: number 12 | createDate: Date 13 | } 14 | 15 | // 查询用户积分记录列表 16 | export const getRecordPage = async (params) => { 17 | return await request.get({ url: `/member/point/record/page`, params }) 18 | } 19 | -------------------------------------------------------------------------------- /src/api/member/signin/record/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | export interface SignInRecordVO { 4 | id: number 5 | userId: number 6 | day: number 7 | point: number 8 | } 9 | 10 | // 查询用户签到积分列表 11 | export const getSignInRecordPage = async (params) => { 12 | return await request.get({ url: `/member/sign-in/record/page`, params }) 13 | } 14 | -------------------------------------------------------------------------------- /src/api/mp/autoReply/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | // 创建公众号的自动回复 4 | export const createAutoReply = (data) => { 5 | return request.post({ 6 | url: '/mp/auto-reply/create', 7 | data: data 8 | }) 9 | } 10 | 11 | // 更新公众号的自动回复 12 | export const updateAutoReply = (data) => { 13 | return request.put({ 14 | url: '/mp/auto-reply/update', 15 | data: data 16 | }) 17 | } 18 | 19 | // 删除公众号的自动回复 20 | export const deleteAutoReply = (id) => { 21 | return request.delete({ 22 | url: '/mp/auto-reply/delete?id=' + id 23 | }) 24 | } 25 | 26 | // 获得公众号的自动回复 27 | export const getAutoReply = (id) => { 28 | return request.get({ 29 | url: '/mp/auto-reply/get?id=' + id 30 | }) 31 | } 32 | 33 | // 获得公众号的自动回复分页 34 | export const getAutoReplyPage = (query) => { 35 | return request.get({ 36 | url: '/mp/auto-reply/page', 37 | params: query 38 | }) 39 | } 40 | -------------------------------------------------------------------------------- /src/api/mp/draft/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | // 获得公众号草稿分页 4 | export const getDraftPage = (query) => { 5 | return request.get({ 6 | url: '/mp/draft/page', 7 | params: query 8 | }) 9 | } 10 | 11 | // 创建公众号草稿 12 | export const createDraft = (accountId, articles) => { 13 | return request.post({ 14 | url: '/mp/draft/create?accountId=' + accountId, 15 | data: { 16 | articles 17 | } 18 | }) 19 | } 20 | 21 | // 更新公众号草稿 22 | export const updateDraft = (accountId, mediaId, articles) => { 23 | return request.put({ 24 | url: '/mp/draft/update?accountId=' + accountId + '&mediaId=' + mediaId, 25 | method: 'put', 26 | data: articles 27 | }) 28 | } 29 | 30 | // 删除公众号草稿 31 | export const deleteDraft = (accountId, mediaId) => { 32 | return request.delete({ 33 | url: '/mp/draft/delete?accountId=' + accountId + '&mediaId=' + mediaId 34 | }) 35 | } 36 | -------------------------------------------------------------------------------- /src/api/mp/freePublish/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | // 获得公众号素材分页 4 | export const getFreePublishPage = (query) => { 5 | return request.get({ 6 | url: '/mp/free-publish/page', 7 | params: query 8 | }) 9 | } 10 | 11 | // 删除公众号素材 12 | export const deleteFreePublish = (accountId, articleId) => { 13 | return request.delete({ 14 | url: '/mp/free-publish/delete?accountId=' + accountId + '&articleId=' + articleId 15 | }) 16 | } 17 | 18 | // 发布公众号素材 19 | export const submitFreePublish = (accountId, mediaId) => { 20 | return request.post({ 21 | url: '/mp/free-publish/submit?accountId=' + accountId + '&mediaId=' + mediaId 22 | }) 23 | } 24 | -------------------------------------------------------------------------------- /src/api/mp/material/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | // 获得公众号素材分页 4 | export const getMaterialPage = (query) => { 5 | return request.get({ 6 | url: '/mp/material/page', 7 | params: query 8 | }) 9 | } 10 | 11 | // 删除公众号永久素材 12 | export const deletePermanentMaterial = (id) => { 13 | return request.delete({ 14 | url: '/mp/material/delete-permanent?id=' + id 15 | }) 16 | } 17 | -------------------------------------------------------------------------------- /src/api/mp/menu/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | // 获得公众号菜单列表 4 | export const getMenuList = (accountId) => { 5 | return request.get({ 6 | url: '/mp/menu/list?accountId=' + accountId 7 | }) 8 | } 9 | 10 | // 保存公众号菜单 11 | export const saveMenu = (accountId, menus) => { 12 | return request.post({ 13 | url: '/mp/menu/save', 14 | data: { 15 | accountId, 16 | menus 17 | } 18 | }) 19 | } 20 | 21 | // 删除公众号菜单 22 | export const deleteMenu = (accountId) => { 23 | return request.delete({ 24 | url: '/mp/menu/delete?accountId=' + accountId 25 | }) 26 | } 27 | -------------------------------------------------------------------------------- /src/api/mp/message/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | // 获得公众号消息分页 4 | export const getMessagePage = (query: PageParam) => { 5 | return request.get({ 6 | url: '/mp/message/page', 7 | params: query 8 | }) 9 | } 10 | 11 | // 给粉丝发送消息 12 | export const sendMessage = (data) => { 13 | return request.post({ 14 | url: '/mp/message/send', 15 | data: data 16 | }) 17 | } 18 | -------------------------------------------------------------------------------- /src/api/mp/statistics/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | // 获取消息发送概况数据 4 | export const getUpstreamMessage = (query) => { 5 | return request.get({ 6 | url: '/mp/statistics/upstream-message', 7 | params: query 8 | }) 9 | } 10 | 11 | // 用户增减数据 12 | export const getUserSummary = (query) => { 13 | return request.get({ 14 | url: '/mp/statistics/user-summary', 15 | params: query 16 | }) 17 | } 18 | 19 | // 获得用户累计数据 20 | export const getUserCumulate = (query) => { 21 | return request.get({ 22 | url: '/mp/statistics/user-cumulate', 23 | params: query 24 | }) 25 | } 26 | 27 | // 获得接口分析数据 28 | export const getInterfaceSummary = (query) => { 29 | return request.get({ 30 | url: '/mp/statistics/interface-summary', 31 | params: query 32 | }) 33 | } 34 | -------------------------------------------------------------------------------- /src/api/mp/user/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | // 更新公众号粉丝 4 | export const updateUser = (data) => { 5 | return request.put({ 6 | url: '/mp/user/update', 7 | data: data 8 | }) 9 | } 10 | 11 | // 获得公众号粉丝 12 | export const getUser = (id) => { 13 | return request.get({ 14 | url: '/mp/user/get?id=' + id 15 | }) 16 | } 17 | 18 | // 获得公众号粉丝分页 19 | export const getUserPage = (query) => { 20 | return request.get({ 21 | url: '/mp/user/page', 22 | params: query 23 | }) 24 | } 25 | 26 | // 同步公众号粉丝 27 | export const syncUser = (accountId) => { 28 | return request.post({ 29 | url: '/mp/user/sync?accountId=' + accountId 30 | }) 31 | } 32 | -------------------------------------------------------------------------------- /src/api/pay/demo/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | export interface DemoOrderVO { 4 | spuId: number 5 | createTime: Date 6 | } 7 | 8 | // 创建示例订单 9 | export function createDemoOrder(data: DemoOrderVO) { 10 | return request.post({ 11 | url: '/pay/demo-order/create', 12 | data: data 13 | }) 14 | } 15 | 16 | // 获得示例订单 17 | export function getDemoOrder(id: number) { 18 | return request.get({ 19 | url: '/pay/demo-order/get?id=' + id 20 | }) 21 | } 22 | 23 | // 获得示例订单分页 24 | export function getDemoOrderPage(query: PageParam) { 25 | return request.get({ 26 | url: '/pay/demo-order/page', 27 | params: query 28 | }) 29 | } 30 | 31 | // 退款示例订单 32 | export function refundDemoOrder(id) { 33 | return request.put({ 34 | url: '/pay/demo-order/refund?id=' + id 35 | }) 36 | } 37 | -------------------------------------------------------------------------------- /src/api/pay/demo/transfer/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | export interface DemoTransferVO { 4 | price: number 5 | type: number 6 | userName: string 7 | alipayLogonId: string 8 | openid: string 9 | } 10 | 11 | // 创建示例转账单 12 | export function createDemoTransfer(data: DemoTransferVO) { 13 | return request.post({ 14 | url: '/pay/demo-transfer/create', 15 | data: data 16 | }) 17 | } 18 | 19 | // 获得示例订单分页 20 | export function getDemoTransferPage(query: PageParam) { 21 | return request.get({ 22 | url: '/pay/demo-transfer/page', 23 | params: query 24 | }) 25 | } 26 | -------------------------------------------------------------------------------- /src/api/pay/notify/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | // 获得支付通知明细 4 | export const getNotifyTaskDetail = (id) => { 5 | return request.get({ 6 | url: '/pay/notify/get-detail?id=' + id 7 | }) 8 | } 9 | 10 | // 获得支付通知分页 11 | export const getNotifyTaskPage = (query) => { 12 | return request.get({ 13 | url: '/pay/notify/page', 14 | params: query 15 | }) 16 | } 17 | -------------------------------------------------------------------------------- /src/api/pay/transfer/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | export interface TransferVO { 4 | appId: number 5 | channelCode: string 6 | merchantTransferId: string 7 | type: number 8 | price: number 9 | subject: string 10 | userName: string 11 | alipayLogonId: string 12 | openid: string 13 | } 14 | 15 | // 新增转账单 16 | export const createTransfer = async (data: TransferVO) => { 17 | return await request.post({ url: `/pay/transfer/create`, data }) 18 | } 19 | 20 | // 查询转账单列表 21 | export const getTransferPage = async (params) => { 22 | return await request.get({ url: `/pay/transfer/page`, params }) 23 | } 24 | 25 | export const getTransfer = async (id: number) => { 26 | return await request.get({ url: '/pay/transfer/get?id=' + id }) 27 | } 28 | -------------------------------------------------------------------------------- /src/api/pay/wallet/balance/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | /** 用户钱包查询参数 */ 4 | export interface PayWalletUserReqVO { 5 | userId: number 6 | } 7 | 8 | /** 钱包 VO */ 9 | export interface WalletVO { 10 | id: number 11 | userId: number 12 | userType: number 13 | balance: number 14 | totalExpense: number 15 | totalRecharge: number 16 | freezePrice: number 17 | } 18 | 19 | /** 查询用户钱包详情 */ 20 | export const getWallet = async (params: PayWalletUserReqVO) => { 21 | return await request.get({ url: `/pay/wallet/get`, params }) 22 | } 23 | 24 | /** 查询会员钱包列表 */ 25 | export const getWalletPage = async (params: any) => { 26 | return await request.get({ url: `/pay/wallet/page`, params }) 27 | } 28 | 29 | /** 修改会员钱包余额 */ 30 | export const updateWalletBalance = async (data: any) => { 31 | return await request.put({ url: `/pay/wallet/update-balance`, data }) 32 | } 33 | -------------------------------------------------------------------------------- /src/api/pay/wallet/transaction/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | export interface WalletTransactionVO { 4 | id: number 5 | walletId: number 6 | title: string 7 | price: number 8 | balance: number 9 | } 10 | 11 | // 查询会员钱包流水列表 12 | export const getWalletTransactionPage = async (params) => { 13 | return await request.get({ url: `/pay/wallet-transaction/page`, params }) 14 | } 15 | -------------------------------------------------------------------------------- /src/api/system/area/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | // 获得地区树 4 | export const getAreaTree = async () => { 5 | return await request.get({ url: '/system/area/tree' }) 6 | } 7 | 8 | // 获得 IP 对应的地区名 9 | export const getAreaByIp = async (ip: string) => { 10 | return await request.get({ url: '/system/area/get-by-ip?ip=' + ip }) 11 | } 12 | -------------------------------------------------------------------------------- /src/api/system/loginLog/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | export interface LoginLogVO { 4 | id: number 5 | logType: number 6 | traceId: number 7 | userId: number 8 | userType: number 9 | username: string 10 | result: number 11 | status: number 12 | userIp: string 13 | userAgent: string 14 | createTime: Date 15 | } 16 | 17 | // 查询登录日志列表 18 | export const getLoginLogPage = (params: PageParam) => { 19 | return request.get({ url: '/system/login-log/page', params }) 20 | } 21 | 22 | // 导出登录日志 23 | export const exportLoginLog = (params) => { 24 | return request.download({ url: '/system/login-log/export', params }) 25 | } 26 | -------------------------------------------------------------------------------- /src/api/system/mail/log/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | export interface MailLogVO { 4 | id: number 5 | userId: number 6 | userType: number 7 | toMail: string 8 | accountId: number 9 | fromMail: string 10 | templateId: number 11 | templateCode: string 12 | templateNickname: string 13 | templateTitle: string 14 | templateContent: string 15 | templateParams: string 16 | sendStatus: number 17 | sendTime: Date 18 | sendMessageId: string 19 | sendException: string 20 | } 21 | 22 | // 查询邮件日志列表 23 | export const getMailLogPage = async (params: PageParam) => { 24 | return await request.get({ url: '/system/mail-log/page', params }) 25 | } 26 | 27 | // 查询邮件日志详情 28 | export const getMailLog = async (id: number) => { 29 | return await request.get({ url: '/system/mail-log/get?id=' + id }) 30 | } 31 | -------------------------------------------------------------------------------- /src/api/system/oauth2/token.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | export interface OAuth2TokenVO { 4 | id: number 5 | accessToken: string 6 | refreshToken: string 7 | userId: number 8 | userType: number 9 | clientId: string 10 | createTime: Date 11 | expiresTime: Date 12 | } 13 | 14 | // 查询 token列表 15 | export const getAccessTokenPage = (params: PageParam) => { 16 | return request.get({ url: '/system/oauth2-token/page', params }) 17 | } 18 | 19 | // 删除 token 20 | export const deleteAccessToken = (accessToken: string) => { 21 | return request.delete({ url: '/system/oauth2-token/delete?accessToken=' + accessToken }) 22 | } 23 | -------------------------------------------------------------------------------- /src/api/system/operatelog/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | export type OperateLogVO = { 4 | id: number 5 | traceId: string 6 | userType: number 7 | userId: number 8 | userName: string 9 | type: string 10 | subType: string 11 | bizId: number 12 | action: string 13 | extra: string 14 | requestMethod: string 15 | requestUrl: string 16 | userIp: string 17 | userAgent: string 18 | creator: string 19 | creatorName: string 20 | createTime: Date 21 | } 22 | 23 | // 查询操作日志列表 24 | export const getOperateLogPage = (params: PageParam) => { 25 | return request.get({ url: '/system/operate-log/page', params }) 26 | } 27 | // 导出操作日志 28 | export const exportOperateLog = (params: any) => { 29 | return request.download({ url: '/system/operate-log/export', params }) 30 | } 31 | -------------------------------------------------------------------------------- /src/api/system/social/user/index.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | export interface SocialUserVO { 4 | id: number 5 | type: number 6 | openid: string 7 | token: string 8 | rawTokenInfo: string 9 | nickname: string 10 | avatar: string 11 | rawUserInfo: string 12 | code: string 13 | state: string 14 | } 15 | 16 | // 查询社交用户列表 17 | export const getSocialUserPage = async (params) => { 18 | return await request.get({ url: `/system/social-user/page`, params }) 19 | } 20 | 21 | // 查询社交用户详情 22 | export const getSocialUser = async (id: number) => { 23 | return await request.get({ url: `/system/social-user/get?id=` + id }) 24 | } 25 | -------------------------------------------------------------------------------- /src/api/system/user/socialUser.ts: -------------------------------------------------------------------------------- 1 | import request from '@/config/axios' 2 | 3 | // 社交绑定,使用 code 授权码 4 | export const socialBind = (type, code, state) => { 5 | return request.post({ 6 | url: '/system/social-user/bind', 7 | data: { 8 | type, 9 | code, 10 | state 11 | } 12 | }) 13 | } 14 | 15 | // 取消社交绑定 16 | export const socialUnbind = (type, openid) => { 17 | return request.delete({ 18 | url: '/system/social-user/unbind', 19 | data: { 20 | type, 21 | openid 22 | } 23 | }) 24 | } 25 | 26 | // 社交授权的跳转 27 | export const socialAuthRedirect = (type, redirectUri) => { 28 | return request.get({ 29 | url: '/system/auth/social-auth-redirect?type=' + type + '&redirectUri=' + redirectUri 30 | }) 31 | } 32 | -------------------------------------------------------------------------------- /src/assets/ai/dall2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/src/assets/ai/dall2.jpg -------------------------------------------------------------------------------- /src/assets/ai/dall3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/src/assets/ai/dall3.jpg -------------------------------------------------------------------------------- /src/assets/ai/qingxi.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/src/assets/ai/qingxi.jpg -------------------------------------------------------------------------------- /src/assets/ai/ziran.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/src/assets/ai/ziran.jpg -------------------------------------------------------------------------------- /src/assets/audio/response.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/src/assets/audio/response.mp3 -------------------------------------------------------------------------------- /src/assets/imgs/avatar.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/src/assets/imgs/avatar.gif -------------------------------------------------------------------------------- /src/assets/imgs/avatar.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/src/assets/imgs/avatar.jpg -------------------------------------------------------------------------------- /src/assets/imgs/diy/app-nav-bar-mp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/src/assets/imgs/diy/app-nav-bar-mp.png -------------------------------------------------------------------------------- /src/assets/imgs/diy/statusBar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/src/assets/imgs/diy/statusBar.png -------------------------------------------------------------------------------- /src/assets/imgs/iot/device.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/src/assets/imgs/iot/device.png -------------------------------------------------------------------------------- /src/assets/imgs/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/src/assets/imgs/logo.png -------------------------------------------------------------------------------- /src/assets/imgs/profile.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/src/assets/imgs/profile.jpg -------------------------------------------------------------------------------- /src/assets/imgs/wechat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/src/assets/imgs/wechat.png -------------------------------------------------------------------------------- /src/assets/svgs/bpm/add-user.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/svgs/bpm/child-process.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/svgs/bpm/condition.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/svgs/bpm/copy.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/svgs/bpm/delay.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/svgs/bpm/simple-process-bg.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/svgs/bpm/starter.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/svgs/bpm/transactor.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/svgs/iot/card-fill.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/svgs/message.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/svgs/money.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/svgs/pay/icon/alipay_pc.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/svgs/peoples.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/components/Backtop/index.ts: -------------------------------------------------------------------------------- 1 | import Backtop from './src/Backtop.vue' 2 | 3 | export { Backtop } 4 | -------------------------------------------------------------------------------- /src/components/Backtop/src/Backtop.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 18 | -------------------------------------------------------------------------------- /src/components/Card/index.ts: -------------------------------------------------------------------------------- 1 | import CardTitle from './src/CardTitle.vue' 2 | 3 | export { CardTitle } 4 | -------------------------------------------------------------------------------- /src/components/Card/src/CardTitle.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 17 | 18 | 38 | -------------------------------------------------------------------------------- /src/components/ColorInput/index.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 29 | 30 | 35 | -------------------------------------------------------------------------------- /src/components/ConfigGlobal/index.ts: -------------------------------------------------------------------------------- 1 | import ConfigGlobal from './src/ConfigGlobal.vue' 2 | 3 | export { ConfigGlobal } 4 | -------------------------------------------------------------------------------- /src/components/ContentDetailWrap/index.ts: -------------------------------------------------------------------------------- 1 | import ContentDetailWrap from './src/ContentDetailWrap.vue' 2 | 3 | export { ContentDetailWrap } 4 | -------------------------------------------------------------------------------- /src/components/ContentWrap/index.ts: -------------------------------------------------------------------------------- 1 | import ContentWrap from './src/ContentWrap.vue' 2 | 3 | export { ContentWrap } 4 | -------------------------------------------------------------------------------- /src/components/CountTo/index.ts: -------------------------------------------------------------------------------- 1 | import CountTo from './src/CountTo.vue' 2 | 3 | export { CountTo } 4 | -------------------------------------------------------------------------------- /src/components/Crontab/index.ts: -------------------------------------------------------------------------------- 1 | import Crontab from './src/Crontab.vue' 2 | export { Crontab } 3 | -------------------------------------------------------------------------------- /src/components/Cropper/index.ts: -------------------------------------------------------------------------------- 1 | import CropperImage from './src/Cropper.vue' 2 | import CropperAvatar from './src/CropperAvatar.vue' 3 | 4 | export { CropperImage, CropperAvatar } 5 | -------------------------------------------------------------------------------- /src/components/Cropper/src/types.ts: -------------------------------------------------------------------------------- 1 | import type Cropper from 'cropperjs' 2 | 3 | export interface CropendResult { 4 | imgBase64: string 5 | imgInfo: Cropper.Data 6 | } 7 | 8 | export type { Cropper } 9 | -------------------------------------------------------------------------------- /src/components/Descriptions/index.ts: -------------------------------------------------------------------------------- 1 | import Descriptions from './src/Descriptions.vue' 2 | import DescriptionsItemLabel from './src/DescriptionsItemLabel.vue' 3 | 4 | export { Descriptions, DescriptionsItemLabel } 5 | -------------------------------------------------------------------------------- /src/components/Descriptions/src/DescriptionsItemLabel.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 20 | 21 | 30 | -------------------------------------------------------------------------------- /src/components/Dialog/index.ts: -------------------------------------------------------------------------------- 1 | import Dialog from './src/Dialog.vue' 2 | 3 | export { Dialog } 4 | -------------------------------------------------------------------------------- /src/components/DictTag/index.ts: -------------------------------------------------------------------------------- 1 | import DictTag from './src/DictTag.vue' 2 | 3 | export { DictTag } 4 | -------------------------------------------------------------------------------- /src/components/DiyEditor/components/mobile/Divider/config.ts: -------------------------------------------------------------------------------- 1 | import { DiyComponent } from '@/components/DiyEditor/util' 2 | 3 | /** 分割线属性 */ 4 | export interface DividerProperty { 5 | // 高度 6 | height: number 7 | // 线宽 8 | lineWidth: number 9 | // 边距类型 10 | paddingType: 'none' | 'horizontal' 11 | // 颜色 12 | lineColor: string 13 | // 类型 14 | borderType: 'solid' | 'dashed' | 'dotted' | 'none' 15 | } 16 | 17 | // 定义组件 18 | export const component = { 19 | id: 'Divider', 20 | name: '分割线', 21 | icon: 'tdesign:component-divider-vertical', 22 | property: { 23 | height: 30, 24 | lineWidth: 1, 25 | paddingType: 'none', 26 | lineColor: '#dcdfe6', 27 | borderType: 'solid' 28 | } 29 | } as DiyComponent 30 | -------------------------------------------------------------------------------- /src/components/DiyEditor/components/mobile/Divider/index.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /src/components/DiyEditor/components/mobile/FloatingActionButton/config.ts: -------------------------------------------------------------------------------- 1 | import { DiyComponent } from '@/components/DiyEditor/util' 2 | 3 | // 悬浮按钮属性 4 | export interface FloatingActionButtonProperty { 5 | // 展开方向 6 | direction: 'horizontal' | 'vertical' 7 | // 是否显示文字 8 | showText: boolean 9 | // 按钮列表 10 | list: FloatingActionButtonItemProperty[] 11 | } 12 | 13 | // 悬浮按钮项属性 14 | export interface FloatingActionButtonItemProperty { 15 | // 图片地址 16 | imgUrl: string 17 | // 跳转连接 18 | url: string 19 | // 文字 20 | text: string 21 | // 文字颜色 22 | textColor: string 23 | } 24 | 25 | // 定义组件 26 | export const component = { 27 | id: 'FloatingActionButton', 28 | name: '悬浮按钮', 29 | icon: 'tabler:float-right', 30 | position: 'fixed', 31 | property: { 32 | direction: 'vertical', 33 | showText: true, 34 | list: [{ textColor: '#fff' }] 35 | } 36 | } as DiyComponent 37 | -------------------------------------------------------------------------------- /src/components/DiyEditor/components/mobile/HotZone/config.ts: -------------------------------------------------------------------------------- 1 | import { ComponentStyle, DiyComponent } from '@/components/DiyEditor/util' 2 | 3 | /** 热区属性 */ 4 | export interface HotZoneProperty { 5 | // 图片地址 6 | imgUrl: string 7 | // 导航菜单列表 8 | list: HotZoneItemProperty[] 9 | // 组件样式 10 | style: ComponentStyle 11 | } 12 | 13 | /** 热区项目属性 */ 14 | export interface HotZoneItemProperty { 15 | // 链接的名称 16 | name: string 17 | // 链接 18 | url: string 19 | // 宽 20 | width: number 21 | // 高 22 | height: number 23 | // 上 24 | top: number 25 | // 左 26 | left: number 27 | } 28 | 29 | // 定义组件 30 | export const component = { 31 | id: 'HotZone', 32 | name: '热区', 33 | icon: 'tabler:hand-click', 34 | property: { 35 | imgUrl: '', 36 | list: [] as HotZoneItemProperty[], 37 | style: { 38 | bgType: 'color', 39 | bgColor: '#fff', 40 | marginBottom: 8 41 | } as ComponentStyle 42 | } 43 | } as DiyComponent 44 | -------------------------------------------------------------------------------- /src/components/DiyEditor/components/mobile/ImageBar/config.ts: -------------------------------------------------------------------------------- 1 | import { ComponentStyle, DiyComponent } from '@/components/DiyEditor/util' 2 | 3 | /** 图片展示属性 */ 4 | export interface ImageBarProperty { 5 | // 图片链接 6 | imgUrl: string 7 | // 跳转链接 8 | url: string 9 | // 组件样式 10 | style: ComponentStyle 11 | } 12 | 13 | // 定义组件 14 | export const component = { 15 | id: 'ImageBar', 16 | name: '图片展示', 17 | icon: 'ep:picture', 18 | property: { 19 | imgUrl: '', 20 | url: '', 21 | style: { 22 | bgType: 'color', 23 | bgColor: '#fff', 24 | marginBottom: 8 25 | } as ComponentStyle 26 | } 27 | } as DiyComponent 28 | -------------------------------------------------------------------------------- /src/components/DiyEditor/components/mobile/ImageBar/index.vue: -------------------------------------------------------------------------------- 1 | 8 | 16 | 17 | 25 | -------------------------------------------------------------------------------- /src/components/DiyEditor/components/mobile/NoticeBar/index.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /src/components/DiyEditor/components/mobile/PageConfig/config.ts: -------------------------------------------------------------------------------- 1 | import { DiyComponent } from '@/components/DiyEditor/util' 2 | 3 | /** 页面设置属性 */ 4 | export interface PageConfigProperty { 5 | // 页面描述 6 | description: string 7 | // 页面背景颜色 8 | backgroundColor: string 9 | // 页面背景图片 10 | backgroundImage: string 11 | } 12 | 13 | // 定义页面组件 14 | export const component = { 15 | id: 'PageConfig', 16 | name: '页面设置', 17 | icon: 'ep:document', 18 | property: { 19 | description: '', 20 | backgroundColor: '#f5f5f5', 21 | backgroundImage: '' 22 | } 23 | } as DiyComponent 24 | -------------------------------------------------------------------------------- /src/components/DiyEditor/components/mobile/Popover/config.ts: -------------------------------------------------------------------------------- 1 | import { DiyComponent } from '@/components/DiyEditor/util' 2 | 3 | /** 弹窗广告属性 */ 4 | export interface PopoverProperty { 5 | list: PopoverItemProperty[] 6 | } 7 | 8 | export interface PopoverItemProperty { 9 | // 图片地址 10 | imgUrl: string 11 | // 跳转连接 12 | url: string 13 | // 显示类型:仅显示一次、每次启动都会显示 14 | showType: 'once' | 'always' 15 | } 16 | 17 | // 定义组件 18 | export const component = { 19 | id: 'Popover', 20 | name: '弹窗广告', 21 | icon: 'carbon:popup', 22 | position: 'fixed', 23 | property: { 24 | list: [{ showType: 'once' }] 25 | } 26 | } as DiyComponent 27 | -------------------------------------------------------------------------------- /src/components/DiyEditor/components/mobile/PromotionArticle/config.ts: -------------------------------------------------------------------------------- 1 | import { ComponentStyle, DiyComponent } from '@/components/DiyEditor/util' 2 | 3 | /** 营销文章属性 */ 4 | export interface PromotionArticleProperty { 5 | // 文章编号 6 | id: number 7 | // 组件样式 8 | style: ComponentStyle 9 | } 10 | 11 | // 定义组件 12 | export const component = { 13 | id: 'PromotionArticle', 14 | name: '营销文章', 15 | icon: 'ph:article-medium', 16 | property: { 17 | style: { 18 | bgType: 'color', 19 | bgColor: '', 20 | marginLeft: 8, 21 | marginRight: 8, 22 | marginBottom: 8 23 | } as ComponentStyle 24 | } 25 | } as DiyComponent 26 | -------------------------------------------------------------------------------- /src/components/DiyEditor/components/mobile/PromotionArticle/index.vue: -------------------------------------------------------------------------------- 1 | 4 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /src/components/DiyEditor/components/mobile/UserCard/config.ts: -------------------------------------------------------------------------------- 1 | import { ComponentStyle, DiyComponent } from '@/components/DiyEditor/util' 2 | 3 | /** 用户卡片属性 */ 4 | export interface UserCardProperty { 5 | // 组件样式 6 | style: ComponentStyle 7 | } 8 | 9 | // 定义组件 10 | export const component = { 11 | id: 'UserCard', 12 | name: '用户卡片', 13 | icon: 'mdi:user-card-details', 14 | property: { 15 | style: { 16 | bgType: 'color', 17 | bgColor: '', 18 | marginBottom: 8 19 | } as ComponentStyle 20 | } 21 | } as DiyComponent 22 | -------------------------------------------------------------------------------- /src/components/DiyEditor/components/mobile/UserCard/property.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/components/DiyEditor/components/mobile/UserCoupon/config.ts: -------------------------------------------------------------------------------- 1 | import { ComponentStyle, DiyComponent } from '@/components/DiyEditor/util' 2 | 3 | /** 用户卡券属性 */ 4 | export interface UserCouponProperty { 5 | // 组件样式 6 | style: ComponentStyle 7 | } 8 | 9 | // 定义组件 10 | export const component = { 11 | id: 'UserCoupon', 12 | name: '用户卡券', 13 | icon: 'ep:ticket', 14 | property: { 15 | style: { 16 | bgType: 'color', 17 | bgColor: '', 18 | marginLeft: 8, 19 | marginRight: 8, 20 | marginBottom: 8 21 | } as ComponentStyle 22 | } 23 | } as DiyComponent 24 | -------------------------------------------------------------------------------- /src/components/DiyEditor/components/mobile/UserCoupon/index.vue: -------------------------------------------------------------------------------- 1 | 6 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/components/DiyEditor/components/mobile/UserCoupon/property.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/components/DiyEditor/components/mobile/UserOrder/config.ts: -------------------------------------------------------------------------------- 1 | import { ComponentStyle, DiyComponent } from '@/components/DiyEditor/util' 2 | 3 | /** 用户订单属性 */ 4 | export interface UserOrderProperty { 5 | // 组件样式 6 | style: ComponentStyle 7 | } 8 | 9 | // 定义组件 10 | export const component = { 11 | id: 'UserOrder', 12 | name: '用户订单', 13 | icon: 'ep:list', 14 | property: { 15 | style: { 16 | bgType: 'color', 17 | bgColor: '', 18 | marginLeft: 8, 19 | marginRight: 8, 20 | marginBottom: 8 21 | } as ComponentStyle 22 | } 23 | } as DiyComponent 24 | -------------------------------------------------------------------------------- /src/components/DiyEditor/components/mobile/UserOrder/index.vue: -------------------------------------------------------------------------------- 1 | 4 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/components/DiyEditor/components/mobile/UserOrder/property.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/components/DiyEditor/components/mobile/UserWallet/config.ts: -------------------------------------------------------------------------------- 1 | import { ComponentStyle, DiyComponent } from '@/components/DiyEditor/util' 2 | 3 | /** 用户资产属性 */ 4 | export interface UserWalletProperty { 5 | // 组件样式 6 | style: ComponentStyle 7 | } 8 | 9 | // 定义组件 10 | export const component = { 11 | id: 'UserWallet', 12 | name: '用户资产', 13 | icon: 'ep:wallet-filled', 14 | property: { 15 | style: { 16 | bgType: 'color', 17 | bgColor: '', 18 | marginLeft: 8, 19 | marginRight: 8, 20 | marginBottom: 8 21 | } as ComponentStyle 22 | } 23 | } as DiyComponent 24 | -------------------------------------------------------------------------------- /src/components/DiyEditor/components/mobile/UserWallet/index.vue: -------------------------------------------------------------------------------- 1 | 6 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/components/DiyEditor/components/mobile/UserWallet/property.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/components/DiyEditor/components/mobile/VideoPlayer/config.ts: -------------------------------------------------------------------------------- 1 | import { ComponentStyle, DiyComponent } from '@/components/DiyEditor/util' 2 | 3 | /** 视频播放属性 */ 4 | export interface VideoPlayerProperty { 5 | // 视频链接 6 | videoUrl: string 7 | // 封面链接 8 | posterUrl: string 9 | // 是否自动播放 10 | autoplay: boolean 11 | // 组件样式 12 | style: VideoPlayerStyle 13 | } 14 | 15 | // 视频播放样式 16 | export interface VideoPlayerStyle extends ComponentStyle { 17 | // 视频高度 18 | height: number 19 | } 20 | 21 | // 定义组件 22 | export const component = { 23 | id: 'VideoPlayer', 24 | name: '视频播放', 25 | icon: 'ep:video-play', 26 | property: { 27 | videoUrl: '', 28 | posterUrl: '', 29 | autoplay: false, 30 | style: { 31 | bgType: 'color', 32 | bgColor: '#fff', 33 | marginBottom: 8, 34 | height: 300 35 | } as VideoPlayerStyle 36 | } 37 | } as DiyComponent 38 | -------------------------------------------------------------------------------- /src/components/DiyEditor/components/mobile/VideoPlayer/index.vue: -------------------------------------------------------------------------------- 1 | 14 | 22 | 23 | 31 | -------------------------------------------------------------------------------- /src/components/DocAlert/index.vue: -------------------------------------------------------------------------------- 1 | 8 | 28 | 35 | -------------------------------------------------------------------------------- /src/components/Echart/index.ts: -------------------------------------------------------------------------------- 1 | import Echart from './src/Echart.vue' 2 | 3 | export { Echart } 4 | -------------------------------------------------------------------------------- /src/components/Editor/index.ts: -------------------------------------------------------------------------------- 1 | import Editor from './src/Editor.vue' 2 | import { IDomEditor } from '@wangeditor/editor' 3 | 4 | export interface EditorExpose { 5 | getEditorRef: () => Promise 6 | } 7 | 8 | export { Editor } 9 | -------------------------------------------------------------------------------- /src/components/Error/index.ts: -------------------------------------------------------------------------------- 1 | import Error from './src/Error.vue' 2 | 3 | export { Error } 4 | -------------------------------------------------------------------------------- /src/components/Form/index.ts: -------------------------------------------------------------------------------- 1 | import Form from './src/Form.vue' 2 | import { ElForm } from 'element-plus' 3 | import { FormSchema, FormSetPropsType } from '@/types/form' 4 | 5 | export interface FormExpose { 6 | setValues: (data: Recordable) => void 7 | setProps: (props: Recordable) => void 8 | delSchema: (field: string) => void 9 | addSchema: (formSchema: FormSchema, index?: number) => void 10 | setSchema: (schemaProps: FormSetPropsType[]) => void 11 | formModel: Recordable 12 | getElFormRef: () => ComponentRef 13 | } 14 | 15 | export { Form } 16 | -------------------------------------------------------------------------------- /src/components/Form/src/components/useRenderCheckbox.tsx: -------------------------------------------------------------------------------- 1 | import { FormSchema } from '@/types/form' 2 | import { ElCheckbox, ElCheckboxButton } from 'element-plus' 3 | import { defineComponent } from 'vue' 4 | 5 | export const useRenderCheckbox = () => { 6 | const renderCheckboxOptions = (item: FormSchema) => { 7 | // 如果有别名,就取别名 8 | const labelAlias = item?.componentProps?.optionsAlias?.labelField 9 | const valueAlias = item?.componentProps?.optionsAlias?.valueField 10 | const Com = (item.component === 'Checkbox' ? ElCheckbox : ElCheckboxButton) as ReturnType< 11 | typeof defineComponent 12 | > 13 | return item?.componentProps?.options?.map((option) => { 14 | const { ...other } = option 15 | return ( 16 | 17 | {option[labelAlias || 'label']} 18 | 19 | ) 20 | }) 21 | } 22 | 23 | return { 24 | renderCheckboxOptions 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/components/Form/src/components/useRenderRadio.tsx: -------------------------------------------------------------------------------- 1 | import { FormSchema } from '@/types/form' 2 | import { ElRadio, ElRadioButton } from 'element-plus' 3 | import { defineComponent } from 'vue' 4 | 5 | export const useRenderRadio = () => { 6 | const renderRadioOptions = (item: FormSchema) => { 7 | // 如果有别名,就取别名 8 | const labelAlias = item?.componentProps?.optionsAlias?.labelField 9 | const valueAlias = item?.componentProps?.optionsAlias?.valueField 10 | const Com = (item.component === 'Radio' ? ElRadio : ElRadioButton) as ReturnType< 11 | typeof defineComponent 12 | > 13 | return item?.componentProps?.options?.map((option) => { 14 | const { ...other } = option 15 | return ( 16 | 17 | {option[labelAlias || 'label']} 18 | 19 | ) 20 | }) 21 | } 22 | 23 | return { 24 | renderRadioOptions 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/components/Form/src/types.ts: -------------------------------------------------------------------------------- 1 | import { FormSchema } from '@/types/form' 2 | 3 | export interface PlaceholderModel { 4 | placeholder?: string 5 | startPlaceholder?: string 6 | endPlaceholder?: string 7 | rangeSeparator?: string 8 | } 9 | 10 | export type FormProps = { 11 | schema?: FormSchema[] 12 | isCol?: boolean 13 | model?: Recordable 14 | autoSetPlaceholder?: boolean 15 | isCustom?: boolean 16 | labelWidth?: string | number 17 | } & Recordable 18 | -------------------------------------------------------------------------------- /src/components/FormCreate/index.ts: -------------------------------------------------------------------------------- 1 | import { useFormCreateDesigner } from './src/useFormCreateDesigner' 2 | import { useApiSelect } from './src/components/useApiSelect' 3 | 4 | export { useFormCreateDesigner, useApiSelect } 5 | -------------------------------------------------------------------------------- /src/components/FormCreate/src/config/index.ts: -------------------------------------------------------------------------------- 1 | import { useUploadFileRule } from './useUploadFileRule' 2 | import { useUploadImgRule } from './useUploadImgRule' 3 | import { useUploadImgsRule } from './useUploadImgsRule' 4 | import { useDictSelectRule } from './useDictSelectRule' 5 | import { useEditorRule } from './useEditorRule' 6 | import { useSelectRule } from './useSelectRule' 7 | 8 | export { 9 | useUploadFileRule, 10 | useUploadImgRule, 11 | useUploadImgsRule, 12 | useDictSelectRule, 13 | useEditorRule, 14 | useSelectRule 15 | } 16 | -------------------------------------------------------------------------------- /src/components/FormCreate/src/config/useEditorRule.ts: -------------------------------------------------------------------------------- 1 | import { generateUUID } from '@/utils' 2 | import { localeProps, makeRequiredRule } from '@/components/FormCreate/src/utils' 3 | 4 | export const useEditorRule = () => { 5 | const label = '富文本' 6 | const name = 'Editor' 7 | return { 8 | icon: 'icon-editor', 9 | label, 10 | name, 11 | rule() { 12 | return { 13 | type: name, 14 | field: generateUUID(), 15 | title: label, 16 | info: '', 17 | $required: false 18 | } 19 | }, 20 | props(_, { t }) { 21 | return localeProps(t, name + '.props', [ 22 | makeRequiredRule(), 23 | { 24 | type: 'input', 25 | field: 'height', 26 | title: '高度' 27 | }, 28 | { type: 'switch', field: 'readonly', title: '是否只读' } 29 | ]) 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/components/Highlight/index.ts: -------------------------------------------------------------------------------- 1 | import Highlight from './src/Highlight.vue' 2 | 3 | export { Highlight } 4 | -------------------------------------------------------------------------------- /src/components/IFrame/index.ts: -------------------------------------------------------------------------------- 1 | import IFrame from './src/IFrame.vue' 2 | 3 | export { IFrame } 4 | -------------------------------------------------------------------------------- /src/components/Icon/index.ts: -------------------------------------------------------------------------------- 1 | import Icon from './src/Icon.vue' 2 | import IconSelect from './src/IconSelect.vue' 3 | 4 | export { Icon, IconSelect } 5 | -------------------------------------------------------------------------------- /src/components/ImageViewer/src/ImageViewer.vue: -------------------------------------------------------------------------------- 1 | 32 | 33 | 36 | -------------------------------------------------------------------------------- /src/components/ImageViewer/src/types.ts: -------------------------------------------------------------------------------- 1 | export interface ImageViewerProps { 2 | urlList?: string[] 3 | zIndex?: number 4 | initialIndex?: number 5 | infinite?: boolean 6 | hideOnClickModal?: boolean 7 | teleported?: boolean 8 | show?: boolean 9 | } 10 | -------------------------------------------------------------------------------- /src/components/Infotip/index.ts: -------------------------------------------------------------------------------- 1 | import Infotip from './src/Infotip.vue' 2 | 3 | export { Infotip } 4 | -------------------------------------------------------------------------------- /src/components/InputPassword/index.ts: -------------------------------------------------------------------------------- 1 | import InputPassword from './src/InputPassword.vue' 2 | 3 | export { InputPassword } 4 | -------------------------------------------------------------------------------- /src/components/OperateLogV2/index.ts: -------------------------------------------------------------------------------- 1 | import OperateLogV2 from './src/OperateLogV2.vue' 2 | 3 | export { OperateLogV2 } 4 | -------------------------------------------------------------------------------- /src/components/Qrcode/index.ts: -------------------------------------------------------------------------------- 1 | import Qrcode from './src/Qrcode.vue' 2 | 3 | export { Qrcode } 4 | -------------------------------------------------------------------------------- /src/components/Search/index.ts: -------------------------------------------------------------------------------- 1 | import Search from './src/Search.vue' 2 | 3 | export { Search } 4 | -------------------------------------------------------------------------------- /src/components/SimpleProcessDesignerV2/src/index.ts: -------------------------------------------------------------------------------- 1 | import SimpleProcessDesigner from './SimpleProcessDesigner.vue' 2 | import SimpleProcessViewer from './SimpleProcessViewer.vue' 3 | import '../theme/simple-process-designer.scss' 4 | 5 | export { SimpleProcessDesigner, SimpleProcessViewer} 6 | -------------------------------------------------------------------------------- /src/components/SimpleProcessDesignerV2/theme/iconfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/src/components/SimpleProcessDesignerV2/theme/iconfont.ttf -------------------------------------------------------------------------------- /src/components/SimpleProcessDesignerV2/theme/iconfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/src/components/SimpleProcessDesignerV2/theme/iconfont.woff -------------------------------------------------------------------------------- /src/components/SimpleProcessDesignerV2/theme/iconfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/src/components/SimpleProcessDesignerV2/theme/iconfont.woff2 -------------------------------------------------------------------------------- /src/components/Sticky/index.ts: -------------------------------------------------------------------------------- 1 | import Sticky from './src/Sticky.vue' 2 | 3 | export { Sticky } 4 | -------------------------------------------------------------------------------- /src/components/Table/index.ts: -------------------------------------------------------------------------------- 1 | import Table from './src/Table.vue' 2 | import { ElTable } from 'element-plus' 3 | import { TableSetPropsType } from '@/types/table' 4 | import TableSelectForm from './src/TableSelectForm.vue' 5 | 6 | export interface TableExpose { 7 | setProps: (props: Recordable) => void 8 | setColumn: (columnProps: TableSetPropsType[]) => void 9 | selections: Recordable[] 10 | elTableRef: ComponentRef 11 | } 12 | 13 | export { Table, TableSelectForm } 14 | -------------------------------------------------------------------------------- /src/components/Table/src/helper.ts: -------------------------------------------------------------------------------- 1 | export const setIndex = (reserveIndex: boolean, index: number, size: number, current: number) => { 2 | const newIndex = index + 1 3 | if (reserveIndex) { 4 | return size * (current - 1) + newIndex 5 | } else { 6 | return newIndex 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/components/Table/src/types.ts: -------------------------------------------------------------------------------- 1 | import { Pagination, TableColumn } from '@/types/table' 2 | 3 | export type TableProps = { 4 | pageSize?: number 5 | currentPage?: number 6 | // 是否多选 7 | selection?: boolean 8 | // 是否所有的超出隐藏,优先级低于schema中的showOverflowTooltip, 9 | showOverflowTooltip?: boolean 10 | // 表头 11 | columns?: TableColumn[] 12 | // 是否展示分页 13 | pagination?: Pagination | undefined 14 | // 仅对 type=selection 的列有效,类型为 Boolean,为 true 则会在数据更新之后保留之前选中的数据(需指定 row-key) 15 | reserveSelection?: boolean 16 | // 加载状态 17 | loading?: boolean 18 | // 是否叠加索引 19 | reserveIndex?: boolean 20 | // 对齐方式 21 | align?: 'left' | 'center' | 'right' 22 | // 表头对齐方式 23 | headerAlign?: 'left' | 'center' | 'right' 24 | data?: Recordable 25 | expand?: boolean 26 | } & Recordable 27 | -------------------------------------------------------------------------------- /src/components/Tooltip/index.ts: -------------------------------------------------------------------------------- 1 | import Tooltip from './src/Tooltip.vue' 2 | 3 | export { Tooltip } 4 | -------------------------------------------------------------------------------- /src/components/Tooltip/src/Tooltip.vue: -------------------------------------------------------------------------------- 1 | 12 | 18 | -------------------------------------------------------------------------------- /src/components/UploadFile/index.ts: -------------------------------------------------------------------------------- 1 | import UploadImg from './src/UploadImg.vue' 2 | import UploadImgs from './src/UploadImgs.vue' 3 | import UploadFile from './src/UploadFile.vue' 4 | 5 | export { UploadImg, UploadImgs, UploadFile } 6 | -------------------------------------------------------------------------------- /src/components/Verifition/index.ts: -------------------------------------------------------------------------------- 1 | import Verify from './src/Verify.vue' 2 | 3 | export { Verify } 4 | -------------------------------------------------------------------------------- /src/components/Verifition/src/Verify/index.ts: -------------------------------------------------------------------------------- 1 | import VerifySlide from './VerifySlide.vue' 2 | import VerifyPoints from './VerifyPoints.vue' 3 | 4 | export { VerifySlide, VerifyPoints } 5 | -------------------------------------------------------------------------------- /src/components/Verifition/src/utils/ase.ts: -------------------------------------------------------------------------------- 1 | import CryptoJS from 'crypto-js' 2 | /** 3 | * @word 要加密的内容 4 | * @keyWord String 服务器随机返回的关键字 5 | * */ 6 | export function aesEncrypt(word, keyWord = 'XwKsGlMcdPMEhR1B') { 7 | const key = CryptoJS.enc.Utf8.parse(keyWord) 8 | const srcs = CryptoJS.enc.Utf8.parse(word) 9 | const encrypted = CryptoJS.AES.encrypt(srcs, key, { 10 | mode: CryptoJS.mode.ECB, 11 | padding: CryptoJS.pad.Pkcs7 12 | }) 13 | return encrypted.toString() 14 | } 15 | -------------------------------------------------------------------------------- /src/components/XButton/index.ts: -------------------------------------------------------------------------------- 1 | import XButton from './src/XButton.vue' 2 | import XTextButton from './src/XTextButton.vue' 3 | 4 | export { XButton, XTextButton } 5 | -------------------------------------------------------------------------------- /src/components/bpmnProcessDesigner/package/designer/index.ts: -------------------------------------------------------------------------------- 1 | import MyProcessDesigner from './ProcessDesigner.vue' 2 | 3 | MyProcessDesigner.install = function (Vue) { 4 | Vue.component(MyProcessDesigner.name, MyProcessDesigner) 5 | } 6 | 7 | // 流程图的设计器,可编辑 8 | export default MyProcessDesigner 9 | -------------------------------------------------------------------------------- /src/components/bpmnProcessDesigner/package/designer/index2.ts: -------------------------------------------------------------------------------- 1 | import MyProcessViewer from './ProcessViewer.vue' 2 | 3 | MyProcessViewer.install = function (Vue) { 4 | Vue.component(MyProcessViewer.name, MyProcessViewer) 5 | } 6 | 7 | // 流程图的查看器,不可编辑 8 | export default MyProcessViewer 9 | -------------------------------------------------------------------------------- /src/components/bpmnProcessDesigner/package/designer/plugins/content-pad/index.js: -------------------------------------------------------------------------------- 1 | import CustomContextPadProvider from './contentPadProvider' 2 | 3 | export default { 4 | __init__: ['contextPadProvider'], 5 | contextPadProvider: ['type', CustomContextPadProvider] 6 | } 7 | -------------------------------------------------------------------------------- /src/components/bpmnProcessDesigner/package/designer/plugins/extension-moddle/activiti/index.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @author igdianov 3 | * address https://github.com/igdianov/activiti-bpmn-moddle 4 | * */ 5 | 6 | import activitiExtension from './activitiExtension' 7 | 8 | export default { 9 | __init__: ['ActivitiModdleExtension'], 10 | ActivitiModdleExtension: ['type', activitiExtension] 11 | } 12 | -------------------------------------------------------------------------------- /src/components/bpmnProcessDesigner/package/designer/plugins/extension-moddle/camunda/index.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | import extension from './extension' 4 | 5 | export default { 6 | __init__: ['camundaModdleExtension'], 7 | camundaModdleExtension: ['type', extension] 8 | } 9 | -------------------------------------------------------------------------------- /src/components/bpmnProcessDesigner/package/designer/plugins/extension-moddle/flowable/index.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @author igdianov 3 | * address https://github.com/igdianov/activiti-bpmn-moddle 4 | * */ 5 | import flowableExtension from './flowableExtension' 6 | 7 | export default { 8 | __init__: ['FlowableModdleExtension'], 9 | FlowableModdleExtension: ['type', flowableExtension] 10 | } 11 | -------------------------------------------------------------------------------- /src/components/bpmnProcessDesigner/package/index.ts: -------------------------------------------------------------------------------- 1 | import MyProcessDesigner from './designer' 2 | import MyProcessPenal from './penal' 3 | import MyProcessViewer from './designer/index2' 4 | 5 | import './theme/index.scss' 6 | import 'bpmn-js/dist/assets/diagram-js.css' 7 | import 'bpmn-js/dist/assets/bpmn-font/css/bpmn.css' 8 | import 'bpmn-js/dist/assets/bpmn-font/css/bpmn-codes.css' 9 | import 'bpmn-js/dist/assets/bpmn-font/css/bpmn-embedded.css' 10 | 11 | export { MyProcessDesigner, MyProcessPenal, MyProcessViewer } 12 | -------------------------------------------------------------------------------- /src/components/bpmnProcessDesigner/package/penal/custom-config/data.ts: -------------------------------------------------------------------------------- 1 | import UserTaskCustomConfig from './components/UserTaskCustomConfig.vue' 2 | import BoundaryEventTimer from './components/BoundaryEventTimer.vue' 3 | 4 | export const CustomConfigMap = { 5 | UserTask: { 6 | name: '用户任务', 7 | componet: UserTaskCustomConfig 8 | }, 9 | BoundaryEventTimerEventDefinition: { 10 | name: '定时边界事件(非中断)', 11 | componet: BoundaryEventTimer 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/components/bpmnProcessDesigner/package/penal/index.js: -------------------------------------------------------------------------------- 1 | import MyPropertiesPanel from './PropertiesPanel.vue' 2 | 3 | MyPropertiesPanel.install = function (Vue) { 4 | Vue.component(MyPropertiesPanel.name, MyPropertiesPanel) 5 | } 6 | 7 | export default MyPropertiesPanel 8 | -------------------------------------------------------------------------------- /src/components/bpmnProcessDesigner/src/highlight/index.js: -------------------------------------------------------------------------------- 1 | const hljs = require('highlight.js/lib/core') 2 | hljs.registerLanguage('xml', require('highlight.js/lib/languages/xml')) 3 | hljs.registerLanguage('json', require('highlight.js/lib/languages/json')) 4 | 5 | module.exports = hljs 6 | -------------------------------------------------------------------------------- /src/components/bpmnProcessDesigner/src/modules/custom-renderer/CustomRenderer.js: -------------------------------------------------------------------------------- 1 | import BpmnRenderer from 'bpmn-js/lib/draw/BpmnRenderer' 2 | 3 | export default function CustomRenderer(config, eventBus, styles, pathMap, canvas, textRenderer) { 4 | BpmnRenderer.call(this, config, eventBus, styles, pathMap, canvas, textRenderer, 2000) 5 | 6 | this.handlers['label'] = function () { 7 | return null 8 | } 9 | } 10 | 11 | const F = function () {} // 核心,利用空对象作为中介; 12 | F.prototype = BpmnRenderer.prototype // 核心,将父类的原型赋值给空对象F; 13 | CustomRenderer.prototype = new F() // 核心,将 F的实例赋值给子类; 14 | CustomRenderer.prototype.constructor = CustomRenderer // 修复子类CustomRenderer的构造器指向,防止原型链的混乱; 15 | -------------------------------------------------------------------------------- /src/components/bpmnProcessDesigner/src/modules/custom-renderer/index.js: -------------------------------------------------------------------------------- 1 | import CustomRenderer from './CustomRenderer' 2 | 3 | export default { 4 | __init__: ['customRenderer'], 5 | customRenderer: ['type', CustomRenderer] 6 | } 7 | -------------------------------------------------------------------------------- /src/components/bpmnProcessDesigner/src/modules/rules/CustomRules.js: -------------------------------------------------------------------------------- 1 | import BpmnRules from 'bpmn-js/lib/features/rules/BpmnRules' 2 | import inherits from 'inherits' 3 | 4 | export default function CustomRules(eventBus) { 5 | BpmnRules.call(this, eventBus) 6 | } 7 | 8 | inherits(CustomRules, BpmnRules) 9 | 10 | CustomRules.prototype.canDrop = function () { 11 | return false 12 | } 13 | 14 | CustomRules.prototype.canMove = function () { 15 | return false 16 | } 17 | -------------------------------------------------------------------------------- /src/components/bpmnProcessDesigner/src/modules/rules/index.js: -------------------------------------------------------------------------------- 1 | import CustomRules from './CustomRules' 2 | 3 | export default { 4 | __init__: ['customRules'], 5 | customRules: ['type', CustomRules] 6 | } 7 | -------------------------------------------------------------------------------- /src/components/bpmnProcessDesigner/src/utils/index.js: -------------------------------------------------------------------------------- 1 | export function debounce(fn, delay = 500) { 2 | let timer 3 | return function (...args) { 4 | if (timer) { 5 | clearTimeout(timer) 6 | timer = null 7 | } 8 | timer = setTimeout(fn.bind(this, ...args), delay) 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/components/index.ts: -------------------------------------------------------------------------------- 1 | import type { App } from 'vue' 2 | import { Icon } from './Icon' 3 | 4 | export const setupGlobCom = (app: App): void => { 5 | app.component('Icon', Icon) 6 | } 7 | -------------------------------------------------------------------------------- /src/config/axios/config.ts: -------------------------------------------------------------------------------- 1 | const config: { 2 | base_url: string 3 | result_code: number | string 4 | default_headers: AxiosHeaders 5 | request_timeout: number 6 | } = { 7 | /** 8 | * api请求基础路径 9 | */ 10 | base_url: import.meta.env.VITE_BASE_URL + import.meta.env.VITE_API_URL, 11 | /** 12 | * 接口成功返回状态码 13 | */ 14 | result_code: 200, 15 | 16 | /** 17 | * 接口请求超时时间 18 | */ 19 | request_timeout: 30000, 20 | 21 | /** 22 | * 默认接口请求类型 23 | * 可选值:application/x-www-form-urlencoded multipart/form-data 24 | */ 25 | default_headers: 'application/json' 26 | } 27 | 28 | export { config } 29 | -------------------------------------------------------------------------------- /src/config/axios/errorCode.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | '401': '认证失败,无法访问系统资源', 3 | '403': '当前操作没有权限', 4 | '404': '访问资源不存在', 5 | default: '系统未知错误,请反馈给管理员' 6 | } 7 | -------------------------------------------------------------------------------- /src/directives/index.ts: -------------------------------------------------------------------------------- 1 | import type { App } from 'vue' 2 | import { hasRole } from './permission/hasRole' 3 | import { hasPermi } from './permission/hasPermi' 4 | 5 | /** 6 | * 导出指令:v-xxx 7 | * @methods hasRole 用户权限,用法: v-hasRole 8 | * @methods hasPermi 按钮权限,用法: v-hasPermi 9 | */ 10 | export const setupAuth = (app: App) => { 11 | hasRole(app) 12 | hasPermi(app) 13 | } 14 | 15 | /** 16 | * 导出指令:v-mountedFocus 17 | */ 18 | export const setupMountedFocus = (app: App) => { 19 | app.directive('mountedFocus', { 20 | mounted(el) { 21 | el.focus() 22 | } 23 | }) 24 | } 25 | -------------------------------------------------------------------------------- /src/directives/permission/hasPermi.ts: -------------------------------------------------------------------------------- 1 | import type { App } from 'vue' 2 | import { useUserStore } from '@/store/modules/user' 3 | 4 | const { t } = useI18n() // 国际化 5 | 6 | /** 判断权限的指令 directive */ 7 | export function hasPermi(app: App) { 8 | app.directive('hasPermi', (el, binding) => { 9 | const { value } = binding 10 | 11 | if (value && value instanceof Array && value.length > 0) { 12 | const hasPermissions = hasPermission(value) 13 | 14 | if (!hasPermissions) { 15 | el.parentNode && el.parentNode.removeChild(el) 16 | } 17 | } else { 18 | throw new Error(t('permission.hasPermission')) 19 | } 20 | }) 21 | } 22 | 23 | /** 判断权限的方法 function */ 24 | const userStore = useUserStore() 25 | const all_permission = '*:*:*' 26 | export const hasPermission = (permission: string[]) => { 27 | return ( 28 | userStore.permissions.has(all_permission) || 29 | permission.some((permission) => userStore.permissions.has(permission)) 30 | ) 31 | } 32 | -------------------------------------------------------------------------------- /src/directives/permission/hasRole.ts: -------------------------------------------------------------------------------- 1 | import type { App } from 'vue' 2 | import { CACHE_KEY, useCache } from '@/hooks/web/useCache' 3 | 4 | const { t } = useI18n() // 国际化 5 | 6 | export function hasRole(app: App) { 7 | app.directive('hasRole', (el, binding) => { 8 | const { wsCache } = useCache() 9 | const { value } = binding 10 | const super_admin = 'super_admin' 11 | const userInfo = wsCache.get(CACHE_KEY.USER) 12 | const roles = userInfo?.roles || [] 13 | 14 | if (value && value instanceof Array && value.length > 0) { 15 | const roleFlag = value 16 | 17 | const hasRole = roles.some((role: string) => { 18 | return super_admin === role || roleFlag.includes(role) 19 | }) 20 | 21 | if (!hasRole) { 22 | el.parentNode && el.parentNode.removeChild(el) 23 | } 24 | } else { 25 | throw new Error(t('permission.hasRole')) 26 | } 27 | }) 28 | } 29 | -------------------------------------------------------------------------------- /src/hooks/web/useConfigGlobal.ts: -------------------------------------------------------------------------------- 1 | import { ConfigGlobalTypes } from '@/types/configGlobal' 2 | 3 | export const useConfigGlobal = () => { 4 | const configGlobal = inject('configGlobal', {}) as ConfigGlobalTypes 5 | 6 | return { 7 | configGlobal 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/hooks/web/useDesign.ts: -------------------------------------------------------------------------------- 1 | import variables from '@/styles/global.module.scss' 2 | 3 | export const useDesign = () => { 4 | const scssVariables = variables 5 | 6 | /** 7 | * @param scope 类名 8 | * @returns 返回空间名-类名 9 | */ 10 | const getPrefixCls = (scope: string) => { 11 | return `${scssVariables.namespace}-${scope}` 12 | } 13 | 14 | return { 15 | variables: scssVariables, 16 | getPrefixCls 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/hooks/web/useEmitt.ts: -------------------------------------------------------------------------------- 1 | import mitt from 'mitt' 2 | 3 | interface Option { 4 | name: string // 事件名称 5 | callback: Fn // 回调 6 | } 7 | 8 | const emitter = mitt() 9 | 10 | export const useEmitt = (option?: Option) => { 11 | if (option) { 12 | emitter.on(option.name, option.callback) 13 | 14 | onBeforeUnmount(() => { 15 | emitter.off(option.name) 16 | }) 17 | } 18 | 19 | return { 20 | emitter 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/hooks/web/useIcon.ts: -------------------------------------------------------------------------------- 1 | import { h } from 'vue' 2 | import type { VNode } from 'vue' 3 | import { Icon } from '@/components/Icon' 4 | import { IconTypes } from '@/types/icon' 5 | 6 | export const useIcon = (props: IconTypes): VNode => { 7 | return h(Icon, props) 8 | } 9 | -------------------------------------------------------------------------------- /src/hooks/web/useNProgress.ts: -------------------------------------------------------------------------------- 1 | import { useCssVar } from '@vueuse/core' 2 | import type { NProgressOptions } from 'nprogress' 3 | import NProgress from 'nprogress' 4 | import 'nprogress/nprogress.css' 5 | 6 | const primaryColor = useCssVar('--el-color-primary', document.documentElement) 7 | 8 | export const useNProgress = () => { 9 | NProgress.configure({ showSpinner: false } as NProgressOptions) 10 | 11 | const initColor = async () => { 12 | await nextTick() 13 | const bar = document.getElementById('nprogress')?.getElementsByClassName('bar')[0] as ElRef 14 | if (bar) { 15 | bar.style.background = unref(primaryColor.value) 16 | } 17 | } 18 | 19 | initColor() 20 | 21 | const start = () => { 22 | NProgress.start() 23 | } 24 | 25 | const done = () => { 26 | NProgress.done() 27 | } 28 | 29 | return { 30 | start, 31 | done 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/hooks/web/useNetwork.ts: -------------------------------------------------------------------------------- 1 | import { ref, onBeforeUnmount } from 'vue' 2 | 3 | const useNetwork = () => { 4 | const online = ref(true) 5 | 6 | const updateNetwork = () => { 7 | online.value = navigator.onLine 8 | } 9 | 10 | window.addEventListener('online', updateNetwork) 11 | window.addEventListener('offline', updateNetwork) 12 | 13 | onBeforeUnmount(() => { 14 | window.removeEventListener('online', updateNetwork) 15 | window.removeEventListener('offline', updateNetwork) 16 | }) 17 | 18 | return { online } 19 | } 20 | 21 | export { useNetwork } 22 | -------------------------------------------------------------------------------- /src/hooks/web/usePageLoading.ts: -------------------------------------------------------------------------------- 1 | import { useAppStoreWithOut } from '@/store/modules/app' 2 | 3 | const appStore = useAppStoreWithOut() 4 | 5 | export const usePageLoading = () => { 6 | const loadStart = () => { 7 | appStore.setPageLoading(true) 8 | } 9 | 10 | const loadDone = () => { 11 | appStore.setPageLoading(false) 12 | } 13 | 14 | return { 15 | loadStart, 16 | loadDone 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/hooks/web/useTitle.ts: -------------------------------------------------------------------------------- 1 | import { watch, ref } from 'vue' 2 | import { isString } from '@/utils/is' 3 | import { useAppStoreWithOut } from '@/store/modules/app' 4 | 5 | const appStore = useAppStoreWithOut() 6 | 7 | export const useTitle = (newTitle?: string) => { 8 | const { t } = useI18n() 9 | const title = ref( 10 | newTitle ? `${appStore.getTitle} - ${t(newTitle as string)}` : appStore.getTitle 11 | ) 12 | 13 | watch( 14 | title, 15 | (n, o) => { 16 | if (isString(n) && n !== o && document) { 17 | document.title = n 18 | } 19 | }, 20 | { immediate: true } 21 | ) 22 | 23 | return title 24 | } 25 | -------------------------------------------------------------------------------- /src/layout/components/Breadcrumb/index.ts: -------------------------------------------------------------------------------- 1 | import Breadcrumb from './src/Breadcrumb.vue' 2 | 3 | export { Breadcrumb } 4 | -------------------------------------------------------------------------------- /src/layout/components/Breadcrumb/src/helper.ts: -------------------------------------------------------------------------------- 1 | import { pathResolve } from '@/utils/routerHelper' 2 | import type { RouteMeta } from 'vue-router' 3 | 4 | export const filterBreadcrumb = ( 5 | routes: AppRouteRecordRaw[], 6 | parentPath = '' 7 | ): AppRouteRecordRaw[] => { 8 | const res: AppRouteRecordRaw[] = [] 9 | 10 | for (const route of routes) { 11 | const meta = route?.meta as RouteMeta 12 | if (meta.hidden && !meta.canTo) { 13 | continue 14 | } 15 | 16 | const data: AppRouteRecordRaw = 17 | !meta.alwaysShow && route.children?.length === 1 18 | ? { ...route.children[0], path: pathResolve(route.path, route.children[0].path) } 19 | : { ...route } 20 | 21 | data.path = pathResolve(parentPath, data.path) 22 | 23 | if (data.children) { 24 | data.children = filterBreadcrumb(data.children, data.path) 25 | } 26 | if (data) { 27 | res.push(data) 28 | } 29 | } 30 | return res 31 | } 32 | -------------------------------------------------------------------------------- /src/layout/components/Collapse/index.ts: -------------------------------------------------------------------------------- 1 | import Collapse from './src/Collapse.vue' 2 | 3 | export { Collapse } 4 | -------------------------------------------------------------------------------- /src/layout/components/Collapse/src/Collapse.vue: -------------------------------------------------------------------------------- 1 | 25 | 26 | 36 | -------------------------------------------------------------------------------- /src/layout/components/ContextMenu/index.ts: -------------------------------------------------------------------------------- 1 | import ContextMenu from './src/ContextMenu.vue' 2 | import { ElDropdown } from 'element-plus' 3 | import type { RouteLocationNormalizedLoaded } from 'vue-router' 4 | 5 | export interface ContextMenuExpose { 6 | elDropdownMenuRef: ComponentRef 7 | tagItem: RouteLocationNormalizedLoaded 8 | } 9 | 10 | export { ContextMenu } 11 | -------------------------------------------------------------------------------- /src/layout/components/Footer/index.ts: -------------------------------------------------------------------------------- 1 | import Footer from './src/Footer.vue' 2 | 3 | export { Footer } 4 | -------------------------------------------------------------------------------- /src/layout/components/Footer/src/Footer.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 28 | -------------------------------------------------------------------------------- /src/layout/components/LocaleDropdown/index.ts: -------------------------------------------------------------------------------- 1 | import LocaleDropdown from './src/LocaleDropdown.vue' 2 | 3 | export { LocaleDropdown } 4 | -------------------------------------------------------------------------------- /src/layout/components/Logo/index.ts: -------------------------------------------------------------------------------- 1 | import Logo from './src/Logo.vue' 2 | 3 | export { Logo } 4 | -------------------------------------------------------------------------------- /src/layout/components/Menu/index.ts: -------------------------------------------------------------------------------- 1 | import Menu from './src/Menu.vue' 2 | 3 | export { Menu } 4 | -------------------------------------------------------------------------------- /src/layout/components/Menu/src/components/useRenderMenuTitle.tsx: -------------------------------------------------------------------------------- 1 | import type { RouteMeta } from 'vue-router' 2 | import { Icon } from '@/components/Icon' 3 | import { useI18n } from '@/hooks/web/useI18n' 4 | 5 | export const useRenderMenuTitle = () => { 6 | const renderMenuTitle = (meta: RouteMeta) => { 7 | const { t } = useI18n() 8 | const { title = 'Please set title', icon } = meta 9 | 10 | return icon ? ( 11 | <> 12 | 13 | 14 | {t(title as string)} 15 | 16 | 17 | ) : ( 18 | 19 | {t(title as string)} 20 | 21 | ) 22 | } 23 | 24 | return { 25 | renderMenuTitle 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/layout/components/Message/index.ts: -------------------------------------------------------------------------------- 1 | import Message from './src/Message.vue' 2 | 3 | export { Message } 4 | -------------------------------------------------------------------------------- /src/layout/components/Screenfull/index.ts: -------------------------------------------------------------------------------- 1 | import Screenfull from './src/Screenfull.vue' 2 | 3 | export { Screenfull } 4 | -------------------------------------------------------------------------------- /src/layout/components/Screenfull/src/Screenfull.vue: -------------------------------------------------------------------------------- 1 | 23 | 24 | 33 | -------------------------------------------------------------------------------- /src/layout/components/Setting/index.ts: -------------------------------------------------------------------------------- 1 | import Setting from './src/Setting.vue' 2 | 3 | export { Setting } 4 | -------------------------------------------------------------------------------- /src/layout/components/SizeDropdown/index.ts: -------------------------------------------------------------------------------- 1 | import SizeDropdown from './src/SizeDropdown.vue' 2 | 3 | export { SizeDropdown } 4 | -------------------------------------------------------------------------------- /src/layout/components/TabMenu/index.ts: -------------------------------------------------------------------------------- 1 | import TabMenu from './src/TabMenu.vue' 2 | 3 | export { TabMenu } 4 | -------------------------------------------------------------------------------- /src/layout/components/TagsView/index.ts: -------------------------------------------------------------------------------- 1 | import TagsView from './src/TagsView.vue' 2 | 3 | export { TagsView } 4 | -------------------------------------------------------------------------------- /src/layout/components/TagsView/src/helper.ts: -------------------------------------------------------------------------------- 1 | import type { RouteMeta, RouteLocationNormalizedLoaded } from 'vue-router' 2 | import { pathResolve } from '@/utils/routerHelper' 3 | 4 | export const filterAffixTags = (routes: AppRouteRecordRaw[], parentPath = '') => { 5 | let tags: RouteLocationNormalizedLoaded[] = [] 6 | routes.forEach((route) => { 7 | const meta = route.meta as RouteMeta 8 | const tagPath = pathResolve(parentPath, route.path) 9 | if (meta?.affix) { 10 | tags.push({ ...route, path: tagPath, fullPath: tagPath } as RouteLocationNormalizedLoaded) 11 | } 12 | if (route.children) { 13 | const tempTags: RouteLocationNormalizedLoaded[] = filterAffixTags(route.children, tagPath) 14 | if (tempTags.length >= 1) { 15 | tags = [...tags, ...tempTags] 16 | } 17 | } 18 | }) 19 | 20 | return tags 21 | } 22 | -------------------------------------------------------------------------------- /src/layout/components/ThemeSwitch/index.ts: -------------------------------------------------------------------------------- 1 | import ThemeSwitch from './src/ThemeSwitch.vue' 2 | 3 | export { ThemeSwitch } 4 | -------------------------------------------------------------------------------- /src/layout/components/UserInfo/index.ts: -------------------------------------------------------------------------------- 1 | import UserInfo from './src/UserInfo.vue' 2 | 3 | export { UserInfo } 4 | -------------------------------------------------------------------------------- /src/plugins/animate.css/index.ts: -------------------------------------------------------------------------------- 1 | import 'animate.css' 2 | -------------------------------------------------------------------------------- /src/plugins/elementPlus/index.ts: -------------------------------------------------------------------------------- 1 | import type { App } from 'vue' 2 | // 需要全局引入一些组件,如ElScrollbar,不然一些下拉项样式有问题 3 | import { ElLoading, ElScrollbar, ElButton } from 'element-plus' 4 | 5 | const plugins = [ElLoading] 6 | 7 | const components = [ElScrollbar, ElButton] 8 | 9 | export const setupElementPlus = (app: App) => { 10 | plugins.forEach((plugin) => { 11 | app.use(plugin) 12 | }) 13 | 14 | components.forEach((component) => { 15 | app.component(component.name, component) 16 | }) 17 | } 18 | -------------------------------------------------------------------------------- /src/plugins/svgIcon/index.ts: -------------------------------------------------------------------------------- 1 | import 'virtual:svg-icons-register' 2 | 3 | import '@purge-icons/generated' 4 | -------------------------------------------------------------------------------- /src/plugins/tongji/index.ts: -------------------------------------------------------------------------------- 1 | import router from '@/router' 2 | 3 | // 用于 router push 4 | window._hmt = window._hmt || [] 5 | // HM_ID 6 | const HM_ID = import.meta.env.VITE_APP_BAIDU_CODE 7 | ;(function () { 8 | // 有值的时候,才开启 9 | if (!HM_ID) { 10 | return 11 | } 12 | const hm = document.createElement('script') 13 | hm.src = 'https://hm.baidu.com/hm.js?' + HM_ID 14 | const s = document.getElementsByTagName('script')[0] 15 | s.parentNode.insertBefore(hm, s) 16 | })() 17 | 18 | router.afterEach(function (to) { 19 | if (!HM_ID) { 20 | return 21 | } 22 | _hmt.push(['_trackPageview', to.fullPath]) 23 | }) 24 | -------------------------------------------------------------------------------- /src/plugins/unocss/index.ts: -------------------------------------------------------------------------------- 1 | import 'virtual:uno.css' 2 | -------------------------------------------------------------------------------- /src/plugins/vueI18n/helper.ts: -------------------------------------------------------------------------------- 1 | export const setHtmlPageLang = (locale: LocaleType) => { 2 | document.querySelector('html')?.setAttribute('lang', locale) 3 | } 4 | -------------------------------------------------------------------------------- /src/router/index.ts: -------------------------------------------------------------------------------- 1 | import type { App } from 'vue' 2 | import type { RouteRecordRaw } from 'vue-router' 3 | import { createRouter, createWebHistory } from 'vue-router' 4 | import remainingRouter from './modules/remaining' 5 | 6 | // 创建路由实例 7 | const router = createRouter({ 8 | history: createWebHistory(import.meta.env.VITE_BASE_PATH), // createWebHashHistory URL带#,createWebHistory URL不带# 9 | strict: true, 10 | routes: remainingRouter as RouteRecordRaw[], 11 | scrollBehavior: () => ({ left: 0, top: 0 }) 12 | }) 13 | 14 | export const resetRouter = (): void => { 15 | const resetWhiteNameList = ['Redirect', 'Login', 'NoFind', 'Root'] 16 | router.getRoutes().forEach((route) => { 17 | const { name } = route 18 | if (name && !resetWhiteNameList.includes(name as string)) { 19 | router.hasRoute(name) && router.removeRoute(name) 20 | } 21 | }) 22 | } 23 | 24 | export const setupRouter = (app: App) => { 25 | app.use(router) 26 | } 27 | 28 | export default router 29 | -------------------------------------------------------------------------------- /src/store/index.ts: -------------------------------------------------------------------------------- 1 | import type { App } from 'vue' 2 | import { createPinia } from 'pinia' 3 | import piniaPluginPersistedstate from 'pinia-plugin-persistedstate' 4 | 5 | const store = createPinia() 6 | store.use(piniaPluginPersistedstate) 7 | 8 | export const setupStore = (app: App) => { 9 | app.use(store) 10 | } 11 | 12 | export { store } 13 | -------------------------------------------------------------------------------- /src/styles/FormCreate/fonts/fontello.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vue3/d9bcd8238f4827300656e080555ded97a19f8b83/src/styles/FormCreate/fonts/fontello.woff -------------------------------------------------------------------------------- /src/styles/FormCreate/index.scss: -------------------------------------------------------------------------------- 1 | // 使用字体图标来源 https://fontello.com/ 2 | 3 | @font-face { 4 | font-family: 'fc-icon'; 5 | src: url('@/styles/FormCreate/fonts/fontello.woff') format('woff'); 6 | } 7 | 8 | .icon-doc-text:before { 9 | content: '\f0f6'; 10 | } 11 | 12 | .icon-server:before { 13 | content: '\f233'; 14 | } 15 | 16 | .icon-address-card-o:before { 17 | content: '\f2bc'; 18 | } 19 | 20 | .icon-user-o:before { 21 | content: '\f2c0'; 22 | } 23 | -------------------------------------------------------------------------------- /src/styles/global.module.scss: -------------------------------------------------------------------------------- 1 | @use './variables.scss' as *; 2 | // 导出变量 3 | :export { 4 | namespace: $namespace; 5 | elNamespace: $elNamespace; 6 | } 7 | -------------------------------------------------------------------------------- /src/styles/index.scss: -------------------------------------------------------------------------------- 1 | @use './var.css'; 2 | @use './FormCreate/index.scss'; 3 | @use './theme.scss'; 4 | @use 'element-plus/theme-chalk/dark/css-vars.css'; 5 | 6 | .reset-margin [class*='el-icon'] + span { 7 | margin-left: 2px !important; 8 | } 9 | 10 | // 解决抽屉弹出时,body宽度变化的问题 11 | .el-popup-parent--hidden { 12 | width: 100% !important; 13 | } 14 | 15 | // 解决表格内容超过表格总宽度后,横向滚动条前端顶不到表格边缘的问题 16 | .el-scrollbar__bar { 17 | display: flex; 18 | justify-content: flex-start; 19 | } 20 | 21 | /* nprogress 适配 element-plus 的主题色 */ 22 | #nprogress { 23 | & .bar { 24 | background-color: var(--el-color-primary) !important; 25 | } 26 | 27 | & .peg { 28 | box-shadow: 29 | 0 0 10px var(--el-color-primary), 30 | 0 0 5px var(--el-color-primary) !important; 31 | } 32 | 33 | & .spinner-icon { 34 | border-top-color: var(--el-color-primary); 35 | border-left-color: var(--el-color-primary); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/styles/theme.scss: -------------------------------------------------------------------------------- 1 | // .text-color { 2 | // color: var(--el-text-color-regular); 3 | // } 4 | // .dark .dark\:text-color { 5 | // color: rgba(255, 255, 255, var(--dark-text-color)); 6 | // } 7 | -------------------------------------------------------------------------------- /src/styles/variables.scss: -------------------------------------------------------------------------------- 1 | // 命名空间 2 | $namespace: v; 3 | // el命名空间 4 | $elNamespace: el; 5 | -------------------------------------------------------------------------------- /src/types/configGlobal.d.ts: -------------------------------------------------------------------------------- 1 | import { ElementPlusSize } from './elementPlus' 2 | export interface ConfigGlobalTypes { 3 | size?: ElementPlusSize 4 | } 5 | -------------------------------------------------------------------------------- /src/types/contextMenu.d.ts: -------------------------------------------------------------------------------- 1 | export type contextMenuSchema = { 2 | disabled?: boolean 3 | divided?: boolean 4 | icon?: string 5 | label: string 6 | command?: (item: contextMenuSchema) => void 7 | } 8 | -------------------------------------------------------------------------------- /src/types/descriptions.d.ts: -------------------------------------------------------------------------------- 1 | export interface DescriptionsSchema { 2 | span?: number // 占多少分 3 | field: string // 字段名 4 | label?: string // label名 5 | mappedField?: string // 字段映射 6 | width?: string | number 7 | minWidth?: string | number 8 | align?: 'left' | 'center' | 'right' 9 | labelAlign?: 'left' | 'center' | 'right' 10 | className?: string 11 | labelClassName?: string 12 | dateFormat?: string // add by 星语:支持时间的格式化 13 | dictType?: string // add by 星语:支持 dict 字典数据 14 | } 15 | -------------------------------------------------------------------------------- /src/types/elementPlus.d.ts: -------------------------------------------------------------------------------- 1 | export type ElementPlusSize = 'default' | 'small' | 'large' 2 | 3 | export type ElementPlusInfoType = 'success' | 'info' | 'warning' | 'danger' 4 | -------------------------------------------------------------------------------- /src/types/icon.d.ts: -------------------------------------------------------------------------------- 1 | export interface IconTypes { 2 | size?: number 3 | color?: string 4 | icon: string 5 | } 6 | -------------------------------------------------------------------------------- /src/types/infoTip.d.ts: -------------------------------------------------------------------------------- 1 | export interface TipSchema { 2 | label: string 3 | keys?: string[] 4 | } 5 | -------------------------------------------------------------------------------- /src/types/layout.d.ts: -------------------------------------------------------------------------------- 1 | export type LayoutType = 'classic' | 'topLeft' | 'top' | 'cutMenu' 2 | -------------------------------------------------------------------------------- /src/types/localeDropdown.d.ts: -------------------------------------------------------------------------------- 1 | export interface Language { 2 | el: Recordable 3 | name: string 4 | } 5 | 6 | export interface LocaleDropdownType { 7 | lang: LocaleType 8 | name?: string 9 | elLocale?: Language 10 | } 11 | -------------------------------------------------------------------------------- /src/types/qrcode.d.ts: -------------------------------------------------------------------------------- 1 | export interface QrcodeLogo { 2 | src?: string 3 | logoSize?: number 4 | bgColor?: string 5 | borderSize?: number 6 | crossOrigin?: string 7 | borderRadius?: number 8 | logoRadius?: number 9 | } 10 | -------------------------------------------------------------------------------- /src/types/theme.d.ts: -------------------------------------------------------------------------------- 1 | export type ThemeTypes = { 2 | elColorPrimary?: string 3 | leftMenuBorderColor?: string 4 | leftMenuBgColor?: string 5 | leftMenuBgLightColor?: string 6 | leftMenuBgActiveColor?: string 7 | leftMenuCollapseBgActiveColor?: string 8 | leftMenuTextColor?: string 9 | leftMenuTextActiveColor?: string 10 | logoTitleTextColor?: string 11 | logoBorderColor?: string 12 | topHeaderBgColor?: string 13 | topHeaderTextColor?: string 14 | topHeaderHoverColor?: string 15 | topToolBorderColor?: string 16 | } 17 | -------------------------------------------------------------------------------- /src/utils/dateUtil.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Independent time operation tool to facilitate subsequent switch to dayjs 3 | */ 4 | // TODO 芋艿:【锁屏】可能后面删除掉 5 | import dayjs from 'dayjs' 6 | 7 | const DATE_TIME_FORMAT = 'YYYY-MM-DD HH:mm:ss' 8 | const DATE_FORMAT = 'YYYY-MM-DD' 9 | 10 | export function formatToDateTime(date?: dayjs.ConfigType, format = DATE_TIME_FORMAT): string { 11 | return dayjs(date).format(format) 12 | } 13 | 14 | export function formatToDate(date?: dayjs.ConfigType, format = DATE_FORMAT): string { 15 | return dayjs(date).format(format) 16 | } 17 | 18 | export const dateUtil = dayjs 19 | -------------------------------------------------------------------------------- /src/utils/formRules.ts: -------------------------------------------------------------------------------- 1 | const { t } = useI18n() 2 | 3 | // 必填项 4 | export const required = { 5 | required: true, 6 | message: t('common.required') 7 | } 8 | -------------------------------------------------------------------------------- /src/utils/formatter.ts: -------------------------------------------------------------------------------- 1 | import { floatToFixed2 } from '@/utils' 2 | 3 | // 格式化金额【分转元】 4 | // @ts-ignore 5 | export const fenToYuanFormat = (_, __, cellValue: any, ___) => { 6 | return `¥${floatToFixed2(cellValue)}` 7 | } 8 | -------------------------------------------------------------------------------- /src/utils/propTypes.ts: -------------------------------------------------------------------------------- 1 | import { VueTypeValidableDef, VueTypesInterface, createTypes, toValidableType } from 'vue-types' 2 | import { CSSProperties } from 'vue' 3 | 4 | type PropTypes = VueTypesInterface & { 5 | readonly style: VueTypeValidableDef 6 | } 7 | const newPropTypes = createTypes({ 8 | func: undefined, 9 | bool: undefined, 10 | string: undefined, 11 | number: undefined, 12 | object: undefined, 13 | integer: undefined 14 | }) as PropTypes 15 | 16 | class propTypes extends newPropTypes { 17 | static get style() { 18 | return toValidableType('style', { 19 | type: [String, Object] 20 | }) 21 | } 22 | } 23 | 24 | export { propTypes } 25 | -------------------------------------------------------------------------------- /src/utils/tsxHelper.ts: -------------------------------------------------------------------------------- 1 | import { Slots } from 'vue' 2 | import { isFunction } from '@/utils/is' 3 | 4 | export const getSlot = (slots: Slots, slot = 'default', data?: Recordable) => { 5 | // Reflect.has 判断一个对象是否存在某个属性 6 | if (!slots || !Reflect.has(slots, slot)) { 7 | return null 8 | } 9 | if (!isFunction(slots[slot])) { 10 | console.error(`${slot} is not a function!`) 11 | return null 12 | } 13 | const slotFn = slots[slot] 14 | if (!slotFn) return null 15 | return slotFn(data) 16 | } 17 | -------------------------------------------------------------------------------- /src/views/Error/403.vue: -------------------------------------------------------------------------------- 1 | 4 | 9 | -------------------------------------------------------------------------------- /src/views/Error/404.vue: -------------------------------------------------------------------------------- 1 | 4 | 8 | -------------------------------------------------------------------------------- /src/views/Error/500.vue: -------------------------------------------------------------------------------- 1 | 4 | 8 | -------------------------------------------------------------------------------- /src/views/Login/components/LoginFormTitle.vue: -------------------------------------------------------------------------------- 1 | 6 | 27 | -------------------------------------------------------------------------------- /src/views/Login/components/index.ts: -------------------------------------------------------------------------------- 1 | import LoginForm from './LoginForm.vue' 2 | import MobileForm from './MobileForm.vue' 3 | import LoginFormTitle from './LoginFormTitle.vue' 4 | import RegisterForm from './RegisterForm.vue' 5 | import QrCodeForm from './QrCodeForm.vue' 6 | import SSOLoginVue from './SSOLogin.vue' 7 | import ForgetPasswordForm from './ForgetPasswordForm.vue' 8 | 9 | export { LoginForm, MobileForm, LoginFormTitle, RegisterForm, QrCodeForm, SSOLoginVue, ForgetPasswordForm } 10 | -------------------------------------------------------------------------------- /src/views/Login/components/useLogin.ts: -------------------------------------------------------------------------------- 1 | import { Ref } from 'vue' 2 | 3 | export enum LoginStateEnum { 4 | LOGIN, 5 | REGISTER, 6 | RESET_PASSWORD, 7 | MOBILE, 8 | QR_CODE, 9 | SSO 10 | } 11 | 12 | const currentState = ref(LoginStateEnum.LOGIN) 13 | 14 | export function useLoginState() { 15 | function setLoginState(state: LoginStateEnum) { 16 | currentState.value = state 17 | } 18 | const getLoginState = computed(() => currentState.value) 19 | 20 | function handleBackLogin() { 21 | setLoginState(LoginStateEnum.LOGIN) 22 | } 23 | 24 | return { 25 | setLoginState, 26 | getLoginState, 27 | handleBackLogin 28 | } 29 | } 30 | 31 | export function useFormValid(formRef: Ref) { 32 | async function validForm() { 33 | const form = unref(formRef) 34 | if (!form) return 35 | const data = await form.validate() 36 | return data as T 37 | } 38 | 39 | return { 40 | validForm 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/views/Profile/components/index.ts: -------------------------------------------------------------------------------- 1 | import BasicInfo from './BasicInfo.vue' 2 | import ProfileUser from './ProfileUser.vue' 3 | import ResetPwd from './ResetPwd.vue' 4 | import UserAvatarVue from './UserAvatar.vue' 5 | import UserSocial from './UserSocial.vue' 6 | 7 | export { BasicInfo, ProfileUser, ResetPwd, UserAvatarVue, UserSocial } 8 | -------------------------------------------------------------------------------- /src/views/Redirect/Redirect.vue: -------------------------------------------------------------------------------- 1 | 4 | 29 | -------------------------------------------------------------------------------- /src/views/ai/chat/index/components/message/MessageLoading.vue: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 11 | 16 | -------------------------------------------------------------------------------- /src/views/ai/chat/manager/index.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 23 | -------------------------------------------------------------------------------- /src/views/ai/music/index/index.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 27 | -------------------------------------------------------------------------------- /src/views/ai/music/index/list/songInfo/index.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 23 | -------------------------------------------------------------------------------- /src/views/ai/music/index/title/index.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 26 | -------------------------------------------------------------------------------- /src/views/ai/utils/utils.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by 芋道源码 3 | * 4 | * AI 枚举类 5 | * 6 | * 问题:为什么不放在 src/utils/common-utils.ts 呢? 7 | * 回答:主要 AI 是可选模块,考虑到独立、解耦,所以放在了 /views/ai/utils/common-utils.ts 8 | */ 9 | 10 | /** 判断字符串是否包含中文 */ 11 | export const hasChinese = (str: string) => { 12 | return /[\u4e00-\u9fa5]/.test(str) 13 | } 14 | -------------------------------------------------------------------------------- /src/views/ai/write/index/components/Tag.vue: -------------------------------------------------------------------------------- 1 | 2 | 15 | 16 | 32 | 33 | -------------------------------------------------------------------------------- /src/views/crm/backlog/components/common.ts: -------------------------------------------------------------------------------- 1 | /** 跟进状态 */ 2 | export const FOLLOWUP_STATUS = [ 3 | { label: '待跟进', value: false }, 4 | { label: '已跟进', value: true } 5 | ] 6 | 7 | /** 归属范围 */ 8 | export const SCENE_TYPES = [ 9 | { label: '我负责的', value: 1 }, 10 | { label: '我参与的', value: 2 }, 11 | { label: '下属负责的', value: 3 } 12 | ] 13 | 14 | /** 联系状态 */ 15 | export const CONTACT_STATUS = [ 16 | { label: '今日需联系', value: 1 }, 17 | { label: '已逾期', value: 2 }, 18 | { label: '已联系', value: 3 } 19 | ] 20 | 21 | /** 审批状态 */ 22 | export const AUDIT_STATUS = [ 23 | { label: '待审批', value: 10 }, 24 | { label: '审核通过', value: 20 }, 25 | { label: '审核不通过', value: 30 } 26 | ] 27 | 28 | /** 回款提醒类型 */ 29 | export const RECEIVABLE_REMIND_TYPE = [ 30 | { label: '待回款', value: 1 }, 31 | { label: '已逾期', value: 2 }, 32 | { label: '已回款', value: 3 } 33 | ] 34 | 35 | /** 合同过期状态 */ 36 | export const CONTRACT_EXPIRY_TYPE = [ 37 | { label: '即将过期', value: 1 }, 38 | { label: '已过期', value: 2 } 39 | ] 40 | -------------------------------------------------------------------------------- /src/views/crm/customer/limitConfig/index.vue: -------------------------------------------------------------------------------- 1 | 17 | 23 | -------------------------------------------------------------------------------- /src/views/erp/home/components/SummaryCard.vue: -------------------------------------------------------------------------------- 1 | 11 | 22 | -------------------------------------------------------------------------------- /src/views/infra/codegen/components/index.ts: -------------------------------------------------------------------------------- 1 | import BasicInfoForm from './BasicInfoForm.vue' 2 | import ColumInfoForm from './ColumInfoForm.vue' 3 | import GenerateInfoForm from './GenerateInfoForm.vue' 4 | export { BasicInfoForm, ColumInfoForm, GenerateInfoForm } 5 | -------------------------------------------------------------------------------- /src/views/infra/druid/index.vue: -------------------------------------------------------------------------------- 1 |