1.0.0-rc7 • Published 7 months ago

@ahcui/vue3-multiplex v1.0.0-rc7

Weekly downloads
-
License
MIT
Repository
-
Last release
7 months ago

@ahcui/vue3-multiplex框架核心组件文档

组织:ahcui

当前版本: @ahcui/vue3-multiplex@1.0.0-rc7

使用时,请明确使用的版本号,请勿使用^1.0.0或~1.0.0之类模糊的版本!

演示地址:

http://www.ahcui.com

效果图如下:

查看框架核心组件项目模板

服务支持

进群获取更详细文档

请扫码或点击图片进群获取更详细文档,密码为群名称。

1:版本演化

V1.0.0-rc7新特性

特性继承自rc5版本,仅修改部分已知问题

V1.0.0-rc7升级内容

处理多页面模式下页面加载与切换时导致的url变成小写的问题

优化多页面模式的按需加载过程与props传参方式

依赖升级

定制说明

如果此前端框架提供的配置项无法实现您的需求时,您可以选择:

1:入群联系开发者,由开发者甄别是否在不影响框架复杂配置与切换机制的前提下,能够融入您的界面需求;

2:通过扩展坞机制或vue3的teleport实现

3:最终用户对界面布局与风格没有配置要求,且界面元素与客户要求无差别,仅在配色上存在差别,您首先通过配置实现界面布局,然后通过注入css样式实现之;

4:其他未尽事宜请联系框架开发者

本组件免费使用,但定制开发与技术支持可能会产生费。

2:开发说明

2.1:如何获取一个开发环境

框架以NPM组件的方式提供,并且提供项目开发模板,这使得项目开发模板的目录结构极其简单,开发模板中有如何启用/引入框架的基本代码,您只需要关注您的业务页面得开发。

框架核心组件无法直接运行,您需要一个vue工程。点击查看或下载在gitee上的示例工程,以源码方式,手把手教你如何引入、使用框架。您也可以自己搭建一个工程,仿照示例工程引入框架核心库。

3:组件开放对象

3.1:组件内核公开点

export {
	vue, app, cuiapi, router, store, mixin, elementPlus, axios, auth, NameSpace, namespace, eventDefine, eventBus, version ,runtimeCfg
}

使用框架核心组件,意味着您需要使核心组件提供的导出组件,创建过程由框架核心库完成并导出到项目中,开发者通过调用API来完成项目内的扩展需要。

3.1.1:app

app公开了核心组件内部通过vue的API接口createApp构建的应用对象,此对象没有安装任何VUE插件,您仍需要在项目中调用use安装插件,例如:

import { app, router, store , elementPlus } from "@ahcui/vue3-multiplex";

 app
 .use(router)
 .use(store)
 .use(elementPlus, { size: 'small', zIndex: 3000 })
 .mount('#app');
 

tips:具体代码请查看示例工程

3.1.2:vue

这里完整导出vue,伪代码如下:

export * from 'vue';

您可以在工程中引入该组件使用vue,如:

//引入框架导出的vue
import{vue} from '@ahcui/vue3-multiplex';

const index=vue.ref(0);

也可以 使用

//引入vue
import{ref} from 'vue';

const index=ref(0);

tips:使用@ahcui/vue3-multiplex公开的vue对象可以借助开发工具的接口发现可以自动提示,原生引入vue需要您自行查找定义与API接口

3.1.3:api

API接口请参照3.4:cuiapi节的单独介绍

3.1.4:router

核心组件内构建router,注册内置拦截器,并完整导出vue-router,供外部扩展与使用伪代码如下:

const router = new createRouter({})

内置路由默认注册了4个默认路由地址:

  • 核心库UI的挂载点,请参考3.2:UI界面挂载点

  • 默认首页面dashboard;

  • 403页面;

  • 404页面;

项目中注册router时,请通过VUE-Router的API接口addRoute进行扩展

3.1.5:store

核心组件内构建vuex,用于存储核心组件的内置状态,并完整导出vuex,供外部扩展与使用,

项目中注册存储模块时,请通过VUEX的API接口registerModule进行扩展

3.1.6:mixin

非vue2中的混入,此库将常用对象进行封装,可以直接在组件中导入使用:

import { mixin} from '@ahcui/vue3-multiplex';
setup(){
	const {
		/**
		* 前端运行的虚拟目录,取值自runtimeCfg.app_public_path,引入资源时需要将此作为前缀
		*/
		basePath,
		/**
		* 当前路由信息 = useRoute()
		*/
		cuiRoute,
		/**
		* 路由定义信息,@ahcui/vue3-multiplex导出的router对象
		*/
		cuiRouter,
		/*
		* 核心组件认证对象
		*/
		cuiAuth,
		/**
		* 状态定义信息,@ahcui/vue3-multiplex导出的vuex对象
		*/
		cuiStore,
		/**
		* Axios实例
		*/
		cuiAxios,
		/**
		* 全局事件总线,@ahcui/vue3-multiplex导出的eventBus对象
		*/
		cuiEventbus
	} = mixin();
}

3.1.7:elementPlus

核心组件默认引入Element-Plus的主题样式,语言、以及核心库对组件的主题自动适配。

开发者无需手动操作,这是内置能力。

