BeetleX.AdminUI是基于Beetlexjs+Vuejs+Bootstrap相结合的后台管理框架,主要介绍在不使用Webpack的情况下,如何用VS来开发一个单页面的Web后台管理应用。如果你喜欢用Vuejs+Html,那通过这个示例你可以更好的了解Vuejs+Html的使用。在介绍之前先看一下效果:

可以通过访问 http://adminui.beetlex.io/ 查看在线演示.

在开发过程中虽然没有和Webpack,不过模式还是遵循组件化方式进行处理;通过这个示例让不想使用Webpack的开发人员可以使用另一种途径来进行开发Vue前端应用。

首页

这种模式没有app.js,取而代之的是一个index.html,这个页面主要是用于描述界面的主体布局,具体如下:

    <div id="page">
<main_menu @menu_resize="OnMenuResize($event)" @openwindow="OnOpenWindow($event)"></main_menu>
<windows_bar :windows="windows" :full="full" :selectwindow="selectWindow.id" @openwindow="OnOpenWindow($event)" @close="OnCloseWindows($event)"></windows_bar>
<div class="main-content" :style="{left:(full=='max'?'50px':'250px')}">
<keep-alive>
<component :is="selectModel" @openwindow="OnOpenWindow($event)" :token="selectWindow.data"></component>
</keep-alive>
</div>
<page_footer></page_footer>
</div>

布局很简单包括有主菜单,页脚,窗体栏和主内容显示.主页面的功能很简单,主要用来管理切换窗体,新建窗体和关闭窗体即可;详细代码如下:

        Vue.prototype.$open = function (id, title, model, data) {
this.$emit('openwindow', { id: id, title: title, model: model, data: data });
};
var model = {
full: 'min',
windows: [],
selectWindow: {
},
selectModel: '',
};
var page = new Vue({
el: '#page', data: model,
methods: {
OnMenuResize: function (event) {
this.full = event;
}, OnCloseWindows: function (e) {
var index = -1;
for (i = 0; i < this.windows.length; i++) {
if (this.windows[i].id == e.id) {
index = i;
break;
}
}
if (index >= 0) {
this.windows.splice(index, 1);
if (this.windows.length > 0)
this.OnOpenWindow(this.windows[0]);
else {
this.selectWindow = null;
this.selectModel = null;
}
} }, OnOpenWindow: function (e) {
var items = [];
items.push(e);
for (i = 0; i < this.windows.length; i++) {
var item = this.windows[i];
if (item.id != e.id)
items.push(item);
}
this.windows = items;
this.selectWindow = e;
this.selectModel = e.model;
},
}
});
page.OnOpenWindow({ id: 'home', title: '主页', model: 'models_home' })

windows_bar

这个组件主要描述窗体的标签,解决窗体的切换功能​;具体Vue模块如下:

<template id="__windowsbar">
<div class="windows_bar" :style="{left:(fullStatus=='max'?'60px':'260px')}">
<ul class="nav nav-tabs" style="display:flex">
<li v-for="item in items" role="presentation" :class="[select==item.id?'active':'']">
<a href="javascript:void(0)" @click="$open(item.id,item.title,item.model)">{{item.title}}</a>
<img v-if="item.id!='home'" @click="OnClose(item)" src="/images/tabclose.png"/>
</li>
</ul>
</div>
</template>

对应的展示如下:

这个组件包括了一些简单的行为,选择窗体$open(item.id,item.title,item.model)和关闭窗体OnClose(item);还有一个行为就是根据主菜单的样式来调整自己的占比宽度。详细的功能代码如下:

    Vue.component('windows_bar', {
props: ['windows', 'full', 'selectwindow'],
data: function () {
return {
fullStatus: this.full,
items: this.windows || [],
select: this.selectwindow
}
},
watch: {
full(val) {
this.fullStatus = val;
},
windows(val) {
this.items = val;
},
selectwindow(val) {
this.select = val;
},
},
methods: {
OnClose: function (e) {
this.$emit('close', e);
}
},
template: __windowsbar,
mounted: function () { }
});

主菜单

主菜单主要用于描述关键模块窗体,它有两种展示模式分别是:全显示和只显示功能图标

