wenmo8 发布的文章

在很多应用中,往往都涉及到记录用户所在省份、城市、区县或者街道等信息,一般我们可以通过联动的Select或者类似的界面组件进行展示,或者使用Element中的el-cascader界面组件进行展示,而全国的省份、城市、区县或者街道等信息我们可以通过官方的数据进行获取,可以直接存放在JS里面,也可以存储在自己的数据库里面,最后统一进行联动展示即可。本篇随笔介绍几种组件对省市区县联动处理的效果及做法,可以直接应用在我们项目中,也可以做为一个组件开发的参考学习。

1、基于element-china-area-data 第三方组件的使用

在github往往有很多我们需要的开源组件,我们可以拿来直接使用,如这个地址是:
https://github.com/Plortinus/element-china-area-data
,在Vue+Element的项目中,直接通过npm进行安装组件即可:

npm install element-china-area-data -S

然后在页面组件中引入对象数据,绑定在el-cascader界面组件即可。

import { provinceAndCityData, regionData, rovinceAndCityDataPlus, regionDataPlus,  CodeToText, TextToCode } from 'element-china-area-data';

例如界面代码如下所示。

    <divclass="three">
      <spanclass="imp">3. 三级联动(不带“全部”选项)</span>
      <el-cascaderv-model="selectedOptions2"class="long"size="large":options="regionData"@change="handleChange"
      />
    </div>
    <divclass="bind">
      <div>绑定值:{{ selectedOptions2 }}</div>
      <div>区域码转汉字:{{ CodeToText[selectedOptions2[0]] }},{{ CodeToText[selectedOptions2[1]] }},{{ CodeToText[selectedOptions2[2]] }}</div>
      <div>汉字转区域码:{{ convertTextToCode(CodeToText[selectedOptions2[0]], CodeToText[selectedOptions2[1]], CodeToText[selectedOptions2[2]]) }}</div>
    </div>

其中数据selectedOptions2格式如下所示

selectedOptions2: ['120000', '120100', '120101'],

而选中数据后,获得的数据格式同样是一个数组集合,如下所示

几种界面组件的效果如下所示。

省市区三级联动的案例Demo代码如下。

<template>
  <divid="app">
    <el-cascadersize="large":options="options"v-model="selectedOptions"@change="handleChange">
    </el-cascader>
  </div>
</template>

<script>import { regionDataPlus } from'element-china-area-data'exportdefault{
data () {
return{
options: regionDataPlus,
selectedOptions: []
}
},

methods: {
handleChange (value) {
console.log(value)
}
}
}
</script>

2、基于
v-region控件省市区街道选择组件

除了上面的 element-china-area-data 第三方组件,还有一个v-region的省市区街道的组件也做的不错,地址是:
https://github.com/TerryZ/v-region

它的主要特点是支持 “省/直辖市”、“市”、“区/县”、“乡/镇/街道” 4级行政区域选择,可以选择Select的方式,或者分组方式展示,功能比较多样化一些。

或者

这个v-region已经封装为组件进行使用,所以使用上更加简化一些,如下简单的界面声明即可使用。

  <h3>常规表单下拉选择元素模式</h3>
  <p>Regular form element with select tag</p>
  <v-region:town="true"></v-region>

街道可以包含,也可以省略,如果省略就是省市区县的三级选择了。这个组件的几种用法如下所示。

   <spanclass="imp">基于v-region控件省市区街道选择组件</span>
    <divclass="vregion">
      <h3>常规表单下拉选择元素模式</h3>
      <v-regionv-model="selectedRegion":town="true"@values="regionChange" />
      <br><br>

      <h3>多分组切换模式</h3>
      <v-regionv-model="modelGroup":town="true"type="group"@values="regionChange"
      />

      <br><br><br>
      <h3>多列竖排模式</h3>
      <p>Column group</p>
      <v-regiontype="column"@values="regionChange" />

      <br><br><br>
      <h3>城市选择器</h3>
      <p>City picker</p>
      <v-regiontype="city":city-picker="true"@values="regionChange" />
    </div>

这个组件如果是省市区县街道模式的话,需要设置初始化值就是一个对象的格式,如下所示。

selectedRegion: {
province:
'350000',
city:
'350100',
area:
'350104',
town:
'350104008'}

例如,我在一个业务表的案例界面中,就涉及到了省市区街道的选择处理,就是采用了这个v-region的组件进行展示处理的。界面效果如下所示。

如果是新建窗体的时候,我们可以指定组件的默认值,如下的数据格式

selectedRegion: { province: '440000', city: '440100', area: '440666666', town: '440666666010' },

另外,我们一般需要在数据库里面存储对应的省市区县的数据,以便查询或者其他需要,那么我们就需要在选择数据变化的时候,设置一下对应的属性字段,如下所示。

    //修改编辑窗体的省市区街道