3.1.8:axios

核心库导出一个默认的axios操作实例。

3.1.9:console

核心库对控制台输出的控制,可以通过外置配置文件app_log_open设置日志开关,外置配置文件请参考组件外置配置

3.1.10:auth

核心组件提供的用户认证信息的初始化入口,auth对象提供一个createAuth初始化函数,函数接受一个配置,配置结构如下:

{
	/**
	 * 必须实现
	 * 当前登录用户名字符串
	 * 数据示例:"admin",
	 * @return 返回用户名字符串
	 */
	getUserName:function(){
		return ""
	},
    /**
     * 必须实现
     * 当前登录用户名字符串
     * 数据示例:"zerostyle",
	 * @return 返回用户真实名称字符串
     */
    getRealName () {
		return "";
	  },
	/**
	 * 非必须实现
	 * 用户的权限完整信息,JSON对象,结构自定义,框架中仅做保存,未使用,以备业务需要
	 * 数据示例:{权限JSON对象,结构自定义,框架中仅做保存,未使用,以备业务需要}
	 * @return 返回用户权限信息原示数据
	 */
	getPermission(){
		//数据转换操作
		return Object;
	},
	/**
	 *
	 * 必须实现
	 * 用户资源菜单为树状结构
	 * 结构如下:
	 *      [{
	 *           resId:"菜单唯一识别符,必选",
	 *           iconColor:"#000,代表菜单图标字体颜色,可选",
	 *           iconClass:"fa fa-bus 字体字库名称,代表菜单图标,可选",
	 *           resPath:"菜单url路径,第一级非必选,二级及以下菜单必选",
	 *           resName:"菜单名称文字",
	 *           children:[{
	 *				 resId:"菜单唯一识别符,必选",
	 *               iconColor:"#000,代表菜单图标字体颜色,可选",
	 *               iconClass:"fa fa-bus 字体字库名称,代表菜单图标,可选",
	 *               resPath:"菜单url路径,第一级非必选,二级及以下菜单必选",
	 *               resName:"菜单名称文字"},
	 *               {...},
	 *               {...}]
	 *          }],
	 * @return 模块树状菜单
	 */
	getModulesTree(){ 
		//数据转换操作
		return Array;
	},
	/**
	 * 非必须
	 * 为使用jwt等模式的登陆时预留
	 * 在REST无会话模式下使用的票据信息
	 * @return token
	 */
	getToken(){
		return "";
	},
}

tips 1:函数体return之前您可以转换您的数据格式为@ahcui/vue3-multiplex使用的数据;

3.1.11:NameSpace

核心组件增加对命名空间的支持。命名空间用于隔离应用公开的变量,避免多个应用在集成时存在同名变量而丢失变量的问题,该库来源自@ahcui/lib-jsext组件。

3.1.12:namespace

核心组件注册的命名空间,可以在window下直接访问,格式大致如:window.ahcui.software.frame,这是核心库的命名空间,请区别项目的命名空间。

3.1.13:eventDefine

事件是核心库的重要组成部分,也是组件化后需要考虑的对外消息通知点,优秀的事件定义描述将有效的帮助开发人员鉴别消息,此内容将另外展开描述,点击查看详情

3.1.14:eventBus

事件是核心库的重要组成部分,也是组件化后需要考虑的对外消息通知点,全面的事件触发机制将是开发者可以灵活订阅消息,充分利用观察者模式来处理相应操作。 此内容将另外展开描述,点击查看详情

全局事件总线。为了便于开发者进行二次开发,框架存在诸多的事件通知,eventBus是事件通知的一种,这种方式请见eventDefine对事件的订阅方式

3.1.15:version

@ahcui/vue3-multiplex组件的版本信息描述。其描述信息如下:

{
    name:"@ahcui/vue3-multiplex",
    release:"发布版本",
    developer:"开发者",
    email:"开发者邮箱",
}

3.1.16:runtimeCfg

运行时配置作为@ahcui/vue3-multiplex核心库的重点特色,将另外展开描述,点击查看详情

3.2:UI界面挂载点

框架核心库的界面UI默认挂在路由名为"@ahcui/vue3-multiplex",路径为"/"的节点上,UI的路由定义伪代码如下:

   {
     path: '/',
     name: "@ahcui/vue3-multiplex",
     component: @ahcui/vue3-multiplex UI组件,
   },

tips 1:您可以在工程中通过VUE-Router的API接口addRoute(route: RouteRecordRaw): () => void进行调整,

tips 2:模板工程中,通过使用VUE-Router的API接口addRoute(parentName: string | symbol, route: RouteRecordRaw): () => void将使用框架的路由页面注册到框架路由下

3.3:组件内核事件

组件事件通知分为事件定义与事件通知两部分

3.3.1 事件定义

核心组件(rc4版本调整了事件定义)开放的事件定义信息,所有事件定义如下:

