Commit 12538fbd authored by nanahira's avatar nanahira

use deckform for deckprint

parent 7d23fb2b
Pipeline #41218 passed with stages
in 1 minute and 31 seconds
...@@ -20,18 +20,23 @@ ...@@ -20,18 +20,23 @@
<el-input v-model="form.event" placeholder="请输入Event" auto-complete="off" width="10px"></el-input> <el-input v-model="form.event" placeholder="请输入Event" auto-complete="off" width="10px"></el-input>
</el-form-item> </el-form-item>
<!-- 改成 lastInitial -->
<el-form-item label="参赛ID" :label-width="formLabelWidth"> <el-form-item label="参赛ID" :label-width="formLabelWidth">
<el-input v-model="form.gameid" placeholder="请输入gameid" auto-complete="off" width="10px"></el-input> <el-input v-model="form.lastInitial" placeholder="请输入 lastInitial" auto-complete="off" width="10px"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="日期" :label-width="formLabelWidth"> <el-form-item label="日期" :label-width="formLabelWidth">
<el-date-picker v-model="form.date" type="date" placeholder="选择日期" format="yyyy 年 MM 月 dd 日" value-format="yyyy-MM-dd"> <el-date-picker
v-model="form.date"
type="date"
placeholder="选择日期"
format="yyyy 年 MM 月 dd 日"
value-format="yyyy-MM-dd">
</el-date-picker> </el-date-picker>
<!--<el-input v-model="form.date" placeholder="请输入" auto-complete="off" width="10px"></el-input>-->
</el-form-item> </el-form-item>
<!-- 模板选择:仅隐藏 UI,保留控件(v-show=false) -->
<el-form-item label="模版选择" :label-width="formLabelWidth"> <el-form-item label="模版选择" :label-width="formLabelWidth" v-show="false">
<el-select v-model="value" placeholder="请选择"> <el-select v-model="value" placeholder="请选择">
<el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value"> <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value">
</el-option> </el-option>
...@@ -39,15 +44,18 @@ ...@@ -39,15 +44,18 @@
</el-form-item> </el-form-item>
<el-form-item label="ydk文件" :label-width="formLabelWidth"> <el-form-item label="ydk文件" :label-width="formLabelWidth">
<el-upload class="upload-demo" :action="uploadUrl" :on-change="handleChange" :on-success="handleAvatarSuccess" :before-upload="beforeAvatarUpload" <!-- 只选择文件,不走旧的自动上传。保留 before/after 钩子最小侵入 -->
<el-upload
class="upload-demo"
:on-change="handleChange"
:auto-upload="false"
:file-list="fileList3"> :file-list="fileList3">
<el-button size="small" type="primary">点击上传</el-button> <el-button size="small" type="primary">选择文件</el-button>
<div slot="tip" class="el-upload__tip">上传卡组文件,大小不能超过3KB</div> <div slot="tip" class="el-upload__tip">上传卡组文件,大小不能超过3KB</div>
</el-upload> </el-upload>
</el-form-item> </el-form-item>
<el-form-item label="备选项" :label-width="formLabelWidth"> <el-form-item label="备选项" :label-width="formLabelWidth">
<!--<el-checkbox v-model="checked">是否生成图片</el-checkbox>-->
<el-checkbox v-model="checked2">是否打印(会帮您调用打印程序)</el-checkbox> <el-checkbox v-model="checked2">是否打印(会帮您调用打印程序)</el-checkbox>
</el-form-item> </el-form-item>
...@@ -62,173 +70,181 @@ ...@@ -62,173 +70,181 @@
</template> </template>
<script> <script>
import querystring from 'querystring'; // 移除失效 API 的使用(最小改动:删除 import API 并清空相关字段的用途)
import crypto from 'crypto'; import querystring from 'querystring';
import API from '../api' import crypto from 'crypto';
import { mapGetters } from 'vuex' import { mapGetters } from 'vuex'
import moment from 'moment' import moment from 'moment'
import tb_language from './tb_lang.js' import tb_language from './tb_lang.js'
import Footads from './Footads' import Footads from './Footads'
export default { export default {
components: { components: { Footads },
Footads data() {
}, return {
data() { fileList3: [],
return { options: [
fileList3: [], { value: '1', label: '默认' },
options: [{ { value: '2', label: 'KONAMI' }
value: '1', ],
label: '默认' value: '1',
}, {
value: '2', isIE: false,
label: 'KONAMI'
}], form: {
value: '1', name: '',
event: '',
isIE: false, date: '',
// gameid -> lastInitial
form: { lastInitial: '',
name: '', },
event: '', formLabelWidth: '80px',
date: '', isNew: true,
gameid: '', isClick: false,
todayCount: 0,
}, // 旧的 uploadUrl / imageUrl / downloadPath 废弃
formLabelWidth: '80px', imageUrl: "",
isNew: true, downloadPath: "",
isClick: false, demo_title: "",
todayCount: 0, demo_url: "",
uploadUrl: API.uploadUrl, demo1: [],
imageUrl: "", checked2: false,
downloadPath: "", demo2: []
demo_title: "", }
demo_url: "", },
demo1: [],
// checked: false, created: function () {
checked2: false, setTimeout(function () {
demo2: [] $(".el-upload__input").hide()
} }, 100)
}, this.isIE = this.isIEMethod();
},
created: function () {
setTimeout(function () { computed: {
$(".el-upload__input").hide() ...mapGetters({
}, 100) lang: 'getLang',
user: 'getUser'
this.isIE = this.isIEMethod(); }),
},
methods: {
handleChange(file, fileList) {
this.fileList3 = fileList.slice(-1);
}, },
computed: { // 保留但不再使用旧上传回调
...mapGetters({ handleAvatarSuccess(res, file) {
lang: 'getLang', // 不再使用旧下载路径
user: 'getUser'
}),
}, },
methods: { // 选择文件阶段可选校验:保持原逻辑最小复用(现在不自动上传,所以在提交时再严格校验)
handleChange(file, fileList) { beforeAvatarUpload(file) {
this.fileList3 = fileList.slice(-1); var type = /\.[^\.]+/.exec(file.name);
}, const isYDK = type && type[0] === '.ydk';
const isLt3KB = file.size / 1024 < 3;
handleAvatarSuccess(res, file) {
this.downloadPath = file.response.path
this.imageUrl = URL.createObjectURL(file.raw);
},
beforeAvatarUpload(file) {
var type = /\.[^\.]+/.exec(file.name);
const isJPG = type[0] === '.ydk';
const isLt2M = file.size / 1024 < 3;
if (!isJPG) {
this.$message.error('上传文件只能是 ydk 格式!');
return false
}
if (!isLt2M) {
this.$message.error('上传文件大小不能超过 3KB!');
return false
}
return true;
},
download: function () { if (!isYDK) {
window.location.href = API.getDownloadUrl(this.downloadPath) this.$message.error('上传文件只能是 ydk 格式!');
}, return false
}
if (!isLt3KB) {
this.$message.error('上传文件大小不能超过 3KB!');
return false
}
return true;
},
isIEMethod: function (ver) { // 旧下载方法废弃
var b = document.createElement('b') download: function () {},
b.innerHTML = '<!--[if IE ' + ver + ']><i></i><![endif]-->'
return b.getElementsByTagName('i').length === 1
},
onSubmit: function () { isIEMethod: function (ver) {
// if (!this.form.name || !this.form.name.trim()) { var b = document.createElement('b')
// this.$notify({ b.innerHTML = '<!--[if IE ' + ver + ']><i></i><![endif]-->'
// title: '警告', return b.getElementsByTagName('i').length === 1
// message: '请输入姓名!', },
// type: 'error'
// })
// return;
// }
// if (!this.form.event || !this.form.event.trim()) {
// this.$notify({
// title: '警告',
// message: '请输入event!',
// type: 'error'
// })
// return;
// }
var date;
if (this.form.date) {
date = moment(this.form.date).format('YYMMDD')
}
if (!this.downloadPath || !this.downloadPath.trim()) { // 改为直传 /api/fill
this.$notify({ async onSubmit() {
title: '警告', // 取出表单字段
message: '请上传ydk文件!', const { name, event, date, lastInitial } = this.form;
type: 'error'
}) // 文件检查
if (!this.fileList3.length || !this.fileList3[0].raw) {
this.$notify({
title: '警告',
message: '请先选择 ydk 文件!',
type: 'error'
});
return;
}
const file = this.fileList3[0].raw;
// 轻量校验(沿用原限制)
const ok = this.beforeAvatarUpload(file);
if (!ok) return;
// === 全局 Loading 遮罩 ===
const loading = this.$loading({
lock: true,
text: '正在生成...',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.3)'
});
try {
const qs = new URLSearchParams({
name: name || '',
event: event || '',
date: date || '',
lastInitial: lastInitial || ''
}).toString();
const formData = new FormData();
formData.append('file', file); // multipart/form-data
const resp = await fetch(`https://deckform.yuzurisa.com:444/api/fill?${qs}`, {
method: 'POST',
body: formData
});
if (!resp.ok) {
let errText = '生成失败';
try {
const ct = resp.headers.get('content-type') || '';
if (ct.includes('application/json')) {
const j = await resp.json();
errText = (j && j.message) || errText;
} else {
errText = await resp.text();
}
} catch (e) {}
this.$notify({ title: '错误', message: errText, type: 'error' });
return; return;
} }
var opt = { const blob = await resp.blob();
name: this.form.name, const url = URL.createObjectURL(blob);
event: this.form.event, const win = window.open(url, "_blank");
gameid: this.form.gameid,
date: date,
id: this.downloadPath.slice(7),
// img: this.checked,
print: this.checked2,
}
// var baseUrl = "http://localhost:8081"
var baseUrl = "https://mycard.world/ygopro/arena"
var template = "deck" if (this.checked2 && win) {
if (this.value === "1") { setTimeout(() => {
template = "deck" try { win.focus(); win.print(); } catch (e) {}
}, 800);
} }
if (this.value === "2") { } catch (e) {
template = "konami" this.$notify({
} title: '错误',
message: '网络异常或服务器错误',
var request = querystring.stringify(opt); type: 'error'
});
var url = `${baseUrl}/${template}.html?${request}`; } finally {
loading.close();
window.open(url, "_blank"); }
},
}, },
}
},
}
</script> </script>
<style scoped> <style scoped>
</style> </style>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment