uploadView.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546
  1. <template>
  2. <div>
  3. <div class="gva-search-box">
  4. <el-form ref="searchForm" :inline="true" :model="searchInfo">
  5. <el-form-item label="任务Id">
  6. <el-input v-model="searchInfo.task_id_string" placeholder="任务Id" />
  7. </el-form-item>
  8. <el-form-item label="负责人">
  9. <el-select v-model="searchInfo.user" placeholder="负责人">
  10. <el-option v-for="item in ResponsiblePerson" :key="item.id" :label="item.name" :value="item.name" />
  11. </el-select>
  12. </el-form-item>
  13. <el-form-item>
  14. <el-button size="small" type="primary" icon="search" @click="onSubmit">查询</el-button>
  15. <el-button size="small" icon="refresh" @click="onReset">重置</el-button>
  16. </el-form-item>
  17. </el-form>
  18. </div>
  19. <div class="gva-table-box">
  20. <!-- <div class="gva-btn-list">
  21. <el-button size="small" type="primary" icon="plus" @click="openDialog('addCard')">新增</el-button>
  22. </div> -->
  23. <el-table :data="tableData" border @sort-change="sortChange" @selection-change="handleSelectionChange">
  24. <el-table-column type="selection" width="55" />
  25. <el-table-column align="left" label="任务ID" min-width="60" prop="task_id" sortable="custom" />
  26. <el-table-column align="left" label="任务名称" min-width="60" prop="task_name" sortable="custom" />
  27. <el-table-column align="left" label="负责人" min-width="60" prop="user" sortable="custom" />
  28. <el-table-column align="left" label="游戏名称" min-width="80" prop="game_name" sortable="custom" />
  29. <el-table-column align="left" fixed="right" label="操作" width="140">
  30. <template #default="scope">
  31. <el-button icon="edit" size="small" type="primary" link @click="uploadFunc(scope.row)">上传</el-button>
  32. </template>
  33. </el-table-column>
  34. </el-table>
  35. <div class="gva-pagination">
  36. <el-pagination :current-page="page" :page-size="pageSize" :page-sizes="[10, 30, 50, 100]" :total="total"
  37. layout="total, sizes, prev, pager, next, jumper" @current-change="handleCurrentChange"
  38. @size-change="handleSizeChange" />
  39. </div>
  40. </div>
  41. <el-dialog v-model="dialogFormVisible" :before-close="closeDialog" :title="dialogTitle">
  42. <el-form :model="form" :rules="rules" ref="uploadForm" label-width="100px" class="demo-ruleForm">
  43. <el-form-item label="任务id" prop="task_id">
  44. <el-input type="textarea" v-model="form.task_id" style="width:500px;"></el-input>
  45. </el-form-item>
  46. <el-form-item label="负责人">
  47. <el-select v-model="form.responsible_person" placeholder="负责人">
  48. <el-option v-for="item in ResponsiblePerson" :key="item.id" :label="item.name" :value="item.name" />
  49. </el-select>
  50. </el-form-item>
  51. <el-form-item label="上传文件" prop="file">
  52. <el-upload ref="upload" class="upload-demo" action="#" :before-remove="beforeRemove" :limit="1"
  53. :on-exceed="handleExceed" :on-remove="handleRemove" :on-change="handleChange" :file-list="fileList.data"
  54. :http-request="httpRequest" :data="form" :auto-upload="false" name="annexFile" style="width: 500px;">
  55. <el-button size="small" type="primary">点击上传</el-button>
  56. <div slot="tip" class="el-upload__tip">{{ message }}</div>
  57. </el-upload>
  58. </el-form-item>
  59. <el-form-item>
  60. <el-button type="primary" @click="submitUpload" v-loading.fullscreen.lock="fullscreenLoading">立即创建</el-button>
  61. <el-button @click="resetForm()">重置</el-button>
  62. </el-form-item>
  63. </el-form>
  64. </el-dialog>
  65. </div>
  66. </template>
  67. <script lang="ts">
  68. export default {
  69. name: 'AddFileUpdate',
  70. }
  71. </script>
  72. <script lang="ts" setup>
  73. import {
  74. addFileUpdate,
  75. getGameTaskList,
  76. } from '@/api/upload'
  77. import {
  78. selectResponsiblePerson,
  79. } from '@/api/responsiblePerson'
  80. import { useUserStore } from '@/pinia/modules/user'
  81. import { toSQLLine } from '@/utils/stringFun'
  82. import warningBar from '@/components/warningBar/warningBar.vue'
  83. import { ref } from 'vue'
  84. import { ElMessage, ElMessageBox } from 'element-plus'
  85. import { async } from 'q'
  86. import { reactive } from 'vue'
  87. import { genFileId } from 'element-plus'
  88. // import { ElMessage, ElMessageBox } from 'element-plus'
  89. import { UploadInstance, UploadProps, UploadRawFile } from 'element-plus'
  90. const ResponsiblePerson = ref([{
  91. id: 0,
  92. name: "",
  93. }
  94. ])
  95. const getResponsiblePerson = async () => {
  96. const table = await selectResponsiblePerson()
  97. if (table.code === 0) {
  98. ResponsiblePerson.value = table.data
  99. }
  100. }
  101. getResponsiblePerson()
  102. const GamePortOptions = ref([
  103. ])
  104. const accountTypeOptions = ref([
  105. ])
  106. const loginMethodOptions = ref([
  107. ])
  108. const type = ref('')
  109. const page = ref(1)
  110. const total = ref(0)
  111. const pageSize = ref(10)
  112. const tableData = ref([])
  113. const searchInfo = ref({
  114. task_id_string: "",
  115. orderKey: "",
  116. desc: false,
  117. task_id: 0,
  118. user: "",
  119. })
  120. const onReset = () => {
  121. searchInfo.value = {
  122. task_id_string: "",
  123. orderKey: "",
  124. desc: false,
  125. task_id: 0,
  126. user: "",
  127. }
  128. }
  129. // 搜索
  130. const onSubmit = () => {
  131. page.value = 1
  132. pageSize.value = 10
  133. searchInfo.value.task_id = Number(searchInfo.value.task_id_string)
  134. getTableData()
  135. }
  136. // 分页
  137. const handleSizeChange = (val) => {
  138. pageSize.value = val
  139. getTableData()
  140. }
  141. const handleCurrentChange = (val) => {
  142. page.value = val
  143. getTableData()
  144. }
  145. // 排序
  146. const sortChange = ({ prop, order }) => {
  147. if (prop) {
  148. if (prop === 'id') {
  149. prop = 'id'
  150. }
  151. searchInfo.value.orderKey = toSQLLine(prop)
  152. searchInfo.value.desc = order === 'descending'
  153. }
  154. getTableData()
  155. }
  156. // 查询
  157. const getTableData = async () => {
  158. const table = await getGameTaskList({ page: page.value, pageSize: pageSize.value, ...searchInfo.value })
  159. if (table.code === 0) {
  160. tableData.value = table.data.list
  161. total.value = table.data.total
  162. GamePortOptions.value = table.data.option.game_port
  163. loginMethodOptions.value = table.data.option.login_type
  164. accountTypeOptions.value = table.data.option.account_type
  165. links.value = table.data.option.game_list
  166. page.value = table.data.page
  167. pageSize.value = table.data.pageSize
  168. }
  169. }
  170. getTableData()
  171. const apis: any = 0
  172. // 批量操作
  173. const handleSelectionChange = (val) => {
  174. apis.value = val
  175. }
  176. // 弹窗相关
  177. const initForm = () => {
  178. uploadForm.value.resetFields()
  179. upload.value!.clearFiles()
  180. form.value = {
  181. task_id: '',//游戏id
  182. responsible_person: '',
  183. }
  184. }
  185. const uploadFunc = async (row) => {
  186. // const res = await getGameTaskById({ id: row.task_id })
  187. form.value.task_id = row.task_id
  188. form.value.responsible_person = row.user
  189. openDialog('upload')
  190. }
  191. const dialogTitle = ref('新增')
  192. const dialogFormVisible = ref(false)
  193. const openDialog = (key) => {
  194. switch (key) {
  195. case 'upload':
  196. dialogTitle.value = '上传'
  197. // form.value.is_add = 1
  198. break
  199. // case 'edit':
  200. // dialogTitle.value = '编辑'
  201. // form.value.is_add = 0
  202. // break
  203. default:
  204. break
  205. }
  206. type.value = key
  207. dialogFormVisible.value = true
  208. }
  209. const closeDialog = () => {
  210. initForm()
  211. dialogFormVisible.value = false
  212. }
  213. const links = ref([])
  214. const createFilter = (queryString) => {
  215. return (restaurant) => {
  216. return (
  217. restaurant.value.toLowerCase().indexOf(queryString.toLowerCase()) === 0
  218. )
  219. }
  220. }
  221. let fullscreenLoading = false
  222. // const uploadForm = ref([])
  223. const upload = ref<UploadInstance>()
  224. const uploadForm: any = ref(null)
  225. const imageUrl = ref('')
  226. const fileList = reactive({
  227. data: []
  228. });
  229. //上传
  230. const headers = ref({
  231. // token: getStore('zxdAdmintoken'),
  232. "content-type": "multipart/form-data"
  233. })
  234. const message = ref('请上传dll/exe文件')
  235. //校验规则
  236. const rules = ref({
  237. task_id: [{
  238. required: true,
  239. message: '请输入游戏id',
  240. trigger: 'blur'
  241. }],
  242. })
  243. const form = ref({
  244. task_id: '',//游戏id
  245. responsible_person: '',
  246. })
  247. const handleExceed: UploadProps['onExceed'] = (files) => {
  248. console.log("数组超标")
  249. upload.value!.clearFiles()
  250. const file = files[0] as UploadRawFile
  251. file.uid = genFileId()
  252. upload.value!.handleStart(file)
  253. }
  254. const handleChange: UploadProps['onChange'] = (file, fileList) => {
  255. let extension = file.name.substring(file.name.lastIndexOf('.') + 1);
  256. console.log(extension)
  257. if (extension !== 'dll' && extension !== 'exe') {
  258. // this.$message.warning('只能上传后缀是.zip/.rar/.apk的文件'); //控制文件类型
  259. ElMessage.error('文件类型不对'); //控制文件类型
  260. upload.value!.clearFiles()
  261. return false
  262. }
  263. else if (Number(file.size) / 1024 / 1024 > 20) {
  264. ElMessage.error('Avatar file size can not exceed 20MB!')
  265. upload.value!.clearFiles()
  266. return false
  267. }
  268. return true
  269. }
  270. const beforeRemove: UploadProps['beforeRemove'] = (uploadFile, uploadFiles) => {
  271. return ElMessageBox.confirm(
  272. `Cancel the transfert of ${uploadFile.name} ?`
  273. ).then(
  274. () => true,
  275. () => false
  276. )
  277. }
  278. let fd = new FormData()
  279. const httpRequest = (param: any) => {
  280. // let fd = new FormData();
  281. const fileObj = param.file // 相当于input里取得的files
  282. fd.append('file', fileObj) // 文件对象
  283. console.log("文件包" + fd.get('file'));
  284. const url = '';
  285. }
  286. const handleRemove: UploadProps['onRemove'] = (file, fileList) => {
  287. console.log(fileList)
  288. }
  289. const submitUpload = async () => {
  290. uploadForm.value.validate(async valid => {
  291. if (valid) {
  292. if (fileList.data.length <= 0) {
  293. ElMessage.error("至少上传一款脚本!");
  294. return;
  295. }
  296. upload.value!.submit()
  297. fd.append('task_id', form.value.task_id)
  298. fd.append('responsible_person', form.value.responsible_person)
  299. // this.fd.append('log', this.ruleForm.log)
  300. fullscreenLoading = true;
  301. //调用后端接口,提交即可
  302. const res = await addFileUpdate(fd)
  303. console.log(res)
  304. if (res.code == 0) {
  305. fullscreenLoading = false;
  306. ElMessage({
  307. message: '上传成功',
  308. type: 'success'
  309. });
  310. fd = new FormData()
  311. fileList.data = []
  312. resetForm()
  313. getTableData()
  314. closeDialog()
  315. } else {
  316. ElMessage.error("上传失败");
  317. getTableData()
  318. closeDialog()
  319. }
  320. } else {
  321. // console.log('error submit!!');
  322. return false;
  323. }
  324. });
  325. }
  326. //重置
  327. const resetForm = async () => {
  328. uploadForm.value.resetFields()
  329. // console.log(uploadForm.file)
  330. upload.value!.clearFiles()
  331. form.value = {
  332. task_id: '',//游戏id
  333. responsible_person: '',
  334. }
  335. }
  336. </script>
  337. <!-- <script lang="ts" setup>
  338. import { ref, reactive } from 'vue'
  339. import { genFileId } from 'element-plus'
  340. import { ElMessage, ElMessageBox } from 'element-plus'
  341. import type { UploadInstance, UploadProps, UploadRawFile } from 'element-plus'
  342. const fullscreenLoading = ref(false)
  343. const uploadForm = ref(null)
  344. const upload = ref<UploadInstance>()
  345. const imageUrl = ref('')
  346. const fileList = reactive({
  347. data: []
  348. });
  349. //上传
  350. const headers = ref({
  351. // token: getStore('zxdAdmintoken'),
  352. "content-type": "multipart/form-data"
  353. })
  354. const message = ref('请上传dll文件')
  355. //校验规则
  356. const rules = ref({
  357. game_id: [{
  358. required: true,
  359. message: '请输入游戏id',
  360. trigger: 'blur'
  361. }],
  362. })
  363. const uploadForm = ref(null)
  364. const form = ref({
  365. game_id: '' //游戏id
  366. })
  367. const handleExceed: UploadProps['onExceed'] = (files) => {
  368. upload.value!.clearFiles()
  369. const file = files[0] as UploadRawFile
  370. file.uid = genFileId()
  371. upload.value!.handleStart(file)
  372. }
  373. const handleChange: UploadProps['onChange'] = (file, fileList) => {
  374. let extension = file.name.substring(file.name.lastIndexOf('.') + 1);
  375. console.log(extension)
  376. if (extension !== 'dll') {
  377. // this.$message.warning('只能上传后缀是.zip/.rar/.apk的文件'); //控制文件类型
  378. ElMessage.error('文件类型不对'); //控制文件类型
  379. upload.value!.clearFiles()
  380. return false
  381. }
  382. else if (Number(file.size) / 1024 / 1024 > 2) {
  383. ElMessage.error('Avatar picture size can not exceed 2MB!')
  384. upload.value!.clearFiles()
  385. return false
  386. }
  387. return true
  388. }
  389. const beforeRemove: UploadProps['beforeRemove'] = (uploadFile, uploadFiles) => {
  390. return ElMessageBox.confirm(
  391. `Cancel the transfert of ${uploadFile.name} ?`
  392. ).then(
  393. () => true,
  394. () => false
  395. )
  396. }
  397. const httpRequest = (param) => {
  398. let fd = new FormData();
  399. const fileObj = param.file // 相当于input里取得的files
  400. fd.append('file', fileObj) // 文件对象
  401. console.log("文件包" + fd.get('file'));
  402. const url = '';
  403. }
  404. const handleRemove: UploadProps['onRemove'] = (file, fileList) => {
  405. console.log(file, fileList)
  406. }
  407. const submitUpload = () => {
  408. uploadForm.value.validate(async valid => {
  409. if (valid) {
  410. if (fileList.length <= 0) {
  411. $message.error("至少上传一款脚本!");
  412. return;
  413. }
  414. upload.submit();
  415. //换行自动添加为<br/>
  416. // this.ruleForm.log= this.ruleForm.log.replace(/\n/g,"<br/>");
  417. // console.log(this.ruleForm.log)
  418. //将表单内其他内容添加进fd
  419. fd.append('game_id', form.game_id)
  420. // this.fd.append('log', this.ruleForm.log)
  421. fd.append('type', "0")
  422. fullscreenLoading = true;
  423. //调用后端接口,提交即可
  424. const res = await addFileUpdate(fd)
  425. console.log(res)
  426. if (res.code == 0) {
  427. fullscreenLoading = false;
  428. $message({
  429. message: '上传成功',
  430. type: 'success'
  431. });
  432. fd = {}
  433. fileList = []
  434. resetForm(formName)
  435. } else {
  436. $message.error("上传失败");
  437. }
  438. } else {
  439. // console.log('error submit!!');
  440. return false;
  441. }
  442. });
  443. upload.value!.submit()
  444. }
  445. //重置
  446. const resetForm = async (form) => {
  447. uploadForm.value.resetFields()
  448. console.log(uploadForm.file)
  449. upload.value.clearFiles()
  450. // form.value = {
  451. // game_id: '' //游戏id
  452. // }
  453. }
  454. </script> -->
  455. <style scoped lang="scss">
  456. .button-box {
  457. padding: 10px 20px;
  458. .el-button {
  459. float: right;
  460. }
  461. }
  462. :deep(.el-tabs__nav-scroll) {
  463. width: 35%;
  464. margin: 0 auto
  465. }
  466. :deep(.el-tabs__nav-scroll) .warning {
  467. color: #dc143c;
  468. }
  469. </style>