{
 
     header:{
        menuItemClicked:"头部菜单点击事件,此时路由地址已变化,函数签名:({module:菜单对应的模块信息})",
    },
    sidebar:{
        main:{
          menuItemClicked:"侧边栏无子菜单项的主菜单项被点击后所触发的事件,框架对此事件进行了路由切换的操作,外部还可以监听进行其他处理,函数签名:({module:菜单对应的模块信息})",
          subMenuOpen:"侧边栏有子菜单项的主菜单项被展开时触发的事件,框架不响应此事件,仅传出事件,外部可以监听进行其他处理,函数签名:({module:菜单对应的模块信息,state:扩展信息})",
          subMenuClose:"侧边栏有子菜单项的主菜单项被关闭时触发的事件,框架不响应此事件,仅传出事件,外部可以监听进行其他处理,函数签名:({module:菜单对应的模块信息,state:扩展信息})",
        },
        sub:{
          menuItemClicked:"侧栏双菜单模式时,副菜单的最终极菜单项被点击后所触发的事件,框架对此事件进行了路由切换的操作,外部还可以监听进行其他处理",
          subMenuOpen:"侧边双菜单模式时,有子菜单项的副菜单项被展开时触发的事件,框架不响应此事件,仅传出事件,外部可以监听进行其他处理,函数签名:({module:菜单对应的模块信息})",
          subMenuClose:"侧边双菜单模式时,有子菜单项的副菜单项被关闭时触发的事件,框架不响应此事件,仅传出事件,外部可以监听进行其他处理,函数签名:({module:菜单对应的模块信息})",
        }  
    },
    content:{
        multipage:{
            changeCurrentTab:"当多页面模式时,切换多页面的选项卡时触发本事件,函数签名:({oldValue:原选项卡名称,newValue:新选项卡名称,allowChange:允许切换})",
        },
        singlepage:{

        },
        refreshcurrentroute:"刷新当前工作区",
    },
 
     "changedSideBarCollapse":"修改侧边栏区域展开合并设置,函数签名:(旧状态布尔值,新状态布尔值);如启用,则自动增加样式名:cui-style-layout-sidebar-collapse",
     "changedSideBarClassName":"设置侧边栏风格样式,函数签名:(旧模式字符串,新模式字符串);取值:cui-style-theme-sidebar-dark,cui-style-theme-sidebar-light,切换风格则自动设置为相应状态的样式名",
     "changedHeaderBarClassName":"设置头部风格样式,函数签名:(旧模式字符串,新模式字符串);取值:cui-style-theme-header-dark,cui-style-theme-header-light,cui-style-theme-header-color,切换风格则自动设置为相应状态的样式名",
     "changedControlClassName":`修改界面风格(主题)设置,函数签名:(旧模式字符串,新模式字符串);取值:cui-style-theme-color-1[-8],切换风格则自动设置为相应状态的样式名,`,
     "changedControlCustomColor":`当changedControlClassName为cui-style-theme-color-custom时,由用户指定的主色调,`,
     "changedDarkMode":"修改黑暗模式设置,函数签名:(旧状态布尔值,新状态布尔值);bool值:是/否,如启用,则自动增加样式名:cui-style-theme-dark",
     "changedNavigationMode":"修改导航模式,函数签名:(旧模式字符串,新模式字符串);取值:cui-style-layout-nav-mode-side:左侧菜单布局(所有级别,侧边显示,向下展开),cui-style-layout-nav-mode-header:顶部菜单布局(所有级别,头部显示,向下展开),cui-style-layout-nav-mode-mixture:混合菜单布局(顶部显示一级菜单,侧边为二级及以下),切换模式则自动设置为相应状态的样式名",
     "changedDoubleSidebar":"侧栏双排菜单模式,函数签名:(旧状态布尔值,新状态布尔值);如启用,则自动增加样式名:cui-style-layout-doublesidebar",
     "changedBodyBespread":"修改内容区域铺满设置,函数签名:(旧状态布尔值,新状态布尔值);如启用,则自动增加样式名:cui-style-layout-bodybespread",
     "changedFixedHeader":"修改固定顶栏区域设置,函数签名:(旧状态布尔值,新状态布尔值);如启用,则自动增加样式名:cui-style-layout-fixedheader",
     "changedFixedSidebar":"修改固定侧边栏区域设置,函数签名:(旧状态布尔值,新状态布尔值);如启用,则自动增加样式名:cui-style-layout-fixedsidebar",
     "changedFixedBody":"修改固定主题区域设置,函数签名:(旧状态布尔值,新状态布尔值);如启用,则自动增加样式名:cui-style-layout-fixedbody",
     
     "changedLogoAuto":"",
     "changeSidebarIconColorful":"修改侧边栏图标为彩色,函数签名:(旧状态布尔值,新状态布尔值);",
     "changeShowFooter":"修改显示全局页脚,函数签名:(旧状态布尔值,新状态布尔值);如启用,则自动增加样式名:cui-style-layout-showfooter",
     "changeColorWeakMode":"修改色弱模式,函数签名:(旧状态布尔值,新状态布尔值);如启用,则自动增加样式名:",
     "changeMultiPageMode":"修改多页面模式,函数签名:(旧状态布尔值,新状态布尔值);无论是否启用,页面都不含影响此模式的样式名称",
     "changeTabsStyle":"修改(多页面模式时)选项卡的样式,函数签名:(旧样式名,新样式名);",
     "changeMenuIconBGColorMode":"更改菜单栏按钮背景色为彩色/默认时触发:(旧样式名,新样式名);",
     "changeLogoAreaAutoWidth":"更改左上角Logo区域宽度布局模式时触发,只在导航为cui-style-layout-nav-mode-header模式时有效",
     "changeLoadingAnimation":"更改页面加载动画时触发",

     "changeSideBarMainMenuDefaultWidth":"当修改侧边栏主菜单默认状态下的宽度时触发",
 
     "changeSideBarMainMenuCollapseWidth":"侧边栏在cui-style-layout-nav-mode-side/cui-style-layout-nav-mode-mixture状态+主菜单收缩模式,调整主菜单项的宽度时触发",
     "changeSideBarMainMenuDoubleWidth":"侧边栏在cui-style-layout-nav-mode-side/cui-style-layout-nav-mode-mixture状态+双菜单栏模式下,调整主菜单项的宽度时触发",
     "changeSideBarMainMenuDoubleHeight":"侧边栏在cui-style-layout-nav-mode-side/cui-style-layout-nav-mode-mixture状态+双菜单栏模式,调整主菜单项的高度时触发",
     "changeSideBarMainMenuDoubleIconSize":"侧边栏在cui-style-layout-nav-mode-side/cui-style-layout-nav-mode-mixture状态+双菜单栏模式,调整主菜单项的图标大小时触发",
     "changeSideBarMainMenuItemHeight":"当修改侧边栏主菜单菜单项高度时触发",
     "changeSideBarMainMenuItemIconTextMargin":"当修改侧边栏主菜单菜单项图标与文字间距时触发",
     "changeSideBarMainMenuItemIconSize":"当修改侧边栏主菜单菜单项图标大小时触发",
     "changeSideBarMainMenuItemFontSize":"当修改侧边栏主菜单菜单项文字大小时触发",

     "changeHeaderHeight":"当修改头部高度时触发",
     "changeHeaderMenuItemPadding":"当修改头部菜单的菜单项间距时触发",
 
     "haSubModulesWhenChangeToDoubleSidebar":"当界面修改为双菜单模式时,当前页面的显示存在双菜单并会显示时触发本事件,函数签名(当前页面的父模块对象)",
     "changedDoubleSidebarData":"当界面为双菜单模式时,父模块选中状态改变时,会导致子菜单数据变更,函数签名(父模块对象,子菜单的数据列表)",
     "closeCuiSetting":"当关闭框架设置对话框时触发,函数签名:(配置信息的JSON对象);",
  
 }

