vue进阶04-vue组件库iview

iview简介

View UI,即原先的 iView,是一套基于 Vue.js 的开源 UI 组件库,主要服务于
PC 界面的中后台产品。
该项目即为原先的 iView,从 2019 年 10 月起正式更名为 View UI,并使用全新的 Logo 。iView 作者将在新仓库(https://github.com/view-design/ViewUI)继续开发 iView 4.0 和后续版本,以及维护工作。原仓库 iView 作者不再继续提交内容。

iview快速上手

iview安装

cnpm install view-design --save

安装viewui loader

npm i iview-loader --save-dev

修改webpack.config.js(给出了iview修改部分)

{
            test: /\.vue$/,
            use: [
                {
                    loader: 'vue-loader',
                    options: {
                        
                    }
                },
                {
                    loader: 'iview-loader',
                    options: {
                        prefix: false
                    }
                }
            ]
}
,
{
    test:/(png|jpg|svg|woff|woff2|ttf|gif)$/,
    use: {
        loader: "file-loader",
        options: {
            name: "[name].[hash].[ext]"
        }
    }

}

注意iview中有些许文件svg和woff2和ttf等需要通过file-loader拷贝到dist目录

main.js代码

import Vue from 'vue'
import App from './App.vue'
import router from './router'
import axios from 'axios'
//统一设置认证头
axios.interceptors.request.use(config=>{
    config.headers.common["Authorization"]="eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiIxIiwidWlkIjoiMSIsInVzZXJuYW1lIjoiYWRtaW4iLCJ0eXBlIjoiMCIsInN5c3RlbSI6MSwidXNlclR5cGUiOjEsImV4cCI6MTU3Mzg3NTAzMX0.kBnV0g3Fy7OS9XDEkD-kL0B_-2FvCVqhzg49VtvO5MGeFgwrLhK7XLSJg4deRCdrY3aIGoy_nOjKwXspx1akZAuBZFhuO8p4zI2faDhb6KjeP-PEVV4SOW4fsd8JgNd7D-mggRo7hVVFjB1lOgcXATLOtm0ZEdODzBZctei-HxQ"
    return config;
},error=>{
    return Promise.reject(error)
})

new Vue({
    el:'#app',
    router,
    render: h => h(App)
})

iview组件

布局

布局参考(https://www.iviewui.com/components/layout)

菜单数据

curl http://192.168.1.35/ums/auth/getUserRelateDataByUrl/management.gvtdev.com
{"success":true,"code":"200","message":"成功","time":1572940293644,"data":
{"user":{"id":1,"name":"管理员","userName":"admin","state":1,"system":1,"userType":1,"code":null,"remark":null,"timezoneDTO":null},"tenant":null,"oem":{"domain":null,"domainIcpNo":null,"companyLogoUrl":null,"loginUrl":null,"loginBackUrl":null,"startUrl":null,"appUrl":null},"roles":null,"apps":[{"id":11,"name":"统一管理平台","enName":"ums","code":"ums","appLogo":"group1/M00/00/F8/wKi5SlvhjaSAQZ9JAAF1sEdJZIk74.jpeg","type":"1","bisFunctions":[{"id":55,"code":"ums_app_management","name":"应用管理","enName":null,"sid":"3","uri":"/umsf/#/1","icon":"icon-cargo","allocation":null,"type":"menu","childBisFunction":[{"id":56,"code":"ums_product_management","name":"产品管理","enName":"Product Manager","sid":"3","uri":"/umsf/#/application-manage/product-manage","icon":null,"allocation":null,"type":"menu","childBisFunction":null,"sort":1},{"id":57,"code":"ums_business_function_Management","name":"业务功能管理","enName":null,"sid":"3","uri":"/umsf/#/application-manage/business-function-manage","icon":"icon-client","allocation":null,"type":"menu","childBisFunction":null,"sort":2}],"sort":33},{"id":58,"code":"ums_Module_Management","name":"模块管理","enName":null,"sid":"3","uri":null,"icon":"icon-date","allocation":null,"type":"menu","childBisFunction":[{"id":60,"code":"ums_frontend_system","name":"前端系统","enName":null,"sid":"3","uri":"/umsf/#/module-manage/frontend-system","icon":null,"allocation":null,"type":"menu","childBisFunction":null,"sort":1},{"id":59,"code":"ums_backend_module","name":"后台模块","enName":null,"sid":"3","uri":"/umsf/#/module-manage/background-module","icon":"icon-client","allocation":null,"type":"menu","childBisFunction":null,"sort":2}],"sort":34},{"id":54,"code":"ums_authority_management","name":"权限管理","enName":null,"sid":"3","uri":"/umsf/#/authority-manage","icon":"icon-flock","allocation":null,"type":"menu","childBisFunction":null,"sort":40},{"id":61,"code":"ums_role_management","name":"角色管理","enName":null,"sid":"3","uri":"/umsf/#/platform/role-manage","icon":"icon-market","allocation":null,"type":"menu","childBisFunction":null,"sort":41},{"id":62,"code":"ums_user_management","name":"用户管理","enName":null,"sid":"3","uri":"/umsf/#/user-manage","icon":"icon-member","allocation":null,"type":"menu","childBisFunction":null,"sort":42},{"id":63,"code":"ums_merchant_management","name":"商户管理","enName":null,"sid":"3","uri":null,"icon":"icon-mywork","allocation":null,"type":"menu","childBisFunction":[{"id":201969469861577100,"code":"product-role","name":"产品角色","enName":"product-role","sid":"3","uri":"/umsf/#/product-role/list","icon":null,"allocation":null,"type":"menu","childBisFunction":null,"sort":1},{"id":64,"code":"ums_merchantList","name":"商户列表","enName":null,"sid":"3","uri":"/umsf/#/merchant-manage","icon":null,"allocation":null,"type":"menu","childBisFunction":null,"sort":1}],"sort":43},{"id":264,"code":"synchronous","name":"系统设置","enName":null,"sid":"3","uri":"/umsf/#/settings","icon":null,"allocation":null,"type":"menu","childBisFunction":null,"sort":49}]}],"employee":null,"shops":null,"warehouses":null,"organs":null}}

App.vue中新增布局

<style scoped>
    .layout{
        border: 1px solid #d7dde4;
        background: #f5f7f9;
        position: relative;
        border-radius: 4px;
        overflow: hidden;
        height:100%
    }
    .layout-header-bar{
        background: #fff;
        box-shadow: 0 1px 1px rgba(0,0,0,.1);
    }
    /* 注意如果希望布局高度100% 可设置
        index.html
            html body #app{
                height:100%
            }
        .layout{
            height:100%
        }
        .ivu-layout{
            height: 100%;
        }
        */
    .ivu-layout{
        height: 100%;
    }
    .menu-item span{
        display: inline-block;
        overflow: hidden;
        width: 69px;
        text-overflow: ellipsis;
        white-space: nowrap;
        vertical-align: bottom;
        transition: width .2s ease .2s;
    }
    .menu-item i{
        transform: translateX(0px);
        transition: font-size .2s ease, transform .2s ease;
        vertical-align: middle;
        font-size: 16px;
    }
    .collapsed-menu span{
        width: 0px;
        transition: width .2s ease;
    }
    .collapsed-menu i{
        transform: translateX(5px);
        transition: font-size .2s ease .2s, transform .2s ease .2s;
        vertical-align: middle;
        font-size: 22px;
    }
</style>
<template>
    <div class="layout">
        <Layout>
            <Sider breakpoint="md" collapsible :collapsed-width="78" v-model="isCollapsed" :style="{maxHeight:'300'}">
                <div style="min-width: 200px;display:flex;">
                <img src="http://47.75.105.17:22124/group1/M00/01/07/wKi5SlvrjQCAANGMAAAR2Ug-7l4909.png" style="margin:0 auto;align-items: center;"/>
                </div>
                <Menu active-name="2-2" theme="dark" width="auto" :class="menuitemClasses" >

                    <Submenu  v-for="m in bisFunctions" v-if="m.childBisFunction!=null && m.childBisFunction.length>0" :name="m.name" @click.native="alert()">
                        <template slot="title">
                            <Icon type="ios-arrow-dropright-circle" />
                            {{m.name}}
                        </template>
                        <MenuItem  v-for="cm in m.childBisFunction" :name="cm.code" to="/userManager">{{cm.name}}</MenuItem>
                    </Submenu>
                    <MenuItem v-for="m in bisFunctions" style="padding-left: 23px"  v-if="m.childBisFunction==null || m.childBisFunction.length==0" :name="m.code" to="/userManager">
                        <!--<template slot="title1">-->
                            <Icon type="ios-arrow-dropright-circle" style="padding-right: 7px" />{{m.name}}
                        <!--</template>-->
                    </MenuItem>


                </Menu>
                <div slot="trigger"></div>
            </Sider>
            <Layout>
                <Header class="layout-header-bar"></Header>
                <Content name="content" :style="{margin: '20px', background: '#fff'}">
                    <!--
                       注意右侧main区就是路由的空间内容
                    -->
                    <router-view></router-view>
                </Content>
            </Layout>
        </Layout>
    </div>
</template>
<script>
    import Vue from 'vue';
    import ViewUI from 'view-design';
    import axios from 'axios'
    import 'view-design/dist/styles/iview.css';
    Vue.use(ViewUI);
    export default {
        data () {
            return {
                isCollapsed: false,
                bisFunctions:[]
            };
        }
        ,mounted(){

            var instance = axios.create({
                headers:{
                    "Authorization":"eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiIxIiwidWlkIjoiMSIsInVzZXJuYW1lIjoiYWRtaW4iLCJ0eXBlIjoiMCIsInN5c3RlbSI6MSwidXNlclR5cGUiOjEsImV4cCI6MTU3Mzg3NTAzMX0.kBnV0g3Fy7OS9XDEkD-kL0B_-2FvCVqhzg49VtvO5MGeFgwrLhK7XLSJg4deRCdrY3aIGoy_nOjKwXspx1akZAuBZFhuO8p4zI2faDhb6KjeP-PEVV4SOW4fsd8JgNd7D-mggRo7hVVFjB1lOgcXATLOtm0ZEdODzBZctei-HxQ"
                }
            });
            instance.get("http://192.168.1.35/ums/auth/getUserRelateDataByUrl/management.gvtdev.com").then(resp=>{
                console.log(resp.data)
                this.bisFunctions=resp.data.data.apps[0].bisFunctions;
            }).catch(error=>{
                Promise.reject(error);
            });
        },
        computed: {
            menuitemClasses: function () {
                return [
                    'menu-item',
                    this.isCollapsed ? 'collapsed-menu' : ''
                ]
            }
        }
    }
</script>

最终效果:
在这里插入图片描述

路由

router.js代码:

import Vue from 'vue'
import VueRouter from 'vue-router'
import UserManager from "./UserManager.vue"
Vue.use(VueRouter)
// 这里直接默认导出 new 出来的 router 实例
export default new VueRouter({
    routes: [
        {
            path:"/userManager",
            component:UserManager
        }
    ]
})

UserManager编写增删改查代码

<template>
    <div id="um" style="margin-left:40px">
        <div style="height:20px"></div>
       系统名称: <Input enter-button placeholder="Enter something..." v-model="queryName" style="width: 300px"/>&nbsp;&nbsp;&nbsp; <Button type="primary" @click="query">搜索</Button>
        &nbsp;&nbsp;&nbsp; <Button type="primary" @click="showAddModel=true;">新增前端系统</Button>
        <div style="height:50px"></div>
        <Table border :columns="columns1" :data="data1">
            <template slot-scope="{ row, index }" slot="action">
                <Button type="primary" size="small" style="margin-right: 5px" @click="curUpdateRow=row;showUpdateModel=true">编辑</Button>
                <Button type="error" size="small" @click="deleteConfirm(index,row)">删除</Button>
            </template>

        </Table>
        <Page :total="total" show-elevator show-sizer    show-total @on-change="handlePage" @on-page-size-change='handlePageSize' />

        <!--修改对话框-->
        <Modal
                v-model="showUpdateModel"
                title="编辑前端系统"
                @on-ok="updateOk"
                @on-cancel="updateCancel">
            <Form :model="curUpdateRow" :label-width="80">
                <FormItem label="系统名称">
                    <Input v-model="curUpdateRow.name" placeholder="Enter something..."></Input>
                </FormItem>
                <FormItem label="URL地址">
                    <Input v-model="curUpdateRow.url" placeholder="Enter something..."></Input>
                </FormItem>
            </Form>
        </Modal>

        <!--修改对话框-->
        <Modal
                v-model="showAddModel"
                title="新增前端系统"
                @on-ok="addOk"
                @on-cancel="addCancel">
            <Form :model="curAddRow" :label-width="80">
                <FormItem label="系统名称">
                    <Input v-model="curAddRow.name" placeholder="Enter something..."></Input>
                </FormItem>
                <FormItem label="URL地址">
                    <Input v-model="curAddRow.url" placeholder="Enter something..."></Input>
                </FormItem>
            </Form>
        </Modal>
    </div>
</template>
<script>
    import axios from "axios"
    export default{
        data () {
            return {
                columns1: [
                    {
                        title: 'id',
                        key: 'id'
                    },
                    {
                        title: '系统名称',
                        key: 'name'
                    },
                    {
                        title: '地址',
                        key: 'url'
                    },
                    {
                        title: '操作',
                        slot: 'action',
                        width: 150,
                        align: 'center'
                    }
                ],
                data1:[],
                total:0,
                curPage:0,
                pageNum:10,
                queryName:"",
                showUpdateModel:false,
                showAddModel:false,
                curUpdateRow:{name:null,url:null},
                curAddRow:{name:null,url:null}
            }
        },
        mounted(){
            this.query();
        },

        methods:{
            addOk(){
                var cthis=this;
                axios({
                    url:"http://192.168.1.35/ums/frontSystemController/saveOrEdit",
                    method:"post",
                    headers:{
                        "Content-Type": "application/json;charset=UTF-8"
                    },
                    data:this.curAddRow
                }).then(resp=>{
                    if(resp.data.success){
                        cthis.query()
                        cthis.$Message.error({
                            content:"新增成功",
                            duration:1
                        })
                    }
                })
                this.showAddModel=false;
            },
            addCancel(){
                this.showAddModel=true;
            },
            updateOk(){
                axios({
                    url:"http://192.168.1.35/ums/frontSystemController/saveOrEdit",
                    method:"post",
                    headers:{
                        "Content-Type": "application/json;charset=UTF-8"
                    },
                    data:this.curUpdateRow
                })
                this.showUpdateModel=false;
            },
            updateCancel(){
                this.showUpdateModel=true;
            },
            deleteConfirm(index,row){
                var cthis=this;
                this.$Modal.confirm({
                    title:"前端系统",
                    content:"请是否删除该数据,删除将无法恢复",
                    onOk:function(){
                        axios({
                            url:"http://192.168.1.35/ums/frontSystemController/delete",
                            method:"post",
                            headers:{
                                "Content-Type": "application/json;charset=UTF-8"
                            },
                            data:{id:row.id}
                        }).then(resp=>{
                            if(resp.data.success){
                                cthis.query()
                                cthis.$Message.error({
                                    content:"删除成功",
                                    duration:1
                                })
                            }
                        })

                    }
                })

            },
            handlePage(curPage){
                this.curPage=curPage
                this.query();
            },
            handlePageSize(pageNum){
                this.pageNum=pageNum;
                this.query();
            },
            query(){
                var url="http://192.168.1.35/ums/frontSystemController/list/"+this.curPage+"/"+this.pageNum;
                axios({
                    url:url,
                    method:"post",
                    data:{"name":this.queryName},
                    headers:{
                        "Content-Type": "application/json;charset=UTF-8"
                    }
                }).then(res=>{
                        this.data1=res.data.data.rows;
                        this.total=res.data.data.total;
                });
            }
        }
    }
</script>
<style>
    div#um{
        font-size:12px;
    }
</style>

最终效果(点击左侧菜单)
在这里插入图片描述
其他组件(table 分页 表单)参考官网

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值