changeEditRegion(data) {
console.log(data)
if(data) {this.editForm.province = data.province ? data.province.key : '';this.editForm.city = data.city ? data.city.key : '';this.editForm.district = data.area ? data.area.key : '';this.editForm.street = data.town ? data.town.key : '';//console.log(this.editForm) }
},

而在展示对话框的时候,我们则可以组合省市区数据,作为v-region组件的初始化值,如下代码使用。

3、自定义省市区的组件

一般情况上,使用上面的方式就能解决问题了,不过这里介绍另外一种思路,就是基于数据库数据的方式进行省市区联动的处理。

以前我在开发系统的时候,引入了省市区的数据,存储在几个数据库表里面,然后通过接口的方式检索省市区及处理器联动过程。

那么在基于这些数据的基础上,我们也可以这样处理的。

首先我们创建省、市、区县的表,并在后端发布对应的API接口,如我的ABP后端接口展示。

然后在根据这些接口,构建好对应的API客户端,再在界面引入使用,通过定义自定义组件的方式来整合使用则更加简单。

在定义一个自定义组件my-citypicker,组件代码如下所示。

<!--用来演示联动的案例-->
<template>
  <divclass="flex-container">
    <divclass="flex-item">
      <label></label>
      <el-selectv-model="provinceValue"placeholder="请选择省"@change="chooseProvince">
        <el-optionv-for="item in provinceData":key="item.id":label="item.provinceName":value="item.id"
        />
      </el-select>
    </div>
    <divclass="flex-item">
      <label></label>
      <el-selectv-model="cityValue"placeholder="请选择市"@change="chooseCity">
        <el-optionv-for="item in cityData":key="item.id":label="item.cityName":value="item.id"
        />
      </el-select>
    </div>
    <divclass="flex-item">
      <label>区、县</label>
      <el-selectv-model="areaValue"placeholder="请选择区、县"@change="chooseArea">
        <el-optionv-for="item in areaData":key="item.id":label="item.districtName":value="item.id"
        />
      </el-select>
    </div>
  </div>
</template>

<script>
//导入Axios的HTTP请求处理封装类
import { Province, City, District } from'@/api/city'exportdefault{
data() {
return{
provinceValue:
'',
cityValue:
'',
areaValue:
'',

provinceData: [],
cityData: [],
areaData: []
}
},
created() {
Province.GetAll().then(res
=>{if(res.result) {this.provinceData=res.result.items//console.log(res.result); }
}).
catch(e=>{this.$message.error('网络连接超时');
})
},
methods: {
chooseProvince(value) {
this.cityValue= '';this.areaValue= '';this.cityData=[];this.areaData=[];vardata={ ProvinceID: value };
City.GetAll(data).then(res
=>{if(res.result) {this.cityData=res.result.items
}
}).
catch(e=>{this.$message.error('网络连接超时');
})
},
chooseCity(value) {
this.areaValue= '';vardata={ CityID: value };
District.GetAll(data).then(res
=>{if(res.result) {this.areaData=res.result.items
}
}).
catch(e=>{this.$message.error('网络连接超时');
})
},
chooseArea() {

}
}
}
</script> <style>.flex-container{display:flex;flex-flow:row wrap;justify-content:space-around;padding:0;margin:0;list-style:none; }.flex-item{padding:5px;height:auto;color:tomato;font-weight:bold;text-align:center; } </style>

一样可以实现省市区县的联动处理

以上就是几种VUE+Element 前端应用中,关于省市区县联动处理的组件使用的案例分析,希望大家在借鉴使用别人组件的基础上,也丰富自己的组件处理,毕竟Vue赋予我们强大的组件定制能力。

为了方便读者理解,我列出一下前面几篇随笔的连接,供参考:

循序渐进VUE+Element 前端应用开发(1)--- 开发环境的准备工作

循序渐进VUE+Element 前端应用开发(2)--- Vuex中的API、Store和View的使用

循序渐进VUE+Element 前端应用开发(3)--- 动态菜单和路由的关联处理

循序渐进VUE+Element 前端应用开发(4)--- 获取后端数据及产品信息页面的处理

循序渐进VUE+Element 前端应用开发(5)--- 表格列表页面的查询,列表展示和字段转义处理


循序渐进VUE+Element 前端应用开发(6)--- 常规Element 界面组件的使用

循序渐进VUE+Element 前端应用开发(7)--- 介绍一些常规的JS处理函数

循序渐进VUE+Element 前端应用开发(8)--- 树列表组件的使用


循序渐进VUE+Element 前端应用开发(9)--- 界面语言国际化的处理

循序渐进VUE+Element 前端应用开发(10)--- 基于vue-echarts处理各种图表展示

循序渐进VUE+Element 前端应用开发(11)--- 图标的维护和使用


循序渐进VUE+Element 前端应用开发(12)--- 整合ABP框架的前端登录处理


循序渐进VUE+Element 前端应用开发(13)--- 前端API接口的封装处理

循序渐进VUE+Element 前端应用开发(14)--- 根据ABP后端接口实现前端界面展示

循序渐进VUE+Element 前端应用开发(15)--- 用户管理模块的处理

循序渐进VUE+Element 前端应用开发(16)--- 组织机构和角色管理模块的处理

循序渐进VUE+Element 前端应用开发(17)--- 菜单管理

循序渐进VUE+Element 前端应用开发(18)--- 功能点管理及权限控制

VUE+Element 前端应用开发框架功能介绍

循序渐进VUE+Element 前端应用开发(19)--- 后端查询接口和Vue前端的整合

使用代码生成工具快速生成基于ABP框架的Vue+Element的前端界面

循序渐进VUE+Element 前端应用开发(20)--- 使用组件封装简化界面代码

循序渐进VUE+Element 前端应用开发(21)--- 省市区县联动处理的组件使用

循序渐进VUE+Element 前端应用开发(22)--- 简化main.js处理代码,抽取过滤器、全局界面函数、组件注册等处理逻辑到不同的文件中

循序渐进VUE+Element 前端应用开发(23)--- 基于ABP实现前后端的附件上传,图片或者附件展示管理

循序渐进VUE+Element 前端应用开发(24)--- 修改密码的前端界面和ABP后端设置处理

循序渐进VUE+Element 前端应用开发(25)--- 各种界面组件的使用(1)

循序渐进VUE+Element 前端应用开发(26)--- 各种界面组件的使用(2)

电商商品数据库的设计和功能界面的处理

循序渐进VUE+Element 前端应用开发(27)--- 数据表的动态表单设计和数据存储

循序渐进VUE+Element 前端应用开发(28)--- 附件内容的管理

循序渐进VUE+Element 前端应用开发(29)--- 高级查询条件的界面设计

部署基于.netcore5.0的ABP框架后台Api服务端,以及使用Nginx部署Vue+Element前端应用

循序渐进VUE+Element 前端应用开发(30)--- ABP后端和Vue+Element前端结合的分页排序处理

循序渐进VUE+Element 前端应用开发(31)--- 系统的日志管理,包括登录日志、接口访问日志、实体变化历史日志

循序渐进VUE+Element 前端应用开发(32)--- 手机短信动态码登陆处理

循序渐进VUE+Element 前端应用开发(33)--- 邮件参数配置和模板邮件发送处理

使用代码生成工具快速开发ABP框架项目

使用Vue-TreeSelect组件实现公司-部门-人员级联下拉列表的处理

使用Vue-TreeSelect组件的时候,用watch变量方式解决弹出编辑对话框界面无法触发更新的问题

在我们开发代码的时候,一般都喜欢进行一定程度的重构,以达到简化代码、关注点分离、提高代码可读性等等方面的考虑,本篇随笔介绍在VUE+Element 前端应用开发过程中,实现简化main.js处理代码,抽取过滤器、全局界面函数、组件注册等处理逻辑到不同的文件中做法。

1、main.js处理逻辑

我们知道Vue的前端应用,main.js函数里面承载的逻辑内容很多,往往涉及到一些常用过滤器函数、全局界面函数、组件注册等常规的处理过程,在我们应用越来愈大,引入的控件越来越多的时候,往往需要很多代码来实现这些功能,但是单个文件代码行数到达一定程度的时候,可读性就降低了,而且可维护性就复杂了,于是我们往往需要对代码进行重构处理,本篇介绍的处理就是实现关注点分离,把不同的逻辑抽离到不同的文件里面,这样大大减少了main.js的代码行数,并提高main.js的可维护性。

main.js处理逻辑的内容大概可以分为几个重要的部分,如下图所示,同时这个也是我们分离逻辑代码的思路。

2、全局函数挂载

使用vue 时,有时需要设置公共的函数,便于在所有组件中调用或者在组件的生命周期中都可调用,这便需要自定义全局函数。

在main.js中写入函数

Vue.prototype.getToken = function(){
...
}

那么,在所有组件里都可调用函数

this.getToken();

里面我们把常规经常用到的一些JS处理函数,以及一些界面信息处理函数,通过全局挂载的方式,使得它们在任何模块页面都可以使用。

我们把这些处理放在一个单独的文件,如prototype.js里面,如下所示。

然后在main.js函数里面,使用如下代码加入即可。

//导入一些全局函数
import prototype from './prototype'Vue.use(prototype)

这样我们就可以在任何页面、模块里面使用我们全局的函数了。

或者

3、全局过滤器挂载

和全局函数做法类似,也可以用相同的方法挂载全局过滤器,过滤器处理一般用于对界面部分的内容进行格式化或者转义的操作。

我们可以自定义一些常用的过滤器放在filter/index.js文件里面,如下所示。

里面放置一些常见的js函数处理,如下所示。

export functionuppercaseFirst(string) {return string.charAt(0).toUpperCase() + string.slice(1)
}

然后我们在main.js里面引入这个全局过滤器即可。

//导入自定义全局过滤器
import * as filters from './filters'
//注册全局过滤器
Object.keys(filters).forEach(key =>{
Vue.filter(key, filters[key])
})

除了一些自己自定义过滤器外,建议可以使用一些第三方的常用过滤器,如下所示

//导入第三方常见过滤器,介绍参考https://github.com/freearhey/vue2-filters
import Vue2Filters from 'vue2-filters'Vue.use(Vue2Filters)

这个里面的过滤器很多比较常见,介绍参考
https://github.com/freearhey/vue2-filters

引入后,直接在界面中使用即可,如下使用代码。

或者

是不是觉得很方便。

4、常见组件注册

组件的注册,分为全局main.js函数中注册,和页面组件中注册,一般我们可以把常见的组件放置到全局中注册,这样避免每个页面都重复填写注册组件的代码,省却很多功夫。

例如,我们可以创建一个plugin.js的文件,用来分离全局注册注册的处理过程,在其中引入我们常用的一些组件,并进行注册处理。

有了这些文件的定义处理,我们在main.js里面,进行简单的导入使用即可。

//导入常见的组件,进行注册
import common from './components/Common/plugin'Vue.use(common)

最后这些就是实现了我们常规的几个过程的处理,包括抽取过滤器、全局界面函数、组件注册等处理逻辑到不同的文件中,并简化全局挂载的操作。

截取几个VUE+Element 前端应用系统模块的界面参考下。

为了方便读者理解,我列出一下前面几篇随笔的连接,供参考:

循序渐进VUE+Element 前端应用开发(1)--- 开发环境的准备工作

循序渐进VUE+Element 前端应用开发(2)--- Vuex中的API、Store和View的使用

循序渐进VUE+Element 前端应用开发(3)--- 动态菜单和路由的关联处理

循序渐进VUE+Element 前端应用开发(4)--- 获取后端数据及产品信息页面的处理

循序渐进VUE+Element 前端应用开发(5)--- 表格列表页面的查询,列表展示和字段转义处理


循序渐进VUE+Element 前端应用开发(6)--- 常规Element 界面组件的使用

循序渐进VUE+Element 前端应用开发(7)--- 介绍一些常规的JS处理函数

循序渐进VUE+Element 前端应用开发(8)--- 树列表组件的使用


循序渐进VUE+Element 前端应用开发(9)--- 界面语言国际化的处理

循序渐进VUE+Element 前端应用开发(10)--- 基于vue-echarts处理各种图表展示

循序渐进VUE+Element 前端应用开发(11)--- 图标的维护和使用


循序渐进VUE+Element 前端应用开发(12)--- 整合ABP框架的前端登录处理


循序渐进VUE+Element 前端应用开发(13)--- 前端API接口的封装处理

循序渐进VUE+Element 前端应用开发(14)--- 根据ABP后端接口实现前端界面展示

循序渐进VUE+Element 前端应用开发(15)--- 用户管理模块的处理

循序渐进VUE+Element 前端应用开发(16)--- 组织机构和角色管理模块的处理

循序渐进VUE+Element 前端应用开发(17)--- 菜单管理

循序渐进VUE+Element 前端应用开发(18)--- 功能点管理及权限控制

VUE+Element 前端应用开发框架功能介绍

循序渐进VUE+Element 前端应用开发(19)--- 后端查询接口和Vue前端的整合

使用代码生成工具快速生成基于ABP框架的Vue+Element的前端界面

循序渐进VUE+Element 前端应用开发(20)--- 使用组件封装简化界面代码

循序渐进VUE+Element 前端应用开发(21)--- 省市区县联动处理的组件使用

循序渐进VUE+Element 前端应用开发(22)--- 简化main.js处理代码,抽取过滤器、全局界面函数、组件注册等处理逻辑到不同的文件中

循序渐进VUE+Element 前端应用开发(23)--- 基于ABP实现前后端的附件上传,图片或者附件展示管理

循序渐进VUE+Element 前端应用开发(24)--- 修改密码的前端界面和ABP后端设置处理

循序渐进VUE+Element 前端应用开发(25)--- 各种界面组件的使用(1)

循序渐进VUE+Element 前端应用开发(26)--- 各种界面组件的使用(2)

电商商品数据库的设计和功能界面的处理

循序渐进VUE+Element 前端应用开发(27)--- 数据表的动态表单设计和数据存储

循序渐进VUE+Element 前端应用开发(28)--- 附件内容的管理

循序渐进VUE+Element 前端应用开发(29)--- 高级查询条件的界面设计

部署基于.netcore5.0的ABP框架后台Api服务端,以及使用Nginx部署Vue+Element前端应用

循序渐进VUE+Element 前端应用开发(30)--- ABP后端和Vue+Element前端结合的分页排序处理

循序渐进VUE+Element 前端应用开发(31)--- 系统的日志管理,包括登录日志、接口访问日志、实体变化历史日志

循序渐进VUE+Element 前端应用开发(32)--- 手机短信动态码登陆处理

循序渐进VUE+Element 前端应用开发(33)--- 邮件参数配置和模板邮件发送处理

使用代码生成工具快速开发ABP框架项目

使用Vue-TreeSelect组件实现公司-部门-人员级联下拉列表的处理

使用Vue-TreeSelect组件的时候,用watch变量方式解决弹出编辑对话框界面无法触发更新的问题

在我们一般系统中,往往都会涉及到附件的处理,有时候附件是图片文件,有时候是Excel、Word等文件,一般也就是可以分为图片附件和其他附件了,图片附件可以进行裁剪管理、多个图片上传管理,及图片预览操作,如果是其他附件,则只需上传和下载处理即可。本篇随笔基于ABP后端的接口整合,实现前后端的附件上传管理。

1、ABP后端附件管理接口

ABP框架是基于最新.net core 的技术方向,应用非常广泛的一个技术框架系列,它整合了很多.net core 领域相关开发技术,后端主要是发布Web API方式实现数据和前端的交互的,因此前端可以基于Web API基础上实现多种平台的对接,可以是常规的BS框架,如Vue+Element 前端路线,也可以是Winform/WPF的前端框架接入等。

ABP+Swagger UI 负责API接口的开发和公布,如下是附件上传模块的API接口的管理界面。

ABP框架后端接口的常规处理,如增删改查等接口命名都一致,参数方面也比较一致,而我们附件上传,则可以自定义一个自己喜欢名称的一个API接口名称,如这里定义一个PostUpload的方法,除了文件信息外,还包括一些参数来说明附件信息的。上传成功后,返回对应的路径集合。

ABP后端定义的接口实现,我们为了获得上下文对象的文件对象信息,我们在构造函数注入一个IHttpContextAccessor 对象。

    /// <summary>
    ///上传附件信息,应用层服务接口实现/// </summary>
[AbpAuthorize]public class FileUploadAppService : MyAsyncServiceBase<FileUpload, FileUploadDto, string, FileUploadPagedDto, CreateFileUploadDto, FileUploadDto>, IFileUploadAppService
{
private AppConfig config = newAppConfig();private readonly IRepository<FileUpload, string> _repository;//业务对象仓储对象 private readonly IRepository<User, long> _userRepository;//用户信息仓储对象 private IHttpContextAccessor _httpContext;//上下文对象 public FileUploadAppService(IRepository<FileUpload, string> repository, IRepository<User, long> userRepository, IHttpContextAccessor httpContext) : base(repository)
{
_repository
=repository;
_userRepository
=userRepository;
_httpContext
=httpContext;
}

在附件上传处理的时候,我们就可以通过这样获得请求的文件对象了,如下代码所示。

在后端上传文件的时候,和我其他开发框架,如Winform框架、混合开发框架、BS等框架一样,我们后端为了方便,也可以使用FTP方式进行附件的上传(这里依旧是使用FluentFTP组件),如我们指定配置如下所示。

另外,在整合ABP后端接口的时候,我们为了方便,一般使用ES6的方式定义一个客户端的Api调用类,基础接口封装在BaseApi类里面,扩展自定义接口放在子类定义,如下所示。

另外,我们需要整合Api和界面部分实现完整的功能,那么需要提供两个部分:一个是Api类的继承子类,一个是视图界面的内容。如下所示包含Api封装类文件和Vue + Element界面视图。

2、前端附件管理的实现

上传图片或者其他附件信息,我们可以用Element组件里面的el-Upload组件操作,这个控件基本上能够满足大多数的应用了,参考地址:
https://element.eleme.cn/#/zh-CN/component/upload

如下是其中的界面使用代码:

            <el-form-itemlabel="封面图片">
              <el-uploadref="upload"action="/abp/services/app/FileUpload/PostUpload"list-type="picture-card":on-preview="handlePictureCardPreview":on-remove="handleRemove":on-success="onSuccess":on-error="onError"accept="image/jpeg,image/gif,image/png,image/bmp":headers="myHeaders":file-list="editForm.fileList"
              >
                <iclass="el-icon-plus" />
              </el-upload>
              <el-dialog:visible.sync="dialogVisible">
                <imgwidth="100%":src="dialogImageUrl"alt="">
              </el-dialog>
            </el-form-item> 

只是我们一般为了简化处理,往往使用一些基于El-Upload组件之上封装好的组件,更显方便而已。

一般的图片和附件上传界面如下所示。

如我往往喜欢喜欢使用稍加封装,代码量更少的一些第三方组件,如:

dream2023
/
vue-ele-upload-image

dream2023
/
vue-ele-upload-file

等这位仁兄的二次封装的组件来做附件管理,可以更加简洁一些。如下是使用的代码。

<el-row>
  <el-col:span="24">
    <el-form-itemlabel="图片"prop="picture">
      <ele-upload-imagev-model="editForm.picture":is-show-tip="false":size="100"action="/abp/services/app/FileUpload/PostUpload"title="封面图片":headers="myHeaders":data="{guid:editForm.id, folder:'用户图片'}":crop="true"
      />
    </el-form-item>
  </el-col>
  <el-col:span="24">
    <el-form-itemlabel="资料文档"prop="attachGUID">
      <ele-upload-filev-model="editForm.attachGUID_files":response-fn="handleAttachResponse"action="/abp/services/app/FileUpload/PostUpload":headers="myHeaders":data="{guid:editForm.attachGUID, folder:'用户图片'}":before-remove="beforeRemoveAttach"
      />
    </el-form-item>
  </el-col>

编辑界面下,附件上传界面,可以加载已有的记录展示,如下所示。

而附件列表我们通过调用ABP后端API即可获取,然后进行绑定即可。

//获取附件文件列表
param = { guid: this.editForm.attachGUID }
fileupload.GetByAttachGUID(param).then(data
=>{if(data.result) {this.editForm.attachGUID_files =[...data.result]
}
})

附件上传的操作,我们一般需要通过设置Header方式,来传递用户的身份信息,如下data部分的代码

  myHeaders: { Authorization: 'Bearer ' + getToken() }, //用于上传文件的身份认证

而其中的界面组件中的data,是指定额外上传的文件附带信息,方便我们区分或者归类文件的。

附件列表,如果需要删除的,那么我们提示确认后,需要调用ABP后端API进行删除文件。

    beforeRemoveAttach(file, fileList) { //移除附件图片
      //服务端删除文件
      var param = { guid: this.editForm.attachGUID, index: fileList.indexOf(file) }
fileupload.RemoveAttach(param).then(data
=>{
console.log(data.result)
})
},

另外,如果确认附件是全部图片,我们也可以用图片列表控件的方式展示图片信息,如下所示。

为了方便读者理解,我列出一下前面几篇随笔的连接,供参考:

循序渐进VUE+Element 前端应用开发(1)--- 开发环境的准备工作

循序渐进VUE+Element 前端应用开发(2)--- Vuex中的API、Store和View的使用

循序渐进VUE+Element 前端应用开发(3)--- 动态菜单和路由的关联处理

循序渐进VUE+Element 前端应用开发(4)--- 获取后端数据及产品信息页面的处理

循序渐进VUE+Element 前端应用开发(5)--- 表格列表页面的查询,列表展示和字段转义处理


循序渐进VUE+Element 前端应用开发(6)--- 常规Element 界面组件的使用

循序渐进VUE+Element 前端应用开发(7)--- 介绍一些常规的JS处理函数

循序渐进VUE+Element 前端应用开发(8)--- 树列表组件的使用


循序渐进VUE+Element 前端应用开发(9)--- 界面语言国际化的处理

循序渐进VUE+Element 前端应用开发(10)--- 基于vue-echarts处理各种图表展示

循序渐进VUE+Element 前端应用开发(11)--- 图标的维护和使用


循序渐进VUE+Element 前端应用开发(12)--- 整合ABP框架的前端登录处理


循序渐进VUE+Element 前端应用开发(13)--- 前端API接口的封装处理

循序渐进VUE+Element 前端应用开发(14)--- 根据ABP后端接口实现前端界面展示

循序渐进VUE+Element 前端应用开发(15)--- 用户管理模块的处理

循序渐进VUE+Element 前端应用开发(16)--- 组织机构和角色管理模块的处理

循序渐进VUE+Element 前端应用开发(17)--- 菜单管理

循序渐进VUE+Element 前端应用开发(18)--- 功能点管理及权限控制

VUE+Element 前端应用开发框架功能介绍

循序渐进VUE+Element 前端应用开发(19)--- 后端查询接口和Vue前端的整合

使用代码生成工具快速生成基于ABP框架的Vue+Element的前端界面

循序渐进VUE+Element 前端应用开发(20)--- 使用组件封装简化界面代码

循序渐进VUE+Element 前端应用开发(21)--- 省市区县联动处理的组件使用

循序渐进VUE+Element 前端应用开发(22)--- 简化main.js处理代码,抽取过滤器、全局界面函数、组件注册等处理逻辑到不同的文件中

循序渐进VUE+Element 前端应用开发(23)--- 基于ABP实现前后端的附件上传,图片或者附件展示管理

循序渐进VUE+Element 前端应用开发(24)--- 修改密码的前端界面和ABP后端设置处理

循序渐进VUE+Element 前端应用开发(25)--- 各种界面组件的使用(1)

循序渐进VUE+Element 前端应用开发(26)--- 各种界面组件的使用(2)

电商商品数据库的设计和功能界面的处理

循序渐进VUE+Element 前端应用开发(27)--- 数据表的动态表单设计和数据存储

循序渐进VUE+Element 前端应用开发(28)--- 附件内容的管理

循序渐进VUE+Element 前端应用开发(29)--- 高级查询条件的界面设计

部署基于.netcore5.0的ABP框架后台Api服务端,以及使用Nginx部署Vue+Element前端应用

循序渐进VUE+Element 前端应用开发(30)--- ABP后端和Vue+Element前端结合的分页排序处理

循序渐进VUE+Element 前端应用开发(31)--- 系统的日志管理,包括登录日志、接口访问日志、实体变化历史日志

循序渐进VUE+Element 前端应用开发(32)--- 手机短信动态码登陆处理

循序渐进VUE+Element 前端应用开发(33)--- 邮件参数配置和模板邮件发送处理

使用代码生成工具快速开发ABP框架项目

使用Vue-TreeSelect组件实现公司-部门-人员级联下拉列表的处理

使用Vue-TreeSelect组件的时候,用watch变量方式解决弹出编辑对话框界面无法触发更新的问题

用户在系统登录后,一般会提供一个入口给当前用户更改当前的密码,其实更改密码操作是很简单的一个处理,不过本篇随笔主要是介绍结合前后端来实现这个操作,后端是基于ABP框架的,需要对密码的安全性进行一个设置,否则严格的密码规则非常不友好,毕竟我们系统很多情况下不需要那么复杂的密码规则。

1、ABP后端的密码设置和修改密码处理

    //密码验证规则
    services.Configure<IdentityOptions>(options =>{
options.Password.RequireDigit
= false;
options.Password.RequireLowercase
= false;
options.Password.RequireNonAlphanumeric
= false;
options.Password.RequireUppercase
= false;
options.Password.RequiredLength
= 6;
});

如果没有设置上面的操作,那么简单的密码修改,是无法通过ABP框架默认密码规则的检验的 。

如果嫌弃这样的密码规则太麻烦,那么设置了允许简单密码处理,那么一般符合6位密码都可以顺利通过了。

2、前端界面的处理和组件化操作

在管理系统中,一般在用户头像附近增加一些常用菜单,其中就包括修改密码的操作入口。

而往往我们还有其他地方,可能也需要增加对应的修改密码入口,如在用户管理的界面下。

也就是说,修改密码对话框符合组件重用的规则,在多处都可能使用到的。

那么,我们就需要把常用的界面封装层一个界面组件的方式,方便重用。

修改密码窗体作为一个组件进行开发,它的界面模板代码如下所示。

<template>
  <el-dialog:title="$t('changepass.title')":visible="isVisible":modal-append-to-body="false"@close="close">
    <el-formref="form":model="user":rules="rules"label-width="160px">
      <el-form-item:label="$t('changepass.oldpassword')"prop="oldPassword">
        <el-inputv-model="user.oldPassword":placeholder="$t('changepass.oldpassword_tip')"type="password" />
      </el-form-item>
      <el-form-item:label="$t('changepass.newpassword')"prop="newPassword">
        <el-inputv-model="user.newPassword":placeholder="$t('changepass.newpassword_tip')"type="password" />
      </el-form-item>
      <el-form-item:label="$t('changepass.confirmpassword')"prop="confirmPassword">
        <el-inputv-model="user.confirmPassword":placeholder="$t('changepass.confirmpassword_tip')"type="password" />
      </el-form-item>
      <el-form-item>
        <el-buttontype="primary"@click="submitChange">{{ $t('form.save') }}</el-button>
        <el-buttontype="danger"@click="close">{{ $t('form.close') }}</el-button>
      </el-form-item>
    </el-form>
  </el-dialog>
</template>

这里面使用到了多语言的设置,以便从对应的语言文件中读取对应的键值内容。

例如中文的zh.js里面部分内容如下所示。

切换到英文的话,自动通过多语言的函数,获取对应英文en.js的文件中的配置值。

其中修改密码的操作,是通过Api发起后端的数据处理,操作函数如下所示。

submitChange() {var param ={
userId: getUserId(),
newPassword:
this.user.newPassword,
currentPassword:
this.user.oldPassword
}
//console.log(param) this.$refs['form'].validate(valid =>{if(valid) {
user.ChangePassword(param).then(data
=>{if(data.result) {this.msgSuccess('修改成功')this.$emit('update:visible', false) //更新 } else{this.msgError('密码修改失败')
}
})
}
})
},