3.3.2 事件通知

事件会以两种方式传出,一种是以原生window.CustomEvent自定义事件的方式传出,订阅事件代码如下:

	//这是某个js文件
	import {eventDefine} from "@ahcui/vue3-multiplex";
	
	1:通过浏览器自定义事件机制,适用于原生js:
	window.addEventListener(eventDefine.事件定义,function(eventArgs){
		let args=eventArgs.detail;//这里是事件参数
		///something
	});
	
 

,一种是借助全局事件总线eventBus在vue组件中使用,使用代码如下:

	//这是某个vue文件
	import { vue, eventBus, eventDefine } from "@ahcui/vue3-multiplex";
	export default {
		setup(){
			vue.onMounted(()=>{
				eventBus.on(eventDefine.事件定义,(eventArgObj)=>{
					console.log("接收到事件");
					let args1=eventArgObj[xxx];//这里是事件参数1
					let args2=eventArgObj[xxx];//这里是事件参数2
					//...
					///something
				 })
			});
		}
	}

两种事件通知机制的使用,可兼顾原生js文件与当前框架使用的vue技术栈。

3.4:cuiapi

API是UI框架提供的接口,API接口基于界面组件,如多页面模式的添加选项卡接口,必须是在多页面模式下才有此接口,否则调用后会抛出"页面中不存在相应此事件的组件Content.MultiPage,此调用无效"的错误

3.4.1:头部API

openSetting:打开核心库UI界面设置抽屉框

closeSetting:关闭核心库UI界面设置抽屉框

调用API的代码示例如下:

import{cuiapi} from '@ahcui/vue3-multiplex';

export default {
    name:"dashboard",

    setup(){

        const click1 = ()=>{
            cuiapi.header.openSetting();
        }
        const click2 = ()=>{
            cuiapi.header.closeSetting();
        }

        return {
            click1,
            click2,
        }
    }
}

3.4.2:工作区API

  • 公共API:
    		/**
    		 * 刷新当前工作区的api,不区分单页面还是多页面,两者共用
    		 */
    		refreshCurrent()
    	

调用公共API的代码示例如下:

import{cuiapi} from '@ahcui/vue3-multiplex';