<template id="__menu">
<div :class="[full=='min'?'menu_full':'menu_min']">
<div>
<h3 v-if="full=='min'" style="margin-top:10px;margin-right:-5px;padding-left:20px;">BeetleX.AdminUI</h3>
<a v-if="full=='min'" href="javascript:void(0)" @click="OnResizeMenu('max')" style="float:right;margin-top:-35px;"><img style="width:24px;" src="/images/min.png" /></a>
<hr v-if="full=='min'" style="padding:4px;margin:0px;" />
<ul>
<li v-if="full!='min'"><a href="javascript:void(0)" @click="OnResizeMenu('min')">
<img src="/images/full.png" style="height:32px;" /></a></li>
<li>
<a href="javascript:void(0)" @click="OnOpenHome">
<img src="/images/home.png" style="height:32px;" />
<span v-if="full=='min'">主页</span>
</a>
</li>
<li>
<a href="javascript:void(0)" @click="OnOpenCustomer">
<img src="/images/customer.png" style="height:32px;" />
<span v-if="full=='min'">客户</span>
</a>
</li>
<li>
<a href="javascript:void(0)" @click="OnOpenOrders">
<img src="/images/order.png" style="height:32px;" />
<span v-if="full=='min'">订单</span>
</a>
</li>
<li>
<a href="javascript:void(0)" @click="OnOpenEmployees">
<img src="/images/employee.png" style="height:32px;" />
<span v-if="full=='min'">雇员</span>
</a>
</li>
<li>
<a href="javascript:void(0)" @click="OnOpenAbout">
<img src="/images/about.png" style="height:32px;" />
<span v-if="full=='min'">关于</span>
</a>
</li>
</ul>
</div>
</div>
</template>

主菜单的主要功能就是告诉页面需要打开那个模块,具体代码如下:

<script>
Vue.component('main_menu', {
data: function () {
return {
full: 'min',
}
},
methods: {
OnResizeMenu: function (value) {
this.full = value;
this.$emit('menu_resize', value)
},
OnOpenHome: function () {
this.$open('home', '主页', 'models_home');
},
OnOpenCustomer: function () {
this.$open('customers', '客户列表', 'models_customers');
},
OnOpenEmployees: function () {
this.$open('employees', '雇员列表', 'models_employees');
},
OnOpenOrders: function () {
this.$open('orders', '订单列表', 'models_orders');
},
OnOpenAbout: function () {
this.$open('about', '关于', 'models_about');
},
},
template: __menu,
mounted: function () { }
});
</script>

这样一个能支持多模块显示切换的主页就完成了,接下来的工作就是实现相关子模块,由于这个示例的子模块比较多就不一一介绍,只是抽取个别来介绍。

客户列表

接下来简单地介绍一下客户列表模块,并在模块中打开一个客户信息的窗体。

详细模板实现如下:

<template id="__models_customers">
<div>
<table class="table">
<thead>
<tr>
<th>CustomerID</th>
<th>CompanyName</th>
<th>ContactName</th>
<th>ContactTitle</th>
<th>Phone</th>
<th>Fax</th>
</tr>
</thead>
<tbody>
<tr v-for="item in items">
<td><a href="javascript:void(0)" @click="OnOpen(item)"> {{item.CustomerID}}</a></td>
<td>{{item.CompanyName}}</td>
<td>{{item.ContactName}}</td>
<td>{{item.ContactTitle}}</td>
<td>{{item.Phone}}</td>
<td>{{item.Fax}}</td>
</tr>
<tr v-if="GetCustomers.data.index<pages">
<td colspan="6" style="text-align:right;">
<a href="javascript:void(0)" @click="GetCustomers.get()">({{GetCustomers.data.index}}/{{pages}})更多...</a>
</td>
</tr>
</tbody>
</table>
</div>
</template>

对应的脚本代码

    Vue.component('models_customers', {
data: function () {
return {
GetCustomers: new beetlexAction("/Customers", { index: 0 }, { pages: 0, items: [] }),
pages: 0,
items: []
}
},
methods: {
OnOpen: function (item) {
this.$open('cust' + item.CustomerID, '客户:' + item.CompanyName, 'models_customerdetail', { id: item.CustomerID });
}
},
mounted: function () {
var _this = this;
this.GetCustomers.requested = function (r) {
_this.pages = r.pages;
this.data.index++;
r.items.forEach(function (v) {
_this.items.push(v);
});
};
this.GetCustomers.get();
},
template: __models_customers,
})

以上是一个客户列表的功能模块,其他模块就不详细介绍,可以查看项目

https://github.com/IKende/AdminUI

