BeetleX.WebFamily针对Web SPA应用的改进

        BeetleX.WebFamily1.0在集成vue+element+axios的基础上添加应用页、窗体布局和登陆验证等功能。通过以上功能开发Web SPA应用时只需要编写vue控件和配置菜单即可实现应用开发。

使用

        创建一个.net控制台项目,然后通过Nuget引入BeetleX.WebFamily1.0组件,并在Main方法中编写以下代码:

static void Main(string[] args)
{WebHost host = new WebHost();//注册当前程序集host.RegisterController<Program>().Setting(o =>{o.SetDebug();o.Port = 80;o.LogLevel = EventArgs.LogType.Error;o.LogToConsole = true;}).Initialize(s =>{s.Vue().Debug();}).Run();
}

然后运行这个程序即可在浏览器上访问,BeetleX.WebFamily在没有任何配置的情况下访问页面如下:

组件默认的开始页面,接下来的工作就可以通过编写VUE组件和配置菜单来实现自己的系统功能。

VUE扩展函数

        为了更好地应对SPA开发,组件针对Vue扩展了一系列的方法用于开发的需要;这些方法可以在所有自定义的Vue组件中使用。

//打开主页面窗体
$toHome()
//告诉应用登陆的用户,一般用于自定义登陆时,用于通讯应用登陆成功
$userLogin(name)
//重新加载Web信息,包括菜单和登陆信息等
$loadWebInfo()
//关闭指定id的窗体
$closeWindow(id)
//打开或激活窗体,参数分别是:唯一于标识,标题,对应VUE的组件名称和传入的数据。
$openWindow(id,title,model,data)
//获取当前打的所有窗体
$getWindows()
//激活对应菜单id的窗体
$openMenu(id)
//获取当前登陆的用户信息,包括有:用户名和角色
$getUser()
//注册窗体大小变化通知
$addResize(callback)
//广播窗体大小通知
$resizeWindow()
//ajax的post请求
$post(url,data)
//ajax的get请求
$get(url,data)
//ajax的put请求
$put(url,data)

通过以上方法组件可以简单地和应用进行一些布局交互操作。

添加首页/菜单

        组件默认情况下是一个没有内容的主页面,为了满足的需求需要配置对应的默认页面和菜单。可以在Initialize方法里面添加以下代码进行一个应用初始化。

//设置应用标题
WebHost.Title = "Northwind";
//调协头部显示的Vue组的名称
WebHost.HeaderModel = "myheader";
//是否需要登陆,默认为false,当设置true时应用获取不到登陆状态会自弹出登陆
WebHost.MustLogin = true;
//设置应用对应首页的vue控件
WebHost.HomeModel = "home";
//获取菜单,方法参数分别是:当前用户名,角色和http上下文
//菜单支持多层,根本需要添加对应的Child即可
WebHost.GetMenus = (user, role, context) =>
{List<Menu> menus = new List<Menu>();var item = new Menu();item.ID = "home";//菜单IDitem.Name = "主页";//标题item.Img = "/images/home.png";//菜单图标,可缺省;item.Model = "home";//打开对应的vue组件。menus.Add(item);item = new Menu();item.ID = "product";item.Name = "产品";item.Img = "/images/product.png";item.Model = "products";menus.Add(item);item = new Menu();item.ID = "order";item.Name = "订单";item.Img = "/images/order.png";item.Model = "orders";menus.Add(item);item = new Menu();item.ID = "customer";item.Name = "客户";item.Img = "/images/customer.png";item.Model = "customers";menus.Add(item);item = new Menu();item.ID = "employee";item.Name = "雇员";item.Img = "/images/employee.png";item.Model = "employees";menus.Add(item);return Task.FromResult(menus);
};

通过以上配置重启程序就可以得到一个新的应用效果。

设置自定义头

        组件预留了一个头部位置,用来制定自己的应用头部信息,如:登陆用户,消息和快捷按钮等内容。

WebHost.HeaderModel = "myheader";

可以设置HeaderModel属性用于替换页面头部信息,然后通过Vue扩展函数进行页面相关操作,以下是示例头部的实现。

<div><h4>BeetleX Webfamily Northwind示例</h4><a style="float:right;position:absolute;margin-top:-40px;margin-left:350px;cursor:pointer;" v-if="$getUser().name" @click="$userSignout()">退出</a>
</div>

登陆/JWT配置

        有很多应用需要访问需要验证登陆,组件默认也集成这一功能;当使用这些功能的时候需要开启JWT验证和设置必须登陆访问。