export default {
    name:"dashboard",

    setup(){

        const refresh = ()=>{
            cuiapi.content.refreshCurrent();
        }
		return{
			refresh,
		}
	}
}
  • 多页面模式API:
	
	    /**
         * !!!Deprecated 
         * 弃用,请见下方的rc4版本升级内容
         * 添加一个新的tab页面,新页面会首先判断name是否是路由地址,如果是路由地址,则会跳入路由地址,面包屑会使用路由定义的title
         * @param {*} title 页面标题
         * @param {*} name 页面唯一字符串,通过框架UI菜单操作默认传入的是路径(路由地址)
         * @param {*} componentInfo 组件对象
         * @param {*} componentProps 组件默认参数
         * @param {*} data 扩展数据,通过框架UI菜单操作默认传入的是菜单模块信息
         */
        addTab(title,name,componentInfo,componentProps,data)
		
        /**
         * !!!New
         * 新增,rc4版本新增api
         * 添加一个新的tab页面,因此API用于用户自定义操作,该API只做增加选项卡的动作,不做跳转、激活等动作,如有其他动作,请结合其他API进行组合使用
         * @param {string} title 页面标题
         * @param {string} name 页面唯一字符串,用户自定义唯一识别符,如希望使用路由地址对应的组件,请使用addTabByRoutePath
         * @param {vue} componentInfo 组件对象
         * @param {object} componentProps 组件默认参数
         * @param {object} data 扩展数据,通过框架UI菜单操作默认传入的是菜单模块信息
         */
         addTabByCustomName : (title,name,componentInfo,componentProps,data)
        
        /**
         * !!!New
         * 新增,rc4版本新增api
         * 添加一个新的tab页面,因添加的选项卡与路由定义由匹配关系,所以会影响title和面包屑,不做跳转、激活等动作,如有其他动作,请结合其他API进行组合使用
         * @param {string} title 页面标题
         * @param {string} routePath 路由地址(必须是路由中存在的地址),如希望使用非路由中的组件,请使用addTabByCustomName
         * @param {object} componentProps 组件默认参数(此参数为undefined的情况下,会使用路由定义中的默认参数)
         * @param {object} data 扩展数据,通过框架UI菜单操作默认传入的是菜单模块信息
         */
         addTabByRoutePath : (title,routePath,componentProps,data)
		
	    /*
         * 获取当前选中项的信息
         * @returns {index:索引,tabItem:调用addTab时传入的信息}
         */
        getCurrentTabInfo()
		
	    /**
         * 通过索引设置当前选中项
         * @param {*} index 
         */
        setCurrentTabByIndex(index)

	    /**
        * !!!Changed 
        * 修改,请见下方的rc4版本升级内容
        * 通过名称(默认是路由地址,如果是自己创建的tab,则传入自定义的名称)设置当前选中项
        * @param {*} path 通过框架UI操作默认是路由地址,如果是自己创建的tab,则传入自定义的名称
        */
        setCurrentTabByPath(path)

	    /**
         * 通过索引关闭指定的tab
         * @param {*} index 
         */
        closeTabByIndex(index)

        /**
         * 通过名称(默认是路由地址,如果是自己创建的tab,则传入自定义的名称)关闭指定的tab
         * @param {*} path 通过框架UI操作默认是路由地址,如果是自己创建的tab,则传入自定义的名称
         */
        closeTabByPath(path)

        /**
         * 获取tab的数量
         */
        getTabsLength:()


		

调用多页面模式API的代码示例如下:

import{cuiapi} from '@ahcui/vue3-multiplex';

export default {
    name:"dashboard",

    setup(){

        const openNewTab1 = ()=>{
            cuiapi.content.multipage.addTab("你好","dasfdfd",example,{name:"world"},{});
        }
		return {
            openNewTab1,
		}
	}
}
  • 单页面模式API:
暂无API

4:组件外置配置

运行时配置为编译后的项目提供了可配置与调整的能力。

运行时配置信息,具体内容请复制如下内容项目文件中,并使前端程序在运行时能够加载此文件内容。

