wanshenmean
2026-03-24 d01295c254063b3349a86a4474e04a62b284bd19
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
<template>
  <div class="pda-container">
    <el-card class="pda-card" shadow="hover">
      <template #header>
        <div class="card-header">PDA 应用管理</div>
      </template>
 
      <el-form label-width="120px">
        <el-form-item label="当前版本号">
          <el-input v-model="clientVersion" placeholder="请输入当前PDA版本号" style="max-width: 280px" />
          <el-button type="primary" style="margin-left: 10px" @click="checkVersion">检查更新</el-button>
        </el-form-item>
 
        <el-form-item label="服务端版本结果">
          <span>{{ checkResult }}</span>
        </el-form-item>
 
        <el-form-item label="下载安装包">
          <el-button type="success" @click="downloadApp">下载最新 APK</el-button>
        </el-form-item>
 
        <el-form-item label="上传安装包">
          <el-upload
            :action="uploadUrl"
            :headers="uploadHeaders"
            name="fileInput"
            :show-file-list="true"
            :before-upload="beforeUpload"
            :on-success="onUploadSuccess"
            :on-error="onUploadError"
          >
            <el-button type="warning">上传新 APK</el-button>
          </el-upload>
        </el-form-item>
      </el-form>
    </el-card>
  </div>
</template>
 
<script>
import { defineComponent, ref, computed, getCurrentInstance } from "vue";
import store from "@/store/index";
import http from "@/api/http";
 
export default defineComponent({
  setup() {
    const clientVersion = ref("");
    const checkResult = ref("未检查");
    const { proxy } = getCurrentInstance();
 
    // 上传地址:复用全局 http 基础地址,保证与当前环境一致。
    const uploadUrl = computed(() => `${http.ipAddress}api/PDA/UploadApp`);
 
    // 上传鉴权:沿用现有 token 机制,避免接口 401。
    const uploadHeaders = computed(() => ({
      Authorization: store.getters.getToken(),
    }));
 
    const checkVersion = () => {
      if (!clientVersion.value) {
        proxy.$message.warning("请输入版本号");
        return;
      }
 
      http
        .get(`api/PDA/GetPDAVersion?version=${encodeURIComponent(clientVersion.value)}`, {}, true)
        .then((res) => {
          if (!res.status) {
            checkResult.value = res.message || "检查失败";
            return;
          }
          checkResult.value = res.data ? "需要更新" : "已是最新版本";
        });
    };
 
    const downloadApp = () => {
      window.open(`${http.ipAddress}api/PDA/DownLoadApp`, "_blank");
    };
 
    // 上传前校验:限制上传 apk,减少无效请求。
    const beforeUpload = (file) => {
      if (!file || !file.name || !file.name.toLowerCase().endsWith(".apk")) {
        proxy.$message.error("只允许上传 .apk 文件");
        return false;
      }
      return true;
    };
 
    const onUploadSuccess = (response) => {
      proxy.$message[response && response.status ? "success" : "error"](
        (response && response.message) || "上传完成"
      );
    };
 
    const onUploadError = () => {
      proxy.$message.error("上传失败");
    };
 
    return {
      clientVersion,
      checkResult,
      uploadUrl,
      uploadHeaders,
      checkVersion,
      downloadApp,
      beforeUpload,
      onUploadSuccess,
      onUploadError,
    };
  },
});
</script>
 
<style lang="less" scoped>
.pda-container {
  height: 100%;
  padding: 12px;
}
 
.pda-card {
  max-width: 920px;
}
 
.card-header {
  font-size: 16px;
  font-weight: 600;
}
</style>