vue中使用amis(做管理后台渲染器)

0.导入amis sdk

在github上下载 sdk.tar.gz:https://github.com/baidu/amis/releases

若网速不行,github下载不下来,可以这样:

yarn add amis,然后在 node_modules\amis\sdk 目录里就能找到相关资源

public/index.html中添加:

    <link rel="stylesheet" href="amissdk/ang.css" />

    <script src="amissdk/sdk.js"></script>

1.配置amis页面和web应用菜单的关联关系

最终生成的json如下

[{"path": "/develop",//顶部导航栏"title": "开发中心","icon": "md-code-working","hideSider": false,"name": "develop","children": [{"path": "/develop/datamodel", //侧边栏-目录"icon": "ios-barcode","title": "数据表模型","header": "develop","children": [{"path": "/develop/modelclass",//侧边栏-菜单"icon": "ios-list-box-outline","title": "表模型分类","nodeKey": 36,"meta": {"auth": true,"mclass": "base","template": "base.modelclass", //绑定的amis页面"type": "pagetpl","iframe": "","component": "","closable": true},"selected": true,"component": "default/default.tpl","name": "develop-modelclass","auth": ["admin","superadmin"],"nodeClass": "sider","target": "_self","hideSider": false,"headerDropdown": false,"menu": {"enable": true,"header": true},"divided": false,"childAddDisabled": true},{"path": "/develop/model","icon": "md-menu","title": "表模型管理","nodeKey": 37,"meta": {"auth": true,"mclass": "base","template": "base.modelinfo","type": "pagetpl","iframe": "","component": "","closable": true},"component": "default/default.tpl","selected": false,"name": "develop-modelinfo","auth": ["admin","superadmin"],"nodeClass": "sider","target": "_self","hideSider": false,"headerDropdown": false,"menu": {"enable": true,"header": true},"divided": false,"childAddDisabled": true}],"nodeKey": 35,"meta": {"auth": true,"type": "folder","iframe": "","component": "","closable": true},"selected": false,"expand": true,"name": "develop-model","nodeClass": "folder","target": "_self","hideSider": false,"headerDropdown": false,"menu": {"enable": true},"divided": false},],"nodeKey": 34,"expand": true,"meta": {"auth": true,"mclass": "","template": "","type": "pagetpl","iframe": "","component": "","closable": true},"selected": false,"redirect": "develop-page.pagetemplate","headerDropdown": false,"nodeClass": "header","target": "_self","menu": {"enable": true}}
]

2.根据关联关系生成动态路由

libs/util.js:

export const getRouterByAppMenu = (list, level) => {let routers = [];forEach(list, item => {let r = {};item.meta = item.meta || {};// let mPath = item.path.split("/");item.meta.auth = (item.auth && item.auth.length>0) ? true : false; //auth为[]时,不需要权限r = {// mpath: mPath[mPath.length - 1],path: item.path,name: item.name,meta: item.meta,}r.meta.title = item.title || '';r.meta.notCache = true;r.meta.actions = item.actions;r.meta.menu = item.menu;if (item.redirect) {r.redirect = { name: item.redirect };}if (item.children && item.children.length > 0) {r.component = vueCompontent[level];r.children = getRouterByAppMenu(item.children, level + 1);}else {r.component = resolve => require([`@/pages/${item.component || 'default/default.tpl'}.vue`], resolve);// r.meta.template = r.meta.template || 'none.initpage';}routers.push(r);})return routers;
}

router/index.js(动态路由)核心代码如下:

import Vue from 'vue';
import VueRouter from 'vue-router';
import util, { getRouterByAppMenu }  from '@/libs/util'
import Setting from '@/setting';
import store from '@/store/index';
import routes from './routes';// 路由数据
import { loadApplicationMenu } from "../services/appmenu";
Vue.use(VueRouter);const router = new VueRouter({routes,mode: Setting.routerMode,base: Setting.routerBase
});(async () => {/*** 路由拦截,权限验证*/let app = await loadApplicationMenu(appname); //调用接口获取web应用信息let ROUTERS = getRouterByAppMenu(app.menu, 0); //封装配置的menu为routesfor (let i in ROUTERS) {let mRouter = ROUTERS[i];routes.push(mRouter);router.addRoute(mRouter);}let Router404 = {path: '*',name: '404',meta: {title: '404'},component: () => import('@/pages/system/error/404')};routes.push(Router404);router.addRoute(Router404);router.beforeResolve((to, from, next) => {// 判断是否需要登录才可以进入if (to.matched.some(_ => _.meta.auth)) {// 这里依据 token 判断是否登录,可视情况修改if (token && token !== 'undefined') {next();} else {// 没有登录的时候跳转到登录界面, 携带上登陆成功之后需要跳转的页面完整路径next({name: 'login',query: {redirect: to.fullPath}});}} else {// 不需要身份校验 直接通过next(); }});router.afterEach(to => {// 多页控制 打开新的页面store.dispatch('admin/page/open', to);// 更改标题util.title({title: to.meta.title});// 返回页面顶端window.scrollTo(0, 0);});
})();
export default router;

3.渲染amis页面

pages/default/default.tpl.vue(amis页面渲染器)核心代码如下:

import axios from "axios";
import store from '@/store';
import router from '@/router';
import {Notice,Message} from 'view-design';
import { loadPageTemplate } from "./services/system";
const amis = amisRequire("amis/embed");
import Setting from "@/setting";axios.interceptors.response.use(res => res, //res为axios封装后的结果,amis底层会进行.data取出接口数据error => {if (error.response.status == 401) { // token 过期router.app._route.name !== 'login' && store.dispatch('admin/account/logout');}return Promise.reject(error)});const amisEnv =
{// api接口调用fetcher实现fetcher: ({url, // 接口地址method, // 请求方法 get、post、put、deletedata, // 请求数据responseType,config, // 其他配置headers // 请求头}) => {config.withCredentials = true;responseType && (config.responseType = responseType);if (config.cancelExecutor) {config.cancelToken = new (axios).CancelToken(config.cancelExecutor);}config.headers = headers || {};config.headers["Authorization"]= `Bearer ${token}`;if (method !== 'post' && method !== 'put' && method !== 'patch') {if (data) {config.params = data;}return (axios)[method](url, config);} else if (data && data instanceof FormData) {// config.headers['Content-Type'] = 'multipart/form-data';} else if (data &&typeof data !== 'string' &&!(data instanceof Blob) &&!(data instanceof ArrayBuffer)) {data = JSON.stringify(data);config.headers['Content-Type'] = 'application/json';}return (axios)[method](url, data, config);},isCancel: (value) => { (axios).isCancel(value) },copy: content => {copy(content);toast.success('内容已复制到粘贴板');},// 用来实现通知,不传则使用amis内置notify: (type, msg) => {if (msg != 'Response is empty!') {let mtype = {success: '成功',error: '错误',info: '信息',warning: '警告',warn: '警惕'}Notice[type]({title: mtype[type],desc: msg.toString()});}},// 用来实现提示,不传则使用amis内置alert: content => {Message.info({content: content,duration: 3,closable: true});},// 用来实现确认框,不传则使用amis内置。// confirm: content => {}// 主题,默认是 default,还可以设置成 cxd 或 dark,但记得引用它们的 css,比如 sdk 目录下的 cxd.csstheme: "ang"
}//tracker可以在监听到指定事件触发后,进行相关处理。
//             const tracker = (eventTrack, props) => {
//                 //tracker监听到FormItem改变后, 更新到vue中,可以用来做参数配置器
//                 if (eventTrack.eventType == 'formItemChange') {
//                  const formData = this.amisScoped.getComponentByName("mpage.mform")?.getValues();
//                 }
//             }
//          amisEnv.tracker = tracker;
//          amisEnv.session = "global"export default {watch: {"$route.meta.template": {handler(template) {this.loadInit(template);},immediate: false,},},async mounted() {this.loadInit(this.$route.meta.template);},beforeDestroy() {this.amisScoped?.unmount();},methods: {async loadInit(id) {let pl = await loadPageTemplate(id); //获取amis页面信息const m = pl.data;if (m) {this.amisScoped?.unmount();const amisJSON = JSON.parse(template);amisJSON.data = { ...amisJSON.data, appname, user: this.userInfo }if(this.$refs["vnode"]){this.amisScoped = amis.embed(this.$refs["vnode"],amisJSON,{ theme: "ang" },amisEnv);}}}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/40101.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android Studio上传新项目到Gitee

一、在Gitee上创建仓库 首先需要再Gitee上创建仓库 1、在Gitee中新建仓库 2、输入仓库信息 3、生成仓库地址 创建成功会生成一个仓库地址&#xff0c;格式如下&#xff1a; https://gitee.com/test/compose_mvi_demo.git二、Android Studio 上传项目到Gitee 1、在Android …

全局优化与目标优化的异同

从porgo和optimtool的使用来解释 在多模态问题中&#xff0c;多数全局优化算法是通过设置跳跃局部最优点的比率来完成全局最优的搜索&#xff0c;这类算法需要利用到一阶梯度的局部信息&#xff0c;以至于演进方向的分叉导致了算法的执行复杂度按照搜索次数倍增。首先&#xf…

微信小程序转发朋友圈详细教程

微信小程序转发朋友圈功能&#xff0c;官方说的很官方&#xff0c;容易踩坑 官方链接戳这里 想分享朋友圈必须要分享好友 onShareTimeline() { } 想要生效必须先定义 onShareAppMessage() { } /*** 用户点击右上角分享*/onShareAppMessage() { },onShareTimeline() { } 简单…

不锈钢酸退作业区冷线氮氧分析仪采样系统优化改造

不锈钢酸退作业区冷线氮氧分析仪采样系统优化改造 一、项目提出前状况: (一)不锈钢酸退作业区酸洗线脱氮系统使用的废气监测仪器氮氧分析仪属于环保设备,数据检测的准确性直接影响环保指标,因此一旦数据检测有误,势必会引起环保事件。脱氮系统是将酸洗过程中产生的酸雾通…

一维信号全变分(TV)降噪方法(MATLAB)

信号降噪一直是领域研究的热点&#xff0c;这是一项十分有意义并且极具挑战性的工作&#xff0c;经过几十年来相关科研人员的共同努力&#xff0c;降噪技术得到了极大的发展&#xff0c;并在现实生活中也得到了广泛的应用。其中&#xff0c;许多常用的方法有&#xff1a;小波变…

深入Django(三)

Django视图&#xff08;Views&#xff09;详解 引言 在前两天的博客中&#xff0c;我们介绍了Django的基本概念和模型系统。今天&#xff0c;我们将深入探讨Django的视图&#xff08;Views&#xff09;&#xff0c;它们是处理用户请求和返回响应的地方。 什么是Django视图&a…

Golang 单引号、双引号和反引号的概念、用法以及区别

在 Golang&#xff08;Go 语言&#xff09;中&#xff0c;单引号 ()、双引号 (") 和反引号 () 用于不同类型的字符串和字符表示。以下是它们的概念、用法和区别&#xff1a; 1. 单引号 () 概念 单引号用于表示 字符&#xff08;rune 类型&#xff09;。一个字符表示一个…

免费最好用的证件照制作软件,一键换底+老照片修复+图片动漫化,吊打付费!

这款软件真的是阿星用过的&#xff0c;最好用的证件照制作软件&#xff0c;没有之一&#xff01; 我是阿星&#xff0c;今天要给大家安利一款超实用的证件照工具&#xff0c;一键换底&#xff0c;自动排版&#xff0c;免费无广告&#xff0c;让你在家就能轻松搞定证件照&#…

尚玩助手短视频看广告app开发

尚玩助手短视频看广告app的开发涉及多个关键步骤和考虑因素。以下是其主要开发流程&#xff1a; 需求分析和规划&#xff1a; 确定目标用户群体和市场定位。 收集和分析竞争对手的数据和特点&#xff0c;了解市场上已有的短视频app的优缺点。 确定尚玩助手短视频app的功能和特…

搭建知识付费系统的技术框架与实现路径

知识付费系统已经成为内容创作者和企业变现的重要工具。要成功搭建一个高效、稳定、用户体验良好的知识付费系统&#xff0c;明确技术框架和实现路径至关重要。本文将详细解析搭建知识付费系统的技术框架&#xff0c;并提供具体的实现路径和相关技术代码示例。 一、知识付费系…

C++之程序流程结构

C/C支持最基本的三种程序运行结构&#xff1a;顺序结构、选择结构、循环结构 顺序结构&#xff1a;程序按顺序执行&#xff0c;不发生跳转选择结构&#xff1a;依据条件是否满足&#xff0c;有选择的执行相应功能循环结构&#xff1a;依据条件是否满足&#xff0c;循环多次执行…

测试图片上传功能,使用postman提供的url

是不是有时候想要测试图片上传功能&#xff0c;但是没有后台url进行测试&#xff0c;这时候就可以使用postman提供的url&#xff1a; https://postman-echo.com/post接下来&#xff0c;我将教你在postman中&#xff0c;用该url测试图片上传功能。 1.发送图片上传请求 第一步…

Character.ai因内容审查流失大量用户、马斯克:Grok-3用了10万块英伟达H100芯片

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 更多资源欢迎关注 1、爆火AI惨遭阉割&#xff0c;1600万美国年轻人失恋&#xff1f;Character.ai被爆资金断裂 美国流行的社交软件Character.ai近期对模型进行大幅度内容审查&#xff0c;导致用户感到失望并开始流失。…

12. Revit API: Document、Element

12. Revit API: Document、Element 前言 还是先讲一下Document吧&#xff0c;不然Selection不好讲&#xff0c;那涉及到了挺多东西的&#xff0c;比元素&#xff08;Element&#xff09;和各类Filter&#xff0c;这些都与Document有关&#xff0c;所以先简单讲一下这个。 一、…

Chart.js四个示例

示例代码在图片后面&#xff0c;点赞加关注&#xff0c;谢谢 条形图 雷达图 折线图 圆环图 完整例子代码 具体代码在干什么看粗体加重的注释 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <me…

【linux/shell实战案例】linux中变量的使用

目录 一.linux变量声明及定义 二.linux变量使用方法 三.linux变量使用花括号${name}和双引号“$name”的区别 四.linux变量使用单引号$name和双引号“$name”的区别 五.linux变量中使用命令 一.linux变量声明及定义 #!/bin/bash namezhaodabao 等号两边不能有空格变量名…

C++精解【10】

文章目录 读写文件概述example csv读文件读取每个字段读取机器学习数据库iris constexpr函数GMP大整数codeblock环境配置数据类型函数类 EigenminCoeff 和maxCoeffArray类 读写文件 概述 fstream typedef basic_fstream<char, char_traits<char>> fstream;此类型…

【大数据】什么是数据融合(Data Fusion)?

目录 一、数据融合的定义 二、数据融合的类型 三、数据融合的挑战 四、数据融合的方法 五、数据融合的关键环节 1.数据质量监控指标的制定和跟踪 2.异常检测和处理机制 3.实时数据监测与反馈机制 4.协同合作与知识共享 一、数据融合的定义 数据融合&#xff08;Data Fusion&…

STM32基本定时器、通用定时器、高级定时器区别

一.STM32基本定时器、通用定时器、高级定时器区别 STM32系列微控制器中的定时器资源分为基本定时器&#xff08;Basic Timer&#xff09;、通用定时器&#xff08;General Purpose Timer&#xff09;和高级定时器&#xff08;Advanced Timer&#xff09;三类&#xff0c;它们在…

深入分析Java中的内存管理与垃圾回收机制

深入分析Java中的内存管理与垃圾回收机制 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将深入探讨Java中的内存管理与垃圾回收机制&#xff0c;这是每…