xjc il y a 4 ans
Parent
commit
c53490a79a

+ 14 - 1
src/api.js

@@ -165,11 +165,22 @@ export default {
 	getMessageSurveyAnalyse: params => {
 		return axios.get(`${baseURL}/api/admin/message/survey/analyse`, { params: params });
 	},
+	getMessageSurveyAnalyseOut: params => {
+		return axios.get(`${baseURL}/api/admin/message/survey/analyse/out`, { params: params });
+	},
+	getMessageSurveyQuestionAnalyse: params => {
+		return axios.get(`${baseURL}/api/admin/message/survey/question/analyse`, { params: params });
+	},
 	downloadSurveyResult: params => {
 		return axios.get(`${baseURL}/api/admin/message/survey/result/download`, {
 			params: params, responseType: "blob"
 		});
 	},
+	downloadSurveyResultOut: params => {
+		return axios.get(`${baseURL}/api/admin/message/survey/result/download/out`, {
+			params: params, responseType: "blob"
+		});
+	},
 	// 通知管理
 	addNotice: params => {
 		return axios.post(`${baseURL}/api/admin/message/notice`, params);
@@ -190,7 +201,9 @@ export default {
 		return axios.get(`${baseURL}/api/admin/message/notice/analyse`, { params: params });
 	},
 	downloadNoticeAnalyse: params => {
-		return axios.get(`${baseURL}/api/admin/message/notice/analyse/download`, { params: params });
+		return axios.get(`${baseURL}/api/admin/message/notice/analyse/download`, {
+			params: params, responseType: "blob"
+		});
 	},
 	// 会议相关
 	getCityList: params => {

+ 1 - 1
src/views/Home.vue

@@ -6,7 +6,7 @@
 	<el-container>
 		<el-header>
 			<div class="header">
-				<!-- <img class="logo" src="../assets/logo.png" alt=""> -->
+				<img class="logo" src="../assets/logo.png" alt="">
 				期刊微信公众号管理系统
 			</div>	
 			<div class="nav">

+ 14 - 17
src/views/message/InnerSurvey.vue

@@ -158,7 +158,7 @@ a {
         </el-table-column>
         <el-table-column prop="cname" label="问卷统计">
           <template slot-scope="scope">
-            <a @click="showMessageAnalyse">查看</a>
+            <a @click="showMessageAnalyse(scope.row)">查看</a>
           </template>
         </el-table-column>
         <el-table-column prop="cname" label="发送者"> </el-table-column>
@@ -202,15 +202,7 @@ a {
         <el-form-item label="标题" prop="name">
           <el-input v-model="form1.name" placeholder="请输入标题"></el-input>
         </el-form-item>
-        <el-form-item label="接收人">
-          <!-- <el-select placeholder="请选择接收人" v-model="form1.receiver_id" multiple>
-                        <el-option
-                            v-for="(item, index) in userList"
-                            :key="index"
-                            :label="item.name"
-                            :value="item.id"
-                        ></el-option>
-                    </el-select> -->
+        <el-form-item label="接收人" prop="receiver_id">
           <el-cascader
             v-model="form1.receiver_id"
             :options="options"
@@ -224,7 +216,7 @@ a {
             </template>
           </el-cascader>
         </el-form-item>
-        <el-form-item label="问卷模板">
+        <el-form-item label="问卷模板" prop="template_id">
           <el-select
             placeholder="请选择问卷模板"
             v-model="form1.template_id"
@@ -238,12 +230,12 @@ a {
             ></el-option>
           </el-select>
         </el-form-item>
-        <el-form-item label="附件">
+        <!-- <el-form-item label="附件">
           <input @change="upload('fileurl')" id="fileurl" type="file" />
           <a :href="form1.fileurl" target="_blank"
             ><span>{{ form1.filename }}</span></a
           >
-        </el-form-item>
+        </el-form-item> -->
       </el-form>
       <span slot="footer" class="dialog-footer">
         <el-button size="small" type="primary" @click="save">确 定</el-button>
@@ -455,6 +447,8 @@ export default {
       checkList: [],
       rules: {
         name: [{ required: true, message: "请输入标题", trigger: "blur" }],
+        receiver_id:[{ required: true, message: "请选择接收人", trigger: "change" }],
+        template_id:[{ required: true, message: "请选择模板", trigger: "change" }]
       },
       props: { multiple: true },
       options: [
@@ -518,8 +512,8 @@ export default {
   },
   computed() {},
   methods: {
-    showMessageAnalyse(){
-          this.$router.push({path:'/message/innerSurvey/analyse'})
+    showMessageAnalyse(row){
+          this.$router.push({path:'/message/innerSurvey/analyse',query:{id:row.id,type:row.type}})
     },
     downloadExcel(){
       this.$api.downloadSurveyResult({message_id:this.cur_message_id,type:this.cur_post_type}).then((res)=>{
@@ -614,6 +608,7 @@ export default {
     },
     getData() {
       var parm = this.form;
+      parm.type = 0
       this.loading = true;
       this.$api.getAllTemplateList().then((res) => {
         this.templateList = res.data.data;
@@ -676,12 +671,14 @@ export default {
         });
     },
     save() {
+      this.loading = true
       this.$refs["form1"].validate((valid) => {
         if (valid) {
           let parm = this.form1;
           let id = this.form1.id;
           parm.receiver_id = JSON.stringify(parm.receiver_id);
           if (id) {
+            this.dialogVisible = false;
             this.$api.editMessage(parm).then((res) => {
               if (res.data.code == 0) {
                 this.$message({
@@ -692,9 +689,10 @@ export default {
                 this.$message.error("保存失败!");
               }
               this.getData();
-              this.dialogVisible = false;
+              this.loading = false
             });
           } else {
+            this.dialogVisible = false;
             this.$api.addMessage(parm).then((res) => {
               if (res.data.code == 0) {
                 this.$message({
@@ -705,7 +703,6 @@ export default {
                 this.$message.error("保存失败!");
               }
               this.getData();
-              this.dialogVisible = false;
             });
           }
         }

+ 121 - 118
src/views/message/MessageAnalyse.vue

@@ -1,78 +1,6 @@
 <style lang="scss">
-.preview {
-  .el-form-item {
-    margin-bottom: 15px;
-  }
-  label,
-  p {
-    line-height: 25px !important;
-  }
-}
-.el-cascader {
-  width: 100%;
-}
-a {
-  text-decoration: none;
-  color: #409eff;
-  cursor: pointer;
-}
-// 右边
-.item-main {
-  // margin:34px;
-  // height:600px;
-  // background: #FFFFFF;
-  border: 1px solid #dddddd;
-  box-shadow: 0px 5px 10px 0px rgba(0, 0, 0, 0.13);
-  border-radius: 20px;
-  .el-form.over_y {
-    max-height: calc(100vh - 340px);
-  }
-  /deep/.el-form-item__label {
-    float: none;
-  }
-}
-// label样式
-.edit_label {
-  /deep/.el-input__inner {
-    background: #f5faff;
-    border: 0px;
-    padding: 0px;
-  }
-}
-/deep/.opicon {
-  font-weight: bold;
-  padding: 5px;
-  color: #3895fe;
-}
-.tpl_title {
-  font-size: 18px;
-  margin: 20px 0;
-}
-.tpl_form {
-  margin: 20px;
-  border: 1px solid #ccc;
-  border-radius: 20px;
-  /deep/.el-form-item {
-    background: none;
-  }
-  /deep/.el-form-item__content {
-    width: 100%;
-  }
-}
-.survey_logo {
-  position: relative;
-  top: 15px;
-  left: 20px;
-}
-.result_dialog .el-dialog{
-    width: 40%;
-    margin-top:20vh!important;
-}
-.result-item{
-    height: 35px;
-    .label{
-        font-weight: 600;
-    }
+.content{
+  // height: 80vh;
 }
 // 新
 .item{
@@ -83,16 +11,24 @@ a {
     color:#606266;
     .title-num{
       display: inline-block;
-      width:60px;
+      // width:50px;
+      font-weight: bold;
+    }
+    .title-header{
+      // font-weight: 600;
     }
     .title-type{
-      margin-left:50px;
+      margin-left:10px;
     }
   }
   .item-content{
-    margin-left:60px;
+    // margin-left:60px;
     display:flex;
-    .el-table,div{
+    .el-table{
+      flex:1.5;
+    }
+    
+    div{
       flex:1;
     }
   }
@@ -104,24 +40,28 @@ a {
     <div class="content">
       <div class='item' v-for='(item,index) in results' :key='index'>
         <div class='item-title'>
-          <span class='title-num'>第{{index+1}}题</span>
-          <span class='title-header'>{{item.header}}</span>
+          <span class='title-num'>第{{index+1}}题</span>
+          <span class='title-header'>{{item.label}}</span>
           <span class='title-type'>{{item.type|getType}}</span>
         </div>
-        <div class='item-content' v-if='item.type=="input"'>{{item.content}}</div>
-        <div class='item-content' v-if='item.type=="radio"'>
-          <el-table :data="item.content">
-            <el-table-column prop="name" label="选项"> </el-table-column>
-            <el-table-column prop="count" label="次数"> </el-table-column>
-            <el-table-column prop="sale" label="比例"> </el-table-column>
+        <div class='item-content' v-if='item.type=="input"||item.type=="textarea"'>
+          【答案】:<span v-for="(item1,index) in item.result" :key="index">{{item1}}{{index==item.result.length-1?'':"、"}}</span>
+        </div>
+        <div class='item-content' v-if='item.type=="radio"||item.type=="checkbox"'>
+          <el-table 
+            :data="item.items"
+            border
+            >
+            <el-table-column prop="label" label="选项"> </el-table-column>
+            <el-table-column prop="times" label="次数"> </el-table-column>
+            <el-table-column prop="sale" label="比例">
+                <template slot-scope="scope">
+                    <el-progress :percentage="scope.row.sale"></el-progress>
+                </template>
+            </el-table-column>
           </el-table>
-          <!-- <el-button v-show='!item.echartShow' type='primary' style='height:40px;margin-left:10px;' @click='item.echartShow = true'>查看图表</el-button>
-          <div v-show='item.echartShow'>查看柱状图
-            <div :ref='index' style="width:100%;height:250px;"></div>
-          </div> -->
-          <!-- <div>查看饼图</div> -->
-          <div :id="`chart${index}`" style="width:300px;height:200px;"></div>
-
+          <div :id="`chartPie${index}`" style="width:300px;"></div>
+          <div :id="`chartBar${index}`" style="width:300px;"></div>
         </div>
       </div>
       
@@ -139,33 +79,47 @@ export default {
   data() {
     return {
     //   checked: [],
-      results:[
-        {header:'请输入您的姓名',content:"张东升 李来喜",type:'input'},
-        {header:'标题222',type:'radio',echartShow:false,content:[
-            {name:'选项1',count:'1',sale:'25%'},
-            {name:'选项2',count:'1',sale:'25%'},
-            {name:'选项3',count:'2',sale:'50%'}
-        ],}
-      ],
-      
+      loading: false,
+      results:[],
     };
   },
   filters:{
     getType(val){
-      if(val=='input' | val=='textara' ){
-        return '[填空题]'
+      if(val=='input' | val=='textarea' ){
+        return '【填空题】'
       }else if(val== 'radio'){
-        return '[单选题]'
+        return '【单选题】'
       }else if(val == 'checkbox'){
-        return '[多选题]'
+        return '【多选题】'
       }
     }
   },
   
   methods: {
+    getData() {
+      let message_id = this.$route.query.id
+      let type = this.$route.query.type
+      this.$api.getMessageSurveyQuestionAnalyse({id:message_id,type:type}).then((res) => {
+        this.results = res.data.data;
+        this.results.forEach((item,index)=>{
+          this.$nextTick(function(){
+            this.getEcharts(item,index);
+          })
+        })
+      });
+    },
     getEcharts(item,index){
-      var myChart = this.$echarts.init(document.getElementById(`chart${index}`));
-      let option1 = {
+      var myChart = this.$echarts.init(document.getElementById(`chartBar${index}`));
+      var myChart1 = this.$echarts.init(document.getElementById(`chartPie${index}`));
+      let dataPie = []
+      let dataBarX = []
+      let dataBarY = []
+      item.items.forEach((item,index)=>{
+        dataPie.push({name:item.label,value:item.times})
+        dataBarX.push(item.label)
+        dataBarY.push(item.times)
+      })
+      let option = {
                     color: ['#5066FF'],
                     tooltip: {
                         trigger: 'axis',
@@ -183,7 +137,7 @@ export default {
                     xAxis: [
                         {
                             type: 'category',
-                            data: ['Mon', 'Tue', 'Wed', 'Thu'],
+                            data: dataBarX,
                             
                             axisTick: {
                                 alignWithLabel: true
@@ -196,10 +150,10 @@ export default {
                                 }
                             },
                             axisLabel:{
-                                formatter:function(val) {
-                                    console.log(val,"")
-                                    return '中国科' //对每个标签处理后的结果(通过js字符串方法处理)
-                                },
+                                // formatter:function(val) {
+                                //     console.log(val,"")
+                                //     return '中国科' //对每个标签处理后的结果(通过js字符串方法处理)
+                                // },
                                 // x轴字体颜色
                                 textStyle: {
                                     color: '#999999',
@@ -240,10 +194,10 @@ export default {
                     ],
                     series: [
                         {
-                            name: '直接访问',
+                            name: '次数',
                             type: 'bar',
-                            barWidth: '40%',
-                            data: [10, 52, 200, 334],
+                            barWidth: '30px',
+                            data: dataBarY,
                             itemStyle: {
                                 //柱形图圆角,鼠标移上去效果,如果只是一个数字则说明四个参数全部设置为那么多
                                 normal: {
@@ -254,7 +208,56 @@ export default {
                         }
                     ]
                 };
-      myChart.setOption(option1)
+      let option1 = {
+          // backgroundColor: '#dddddd',
+          // title: {
+          //     text: 'Customized Pie',
+          //     left: 'center',
+          //     top: 20,
+          //     textStyle: {
+          //         color: '#ccc'
+          //     }
+          // },
+          color:['#9379ff','#62A2FF', '#FFD053', '#FF9F41','#FF542C'],
+          tooltip: {
+              trigger: 'item',
+              formatter: '{a} <br/>{b} : {c} ({d}%)'
+          },
+                  
+          series: [{
+              name: '访问来源',
+              type: 'pie',
+              radius: '75%',
+              center: ['50%', '50%'],
+              data:dataPie.sort(function (a, b) { return a.value - b.value; }),
+              roseType: 'radius',
+              label: {
+                  color: 'rgba(102, 102, 102,1)',
+                  fontSize:14
+              },
+              labelLine: {
+                  lineStyle: {
+                      color: 'rgba(000, 000, 000, 0.1)'
+                  },
+                  smooth: 0.2,
+                  length: 20,
+                  length2: 8   
+              },
+              itemStyle: {
+                  // color: '#c23531',
+                  // shadowBlur: 200,
+                  // shadowColor: 'rgba(0, 0, 0, 0.5)'
+              },
+
+              animationType: 'scale',
+              animationEasing: 'elasticOut',
+              animationDelay: function (idx) {
+                  return Math.random() * 200;
+              }
+          }]
+      };
+      myChart.setOption(option)
+      myChart1.setOption(option1)
     },
   },
   mounted(){
@@ -265,7 +268,7 @@ export default {
     })
   },
   created() {
-    
+      this.getData()
   },
 };
 </script>

+ 0 - 2
src/views/message/Notice.vue

@@ -128,14 +128,12 @@ a {
               >人<br />
             </span>
             已阅读:<a
-              :href="scope.row.fileurl"
               target="_blank"
               @click="analyseData('finish',scope.row.id)"
               ><span>{{ scope.row.finish_ids.length }}</span></a
             >人<br />
             <span v-if="scope.row.receiver_ids">
               未阅读:<a
-                :href="scope.row.fileurl"
                 target="_blank"
                 @click="analyseData('unfinish',scope.row.id)"
                 ><span>{{ scope.row.unfinish_ids.length }}</span></a

+ 23 - 17
src/views/message/OutSurvey.vue

@@ -134,17 +134,16 @@ a {
         </el-table-column>
         <el-table-column prop="cname" label="填报统计">
           <template slot-scope="scope">
-            <span v-if="scope.row.receiver_ids"
-              >已填报:
+            <span>已填报:
               <a target="_blank" @click="analyseData('total',scope.row.id)"
-                ><span>{{ scope.row.receiver_ids.length }}</span></a
+                ><span>{{ scope.row.finish_ids?scope.row.finish_ids.length:0 }}</span></a
               >人<br />
             </span>
           </template>
         </el-table-column>
         <el-table-column prop="cname" label="问卷统计">
           <template slot-scope="scope">
-            <a @click="showMessageAnalyse">查看</a>
+            <a @click="showMessageAnalyse(scope.row)">查看</a>
           </template>
         </el-table-column>
         <el-table-column prop="cname" label="发送者"> </el-table-column>
@@ -188,7 +187,7 @@ a {
         <el-form-item label="标题" prop="name">
           <el-input v-model="form1.name" placeholder="请输入标题"></el-input>
         </el-form-item>
-        <el-form-item label="问卷模板">
+        <el-form-item label="问卷模板" prop="template_id">
           <el-select
             placeholder="请选择问卷模板"
             v-model="form1.template_id"
@@ -202,12 +201,12 @@ a {
             ></el-option>
           </el-select>
         </el-form-item>
-        <el-form-item label="附件">
+        <!-- <el-form-item label="附件">
           <input @change="upload('fileurl')" id="fileurl" type="file" />
           <a :href="form1.fileurl" target="_blank"
             ><span>{{ form1.filename }}</span></a
           >
-        </el-form-item>
+        </el-form-item> -->
       </el-form>
       <span slot="footer" class="dialog-footer">
         <el-button size="small" type="primary" @click="save">确 定</el-button>
@@ -340,22 +339,25 @@ a {
           row-key="id"
           style="width: 100%"
         >
-          <el-table-column prop="realname" label="姓名"> </el-table-column>
+          <el-table-column v-for="(item,index) in analyseHeadList" :key="index" :label="item" :prop="item"> 
+              <!-- <template slot-scope="scope">{{scope.row.item}}</template> -->
+          </el-table-column>
+          <!-- <el-table-column prop="realname" label="姓名"> </el-table-column>
           <el-table-column prop="journal_name" label="所属期刊"></el-table-column>
           <el-table-column prop="cname" label="状态">
             <template slot-scope="scope">
               <span v-if="scope.row.post_status">已填报</span>
               <span v-else>未填报</span>
             </template>
-          </el-table-column>
+          </el-table-column> -->
           <el-table-column prop="post_time" label="填报时间"> </el-table-column>
-          <el-table-column prop="zip" width="80" label="操作">
+          <!-- <el-table-column prop="zip" width="80" label="操作">
           <template slot-scope="scope">
             <el-button class="edit" type="text" @click="showPostResult(scope.row)"
               >查看</el-button
             >
           </template>
-        </el-table-column>
+          </el-table-column> -->
         </el-table>
         <Page
           ref="pageButton"
@@ -395,6 +397,7 @@ export default {
       cur_post_type:null,
       postResult:{},
       analyseDataList:[],
+      analyseHeadList:[],
       title: "",
       widgetList: [],
       form: { name: "", page: 1, page_size: 20 },
@@ -419,6 +422,7 @@ export default {
       checkList: [],
       rules: {
         name: [{ required: true, message: "请输入标题", trigger: "blur" }],
+        template_id: [{ required: true, message: "请选择问卷模板", trigger: "change" }]
       },
       props: { multiple: true },
       options: [
@@ -454,7 +458,7 @@ export default {
               ],
             },
           ],
-        },
+        },  
         {
           value: 17,
           label: "西北",
@@ -480,13 +484,13 @@ export default {
       ],
     };
   },
-  computed() {},
+  // computed() {},
   methods: {
-    showMessageAnalyse(){
-          this.$router.push({path:'/message/outSurvey/analyse'})
+    showMessageAnalyse(row){
+          this.$router.push({path:'/message/outSurvey/analyse',query:{id:row.id,type:row.type}})
     },
     downloadExcel(){
-      this.$api.downloadSurveyResult({message_id:this.cur_message_id,type:this.cur_post_type}).then((res)=>{
+      this.$api.downloadSurveyResultOut({message_id:this.cur_message_id,type:this.cur_post_type}).then((res)=>{
           var elink = document.createElement('a');
           let blob=new Blob([res.data], {type: 'application/vnd.ms-excel,charset=UTF-8'});
           let objUrl=URL.createObjectURL(blob);
@@ -509,8 +513,9 @@ export default {
     analyseData(type,message_id) {
       this.dialogTitle2 = "统计结果"
       this.dialogVisible2 = true;
-      this.$api.getMessageSurveyAnalyse({type:type,message_id:message_id}).then((res)=>{
+      this.$api.getMessageSurveyAnalyseOut({type:type,message_id:message_id}).then((res)=>{
           this.analyseDataList = res.data.data.list
+          this.analyseHeadList = res.data.data.headers
           this.cur_message_id = message_id
           this.cur_post_type = type
       })
@@ -578,6 +583,7 @@ export default {
     },
     getData() {
       var parm = this.form;
+      parm.type = 1;
       this.loading = true;
       this.$api.getAllTemplateList().then((res) => {
         this.templateList = res.data.data;

+ 2 - 2
src/views/message/modelForm.vue

@@ -179,7 +179,7 @@
                         </div>
                     </el-col>
                 </el-row>
-                <el-row>
+                <!-- <el-row>
                     <el-col :span='12'>
                         <div class='model' @click="addWidget(4)">
                             <img src="../../assets/upload_small.png" alt="">
@@ -192,7 +192,7 @@
                             <span>文件上传</span>
                         </div>
                     </el-col>
-                </el-row>
+                </el-row> -->
             </div>
             <div class="content-item middle">
                 <div class='item-title'>编辑模板-{{title}}</div>