BeetleX.AdminUI介绍的更多相关文章

  1. vs.net/vscode中使用Beetlex创建vue应用

    平时在开发Vue应用则需要安装nodejs,vue cli等相关东西相对来说麻烦一些:如果你喜欢像vs.net/vscode创建普通项目一样就能开发Vue项目的话那可以尝试一下BeetleX针对Vue ...

  2. .net core高性能通讯开源组件BeetleX

    BeetleX beetleX是基于dotnet core实现的轻量级高性能的TCP通讯组件,使用方便.性能高效和安全可靠是组件设计的出发点!开发人员可以在Beetlx组件的支持下快带地构建高性能的T ...

  3. BeetleX高性能通讯开源组件

    net core高性能通讯开源组件BeetleX https://www.cnblogs.com/smark/p/9617682.html BeetleX beetleX是基于dotnet core实 ...

  4. 使用BeetleX的TcpBenchmark工具进行百万设备模拟测试

    其实TCP测试的工具有很多,那BeetleX工具所提供的特点又是什么呢?如果你需数十万的请求或模拟上百万的设备连接,那这个工具相信可以满足你的需要!工具是基于BeetleX的基础功能扩展,支持多IP绑 ...

  5. asp.net core系列 53 IdentityServer4 (IS4)介绍

    一.概述 在物理层之间相互通信必须保护资源,需要实现身份验证和授权,通常针对同一个用户存储.对于资源安全设计包括二个部分,一个是认证,一个是API访问. 1 认证 认证是指:应用程序需要知道当前用户的 ...

  6. BeetleX快速构建多平台的TCP和SSL TCP应用

    对于普通开发者而言编写TCP应用通讯是一件相对复杂的工作,毕竟需要一系列的bytes操作:如果再针对SSL的安全性处理相信会把很多普通开发者拒之门外.为了简化这一问题BeetleX引入了Stream操 ...

  7. Winform/WPF中内嵌BeetleX的HTTP服务

    在新版本的BeetleX.FastHttpApi加入了对netstandard2.0支持,如果程序基于.NetFramework4.6.1来构建WinForm或WPF桌面程序的情况下可以直接把Beet ...

  8. dotnet core开源博客系统XBlog介绍

    XBlog是dotnet core平台下的个人博客开源系统,它只需要通过Copy的方式即可以部署到Linux和windows系统中:如果你有安全证书那只需要简单配置一下即可提供安全的Https服务.接 ...

  9. BeetleX之HttpClusterApi应用详解

    之前的文章已经介绍过如何使用HttpClusterApi进行去中心化的HTTP集群服务访问,这一章主要详细讲述如何使用HttpClusterApi,主要包括如何定义节点,创建服务接口和使用接口描述不同 ...

随机推荐

  1. $bzoj4722$ 由乃 搜索

    正解:搜索 解题报告: 传送门$QwQ$ 首先发现长度为$len$的子集的值域为$[0,v\cdot len+len]$,数量为$2^{len}$.所以当$2^{len}\geq v\cdot len ...

  2. $Noip2015/Luogu2661$ 信息传递 并查集

    Luogu $Description$ 给定一个有向图,每个点只有一条出边.求图里的最小环. $Sol$ 使得这个题不难的地方就在于每个点只有一条出边叭. 一边连边一边更新答案.首先当然是初始$f[i ...

  3. $Poj3017\ Cut\ The\ Sequence$ 单调队列优化$DP$

    Poj   AcWing Description 给定一个长度为N的序列 A,要求把该序列分成若干段,在满足“每段中所有数的和”不超过M的前提下,让“每段中所有数的最大值”之和最小. N<=10 ...

  4. [UWP]XAML中的响应式布局技术

    响应式布局的概念是一个页面适配多个终端及不同分辨率.在针对特定屏幕宽度优化应用 UI 时,我们将此称为创建响应式设计.WPF设计之初响应式设计的概念并不流行,那时候大部分网页设计师都按着宽度960像素 ...

  5. spark(1.1) mllib 源码分析(三)-决策树

    本文主要以mllib 1.1版本为基础,分析决策树的基本原理与源码 一.基本原理 二.源码分析 1.决策树构造 指定决策树训练数据集与策略(Strategy)通过train函数就能得到决策树模型Dec ...

  6. django框架中的静态文件引入

    首先在项目文件中新建文件夹static 之后在settings.py中配置路径 如下图所示: 下一步在你刚创建的static文件夹中添加app的文件夹名称,例如:teacher,如下图: 之后在tea ...

  7. 倍增LCA模板2董博文版 伪代码

    Dfs(int rt){ f[][rt]; ;k<=;k++) f[k][rt]=f[k-][f[k-][rt]]; } int LCA(int x,int y){ if(Dp[x]<Dp ...

  8. php获取本年、本月、本周时间戳和日期格式

    时间戳格式: //获取今日开始时间戳和结束时间戳 $beginToday=mktime(0,0,0,date('m'),date('d'),date('Y')); $endToday=mktime(0 ...

  9. numpy 其它常用方法

    一.创建特殊的数组 1.ones() 语法 np.ones(shape, dtype=None) # shape 创建数组的shape # dtype 指定数组的数据类型 例子 import nump ...

  10. pycharm 连接mysql失败

    1.下载与之对应的驱动 2.更改数据库的时区(问题大多数出现在这里) .查看时区 show variables like '%time_zone%'; .设置时区 set global time_zo ...