host.UseJWT()//访问webapi时必须进行验证控制
//开启登陆,当应用检测到没有用户信息时自动弹出登陆窗体
WebHost.MustLogin = true;

当开启以上配置后访问应用会弹出以下登陆框进行登陆验证。

组件默认所有用户名都可以有效登陆并不加以控制,可以通过添加以下委托来实现登陆验证的逻辑处理。

WebHost.LoginHandler = (user, pwd, context) =>
{//写入cookiecontext.SetJwtToken(user, "user", 60 * 60);return Task.CompletedTask;
};

可以通过以上方法进行验证,验证错误抛出异常即可,如果成则通过context写入当前登陆信息。

        只要开启了JWT那所有请求的webapi方法都需要验证才能有效请求,如果不希望某些方法不进行验证可以在控制器或方法中打上以下标签。

 [AuthMark(AuthMarkType.NoValidation)]public class Home{}

        如果登陆框功能不满足要求也是可以自定义登陆窗体,只要编写一个登陆组件如下:

<div><el-form size="mini" :model="record" label-width="120px" ref="dataform"><el-row><el-col :span="24"><el-form-item label="用户名" prop="Name" :rules="Name_rules"><el-input size="mini" v-model="record.Name"></el-input></el-form-item></el-col></el-row><el-row><el-col :span="24"><el-form-item label="密码" prop="Password" :rules="Password_rules"><el-input size="mini" v-model="record.Password" show-password></el-input></el-form-item></el-col></el-row><el-row><el-col span="24" style="text-align:right"><el-button size="mini" style="padding-left:10px; padding-right:10px;" @click="submitForm">登陆</el-button></el-col></el-row></el-form>
</div>
<script>{props: [],data(){return {Name_rules: [{ required: true, message: '用户名不能为空!', trigger: 'blur' },],Password_rules: [{ required: true, message: '密码不能为空!', trigger: 'blur' },],record: {Name: null,Password: null,}};},methods: {submitForm() {this.$refs['dataform'].validate((valid) => {if (valid) {this.$post('/website/login', this.record).then(r => {this.$userLogin(this.record.Name);});}});},resetForm() {this.$refs['dataform'].resetFields();}},mounted(){}}
</script>

在登陆成功的方法中调用this.$userLogin(this.record.Name);通知应用;最后把这个组件配置即可:

WebHost.LoginModel = "mylogin";

组件定义

        使用组件后只需要专注于功能组件编写,组件支持*.vue文件格式基本和Vue CLI一样,微小的差别就是在这里无须import引用组件。所有vue文件必须编写在项目的views目录,引用组件的名称默认使用文件名称.

以下是员工信息修改组件:

<div><auto-form v-model="data" ref="editor" size="mini" style="width:600px;margin:auto;" @command="onSave"></auto-form>
</div>
<script>export default {props: ['token', 'winid'],data() {return {data: {}};},methods: {onSave() {this.$confirmMsg('是否要保存数据?', () => {this.$closeWindow(this.winid);});},},mounted() {var edit = new autoData();edit.addText("LastName", "LastName", true).require('The value cannot be null');edit.addText("FirstName", "FirstName", true).require('The value cannot be null');edit.addText("Title", "Title", true).require('The value cannot be null');edit.addText("TitleOfCourtesy", "TitleOfCourtesy", true).require('The value cannot be null');edit.addDate("BirthDate", "BirthDate", true).require('The value cannot be null');;edit.addDate("HireDate", "HireDate", true).require('The value cannot be null');;edit.addText("Address", "Address", true);edit.addText("City", "City", true);edit.addText("PostalCode", "PostalCode", true);edit.addText("Country", "Country", true);var f = edit.addSelect("ReportsTo", "ReportsTo", true);f.dataurl = '/EmployeesSelectOptions';f.nulloption = true;edit.addButton("save", "保存");if (this.token) {edit.setValue(this.token);}edit.bindForm(this.$refs.editor);},}
</script>

可以在员工列表中打开它

this.$openWindow('雇员' + e.data.Name, '(雇员)' + e.data.Name,'employeeinfo',  e.data);

组件定义了两个属性,分别是token和winid;只要通过$openWindow打开的都能接收到这两个信息,前者是打开窗体传进来的数据,后者是对应窗体ID;可以通过this.$closeWindow(this.winid);关闭自己所在窗体。

数据请求

        组件集成了axios进行ajax访问,为了让调用更方便组件提供了以下简化方法调用。

//ajax的post请求
$post(url,data)
//ajax的get请求
$get(url,data)
//ajax的put请求
$put(url,data)

以下是一个简单的登陆调用过程

this.$post('/website/login', this.record).then(r => {this.$userLogin(this.record.Name);
});