前端Api类的接口函数定义如下所示。

ABP后端接口的定义如下所示

修改密码成功后提示。

这样就顺利完成简单密码就可以修改的操作的了。

为了方便读者理解,我列出一下前面几篇随笔的连接,供参考:

循序渐进VUE+Element 前端应用开发(1)--- 开发环境的准备工作

循序渐进VUE+Element 前端应用开发(2)--- Vuex中的API、Store和View的使用

循序渐进VUE+Element 前端应用开发(3)--- 动态菜单和路由的关联处理

循序渐进VUE+Element 前端应用开发(4)--- 获取后端数据及产品信息页面的处理

循序渐进VUE+Element 前端应用开发(5)--- 表格列表页面的查询,列表展示和字段转义处理


循序渐进VUE+Element 前端应用开发(6)--- 常规Element 界面组件的使用

循序渐进VUE+Element 前端应用开发(7)--- 介绍一些常规的JS处理函数

循序渐进VUE+Element 前端应用开发(8)--- 树列表组件的使用


循序渐进VUE+Element 前端应用开发(9)--- 界面语言国际化的处理

循序渐进VUE+Element 前端应用开发(10)--- 基于vue-echarts处理各种图表展示

循序渐进VUE+Element 前端应用开发(11)--- 图标的维护和使用


循序渐进VUE+Element 前端应用开发(12)--- 整合ABP框架的前端登录处理


循序渐进VUE+Element 前端应用开发(13)--- 前端API接口的封装处理

循序渐进VUE+Element 前端应用开发(14)--- 根据ABP后端接口实现前端界面展示

循序渐进VUE+Element 前端应用开发(15)--- 用户管理模块的处理

循序渐进VUE+Element 前端应用开发(16)--- 组织机构和角色管理模块的处理

循序渐进VUE+Element 前端应用开发(17)--- 菜单管理

循序渐进VUE+Element 前端应用开发(18)--- 功能点管理及权限控制

VUE+Element 前端应用开发框架功能介绍

循序渐进VUE+Element 前端应用开发(19)--- 后端查询接口和Vue前端的整合

使用代码生成工具快速生成基于ABP框架的Vue+Element的前端界面

循序渐进VUE+Element 前端应用开发(20)--- 使用组件封装简化界面代码

循序渐进VUE+Element 前端应用开发(21)--- 省市区县联动处理的组件使用

循序渐进VUE+Element 前端应用开发(22)--- 简化main.js处理代码,抽取过滤器、全局界面函数、组件注册等处理逻辑到不同的文件中

循序渐进VUE+Element 前端应用开发(23)--- 基于ABP实现前后端的附件上传,图片或者附件展示管理

