c6c5f8b4033e561f371554abe11389b1.json 20.9 KB
Newer Older
liang ce committed
1
{"remainingRequest":"/Users/ryousaku/Desktop/ming/mingpay/node_modules/vue-loader/lib/index.js??vue-loader-options!/Users/ryousaku/Desktop/ming/mingpay/src/components/pages/PaymentManagement/AccountManagement.vue?vue&type=style&index=0&id=01b7bc3f&lang=less&scoped=true&","dependencies":[{"path":"/Users/ryousaku/Desktop/ming/mingpay/src/components/pages/PaymentManagement/AccountManagement.vue","mtime":1560925161100},{"path":"/Users/ryousaku/Desktop/ming/mingpay/node_modules/css-loader/index.js","mtime":1557826125722},{"path":"/Users/ryousaku/Desktop/ming/mingpay/node_modules/vue-loader/lib/loaders/stylePostLoader.js","mtime":1557826125950},{"path":"/Users/ryousaku/Desktop/ming/mingpay/node_modules/postcss-loader/src/index.js","mtime":1557826125898},{"path":"/Users/ryousaku/Desktop/ming/mingpay/node_modules/less-loader/dist/cjs.js","mtime":1557889176706},{"path":"/Users/ryousaku/Desktop/ming/mingpay/node_modules/cache-loader/dist/cjs.js","mtime":1557826125621},{"path":"/Users/ryousaku/Desktop/ming/mingpay/node_modules/vue-loader/lib/index.js","mtime":1557826125950}],"contextDependencies":[],"result":["\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.searchBox{\n  display: flex;\n  margin-bottom: 15px;\n}\n.searchBox > input {\n  margin-right: 20px;\n  max-width: 180px;\n}\n.operationTable a{\n  margin-right: 8px;\n}\n.searchUserMessage{\n  width: 100%;\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  font-size: 12px;\n  padding: 8px 8px;\n  border: 1px solid #cccccc;\n  margin-bottom: 15px;\n  border-radius: 8px;\n  position: relative;\n}\n.searchUserMessage img{\n  width: 32px;\n  height: 32px;\n  border-radius: 50%;\n  margin-bottom: 8px;\n}\n.positionDiv{\n  height: 12px;\n  width: 12px;\n  transform:rotate(45deg);\n  border-left: 1px solid #cccccc;\n  border-top: 1px solid #cccccc;\n  position: absolute;\n  top: -7px;\n  left: 30px;\n  background: white;\n  z-index: 99;\n}\n.clearUserMessage{\n  position: absolute;\n  right: 10px;\n}\n",{"version":3,"sources":["AccountManagement.vue"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6aA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"AccountManagement.vue","sourceRoot":"src/components/pages/PaymentManagement","sourcesContent":["<template>\n    <div class=\"AccountManagement\">\n      <div class=\"searchBox\">\n        <a-input placeholder=\"选择成员\" @click=\"choosePeople\" style=\"width: 120px\"/>\n        <a-input placeholder=\"输入卡号\" v-model=\"searchSource.cardNum\" style=\"width: 120px\"/>\n        <a-select defaultValue=\"卡片状态\" style=\"width: 120px;margin-right: 20px;\" @change=\"selectHandleChangeCard\">\n          <a-select-option value=\"ACTIVE\">已绑卡</a-select-option>\n          <a-select-option value=\"NOT_EXIST\">未绑卡</a-select-option>\n          <a-select-option value=\"UNACTIVE\">冻结</a-select-option>\n        </a-select>\n        <a-select defaultValue=\"账户状态\" style=\"width: 120px;margin-right: 20px;\" @change=\"selectHandleChangeAccount\">\n          <a-select-option value=\"ACTIVE\">使用中</a-select-option>\n          <a-select-option value=\"LOG_OFF\">冻结并结现</a-select-option>\n        </a-select>\n        <a-button type=\"primary\" @click=\"queryAccountList()\">查询</a-button>\n      </div>\n      <div class=\"searchUserMessage\" v-if=\"searchSource.UserMessage.emplId\">\n        <div class=\"positionDiv\"></div>\n        <div class=\"clearUserMessage\"><a href=\"javascript:;\" @click=\"clearUserMessage\">清除</a></div>\n        <img v-if=\"searchSource.UserMessage.avatar\" :src=\"searchSource.UserMessage.avatar\" :alt=\"searchSource.UserMessage.name\"/>\n        <img v-else :src=\"this.avatarCanvasFn(searchSource.UserMessage.name)\" :alt=\"searchSource.UserMessage.name\">\n        <span>{{ searchSource.UserMessage.name }}</span>\n      </div>\n      <a-table :columns=\"columns\" :dataSource=\"accountList\" size=\"default\" rowKey=\"userId\" :pagination=\"pagination\" @change=\"handleTableChange\">\n        <span slot=\"name\">姓名</span>\n        <span slot=\"departmentNameList\" slot-scope=\"departmentNameList\">\n          {{ departmentNameListToStr(departmentNameList) }}\n        </span>\n        <span slot=\"realityBalance\">余额</span>\n        <span slot=\"cardNo\" slot-scope=\"cardNo, record\">\n          {{ cardNo ? cardNo : '未绑卡' }}\n          <br/>\n          {{ cardNo ? record.cardStatus === 'UNACTIVE' ? '已冻结' : '使用中' : ''}}\n        </span>\n        <span slot=\"status\" slot-scope=\"status\">\n          {{ status === MINGPAY_ACCOUNT_STATUS.ACTIVE ? '使用中' : '已注销并结现' }}\n        </span>\n        <span slot=\"action\" slot-scope=\"text, record, index\" class=\"operationTable\">\n          <a href=\"javascript:;\" @click=\"ToViewAllowances(record)\">查看津贴</a>\n          <a v-if=\"record.status = MINGPAY_ACCOUNT_STATUS.ACTIVE\" href=\"javascript:;\" @click=\"showModal(record.userId, record.name, index)\">充值</a>\n          <a-dropdown v-if=\"record.status = MINGPAY_ACCOUNT_STATUS.ACTIVE\">\n            <a class=\"ant-dropdown-link\" href=\"javascript:;\">\n              更多操作 <a-icon type=\"down\" />\n            </a>\n            <a-menu slot=\"overlay\">\n              <a-menu-item v-if=\"record.cardStatus === MINGPAY_ACCOUNT_STATUS.ACTIVE && record.cardNo \">\n                <a href=\"javascript:;\" @click=\"showConfirm(record.userId, 1, index)\">冻结实体卡</a>\n              </a-menu-item>\n              <a-menu-item v-if=\"record.cardStatus === MINGPAY_ACCOUNT_STATUS.UNACTIVE && record.cardNo\">\n                <a href=\"javascript:;\" @click=\"showConfirm(record.userId, 2, index)\">解冻实体卡</a>\n              </a-menu-item>\n              <a-menu-item v-if=\"record.cardNo\">\n                <a href=\"javascript:;\" @click=\"confimBindSure(record.userId, index)\">解绑实体卡</a>\n              </a-menu-item>\n              <a-menu-item v-else>\n                <a href=\"javascript:;\" @click=\"changeVisible2(record.userId, index)\">绑定实体卡</a>\n              </a-menu-item>\n              <a-menu-item v-if=\"record.status != MINGPAY_ACCOUNT_STATUS.LOG_OFF\">\n                <a href=\"javascript:;\" @click=\"showConfirm(record.userId, 3, index)\">注销并结现</a>\n              </a-menu-item>\n            </a-menu>\n          </a-dropdown>\n        </span>\n      </a-table>\n      <a-modal title=\"绑定实体卡\" v-model=\"visible2\" @ok=\"cardOperation(2)\">\n        <a-form :form=\"updateBindCardStatusForm\">\n          <a-form-item label=\"实体卡号\" :label-col=\"{ span: 5 }\" :wrapper-col=\"{ span: 12 }\" >\n            <a-input v-decorator=\"['cardNo', {rules: [{ required: true, message: '请填写正确的实体卡号!' }, {validator: bindCardNum}]}]\"/>\n          </a-form-item>\n        </a-form>\n      </a-modal>\n      <a-modal title=\"现金充值\" v-model=\"visible\" @ok=\"internalRecharge()\">\n        <a-form :form=\"form\">\n          <a-form-item label=\"充值金额\" :label-col=\"{ span: 5 }\" :wrapper-col=\"{ span: 12 }\" >\n            <a-input\n              v-decorator=\"['orderPrice',{rules: [{required: true, message: '充值金额不能为空'}, {validator: rechargeNum}]}]\"\n            />\n          </a-form-item>\n          <a-form-item label=\"备注\" :label-col=\"{ span: 5 }\" :wrapper-col=\"{ span: 12 }\" >\n            <a-textarea v-decorator=\"['remark', {rules: [{ required: true, message: '备注不能为空' }]}]\"/>\n          </a-form-item>\n        </a-form>\n      </a-modal>\n      <!-- 账户管理 -->\n      <!-- <button @click=\"asd()\">鉴权</button> -->\n      <!-- <button @click=\"asd2()\"> 免等</button> -->\n    </div>\n</template>\n\n<script>\nimport { config } from './../../../api/config.js'\nimport { $http } from './../../../api/axios.js'\nimport { MINGPAY_ACCOUNT_STATUS } from './../../../api/constant'\n// import { avatarFn } from './../../../api/avatar'\nexport default {\n  name: 'accountManagement',\n  components: {},\n  data () {\n    return {\n      visible: false,\n      visible2: false,\n      formLayout: 'horizontal',\n      form: this.$form.createForm(this),\n      updateBindCardStatusForm: this.$form.createForm(this),\n      MINGPAY_ACCOUNT_STATUS: MINGPAY_ACCOUNT_STATUS,\n      data: [],\n      pagination: {\n        current: 1,\n        defaultCurrent: 10,\n        defaultPageSize: 2,\n        hideOnSinglePage: true,\n        total: 0\n      },\n      columns: [{\n        title: '成员',\n        dataIndex: 'name',\n        width: '90px'\n      }, {\n        title: '部门',\n        dataIndex: 'departmentNameList',\n        scopedSlots: { customRender: 'departmentNameList' },\n        width: '140px'\n      }, {\n        title: '余额',\n        dataIndex: 'realityBalance'\n      }, {\n        title: '实体卡状态',\n        dataIndex: 'cardNo',\n        scopedSlots: { customRender: 'cardNo' }\n      }, {\n        title: '账户状态',\n        dataIndex: 'status',\n        scopedSlots: { customRender: 'status' }\n      }, {\n        title: '操作',\n        dataIndex: 'action',\n        scopedSlots: { customRender: 'action' }\n      }],\n      accountList: [],\n      rechargeData: {\n        userId: '',\n        userName: '',\n        orderPrice: '',\n        remark: ''\n      },\n      selsctUserId: '',\n      selsctIndex: 0,\n      searchSource: {\n        ddchoosePeople: {\n          userIdList: [],\n          departmentIdList: []\n        },\n        UserMessage: {\n          avatar: '',\n          emplId: '',\n          name: ''\n        },\n        cardNum: '',\n        cardStatus: '',\n        accountStatus: ''\n      }\n    }\n  },\n  watch: {},\n  computed: {},\n  created: function () {\n    this.queryAccountList()\n  },\n  methods: {\n    // 获取账户列表\n    queryAccountList () {\n      const _that = this\n      let AccountData = this.$qs.stringify({\n        pageNum: this.pagination.current,\n        numPerPage: this.pagination.defaultPageSize,\n        departmentIdList: this.searchSource.ddchoosePeople.departmentIdList,\n        userIdList: this.searchSource.ddchoosePeople.userIdList,\n        status: this.searchSource.accountStatus,\n        cardNo: this.searchSource.cardNum,\n        cardStatus: this.searchSource.cardStatus,\n        orgId: sessionStorage.getItem('corpId')\n      })\n      $http.get(`/v1/account/queryAccountList?${AccountData}`).then((res) => {\n        _that.accountList = res.data.data.recordList\n        _that.pagination.total = parseInt(res.data.data.totalCount)\n        console.log(_that)\n        console.log(_that.accountList)\n      })\n    },\n    // 搜索条件,卡片和账户状态\n    selectHandleChangeCard (value) {\n      console.log(value)\n      this.searchSource.cardStatus = value\n    },\n    selectHandleChangeAccount (value) {\n      this.searchSource.accountStatus = value\n    },\n    // 选人组件调用\n    choosePeople () {\n      config.ddready('ddchoose').then((res) => {\n        console.log(res)\n        let userIdListObj = []\n        let departmentIdListObj = []\n        res.departments.map((item, index) => {\n          departmentIdListObj.push(item.id)\n        })\n        res.users.map((item, index) => {\n          userIdListObj.push(item.emplId)\n        })\n        this.searchSource.ddchoosePeople.departmentIdList = departmentIdListObj\n        this.searchSource.ddchoosePeople.userIdList = userIdListObj\n      })\n    },\n    // 校验账户充值金额大小和纯数字\n    rechargeNum (rule, value, callback) {\n      const temp = /^\\d+\\.?\\d{0,2}$/\n      if (!temp.test(value) || parseFloat(value) > 10000) {\n        callback('请输入正确的金额,最多保留小数点后两位,充值金额最多为一万元')\n        return\n      }\n      callback()\n    },\n    // 清理选择帅选人list\n    clearUserMessage () {\n      this.searchSource.UserMessage = {\n        avatar: '',\n        emplId: '',\n        name: ''\n      }\n    },\n    // 用户头像处理\n    avatarCanvasFn (name) {\n      let canvas = document.createElement('canvas')\n      let con = canvas.getContext('2d')\n      let ratio = this.getPixelRatio(con)\n      canvas.style.width = 40 + 'px'\n      canvas.style.height = 40 + 'px'\n      canvas.width = 40 * ratio\n      canvas.height = 40 * ratio\n      con.scale(ratio, ratio)\n      con.fillStyle = '#1890ff'\n      con.fillRect(0, 0, 40, 40)\n      con.fillStyle = '#ffffff'\n      con.font = '12px Arial'\n      con.textAlign = 'center'\n      con.fillText(name, 20, 25)\n      return canvas.toDataURL()\n    },\n    // 头像模糊处理\n    getPixelRatio (context) {\n      var backingStore = context.backingStorePixelRatio ||\n        context.webkitBackingStorePixelRatio ||\n        context.mozBackingStorePixelRatio ||\n        context.msBackingStorePixelRatio ||\n        context.oBackingStorePixelRatio ||\n        context.backingStorePixelRatio || 1\n      return (window.devicePixelRatio || 1) / backingStore\n    },\n    // 绑定实体卡号校验,仅字符串和数字\n    bindCardNum (rule, value, callback) {\n      var re = /^[0-9a-zA-Z]*$/\n      if (!re.test(value)) {\n        callback('实体卡卡号必须由数字和字母组成')\n        return\n      }\n      callback()\n    },\n    // 绑定实体卡modal切换\n    changeVisible2 (str, index) {\n      this.visible2 = !this.visible2\n      this.selsctUserId = str\n      this.selsctIndex = index\n    },\n    // 分页\n    handleTableChange (pagination, filters, sorter) {\n      this.pagination.current = pagination.current\n      this.queryAccountList()\n    },\n    // table部门表格字符串处理\n    departmentNameListToStr (str) {\n      let departmentNameListStr = ''\n      if (str.length !== 0) {\n        str.map((data) => {\n          departmentNameListStr = `${departmentNameListStr}${data},`\n        })\n      }\n      departmentNameListStr = departmentNameListStr.substring(0, departmentNameListStr.length - 1)\n      return departmentNameListStr\n    },\n    // 查看津贴\n    ToViewAllowances (str) {\n      console.log(str.userId)\n      this.$router.push({ name: 'viewAllowances', params: { userId: str.userId } })\n    },\n    // 内部充值接口\n    internalRecharge () {\n      let _that = this\n      this.rechargeData.orderPrice = this.form.getFieldsValue().orderPrice\n      this.rechargeData.remark = this.form.getFieldsValue().remark\n      this.rechargeData.orgId = sessionStorage.getItem('corpId')\n      let rechargeData = this.$qs.stringify(this.rechargeData)\n      $http.get(`/v1/charge/charge?${rechargeData}`).then((res) => {\n        console.log(res.data.message)\n        if (res.data.message === 'SUCCESS') {\n          this.visible = false\n          this.form.resetFields()\n          this.$message.success('充值成功')\n        } else {\n          this.$message.success(res.data.message)\n        }\n      }).catch((err) => {\n        console.log(err)\n        this.$message.error('充值失败')\n      })\n    },\n    // 充值modal\n    showModal (userId, userName, index) {\n      this.rechargeData.userId = userId\n      this.rechargeData.userName = userName\n      this.selsctIndex = index\n      this.visible = true\n    },\n    // 账户操作和卡片操作\n    accountOperation (type, userId, status, index) {\n      let accountOperationData = this.$qs.stringify({\n        userId: userId,\n        status: status,\n        orgId: sessionStorage.getItem('corpId')\n      })\n      $http.get(`/v1/account/update_account_status?${accountOperationData}`).then((res) => {\n        if (res.data.message === 'SUCCESS') {\n          let dataSource = [...this.accountList]\n          if (type === 1 || type === 2) {\n            dataSource[index].cardStatus = status\n          } else if (type === 3) {\n            dataSource[index].status = status\n          }\n          this.accountList = dataSource\n          this.$message.success('操作成功')\n        }\n      }).catch(() => {\n        this.$message.error('修改失败')\n      })\n    },\n    // binding,unbinding二次确认\n    confimBindSure (userId, index) {\n      this.selsctUserId = userId\n      this.selsctIndex = index\n      const _that = this\n      this.$confirm({\n        title: '确认要对该账户实体卡解除绑定么?',\n        content: '解除绑定后,该实体卡将不能付款',\n        onOk () {\n          _that.cardOperation(1)\n        }\n      })\n    },\n    // 冻结,解冻,注销结现二次确认\n    showConfirm (userId, str, index) {\n      let title = ''\n      let content = ''\n      let status = ''\n      const _that = this\n      // 1冻结,2解冻,3注销并结现\n      switch (str) {\n        case 1:\n          title = '确认要对该账户实体卡进行冻结操作么?'\n          content = '冻结后二维码可使用付款,实体卡片不能付款,若想再次使用实体卡请先解冻'\n          status = MINGPAY_ACCOUNT_STATUS.UNACTIVE\n          break\n        case 2:\n          title = '确认要对该账户实体卡进行解冻操作么?'\n          content = '解冻后二维码与实体卡片均可正常使用'\n          status = MINGPAY_ACCOUNT_STATUS.ACTIVE\n          break\n        case 3:\n          title = '确认要对该账户进行注销并结现操作么?'\n          content = '注销并结现后二维码与实体卡片均不能在使用'\n          status = MINGPAY_ACCOUNT_STATUS.LOG_OFF\n      }\n      this.$confirm({\n        title: title,\n        content: content,\n        onOk () {\n          _that.accountOperation(str, userId, status, index)\n        }\n      })\n    },\n    // 绑卡解绑操作\n    cardOperation (type) {\n      let cardOperationData = ''\n      const cardNo = this.updateBindCardStatusForm.getFieldsValue().cardNo\n      if (type === 2) {\n        cardOperationData = this.$qs.stringify({\n          cardNo: this.updateBindCardStatusForm.getFieldsValue().cardNo,\n          userId: this.selsctUserId,\n          orgId: sessionStorage.getItem('corpId')\n        })\n      } else if (type === 1) {\n        cardOperationData = this.$qs.stringify({\n          cardNo: '',\n          userId: this.selsctUserId,\n          orgId: sessionStorage.getItem('corpId')\n        })\n      }\n      $http.get(`/v1/account/update_bind_card_status?${cardOperationData}`).then((res) => {\n        if (res.data.message === 'SUCCESS') {\n          let dataSource = [...this.accountList]\n          if (type === 2) {\n            dataSource[this.selsctIndex].cardNo = cardNo\n          } else if (type === 1) {\n            dataSource[this.selsctIndex].cardNo = ''\n          }\n          this.accountList = dataSource\n          this.visible2 = false\n          this.$message.success('操作成功')\n        } else {\n          this.$message.error(res.data.message)\n        }\n      }).catch((err) => {\n        console.log(err)\n      })\n    }\n  },\n  mounted () {}\n}\n</script>\n\n<style lang=\"less\" scoped>\n.searchBox{\n  display: flex;\n  margin-bottom: 15px;\n}\n.searchBox > input {\n  margin-right: 20px;\n  max-width: 180px;\n}\n.operationTable a{\n  margin-right: 8px;\n}\n.searchUserMessage{\n  width: 100%;\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  font-size: 12px;\n  padding: 8px 8px;\n  border: 1px solid #cccccc;\n  margin-bottom: 15px;\n  border-radius: 8px;\n  position: relative;\n}\n.searchUserMessage img{\n  width: 32px;\n  height: 32px;\n  border-radius: 50%;\n  margin-bottom: 8px;\n}\n.positionDiv{\n  height: 12px;\n  width: 12px;\n  transform:rotate(45deg);\n  border-left: 1px solid #cccccc;\n  border-top: 1px solid #cccccc;\n  position: absolute;\n  top: -7px;\n  left: 30px;\n  background: white;\n  z-index: 99;\n}\n.clearUserMessage{\n  position: absolute;\n  right: 10px;\n}\n</style>\n"]}]}