index.vue 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. <template>
  2. <div
  3. id="card_BlockchainTransaction"
  4. v-loading="pictLoading"
  5. class="view"
  6. :element-loading-background="'rgba(43, 48, 67, 0.65)'"
  7. :element-loading-spinner="'el-icon-loading'"
  8. >
  9. <div class="crm_search">
  10. <el-form ref="formRef" :model="search" label-width="">
  11. <el-row>
  12. <el-col :span="24" :md="24" :lg="24">
  13. <el-form-item>
  14. <el-select
  15. v-model="search.tag"
  16. class="crm_search_down crm-border-radius-no"
  17. :placeholder="t('Placeholder.Choose')"
  18. >
  19. <el-option
  20. v-for="option in tagOptions"
  21. :key="option.value"
  22. :label="option.label"
  23. :value="option.value"
  24. />
  25. </el-select>
  26. </el-form-item>
  27. <el-form-item style="margin-right: 10px">
  28. <el-input
  29. v-if="search.tag == 1"
  30. v-model.trim="search.cId"
  31. class="crm-border-left-no crm-border-radius-no"
  32. clearable
  33. :placeholder="t('Placeholder.Input')"
  34. @keyup.enter="toSearch"
  35. ></el-input>
  36. <el-input
  37. v-if="search.tag == 2"
  38. v-model.trim="search.mobile"
  39. class="crm-border-left-no crm-border-radius-no"
  40. clearable
  41. :placeholder="t('Placeholder.Input')"
  42. @keyup.enter="toSearch"
  43. ></el-input>
  44. <el-input
  45. v-if="search.tag == 3"
  46. v-model.trim="search.email"
  47. class="crm-border-left-no crm-border-radius-no"
  48. clearable
  49. :placeholder="t('Placeholder.Input')"
  50. @keyup.enter="toSearch"
  51. ></el-input>
  52. </el-form-item>
  53. <el-form-item style="margin-right: 10px">
  54. <el-input
  55. v-model.trim="search.address"
  56. class="crm-border-radius-no"
  57. clearable
  58. :placeholder="t('Ucard.BlockchainTransaction.address')"
  59. @keyup.enter="toSearch"
  60. >
  61. </el-input>
  62. </el-form-item>
  63. <el-form-item>
  64. <el-input
  65. v-model.trim="search.unit"
  66. class="crm-border-radius-no"
  67. clearable
  68. :placeholder="t('Ucard.BlockchainTransaction.unit')"
  69. @keyup.enter="toSearch"
  70. >
  71. </el-input>
  72. </el-form-item>
  73. <el-form-item>
  74. <el-button
  75. class="crm-border-radius-no crm-border-left-no"
  76. icon="el-icon-search"
  77. @click="toSearch"
  78. ></el-button>
  79. </el-form-item>
  80. </el-col>
  81. </el-row>
  82. <el-form-item>
  83. <el-button
  84. v-if="display['R-Card-BlockchainTransaction-Export']?.show"
  85. type="primary"
  86. style="margin-left: 8px"
  87. :loading="exportLoading"
  88. @click="exportList"
  89. >
  90. {{ t('Btn.Export') }}
  91. </el-button>
  92. </el-form-item>
  93. </el-form>
  94. </div>
  95. <el-table :data="mock_tableData" stripe style="width: 100%">
  96. <el-table-column prop="" align="left" :label="t('Label.CidAccount')">
  97. <template #default="{ row }">
  98. <span>{{ row.cId || '--' }}</span>
  99. </template>
  100. </el-table-column>
  101. <el-table-column prop="name" align="left" :label="t('Label.Name')">
  102. <template #default="{ row }">
  103. <span v-if="row.firstName">
  104. {{ row.firstName + ' ' }}
  105. </span>
  106. <span v-if="row.middle">{{ row.middle + ' ' }}</span>
  107. <span v-if="row.lastName">{{ row.lastName }}</span>
  108. <span v-if="!row.firstName && !row.lastName && !row.middle">{{ '--' }}</span>
  109. </template>
  110. </el-table-column>
  111. <el-table-column prop="email" align="left" :label="t('Label.Email')">
  112. <template #default="{ row }">
  113. {{ row.email || '--' }}
  114. </template>
  115. </el-table-column>
  116. <el-table-column prop="mobile" align="left" :label="t('Label.Mobile')">
  117. <template #default="{ row }"> {{ row.areaCode }} {{ row.mobile }} </template>
  118. </el-table-column>
  119. <el-table-column prop="blockchain" align="left" :label="t('Ucard.Blockchain.pageT2')">
  120. <template #default="{ row }">
  121. {{ row.blockchain || '--' }}
  122. </template>
  123. </el-table-column>
  124. <el-table-column prop="country" align="left" :label="t('Ucard.DepositAddress.p1')">
  125. <template #default="{ row }">
  126. {{ row.country || '--' }}
  127. </template>
  128. </el-table-column>
  129. <el-table-column prop="address" align="left" :label="t('Ucard.DepositAddress.p2')">
  130. <template #default="{ row }">
  131. {{ row.address || '--' }}
  132. </template>
  133. </el-table-column>
  134. <el-table-column prop="unit" align="left" :label="t('Ucard.BlockchainTransaction.p1')">
  135. <template #default="{ row }">
  136. {{ row.unit || '--' }}
  137. </template>
  138. </el-table-column>
  139. <el-table-column prop="amount" align="left" :label="t('Ucard.BlockchainTransaction.p2')">
  140. <template #default="{ row }">
  141. {{ row.amount || '--' }}
  142. </template>
  143. </el-table-column>
  144. </el-table>
  145. <PagePagination
  146. :pager-info="pagerInfo"
  147. @current-change="handleCurrentChange"
  148. @size-change="handleSizeChange"
  149. />
  150. </div>
  151. </template>
  152. <script setup>
  153. import { ref, reactive, computed, onMounted, inject } from 'vue'
  154. import { useI18n } from 'vue-i18n'
  155. import { ElMessage } from 'element-plus'
  156. import Service from '@/service/ucard'
  157. import Config from '@/config/index'
  158. import { exportExcel } from '@/utils/export'
  159. import PagePagination from '@/components/pagePagination/index.vue'
  160. const { t } = useI18n()
  161. const { Code } = Config
  162. const Session = inject('session')
  163. const pigeon = inject('pigeon')
  164. // 响应式数据
  165. const pictLoading = ref(false)
  166. const exportLoading = ref(false)
  167. const mock_tableData = ref([])
  168. const formRef = ref(null)
  169. const search = reactive({
  170. tag: 1,
  171. cId: '',
  172. email: '',
  173. mobile: '',
  174. address: '',
  175. unit: '',
  176. })
  177. const pagerInfo = reactive({
  178. row: 10,
  179. current: 1,
  180. pageTotal: 0,
  181. rowTotal: 0,
  182. })
  183. // 计算属性
  184. const display = computed(() => {
  185. return JSON.parse(Session.Get('display', true))
  186. })
  187. const tagOptions = computed(() => [
  188. { label: t('Label.CidAccount'), value: 1 },
  189. { label: t('Ucard.KycAuth.item2'), value: 2 },
  190. { label: t('Ucard.KycAuth.item3'), value: 3 },
  191. ])
  192. // 生命周期
  193. onMounted(() => {
  194. searchFunc()
  195. })
  196. // 方法
  197. // 获取列表数据
  198. const searchFunc = async () => {
  199. pictLoading.value = true
  200. if (!display.value['R-Card-BlockchainTransaction-Page']?.show) {
  201. ElMessage.warning(t('Msg.NotDisplay'))
  202. pictLoading.value = false
  203. return
  204. }
  205. const res = await Service.getBlockchainTransactionPage({
  206. ...search,
  207. page: {
  208. current: pagerInfo.current,
  209. row: pagerInfo.row,
  210. },
  211. })
  212. if (res.code == Code.StatusOK) {
  213. mock_tableData.value = res.data
  214. if (res.page != null) {
  215. pagerInfo.rowTotal = res.page.rowTotal
  216. pagerInfo.pageTotal = res.page.pageTotal
  217. } else {
  218. pagerInfo.rowTotal = 0
  219. }
  220. ElMessage.success(t('Msg.SearchSuccess'))
  221. } else {
  222. ElMessage.error(res.msg)
  223. }
  224. pictLoading.value = false
  225. }
  226. // 搜索
  227. const toSearch = () => {
  228. pagerInfo.current = 1
  229. searchFunc()
  230. }
  231. // 分页返回数据
  232. const handleSizeChange = (val) => {
  233. pagerInfo.row = val
  234. searchFunc()
  235. }
  236. const handleCurrentChange = (val) => {
  237. pagerInfo.current = val
  238. searchFunc()
  239. }
  240. // 导出
  241. const exportList = async () => {
  242. exportLoading.value = true
  243. try {
  244. await exportExcel(
  245. pigeon,
  246. '/wasabi/encrypted/wallet/transaction/list/export',
  247. { ...search },
  248. 'Encrypted_Wallet_Transactions'
  249. )
  250. } catch (error) {
  251. ElMessage.error(t('Msg.ExportFail'))
  252. } finally {
  253. exportLoading.value = false
  254. }
  255. }
  256. </script>