循序渐进VUE+Element 前端应用开发(24)--- 修改密码的前端界面和ABP后端设置处理

循序渐进VUE+Element 前端应用开发(25)--- 各种界面组件的使用(1)

循序渐进VUE+Element 前端应用开发(26)--- 各种界面组件的使用(2)

电商商品数据库的设计和功能界面的处理

循序渐进VUE+Element 前端应用开发(27)--- 数据表的动态表单设计和数据存储

循序渐进VUE+Element 前端应用开发(28)--- 附件内容的管理

循序渐进VUE+Element 前端应用开发(29)--- 高级查询条件的界面设计

部署基于.netcore5.0的ABP框架后台Api服务端,以及使用Nginx部署Vue+Element前端应用

循序渐进VUE+Element 前端应用开发(30)--- ABP后端和Vue+Element前端结合的分页排序处理

循序渐进VUE+Element 前端应用开发(31)--- 系统的日志管理,包括登录日志、接口访问日志、实体变化历史日志

循序渐进VUE+Element 前端应用开发(32)--- 手机短信动态码登陆处理

循序渐进VUE+Element 前端应用开发(33)--- 邮件参数配置和模板邮件发送处理

使用代码生成工具快速开发ABP框架项目

使用Vue-TreeSelect组件实现公司-部门-人员级联下拉列表的处理

