BeetleX之vue-autoui自匹配UI插件

vue-autoui 是一款基于vueelement扩展的一个自动化UI控件,它主要提供两个控件封装分别是auto-formauto-grid; 通过这两个控件可以完成大多数的信息输入和查询输出的需要.auto-formauto-grid是通过json来描述展示的结构,在处理上要比写html标签来得方便简单, 但这控件的最大优势并不是在这里,它最重要的功能是可以结合webapi的信息来自动输出界面,只需要调整webapi的信息结构即可完成UI的调整。

基础使用

控件可以直接在vuejs功能中使用,但需要结合json来设置具体UI展示,以下是一个简单的例子

    <auto-form ref="form" v-model="data" size="mini" :info="info"></auto-form><el-button @click="if($refs.form.success()){alert(JSON.stringify(data))}">确定</el-button>

功能很简单就是显示当前输入并验证通过的数据,下面用json描述信息输入源。

        data(){return {info: { items: [] },data: { },};},mounted(){var items = [];items.push({name: 'active', label: '活动名称', rules: [{ required: true, message: '请输入活动名称', trigger: 'blur' },{ min: 3, max: 5, message: '长度在 3 到 5 个字符', trigger: 'blur' }]});items.push({name: 'region', label: '活动区域', type: 'select',data: [{ value: '广州' }, { value: '深圳' }, { value: '上海' }, { value: '北京' }],rules: [{ required: true, message: '请选择活动区域', trigger: 'change' }],eof: true});items.push({ name: 'starttime', label: '开启时间', type: 'date', rules: [{ type: 'date', required: true, message: '请选择日期', trigger: 'change' }] });items.push({ name: 'endtime', label: '-', type: 'date', eof: true, rules: [{ type: 'date', required: true, message: '请选择日期', trigger: 'change' }] });items.push({ name: 'instant', type: 'switch', label: '即时配送', eof: true });items.push({name: 'nature', type: 'checkbox', label: '活动性质',rules: [{ type: 'array', required: true, message: '请至少选择一个活动性质', trigger: 'change' }],data: [{ value: '美食/餐厅线上活动' }, { value: '地推活动' }, { value: '线下主题活动' }, { value: '单纯品牌暴光' }], eof: true});items.push({name: 'resource', label: '特殊资源', type: 'radio', rules: [{ required: true, message: '请选择活动资源', trigger: 'change' }],data: [{ value: '线上品牌商赞助' }, { value: '线下场地免费' }], eof: true});items.push({ name: 'remark', label: '活动形式', type: 'remark', rules: [{ required: true, message: '请填写活动形式', trigger: 'blur' }] })this.info = { items: items}}

以上是使用json来描述一个输出的界面,具体效果如下:

虽然用json来描述界面会比html描述会方便一些,但总体上来说工作量还是有些大的,在调整界面的时候也不方便。接下介绍一下如何结合BeetleX.FastHttpApi来进一步简化这些繁琐的操作。

Webapi动态输出

其实在构建vue-autoui的时候更多是考虑和BeetleX.FastHttpApi进行一个整合,通过和后端融合可以把这些UI编写的工作量大大节省下来,让开发这些功能变得更简单方便,更重要的是api变化后界面就自动适应。使用要求:在和BeetleX.FastHttpApi整合还需要引用BeetleX.FastHttpApi.ApiDoc插件,因为这个插件用于给接口输出对应UI的JSON信息。接下来通过几个示例来介绍整合的方便性:

登陆

登陆功能是比较常见的,接下来看一下使用auto-form如何结合webapi来完成这个功能。

<div><auto-form ref="login" url="/login" v-model="login.data" size="mini"></auto-form><el-button size="mini" @click="if($refs.login.success())login.post()">登陆</el-button>
</div>

以上是一个登陆功能UI的定义,是不是很简单呢?通过指定url的webapi连接即可以自动适应UI;这时候只需要针对登陆接口进行一个定义即可:

        [Input(Label = "用户名", Name = "name", Eof = true)][Required("用户名不能为空", Name = "name")][Input(Label = "密码", Name = "pwd", Type = "password", Eof = true)][Required("用户密码不能为空", Name = "pwd")][Input(Label = "保存状态", Value = true, Name = "saveStatus")]public bool Login(string name, string pwd, bool saveStatus){Console.WriteLine($"name:{name} pwd:{pwd} saveStatus:{saveStatus}");return name == "admin";}

注册

接下来定义一个信息多些的注册界面

