doum
7 天以前 b574291c99bba5819fe2d69405ffa10e9d47d994
代码初始化
已删除1个文件
已修改17个文件
已重命名1个文件
614 ■■■■■ 文件已修改
admin/.env.development 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/package-lock.json 168 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/package.json 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/public/index.html 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/common/Menu.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/orders.vue 168 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/login.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/system/user.vue 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/admin/src/main/java/com/doumee/job/AutoCancelOrdersJob.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/business/model/Orders.java 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/system/vo/SystemUserListVO.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/OrdersService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java 109 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/system/impl/SystemUserServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web/manifest.json 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
web/pages/index/index.vue 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web/unpackage/dist/build/web/index.html 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web/unpackage/dist/build/web/static/js/pages-index-index.a9baa0a0.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/.env.development
@@ -3,4 +3,4 @@
# é¡¹ç›®ä¸Šä¸‹æ–‡è·¯å¾„
VUE_APP_CONTEXT_PATH = '/'
VUE_APP_API_URL = 'http://localhost:11010'
VUE_APP_API_URL = 'http://localhost:12010'
admin/package-lock.json
@@ -1,5 +1,5 @@
{
  "name": "jinkuai",
  "name": "diandongche",
  "version": "1.0.0",
  "lockfileVersion": 1,
  "requires": true,
@@ -1871,63 +1871,6 @@
          "integrity": "sha1-/q7SVZc9LndVW4PbwIhRpsY1IPo=",
          "dev": true
        },
        "ansi-styles": {
          "version": "4.3.0",
          "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
          "dev": true,
          "optional": true,
          "requires": {
            "color-convert": "^2.0.1"
          }
        },
        "chalk": {
          "version": "4.1.2",
          "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
          "dev": true,
          "optional": true,
          "requires": {
            "ansi-styles": "^4.1.0",
            "supports-color": "^7.1.0"
          }
        },
        "color-convert": {
          "version": "2.0.1",
          "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
          "dev": true,
          "optional": true,
          "requires": {
            "color-name": "~1.1.4"
          }
        },
        "color-name": {
          "version": "1.1.4",
          "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
          "dev": true,
          "optional": true
        },
        "has-flag": {
          "version": "4.0.0",
          "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
          "dev": true,
          "optional": true
        },
        "loader-utils": {
          "version": "2.0.4",
          "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.4.tgz",
          "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
          "dev": true,
          "optional": true,
          "requires": {
            "big.js": "^5.2.2",
            "emojis-list": "^3.0.0",
            "json5": "^2.1.2"
          }
        },
        "ssri": {
          "version": "8.0.1",
          "resolved": "https://registry.npm.taobao.org/ssri/download/ssri-8.0.1.tgz?cache=0&sync_timestamp=1617826515595&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fssri%2Fdownload%2Fssri-8.0.1.tgz",
@@ -1935,28 +1878,6 @@
          "dev": true,
          "requires": {
            "minipass": "^3.1.1"
          }
        },
        "supports-color": {
          "version": "7.2.0",
          "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
          "dev": true,
          "optional": true,
          "requires": {
            "has-flag": "^4.0.0"
          }
        },
        "vue-loader-v16": {
          "version": "npm:vue-loader@16.8.3",
          "resolved": "https://registry.npmmirror.com/vue-loader/-/vue-loader-16.8.3.tgz",
          "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
          "dev": true,
          "optional": true,
          "requires": {
            "chalk": "^4.1.0",
            "hash-sum": "^2.0.0",
            "loader-utils": "^2.0.0"
          }
        }
      }
