|
@@ -0,0 +1,263 @@
|
|
|
|
|
+<template>
|
|
|
|
|
+ <div>
|
|
|
|
|
+ <div class="menu-title">
|
|
|
|
|
+ 导入反馈
|
|
|
|
|
+ <div class="icon icon-back" @click="backBtn">
|
|
|
|
|
+ <i title="返回"></i>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="block_box" style="margin-top: 20px;padding: 20px">
|
|
|
|
|
+ <el-form ref="cmd" label-width="100px" :rules="rules" :model="cmd" :inline="true">
|
|
|
|
|
+ <el-form-item label="文件" prop="file">
|
|
|
|
|
+ <el-upload
|
|
|
|
|
+ class="upload-demo"
|
|
|
|
|
+ action="#"
|
|
|
|
|
+ :auto-upload="false"
|
|
|
|
|
+ accept=".csv"
|
|
|
|
|
+ :on-change="handleFileChange"
|
|
|
|
|
+ :limit="1"
|
|
|
|
|
+ :show-file-list="false">
|
|
|
|
|
+ <el-button size="small" type="primary">点击上传</el-button>
|
|
|
|
|
+ <div slot="tip" class="el-upload__tip">只能上传csv文件</div>
|
|
|
|
|
+ </el-upload>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ <br/>
|
|
|
|
|
+ <el-form-item label="字段分隔符" prop="field">
|
|
|
|
|
+ <el-input v-model="cmd.field" placeholder="请输入字段分隔符" style="width: 300px"
|
|
|
|
|
+ @change="handleFieldChange"></el-input>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ <br/>
|
|
|
|
|
+ <el-form-item label="反馈类型" prop="labels">
|
|
|
|
|
+ <el-select v-model="cmd.feedbackType" style="width: 300px" @change="refreshList">
|
|
|
|
|
+ <template v-if="cmd.ifFirstHead">
|
|
|
|
|
+ <el-option :value="index" :label="item" v-for="(item,index) in columnList" :key="index"></el-option>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template v-if="!cmd.ifFirstHead">
|
|
|
|
|
+ <el-option :value="index" :label="index" v-for="(item,index) in columnList" :key="index"></el-option>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </el-select>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ <el-form-item label="用户ID" prop="labels">
|
|
|
|
|
+ <el-select v-model="cmd.userId" style="width: 300px" @change="refreshList">
|
|
|
|
|
+ <template v-if="cmd.ifFirstHead">
|
|
|
|
|
+ <el-option :value="index" :label="item" v-for="(item,index) in columnList" :key="index"></el-option>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template v-if="!cmd.ifFirstHead">
|
|
|
|
|
+ <el-option :value="index" :label="index" v-for="(item,index) in columnList" :key="index"></el-option>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </el-select>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ <br/>
|
|
|
|
|
+ <el-form-item label="物类ID" prop="labels">
|
|
|
|
|
+ <el-select v-model="cmd.itemId" style="width: 300px" @change="refreshList">
|
|
|
|
|
+ <template v-if="cmd.ifFirstHead">
|
|
|
|
|
+ <el-option :value="index" :label="item" v-for="(item,index) in columnList" :key="index"></el-option>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template v-if="!cmd.ifFirstHead">
|
|
|
|
|
+ <el-option :value="index" :label="index" v-for="(item,index) in columnList" :key="index"></el-option>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </el-select>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ <el-form-item label="日期">
|
|
|
|
|
+ <el-select v-model="cmd.timestamp" style="width: 300px" @change="refreshList">
|
|
|
|
|
+ <template v-if="cmd.ifFirstHead">
|
|
|
|
|
+ <el-option :value="index" :label="item" v-for="(item,index) in columnList" :key="index"></el-option>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template v-if="!cmd.ifFirstHead">
|
|
|
|
|
+ <el-option :value="index" :label="index" v-for="(item,index) in columnList" :key="index"></el-option>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </el-select>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ <br/>
|
|
|
|
|
+ <el-form-item label=" ">
|
|
|
|
|
+ <el-checkbox label="第一行为表头" v-model="cmd.ifFirstHead" @change="refreshList"></el-checkbox>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-form>
|
|
|
|
|
+ <el-table :data="list" style="width: 100%" height="400" v-show="list.length > 0">
|
|
|
|
|
+ <el-table-column type="index" label="行号" width="60"></el-table-column>
|
|
|
|
|
+ <el-table-column prop="feedbackType" :label="'反馈类型('+(cmd.ifFirstHead ? columnList[cmd.feedbackType] : cmd.feedbackType)+')'"></el-table-column>
|
|
|
|
|
+ <el-table-column prop="userId" :label="'用户ID('+(cmd.ifFirstHead ? columnList[cmd.userId] : cmd.userId)+')'"></el-table-column>
|
|
|
|
|
+ <el-table-column prop="itemId" :label="'物类ID('+(cmd.ifFirstHead ? columnList[cmd.itemId] : cmd.itemId)+')'"></el-table-column>
|
|
|
|
|
+ <el-table-column prop="timestamp"
|
|
|
|
|
+ :label="'日期('+(cmd.ifFirstHead ? columnList[cmd.timestamp] : cmd.timestamp)+')'"></el-table-column>
|
|
|
|
|
+ </el-table>
|
|
|
|
|
+ <el-button type="primary" class="submit-btn" @click="confirmSubmit" :disabled="list.length === 0">确认提交
|
|
|
|
|
+ </el-button>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+</template>
|
|
|
|
|
+
|
|
|
|
|
+<script>
|
|
|
|
|
+import request from '@/utils/request';
|
|
|
|
|
+
|
|
|
|
|
+var _this;
|
|
|
|
|
+export default {
|
|
|
|
|
+ name: "ImportUser",
|
|
|
|
|
+ data() {
|
|
|
|
|
+ return {
|
|
|
|
|
+ config: /* Papa Parse config object */ {
|
|
|
|
|
+ delimiter: "", // auto-detect
|
|
|
|
|
+ newline: "", // auto-detect
|
|
|
|
|
+ quoteChar: '"',
|
|
|
|
|
+ escapeChar: '"',
|
|
|
|
|
+ header: true,
|
|
|
|
|
+ dynamicTyping: true,
|
|
|
|
|
+ preview: 0,
|
|
|
|
|
+ encoding: "",
|
|
|
|
|
+ delimitersToGuess: [',']
|
|
|
|
|
+ // ?? callback function ??
|
|
|
|
|
+ },
|
|
|
|
|
+ cmd: {
|
|
|
|
|
+ field: ',',
|
|
|
|
|
+ userId: '',
|
|
|
|
|
+ itemId: '',
|
|
|
|
|
+ timestamp: '',
|
|
|
|
|
+ feedbackType: '',
|
|
|
|
|
+ ifFirstHead: true
|
|
|
|
|
+ },
|
|
|
|
|
+ file: [],
|
|
|
|
|
+ originList: [], // 原始的可能包含表头的数据,默认存储最多21行(如果数据不止21行的话)
|
|
|
|
|
+ list: [], // 页面table显示的数据
|
|
|
|
|
+ columnList: [],// 上传csv的表头
|
|
|
|
|
+ rules: {
|
|
|
|
|
+ fid: [
|
|
|
|
|
+ {required: true, message: '请选择文件'}
|
|
|
|
|
+ ],
|
|
|
|
|
+ field: [
|
|
|
|
|
+ {required: true, message: '字段分隔符不能为空'}
|
|
|
|
|
+ ],
|
|
|
|
|
+ categories: [
|
|
|
|
|
+ {required: true, message: '类别分隔符不能为空'}
|
|
|
|
|
+ ],
|
|
|
|
|
+ },
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+ mounted() {
|
|
|
|
|
+ _this = this;
|
|
|
|
|
+ },
|
|
|
|
|
+ methods: {
|
|
|
|
|
+ handleFileChange(file, fileList) {
|
|
|
|
|
+ _this.file = file.raw;
|
|
|
|
|
+ if(_this.cmd.field.length > 0) {
|
|
|
|
|
+ _this.handleFieldChange();
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+ handleFieldChange() {
|
|
|
|
|
+ this.$papa.parse(_this.file, {
|
|
|
|
|
+ delimiter: _this.cmd.field,
|
|
|
|
|
+ complete: (results) => {
|
|
|
|
|
+ _this.originList = results.data.slice(0, 21);
|
|
|
|
|
+ // 提前填充一个默认的值给对应的ID列和标签列
|
|
|
|
|
+ _this.prepareFieldAndLabels();
|
|
|
|
|
+ _this.refreshList();
|
|
|
|
|
+ }
|
|
|
|
|
+ })
|
|
|
|
|
+ },
|
|
|
|
|
+ prepareFieldAndLabels() {
|
|
|
|
|
+ _this.columnList = _this.originList[0];
|
|
|
|
|
+ _this.cmd.feedbackType = 0;
|
|
|
|
|
+ _this.cmd.userId = 1;
|
|
|
|
|
+ _this.cmd.itemId = 2;
|
|
|
|
|
+ _this.cmd.timestamp = 3;
|
|
|
|
|
+ },
|
|
|
|
|
+ refreshList() {
|
|
|
|
|
+ // 处理原始数据,将行文本截取成数组放入list
|
|
|
|
|
+ _this.list = [];
|
|
|
|
|
+ if (_this.cmd.field.length === 0) {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ for (let i in _this.originList) {
|
|
|
|
|
+ if (_this.cmd.ifFirstHead && i == 0) {
|
|
|
|
|
+ // 第一行是表头,跳过list塞入
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
|
|
+ let row = _this.originList[i];
|
|
|
|
|
+ let errorFlag = false;
|
|
|
|
|
+
|
|
|
|
|
+ _this.list.push({
|
|
|
|
|
+ userId: row[_this.cmd.userId],
|
|
|
|
|
+ itemId: row[_this.cmd.itemId],
|
|
|
|
|
+ feedbackType: row[_this.cmd.feedbackType],
|
|
|
|
|
+ timestamp: row[_this.cmd.timestamp],
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+ confirmSubmit() { // 提交确认
|
|
|
|
|
+ this.$refs.cmd.validate((valid) => {
|
|
|
|
|
+ let formData = new FormData();
|
|
|
|
|
+ formData.append("sep", _this.cmd.field);
|
|
|
|
|
+ formData.append("has-header", _this.cmd.ifFirstHead);
|
|
|
|
|
+ formData.append("file", _this.file);
|
|
|
|
|
+ let userIdIndex = _this.cmd.userId;
|
|
|
|
|
+ let itemIdIndex = _this.cmd.itemId;
|
|
|
|
|
+ let feedbackTypeIndex = _this.cmd.feedbackType;
|
|
|
|
|
+ let timestampIndex = _this.cmd.timestamp;
|
|
|
|
|
+ let _format = '';
|
|
|
|
|
+ for (let i = 0; i <= Math.max(userIdIndex, itemIdIndex, feedbackTypeIndex, timestampIndex); i++) {
|
|
|
|
|
+ if (i == userIdIndex) {
|
|
|
|
|
+ _format += "u";
|
|
|
|
|
+ } else if (i == itemIdIndex) {
|
|
|
|
|
+ _format += "i";
|
|
|
|
|
+ } else if (i == timestampIndex) {
|
|
|
|
|
+ _format += "t";
|
|
|
|
|
+ } else if (i == feedbackTypeIndex) {
|
|
|
|
|
+ _format += "f";
|
|
|
|
|
+ } else {
|
|
|
|
|
+ _format += "_";
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ formData.append("format", _format);
|
|
|
|
|
+ request({
|
|
|
|
|
+ url: '/gorse/bulk/feedback',
|
|
|
|
|
+ method: 'put',
|
|
|
|
|
+ data: formData
|
|
|
|
|
+ }).then(res => {
|
|
|
|
|
+ if(res.data && res.data.RowAffected) {
|
|
|
|
|
+ _this.$message.success(`成功导入${res.data.RowAffected}条记录`);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ _this.$message.warning("导入异常");
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+ });
|
|
|
|
|
+ },
|
|
|
|
|
+ backBtn() {
|
|
|
|
|
+ this.$router.push({
|
|
|
|
|
+ path: "feedbackType", query: {
|
|
|
|
|
+ qo: JSON.stringify({
|
|
|
|
|
+ pageNo: 1,
|
|
|
|
|
+ pageSize: 10,
|
|
|
|
|
+ LIKES_fid: '',
|
|
|
|
|
+ })
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+ },
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+</script>
|
|
|
|
|
+<style src="../../../css/back.css" scoped></style>
|
|
|
|
|
+<style scoped lang="scss">
|
|
|
|
|
+
|
|
|
|
|
+.block_box {
|
|
|
|
|
+ margin: 25px;
|
|
|
|
|
+ background: #FFFFFF;
|
|
|
|
|
+ border-radius: 3px;
|
|
|
|
|
+
|
|
|
|
|
+ .title {
|
|
|
|
|
+ border-bottom: 1px solid #ccc;
|
|
|
|
|
+ padding: 15px 25px;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ > div {
|
|
|
|
|
+ padding: 25px;
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .submit-btn {
|
|
|
|
|
+ margin-left: auto;
|
|
|
|
|
+ margin-top: 20px;
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+</style>
|