使用Vue-TreeSelect组件的时候,用watch变量方式解决弹出编辑对话框界面无法触发更新的问题

在我们使用Vue+Element开发前端的时候,往往涉及到很多界面组件的使用,其中很多直接采用Element官方的案例即可,有些则是在这个基础上封装更好利用、更少代码的组件;另外有些则是直接采用第三方开发好的组件,目的就是实现所需功能外,尽量简化界面使用代码。本篇随笔介绍在我的项目中经常用到的各种界面组件和它的界面效果,以便在实际开发中进行相应的参考,提高开发效率。

我们以几个常规界面来介绍相关控件的使用,如列表界面,包括查询、表格、分页等信息,查询框中包含一些关键字段的信息查询,而表格中则包含重要字段信息的展示或者相关操作。

然后编辑界面,简单的如下所示。

复杂界面中,包含很多录入信息的界面组件

另外还可以设计富文本、图片上传等操作。

以上就是一些常规界面的录入情况,其中使用到了很多相关的界面组件,包括文本录入框、下拉选框、树列表、标签、图片上传、富文本、日期、省市区列表等等。

下面分别对一些常规的界面组件的使用进行介绍。

1、普通文本输入框

文本框一般是比较常见的界面组件,一个是内容录入比较灵活,其次也是因为使用简单方便。

一般这种录入界面组件,都是放在表单里面处理比较多,因为可以利用表单的校验功能实现校验等操作,也可以利用表单对应的对象属性一并提交。

使用代码很简单,如下所示。

  <el-form-itemlabel="姓名"prop="name">
    <el-inputv-model="searchForm.name" />
  </el-form-item>

如果是有些录入需要有前缀或者后缀的,则可以通过Slot模板进行处理。

  <el-col:span="12">
    <el-form-itemlabel="身高"prop="height">
      <el-inputv-model="addForm.height"><spanslot="suffix">厘米</span></el-input>
    </el-form-item>
  </el-col>
  <el-col:span="12">
    <el-form-itemlabel="体重"prop="weight">
      <el-inputv-model="addForm.weight"><spanslot="suffix">公斤</span></el-input>
    </el-form-item>
  </el-col>

或者我们参考官方
Element的案例
,也可以看到使用的效果和代码

<div>
  <el-inputplaceholder="请输入内容"v-model="input1">
    <templateslot="prepend">Http://</template>
  </el-input>
</div>
<divstyle="margin-top: 15px;">
  <el-inputplaceholder="请输入内容"v-model="input2">
    <templateslot="append">.com</template>
  </el-input>
</div>
<divstyle="margin-top: 15px;">
  <el-inputplaceholder="请输入内容"v-model="input3"class="input-with-select">
    <el-selectv-model="select"slot="prepend"placeholder="请选择">
      <el-optionlabel="餐厅名"value="1"></el-option>
      <el-optionlabel="订单号"value="2"></el-option>
      <el-optionlabel="用户电话"value="3"></el-option>
    </el-select>
    <el-buttonslot="append"icon="el-icon-search"></el-button>
  </el-input>
</div>

另外,文本输入框还包括一个多行的输入textarea的类型输入。

<el-inputtype="textarea"placeholder="请输入内容"v-model="textarea"maxlength="30"show-word-limit>

有时候,文本框还需要输入长度的限制,这个在文本框很容易设置,界面效果如下所示。

界面代码如下所示。

<el-inputtype="text"placeholder="请输入内容"v-model="text"maxlength="10"show-word-limit>
</el-input>
<divstyle="margin: 20px 0;"></div>
<el-inputtype="textarea"placeholder="请输入内容"v-model="textarea"maxlength="30"show-word-limit>
</el-input> 

2、日期输入范围选择

日期我们一般用内置的el-date-picker即可,可以显示短日期、带时间的长日期,或者选择日期范围多项选择。

<el-form-itemlabel="出生日期"prop="birthDate">
  <el-date-pickerv-model="addForm.birthDate"align="right"type="date"placeholder="选择日期"value-format="yyyy-MM-dd"
  />
</el-form-item>

而我们在查询的时候,一般就是一个日期区间。

我们只需要指定type="daterange"即可。

<el-form-itemlabel="创建时间">
<el-date-pickerv-model="searchForm.creationTime"type="daterange"align="right"unlink-panels
range-separator
="至"start-placeholder="开始日期"end-placeholder="结束日期":picker-options="pickerOptions" /> </el-form-item>

其中的 pickerOptions 则是我们定义的快捷选择项,单独放置一个文件constantOptions.js里面,需要导入对象使用即可,这样可以减少很多页面的JS代码,其他常见变量也是这样的方式处理。

//选择时间范围的快捷选项
export const pickerOptions ={
shortcuts: [
{
text:
'昨天',
onClick(picker) {
const end
= newDate();
const start
= newDate();
start.setTime(start.getTime()
- 3600 * 1000 * 24 * 1);
picker.$emit(
'pick', [start, end]);
}
},
{
text:
'最近一周',
onClick(picker) {
const end
= newDate();
const start
= newDate();
start.setTime(start.getTime()
- 3600 * 1000 * 24 * 7);
picker.$emit(
'pick', [start, end]);
}
}, {
text:
'最近一个月',
onClick(picker) {
const end
= newDate();
const start
= newDate();
start.setTime(start.getTime()
- 3600 * 1000 * 24 * 30);
picker.$emit(
'pick', [start, end]);
}
}, {
text:
'最近三个月',
onClick(picker) {
const end
= newDate();
const start
= newDate();
start.setTime(start.getTime()
- 3600 * 1000 * 24 * 90);
picker.$emit(
'pick', [start, end]);
}
}]
}

日期输入控件,有时候会出现获得的日期值比实际的值少一天的问题,一般通过设置
value-format="yyyy-MM-dd"
即可解决。

3、标签显示和录入

标签的显示和录入,也是我们很常见的处理,多颜色的标签可以提高界面的美观,同时也是对多选值的友好显示。

我们先来看看
官方的案例

<el-tag>标签一</el-tag>
<el-tagtype="success">标签二</el-tag>
<el-tagtype="info">标签三</el-tag>
<el-tagtype="warning">标签四</el-tag>
<el-tagtype="danger">标签五</el-tag>

其实就是指定type不同就可以实现不同的效果,另外我们还可以通过设置effect属性来改变主题,默认为 light

标签的显示是有了,一般我们还需要一个标签的录入操作,虽然官方也提供了一个案例,不过是简单对Tag标签组件的使用,代码还是不少。

实际上,我们在使用组件的时候,系统尽量减少代码量,因此我们可以参考官方的方式建立一个集标签显示和录入功能一起的组件,不过Github上已经有人开发了,我就直接拿过来用吧。

https://github.com/xiispace/el-input-tag

界面效果如下所示。

使用的时候,界面代码和普通组件一样简单,非常棒。

<el-form-itemlabel="标签"prop="tags">
  <el-input-tagv-model="editForm.tags_array" />
</el-form-item>

JS部分只需要转换下我们的内容即可。我们tags属性存储是逗号分开的字符串,那么tags_array这是数组,我们获取值的时候,需要进行转换,把字符串转换为数组的值。

      //将字符串的标签,转换为Array集合
      if (this.addForm.tags) {this.addForm.tags_array = this.addForm.tags.split(',')
}