@@ -11116,6 +11037,12 @@
      "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
      "dev": true
    },
    "qrcodejs2": {
      "version": "0.0.2",
      "resolved": "https://registry.npmmirror.com/qrcodejs2/-/qrcodejs2-0.0.2.tgz",
      "integrity": "sha512-+Y4HA+cb6qUzdgvI3KML8GYpMFwB24dFwzMkS/yXq6hwtUGNUnZQdUnksrV1XGMc2mid5ROw5SAuY9XhI3ValA==",
      "dev": true
    },
    "qs": {
      "version": "6.5.2",
      "resolved": "https://registry.npm.taobao.org/qs/download/qs-6.5.2.tgz?cache=0&sync_timestamp=1616385328325&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fqs%2Fdownload%2Fqs-6.5.2.tgz",
@@ -13711,6 +13638,87 @@
        }
      }
    },
    "vue-loader-v16": {
      "version": "npm:vue-loader@16.8.3",
      "resolved": "https://registry.npmmirror.com/vue-loader/-/vue-loader-16.8.3.tgz",
      "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
      "dev": true,
      "optional": true,
      "requires": {
        "chalk": "^4.1.0",
        "hash-sum": "^2.0.0",
        "loader-utils": "^2.0.0"
      },
      "dependencies": {
        "ansi-styles": {
          "version": "4.3.0",
          "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
          "dev": true,
          "optional": true,
          "requires": {
            "color-convert": "^2.0.1"
          }
        },
        "chalk": {
          "version": "4.1.2",
          "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
          "dev": true,
          "optional": true,
          "requires": {
            "ansi-styles": "^4.1.0",
            "supports-color": "^7.1.0"
          }
        },
        "color-convert": {
          "version": "2.0.1",
          "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
          "dev": true,
          "optional": true,
          "requires": {
            "color-name": "~1.1.4"
          }
        },
        "color-name": {
          "version": "1.1.4",
          "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
          "dev": true,
          "optional": true
        },
        "has-flag": {
          "version": "4.0.0",
          "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
          "dev": true,
          "optional": true
        },
        "loader-utils": {
          "version": "2.0.4",
          "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.4.tgz",
          "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
          "dev": true,
          "optional": true,
          "requires": {
            "big.js": "^5.2.2",
            "emojis-list": "^3.0.0",
            "json5": "^2.1.2"
          }
        },
        "supports-color": {
          "version": "7.2.0",
          "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
          "dev": true,
          "optional": true,
          "requires": {
            "has-flag": "^4.0.0"
          }
        }
      }
    },
    "vue-router": {
      "version": "3.5.1",
      "resolved": "https://registry.nlark.com/vue-router/download/vue-router-3.5.1.tgz?cache=0&sync_timestamp=1620899536020&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fvue-router%2Fdownload%2Fvue-router-3.5.1.tgz",
admin/package.json
@@ -47,6 +47,7 @@
    "jsencrypt": "^3.3.2",
    "lint-staged": "^9.5.0",
    "node-sass": "^4.12.0",
    "qrcodejs2": "0.0.2",
    "sass-loader": "^8.0.2",
    "vue-cli-plugin-element-ui": "~1.1.4",
    "vue-cropper": "^0.6.5",
admin/public/index.html
@@ -5,7 +5,7 @@
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
    <title>豆米电动车后台管理系统</title>
    <title>智租蜂后台管理系统</title>
  </head>
  <body>
    <div id="app"></div>
admin/src/components/common/Menu.vue
@@ -2,7 +2,7 @@
  <div class="menu" :class="{collapse: menuData.collapse}">
    <div class="logo">
      <div><img src="@/assets/logo.png"></div>
      <h1 :class="{hidden: menuData.collapse}">豆米电动车后台管理系统</h1>
      <h1 :class="{hidden: menuData.collapse}">智租蜂后台管理系统</h1>
    </div>
    <scrollbar>
      <el-menu
admin/src/views/business/orders.vue
@@ -2,60 +2,48 @@
  <TableLayout :permissions="['business:orders:query']">
    <!-- æœç´¢è¡¨å• -->
    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
      <el-form-item label="订单号" prop="releaseMemberId">
        <el-input v-model="searchForm.code" style="width: 120px"  clearable placeholder="请输入订单号" @keypress.enter.native="search"></el-input>
      <el-form-item label="" prop="id">
        <el-input v-model="searchForm.id"    clearable placeholder="订单号" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="接单方" prop="acceptName">
        <el-input v-model="searchForm.acceptName" style="width: 120px"  clearable placeholder="请输入名称" @keypress.enter.native="search"></el-input>
      <el-form-item label="" prop="name">
        <el-input v-model="searchForm.name"    clearable placeholder="付款人姓名" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="发单方" prop="releaseName">
        <el-input v-model="searchForm.releaseName" style="width: 120px"  clearable placeholder="请输入名称" @keypress.enter.native="search"></el-input>
      <el-form-item label="" prop="phone">
        <el-input v-model="searchForm.phone"    clearable placeholder="付款人手机号" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="订单类型" prop="type">
        <el-select v-model="searchForm.type"  style="width: 120px"  @keypress.enter.native="search" clearable placeholder="订单类型">
          <el-option label="用工单" :value="0"></el-option>
          <el-option label="货运单" :value="1"></el-option>
          <el-option label="订餐单" :value="2"></el-option>
      <el-form-item label="" prop="username">
        <el-input v-model="searchForm.username"  clearable placeholder="负责人账号" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="" prop="userRealname">
        <el-input v-model="searchForm.userRealname"   clearable placeholder="负责人姓名" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="" prop="type">
        <el-select v-model="searchForm.type"    @change="search"  clearable placeholder="付款事由">
          <el-option label="车款" :value="0"></el-option>
          <el-option label="延期款" :value="1"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="订单状态" prop="status">
        <el-select v-model="searchForm.status" style="width: 100px"  @keypress.enter.native="search" clearable placeholder="状态">
      <el-form-item label="" prop="status">
        <el-select v-model="searchForm.status"  @change="search" clearable placeholder="订单状态">
        <el-option label="待支付" :value="0"></el-option>
        <el-option label="待接单" :value="1"></el-option>
        <el-option label="已接单" :value="2"></el-option>
        <el-option label="进行中" :value="3"></el-option>
        <el-option label="已完成" :value="4"></el-option>
        <el-option label="已取消" :value="99"></el-option>
        <el-option label="已支付" :value="1"></el-option>
        <el-option label="支付失败" :value="2"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="发布时间"   prop="createTimeStart"  label-width="100px" >
        <el-date-picker type="datetime"  style="width: 150px"  v-model="searchForm.createTimeStart" clearable value-format="yyyy-MM-dd HH:mm:ss"
                        placeholder="开始时间" /> -
      </el-form-item>
      <el-form-item label="" prop="createTimeEnd"   label-width="0px" >
        <el-date-picker type="datetime"  style="width: 150px"  v-model="searchForm.createTimeEnd" clearable value-format="yyyy-MM-dd HH:mm:ss"
                        placeholder="结束时间" />
      </el-form-item>
      <el-form-item label="接单时间" prop="acceptTimeStart"  label-width="100px" >
        <el-date-picker type="datetime"  style="width: 150px"  v-model="searchForm.acceptTimeStart" clearable value-format="yyyy-MM-dd HH:mm:ss"
                        placeholder="开始时间" /> -
      </el-form-item>
      <el-form-item label="" prop="acceptTimeEnd"  label-width="0px" >
        <el-date-picker type="datetime"  style="width: 150px"  v-model="searchForm.acceptTimeEnd" clearable value-format="yyyy-MM-dd HH:mm:ss"
                        placeholder="结束时间" />
      </el-form-item>
      <el-form-item label="完成时间"    prop="doneTimeStart"   label-width="100px" >
        <el-date-picker type="datetime"  style="width: 150px"  v-model="searchForm.doneTimeStart" clearable value-format="yyyy-MM-dd HH:mm:ss"
                        placeholder="开始时间" /> -
      </el-form-item>
      <el-form-item label="" prop="doneTimeEnd"  label-width="0px" >
        <el-date-picker type="datetime"  style="width: 150px"  v-model="searchForm.doneTimeEnd" clearable value-format="yyyy-MM-dd HH:mm:ss"
                        placeholder="结束时间" />
      </el-form-item>
        <el-form-item label=""   prop="starttime"  label-width="100px" >
          <el-date-picker type="datetime"    v-model="searchForm.starttime" clearable value-format="yyyy-MM-dd HH:mm:ss"
                          placeholder="开始(创建)时间" /> -
        </el-form-item>
        <el-form-item label="" prop="endtime"   label-width="0px" >
          <el-date-picker type="datetime"   v-model="searchForm.endtime" clearable value-format="yyyy-MM-dd HH:mm:ss"
                          placeholder="结束(创建)时间" />
        </el-form-item>
      <section>
        <el-button type="primary" @click="search">搜索</el-button>
        <el-button @click="reset">重置</el-button>
<!--
        <el-button type="primary" :loading="isWorking.export" @click="exportExcel">导出</el-button>
-->
      </section>
    </el-form>
    <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
@@ -71,54 +59,38 @@
        stripe
        @selection-change="handleSelectionChange"
      >
        <el-table-column prop="code" label="订单编号" width="180px" fixed="left">
        <el-table-column prop="id" label="订单编号" width="120px" fixed="left">
          <template slot-scope="{row}">
            <span style="cursor: pointer;color: #2E68EC" @click="openDetail(row)">{{row.code}}</span>
            <span style="cursor: pointer;color: #2E68EC" @click="openDetail(row)">{{row.id}}</span>
          </template>
        </el-table-column>
        <el-table-column prop="name" label="付款人姓名"  width="100px" :show-overflow-tooltip='true'></el-table-column>
        <el-table-column prop="phone" label="付款人手机号"  width="120px" :show-overflow-tooltip='true'></el-table-column>
        <el-table-column prop="money" label="支付金额(元)" min-width="150px">
          <template slot-scope="{row}">
            <span class="yellowstate">{{((row.money || 0)/100).toFixed(2)}}</span>
          </template>
        </el-table-column>
        <el-table-column prop="statusName" label="订单状态" min-width="100px"  >
          <template slot-scope="{row}">
          <span :class="'orderstate'+row.status">{{row.statusName}}</span>
          <span v-if="row.status == 0" class="blue">待支付</span>
          <span v-if="row.status == 1" class="green">已支付</span>
          <span v-if="row.status == 2" class="grey">支付失败</span>
          </template>
        </el-table-column>
        <el-table-column prop="type" label="订单类型" min-width="100px">
          <template slot-scope="{row}">
            <span v-if="row.type==0">用工单</span>
            <span v-if="row.type==1">货运单</span>
            <span v-if="row.type==2">订餐单</span>
            <span v-if="row.type==0">车款</span>
            <span v-if="row.type==1">延期款</span>
          </template>
        </el-table-column>
        <el-table-column prop="orderContent" label="订单内容"  width="200px" :show-overflow-tooltip='true'></el-table-column>
        <el-table-column prop="releaseName" label="发单方"  min-width="100px" :show-overflow-tooltip='true'>
          <template slot-scope="{row}">
           <span v-if="row.releaseName || row.releasePhone">{{(row.releaseName||'') +' - ' +(row.releasePhone||'')  }}</span>
          </template>
        </el-table-column>
        <el-table-column prop="acceptName" label="接单方" min-width="100px" :show-overflow-tooltip='true'>
          <template slot-scope="{row}">
            <span v-if="row.acceptName || row.acceptPhone">{{(row.acceptName||'') +' - ' +(row.acceptPhone ||'')  }}</span>
          </template>
        </el-table-column>
        <el-table-column prop="createTime" label="发布时间" min-width="150px"></el-table-column>
        <el-table-column prop="acceptTime" label="接单时间" min-width="150px"></el-table-column>
        <el-table-column prop="finishTime" label="完成时间" min-width="150px"></el-table-column>
        <el-table-column prop="estimatedAccount" label="预估金额(元)" min-width="150px">
          <template slot-scope="{row}">
            <span class="yellowstate">{{((row.estimatedAccount || 0)/100).toFixed(2)}}</span>
          </template>
        </el-table-column>
        <el-table-column prop="payAccount" label="实付金额(元)" min-width="150px">
          <template slot-scope="{row}">
            <span class="yellowstate">{{((row.payAccount || 0)/100).toFixed(2)}}</span>
          </template>
        </el-table-column>
        <el-table-column prop="acceptType" label="接单类型" min-width="100px">
          <template slot-scope="{row}">
            <span v-if="row.acceptType==0">手动接单</span>
            <span v-if="row.acceptType==1">系统派单</span>
          </template>
        </el-table-column>
        <el-table-column
        <el-table-column prop="remark" label="订单备注"  width="100px"  ></el-table-column>
        <el-table-column prop="userRealname" label="收款人姓名"  width="100px"  ></el-table-column>
        <el-table-column prop="username" label="负责人账号"  width="120px"  ></el-table-column>
        <el-table-column prop="createTime" label="创建时间" min-width="150px"></el-table-column>
        <el-table-column prop="payDate" label="付款时间" min-width="150px"></el-table-column>
        <el-table-column prop="cancelDate" label="取消时间" min-width="150px"></el-table-column>
<!--        <el-table-column
          label="操作"
          align="center"
          min-width="150"
@@ -128,7 +100,7 @@
            <el-button type="text" class="redstate" @click="cancelDo(row)" v-if="row.status!=5 && row.status!=4&& row.status!=99" icon="el-icon-delete" v-permissions="['business:orders:update']">取消</el-button>
            <el-button type="text" @click="openDetail( row)" icon="el-icon-info"  >详情</el-button>
          </template>
        </el-table-column>
        </el-table-column>-->
      </el-table>
      <pagination
        @size-change="handleSizeChange"
@@ -156,17 +128,16 @@
    return {
      // æœç´¢
      searchForm: {
        acceptName: null,
        releaseName: null,
        type: null,
        createTimeEnd: null,
        createTimeStart: null,
        acceptTimeStart: null,
        acceptTimeEnd: null,
        doneTimeStart: null,
        doneTimeEnd: null,
        id: null,
        status: null,
        code: null
        type: null,
        starttime: null,
        endTime: null,
        username: null,
        userRealName: null,
        name: null,
        phone: null,
        payCode: null
      }
    }
  },
