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;测光主要是测定被拍摄对象反射到镜头中的光亮度然后在根据这一亮度给出一定的光圈快门速度组合。而…

python3怎么安装gmpy2_python2/3 模块gmpy2在linux下安装

&#xff01;&#xff01;&#xff01;首先建议在Windows下安装 因为很方便&#xff01;&#xff01;&#xff01;gmpy2是解密RSA时所用脚本的一个模块python下输入 import gmpy2 ,提示 Traceback (most recent call last): File"", line 1, in ImportError: No mod…

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

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

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

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

php字符串赋值给变量,JavaScript-如何将一个PHP字符串安全赋值给Javascript变量(包含引号和换行符的)...

php json_encode输出变量&#xff0c;在js使用(不是赋值)的时候转换成相应的字符串进行操作.注意&#xff1a;因为中文在json_encode会出问题。因此大家写了一个第三方的json_encode;class json {function __construct() {}function encode($array) {$this -> arrayRecursiv…

小计 合计 -统计

create table [tb]([客户编码] varchar(10),[客户名称] varchar(10),[数量] int) insert [tb] select 001,A,2 union all select 001,A,3 union all select 001,A,4 union all select 002,B,1 union all select 002,B,2 --统计 select * from (select * from tb union all s…

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

点击蓝字 关注我们作者&#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;不恰当使用会对网站造成…

游标 和 锁的概述

--用游标 declare str varchar(100) --定义游标 declare DZCursor CURSOR for SELECT test_str FROM test where test_strxxx --打开游标 open DZCursor --从游标取记录 fetch next from DZCursor into str --当有记录 while fetch_status0 begin insert into test (tes…

BeetleX之Web网关1.5.7安装使用

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

JAVA world转图片,将Kinect深度图像转换为真实世界坐标

我正在使用kinect&#xff0c;使用OpenNI 2.x&#xff0c;c&#xff0c;OpenCV .我能够获得kinect深度流并获得灰度cv :: Mat . 只是为了说明它是如何定义的&#xff1a;cv::Mat m_depthImage;m_depthImage cvCreateImage(cvSize(640, 480), 8, 1);我想最接近的值用“0”表示&a…

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

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

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

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

python中pd series_python-比较pd.Series并在该系列不包含None时获得异常结果

我想知道为什么将两个相同的系列与None值进行比较会返回False&#xff1a;pd.Series([x, y, None]) pd.Series([x, y, None])0 True1 True2 Falsedtype: bool我希望所有结果都是正确的.如果我从系列中创建一个数组,并进行比较,我将得到预期的结果&#xff1a;pd.Series([x, y,…

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

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

网站底部运行时间的php代码,网站底部运行时间统计代码

也许您和我一样&#xff0c;想在自己站点底部或者任意位置添加一个运行时间统计的代码&#xff0c;对我来说这是一个特殊的日子&#xff0c;值得留恋&#xff0c;值得铭记。在这里我也收集并测试了部分&#xff0c;能有效的显示本站已运行N天&#xff0c;接下来上干货吧。js实现…

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

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

《Oracle大型数据库在AIX UNIX上的实战详解》的集中答疑九 数据库字符集与国家语言...

陆续收到若干同行来邮件&#xff0c;讨论关于数据库字符集和国家语言字符集之间的关系。这里我提出自己的看法。本文后面的内容部分来自网上关于Sybase ASE的一篇技术文摘&#xff0c;但下载日久&#xff0c;难分谁之作品&#xff0c;这里借用一下&#xff0c;如果正好是您的&a…