前端模板工程对本组件的配置进行了扩展,并提供项目完整配置文件:static\js\runtime\config.js,无需创建。

     {

         /**
        * 前端程序发布路径,该配置项仅在生产模式(build)启作用
        * example:"/cui/vue/" 
        * default:"/"
        * 此配置项是为了配合在容器环境的虚拟路径下发布程序使用,如不想把程序放入容器根路径下,则需要配置此项为需要的目录
        * 如想把程序发布到"http://ip:port/cui/"下("cui"为创建的虚拟路径或站点下cui目录)
        * 配置了此项后,项目资源路径会指向该目录下(dist目录下的结构不变),同时在生产环境下在nginx的根目录创建此目录并作目录映射,
        * */
        __app_public_path__ : "/",

        __app_logo_url__ :'/static/img/logo.png',

        __app_project_name__ :'ahcui',

        __app_page_title__ : "@ahcui框架",

        __app_page_keyWords__ : "请输入您想设置的应用关键字",
        
        __app_page_description__ : "请输入您想设置的应用说明",

        /**
        * RestApi后端接口基地址,该配置项在开发与生产模式下均有效
        * 该基地址用于配置代理使用,因此必须是当前应用地址的子路径,末尾不加'/'
        * example1:"/restful/api" 
        * example2:"http://localhost:8080/restful/api"
        * 
        * 
        */
        __rest_base_path__ : "/restful/api",
        
        
        __page_hid_topbottom__ : false,
        
        __page_hid_sidebar__ : false,

        __multiplex_console__:{
            debug:{
                open: true,
            },
            error:{
                open: true,
            },
            info:{
                ope_: true,
            },
            log:{
                open: true,
            },
            warn:{
                open: true,
            },
        },

        __multiplex_style__:
        {
            /**
             * 是否收缩侧边栏,boolean
             * 如启用,则自动增加样式名:cui-style-layout-sidebar-collapse
             * 
             */
            sideBarCollapse:false,
            /**
             * 侧边栏样式名称
             * 取值:
             * cui-style-theme-sidebar-dark
             * cui-style-theme-sidebar-light
             */
            sideBarClassName: 'cui-style-theme-sidebar-dark',

            /**
             * 顶栏设置
             * 取值:
             * cui-style-theme-header-dark
             * cui-style-theme-header-light
             * cui-style-theme-header-color
             * 
             */
            headerBarClassName: 'cui-style-theme-header-dark',

            /**
             * 界面风格名称
             */
            controlClassName: 'cui-style-theme-color-2',

            /**
             * 当界面风格名称为自定义:cui-style-theme-color-custom 时,由用户指定的颜色
             */
            controlCustomColor:'#000',
            /**
             * 黑暗模式
             */
            darkMode: false,

            /**
             * 导航模式
             * 取值:
             * cui-style-layout-nav-mode-side:左侧菜单布局(所有级别,向下展开)
             * cui-style-layout-nav-mode-header:顶部菜单布局(所有级别,向下展开)
             * cui-style-layout-nav-mode-mixture:混合菜单布局(顶部为一级,测边为二级及以下)
             */
            navigationMode: 'cui-style-layout-nav-mode-mixture',

            /**
             * 侧栏双排菜单模式
             * 如启用,则自动增加样式名:cui-style-layout-doublesidebar
             */
            doubleSidebar: false,

            /**
             * 内容区域铺满模式
             * 如启用,则自动增加样式名:cui-style-layout-bodybespread
             */
            bodyBespread: false,

            /**
                * 是否固定顶栏区域
                * 如启用,则自动增加样式名:cui-style-layout-fixedheader
                */
            fixedHeader: false,

            /**
                * 是否固定侧边栏区域
                * 如启用,则自动增加样式名:cui-style-layout-fixedsidebar
                */
            fixedSidebar: false,

            /**
                * 是否固定主体区域
                * 如启用,则自动增加样式名:cui-style-layout-fixedbody
                */
            fixedBody: false,

            /**
                * logo宽度自动
                */
            logoAuto: false,

            /**
                * 侧栏彩色图标
                */
            sidebarIconColorful: false,

            /**
                * 显示页脚,则自动增加样式名:cui-style-layout-showfooter
                */
            showFooter: false,

            /**
                * 色弱模式
                */
            colorWeakMode: false,

            /**
                * 使用多页面模式
                */
            multiPageMode: true,

            /**
                 * 多标签页样式
                 */
            tabsStyle: '',

            /**
             * 启用菜单栏图标背景的彩色模式
             */
            menuIconBGColorMode: false,

            /**
             * logo区域宽度自动
             */
            logoAreaAutoWidth:true,

            /**
             * 加载动画
             */
            loadingAnimation:1,

            detail:{
                sidebar:{
                    sideBarMainMenuDefaultWidth:200,
                    sideBarMainMenuCollapseWidth:50,
                    sideBarMainMenuDoubleWidth:70,
                    sideBarMainMenuDoubleHeight:50,
                    sideBarMainMenuDoubleIconSize:18,
                    sideBarMainMenuItemHeight:50,
                    sideBarMainMenuItemIconTextMargin:4,
                    sideBarMainMenuItemIconSize:14,
                    sideBarMainMenuItemFontSize:14
                },
                header:{
                    headerUserInfoMenus:[
                        /*
						右上角用户下拉菜单内容项
						icon:图标,label:文字,event:点击后的事件名,会通过全局事件触发,请注意接收处理
						/*
						/*{icon:"",label:"修改密码",event:"changePasswd"},*/
                        {icon:"fa fa-user-o",label:"个人信息",event:"showuserinfo"},
                        {icon:"fa fa-cog",label:"主题设置",event:"styleSetting",divided:false},
                        {icon:"fa fa-sign-out",label:"退出登录",event:"logout",divided:true}
                    ],
                    headerHeight:48,
                    headerMenuItemPadding:20,
                }
            }
        },

        __multiplex_config__:{
            show:true,
            /**
             * 第一列配置项
             */
            "10000":{
                show:true
            },
            /**
             * 第二列配置
             */
            "20000":{
                show:false
            },
            "30000":{
                show:false
            },
            "40000":{
                show:false
            },
        },

        __multiplex_animate__:{
			/**工作区切入时的动画样式*/
            router_view_enter_active_class:"",
			/**工作区切出时的动画样式*/
            router_view_leave_active_class:""
        },
    
    
        /***************************************配置项均在此配置项之上,配置文件结束标记,以下配置项请勿删除***********************************************/
        ______finished______:""
    }

你也可以在项目中抽离配置信息放入本文件中,例如项目中提取一个配置项

	customConfig:{
		a:1,
		b:'123',
		c:{
			c1:"s",
		}
	}

您可以在配置中增加相应代码,如下:

window.__cui_runtime_config__ = {
	...其他配置项
	
	/*******************************************************自定义配置项请添加到下方****************************************************************/
	__customConfig__:{
		a:1,
		b:'123',
		c:{
			c1:"s",
		}
	},
	/***************************************配置项均在此配置项之上,配置文件结束标记,以下配置项请勿删除***********************************************/
	______finished______:""
}