<div><auto-form ref="login" url="/register" v-model="register.data" size="mini" @completed="onCompleted"></auto-form><el-button size="mini" @click="if($refs.login.success())register.post()">注册</el-button>
</div>

在UI定义上基于没什么变化,只是调整一下对应的url地址,在这里多了一下completed事件,这个事件主要是通过接口加载UI信息才会触发的。对应功能的javascript代码

        data(){return {register: new beetlexAction('/register', {}),checkConfirmPassword: (rule, value, callback) => {var password = this.$refs.login.getField('Password');var cpassword = this.$refs.login.getField('ConfirmPassword');if (password.value != cpassword.value)callback(new Error('确认密码不正确!'));elsecallback();},}},methods: {onCompleted(){this.$refs.login.getField('ConfirmPassword').rules.push({ validator: this.checkConfirmPassword, trigger: 'blur' });},},mounted() {this.register.requested = (r) => {alert(JSON.stringify(r));};}

代码主要是定密码和确认密码的对比验证,接下来看一下后台注册对应的接口

    [Post]public RegisterDto Register(RegisterDto register){Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(register));return register;}public class RegisterDto{[Input(Label = "用户名", Eof = true)][Required("用户名不能为空")][DataRange("用户名的必须大于3个字符", Min = 3)]public string Name { get; set; }[Input(Label = "邮箱地址", Eof = true)][Required("邮件地址无效", Type = "email")]public string Email { get; set; }[Input(Label = "密码", Eof = true, Type = "password")][Required("输入密码")]public string Password { get; set; }[Input(Label = "确认密码", Eof = true, Type = "password")][Required("输入确认密码")]public string ConfirmPassword { get; set; }[GenderInput(Label = "性别", Value = "男", Eof = true)]public string Gender { get; set; }[Required("选择所在城市")][CityInput(Label = "城市", Eof = true)]public string City { get; set; }[HobbyInput(Label = "爱好")][Required("选择爱好", Type = "array", Trigger = "change")]public string[] Hobby { get; set; }}

服务代码也没太多的变化,只是通过一些标签来标记一下相关属性的数据源和输入要求.具体运行效果如下:

数据列表

有应用中除了数据输出外更多的数据列表,auto-grid即是专门用于处理列表的一个控件,这个控件提供分页,选择,编辑和删除的功能;接下来做一个简单的雇员列表示例:

<auto-grid url="/employees" @completed="employees.get()"@itemchange="onItemChange" @itemdelete="onItemDelete"@command="onCommand":data="employees.result" size="mini" height="100%" edit="true" delete="true">
</auto-grid>

这个列表提供编辑和删除功能,相关脚本代码如下:

        data(){return {employees: new beetlexAction('/employees', {}, [])}},methods: {onCommand(e){this.$open('models-employee', e.data);},onItemChange(item){if (confirm('是否要修改' + item.data.FirstName + '?')) {item.success();}},onItemDelete(item){if (confirm('是否要删除' + item.data.FirstName + '?')) {item.success();}},},mounted() {}

接下来的工作就是在服务端定义api来输出结果

        [Column("FirstName", Type = "link")][Column("LastName", Read = true)][Column("Title")][Column("HomePhone")][Column("City")][Column("Address")]public object Employees(){return DataHelper.Defalut.Employees;}

动态查询

实际应用中需要提供查询条件输入,这个时候就可以把auto-formauto-grid整合起来,以下通过一个简单的订单查询来展示这两个控件结合使用

    <auto-form url="/orders" v-model="orders.data" @completed="orders.get()" size="mini" @fieldchange="orders.get()"></auto-form><auto-grid url="/orders" height="300" :data="orders.result.items" :pages="orders.result.pages" :currentpage="orders.result.index" @pagechange="onPageChange" size="mini"></auto-grid>

可以在auto-formfieldchange事件中自动执行查询,对应的脚本代码如下:

        data(){return {orders: new beetlexAction("/orders", {}, { index: 0, pages: 0, items: [] })};},methods: {onPageChange(page){this.orders.data.index = page;this.orders.get();},},mounted(){}