而修改组件,会引起数组的改变,为了避免集中转换,我们可以通过watch函数来统一处理,这样tags内容就会自动变化了。

  watch: { //对过滤内容进行监控,实现树列表过滤
    //键路径必须加上引号
    'addForm.tags_array': function(val, oldval) {if(val) {this.addForm.tags =val.toString()
}
},
'editForm.tags_array': function(val, oldval) {if(val) {this.editForm.tags =val.toString()
}
}
},

4、下拉列表和字典列表Select组件

下拉列表或者下拉框是我们常见的选择方式之一,下拉列表有时候可以是固定列表,如男女、有效/无效, 也可以是多个动态列表供选择。

或者

或者是一连串联动的组件构成。

Select组件的使用如下所示。

  <el-selectv-model="value"placeholder="请选择">
    <el-optionv-for="item in options":key="item.value":label="item.label":value="item.value">
    </el-option>
  </el-select>

而其中的JS部分,options就是有value,lable组成的对象数组,如下代码所示

<script>exportdefault{
data() {
return{
options: [{
value:
'选项1',
label:
'黄金糕'}, {
value:
'选项2',
label:
'双皮奶'}],

value:
''}
}
}
</script>


el-select
设置
clearable
属性,则可将选择器清空。为
el-select
添加
filterable
属性即可启用搜索功能。


el-select
设置
multiple
属性即可启用多选,此时
v-model
的值为当前选中值所组成的数组。默认情况下选中值会以 Tag 的形式展现,你也可以设置
collapse-tags
属性将它们合并为一段文字。

纵观Select组件,其数据源要么是固定列表,要么是从数据库字典里面获取的内容,为了简化界面代码的调用,我们把它作为字典组件进行了定义,可以绑定固定列表,也可以绑定字典表里面的字典类型名称。

组件使用很简单,如下代码所示。

<el-form-itemlabel="状态">
    <my-dictdatav-model="addForm.status":options="Status"/>
    <my-dictdatav-model="addForm.status"type-name="状态"/>
</el-form-item>

创建一个组件,定义好两个属性,如下代码所示。

在组件Mounted的时候,我们对这些内容进行解析,构建为对应组件的数据源即可。

mounted() {var that = this;if (this.typeName && this.typeName !== '') {//使用字典类型,从服务器请求数据
      var params = { dictTypeName: this.typeName };
dictdata.GetListItemByDictType(params).then(data
=>{var list =data.result;//console.log(list); if(list) {
list.forEach(item
=>{//console.log(item) that.dictItems.push({ text: item.text, value: item.value });
})
}
})
}
else if (this.options && this.options.length > 0) {//使用固定字典列表 this.options.forEach(item =>{if (item && typeof (item.value) !== 'undefined') {
that.dictItems.push(item)
}
});
}
//设置默认值 this.svalue = this.value;
},

这样,使用起来就很方便了,可以直接绑定字典类型即可。

<el-col:span="12">
    <el-form-itemlabel="民族"prop="nationality">
      <my-dictdatav-model="editForm.nationality"type-name="民族" />
    </el-form-item>
</el-col>
<el-col:span="12">
    <el-form-itemlabel="学历"prop="education">
      <my-dictdatav-model="editForm.education"type-name="学历" />
    </el-form-item>
</el-col>
<el-col:span="12">
    <el-form-itemlabel="婚姻状况"prop="marriage">
      <my-dictdatav-model="editForm.marriage"type-name="婚姻状况" />
    </el-form-item>
</el-col>
<el-col:span="12">
    <el-form-itemlabel="星座"prop="star">
      <my-dictdatav-model="editForm.star"type-name="星座" />
    </el-form-item>
</el-col>

这样的组件,相对于每次调用API去获取字典资源,然后进行转换处理,代码更加简单易懂了,同时也更加优雅,提高代码质量。

5、复选框和单选框

复选框和单选框也是经常使用的,对简单的一些选项进行勾选处理。

多选框有多选框组,单选框也有单选框组,这样组合起来界面更加美观。

<template>
  <el-checkbox-groupv-model="checkList">
    <el-checkboxlabel="复选框 A"></el-checkbox>
    <el-checkboxlabel="复选框 B"></el-checkbox>
    <el-checkboxlabel="复选框 C"></el-checkbox>
    <el-checkboxlabel="禁用"disabled></el-checkbox>
    <el-checkboxlabel="选中且禁用"disabled></el-checkbox>
  </el-checkbox-group>
</template>

<script>exportdefault{
data () {
return{
checkList: [
'选中且禁用','复选框 A']
};
}
};
</script>

<template>
  <el-radio-groupv-model="radio">
    <el-radio:label="3">备选项</el-radio>
    <el-radio:label="6">备选项</el-radio>
    <el-radio:label="9">备选项</el-radio>
  </el-radio-group>
</template>

<script>exportdefault{
data () {
return{
radio:
3};
}
}
</script>

这两个是官方比较典型的案例说明了,一般我们也是以组合的方式进行使用。

例如我们在产品类型绑定品牌列表的时候,就是采用了复选框汉族,通过key/value的集合组合即可实现键值对的处理。

  <el-col:span="24">
    <el-form-itemlabel="品牌关联"prop="bindBrands">
      <el-checkbox-groupv-model="addForm.bindBrands"style="padding:10px;box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1)">
        <el-checkboxv-for="(item, i) in brandList":key="i":label="item.id">{{ item.brandName }}</el-checkbox>
      </el-checkbox-group>
    </el-form-item>
  </el-col>
<el-form-itemlabel="虚拟商品"prop="isVirtual">
  <el-radio-groupv-model="addForm.isVirtual">
    <el-radioclass="radio":label="1"></el-radio>
    <el-radioclass="radio":label="0"></el-radio>
  </el-radio-group>
</el-form-item>

5、Switch开关

Switch开关有点类似于单选框的操作,不过提供比较美观的一个处理,表示两种相互对立的状态间的切换,多用于触发「开/关」。

<el-switchv-model="value1"active-text="按月付费"inactive-text="按年付费">
</el-switch>
<el-switchstyle="display: block"v-model="value2"active-color="#13ce66"inactive-color="#ff4949"active-text="按月付费"inactive-text="按年付费">
</el-switch>

<script>exportdefault{
data() {
return{
value1:
true,
value2:
true}
}
};
</script>

这个组件提供了很多属性配置,可以自定义激活/未激活的颜色、文本、值的信息,如下说明。

因此,我们有时候的值如果是0,1的就可以设置一下active-value/inactive-value的值,否则默认是Boolean变量。

如下,有时候我们在查询中也会增加一个Switch来处理一些属性查询。

如果我们这样用,而isVirtual属性是0,1的数值的话,那么我们就需要进行转换了

      <el-form-itemlabel="虚拟商品"prop="isVirtual">
        <el-switchv-model="searchForm.isVirtual"active-color="#13ce66"inactive-color="gray" />
      </el-form-item>

