xy 2 years ago
parent 6a1464065b
commit 172703373c

@ -31,7 +31,8 @@
"vue": "2.6.10",
"vue-count-to": "^1.0.13",
"vue-router": "3.0.6",
"vuex": "3.1.0"
"vuex": "3.1.0",
"xlsx": "^0.18.5"
},
"devDependencies": {
"@vue/cli-plugin-babel": "4.4.4",

@ -0,0 +1,217 @@
<template>
<div>
<xy-dialog ref="dialog"
:is-show.sync="isShow"
type="form"
:title="type === 'add' ? '新增人员' : '编辑人员'"
:form="form"
:rules="rules"
@submit="submit">
<template v-slot:name>
<div class="xy-table-item">
<div class="xy-table-item-label">
名称
</div>
<div class="xy-table-item-content">
<el-input v-model="form.name"
clearable
placeholder="请输入名称"
style="width: 300px;"
></el-input>
</div>
</div>
</template>
<template v-slot:mobile>
<div class="xy-table-item">
<div class="xy-table-item-label">
手机号
</div>
<div class="xy-table-item-content">
<el-input v-model="form.mobile"
clearable
placeholder="请输入手机号"
style="width: 300px;"
></el-input>
</div>
</div>
</template>
<template v-slot:address>
<div class="xy-table-item">
<div class="xy-table-item-label">
地址
</div>
<div class="xy-table-item-content">
<el-input type="textarea"
:autosize="{minRows:2}"
v-model="form.address"
clearable
placeholder="请输入地址"
style="width: 300px;"
></el-input>
</div>
</div>
</template>
<template v-slot:score>
<div class="xy-table-item">
<div class="xy-table-item-label">
最高分
</div>
<div class="xy-table-item-content">
<el-input-number v-model="form.score"
clearable
placeholder="请输入最高分"
style="width: 300px;"
:controls="false"
></el-input-number>
</div>
</div>
</template>
<template v-slot:pid>
<div class="xy-table-item">
<div class="xy-table-item-label">
是否中奖
</div>
<div class="xy-table-item-content">
<el-input v-model="form.pid"
clearable
placeholder="请输入是否中奖"
style="width: 300px;"
></el-input>
</div>
</div>
</template>
</xy-dialog>
</div>
</template>
<script>
import {
show,
save
} from '@/api/activity/activityUser';
export default {
props:{
},
data() {
return {
isShow: false,
id: '',
type: '',
form: {
name: "",
mobile: "",
address: "",
score: "",
pid: "",
},
rules: {
}
}
},
methods: {
show(){
this.isShow = true;
},
hidden(){
this.isShow = false;
},
init(){
for (let key in this.form) {
if (this.form[key] instanceof Array) {
this.form[key] = [];
} else {
this.form[key] = "";
}
}
this.$refs["dialog"].clearValidate();
},
setId(id) {
if(typeof id == "number") {
this.id = id;
}else {
console.error("error typeof id: " + typeof id)
}
},
getId() {
return this.id;
},
setType(type = 'add') {
let types = ['add','editor']
if(types.includes(type)) {
this.type = type;
}else{
console.warn("Unknown type: " + type)
}
},
setForm(key = [], value = []) {
if(key instanceof Array) {
key.forEach((key,index) => {
this.form[key] = value[index] ?? "";
})
}
if(typeof key === "string"){
this.form[key] = value
}
if(!key){
this.init()
}
},
async getDetail() {
const res = await show({ id:this.id })
this.$integrateData(this.form, res)
},
submit() {
if(this.type === 'add'){
if(this.form.hasOwnProperty('id')){
delete this.form.id
}
}
if (this.type === 'editor') {
Object.defineProperty(this.form, 'id', {
value: this.id,
enumerable: true,
configurable: true,
writable: true
})
}
this.form.activity_list_id = 10;
save(this.form).then(res => {
this.$message({
type: 'success',
message: this.type === 'add' ? '新增人员' : '编辑人员' + '成功'
});
this.isShow = false
this.$emit('refresh')
})
}
},
watch: {
isShow(val) {
if (val) {
if (this.type === 'editor') {
this.getDetail()
}
} else {
this.id = ''
this.type = ''
this.init();
this.$refs['dialog'].clearValidate();
delete this.form.id
}
},
}
}
</script>
<style scoped lang="scss">
::v-deep .el-input__inner {
text-align: left;
}
</style>

@ -8,28 +8,46 @@
<div slot="content"></div>
<slot>
<div class="selects">
<div>
<span style="padding: 0 6px; word-break: keep-all"> 关键字 </span>
<Input
v-model="select.keyword"
placeholder="请输入关键字"
style="width: 180px"
></Input>
<Button
style="margin-left: 10px"
type="primary"
@click="select = {
<span style="padding: 0 6px; word-break: keep-all"> 关键字 </span>
<Input
v-model="select.keyword"
placeholder="请输入关键字"
style="width: 180px"
></Input>
<Button
style="margin-left: 10px"
type="primary"
@click="select = {
page: 1,
page_size: 20,
keyword: '',
activity_list_id: 10
}"
>重置
</Button>
<Button style="margin-left: 10px" type="primary" @click="getList"
>查询</Button
>重置
</Button>
<Button style="margin-left: 10px" type="primary" @click="getList"
>查询</Button
>
<Button style="margin-left: 10px" type="primary" @click="exportXLSX"
>导出</Button
>
<el-upload
class="upload-demo"
:action="action"
:limit="1"
:on-success="importData"
:headers="{
Authorization: `Bearer ${getToken()}`,
}"
:data="{
'table_name': 'users'
}"
:show-file-list="false"
:file-list="fileList">
<Button style="margin-left: 10px" type="primary"
>导入</Button
>
</div>
</el-upload>
</div>
</slot>
</lx-header>
@ -41,20 +59,33 @@
@delete="deleteitem"
@editor="
(row) => {
$refs['addPeople'].setId(row.id);
$refs['addPeople'].setType('editor');
$refs['addPeople'].show()
}
"
@pageSizeChange="pageSizeChange"
@pageIndexChange="pageChange"
>
</xy-table>
<addPeople ref="addPeople" @refresh="getList"></addPeople>
</div>
</template>
<script>
import { index } from "@/api/activity/activityUser"
import addPeople from "./addPeople.vue"
import { getToken } from "@/utils/auth"
import * as XLSX from "xlsx";
import { index , save } from "@/api/activity/activityUser";
import { index as baseFormIndex } from "@/api/index/index"
export default {
components: {
addPeople
},
data() {
return {
action: `${process.env.VUE_APP_BASE_API}/api/admin/base-form/excel-show`,
fileList: [],
activityListId: 10,
list: [],
total: 0,
@ -79,6 +110,14 @@ export default {
prop: "score",
label: "最高分",
width: 100
},
{
prop: "pid",
label: "是否中奖",
width: 120,
formatter:(d1, d2, v) => {
return v ? "是" : "否"
}
}
],
select: {
@ -90,6 +129,7 @@ export default {
}
},
methods: {
getToken,
async getList () {
const res = await index(this.select)
this.list = res.data;
@ -106,6 +146,62 @@ export default {
pageChange (e) {
this.select.page = 1;
this.getList()
},
async exportXLSX () {
const res = await baseFormIndex({
table_name: "users",
page: 1,
page_size: 99999,
activity_list_id: 10,
filter: [
{
key: "mobile",
op: "neq",
value: "null"
}
]
})
console.log(res)
let headers = [{ label: 'id', prop: 'id' },...this.table].map(i => ({
name: i.label,
key: i.prop
}))
const data = res.data.map(i => {
return headers.map(header => {
return i[header.key]
})
})
data.unshift(headers.map(i => i.name))
const wb = XLSX.utils.book_new();
const ws = XLSX.utils.aoa_to_sheet(data);
XLSX.utils.book_append_sheet(wb, ws, '人员分数.xlsx')
const wbout = XLSX.write(wb, {
bookType: "xlsx",
bookSST: true,
type: "array",
});
let a = document.createElement('a');
let url = window.URL.createObjectURL(new Blob([wbout],{ type: "application/octet-stream" }))
a.href = url;
a.download = '人员分数.xlsx';
a.click();
window.URL.revokeObjectURL(url)
},
importData (response, file, fileList) {
console.log(response, file, fileList)
Promise.all(response.map(i => {
return save({
...i,
activity_list_id: 10,
})
})).then(res => {
this.$message({
type: "success",
message: `成功导入${res.length}`
})
this.getList()
})
}
},
computed: {},

Loading…
Cancel
Save