@@ -179,25 +150,8 @@
    })
    this.search()
  },
  reset () {
    this.searchForm = {
      acceptName: null,
      releaseName: null,
      type: null,
      createTimeEnd: null,
      createTimeStart: null,
      acceptTimeStart: null,
      acceptTimeEnd: null,
      doneTimeStart: null,
      doneTimeEnd: null,
      status: null,
      code: null
    }
    this.search()
  },
  methods: {
    openDetail (row) {
      this.$refs.OperaOrderDetailWindow.open('订单详情', row )
    },
    cancelDo (row) {
      this.$dialog.actionConfirm('您确认【取消】该订单吗?', '操作确认')
admin/src/views/index.vue
@@ -3,7 +3,7 @@
    <div class="home_header">
      <div class="mb10 fs17">下午好,{{ userInfo.realname }}</div>
      <div class="fs13">
        ä»Šå¤©æ˜¯ {{ nowDate }} {{ nowWeek }},欢迎访问豆米电动车后台管理系统
        ä»Šå¤©æ˜¯ {{ nowDate }} {{ nowWeek }},欢迎访问智租蜂后台管理系统
      </div>
    </div>
  </div>
admin/src/views/login.vue
@@ -1,7 +1,7 @@
<template>
  <div class="wrap">
    <div class="introduce">
      <h2>豆米电动车后台管理系统</h2>
      <h2>智租蜂后台管理系统</h2>
      <h3></h3>
    </div>
    <div class="login">
admin/src/views/system/user.vue
@@ -32,12 +32,12 @@
        @sort-change="handleSortChange"
      >
        <el-table-column type="selection" width="55"></el-table-column>
        <el-table-column prop="avatar" label="头像" width="80px" class-name="table-column-avatar" fixed="left">
          <template slot-scope="{row}">
            <img :src="row.avatar == null ? '/avatar/man.png' : row.avatar">
        <el-table-column prop="avatar" label="收款码" width="100px" class-name="table-column-avatar"  >
          <template slot-scope="{ row }">
              <div class="qrcodediv" :id="`qrcode${row.id}`" :ref="`qrcode${row.id}`"></div>
          </template>
        </el-table-column>
        <el-table-column prop="realname" label="姓名" min-width="100px" fixed="left"></el-table-column>
        <el-table-column prop="realname" label="姓名" min-width="100px" ></el-table-column>
        <el-table-column prop="username" label="用户名" min-width="120px"></el-table-column>
        <el-table-column prop="empNo" label="工号" sortable="custom" sort-by="EMP_NO" min-width="80px"></el-table-column>
        <el-table-column prop="sex" label="性别" sortable="custom" sort-by="SEX" min-width="80px">
@@ -72,7 +72,8 @@
          <template v-if="isAdmin || (row.id !== userInfo.id && row.roles.findIndex(r => r.code === adminCode) === -1)" slot-scope="{row}">
            <el-button type="text" icon="el-icon-edit" @click="$refs.operaUserWindow.open('编辑用户', row)" v-permissions="['system:user:update']">编辑</el-button>
            <el-button type="text" icon="el-icon-s-custom" @click="$refs.roleConfigWindow.open(row)" v-permissions="['system:user:createUserRole']">配置角色</el-button>
            <el-button type="text" @click="$refs.resetPwdWindow.open(row)" v-permissions="['system:user:resetPwd']">重置密码</el-button>
            <el-button type="text" icon="el-icon-download"  @click="download(row)"  >下载收款码</el-button>
            <el-button type="text" @click="$refs.resetPwdWindow.open(row)"  icon="el-icon-edit" v-permissions="['system:user:resetPwd']">重置密码</el-button>
            <el-button v-if="!row.fixed" type="text" icon="el-icon-delete" @click="deleteById(row)" v-permissions="['system:user:delete']">删除</el-button>
          </template>
        </el-table-column>
@@ -100,6 +101,7 @@
import RoleConfigWindow from '@/components/system/user/RoleConfigWindow'
import ResetPwdWindow from '@/components/system/user/ResetPwdWindow'
import QRCode from 'qrcodejs2'
export default {
  name: 'SystemUser',
  extends: BaseTable,
@@ -125,16 +127,85 @@
      }]
    })
    this.search()
  },
  methods: {
    handlePageChange (pageIndex) {
      var that = this
      this.__checkApi()
      this.tableData.pagination.pageIndex = pageIndex || this.tableData.pagination.pageIndex
      this.isWorking.search = true
      this.api.fetchList({
        page: this.tableData.pagination.pageIndex,
        capacity: this.tableData.pagination.pageSize,
        model: this.searchForm,
        sorts: this.tableData.sorts
      })
        .then(data => {
          // that.removeElementsWithClass("qrcodediv")
          that.tableData.list = data.records
          that.tableData.pagination.total = data.total
          this.$nextTick(() => {
            that.tableData.list.forEach((row) => {
              document.getElementById('qrcode' + row.id).innerHTML = ''
              row.qrcodeImg = that.crateQrcodeShow('qrcode' + row.id, row.payUrl)
            })
          })
        })
        .catch(e => {
          this.$tip.apiFailed(e)
        })
        .finally(() => {
          this.isWorking.search = false
        })
    },
    download (row) {
      const nodeList = Array.prototype.slice.call(row.qrcodeImg._el.children)
      const img = nodeList.find((item) => item.nodeName.toUpperCase() === 'IMG')// é€‰å‡ºå›¾ç‰‡ç±»åž‹
      // æž„建画布
      const canvas = document.createElement('canvas')
      canvas.width = 220
      canvas.height = 220
      const ctx = canvas.getContext('2d')
      ctx.fillStyle = 'white'
      ctx.fillRect(0, 0, canvas.width, canvas.height) // å¡«å……整个画布区域,确保背景色覆盖整个画布
      ctx.drawImage(img, 10, 10, 200, 200)
      // æž„造url
      const url = canvas.toDataURL('image/png')
      const a = document.createElement('a')
      a.href = url
      a.download = `${row.realname}-收款码.png`
      a.click()
      a.remove()
    },
    removeElementsWithClass (className) {
      const elements = document.querySelectorAll(`.${className}`)
      elements.forEach(element => {
        element.parentNode.removeChild(element)
      })
    },
    crateQrcodeShow (div, qrcode1) {
      if (!div || !div.length || qrcode1 == null || qrcode1 == '') {
        return
      }
      return new QRCode(div, {
        width: 80,
        height: 80,
        text: qrcode1,
        correctLevel: QRCode.CorrectLevel.H,
        useSVG: true
      })
    }
  }
}
</script>
<style scoped lang="scss">
@import "@/assets/style/variables.scss";
// åˆ—表头像处理
/*// åˆ—表头像处理
.table-column-avatar {
  img {
    width: 48px;
  }
}
}*/
</style>
server/admin/src/main/java/com/doumee/job/AutoCancelOrdersJob.java
ÎļþÃû´Ó server/admin/src/main/java/com/doumee/job/InitializeCodeJob.java ÐÞ¸Ä
@@ -3,6 +3,7 @@
import com.doumee.core.job.BaseJob;
import com.doumee.core.job.JobContext;
import com.doumee.core.job.JobParam;
import com.doumee.service.business.OrdersService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -13,18 +14,18 @@
 * @since 2025/03/31 16:44
 */