接下来需要实现服务端代码,由于方法需要描述输入和列表所以对应的标签比较多

        [Input(Name = "id", Type = "select", DataUrl = "/EmployeeSelecter", Label = "雇员",NullOption =true)][Input(Name = "customerid", Type = "select", DataUrl = "/CustomerSelecter", Label = "客户",NullOption =true,  Eof = true)][SizeInput(Name = "size", Label = "分页记录数")][Input(Name = "index", Hide = true)][Column("OrderID", Read = true)][Column("EmployeeID", Type = "select", DataUrl = "/EmployeeSelecter")][Column("CustomerID", Type = "select", DataUrl = "/CustomerSelecter")][Column("OrderDate", Type = "date")][Column("RequiredDate", Type = "date")][Column("ShippedDate", Type = "date")]public object Orders(int id, string customerid, int index, int size, IHttpContext context){Func<Order, bool> exp = o => (id == 0 || o.EmployeeID == id)&& (string.IsNullOrEmpty(customerid) || o.CustomerID == customerid);int count = DataHelper.Defalut.Orders.Count(exp);if (size == 0)size = 20;int pages = count / size;if (count % size > 0)pages++;var items = DataHelper.Defalut.Orders.Where(exp).Skip(index * size).Take(size);return new { pages, index, items };}

插件详细代码 https://github.com/IKende/BeetleX-Samples/tree/master/Web.AutoUI

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

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

相关文章

protobufjs 命令执行_protobufjs简单使用

