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"/> <Button type="primary" @click="query">搜索</Button>
<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>