@Slf4j
@Component("InitializeCodeJob")
public class InitializeCodeJob extends BaseJob {
@Component("AutoCancelOrdersJob")
public class AutoCancelOrdersJob extends BaseJob {
//    @Autowired
//    private OrdersService ordersService;
    @Autowired
    private OrdersService ordersService;
    @Override
    public JobContext execute(JobParam param) {
        JobContext jobContext = new JobContext();
        try {
//            ordersService.initializeCode();
            jobContext.setContext("初始化订单编号");
            ordersService.autoCancelNoPay();
            jobContext.setContext("自动取消未支付订单");
        } catch (Exception e) {
            e.printStackTrace();
        }
server/services/src/main/java/com/doumee/dao/business/model/Orders.java
@@ -88,6 +88,9 @@
    @ApiModelProperty("通联交易结果说明")
    @ExcelColumn(name="通联交易结果说明)", width=10)
    private String payInfo;
    @ApiModelProperty("通联交易平台编号")
    @ExcelColumn(name="通联交易平台编号)", width=10)
    private String payCode;
    @ApiModelProperty("通联交易流水")
    @ExcelColumn(name="通联交易流水",index=19 ,width=10)
    private String payOrderId;
@@ -97,8 +100,8 @@
    @ApiModelProperty("取消时间")
    @ExcelColumn(name="取消时间",index=21 ,width=10)
    private Date cancelDate;
    @ApiModelProperty("取消方式  0自动取消;1收到取消")
    @ExcelColumn(name="取消方式  0自动取消;1收到取消",index=22 ,width=10)
    @ApiModelProperty("取消方式  0自动取消;1手动取消")
    @ExcelColumn(name="取消方式  0自动取消;1手动取消",index=22 ,width=10)
    private String cancelWay;
    @ApiModelProperty("取消备注")
    @ExcelColumn(name="取消备注",index=23 ,width=10)
@@ -112,4 +115,16 @@
    @ApiModelProperty("支付状态:0=未支付;1=已支付;")
    @ExcelColumn(name="支付状态:0=未支付;1=已支付",index=26 ,width=10)
    private Integer payStatus;
    @ApiModelProperty("开始时间")
    @TableField(exist = false)
    private Date starttime;
    @ApiModelProperty("截止时间")
    @TableField(exist = false)
    private Date endtime;
    @ApiModelProperty("负责人登陆")
    @TableField(exist = false)
    private String username;
    @ApiModelProperty("负责人姓名")
    @TableField(exist = false)
    private String userRealname;
}
server/services/src/main/java/com/doumee/dao/system/vo/SystemUserListVO.java
@@ -24,5 +24,7 @@
    @ApiModelProperty(value = "更新人信息")
    private SystemUser updateUserInfo;
    @ApiModelProperty(value = "支付地址")
    private String payUrl;
}
server/services/src/main/java/com/doumee/service/business/OrdersService.java
@@ -106,4 +106,6 @@
    void dealOrdreResult(String request, HttpServletResponse response) throws IOException;
    void returnPage(PayOrderParam param, HttpServletResponse response) throws IOException;
    void autoCancelNoPay();
}
server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java
@@ -25,6 +25,7 @@
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
@@ -81,6 +82,7 @@
        orders.setPayStatus(Constants.ZERO);
        orders.setStatus(Constants.ZERO);
        orders.setPayMethod(Constants.ZERO);
        orders.setDeleted(Constants.ZERO);
        ordersMapper.insert(orders);
        return startPayDo(orders);
    }
