• 公共组件封装之:邮件导出弹框


    需求描述:

        对页面上的表格数据进行导出。具体导出方式如下:

          1. 当数据量少于或等于 6000 条时,用户可以直接在页面上导出数据,不需要弹出弹框。

          2. 当数据量超过 6000 条时,需要执行以下步骤:

                ① 弹出一个提示框,要求用户输入他们的邮箱地址和备注信息,需校验邮箱必填和输入的必须是邮件格式。

               ②用户填写邮箱地址和备注信息后,点击确认按钮。

               ③后端将数据导出至用户提供的邮箱地址中。

    1 封装的vue组件

    1. <template>
    2. <div>
    3. <Modal v-model="showEmailInput" width="600" @on-cancel="cancelCsv" :mask-closable="false">
    4. <p slot="header" style="color:#f60;text-align:left">
    5. <Icon type="ios-information-circle" class="icon">Icon>
    6. <span>请填写邮箱地址,并在稍后查看邮箱,请勿重复导出!span>
    7. p>
    8. <i-form ref="form" :label-width="100" :model="formValidate" :rules="ruleValidate">
    9. <Row>
    10. <Col span="22">
    11. <Form-item label="邮箱地址" prop="email" >
    12. <Input v-model="formValidate.email" clearable/>
    13. Form-item>
    14. Col>
    15. Row>
    16. <Row>
    17. <Col span="22">
    18. <Form-item label="邮件留言">
    19. <Input v-model="formValidate.emailDes" clearable/>
    20. Form-item>
    21. Col>
    22. Row>
    23. i-form>
    24. <div slot="footer">
    25. <i-button type="primary" ghost style="width:100px;" @click="cancelCsv">取消i-button>
    26. <i-button type="primary" style="width:100px;;margin-left:40px;" @click="sendEmail">确认i-button>
    27. div>
    28. Modal>
    29. div>
    30. template>
    31. <script>
    32. import { mapState } from 'vuex'
    33. export default {
    34. computed: {
    35. ...mapState(['fileExport'])
    36. },
    37. data(){
    38. return {
    39. showEmailInput:false,
    40. formValidate:{
    41. email:"",
    42. emailDes:""
    43. },
    44. ruleValidate:{
    45. email:[
    46. { required: true, message: '必填项', trigger: 'change' },
    47. { type: 'email', message: '邮箱不正确', trigger: 'change' }
    48. ]
    49. }
    50. }
    51. },
    52. created(){
    53. // vuex 订阅模式, 在组件创建时,订阅字段变化
    54. this.$store.subscribe((mutation, state) => {
    55. // console.log(mutation, state.app.fileExport)
    56. this.showEmailInput = state.app.fileExport
    57. this.formValidate.email = ""
    58. this.formValidate.emailDes = ""
    59. if(state.app.isSuccessful){
    60. this.$Message.success("文件导出成功,请稍后查看邮箱!")
    61. this.$store.commit("updataSuccessful",false)
    62. }
    63. })
    64. },
    65. watch:{
    66. showEmailInput(newValue,oldValue){
    67. if(newValue === false){
    68. this.$refs.form.resetFields()
    69. }
    70. }
    71. },
    72. methods:{
    73. cancelCsv(){
    74. this.formValidate.email = ""
    75. this.formValidate.emailDes = ""
    76. this.$refs.form.resetFields()
    77. this.$store.commit("updataExport",false)
    78. },
    79. sendEmail(){
    80. this.$refs.form.validate((valid) => {
    81. if(valid){
    82. let list = this.$store.state.app.derivedParameter
    83. list.email = this.formValidate.email
    84. list.emailDes = this.formValidate.emailDes
    85. const { param,methodNo,email,emailDes} = list
    86. this.methodsEncapsulate.mailExport(param,methodNo,email,emailDes)
    87. this.$store.commit("updataExport",false)
    88. }
    89. })
    90. }
    91. }
    92. }
    93. script>

    2. 对封装的组件在man.js中,进行全局注册

    1. // 封装的公共弹框组件
    2. import exportPackage from "@/views/my-components/modal-to/exportPackage.vue"
    3. // 公共的导出组件
    4. Vue.component("exportPackage",exportPackage)

    3. 由于交互数据是存放在vuex中的,vuex中也需要增加一些字段

    这是vuex中的目录结构

    1. const app = {
    2. // 这是存放在 state 中的数据
    3. state: {
    4. fileExport:false, // 邮件导出,是否显示弹框
    5. isSuccessful:false, // 邮件导出是否成功
    6. derivedParameter:{}, // 邮件导出时需要的请求参数
    7. },
    8. // 这是 mutations 中的方法,用来修改state 中的数据
    9. mutations:{
    10. // 修改 导出值,显示弹框输入邮件地址
    11. updataExport(state,data){
    12. state.fileExport = data
    13. },
    14. // 请求参数赋值
    15. updataParameter(state,data){
    16. state.derivedParameter = data
    17. },
    18. // 是否导出成功
    19. updataSuccessful(state,data){
    20. state.isSuccessful = data
    21. },
    22. }
    23. }
    24. export default app

     

    4. 单独新建一个methodsEncapsulate.js的文件,对其中的方法进行封装

    注意:这个methodsEncapsulate.js,也需要在main.js中全局注册

    1. /**
    2. * 邮件导出 统一封装
    3. * @param {Object} data
    4. * @param {String} code
    5. * @param {String} email
    6. * @param {String} emailDes
    7. */
    8. mailExport(data = "",code = "",email = "",emailDes = ""){
    9. let list = {
    10. email:email,
    11. emailDes:emailDes,
    12. methodNo:code,
    13. param:data
    14. }
    15. Api.csvExport(list).then(response =>{ // 这地方是调接口的,成功之后进行相关
    16. if(response.result.method === "1"){ // 1 表示数据量少 直接前端导出即可
    17. let urls = response.result.urls
    18. urls.forEach( item =>{ // urls 需要导出文件的数组
    19. window.open(item,"_blank")
    20. })
    21. }else if(response.result.method === "2"){ // 2 表示数据量大,需要邮件导出
    22. store.commit("updataExport",true) // 显示弹框
    23. store.commit("updataParameter",list) // 请求参数存起来
    24. // console.log("***",store.state.app.fileExport)
    25. }else if(response.result.code !== "0"){
    26. // 是否正常 0-正常,不是0,表示异常,-1方法字典值不存在,-2 没有需要导出的数据, -3 导出数据超过邮件导出条数,请增加筛选条件 -4有正在进行的导出 -99 其他 ,
    27. modalMesssage(response.result.message) // 抛出异常信息
    28. }else {
    29. store.commit("updataSuccessful",true) // 文件导出成功
    30. }
    31. })
    32. }

    5. 在需要的组件中使用

    1. // 导出
    2. derive(){
    3. if(this.status === '0'){
    4. let data = {
    5. projectCode:this.projectCode,
    6. projectName:this.project,
    7. orderType:this.orderTypes,
    8. policyHolder:this.subjectInsurance,
    9. insureTimeBegin:this.timeInsurance[0] ? moment(this.timeInsurance[0]).format("YYYY-MM-DD"):"",
    10. insureTimeEnd:this.timeInsurance[1] ? moment(this.timeInsurance[1]).format("YYYY-MM-DD"):"",
    11. orderNo:this.orderNumber,
    12. policyNo:this.warrantyNumber,
    13. inscomName:this.insuranceCompany,
    14. account:this.statisticalNot === "all" ? "":this.statisticalNot
    15. }
    16. // 传递 四个参数 data 是请求对象、"yqGroupExport" 是导出的码值
    17. this.methodsEncapsulate.mailExport(data,"yqGroupExport","","")
    18. }else if(this.status === '1'){
    19. let data = {
    20. projectCode:this.projectCode,
    21. projectName:this.project,
    22. orderType:this.orderTypes,
    23. bussinessMode:this.serviceIdentification,
    24. claimDateBegin:this.claimCompletion[0] ? moment(this.claimCompletion[0]).format("YYYY-MM-DD"):"",
    25. claimDateEnd:this.claimCompletion[1] ? moment(this.claimCompletion[1]).format("YYYY-MM-DD"):"",
    26. orderNo:this.orderNumber,
    27. policyNo:this.warrantyNumber,
    28. inscomName:this.insuranceCompany,
    29. account:this.statisticalNot === "all" ? "":this.statisticalNot
    30. }
    31. this.methodsEncapsulate.mailExport(data,"yqDrugExport","","")
    32. }
    33. },

    5. 导出时必须要加的导出组件

    1. <exportPackage>exportPackage>

    因为上面用到了 this.$store.subscribe,vuex订阅者模式,来订阅vuex中数据状态的变化,该状态的变化,大部分上都是在`created `钩子函数中订阅的。

    想要订阅生效,就必须有地方要使用这个封装好的组件,来触发它,所以这里就要使用这个组件。

  • 相关阅读:
    干货 | 解决 App 自动化测试的常见痛点(弹框及首页启动加载完成判断处理)
    QT计时器QTime的使用举例
    线程同步代码块
    C语言入门 Day_13 二维数组
    掌握Java核心知识,轻松应对面试挑战!
    Recorder 实现语音录制并上传到后端(兼容PC和移动端)
    第三章 组合逻辑电路
    智能电子血压计解决方案开发
    26栈和队列-简单实践
    java计算机毕业设计ssm+vue楼市销售系统
  • 原文地址:https://blog.csdn.net/weixin_48674314/article/details/133387609