tips 1:配置内容您可以部分或者整体保存入数据库,通过接口返回来实现不同用户、机构、岗位配置不同;

5:二次开发

5.1:订阅框架事件来进行自定义处理

3.3:组件内核事件中已经对事件定义与使用进行了介绍,此处不再复述,请查看文档相应章节

5.2:通过调用框架API函数

3.4:api中已经对API接口进行了介绍,此处不再复述,请查看文档相应章节

5.3:对界面UI进行扩展

自@ahcui/vue3-multiplex@1.0.0-rc1 版本增加了扩展坞定义,开发者可以根据自己的需要对扩展坞进行自定义

扩展坞位置为红框所示如下:

查看框架核心组件项目模板

扩展方案可参考web components与vue3 teleport两种,前者基于原生web标准,后者使用vue3新功能,具体使用请见模板工程.

5.4 黑暗模式的开发

5.4.1:黑暗模式的识别

5.4.1.1:按需获取

一种用于JS代码中,可以通过判断运行时配置信息实现:

import {runtimeCfg} from '../../../assets/core';
export default {
    components:{},
    props:{},
    setup() {
        let isDarkMode=vue.ref(runtimeCfg.multiplex_style.darkMode);
        return {
            isDarkMode,
        }
    }
}

一种用于css代码中,开启黑暗模式会在body标签中增加独立的class名称"cui-style-theme-dark",您可以使用选择器对页面进行独立控制或处理

<body class="cui-style-theme-dark">
		<div id="app" class="cui-multiplex">
			<div class="cui-layout cui-theme cui-style-layout-nav-mode-side cui-style-theme-dark cui-style-theme-header-light cui-style-theme-sidebar-dark cui-style-theme-color-2 cui-style-layout-sidebar-collapse cui-style-layout-doublesidebar cui-style-layout-fixedbody" >
			....
			</div>
		</div>	
</body>

您可以使用以下类似代码实现黑暗模式下的某元素样式控制

.cui-style-theme-dark .cui-multiplex .cui-theme ....到您的dom元素
{
	background:var(--element-ui-color-dark-mode-bg1) #这里使用了一个变量来设置背景色,您也可以使用明确的颜色值
}
5.4.1.2:实时监听

这种方式通过@ahcui/vue3-multiplex事件机制实时将变更动作传出,您可以监听changedDarkMode的事件定义,举一种代码实现如下:

//这是某个vue文件
import { vue, eventBus, eventDefine } from '../../../assets/core';
export default {
		setup(){
			vue.onMounted(()=>{
				eventBus.on(eventDefine.changedDarkMode,(eventArgObj)=>{
					console.log("接收到事件");
					let args1=eventArgObj[xxx];//这里是事件参数1
					let args2=eventArgObj[xxx];//这里是事件参数2
					//...
					///something
				 })
			});
		}
	}

事件使用请见3.3.2

5.4.2:如何开发支持黑暗模式切换的项目

  • 推荐使用原生dom编写与布局有关的结构,如左右结构的工作区,上下结构的工作区,此内容不应设置背景色,文字颜色等,否则会影响主题色与黑暗模式的切换效果

  • 使用Element-Plus进行内容区元素填充,如工作区中左侧内容为菜单、树、列表等,可使用Element-Plus对应组件填充,

  • 框架以element-plus为UI控件库,黑暗模式与主题色切换是对Element-Plus的样式进行特殊适配得来,即这种模式适配是需要单独处理的,而非不劳而获

  • 三方组件想要获得此能力,可能需要适配,适配的方案是通过css选择器判断是否是黑暗模式从而开启另一套适配样式来实现

5.4.3:如何自定义黑暗模式的颜色

颜色适配、颜色变量数量、颜色防干扰、颜色反差等诸多因素的平衡是困难的,好在强大的@ahcui/vue3-multiplex框架核心库考虑到了这一点,提供了简单适配模式与专业适配模式两种模式

5.4.3.1:简单适配模式:

@ahcui/vue3-multiplex框架核心库为黑暗模式定义了一套简单的配色,涉及背景色、文字颜色、边框颜色等,您可以通过声明一套新的定义覆盖之

body.cui-style-theme-dark {
    color-scheme:dark;
    --element-ui-color-dark-mode-bg0: #000000;
    --element-ui-color-dark-mode-bg1: #141414;
    --element-ui-color-dark-mode-bg3: #1f1f1f;
    --element-ui-color-dark-mode-font0:#ffffff;
    --element-ui-color-dark-mode-font1:rgba(255, 255, 255, .85);;
    --element-ui-color-dark-mode-font2:rgba(255,255,255,.65);
    --element-ui-color-dark-mode-border0:#000000;
    --element-ui-color-dark-mode-border1:#141414;
}
5.4.3.2:专业适配模式:

除了简单适配使用到的变量外,@ahcui/vue3-multiplex框架核心库为黑暗模式维持了一套与Element-plus适配色,涉及诸多细节,乃至每个Element-plus组件的dom控件,您可以通过声明一套新的定义覆盖之