npm i protobufjs -D添加两个proto文件User.protosyntax "proto3";package login;message PBUser {string uid 1;string pwd 2;int64 age 3;}Login.protosyntax "proto3";package login;import "./User.proto";message LoginReq {PBUser us…

.NET Core开发实战(第27课:定义Entity:区分领域模型的内在逻辑和外在行为)--学习笔记...

27 | 定义Entity&#xff1a;区分领域模型的内在逻辑和外在行为上一节讲到领域模型分为两层一层是抽象层&#xff0c;定义了公共的接口和类另一层就是领域模型的定义层先看一下抽象层的定义1、实体接口 IEntitynamespace GeekTime.Domain {public interface IEntity{object[] G…

Abp vNext发布v2.3!

在全球范围内病毒笼罩的日子里,我们发布了ABP框架v2.3, 这篇文章将说明本次发布新增内容和过去的两周我们做了什么.关于新冠病毒和我们的团队关于冠状病毒的状况我们很难过.在Volosoft的团队,我们有不同国家的远程工作者在自己家里工作.从上周开始,我们已经完全开始在家远程工作…

ASP.NET Core 中间件分类

ASP.NET Core 中间件的配置方法可以分为以上三种&#xff0c;对应的Helper方法分别是&#xff1a;Run(), Use(), Map()。Run()&#xff0c;使用Run调用中间件的时候&#xff0c;会直接返回一个响应&#xff0c;所以后续的中间件将不会被执行了。Use()&#xff0c;它会对请求做一…

redis持久化到mysql的方案_redis进阶: 数据持久化

redis是内存数据库&#xff0c;即数据库状态都是存储于内存中&#xff0c;因此&#xff0c;当服务器重启或者断开后&#xff0c;数据便会丢失&#xff1b;为了解决数据丢失问题&#xff0c;便需要将数据从内存保持到磁盘中&#xff0c;这就是redis的数据持久化目前&#xff0c;…

如何创建一个自定义的`ErrorHandlerMiddleware`方法

在本文中&#xff0c;我将讲解如何通过自定义ExceptionHandlerMiddleware&#xff0c;以便在中间件管道中发生错误时创建自定义响应&#xff0c;而不是提供一个“重新执行”管道的路径。作者&#xff1a;依乐祝译文&#xff1a;https://www.cnblogs.com/yilezhu/p/12497937.htm…

mysql or中有空查询慢_MySQL 慢查询日志

1.定义2.相关参数2.开启3.原因4.慢查询日志工具mysqldumpslow1.定义作用:用来记录在MySQL中响应时间超过阀值的语句。2.相关参数mysql> show variables like %slow_query%;------------------------------------------------------------| Variable_name | Value …

从业务需求抽象成模型解决方案

从业务需求调研&#xff0c;通过抽象转换成模型技术方案&#xff0c;本文将对这个过程做个拆解&#xff0c;供大家参考。以下我所说的可能都是错的&#xff0c;只是一家之见&#xff0c;欢迎大家在留言区多提意见和看法&#xff0c;互相共勉。一、订单对象-信息需求公司的运营都…

《C++ Primer》7.1.4节练习

练习7.11: #include <iostream> #include <cstring> using namespace std;class Sales_data {public:Sales_data() default;Sales_data(const std::string &book): bookNo(book) {}Sales_data(const std::string &book, const unsigned num, const doubl…

DotNetCore Web应用程序中的Session管理

原文来自互联网&#xff0c;由长沙DotNET技术社区编译。如译文侵犯您的署名权或版权&#xff0c;请联系小编&#xff0c;小编将在24小时内删除。限于译者的能力有限&#xff0c;个别语句翻译略显生硬&#xff0c;还请见谅。作者简介&#xff1a;Jon&#xff08;Jonathan&#x…

css3是什么 ptml_CSS3

CSS3HTMLCSSJavaScript结构表项交互如何学习&#xff1f;CSS是什么CSS怎么用(快速入门)CSS选择器(重点难点)美化网页(文字、阴影、超链接、列表、渐变...)盒子模型浮动定位网页动画(特效效果)1、初识CSS1.1、什么是CSSCascading Style Sheet(层叠样式表)CSS&#xff1a;表现(美…

python docx runs_别再问我Python怎么操作Word了!

安装docx是一个非标准库&#xff0c;需要在命令行(终端)中使用pip即可安装pip install python-docx一定要注意&#xff0c;安装的时候是python-docx而实际调用时均为docx!前置知识Word中一般可以结构化成三个部分&#xff1a;文档Document段落Paragraph文字块Run也就是Document…

【要闻】如何基于K8s管理1600个微服务?某数字化银行秘诀公开

Cloud Foundry Foundation宣布KubeCF为新孵化项目Cloud Foundry Foundation是开放源代码项目的聚集地&#xff0c;简化了开发人员的体验&#xff0c;近日其宣布&#xff0c;KubeCF已成为该基金会的孵化项目&#xff0c;并已发布版本1.0.1。KubeCF是Cloud Foundry应用程序运行时…

如何用 Blazor 实现 Ant Design 组件库?

本文主要分享我创建 Ant Design of Blazor 项目的心路历程&#xff0c;已经文末有一个 Blazor 线上分享预告。Blazor WebAssembly 来了&#xff01;Blazor 这个新推出的前端 Web 框架&#xff0c;想必是去年 .NET Core 3.0 发布时才进入 .NET 开发者的视线的。但其实&#xff0…

.NET Core开发实战(第28课:工作单元模式(UnitOfWork):管理好你的事务)--学习笔记...

28 | 工作单元模式&#xff08;UnitOfWork&#xff09;&#xff1a;管理好你的事务工作单元模式有如下几个特性&#xff1a;1、使用同一上下文2、跟踪实体的状态3、保障事务一致性我们对实体的操作&#xff0c;最终的状态都是应该如实保存到我们的存储中&#xff0c;进行持久化…

《C++ Primer》7.3.2节练习

练习7.27: #include <iostream> #include <cstring> using namespace std;class Screen {private:unsigned height 0, width 0;unsigned cursor 0;string contents;public:Screen() default;Screen(unsigned ht, unsigned wd): height(ht), width(wd), conten…

【实战 Ids4】║ 控制台密码模式搭配Ocelot网关

&#xff08;此岁只能云赏樱了&#xff09;书接上文&#xff0c;这些天一直在研究IdentityServer4&#xff08;下文简称Ids4&#xff09;框架&#xff0c;发现有很多有意思&#xff0c;或者说比我想象中的知识点&#xff0c;可扩展的多&#xff0c;所以比较开心能钻研进去&…

《C++ Primer》7.3.3节练习

练习7.31: 满足题意的程序如下所示&#xff1a; class X;//声明类型X class Y//定义类型Y {X* x; }; class X//定义类型X {Y y; };类X的声明称为前向声明&#xff0c;它向程序中引入了名字X并且指明X是一种类类型。对于类型X来说&#xff0c;此时我们已知它是一个类类型&#…

.NET Core 如何生成信用卡卡号

点击上方蓝字关注“汪宇杰博客”导语上个月我写了《.NET Core 如何验证信用卡卡号》&#xff0c;不少朋友表示挺有兴趣。在金融科技行业的实际工作中&#xff0c;通常还需要生成信用卡卡号用来测试&#xff0c;今天我就来教大家如何生成信用卡卡号。上回的改进上篇文章写完后&a…

python怎么爬虎牙_使用python爬虫框架scrapy抓取虎牙主播数据

前言本文利用python的scrapy框架对虎牙web端的主播、主播订阅数、主播当前观看人数等基本数据进行抓取&#xff0c;并将抓取到的数据以csv格数输出&#xff0c;以及存储到mongodb中思路观察虎牙网站后确认所有频道url都在www.huya.com/g中的&#xff0c;而主播房间数据则是ajax…