那么我们发起查询的时候,就需要把布尔变量转换为0,1的值了,如下代码所示

    getlist() { //列表数据获取
      var param = { //构造常规的分页查询条件
        //分页条件
        SkipCount: (this.pageinfo.pageindex - 1) * this.pageinfo.pagesize,
MaxResultCount:
this.pageinfo.pagesize,//查询过滤条件 Code: this.searchForm.code,
Name:
this.searchForm.name,
IsVirtual:
this.searchForm.isVirtual

};
//使用日期范围选择控件,在查询对象增加开始日期CreationTimeStart、结束日期CreationTimeEnd this.addDateRange(param, this.searchForm.creationTime)

param.IsVirtual
= param.IsVirtual ? 1 : 0;//修改数据类型为int //console.log(param) //获取列表,绑定到模型上,并修改分页数量 this.listLoading = trueproductType.GetAll(param).then(data=>{this.list =data.result.itemsthis.pageinfo.total =data.result.totalCountthis.listLoading = false})
},

或者我们定义active-value、inactive-value来处理会简单一些。

  <el-form-itemlabel="虚拟商品"prop="isVirtual">
    <el-switchv-model="searchForm.isVirtual"active-value="1"inactive-value="0"active-color="#13ce66"inactive-color="gray" />
  </el-form-item>

那这样查询就不需要转换bool到数值了,因为已经默认是0/1的数值类型了,更改后的查询代码如下所示。

    getlist() { //列表数据获取
      var param = { //构造常规的分页查询条件
        //分页条件
        SkipCount: (this.pageinfo.pageindex - 1) * this.pageinfo.pagesize,
MaxResultCount:
this.pageinfo.pagesize,//查询过滤条件 Code: this.searchForm.code,
Name:
this.searchForm.name,
IsVirtual:
this.searchForm.isVirtual
};
//使用日期范围选择控件,在查询对象增加开始日期CreationTimeStart、结束日期CreationTimeEnd this.addDateRange(param, this.searchForm.creationTime)//console.log(param) //获取列表,绑定到模型上,并修改分页数量 this.listLoading = trueproductType.GetAll(param).then(data=>{this.list =data.result.itemsthis.pageinfo.total =data.result.totalCountthis.listLoading = false})
},

6、消息提示及弹框

在组件或者页面里面,我们都需要大量使用到提示信息,确认信息等信息提示功能。而Element也提供了这样不同的组件来使用。

多个不同类型的消息提示窗口,界面如下所示。

Notification 通知组件,悬浮出现在页面角落,显示全局的通知提醒消息。界面如下所示

我们为了方便,一般先简单封装一下,并在全局挂载这些方法,以便在不同的地方简化调用。

    //提示成功信息
    Vue.prototype.msgSuccess = function(msg) {this.$message({ showClose: true, message: msg, type: 'success'})
}
//提示警告信息 Vue.prototype.msgWarning = function(msg) {this.$message({ showClose: true, message: msg, type: 'warning'})
}
//提示错误信息 Vue.prototype.msgError = function(msg) {this.$message({ showClose: true, message: msg, type: 'error'})
}
//提示信息 Vue.prototype.msgInfo = function(msg) {this.$message.info({ showClose: true, message: msg })
}
//确认信息 Vue.prototype.msgConfirm = function(msg = '您确认删除选定的记录吗?') {return this.$confirm(msg, '操作提示',
{
type:
'warning' //success,error,info,warning //confirmButtonText: '确定', //cancelButtonText: '取消' })
}

这样我们在页面中就可以很方便使用了,如删除确认对话框操作。

    showDelete(id) { //删除对话框处理
      this.msgConfirm().then(() =>{//删除操作处理代码
        var param ={ id: id }
productType.Delete(param).then(data
=>{//console.log(data) if(data.success) {//提示信息 this.msgSuccess('删除成功!')//刷新数据 this.getlist()
}
else{this.msgError('删除失败:' +data.error)
}
})
})
},

由于篇幅有限,下篇在继续介绍其他组件的使用了。

为了方便读者理解,我列出一下前面几篇随笔的连接,供参考:

循序渐进VUE+Element 前端应用开发(1)--- 开发环境的准备工作

循序渐进VUE+Element 前端应用开发(2)--- Vuex中的API、Store和View的使用

循序渐进VUE+Element 前端应用开发(3)--- 动态菜单和路由的关联处理

循序渐进VUE+Element 前端应用开发(4)--- 获取后端数据及产品信息页面的处理

循序渐进VUE+Element 前端应用开发(5)--- 表格列表页面的查询,列表展示和字段转义处理


循序渐进VUE+Element 前端应用开发(6)--- 常规Element 界面组件的使用

循序渐进VUE+Element 前端应用开发(7)--- 介绍一些常规的JS处理函数

循序渐进VUE+Element 前端应用开发(8)--- 树列表组件的使用


循序渐进VUE+Element 前端应用开发(9)--- 界面语言国际化的处理

循序渐进VUE+Element 前端应用开发(10)--- 基于vue-echarts处理各种图表展示

循序渐进VUE+Element 前端应用开发(11)--- 图标的维护和使用


循序渐进VUE+Element 前端应用开发(12)--- 整合ABP框架的前端登录处理


循序渐进VUE+Element 前端应用开发(13)--- 前端API接口的封装处理

循序渐进VUE+Element 前端应用开发(14)--- 根据ABP后端接口实现前端界面展示

循序渐进VUE+Element 前端应用开发(15)--- 用户管理模块的处理

循序渐进VUE+Element 前端应用开发(16)--- 组织机构和角色管理模块的处理

循序渐进VUE+Element 前端应用开发(17)--- 菜单管理

循序渐进VUE+Element 前端应用开发(18)--- 功能点管理及权限控制

VUE+Element 前端应用开发框架功能介绍

循序渐进VUE+Element 前端应用开发(19)--- 后端查询接口和Vue前端的整合

使用代码生成工具快速生成基于ABP框架的Vue+Element的前端界面

循序渐进VUE+Element 前端应用开发(20)--- 使用组件封装简化界面代码

循序渐进VUE+Element 前端应用开发(21)--- 省市区县联动处理的组件使用

循序渐进VUE+Element 前端应用开发(22)--- 简化main.js处理代码,抽取过滤器、全局界面函数、组件注册等处理逻辑到不同的文件中

循序渐进VUE+Element 前端应用开发(23)--- 基于ABP实现前后端的附件上传,图片或者附件展示管理

循序渐进VUE+Element 前端应用开发(24)--- 修改密码的前端界面和ABP后端设置处理

循序渐进VUE+Element 前端应用开发(25)--- 各种界面组件的使用(1)

循序渐进VUE+Element 前端应用开发(26)--- 各种界面组件的使用(2)

电商商品数据库的设计和功能界面的处理

循序渐进VUE+Element 前端应用开发(27)--- 数据表的动态表单设计和数据存储

循序渐进VUE+Element 前端应用开发(28)--- 附件内容的管理

循序渐进VUE+Element 前端应用开发(29)--- 高级查询条件的界面设计

部署基于.netcore5.0的ABP框架后台Api服务端,以及使用Nginx部署Vue+Element前端应用

循序渐进VUE+Element 前端应用开发(30)--- ABP后端和Vue+Element前端结合的分页排序处理

循序渐进VUE+Element 前端应用开发(31)--- 系统的日志管理,包括登录日志、接口访问日志、实体变化历史日志

循序渐进VUE+Element 前端应用开发(32)--- 手机短信动态码登陆处理

循序渐进VUE+Element 前端应用开发(33)--- 邮件参数配置和模板邮件发送处理

使用代码生成工具快速开发ABP框架项目

使用Vue-TreeSelect组件实现公司-部门-人员级联下拉列表的处理

使用Vue-TreeSelect组件的时候,用watch变量方式解决弹出编辑对话框界面无法触发更新的问题