@@ -98,7 +100,9 @@
            param.setReqsn(""+orders.getId());
            param.setReturl(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.PAY_RETURN_URL).getCode());
            param.setNotify_url( systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.PAY_NOTIFY_URL).getCode());
            param.setBody(orders.getRemark());
            param.setBody(StringUtils.defaultString(orders.getName(),"") +"-"
                    + StringUtils.defaultString(orders.getPhone(),"")+ "-"
                    +StringUtils.defaultString(orders.getRemark(),""));
            param.setValidtime(  systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.PAY_VALID_TIME).getCode());
            param.setSigntype(  systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.PAY_SIGN_TYPE).getCode());
@@ -188,54 +192,40 @@
    @Override
    public PageData<Orders> findPage(PageWrap<Orders> pageWrap) {
        IPage<Orders> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
        QueryWrapper<Orders> queryWrapper = new QueryWrapper<>();
        MPJLambdaWrapper<Orders> queryWrapper = new MPJLambdaWrapper<>();
        queryWrapper.selectAll(Orders.class)
                .selectAs(SystemUser::getRealname,Orders::getUserRealname)
                .selectAs(SystemUser::getUsername,Orders::getUsername)
                .leftJoin(SystemUser.class,SystemUser::getId,Orders::getUserId);
        Utils.MP.blankToNull(pageWrap.getModel());
        queryWrapper.lambda().eq(pageWrap.getModel().getId() != null,Orders::getId, pageWrap.getModel().getId());
        queryWrapper.lambda().eq(pageWrap.getModel().getDeleted() != null,Orders::getDeleted, pageWrap.getModel().getDeleted());
        queryWrapper.lambda().eq(pageWrap.getModel().getCreateUser() != null,Orders::getCreateUser, pageWrap.getModel().getCreateUser());
        if (pageWrap.getModel().getCreateTime() != null) {
            queryWrapper.lambda().ge(Orders::getCreateTime, Utils.Date.getStart(pageWrap.getModel().getCreateTime()));
            queryWrapper.lambda().le(Orders::getCreateTime, Utils.Date.getEnd(pageWrap.getModel().getCreateTime()));
        }
        queryWrapper.lambda().eq(pageWrap.getModel().getUpdateUser() != null,Orders::getUpdateUser, pageWrap.getModel().getUpdateUser());
        if (pageWrap.getModel().getUpdateTime() != null) {
            queryWrapper.lambda().ge(Orders::getUpdateTime, Utils.Date.getStart(pageWrap.getModel().getUpdateTime()));
            queryWrapper.lambda().le(Orders::getUpdateTime, Utils.Date.getEnd(pageWrap.getModel().getUpdateTime()));
        }
        queryWrapper.lambda().eq(pageWrap.getModel().getRemark() != null,Orders::getRemark, pageWrap.getModel().getRemark());
        queryWrapper.lambda().eq(pageWrap.getModel().getStatus() != null,Orders::getStatus, pageWrap.getModel().getStatus());
        queryWrapper.lambda().eq(pageWrap.getModel().getName() != null,Orders::getName, pageWrap.getModel().getName());
        queryWrapper.lambda().eq(pageWrap.getModel().getUserId() != null,Orders::getUserId, pageWrap.getModel().getUserId());
        queryWrapper.lambda().eq(pageWrap.getModel().getDetail() != null,Orders::getDetail, pageWrap.getModel().getDetail());
        queryWrapper.lambda().eq(pageWrap.getModel().getImgurl() != null,Orders::getImgurl, pageWrap.getModel().getImgurl());
        queryWrapper.lambda().eq(pageWrap.getModel().getSortnum() != null,Orders::getSortnum, pageWrap.getModel().getSortnum());
        queryWrapper.lambda().eq(pageWrap.getModel().getType() != null,Orders::getType, pageWrap.getModel().getType());
        queryWrapper.lambda().eq(pageWrap.getModel().getBrandId() != null,Orders::getBrandId, pageWrap.getModel().getBrandId());
        queryWrapper.lambda().eq(pageWrap.getModel().getPhone() != null,Orders::getPhone, pageWrap.getModel().getPhone());
        queryWrapper.lambda().eq(pageWrap.getModel().getMoney() != null,Orders::getMoney, pageWrap.getModel().getMoney());
        queryWrapper.lambda().eq(pageWrap.getModel().getPayMethod() != null,Orders::getPayMethod, pageWrap.getModel().getPayMethod());
        queryWrapper.lambda().eq(pageWrap.getModel().getPayOrderId() != null,Orders::getPayOrderId, pageWrap.getModel().getPayOrderId());
        if (pageWrap.getModel().getUpdateTime() != null) {
            queryWrapper.lambda().ge(Orders::getPayDate, Utils.Date.getStart(pageWrap.getModel().getPayDate()));
            queryWrapper.lambda().le(Orders::getPayDate, Utils.Date.getEnd(pageWrap.getModel().getPayDate()));
        }
        if (pageWrap.getModel().getUpdateTime() != null) {
            queryWrapper.lambda().ge(Orders::getCancelDate, Utils.Date.getStart(pageWrap.getModel().getCancelDate()));
            queryWrapper.lambda().le(Orders::getCancelDate, Utils.Date.getEnd(pageWrap.getModel().getCancelDate()));
        }
        queryWrapper.lambda().eq(pageWrap.getModel().getCancelWay() != null,Orders::getCancelWay, pageWrap.getModel().getCancelWay());
        queryWrapper.lambda().eq(pageWrap.getModel().getCancelInfo() != null,Orders::getCancelInfo, pageWrap.getModel().getCancelInfo());
        queryWrapper.lambda().eq(pageWrap.getModel().getCancelUserId() != null,Orders::getCancelUserId, pageWrap.getModel().getCancelUserId());
        queryWrapper.lambda().eq(pageWrap.getModel().getCancelStatus() != null,Orders::getCancelStatus, pageWrap.getModel().getCancelStatus());
        queryWrapper.lambda().eq(pageWrap.getModel().getPayStatus() != null,Orders::getPayStatus, pageWrap.getModel().getPayStatus());
        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
                queryWrapper.orderByDesc(sortData.getProperty());
            } else {
                queryWrapper.orderByAsc(sortData.getProperty());
            }
        }
        return PageData.from(ordersMapper.selectPage(page, queryWrapper));
        pageWrap.getModel().setDeleted(Constants.ZERO);
        queryWrapper.eq(pageWrap.getModel().getId() != null,Orders::getId, pageWrap.getModel().getId());
        queryWrapper.eq(pageWrap.getModel().getDeleted() != null,Orders::getDeleted, pageWrap.getModel().getDeleted());
        queryWrapper.eq(pageWrap.getModel().getCreateUser() != null,Orders::getCreateUser, pageWrap.getModel().getCreateUser());
        queryWrapper.like(pageWrap.getModel().getRemark() != null,Orders::getRemark, pageWrap.getModel().getRemark());
        queryWrapper.eq(pageWrap.getModel().getStatus() != null,Orders::getStatus, pageWrap.getModel().getStatus());
        queryWrapper.like(pageWrap.getModel().getUsername() != null,SystemUser::getUsername, pageWrap.getModel().getUsername());
        queryWrapper.like(pageWrap.getModel().getUserRealname() != null,SystemUser::getRealname, pageWrap.getModel().getUserRealname());
        queryWrapper.like(pageWrap.getModel().getName() != null,Orders::getName, pageWrap.getModel().getName());
        queryWrapper.eq(pageWrap.getModel().getUserId() != null,Orders::getUserId, pageWrap.getModel().getUserId());
        queryWrapper.eq(pageWrap.getModel().getDetail() != null,Orders::getDetail, pageWrap.getModel().getDetail());
        queryWrapper.eq(pageWrap.getModel().getImgurl() != null,Orders::getImgurl, pageWrap.getModel().getImgurl());
        queryWrapper.eq(pageWrap.getModel().getSortnum() != null,Orders::getSortnum, pageWrap.getModel().getSortnum());
        queryWrapper.eq(pageWrap.getModel().getType() != null,Orders::getType, pageWrap.getModel().getType());
        queryWrapper.eq(pageWrap.getModel().getBrandId() != null,Orders::getBrandId, pageWrap.getModel().getBrandId());
        queryWrapper.eq(pageWrap.getModel().getPhone() != null,Orders::getPhone, pageWrap.getModel().getPhone());
        queryWrapper.eq(pageWrap.getModel().getMoney() != null,Orders::getMoney, pageWrap.getModel().getMoney());
        queryWrapper.eq(pageWrap.getModel().getPayMethod() != null,Orders::getPayMethod, pageWrap.getModel().getPayMethod());
        queryWrapper.eq(pageWrap.getModel().getPayOrderId() != null,Orders::getPayOrderId, pageWrap.getModel().getPayOrderId());
        queryWrapper.ge(pageWrap.getModel().getStarttime()!=null,Orders::getCreateTime , pageWrap.getModel().getStarttime());
        queryWrapper.ne(pageWrap.getModel().getEndtime()!=null,Orders::getCreateTime , pageWrap.getModel().getEndtime());
        queryWrapper.eq(pageWrap.getModel().getCancelWay() != null,Orders::getCancelWay, pageWrap.getModel().getCancelWay());
        queryWrapper.eq(pageWrap.getModel().getCancelInfo() != null,Orders::getCancelInfo, pageWrap.getModel().getCancelInfo());
        queryWrapper.eq(pageWrap.getModel().getCancelUserId() != null,Orders::getCancelUserId, pageWrap.getModel().getCancelUserId());
        queryWrapper.eq(pageWrap.getModel().getCancelStatus() != null,Orders::getCancelStatus, pageWrap.getModel().getCancelStatus());
        queryWrapper.eq(pageWrap.getModel().getPayStatus() != null,Orders::getPayStatus, pageWrap.getModel().getPayStatus());
        queryWrapper.orderByDesc(Orders::getId);
        return PageData.from(ordersMapper.selectJoinPage(page,Orders.class, queryWrapper));
    }
    @Override
    public long count(Orders orders) {
@@ -243,9 +233,27 @@
        return ordersMapper.selectCount(wrapper);
    }
    @Override
    public  void autoCancelNoPay() {
        int time = 30;
        try {
            time = Integer.parseInt(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.PAY_VALID_TIME).getCode());
        }catch (Exception e){
        }
        Date date = new Date();
        ordersMapper.update(null,new UpdateWrapper<Orders>().lambda()
                .set(Orders::getStatus,Constants.TWO)
                .set(Orders::getCancelInfo,"超时未支付,自动取消")
                .set(Orders::getCancelWay,Constants.ZERO)
                .set(Orders::getCancelDate,date)
                .set(Orders::getUpdateTime,date)
                .eq(Orders::getStatus,Constants.ZERO)
                .apply("TIMESTAMPDIFF(MINUTE, create_time ,now()) > "+time));
    }
    @Override
    public void returnPage(PayOrderParam param, HttpServletResponse response) throws IOException {
        String url =systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.PAY_RETURN_WEB_URL).getCode();
        response.sendRedirect(url+"?reqsn="+param.getReqsn());