总结

        通过引入组件可以快带地进行Web SPA应用开发,组件提供基础布局、安全控制和数据访问的基础功能,让你可以更专注于业务功能的实现。虽然集成功能并不丰富,但足以帮你解决主要的繁琐工作。再结合:

http://vueeditor.beetlex.io/ 数据界面在线生成工具更加让你事半功倍。

通过以下地址下载完整示例:

https://github.com/beetlex-io/BeetleX-Samples

有使用上的问题可以提交到:

https://github.com/beetlex-io/FastHttpApi/issues

BeetleX

开源跨平台通讯框架(支持TLS)
提供高性能服务和大数据处理解决方案

https://beetlex.io

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

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

相关文章

php acl rbac,建站常用的用户权限管理模型ACL和RBAC的区别

常用的权限管理模型ACL和RBAC的区别1.ACLACL是最早也是最基本的一种访问控制机制&#xff0c;它的原理非常简单&#xff1a;每一项资源&#xff0c;都配有一个列表&#xff0c;这个列表记录的就是哪些用户可以对这项资源执行CRUD中的那些操作。当系统试图访问这项资源时&#x…

华为年终奖,小员工分百万!任正非:钱给多了,不是人才也变成了人才!

华为今年又提前发了巨额年终奖&#xff0c;并公布了新的奖金方案&#xff0c;23级奖金额有近百万&#xff0c;并且宣称“上不封顶、绝不拖欠”&#xff0c;一时间引起热议。任正非签发的内部文件&#xff1a;华为不搞按资排辈&#xff0c;只要做出突出贡献&#xff0c;在新方案…

Redis缓存穿透、缓存雪崩、缓存击穿好好说说

前言 Redis是目前非常流行的缓存数据库啦&#xff0c;其中一个主要作用就是为了避免大量请求直接打到数据库&#xff0c;以此来缓解数据库服务器压力&#xff1b;用上缓存难道就高枕无忧了吗&#xff1f;no,no,no&#xff0c;没有这么完美的技术&#xff0c; 缓存穿透、缓存雪崩…

这是“我”的故事 —— 董彬

点击蓝字 关注我们作者&#xff1a;董彬校对/文章优化&#xff1a;刘轶民排版&#xff1a;Rani视频地址&#xff1a;https://www.bilibili.com/video/BV1NK4y1p7Ys与世界周旋的程序员大家好&#xff0c;我叫董彬 &#xff0c;现就职于野村信息&#xff0c; Title 是 Senior …

我用Python玩小游戏“跳一跳”,瞬间称霸了朋友圈!

“从前几天微信最新版本 6.6.1 的更新开始&#xff0c;微信小程序游戏“跳一跳”似乎在一夜之间风靡了朋友圈。它甚至比五六年前的飞机大战游戏都火爆&#xff0c;这种小游戏的火爆不仅仅是因为有魔性、有意思&#xff0c;更重要的是可以进行好友 PK&#xff01;“跳一跳”的小…

expsky.php,Typecho漏洞利用工具首发,半分钟完成渗透

原标题&#xff1a;Typecho漏洞利用工具首发&#xff0c;半分钟完成渗透*本文原创作者&#xff1a;expsky&#xff0c;本文属FreeBuf原创奖励计划&#xff0c;未经许可禁止转载声明&#xff1a;本工具由expsky原创&#xff0c;仅用于技术研究&#xff0c;不恰当使用会对网站造成…

BeetleX之Web网关1.5.7安装使用

新版的网关主要升级到BeetleX最新版提高http协议的解释性能&#xff0c;从而让网关的吞吐能力进一步提升&#xff0c;在功能界面上也做了简单的调整让操作更方便&#xff0c;修复linux下无权限启动进程问题。如果在windows上不想用IIS&#xff0c;linux下用nginx怕麻烦&#xf…

费马大定理,集惊险与武侠于一体

悬案费马大定理从提出到证明的过程&#xff0c;就是一部不折不扣的惊险小说。一个读者&#xff0c;在自己看过的书空白处留下附注。除了他自己&#xff0c;还有谁会关注呢&#xff1f;但是&#xff0c;法国人费马死后&#xff0c;他在一本《算术》书上所写的注记并没有随之湮没…

全国计算机技术与软件专业技术资格(水平)考试基础知识

全国计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试基础知识 -------------------------------------------------------------------------------- 1、什么是计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试&#xff1f;  计算机技术与软件专…

GPU迎来投资热潮 退潮后谁在裸泳

