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

BeetleX之vue-autoui自匹配UI插件相关推荐

  1. 用vue优雅地编写UI组件的几条指导原则

    前言 最近在尝试写几个UI组件,并通过阅读element-ui的源码,与其反复比较,然后认真思考,最后总结出一些自己的一些心得和体会.在造轮子的过程中,既巩固了html,css,js基础,又加深了对v ...

  2. 【分享】Vue 资源典藏(UI组件、开发框架、服务端、辅助工具、应用实例、Demo示例)...

    Vue 资源典藏,包括:UI组件 开发框架 服务端 辅助工具 应用实例 Demo示例 element ★11612 - 饿了么出品的Vue2的web UI工具套件 Vux ★7503 - 基于Vue和 ...

  3. jQuery UI 插件

    jQuery UI 插件 1.概述 1.简介 UI -> User Interface用户界面 jQuery UI是jQuery官方提供的插件,他强化了jQuery中搭载的动画效果及特效,以实现 ...

  4. vue开源项目(各大插件,gitup源码)

    vue开源项目(各大插件,gitup源码) 目录 UI组件 开发框架 实用库 服务端 辅助工具 应用实例 Demo示例 UI组件 element★31142 - 饿了么出品的Vue2的web UI工具 ...

  5. lua搭建ui_构建类魔兽UI插件的lua安全沙箱

    魔兽的UI插件结构 1.使用lua+XML作为配置 分析:XML虽然人机交互很好,但其实没有几个UI是真正用纯XML写的,大多还是用编辑器比较方便.速度很慢,但尚不清楚魔兽代码里是否进行优化 2. I ...

  6. 开源Vue表格组件,表格插件源码

    开源Vue表格组件,表格插件源码 前言: 关于html里面原生的table,通常满足不了程序员的要求.所以开发了一款表格插件,其功 能有: 1 导入json格式数据后,自动填充表格.表格长宽自适应.排 ...

  7. 实战:vue项目中导入swiper插件

    版本选择 swiper是个常用的插件,现在已经迭代到了第四代:swiper4. 常用的版本是swiper3和swiper4,我选择的是swiper3. 安装 安装swiper3的最新版本3.4.2: ...

  8. 解决vue版本不匹配的问题 Vue packages version mismatch:

    解决vue版本不匹配的问题 Vue packages version mismatch: 参考文章: (1)解决vue版本不匹配的问题 Vue packages version mismatch: ( ...

  9. iView 3.3.0 发布,基于 Vue.js 的企业级 UI 组件库

    iView 3.3.0 发布了,代号 Transistor ,iView 是一套基于 Vue.js 的企业级 UI 组件库,主要服务于 PC 界面的中后台产品. 本次更新如下: https://www ...

最新文章

  1. 简单几何(线段相交+最短路) POJ 1556 The Doors
  2. 动态规划系列---求数组中两个元素差的最大值
  3. html中传递sessionid,sessionID是怎么在客户端和服务器端传递的?
  4. ecm工作原理 usb_“好玩具”来了!往你的USB端口里藏入一个小开发板...
  5. Android APP 引导页实现-第一次应用进入时加载
  6. servlet返回数据给html_Servlet 简介
  7. 熟悉c语言运行环境实验原理,c语言实验报告1
  8. 嵌入式Linux系统编程学习之二十九线程的互斥
  9. 2021年中国船用蓄电池市场趋势报告、技术动态创新及2027年市场预测
  10. HashTable和HashMap的区别详解(转)
  11. Java实战项目,附带源码+视频教程,收藏!
  12. 快速了解SOLIDWORKS Simulation的有限元分析法
  13. php 跑马灯抽奖,九宫格抽奖跑马灯效果实现--微信小程序
  14. excel粘贴时出现故障_解决excel一复制就卡死的问题
  15. 实用插件(十)ajax图片上传插件——fileupload
  16. Crontab中的除号(slash)到底怎么用?(转载)
  17. tomcat的环境变量的配置
  18. 统计工作随笔—同比与环比(同期为负值)、百分点
  19. elasticsearch(es)在用户画像业务上的应用【elasticsearch(es)性能调优】
  20. river歌曲表达的意思_lost rivers是什么意思什么梗 歌曲含义与背后故事揭秘

热门文章

  1. php 输出缓冲区清理
  2. Teams中的快捷键让沟通协作更加高效
  3. 如何在PowerPoint演示文稿中使用iTunes音乐
  4. 初学者对python的认识_Python初学者列表,python,初识
  5. 2019第10周知识总结
  6. React Native在Android当中实践(五)——常见问题
  7. 01:操作系统(centos,redhat):性能监控和网络命令
  8. 个人项目耗时对比记录表
  9. 一个C实现的线程池(产品暂未运用)
  10. 局域网速度变慢的故障分析