//        String url =systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.PAY_RETURN_WEB_URL).getCode();
//        response.sendRedirect(url+"?reqsn="+param.getReqsn());
    }
    @Override
    public void  dealOrdreResult(String paramStr, HttpServletResponse response) throws IOException {
@@ -299,6 +307,7 @@
                model.setPayThirdOrderId(map.getChnltrxid());//支付宝微信订单号
                model.setPayThirdOrderData(map.getChnldata());//三方交易渠道数据
                model.setPayInfo(info);
                model.setPayCode(map.getTrxcode());
                ordersMapper.updateById(model);
            }else{
                log.error("支付验签失败======");
server/services/src/main/java/com/doumee/service/system/impl/SystemUserServiceImpl.java
@@ -1,5 +1,7 @@
package com.doumee.service.system.impl;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.core.constants.Constants;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.doumee.core.model.PageData;
@@ -32,6 +34,8 @@
    @Autowired
    private SystemRoleService systemRoleService;
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    @Override
    public Integer create(SystemUser systemUser) {
@@ -90,11 +94,13 @@
    @Override
    public PageData<SystemUserListVO> findPage(PageWrap<QuerySystemUserDTO> pageWrap) {
        // æ‰§è¡ŒæŸ¥è¯¢
        String url = systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.PAY_RETURN_WEB_URL).getCode();
        PageHelper.startPage(pageWrap.getPage(), pageWrap.getCapacity());
        List<SystemUserListVO> userList = systemUserMapper.selectManageList(pageWrap.getModel(), pageWrap.getOrderByClause());
        for (SystemUserListVO user : userList) {
            // æŸ¥è¯¢ç”¨æˆ·è§’色列表
            user.setRoles(systemRoleService.findByUserId(user.getId()));
            user.setPayUrl(url+"?userId="+user.getId());
        }
        return PageData.from(new PageInfo<>(userList));
    }
web/manifest.json
@@ -1,5 +1,5 @@
{
    "name" : "电动车收款",
    "name" : "智租蜂",
    "appid" : "__UNI__7C0C90D",
    "description" : "",
    "versionName" : "1.0.0",
web/pages/index/index.vue
@@ -53,10 +53,12 @@
                    money: '',
                    remark: '',
                    userId:''
                }
                },
                loading:false
            }
        },
        mounted() {
            this.loading=false
            this.form.userId = this.fetchParams("userId",window.location.href)
        },
        methods: {
@@ -75,17 +77,23 @@
                return decodeURIComponent(results[2].replace(/\+/g, ' '));
            },
            async sendSave() {
                if(this.loading){
                    return
                }
                this.loading=true
                var that = this
                if(!this.form.name){
                    uni.showToast({
                        'title': '请输入姓名',icon:'none'
                    })
                    this.loading=false
                    return
                }
                if(!this.form.phone){
                    uni.showToast({
                        'title': '请输入手机号',icon:'none'
                    })
                    this.loading=false
                    return
                }
                if(!this.form.money || this.form.money < 0.01){
@@ -95,21 +103,15 @@
                    return
                }
                let res = await this.$u.api.orderCreate(this.form)
                if (res.code === 200) {
                if (res && res.code === 200) {
                     const url = res.data.url
                     // axios.post('https://third-party-website.com/api/submit', this.formData, {
                     //   headers: { 'Content-Type': 'application/json' } // æ ¹æ®éœ€è¦æ·»åŠ å…¶ä»–å¤´éƒ¨ä¿¡æ¯ï¼Œå¦‚è®¤è¯ä»¤ç‰Œç­‰ã€‚
                     // })
                     // axios.post(res.data.url, res.data.params);
                    // const resolve = this.$router.push(url,params);
                    // window.open(resolve.href, "_blank")
                     console.log(res)
                     const elements = document.querySelectorAll('form');
                     if(elements&& elements.length){
                         elements.forEach(element => {
                             element.remove();
                         })
                     }
                     uni.showToast({title:'发起支付中'})
                     var demo_form = document.createElement("form");
                       demo_form.action = url;
                       demo_form.id = "tempFromId";
@@ -128,13 +130,11 @@
                           }
                       }
                       document.body.appendChild(demo_form)
                       uni.showToast({
                           'title': '特挑剔',icon:'none'
                       })
                       demo_form.submit() 
                       
                    // this.toSuccess()
                }
                this.loading=false
            },
        }
    }