近期&#xff0c;数家GPU设计公司获得资本青睐&#xff0c;摩尔线程完成数轮投资获得数十亿元&#xff0c;无独有偶&#xff0c;壁仞科技宣布完成总额11亿元的A轮融资&#xff0c;沐曦集成电路宣布完成近亿元天使轮融资&#xff0c;登临科技宣布完成A轮融资。另外&#xff0c;天…

All in AI, 一句话看出了百度的野心,也看到了人工智能人才的未来

最近几天&#xff0c;在 2018 CES科技盛会上&#xff0c;百度无人驾驶系统 Apollo 2.0 正式开放&#xff0c;百度COO 陆奇表示&#xff0c;借着 Apollo 平台&#xff0c;他想打造中国无人车国家队&#xff01;All in AI, 一句话看出了百度的野心。而百度&#xff0c;只是 China…

知名Node.js组件存在代码注入漏洞

喜欢就关注我们吧&#xff01;日前&#xff0c;一个被大量下载的 Node.js 组件被发现其含有一个高危的代码注入漏洞。该漏洞被追踪为 CVE-2021-21315&#xff0c;影响了「systeminformation」npm 组件的安全性&#xff0c;该组件每周的下载量约为 80 万次&#xff0c;自诞生以来…

VPC2007差分硬盘让小硬盘也能跑多个虚拟机

在Winos中看到http://bbs.winos.cn/thread-43391-1-1.html于 2008-9-2 16:02 发表基于Vmware Workstation 让你的小硬盘也能跑多个虚拟机个人认为有些做得不是很人性化。比如说我要把虚拟机母板封装好之后要修改为只读&#xff0c;而且还要隐藏起来。那么我再要创建虚拟机就要…

2017新生儿爆款名字出炉!90后的父母们最受欢迎的居然是.....

名字跟随一生因此很多家长在给孩子起名字的时候都相当谨慎除了日常迷信外不重名成为取名的重要考虑因素学校走廊里喊一声“子涵”&#xff0c;竟有3人回头&#xff01;&#xff01;你知道你家孩子的名字和多少人重名了吗&#xff1f;近日&#xff0c;江苏苏州一家科技公司发布《…

Kubernetes中分布式存储Rook-Ceph的使用:一个ASP.NET Core MVC的案例

在《Kubernetes中分布式存储Rook-Ceph部署快速演练》文章中&#xff0c;我快速介绍了Kubernetes中分布式存储Rook-Ceph的部署过程&#xff0c;这里介绍如何在部署于Kubernetes的ASP.NET Core MVC的应用程序中使用Rook-Ceph所创建的存储对象。构建ASP.NET Core MVC (.NET 5)应用…

在Windows上安装Docker

背景Windows的Docker桌面是Microsoft Windows的Docker的社区版本。您可以从Docker Hub下载适用于Windows的Docker桌面。该页面包含有关在Windows 10 Pro&#xff0c;Enterprise和Education上安装Docker Desktop的信息。如果要查找有关在Windows 10 Home上安装Docker桌面的信息.…

全景图解高铁数据,谁是最有潜力的高铁城市?

经过十年的快速发展&#xff0c;高铁已成为人们日常出行的重要交通工具&#xff0c;“千里江陵一日还”早已变成现实&#xff0c;高铁改变的不仅是不断刷新的“中国速度”&#xff0c;更为区域与城市发展带来新的模式与机遇。高铁以高速、大容量、集约型、通勤化的特征&#xf…

原型链的理解_javascript之快速理解(原型链)

希望通过比较通俗易懂的讲解和简短的文字&#xff0c;让大家能快速理解什么是原型链&#xff0c;如果有不对的地方也请各位大佬快速纠正&#xff0c;一起共勉&#xff0c;使我们初学者快速进阶&#xff01;话不多说&#xff0c;我们切入正题&#xff0c;按着我的步骤一步一步往…

如何轻松将上亿的数据玩弄于股掌之中?

在日常生活中&#xff0c;我们经常会遇到排序问题&#xff1a;在打扑克牌的时候&#xff0c;原本拿到手上的牌是乱序的&#xff0c;我们会按照自己喜好的顺序一张一张排好手上的牌&#xff0c;最后看起来是顺眼的。比如小智打扑克牌会将自己手上的牌排成这样&#xff1a;小智排…

php webshell开源,[github开源]webshell连接器--Jeshell

前言&#xff1a;以前连接webshell都是用一个好朋友写的Webshellsniper&#xff0c;但是昨天使用webshellsniper测试的时候&#xff0c;发现不能支持shell_exec()这个php函数&#xff0c;问了一下才知道&#xff0c;他写的默认是只用eval()和assert()函数的webshell。于是&…