body.cui-style-theme-dark {
    color-scheme:dark;
    --el-color-primary:var(--element-ui-color-main,#409eff);
    --el-color-primary-light-3:var(--element-ui-color-assist-3,#79bbff);
    --el-color-primary-light-5:var(--element-ui-color-assist-5,#a0cfff);
    --el-color-primary-light-7:var(--element-ui-color-assist-7,#c6e2ff);
    --el-color-primary-light-8:var(--element-ui-color-assist-8,#d9ecff);
    --el-color-primary-light-9:var(--element-ui-color-assist-9,#ecf5ff);

    --el-color-primary-dark-2:var(--element-ui-color-main,#337ecc);
    --el-color-success:#67c23a;
    --el-color-success-light-3:#4e8e2f;
    --el-color-success-light-5:#3e6b27;
    --el-color-success-light-7:#2d481f;
    --el-color-success-light-8:#25371c;
    --el-color-success-light-9:#1c2518;
    --el-color-success-dark-2:#85ce61;
    --el-color-warning:#e6a23c;
    --el-color-warning-light-3:#a77730;
    --el-color-warning-light-5:#7d5b28;
    --el-color-warning-light-7:#533f20;
    --el-color-warning-light-8:#3e301c;
    --el-color-warning-light-9:#292218;
    --el-color-warning-dark-2:#ebb563;
    --el-color-danger:#f56c6c;
    --el-color-danger-light-3:#b25252;
    --el-color-danger-light-5:#854040;
    --el-color-danger-light-7:#582e2e;
    --el-color-danger-light-8:#412626;
    --el-color-danger-light-9:#2b1d1d;
    --el-color-danger-dark-2:#f78989;
    --el-color-error:#f56c6c;
    --el-color-error-light-3:#b25252;
    --el-color-error-light-5:#854040;
    --el-color-error-light-7:#582e2e;
    --el-color-error-light-8:#412626;
    --el-color-error-light-9:#2b1d1d;
    --el-color-error-dark-2:#f78989;
    --el-color-info:var(--element-ui-color-main,#909399);
    --el-color-info-light-3:var(--element-ui-color-assist-3,#b1b3b8);
    --el-color-info-light-5:var(--element-ui-color-assist-5,#c8c9cc);
    --el-color-info-light-7:var(--element-ui-color-assist-7,#dedfe0);
    --el-color-info-light-8:var(--element-ui-color-assist-8,#e9e9eb);
    --el-color-info-light-9:var(--element-ui-color-assist-9,#f4f4f5);
    --el-color-info-dark-2:var(--element-ui-color-main,#73767a);
    --el-box-shadow:0px 12px 32px 4px rgba(0, 0, 0, 0.36), 0px 8px 20px rgba(0, 0, 0, 0.72);
    --el-box-shadow-light:0px 0px 12px rgba(0, 0, 0, 0.72);
    --el-box-shadow-lighter:0px 0px 6px rgba(0, 0, 0, 0.72);
    --el-box-shadow-dark:0px 16px 48px 16px rgba(0, 0, 0, 0.72), 0px 12px 32px #000000, 0px 8px 16px -8px #000000;
    --el-bg-color-page:#0a0a0a;
    --el-bg-color:var(--element-ui-color-dark-mode-bg1);
    --el-bg-color-overlay:#1d1e1f;
    --el-text-color-primary:#E5EAF3;
    --el-text-color-regular:#CFD3DC;
    --el-text-color-secondary:var(--element-ui-color-assist-5,#909399);
    --el-text-color-placeholder:#8D9095;
    --el-text-color-disabled:#6C6E72;
    --el-border-color-darker:#636466;
    --el-border-color-dark:#58585B;
    --el-border-color: var(--element-ui-color-assist-5,#dcdfe6);
    --el-border-color-light:var(--element-ui-color-dark-mode-border0,#414243);
    --el-border-color-lighter:#363637;
    --el-border-color-extra-light:#2B2B2C;
    --el-fill-color-darker:#424243;
    --el-fill-color-dark:#39393A;
    --el-fill-color:#303030;
    --el-fill-color-light:#262727;
    --el-fill-color-lighter:#1D1D1D;
    --el-fill-color-extra-light:#191919;
    --el-fill-color-blank:var(--element-ui-color-dark-mode-bg1,transparent);
    --el-mask-color:rgba(0, 0, 0, 0.8);
    --el-mask-color-extra-light:rgba(0, 0, 0, 0.3)
}

专业级适配不仅包含以上信息,还包括在Element-plus样式定义文件对每个空间的定义信息,您如果有很强的css能力,可以试一下从入门到放弃的感觉。

5.4.4:黑暗模式免责声明

注黑暗模式是自@ahcui/vue3-multiplex@1.0.0-rc4增加的对Element-plus@2.2.2控件库的适配,未特殊说明仍是对Element-plus@2.2.2控件库的适配,如果在项目中使用其他版本的Element-plus可能会因为未做适配而出现问题,项目技术负责人等相关人员应对技术选型、版本区别有一定认识,该行为属于使用者的自主行为,且框架开发者对于这一问题提前尽到了告知义务,因此不承担任何责任。

@ahcui/vue3-multiplex未最终定版,文档持续完善中