web/unpackage/dist/build/web/index.html
@@ -1,2 +1,2 @@
<!DOCTYPE html><html lang=zh-CN><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><title>电动车收款</title><script>var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') || CSS.supports('top: constant(a)'))
            document.write('<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' + (coverSupport ? ', viewport-fit=cover' : '') + '" />')</script><link rel=stylesheet href=/web/static/index.883130ca.css></head><body><noscript><strong>Please enable JavaScript to continue.</strong></noscript><div id=app></div><script src=/web/static/js/chunk-vendors.b176ace3.js></script><script src=/web/static/js/index.c8598184.js></script></body></html>
<!DOCTYPE html><html lang=zh-CN><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><title>智租蜂</title><script>var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') || CSS.supports('top: constant(a)'))
            document.write('<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' + (coverSupport ? ', viewport-fit=cover' : '') + '" />')</script><link rel=stylesheet href=/web/static/index.883130ca.css></head><body><noscript><strong>Please enable JavaScript to continue.</strong></noscript><div id=app></div><script src=/web/static/js/chunk-vendors.b176ace3.js></script><script src=/web/static/js/index.a2491d9d.js></script></body></html>
web/unpackage/dist/build/web/static/js/pages-index-index.a9baa0a0.js
ÎļþÒÑɾ³ý