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为routes
    for (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、delete
        data, // 请求数据
        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.css
    theme: "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.mfbz.cn/a/768443.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机操作系统部分选填及大题整理

并发和&#xff08; 共享 &#xff09; 是操作系统的两个最基本的特征,&#xff08; 虚拟 &#xff09;和&#xff08; 异步 &#xff09; 是操作系统的重要特征&#xff0c;并发执行的程序失去可再现性现代操作系统的两个基本特征是&#xff08;程序的并发执行&#xff09;和资…

Docker 部署 Minio 对象存储服务器

文章目录 Github官网文档简介dockerdocker-compose.ymlmc 客户端mc 基础命令Golang 示例创建 test 账号密钥文件上传示例 Github https://github.com/minio/minio 官网 https://min.io/https://www.minio.org.cn/ 文档 https://www.minio.org.cn/docs/minio/kubernetes/up…

1.4 ROS2集成开发环境搭建

1.4.1 安装VSCode VSCode全称Visual Studio Code&#xff0c;是微软推出的一款轻量级代码编辑器&#xff0c;免费、开源而且功能强大。它支持几乎所有主流的程序语言的语法高亮、智能代码补全、自定义热键、括号匹配、代码片段、代码对比Diff、GIT 等特性&#xff0c;支持插件…

上位机第二弹

之前写的代码用上了 现在想想 &#xff0c;北向一侧还挺难搞&#xff0c;设计很巧妙

10 Posix API与网络协议栈

POSIX概念 POSIX是由IEEE指定的一系列标准,用于澄清和统一Unix-y操作系统提供的应用程序编程接口(以及辅助问题,如命令行shell实用程序),当您编写程序以依赖POSIX标准时,您可以非常肯定能够轻松地将它们移植到大量的Unix衍生产品系列中(包括Linux,但不限于此!)。 如…

使用pyinstaller 如何打包python项目

参考&#xff1a;【python项目正确打包方法-哔哩哔哩】 https://b23.tv/EDB6zbG Pyinstaller 详解多种打包过程(去坑,填坑)。_pyinstaller -f -w-CSDN博客 1.打开命令提示符&#xff1a; 找到python项目所在位置&#xff0c;输入cmd即可 2. 安装pipenv: 在命令提示符&#…

【Linux】多线程(一万六千字)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 文章目录 前言 线程的概念 线程的理解(Linux系统为例) 在Linux系统里如何保证让正文部分的代码可以并发的去跑呢&#xff1f; 为什么要有多进程呢&#xff1f; 为…

CVD-Risk-Prevent 个性化心血管健康推荐系统:基于医学指南的规则框架与 LLM 的结合

CVD-Risk-Prevent 个性化心血管健康推荐系统&#xff1a;基于医学指南的规则框架与 LLM 的结合 提出背景推荐算法的选择选择疑问健康指标管理心血管风险因素目标设定实现目标的计划推荐的多维性 算法关键点&#xff1a;如何将心血管健康指标转换为多维推荐&#xff1f;确定风险…

antfu/ni 在 Windows 下的安装

问题 全局安装 ni 之后&#xff0c;第一次使用会有这个问题 解决 在 powershell 中输入 Remove-Item Alias:ni -Force -ErrorAction Ignore之后再次运行 ni Windows 11 下的 Powershell 环境配置 可以参考 https://github.com/antfu-collective/ni?tabreadme-ov-file#how …

【操作系统】进程管理——调度基础(个人笔记)

学习日期&#xff1a;2024.7.3 内容摘要&#xff1a;调度的概念、层次&#xff0c;进程调度的时机&#xff0c;调度器和闲逛进程&#xff0c;调度算法的评价指标 调度的基本概念 有一堆任务需要处理&#xff0c;但由于资源有限&#xff0c;有的事情不能同时处理&#xff0c;这…

Django学习第三天

python manage.py runserver 使用以上的命令启动项目 实现新建用户数据功能 views.py文件代码 from django.shortcuts import render, redirect from app01 import models# Create your views here. def depart_list(request):""" 部门列表 ""&qu…

什么牌子的充电宝最好耐用?多款热门无线磁吸充电宝推荐

在现代生活中&#xff0c;手机、平板等电子设备已成为我们日常工作的必需品&#xff0c;而充电宝则是这些设备的续航神器&#xff01;无论是长途旅行、外出办公&#xff0c;还是日常通勤&#xff0c;一个耐用且高效的充电宝都是必不可少的选择。然而&#xff0c;市场上充电宝品…

如何选择适合自己的虚拟化技术?

虚拟化技术已成为现代数据中心和云计算环境的核心组成部分。本文将帮助您了解如何选择适合自己需求的虚拟化技术&#xff0c;以实现更高的效率、资源利用率和灵活性。 理解虚拟化技术 首先&#xff0c;让我们了解虚拟化技术的基本概念。虚拟化允许将一个物理服务器划分为多个虚…

探讨命令模式及其应用

目录 命令模式命令模式结构命令模式适用场景命令模式优缺点练手题目题目描述输入描述输出描述题解 命令模式 命令模式是一种行为设计模式&#xff0c; 它可将请求转换为一个包含与请求相关的所有信息的独立对象。 该转换让你能根据不同的请求将方法参数化、 延迟请求执行或将其…

玩玩快速冥(LeetCode50题与70题以及联系斐波那契)

一.算法快速幂 今天刷到两个题,比较有意思,还是记录一下. 先来讲讲50题. LeetCode50(Pow(x,n)) 实现 pow(x, n) &#xff0c;即计算 x 的整数 n 次幂函数&#xff08;即&#xff0c;xn &#xff09;。 这道题一看很平常啊,不就一直乘嘛,循环走一次就够了.但是很抱歉,单纯的想…

ArcTs布局入门04——相对布局 媒体查询

如果你也对鸿蒙开发感兴趣&#xff0c;加入“Harmony自习室”吧 扫描下面的二维码关注公众号。 本文将探讨相对布局与媒体查询&#xff0c;为啥把他们放到一起呢&#xff1f;主要是因为相对布局在响应式的场景下做得不太好&#xff0c;一般情况下和媒体查询&#xff08;不同尺…

移动智能终端数据安全管理方案

随着信息技术的飞速发展&#xff0c;移动设备已成为企业日常运营不可或缺的工具。特别是随着智能手机和平板电脑等移动设备的普及&#xff0c;这些设备存储了大量的个人和敏感数据&#xff0c;如银行信息、电子邮件等。员工通过智能手机和平板电脑访问企业资源&#xff0c;提高…

zed_ros2_wapper colcon 报错

问题一&#xff1a; CMake Error at CMakeLists.txt:129 (find_package): By not providing “Findnmea_msgs.cmake” in CMAKE_MODULE_PATH this project has asked CMake to find a package configuration file provided by “nmea_msgs”, but CMake did not find one. Co…

jdk17卸载后换jdk1.8遇到的问题

过程&#xff1a; 1、找到jdk17所在文件夹&#xff0c;将文件夹进行删除。&#xff08;问题就源于此&#xff0c;因为没删干净&#xff09; 2、正常下载jdk1.8&#xff0c;按照网上步骤配置环境变量&#xff0c;这里我参考的文章是&#xff1a; http://t.csdnimg.cn/Svblk …

乘用车副水箱浮球式液位计传感器

浮球式液位计概述 浮球式液位计是一种利用浮球在液体中浮动的原理来测量液位的设备&#xff0c;广泛应用于各种工业自动化控制系统中&#xff0c;如石油化工、水处理、食品饮料等行业。它通过浮球的上下运动来测量液位的高低&#xff0c;具有结构简单、安装方便、测量范围广、…