Преглед изворни кода

Merge branch 'pre' of http://git.dgtis.com/sunlupeng/pointsMall

sunlupeng пре 1 година
родитељ
комит
5a178e3c78
51 измењених фајлова са 3168 додато и 349 уклоњено
  1. 1 0
      .gitignore
  2. 518 0
      public/drawCarousel.html
  3. 3 0
      src/App.vue
  4. 114 4
      src/api/allApi.js
  5. BIN
      src/assets/image/answerGame/home/answer.png
  6. BIN
      src/assets/image/answerGame/home/exit.png
  7. BIN
      src/assets/image/answerGame/home/homeBg.png
  8. BIN
      src/assets/image/answerGame/home/rules.png
  9. BIN
      src/assets/image/answerGame/item/error.png
  10. BIN
      src/assets/image/answerGame/item/fail.png
  11. BIN
      src/assets/image/answerGame/item/finish.png
  12. BIN
      src/assets/image/answerGame/item/goHome.png
  13. BIN
      src/assets/image/answerGame/item/itemBg.png
  14. BIN
      src/assets/image/answerGame/item/right.png
  15. BIN
      src/assets/image/answerGame/item/timer.png
  16. BIN
      src/assets/image/answerGame/item/topicNum.png
  17. BIN
      src/assets/image/answerGame/qiXi/answer.png
  18. BIN
      src/assets/image/answerGame/qiXi/error.png
  19. BIN
      src/assets/image/answerGame/qiXi/exit.png
  20. BIN
      src/assets/image/answerGame/qiXi/fail.png
  21. BIN
      src/assets/image/answerGame/qiXi/finish.png
  22. BIN
      src/assets/image/answerGame/qiXi/goHome.png
  23. BIN
      src/assets/image/answerGame/qiXi/homeBg.png
  24. BIN
      src/assets/image/answerGame/qiXi/itemBg.png
  25. BIN
      src/assets/image/answerGame/qiXi/right.png
  26. BIN
      src/assets/image/answerGame/qiXi/rules.png
  27. BIN
      src/assets/image/answerGame/qiXi/timer.png
  28. BIN
      src/assets/image/answerGame/qiXi/topicNum.png
  29. BIN
      src/assets/image/recordBtn.png
  30. 3 2
      src/components/AppHeader.vue
  31. 8 1
      src/components/AppSidebar.vue
  32. 1 1
      src/main.js
  33. 1 0
      src/permission.js
  34. 21 1
      src/router/index.js
  35. 2 0
      src/utils/request.js
  36. 525 0
      src/views/HomeView/AnswerGame/AnswerGame.vue
  37. 525 0
      src/views/HomeView/AnswerGame/QiXiAnswerGame.vue
  38. 492 0
      src/views/HomeView/CiteList.vue
  39. 67 0
      src/views/HomeView/DrawCarouselGame/DrawCarouselGame.vue
  40. 264 22
      src/views/HomeView/EarnPoints.vue
  41. 35 11
      src/views/HomeView/FestiveEvents.vue
  42. 0 169
      src/views/HomeView/Game.vue
  43. 120 0
      src/views/HomeView/GoodDetail.vue
  44. 34 12
      src/views/HomeView/GoodsDetail.vue
  45. 132 21
      src/views/HomeView/MyCenter.vue
  46. 78 28
      src/views/HomeView/PointsMall.vue
  47. 164 47
      src/views/HomeView/RedeemView.vue
  48. 7 0
      src/views/HomeView/SignIn.vue
  49. 20 19
      src/views/HomeView/WelfareList.vue
  50. 32 10
      src/views/NoticeCenter.vue
  51. 1 1
      vue.config.js

+ 1 - 0
.gitignore

@@ -2,6 +2,7 @@
 node_modules/
 dist/
 dist.zip*
+dist.7z*
 npm-debug.log*
 yarn-debug.log*
 yarn-error.log*

+ 518 - 0
public/drawCarousel.html

@@ -0,0 +1,518 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+  <meta charset="UTF-8">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <title>转盘抽奖</title>
+  <link rel="stylesheet" href="https://unpkg.com/element-plus/dist/index.css" />
+  <style>
+::-webkit-scrollbar {
+  width: 6px;
+  height: 6px;
+}
+
+::-webkit-scrollbar-track {
+  width: 3px;
+  background: rgba(#101F1C, 0.1);
+  -webkit-border-radius: 2em;
+  -moz-border-radius: 2em;
+  border-radius: 2em;
+}
+
+::-webkit-scrollbar-thumb {
+  background-color: rgba(144,147,153,.5);
+  background-clip: padding-box;
+  min-height: 28px;
+  -webkit-border-radius: 2em;
+  -moz-border-radius: 2em;
+  border-radius: 2em;
+  transition: background-color .3s;
+  cursor: pointer;
+}
+
+::-webkit-scrollbar-thumb:hover {
+  background-color: rgba(144,147,153,.3);
+}
+
+    * {
+      margin: 0;
+      padding: 0;
+      box-sizing: border-box;
+    }
+
+    #app {
+      background: url('https://xiaoyou.dgtis.com/images/image/2023/08/16/obnd1td7k6c65ehxciz6.png') no-repeat;
+      background-size: 100% 100%;
+      width: 640px;
+      height: 680px;
+      margin: 0 auto;
+      margin-top: 20px;
+    }
+    .el-dialog__body{
+      padding-top: 0px !important;
+    }
+    [v-cloak] {
+      display: none;
+    }
+    .rules{
+      cursor: pointer;
+      position: absolute;
+      width: 50px;
+      height: 50px;
+      background: #fff;
+      border-radius: 50%;
+      display: flex;
+      justify-content: center;
+      align-items: center;
+      font-size: 14px;
+      font-weight: 600;
+      left: 10%;
+      top: 15%;
+    }
+    .recordBtn {
+        cursor: pointer;
+        position: absolute;
+        right: 10%;
+        top: 12%;
+    }
+
+    .recordBtn>img {
+        width: 80px;
+        height: auto;
+    }
+    .container {
+      overflow: hidden;
+      width: 500px;
+      height: 500px;
+      margin: 0 auto;
+      position: relative;
+      top: 23%;
+    }
+
+    .prize-list {
+      width: 100%;
+      height: 100%;
+      border-radius: 50%;
+      border: 10px solid #98d3fc;
+      overflow: hidden;
+    }
+
+    .prize-item {
+      /*border: 2px solid red;*/
+      position: absolute;
+      left: 0;
+      right: 0;
+      top: -10px;
+      margin: auto;
+    }
+
+    .prize-item img {
+      width: 35%;
+      /* height: 25%; */
+      margin: 35px auto 10px;
+      display: block;
+    }
+
+    .prize-item p {
+      color: #fff;
+      font-size: 12px;
+      text-align: center;
+      line-height: 20px;
+    }
+
+    .btn {
+      width: 80px;
+      height: 80px;
+      background: url('https://xiaoyou.dgtis.com/images/image/2023/08/15/wwn4p7lua9t5h0rx8tlz.png') no-repeat center / 100% 100%;
+      position: absolute;
+      left: 0;
+      right: 0;
+      top: 0;
+      bottom: 0;
+      margin: auto;
+      cursor: pointer;
+    }
+
+    .btn::before {
+      content: "";
+      width: 41px;
+      height: 39px;
+      background: url('https://xiaoyou.dgtis.com/images/image/2023/08/15/2vac6uuqd3gpbl35l8e1.png') no-repeat center / 100% 100%;
+      position: absolute;
+      left: 0;
+      right: 0;
+      top: -30px;
+      margin: auto;
+      /* -webkit-transform: rotate(-5deg);
+      transform: rotate(-5deg); */
+    }
+    .recordListBox{
+      max-height: 200px;
+      overflow: auto;
+    }
+    .title{
+      font-size: 15px;
+      font-weight: 600;
+    }
+    .recordItem{
+      display: flex;
+      justify-content: space-around;
+      align-items: center;
+      margin: 10px 0;
+    }
+    .recordItem .prise .recordItem .priseTime{
+      display: flex;
+      justify-content: center;
+      align-items: center;
+    }
+  </style>
+</head>
+
+<body>
+  <div id="app" v-cloak class="app">
+    <div class="rules" @click="showRules">
+      抽奖<br>规则
+    </div>
+    <div class="recordBtn" @click="showRecordList">
+      <img src="https://xiaoyou.dgtis.com/images/image/2023/09/06/lt1vbg426idwq725ysdm.png" alt="抽奖记录">
+    </div>
+    <div class="container">
+      <div class="prize-list" ref="prizeWrap" :style="bgColor">
+        <div class="prize-item" v-for="(item, index) in prizeList" :style="prizeStyle(index)">
+          <img :src="item.imgUrl" alt="">
+          <p>{{ item.prizeName }}</p>
+        </div>
+      </div>
+      <div class="btn" @click="start"></div>
+    </div>
+    <el-dialog
+      v-model="dialogVisible"
+      title="抽奖规则"
+      width="50%"
+      center
+    >
+      <div style="max-height: 200px;overflow: auto;" v-html="rule"></div>
+    </el-dialog>
+    <el-dialog
+      v-model="dialogRecordList"
+      title="抽奖记录"
+      width="50%"
+      center
+    >
+    <div class="recordListBox">
+      <div class="recordItem title">
+        <div class="prise">获奖时间</div>
+        <div class="priseTime">奖品</div>
+      </div>
+      <el-empty description="暂无数据" v-if="recordList.length==0" :image-size="20"></el-empty>
+      <div class="recordItem" v-for="(item, index) in recordList">
+        <div class="prise">{{item.createTime}}</div>
+        <div class="priseTime">{{item.prizeName}}</div>
+      </div>
+    </div>
+  </el-dialog>
+  </div>
+
+  <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
+  <script src="https://unpkg.com/element-plus"></script>
+  <script src="https://cdn.bootcdn.net/ajax/libs/jquery/2.1.0/jquery.js"></script>
+  <script>
+    const {
+      createApp,
+      onBeforeMount,
+      onMounted,
+      onUnmounted,
+      ref,
+      reactive,
+      toRefs,
+      computed,
+      nextTick
+    } = Vue
+    createApp({
+      setup() {
+        const state = reactive({
+          recordList:[],
+          dialogRecordList:false,
+          dialogVisible:false,
+          rule:'',
+          token: '',
+          actId: '',
+          prizeList: [
+            // {
+            //   prizeName: '手机',
+            //   imgUrl: 'https://xiaoyou.dgtis.com/images/image/2023/08/15/6b8jfssjhybfj572ybs3.jpg'
+            // },
+            // {
+            //   prizeName: '手表',
+            //   imgUrl: 'https://img1.baidu.com/it/u=2631716577,1296460670&fm=253&fmt=auto&app=120&f=JPEG'
+            // },
+            // {
+            //   prizeName: '苹果',
+            //   imgUrl: 'https://img2.baidu.com/it/u=2611478896,137965957&fm=253&fmt=auto&app=138&f=JPEG'
+            // },
+            // {
+            //   prizeName: '棒棒糖',
+            //   imgUrl: 'https://img2.baidu.com/it/u=576980037,1655121105&fm=253&fmt=auto&app=138&f=PNG'
+            // },
+            // {
+            //   prizeName: '娃娃',
+            //   imgUrl: 'https://img2.baidu.com/it/u=4075390137,3967712457&fm=253&fmt=auto&app=138&f=PNG'
+            // },
+            // {
+            //   prizeName: '木马',
+            //   imgUrl: 'https://img1.baidu.com/it/u=2434318933,2727681086&fm=253&fmt=auto&app=120&f=JPEG'
+            // },
+            // {
+            //   prizeName: '德芙',
+            //   imgUrl: 'https://img0.baidu.com/it/u=1378564582,2397555841&fm=253&fmt=auto&app=120&f=JPEG'
+            // },
+            // {
+            //   prizeName: '玫瑰',
+            //   imgUrl: 'https://img1.baidu.com/it/u=1125656938,422247900&fm=253&fmt=auto&app=120&f=JPEG'
+            // },
+          ], // 后台配置的奖品数据
+          isRunning: false, // 是否正在抽奖
+          baseRunAngle: 360 * 5, // 总共转动角度 至少5圈
+          prizeId: 0, // 中奖id
+        })
+        const prizeWrap = ref(null)
+
+
+        // 平均每个奖品角度
+        const rotateAngle = computed(() => {
+          const _degree = 360 / state.prizeList.length
+          return _degree
+        })
+
+        // 要执行总角度数
+        const totalRunAngle = computed(() => {
+          return state.baseRunAngle + 360 - state.prizeId * rotateAngle.value - rotateAngle.value / 2
+        })
+
+        // 计算绘制转盘背景
+        const bgColor = computed(() => {
+          const _len = state.prizeList.length
+          const colorList = ['#5352b3', '#363589']
+          let colorVal = ''
+          for (let i = 0; i < _len; i++) {
+            colorVal += `${colorList[i % 2]} ${rotateAngle.value * i}deg ${rotateAngle.value * (i + 1)}deg,`
+          }
+          return `
+            background: conic-gradient(${colorVal.slice(0, -1)});
+          `
+        })
+        // 每个奖品布局
+        const prizeStyle = computed(() => {
+          const _degree = rotateAngle.value
+          return (i) => {
+            return `
+              width: ${2 * 250 * Math.sin(_degree / 2 * Math.PI / 180)}px;
+              height: 250px;
+              transform: rotate(${_degree * i + _degree / 2}deg);
+              transform-origin: 50% 100%;
+            `
+          }
+        })
+       
+        onBeforeMount(()=>{
+          debugger
+          window.addEventListener('message', function (e) {
+            console.log("接收值:", e.data)
+            state.token = e.data.token;
+            state.actId = e.data.actId;
+            // ElementPlus.ElLoading.service();
+            getTurntableInfo();
+            // ElementPlus.ElLoading.service().close();
+          })
+        })
+        
+        onMounted(() => {
+         
+          prizeWrap.value.style = `${bgColor.value} transform: rotate(-${rotateAngle.value / 2}deg)`;
+        })
+
+        onUnmounted(() => {
+          prizeWrap.value.removeEventListener('transitionend', stopRun)
+        })
+
+        // 获取大转盘信息
+        async function getTurntableInfo() {
+          debugger
+          const postData = {
+            actId: state.actId,
+          };
+          let res = await httpAjax('get', '/mall-prize/prize/info', postData)
+          if (res.errno === 0) {
+            console.log('获取大转盘信息',res.data);
+            state.prizeList = res.data.pool;
+            state.rule = res.data.content;
+          } else {
+            ElementPlus.ElMessage({
+              showClose: true,
+              message: res.errmsg,
+              type: 'error',
+            });
+          }
+        };
+
+        // 大转盘抽奖按钮
+        async function starDraw() {
+          const postData = {
+              actId: state.actId,
+            };
+            let res = await httpAjax('post', '/mall-prize/prize', getFormData(postData));
+            if (res.errno === 0) {
+              console.log('抽奖',res.data);
+              state.prizeId = res.data.index;
+              startRun();
+            } else {
+              state.isRunning = false;
+              ElementPlus.ElMessage({
+                showClose: true,
+                message: res.errmsg,
+                type: 'error',
+              });
+            }  
+          
+        };
+
+        //抽奖记录
+        async function getRecordList() {
+          const postData = {
+              actId: state.actId,
+            };
+            let res = await httpAjax('get', '/mall-prize/prize/user/list', postData);
+            if (res.errno === 0) {
+              console.log('抽奖记录',res.data);
+              state.recordList = res.data;
+            } else {
+              state.isRunning = false;
+              ElementPlus.ElMessage({
+                showClose: true,
+                message: res.errmsg,
+                type: 'error',
+              });
+            }  
+          
+        };
+
+        // 简单封装ajax
+        const httpAjax = (type, url, data) => {
+          ajaxHeaders = {
+            "Authorization": state.token
+          }
+          return new Promise((resolve, reject) => {
+            $.ajax({
+              type: type,
+              url: 'http://192.168.100.208:9083/admin' + url, //本地
+              // url: "http://47.103.79.143:9085/admin" + url,//测试环境
+              // url:"https://xiaoyou.dgtis.com/admin"+ url,//正式环境
+              data: data,
+              contentType: type === 'post' ? false : true,
+              processData: type === 'post' ? false : true,
+              headers: ajaxHeaders,
+              success: function (res) {
+                if (res.errno == 503) {
+                  window.location.href = 'https://dgt.dgtis.com/oneportal/login'
+                } else {
+                  resolve(res);
+                }
+              },
+              error: function (error) {
+                reject(error);
+                ElementPlus.ElMessage({
+                  showClose: true,
+                  message: '网络错误,请稍后再试!',
+                  type: 'error',
+                });
+              }
+            })
+
+          })
+        }
+
+        // 处理formData数据格式
+        const getFormData = (datas) => {
+          let formData = new FormData();
+          for (let key in datas) {
+            formData.append(key, datas[key]);
+          }
+          return formData;
+        }
+
+        // 获取随机数
+        const getRandomNum = () => {
+          const num = Math.floor(Math.random() * state.prizeList.length)
+          return num
+        }
+        const showRules = () =>{
+          state.dialogVisible = true;
+        }
+        const showRecordList = () =>{
+          getRecordList();
+          state.dialogRecordList = true;
+        }
+        const start = () => {
+          debugger
+          // ElementPlus.ElMessage({
+          //   showClose: true,
+          //   message: '已无抽奖次数!',
+          //   type: 'warning',
+          // })
+          // return
+          if (!state.isRunning) {
+            state.isRunning = true;
+            starDraw();
+            // console.log('开始抽奖,后台请求中奖奖品')
+            // // 请求返回的奖品编号 这里使用随机数
+            // const prizeId = getRandomNum()
+            // console.log('中奖ID>>>', prizeId, state.prizeList[prizeId])
+            // state.prizeId = prizeId
+            
+          }
+        }
+
+        const startRun = () => {
+          console.log(state.isRunning, totalRunAngle.value)
+          // 设置动效
+          prizeWrap.value.style = `
+            ${bgColor.value}
+            transform: rotate(${totalRunAngle.value}deg);
+            transition: all 4s ease;
+          `
+          // 监听transition动效停止事件
+          prizeWrap.value.addEventListener('transitionend', stopRun)
+        }
+
+        const stopRun = (e) => {
+          console.log(e)
+          state.isRunning = false
+          prizeWrap.value.style = `
+            ${bgColor.value}
+            transform: rotate(${totalRunAngle.value - state.baseRunAngle}deg);
+          `
+          if(state.prizeList[state.prizeId].prizeType!='40'){
+            ElementPlus.ElMessage({
+              showClose: true,
+              message: "恭喜抽中了" + state.prizeList[state.prizeId].prizeName + "," + "请到个人中心查看。",
+              type: 'success',
+            })
+          }
+        }
+
+        return {
+          ...toRefs(state),
+          bgColor,
+          prizeStyle,
+          prizeWrap,
+          start,
+          showRules,
+          showRecordList
+        }
+      }
+    }).use(ElementPlus).mount('#app')
+  </script>
+</body>
+
+</html>

+ 3 - 0
src/App.vue

@@ -74,6 +74,9 @@ export default {
 }
 </script>
 <style>
+.el-dialog__body{
+  padding-top: 0px !important;
+}
 .view-container{
   position: relative;
   margin: 0 auto;

+ 114 - 4
src/api/allApi.js

@@ -1,5 +1,105 @@
 import request from '@/utils/request'
 
+
+//个人中心用户答题记录列表
+export function answerList(query) {
+  return request({
+    url: '/answer/user/list',
+    method: 'get',
+    params:query
+  })
+}
+
+//用户抽奖记录列表
+export function prizeList(query) {
+  return request({
+    url: '/mall-prize/prize/user/log',
+    method: 'get',
+    params:query
+  })
+}
+
+
+//用户阅读消息中心
+export function readMsg(query) {
+  return request({
+    url: '/mall-user/msg/read',
+    method: 'post',
+    params:query
+  })
+}
+
+//用户没过期兑换卷列表
+export function couponList(query) {
+  return request({
+    url: '/coupon/user/list',
+    method: 'get',
+    params:query
+  })
+}
+
+// 每日问答-首页数据
+export function homeData(query) {
+  return request({
+    url: '/answer/top',
+    method: 'get',
+    params:query
+  })
+}
+
+// 每日问答-获取题目
+export function questionList(query) {
+  return request({
+    url: '/answer/room',
+    method: 'get',
+    params:query
+  })
+}
+
+// 每日问答-提交答案
+export function submitAnswer(data) {
+  return request({
+    url: '/answer/submit',
+    method: 'post',
+    data
+  })
+}
+// 字典列表
+export function dictList(query) {
+  return request({
+    url: '/system/dict/data/type',
+    method: 'get',
+    params:query
+  })
+}
+
+// 人员列表
+export function allUserList(query) {
+  return request({
+    url: '/sys/user/getAll',
+    method: 'post',
+    params:query
+  })
+}
+
+// 客户表彰列表
+export function citeList(query) {
+  return request({
+    url: '/customer/commend/user/page',
+    method: 'get',
+    params:query
+  })
+}
+
+//客户表彰上传
+export function uploadCite(data) {
+  return request({
+    url: '/customer/commend/upload',
+    method: 'post',
+    data
+  })
+}
+
 // 初始化积分领取
 export function lockStatus(query) {
   return request({
@@ -158,7 +258,7 @@ export function start(query) {
 //福利券兑换
 export function kill(query) {
   return request({
-    url: '/mall-order/kill',
+    url: '/mall-order/coupon/start',
     method: 'post',
     data:query
   })
@@ -175,18 +275,28 @@ export function welfareType(data) {
 }
 
 
-//用户福利、兑换券列表
+//兑换券列表
+export function myWelfareList(query) {
+  return request({
+    url: '/coupon/user/centre/list',
+    method: 'get',
+    params:query
+  })
+}
+
+//用户福利
 export function welfareList(query) {
   return request({
-    url: '/mall-welfare/welfare/user/list',
+    url: '/mall-act/user/welfare/list',
     method: 'get',
     params:query
   })
 }
+
 //用户福利领取
 export function receiveWelfare(query) {
   return request({
-    url: '/mall-welfare/receive',
+    url: '/coupon/user/receive',
     method: 'post',
     params:query
   })

BIN
src/assets/image/answerGame/home/answer.png


BIN
src/assets/image/answerGame/home/exit.png


BIN
src/assets/image/answerGame/home/homeBg.png


BIN
src/assets/image/answerGame/home/rules.png


BIN
src/assets/image/answerGame/item/error.png


BIN
src/assets/image/answerGame/item/fail.png


BIN
src/assets/image/answerGame/item/finish.png


BIN
src/assets/image/answerGame/item/goHome.png


BIN
src/assets/image/answerGame/item/itemBg.png


BIN
src/assets/image/answerGame/item/right.png


BIN
src/assets/image/answerGame/item/timer.png


BIN
src/assets/image/answerGame/item/topicNum.png


BIN
src/assets/image/answerGame/qiXi/answer.png


BIN
src/assets/image/answerGame/qiXi/error.png


BIN
src/assets/image/answerGame/qiXi/exit.png


BIN
src/assets/image/answerGame/qiXi/fail.png


BIN
src/assets/image/answerGame/qiXi/finish.png


BIN
src/assets/image/answerGame/qiXi/goHome.png


BIN
src/assets/image/answerGame/qiXi/homeBg.png


BIN
src/assets/image/answerGame/qiXi/itemBg.png


BIN
src/assets/image/answerGame/qiXi/right.png


BIN
src/assets/image/answerGame/qiXi/rules.png


BIN
src/assets/image/answerGame/qiXi/timer.png


BIN
src/assets/image/answerGame/qiXi/topicNum.png


BIN
src/assets/image/recordBtn.png


+ 3 - 2
src/components/AppHeader.vue

@@ -9,9 +9,10 @@
             </router-link>
             <router-link to="/noticeCenter">
                 <div class="header-item">
-                    <!-- <el-badge :value="2" class="item"> -->
+                    <i v-if="userInfo.unreadNum==0" class="el-icon-message-solid"></i>
+                    <el-badge v-else :value="userInfo.unreadNum" :max="99" class="item">
                         <i class="el-icon-message-solid"></i>
-                    <!-- </el-badge> -->
+                    </el-badge>
                     消息中心
                 </div>
             </router-link>

+ 8 - 1
src/components/AppSidebar.vue

@@ -43,7 +43,7 @@ export default {
             },
             {
                 value:'festiveEvents',
-                name:'节日活动',
+                name:'活动列表',
                 path:'/home/festiveEvents',
                 icon:'icon-mall-huodong',
                 checked:false,
@@ -83,6 +83,13 @@ export default {
                 icon:'icon-mall-zuorenwuzhuanjifen',
                 checked:false,
             },
+            // {
+            //     value:'citeList',
+            //     name:'表彰上传',
+            //     path:'/home/citeList',
+            //     icon:'icon-mall-zuorenwuzhuanjifen',
+            //     checked:false,
+            // },
         ],
         employeeDynamics: false,
         pointsMall: false,

+ 1 - 1
src/main.js

@@ -13,7 +13,7 @@ const prodUrl = 'https://xiaoyou.dgtis.com/admin/storage/create';//正式地址
 
 // const prodUrl = 'http://47.103.79.143:9085/admin/storage/create';//阿里云地址
 
-const devUrl = 'http://192.168.100.208:9083/admin/storage/create';//测试地址
+const devUrl = 'http://47.103.79.143:9085/admin/storage/create';//测试地址
 
 const baseUrl = process.env.NODE_ENV === 'production' ? prodUrl : devUrl;
 Vue.prototype.baseUrl = baseUrl;

+ 1 - 0
src/permission.js

@@ -4,6 +4,7 @@ import { getToken, setToken } from '@/utils/auth' // getToken from cookie
 import { lockStatus,unlock } from "@/api/allApi";
 //路由跳转之前
 router.beforeEach((to, _from, next) => {
+  // setToken('3ea044ab331806ba7b38202175e1cf31');
   const path = to.path;
   const Authorization = to.query.Authorization
   if (path.indexOf('auth') != -1 && Authorization) { 

+ 21 - 1
src/router/index.js

@@ -46,6 +46,10 @@ const routes = [
         path: '/home/earnPoints',
         component: () => import('@/views/HomeView/EarnPoints.vue')
       },
+      {
+        path: '/home/citeList',
+        component: () => import('@/views/HomeView/CiteList.vue')
+      },
       {
         path: '/home/pointsMall',
         component: () => import('@/views/HomeView/PointsMall.vue')
@@ -58,6 +62,10 @@ const routes = [
         path: '/home/myCenter/goodsDetail',
         component: () => import('@/views/HomeView/GoodsDetail.vue')
       },
+      {
+        path: '/home/pointsMall/goodDetail',
+        component: () => import('@/views/HomeView/GoodDetail.vue')
+      },
       {
         path: '/home/welfareList',
         component: () => import('@/views/HomeView/WelfareList.vue')
@@ -73,7 +81,19 @@ const routes = [
       {
         path: '/home/festiveEvents/game',
         component: () => import('@/views/HomeView/Game.vue')
-      }
+      },
+      {
+        path: '/home/festiveEvents/answerGame',
+        component: () => import('@/views/HomeView/AnswerGame/AnswerGame.vue')
+      },
+      {
+        path: '/home/festiveEvents/qiXiGame',
+        component: () => import('@/views/HomeView/AnswerGame/QiXiAnswerGame.vue')
+      },
+      {
+        path: '/home/festiveEvents/drawCarouselGame',
+        component: () => import('@/views/HomeView/DrawCarouselGame/DrawCarouselGame.vue')
+      },
     ]
   },
   {

+ 2 - 0
src/utils/request.js

@@ -7,6 +7,8 @@ let prodBaseURL = 'https://xiaoyou.dgtis.com/admin';//正式地址
 // let prodBaseURL = 'http://47.103.79.143:9085/admin';//阿里云地址
 
 let devBaseURL = 'http://192.168.100.208:9083/admin';//测试地址
+
+// let devBaseURL = 'http://47.103.79.143:9085/admin';//阿里云地址
 // create an axios instance
 const service = axios.create({
   baseURL: process.env.NODE_ENV === 'production' ? prodBaseURL : devBaseURL,// api 的 base_url

+ 525 - 0
src/views/HomeView/AnswerGame/AnswerGame.vue

@@ -0,0 +1,525 @@
+<template>
+    <div class="timeline-container">
+        <div class="timeline-content">
+            <div class="timeline-entry-list">
+                <div class="gameBox">
+                    <div class="item" v-if="isShowItem==true">
+                        <div :class="{ 'dim': isDim }">
+                            <div class="integralBox">
+                                <div class="integral">{{ userInfo.surplusIntegral }}</div>
+                            </div>
+                            <div class="timer">
+                                <div class="second">{{ countdown }}</div>
+                            </div>
+                            <div class="topicNum">
+                                <div class="topic">{{itemNum+1}}/5</div>
+                            </div>
+                            <div class="questionBox" v-if="questions.length>0">
+                                <div class="title animated zoomIn">
+                                    <span style="text-align: center;">{{ questions[itemNum].ask }}</span>
+                                </div>
+                                <div class="content animated" :class="animate_showChoice" v-if="animate_showChoice">
+                                    <div v-for="(item,index) in questions[itemNum].answers" :key="index"  class="answerItem" :class="index == clickIndex ? answerColor : ''" @click="answer(item,index)">
+                                        <span>{{ item.answer }}</span>
+                                        <img v-if="index == clickIndex&&answerColor=='error'" class="invisible" src="@/assets/image/answerGame/item/error.png" alt="错误">
+                                        <img v-if="index == clickIndex&&answerColor=='right'" class="invisible" style="width: 25px;" src="@/assets/image/answerGame/item/right.png" alt="正确">
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="home" v-else>
+                        <div :class="{ 'dim': isDim }">
+                            <img class="rules" src="@/assets/image/answerGame/home/rules.png" alt="互动规则" @click="clickRuleWrapper">
+                            <div class="top" v-if="top">
+                                <span style="font-size: 18px;color: #fff;font-weight: 600;">当前排名:{{ top }}</span>
+                            </div>
+                            <img class="answer" src="@/assets/image/answerGame/home/answer.png" alt="答题按钮" @click="clickAnswer">
+                            <img class="exit" src="@/assets/image/answerGame/home/exit.png" alt="退出互动" @click="getOut">
+                        </div>
+                        
+                    </div>
+                    <div class="ruleWrapper" v-if="isRuleWrapper">
+                        <el-card class="box-card">
+                            <div slot="header" class="clearfix">
+                                <span>互动规则</span>
+                                <span style="float: right; font-size: 20px;cursor: pointer;" @click="closeRuleWrapper">
+                                    <i class="el-icon-close"></i>
+                                </span>
+                            </div>
+                            <div v-html="rule"></div>
+                        </el-card>
+                    </div>
+                    <div class="confirmWrapper" v-if="isConfirmWrapper">
+                            <img class="goHome" src="@/assets/image/answerGame/item/goHome.png" alt="返回首页" @click="clickGoHome">
+                    </div>
+                    <div class="failWrapper" v-if="isFailWrapper">
+                            <img class="goHome" src="@/assets/image/answerGame/item/goHome.png" alt="返回首页" @click="clickGoHome">
+                    </div>
+                </div>
+            </div>
+            <SiderInfo></SiderInfo>
+        </div>
+    </div>
+</template>
+<script>
+import { homeData,questionList,submitAnswer } from "@/api/allApi";
+import SiderInfo from '@/components/SiderInfo.vue';
+import { mapGetters } from 'vuex';
+export default{
+  components: {
+    SiderInfo
+  },
+  data() {
+    return {
+        actId:this.$route.query.actId,
+        roomId:'',
+        rule:'',
+        top:'',
+        isConfirmWrapper:false,
+        isFailWrapper:false,
+        animate_showChoice:'zoomIn',
+        localClick:false,
+        clickIndex:-1,
+        answerColor:'',
+        isShowItem:false,
+        isRuleWrapper: false,
+        isDim:false,
+        questions:[],
+        chooseStr: '',
+        itemNum: 0,
+        result: [],
+        timer:null,
+        countdown:60,
+    };
+  },
+  computed: {
+        // 将 getter 映射到当前组件的计算属性
+        ...mapGetters(['userInfo'])
+    },
+  created(){
+    this.getHomeData();
+  },
+  methods:{
+    getOut(){
+        this.$router.push({
+                path: '/home/festiveEvents',
+            });
+    },
+    saveAnswer(){
+        submitAnswer({answers:this.result,roomId:this.roomId}).then(response=>{
+                console.log(response.data.data);
+                this.result = [];
+            })
+    },
+    getQuestionList(){
+        questionList({}).then(response=>{
+                console.log(response.data.data);
+                this.questions = response.data.data.questions;
+                this.roomId = response.data.data.roomId;
+            })
+    },
+    getHomeData(){
+        homeData({actId:this.actId}).then(response=>{
+                console.log(response.data.data);
+                this.rule = response.data.data.rule;
+                this.top = response.data.data.top;
+            })
+    },
+    clickGoHome(){
+        this.getHomeData();
+        this.isFailWrapper = false;
+        this.isConfirmWrapper = false;
+        this.isDim = false;
+        this.isShowItem = false;
+        this.countdown = 60;
+        this.itemNum = 0;
+        this.animate_showChoice = 'fadeIn';
+        this.localClick = false;
+    },
+    timerCountdown(){
+            this.timer  = setInterval(() => {
+                this.countdown--;
+                if (this.countdown == 0) {
+                    clearInterval(this.timer);
+                    let resLength = 5 - this.result.length;
+                    for (let i = 0; i < resLength; i++) { 
+                        this.result.push('');
+                    }
+                    this.isDim = true;
+                    this.isFailWrapper = true;
+                    this.saveAnswer();
+                    console.log(this.result);
+                }
+            }, 1000)
+        },
+    answer(val,index){
+        console.log(this.itemNum);
+        if(!this.localClick && this.itemNum<5){
+            this.clickIndex = index;
+            if(val.right){
+                this.answerColor = 'right';
+            }else{
+                this.answerColor = 'error';
+            }
+            this.localClick = true;
+            setTimeout(() => {
+                this.result.push(val.answer);
+                this.clickIndex = -1;
+                this.answerColor = '';
+                this.animate_showChoice = 'fadeOut';
+                if(this.itemNum==4){
+                    clearInterval(this.timer);
+                    this.localClick = true;
+                    this.isDim = true;
+                    this.isConfirmWrapper = true;
+                    this.saveAnswer();
+                    console.log(this.result);
+                }else{
+                    this.itemNum++
+                    setTimeout(() => {
+                        this.animate_showChoice = 'fadeIn';
+                        this.localClick = false;
+                    }, 1000)
+                }
+                
+            }, 1000)
+        }
+        
+    },
+    clickAnswer(){
+        this.getQuestionList();
+            this.isShowItem = true;
+            this.timerCountdown();
+        // if(this.top){
+        //     this.$message({
+        //         message: '今日已答题!',
+        //         type: 'warning'
+        //     });
+        //     return;
+        // }else{
+        //     this.getQuestionList();
+        //     this.isShowItem = true;
+        //     this.timerCountdown();
+        // } 
+    },
+    clickRuleWrapper(){
+        this.isDim = true;
+        this.isRuleWrapper = true;
+    },
+    closeRuleWrapper(){
+        this.isDim = false;
+        this.isRuleWrapper = false;
+    }
+  },
+}
+</script>
+<style scoped>
+.animated {
+  animation-duration: 0.5s;
+  animation-fill-mode: forwards;
+}
+@keyframes zoomIn {
+  from {
+    opacity: 0;
+    transform: scale3d(.2, .2, .2);
+  }
+
+  50% {
+    opacity: 1;
+  }
+}
+.zoomIn {
+  animation-name: zoomIn;
+}
+@keyframes fadeIn {
+  from {
+    opacity: 0;
+  }
+
+  to {
+    opacity: 1;
+  }
+}
+
+.fadeIn {
+  animation-name: fadeIn;
+}
+@keyframes fadeOut {
+  from {
+    opacity: 1;
+  }
+
+  to {
+    opacity: 0;
+  }
+}
+
+.fadeOut {
+  animation-name: fadeOut;
+}
+.timeline-container{
+    margin: 0 auto;
+}
+.timeline-entry-list{
+    margin-right: 17.5rem;
+    border-radius: 2px;
+    width: 720px;
+    position: relative;
+}
+.timeline-entry-list .gameBox{
+    border-radius: 4px 4px 0 0;
+    position: relative;
+    padding: 2.667rem 0;
+    z-index: 1;
+    overflow: hidden;
+    background-color: #fff;
+    padding-left: 2.67rem;
+    padding-right: 2.67rem;
+    margin-bottom: 2rem;
+    box-sizing: border-box;
+    min-height: 280px;
+    display: flex;
+    justify-content: center;
+    align-content: center;
+}
+.gameBox .item{
+    position: relative;
+    z-index: 10;
+    background: url(@/assets/image/answerGame/item/itemBg.png) no-repeat;
+    background-size: 100% 100%;
+    width: 375px;
+    height: 667px;
+}
+.item .integralBox{
+    position: absolute;
+    top: 7.3%;
+    right: 8%;
+    width: 90px;
+    height: 35.2px;
+    /* background: greenyellow; */
+    display: flex;
+    justify-content: center;
+    line-height: 35.2px;
+}
+.integralBox .integral{
+    font-size: 16px;
+    color: orange;
+    font-weight: 600;
+}
+.item .timer{
+    position: absolute;
+    background: url(@/assets/image/answerGame/item/timer.png) no-repeat;
+    background-size: 100% 100%;
+    width: 80px;
+    height: 80px;
+    top: 15%;
+    right: 10%;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+}
+.timer .second{
+    font-size: 16px;
+    color: #fff;
+    font-weight: 600;
+}
+.item .topicNum{
+    position: absolute;
+    background: url(@/assets/image/answerGame/item/topicNum.png) no-repeat;
+    background-size: 100% 100%;
+    width: 120px;
+    height: 42px;
+    top: 25%;
+    left: 4.8%;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+}
+.topicNum .topic{
+    font-size: 16px;
+    color: #fff;
+    font-weight: 600;
+}
+.item .questionBox{
+    position: absolute;
+    width: 375px;
+    top: 28%;
+    left: 0;
+    right: 0;
+    display: flex;
+    flex-direction: column;
+    justify-content: center;
+    align-items: center;
+}
+.questionBox .title{
+    margin:auto 50px;
+    height: 180px;
+    font-size: 18px;
+    display: flex;
+    flex-direction: column;
+    justify-content: center;
+    align-items: center;
+    /* font-weight: 600; */
+}
+.content{
+    width: 100%;
+    display: flex;
+    flex-direction: column;
+    justify-content: center;
+    align-items: center;
+}
+.answerItem{
+    cursor: pointer;
+    margin: 10px 0;
+    color: #3883fa;
+    background: rgb(221, 218, 218);
+    border-radius: 20px;
+    width: 80%;
+    height: 40px;
+    line-height: 40px;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    position: relative;
+}
+.right {
+  /*选择正确的答案颜色*/
+  background: #3ede58;
+  color: #fff;
+}
+
+.error {
+  /*选择错误的答案颜色*/
+  background: #e53117;
+  color: #fff;
+}
+.invisible{
+    width: 25px;
+    position: absolute;
+    right: 15px;
+}
+.gameBox .home{
+    position: relative;
+    z-index: 10;
+    background: url(@/assets/image/answerGame/home/homeBg.png) no-repeat;
+    background-size: 100% 100%;
+    width: 375px;
+    height: 667px;
+}
+.home .rules{
+    cursor: pointer;
+    position: absolute;
+    width: 50px;
+    top: 32%;
+    left: 5%;
+}
+.home .top{
+    position: absolute;
+    bottom: 23%;
+    left: 0;
+    right: 0;
+    margin:auto;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+}
+.home .answer{
+    cursor: pointer;
+    position: absolute;
+    width: 200px;
+    bottom: 14%;
+    left: 0;
+    right: 0;
+    margin:auto;
+}
+.home .exit{
+    cursor: pointer;
+    position: absolute;
+    width: 200px;
+    bottom: 5%;
+    left: 0;
+    right: 0;
+    margin:auto;
+}
+.hidden {
+    display: none;
+}
+
+.show {
+    display: block;
+}
+
+.dim {
+    /* opacity:0.6; */
+    height:100%;
+    width:100%;
+    background: rgba(0,0,0,.4);
+    pointer-events: none;
+}
+
+  .clearfix:before,
+  .clearfix:after {
+    display: table;
+    content: "";
+  }
+  .clearfix:after {
+    clear: both
+  }
+  .ruleWrapper{
+    position: absolute;
+    top: 50%;
+    left: 50%;
+    transform: translate(-50%, -50%);
+    z-index: 12;
+  }
+  .box-card {
+    width: 350px;
+  }
+
+  .confirmWrapper{
+    position: absolute;
+    background: url(@/assets/image/answerGame/item/finish.png) no-repeat;
+    background-size: 100% 100%;
+    width: 254px;
+    height: 260px;
+    top: 50%;
+    left: 50%;
+    transform: translate(-50%, -50%);
+    z-index: 12;
+    display: flex;
+    justify-content: center;
+    align-items: flex-end;
+  }
+  .confirmWrapper .goHome{
+    cursor: pointer;
+    width: 112px;
+    height: 55px;
+  }
+
+  .failWrapper{
+    position: absolute;
+    background: url(@/assets/image/answerGame/item/fail.png) no-repeat;
+    background-size: 100% 100%;
+    width: 240px;
+    height: 208.5px;
+    top: 50%;
+    left: 50%;
+    transform: translate(-50%, -50%);
+    z-index: 12;
+    display: flex;
+    justify-content: center;
+    align-items: flex-end;
+  }
+  .failWrapper .goHome{
+    cursor: pointer;
+    width: 112px;
+    height: 55px;
+  }
+  
+</style>
+<style>
+.el-card__header {
+    padding: 10px 20px !important;
+}
+</style>

+ 525 - 0
src/views/HomeView/AnswerGame/QiXiAnswerGame.vue

@@ -0,0 +1,525 @@
+<template>
+    <div class="timeline-container">
+        <div class="timeline-content">
+            <div class="timeline-entry-list">
+                <div class="gameBox">
+                    <div class="item" v-if="isShowItem==true">
+                        <div :class="{ 'dim': isDim }">
+                            <div class="timer">
+                                <div class="second">{{ countdown }}</div>
+                            </div>
+                            <div class="topicNum">
+                                <div class="topic">{{itemNum+1}}/5</div>
+                            </div>
+                            <div class="questionBox" v-if="questions.length>0">
+                                <div class="title animated zoomIn">
+                                    <span style="text-align: center;">{{ questions[itemNum].ask }}</span>
+                                </div>
+                                <div class="content animated" :class="animate_showChoice" v-if="animate_showChoice">
+                                    <div v-for="(item,index) in questions[itemNum].answers" :key="index"  class="answerItem" :class="index == clickIndex ? answerColor : ''" @click="answer(item,index)">
+                                        <span>{{ item.answer }}</span>
+                                        <img v-if="index == clickIndex&&answerColor=='error'" class="invisible" src="@/assets/image/answerGame/qiXi/error.png" alt="错误">
+                                        <img v-if="index == clickIndex&&answerColor=='right'" class="invisible" style="width: 25px;" src="@/assets/image/answerGame/qiXi/right.png" alt="正确">
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                        
+                    </div>
+                    <div class="home" v-else>
+                        <div :class="{ 'dim': isDim }">
+                                <img class="rules" src="@/assets/image/answerGame/qiXi/rules.png" alt="互动规则" @click="clickRuleWrapper">
+                            <div class="top" v-if="top">
+                                <span style="font-size: 18px;color: #fff;font-weight: 600;">排名:{{ top }}</span>
+                            </div>
+                            <img class="answer" src="@/assets/image/answerGame/qiXi/answer.png" alt="答题按钮" @click="clickAnswer">
+                            <img class="exit" src="@/assets/image/answerGame/qiXi/exit.png" alt="退出互动" @click="getOut">
+                        </div>
+                        
+                    </div>
+                    <div class="ruleWrapper" v-if="isRuleWrapper">
+                        <el-card class="box-card">
+                            <div slot="header" class="clearfix">
+                                <span>互动规则</span>
+                                <span style="float: right; font-size: 20px;cursor: pointer;" @click="closeRuleWrapper">
+                                    <i class="el-icon-close"></i>
+                                </span>
+                            </div>
+                            <div v-html="rule"></div>
+                        </el-card>
+                    </div>
+                    <div class="confirmWrapper" v-if="isConfirmWrapper">
+                            <img class="goHome" src="@/assets/image/answerGame/qiXi/goHome.png" alt="返回首页" @click="clickGoHome">
+                    </div>
+                    <div class="failWrapper" v-if="isFailWrapper">
+                            <img class="goHome" src="@/assets/image/answerGame/qiXi/goHome.png" alt="返回首页" @click="clickGoHome">
+                    </div>
+                </div>
+            </div>
+            <SiderInfo></SiderInfo>
+        </div>
+    </div>
+</template>
+<script>
+import { homeData,questionList,submitAnswer } from "@/api/allApi";
+import SiderInfo from '@/components/SiderInfo.vue';
+import { mapGetters } from 'vuex';
+export default{
+  components: {
+    SiderInfo
+  },
+  data() {
+    return {
+        actId:this.$route.query.actId,
+        roomId:'',
+        rule:'',
+        top:'',
+        isConfirmWrapper:false,
+        isFailWrapper:false,
+        animate_showChoice:'zoomIn',
+        localClick:false,
+        clickIndex:-1,
+        answerColor:'',
+        isShowItem:false,
+        isRuleWrapper: false,
+        isDim:false,
+        questions:[],
+        chooseStr: '',
+        itemNum: 0,
+        result: [],
+        timer:null,
+        countdown:60,
+    };
+  },
+  computed: {
+        // 将 getter 映射到当前组件的计算属性
+        ...mapGetters(['userInfo'])
+    },
+  created(){
+    this.getHomeData();
+  },
+  methods:{
+    getOut(){
+        this.$router.push({
+                path: '/home/festiveEvents',
+            });
+    },
+    saveAnswer(){
+        submitAnswer({answers:this.result,roomId:this.roomId}).then(response=>{
+                console.log(response.data.data);
+                this.result = [];
+            })
+    },
+    getQuestionList(){
+        questionList({}).then(response=>{
+                console.log(response.data.data);
+                this.questions = response.data.data.questions;
+                this.roomId = response.data.data.roomId;
+            })
+    },
+    getHomeData(){
+        homeData({actId:this.actId}).then(response=>{
+                console.log(response.data.data);
+                this.rule = response.data.data.rule;
+                this.top = response.data.data.top;
+            })
+    },
+    clickGoHome(){
+        this.getHomeData();
+        this.isFailWrapper = false;
+        this.isConfirmWrapper = false;
+        this.isDim = false;
+        this.isShowItem = false;
+        this.countdown = 60;
+        this.itemNum = 0;
+        this.animate_showChoice = 'fadeIn';
+        this.localClick = false;
+    },
+    timerCountdown(){
+            this.timer  = setInterval(() => {
+                this.countdown--;
+                if (this.countdown == 0) {
+                    clearInterval(this.timer);
+                    let resLength = 5 - this.result.length;
+                    for (let i = 0; i < resLength; i++) { 
+                        this.result.push('');
+                    }
+                    this.isDim = true;
+                    this.isFailWrapper = true;
+                    this.saveAnswer();
+                    console.log(this.result);
+                }
+            }, 1000)
+        },
+    answer(val,index){
+        console.log(this.itemNum);
+        if(!this.localClick && this.itemNum<5){
+            this.clickIndex = index;
+            if(val.right){
+                this.answerColor = 'right';
+            }else{
+                this.answerColor = 'error';
+            }
+            this.localClick = true;
+            setTimeout(() => {
+                this.result.push(val.answer);
+                this.clickIndex = -1;
+                this.answerColor = '';
+                this.animate_showChoice = 'fadeOut';
+                if(this.itemNum==4){
+                    clearInterval(this.timer);
+                    this.localClick = true;
+                    this.isDim = true;
+                    this.isConfirmWrapper = true;
+                    this.saveAnswer();
+                    console.log(this.result);
+                }else{
+                    setTimeout(() => {
+                        this.itemNum++
+                        this.animate_showChoice = 'fadeIn';
+                        this.localClick = false;
+                    }, 1000)
+                }
+                
+            }, 1000)
+        }
+        
+    },
+    clickAnswer(){
+        this.getQuestionList();
+            this.isShowItem = true;
+            this.timerCountdown();
+        // if(this.top){
+        //     this.$message({
+        //         message: '今日已答题!',
+        //         type: 'warning'
+        //     });
+        //     return;
+        // }else{
+        //     this.getQuestionList();
+        //     this.isShowItem = true;
+        //     this.timerCountdown();
+        // } 
+    },
+    clickRuleWrapper(){
+        this.isDim = true;
+        this.isRuleWrapper = true;
+    },
+    closeRuleWrapper(){
+        this.isDim = false;
+        this.isRuleWrapper = false;
+    }
+  },
+}
+</script>
+<style scoped>
+.animated {
+  animation-duration: 0.5s;
+  animation-fill-mode: forwards;
+}
+@keyframes zoomIn {
+  from {
+    opacity: 0;
+    transform: scale3d(.2, .2, .2);
+  }
+
+  50% {
+    opacity: 1;
+  }
+}
+.zoomIn {
+  animation-name: zoomIn;
+}
+@keyframes fadeIn {
+  from {
+    opacity: 0;
+  }
+
+  to {
+    opacity: 1;
+  }
+}
+
+.fadeIn {
+  animation-name: fadeIn;
+}
+@keyframes fadeOut {
+  from {
+    opacity: 1;
+  }
+
+  to {
+    opacity: 0;
+  }
+}
+
+.fadeOut {
+  animation-name: fadeOut;
+}
+.timeline-container{
+    margin: 0 auto;
+}
+.timeline-entry-list{
+    margin-right: 17.5rem;
+    border-radius: 2px;
+    width: 720px;
+    position: relative;
+}
+.timeline-entry-list .gameBox{
+    border-radius: 4px 4px 0 0;
+    position: relative;
+    padding: 2.667rem 0;
+    z-index: 1;
+    overflow: hidden;
+    background-color: #fff;
+    padding-left: 2.67rem;
+    padding-right: 2.67rem;
+    margin-bottom: 2rem;
+    box-sizing: border-box;
+    min-height: 280px;
+    display: flex;
+    justify-content: center;
+    align-content: center;
+}
+.gameBox .item{
+    position: relative;
+    z-index: 10;
+    background: url(@/assets/image/answerGame/qiXi/itemBg.png) no-repeat;
+    background-size: 100% 100%;
+    width: 375px;
+    height: 667px;
+}
+.item .integralBox{
+    position: absolute;
+    top: 7.3%;
+    right: 8%;
+    width: 90px;
+    height: 35.2px;
+    /* background: greenyellow; */
+    display: flex;
+    justify-content: center;
+    line-height: 35.2px;
+}
+.integralBox .integral{
+    font-size: 16px;
+    color: orange;
+    font-weight: 600;
+}
+.item .timer{
+    position: absolute;
+    background: url(@/assets/image/answerGame/qiXi/timer.png) no-repeat;
+    background-size: 100% 100%;
+    width: 80px;
+    height: 80px;
+    top: 5%;
+    right: 10%;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+}
+.timer .second{
+    font-size: 16px;
+    color: #fff;
+    font-weight: 600;
+}
+.item .topicNum{
+    position: absolute;
+    background: url(@/assets/image/answerGame/qiXi/topicNum.png) no-repeat;
+    background-size: 100% 100%;
+    width: 120px;
+    height: 42px;
+    top: 14%;
+    left: 4.5%;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+}
+.topicNum .topic{
+    font-size: 16px;
+    color: #fff;
+    font-weight: 600;
+}
+.item .questionBox{
+    position: absolute;
+    width: 375px;
+    top: 18%;
+    left: 0;
+    right: 0;
+    display: flex;
+    flex-direction: column;
+    justify-content: center;
+    align-items: center;
+}
+.questionBox .title{
+    margin:auto 50px;
+    height: 180px;
+    font-size: 18px;
+    display: flex;
+    flex-direction: column;
+    justify-content: center;
+    align-items: center;
+    /* font-weight: 600; */
+}
+.content{
+    width: 100%;
+    display: flex;
+    flex-direction: column;
+    justify-content: center;
+    align-items: center;
+}
+.answerItem{
+    cursor: pointer;
+    margin: 10px 0;
+    color: #bc2641;
+    background: rgb(221, 218, 218);
+    border-radius: 20px;
+    width: 80%;
+    height: 40px;
+    line-height: 40px;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    position: relative;
+}
+.right {
+  /*选择正确的答案颜色*/
+  background: #3ede58;
+  color: #fff;
+}
+
+.error {
+  /*选择错误的答案颜色*/
+  background: #e53117;
+  color: #fff;
+}
+.invisible{
+    width: 25px;
+    position: absolute;
+    right: 15px;
+}
+.gameBox .home{
+    position: relative;
+    z-index: 10;
+    background: url(@/assets/image/answerGame/qiXi/homeBg.png) no-repeat;
+    background-size: 100% 100%;
+    width: 375px;
+    height: 667px;
+}
+.home .rules{
+    cursor: pointer;
+    position: absolute;
+    width: 50px;
+    top: 22%;
+    left: 2%;
+}
+.home .top{
+    position: absolute;
+    bottom: 18.5%;
+    left: 0;
+    right: 0;
+    margin:auto;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+}
+.home .answer{
+    cursor: pointer;
+    position: absolute;
+    width: 200px;
+    bottom: 10%;
+    left: 0;
+    right: 0;
+    margin:auto;
+}
+.home .exit{
+    cursor: pointer;
+    position: absolute;
+    width: 200px;
+    bottom: 2%;
+    left: 0;
+    right: 0;
+    margin:auto;
+}
+.hidden {
+    display: none;
+}
+
+.show {
+    display: block;
+}
+
+.dim {
+    /* opacity:0.6; */
+    height:100%;
+    width:100%;
+    background: rgba(0,0,0,.4);
+    pointer-events: none;
+}
+
+  .clearfix:before,
+  .clearfix:after {
+    display: table;
+    content: "";
+  }
+  .clearfix:after {
+    clear: both
+  }
+  .ruleWrapper{
+    position: absolute;
+    top: 50%;
+    left: 50%;
+    transform: translate(-50%, -50%);
+    z-index: 12;
+  }
+  .box-card {
+    width: 350px;
+  }
+
+  .confirmWrapper{
+    position: absolute;
+    background: url(@/assets/image/answerGame/qiXi/finish.png) no-repeat;
+    background-size: 100% 100%;
+    width: 240px;
+    height: 275px;
+    top: 50%;
+    left: 50%;
+    transform: translate(-50%, -50%);
+    z-index: 12;
+    display: flex;
+    justify-content: center;
+    align-items: flex-end;
+  }
+  .confirmWrapper .goHome{
+    cursor: pointer;
+    width: 100px;
+    height: 40px;
+    margin-bottom: 20px;
+  }
+
+  .failWrapper{
+    position: absolute;
+    background: url(@/assets/image/answerGame/qiXi/fail.png) no-repeat;
+    background-size: 100% 100%;
+    width: 240px;
+    height: 208.5px;
+    top: 50%;
+    left: 50%;
+    transform: translate(-50%, -50%);
+    z-index: 12;
+    display: flex;
+    justify-content: center;
+    align-items: flex-end;
+  }
+  .failWrapper .goHome{
+    cursor: pointer;
+    width: 100px;
+    height: 40px;
+    margin-bottom: 20px;
+  }
+  
+</style>
+<style>
+.el-card__header {
+    padding: 10px 20px !important;
+}
+</style>

+ 492 - 0
src/views/HomeView/CiteList.vue

@@ -0,0 +1,492 @@
+<template>
+  <div class="right-wrap">
+    <div class="myTabs" style="background: #fff;min-height: 500px;">
+      <el-tabs style="padding: 0 20px 40px 20px;" v-model="activeName" @tab-click="handleClick">
+        <el-tab-pane label="表彰列表" name="first">
+          <el-button size="small" type="primary" @click="dialogVisibleCite = true">上传表彰</el-button>
+          <el-table size="small" :data="dataListCite" border style="margin-top: 20px;width: 960px">
+            <el-table-column align="center" type="index" width="50" label="序号"></el-table-column>
+            <el-table-column align="center" min-width="200" label="附件">
+              <template slot-scope="props">
+                <div v-for="(item, index) in props.row.files" :key="index">
+                  <a style="color: #1e80ff;" target="_blank" :href="item.url">{{ item.oldName }}</a>
+                </div>
+
+              </template>
+            </el-table-column>
+            <el-table-column align="center" prop="typeName" min-width="100" label="表彰类型"></el-table-column>
+            <el-table-column align="center" min-width="100" label="表彰人员">
+              <template slot-scope="props">
+                <div v-for="(item, index) in props.row.groupUsers" :key="index">
+                    {{ item.userName }}
+                </div>
+              </template>
+            </el-table-column>
+            <el-table-column align="center" prop="customerName" min-width="100" label="客户名称"></el-table-column>
+            <el-table-column align="center" prop="title" min-width="100" label="表彰名称"></el-table-column>
+            <el-table-column min-width="150" align="center" prop="content" label="表彰描述"></el-table-column>
+            <el-table-column min-width="120" align="center" label="状态">
+              <template slot-scope="props">
+                <el-popover trigger="hover">
+                  <el-table :data="props.row.logs" border size="mini">
+                    <el-table-column min-width="80" align="center" prop="auditor" label="处理人"></el-table-column>
+                    <el-table-column min-width="160" align="center" prop="comment" label="处理结果"></el-table-column>
+                    <!-- <el-table-column min-width="120" align="center" prop="statusName" label="状态"></el-table-column> -->
+                    <el-table-column min-width="180" align="center" prop="createTime" label="处理时间"></el-table-column>
+                  </el-table>
+                  <span style="color: #1e80ff;cursor: pointer;" slot="reference">{{ props.row.statusName }}</span>
+                </el-popover>
+              </template>
+            </el-table-column>
+            <el-table-column min-width="150" align="center" prop="createTime" label="上传时间"></el-table-column>
+          </el-table>
+          <!-- 分页 -->
+          <div class="myPage">
+            <el-pagination @size-change="handleSizeChangeCite" @current-change="handleCurrentChangeCite"
+              :current-page="currentPage" :page-sizes="[10, 20, 30, 40]" :page-size="10"
+              layout="total, sizes, prev, pager, next, jumper" :totalCite="totalCite">
+            </el-pagination>
+          </div>
+        </el-tab-pane>
+
+      </el-tabs>
+    </div>
+    <el-dialog title="上传表彰" :visible.sync="dialogVisibleCite" width="40%">
+      <el-form :rulesCite="rulesCite" ref="dataFormCite" :model="dataFormCite" label-width="100px">
+        <el-form-item label="表彰类型:" prop="type">
+          <el-select clearable size="small" style="width: 95%;" v-model="dataFormCite.type" placeholder="请选择表彰类型">
+            <el-option v-for="item in typeListCite" :key="item.dictValue" :label="item.dictLabel" :value="item.dictValue">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item v-if="dataFormCite.type=='1'" label="集体人员:" prop="groupIds">
+          <el-select size="small" v-model="dataFormCite.groupIds" multiple filterable placeholder="请选择" style="width: 95%;">
+            <el-option :key="item.loginId" v-for="item in recipientsList" :label="item.deptName+'_'+item.userName+'_'+item.employeNo" :value="item.loginId">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="客户名称:" prop="customerName">
+          <el-input clearable style="width: 95%;" size="small" v-model="dataFormCite.customerName"></el-input>
+        </el-form-item>
+        <el-form-item label="表彰名称:" prop="title">
+          <el-input clearable style="width: 95%;" size="small" v-model="dataFormCite.title"></el-input>
+        </el-form-item>
+        <el-form-item label="表彰描述:" prop="title">
+          <el-input  type="textarea" :rows="2" clearable style="width: 95%;" size="small" v-model="dataFormCite.content"></el-input>
+        </el-form-item>
+        <el-form-item label="表彰附件:" prop="fileIds">
+          <el-upload :action="fileUrl" :file-list="dataFormCite.files" :on-success="handleAvatarSuccessCite"
+            :before-upload="beforeUploadFileCite" :on-remove="handleRemoveCite">
+            <el-button size="small" type="primary">点击上传</el-button>
+          </el-upload>
+        </el-form-item>
+       
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+        <el-button size="small" type="primary" @click="submitFormCite">确 定</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+<script scoped>
+import { dictList, allUserList, citeList, uploadCite } from "@/api/allApi";
+export default {
+  data() {
+    return {
+      typeListCite: [],
+      recipientsList:[],
+      activeName: 'first',
+      fileUrl: this.baseUrl,
+      dataListCite: [],
+      dialogVisibleCite: false,
+      rulesCite: {
+        type: [{ required: true, message: "请选择表彰类型", trigger: "blur" }],
+        groupIds: [{ required: true, message: "请选择集体人员", trigger: "blur" }],
+        customerName: [{ required: true, message: "请填写客户名称", trigger: "blur" }],
+        title: [{ required: true, message: "请填写表彰名称", trigger: "blur" }],
+        fileIds: [{ required: true, message: "请上传附件", trigger: "blur" }],
+        content: [{ required: true, message: "请填写表彰描述", trigger: "blur" }],
+      },
+      totalCite: 0,
+      listQueryCite: {
+        page: 1,
+        limit: 10,
+      },
+      dataFormCite: {
+        type: '',
+        groupIds:[],
+        customerName:'',
+        title:'',
+        fileIds: '',
+        files:[],
+        content:''
+      }
+    };
+  },
+  created() {
+    this.getTypeListCite();
+    this.getAllUserList();
+    this.getDataListCite();
+  },
+  methods: {
+    getTypeListCite(){
+      dictList({dictType:'customer_treward_type'}).then(response=>{
+                this.typeListCite = response.data.data; 
+            })
+    },
+    getAllUserList() {
+            allUserList().then(response => {
+                this.recipientsList = response.data.data;
+            }).catch(() => {});
+        },
+    handleClick(tab, event) {
+      console.log(tab.name, event);
+    },
+    handleRemoveCite(file, fileList) {
+      console.log(file, fileList);
+      let fileIds = [];
+      for (let i in fileList) {
+        let id = fileList[i].response.data.id;
+        fileIds.push(id);
+      }
+      this.dataFormCite.fileIds = fileIds.join(",");
+    },
+    beforeUploadFileCite(file) {
+      console.log(file);
+      const size = file.size / 1024 / 1024;
+      console.log(size);
+        if(size > 10 ){
+          this.$message.error("文件大小不能超过10MB!");
+            return false;
+        }
+    },
+    handleAvatarSuccessCite(res, file, fileList) {
+      console.log(file, fileList);
+      console.log("------", "==========");
+      console.log("res = ", res);
+
+      let fileIds = [];
+      for (let i in fileList) {
+        let response = fileList[i].response;
+        if (response.errno && response.errno != "0") {
+          this.$message.error("该文件上传失败,已被移除,请重新上传!");
+          // 上传失败移除该 file 对象
+          fileList.splice(i, 1);
+        } else {
+          let id = fileList[i].response.data.id;
+          fileIds.push(id);
+        }
+      }
+      this.dataFormCite.fileIds = fileIds.join(",");
+    },
+    submitFormCite() {
+      this.$refs['dataFormCite'].validate((valid) => {
+        if (valid) {
+          uploadCite(this.dataFormCite)
+            .then((response) => {
+              this.dialogVisibleCite = false;
+              this.$notify({
+                title: "成功",
+                message: "表彰上传成功",
+                type: "success",
+                duration: 2000,
+              });
+              this.dataFormCite.type = [],
+              this.dataFormCite.fileIds = '',
+              this.dataFormCite.files = [],
+              this.getDataListCite();
+            })
+            .catch(() => { });
+        } else {
+          return false;
+        }
+      });
+    },
+    getDataListCite() {
+      citeList(this.listQueryCite).then(response => {
+        this.dataListCite = response.data.data.items;
+        this.totalCite = response.data.data.totalCite;
+      })
+    },
+    handleSizeChangeCite(val) {
+      this.listQueryCite.limit = val
+      this.getDataListCite()
+    },
+    handleCurrentChangeCite(val) {
+      this.listQueryCite.page = val
+      this.getDataListCite()
+    },
+
+  },
+};
+</script>
+<style scoped>
+.right-wrap {
+  width: 100%;
+}
+
+.myPage {
+  margin-top: 30px;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+}
+
+.gainList_container {
+  min-height: 560px;
+}
+
+.gainList_container .gains_wrapper {
+  position: relative;
+  box-sizing: border-box;
+  padding-top: 20px;
+  padding-left: 20px;
+}
+
+.gainList_container .gains_wrapper .list {
+  display: flex;
+  flex-wrap: wrap;
+  margin: -20px 0 0 -20px;
+}
+
+.item.isVirtual {
+  background: #f7f8fa;
+  border: 1px solid #e5e6eb;
+}
+
+.item {
+  display: flex;
+  align-items: center;
+  flex: 0 1 auto;
+  width: calc(50% - 30px);
+  min-width: 410px;
+  height: 116px;
+  padding-right: 6px;
+  background: #fff;
+  border: 1px solid #e5e6eb;
+  box-sizing: border-box;
+  border-radius: 4px;
+  margin-right: 20px;
+  margin-top: 20px;
+}
+
+.item .img-wapper {
+  width: 114px;
+  height: 114px;
+  margin-right: 16px;
+  background: #f7f8fa;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+
+.item .img-wapper .item-icon {
+  max-width: 72px;
+  max-height: 72px;
+}
+
+.item .main {
+  flex: auto;
+}
+
+.item .date,
+.item .goods_name {
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+
+.item .goods_name {
+  display: -webkit-box;
+  -webkit-box-orient: vertical;
+  -webkit-line-clamp: 1;
+  font-size: 16px;
+  line-height: 24px;
+  color: #252933;
+  padding-bottom: 4px;
+}
+
+.item p {
+  margin: 0;
+}
+
+.item .date {
+  white-space: nowrap;
+  font-size: 14px;
+  line-height: 22px;
+  color: #8a919f;
+}
+
+.item .buttons {
+  margin-top: 8px;
+  margin-left: -8px;
+  display: flex;
+  align-items: center;
+}
+
+.item .button-item.actived {
+  background: #f2f3f5;
+  color: #8a919f;
+}
+
+.item .button-item {
+  cursor: pointer;
+  display: flex;
+  align-items: center;
+  font-size: 13px;
+  padding: 0 8px;
+  height: 26px;
+  margin-left: 8px;
+  font-weight: 500;
+  background: #f2f3f5;
+  border-radius: 50px;
+  color: #8a919f;
+  white-space: nowrap;
+  border: none;
+}
+
+.item .arrow {
+  width: 12px;
+  height: 12px;
+  margin-left: 2px;
+  transform: rotate(-90deg);
+}
+
+svg:not(:root) {
+  overflow: hidden;
+}
+
+.item .button-item svg path {
+  fill: currentColor;
+}
+
+.status {
+  margin-right: 30px;
+  font-size: 13px;
+}
+
+.status.bottom {
+  margin-top: 55px;
+}
+
+.status .use-btn {
+  color: #1e80ff;
+}
+
+.timeline-container {
+  margin: 0 auto;
+}
+
+.timeline-entry-list {
+  margin-right: 17.5rem;
+  border-radius: 2px;
+  width: 720px;
+  position: relative;
+}
+
+.entry-list-container {
+  background-color: #fff;
+  border-radius: 4px;
+  min-height: 500px;
+}
+
+.entry-list-container .tab-header {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  padding: 20px 20px 16px;
+  border-bottom: 1px solid #e5e6eb;
+  overflow: hidden;
+}
+
+.tab-header .tab-title {
+  white-space: nowrap;
+  font-size: 18px;
+  font-weight: 600;
+}
+
+.content-body {
+  padding: 10px 20px 16px;
+}
+
+.serie {
+  margin: 0 0 40px;
+}
+
+.serie .serie-title {
+  height: 32px;
+  width: 100%;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  text-align: center;
+  margin-bottom: 20px;
+}
+
+.serie .serie-title .title {
+  font-style: normal;
+  font-weight: 600;
+  font-size: 20px;
+  color: #1d2129;
+  margin: 0 16px;
+}
+
+.serie .serie-title .series-left,
+.serie .serie-title .series-right {
+  width: 16px;
+  height: 2px;
+}
+
+img {
+  border-style: none;
+}
+
+.serie .badge-icon-list {
+  display: grid;
+  justify-content: space-between;
+  grid-template-columns: repeat(auto-fill, 150px);
+  grid-gap: 10px 20px;
+  flex-wrap: wrap;
+}
+
+.serie .badge-icon-list .badge-icon-item {
+  -webkit-tap-highlight-color: transparent;
+  cursor: pointer;
+  width: 150px;
+  font-style: normal;
+  font-weight: 400;
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  align-items: center;
+}
+
+.serie .badge-icon-list .badge-icon-item .badge-item-icon {
+  width: 65px;
+  height: 65px;
+}
+
+.serie .badge-icon-list .badge-icon-item .badge-item-icon .not-obtain {
+  filter: grayscale(100%);
+}
+
+.serie .badge-icon-list .badge-icon-item .badge-item-icon img {
+  width: 100%;
+  height: 100%;
+}
+
+.serie .badge-icon-list .badge-icon-item .badge-desc {
+  /* margin-top: -10px; */
+  text-align: center;
+  color: #1d2129;
+  font-size: 16px;
+  line-height: 28px;
+}
+
+.serie .badge-icon-list .badge-icon-item .obtain-date {
+  font-size: 14px;
+  text-align: center;
+  color: #86909c;
+  height: 24px;
+  line-height: 24px;
+}
+</style>

+ 67 - 0
src/views/HomeView/DrawCarouselGame/DrawCarouselGame.vue

@@ -0,0 +1,67 @@
+<template>
+    <div class="timeline-container">
+        <div class="timeline-content">
+            <div class="timeline-entry-list">
+                <div class="gameBox">
+                    <iframe id="iframe"  frameborder="0" :src="src" style="width: 100%;height: 100%;"></iframe>
+                </div>
+            </div>
+            <SiderInfo></SiderInfo>
+        </div>
+    </div>
+</template>
+<script>
+import SiderInfo from '@/components/SiderInfo.vue'
+import { getToken } from '@/utils/auth'
+export default{
+  components: {
+    SiderInfo
+  },
+  data() {
+    return {
+            src: this.$route.query.url ? this.$route.query.url : './drawCarousel.html', //需要加载的子页面url
+            actId:this.$route.query.actId
+        };
+  },
+  created(){},
+  async mounted(){
+	    var that = this
+	    this.iframe = document.getElementById('iframe');
+	    this.iframe.onload = function(){
+	        // iframe加载完成后要进行的操作
+	        that.postMsg()
+	    };
+	},
+	methods: {
+        async postMsg() {
+        	//将token传递给子页面
+            let token = getToken();
+            let actId = this.actId;
+            let param = {
+                token,
+                actId
+            }
+          	this.iframe.contentWindow.postMessage(param,'*')
+        },
+    }
+}
+</script>
+<style scoped>
+.timeline-container{
+    margin: 0 auto;
+}
+.timeline-entry-list{
+    margin-right: 17.5rem;
+    border-radius: 2px;
+    
+    position: relative;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+}
+.timeline-entry-list .gameBox{
+    width: 720px;
+    height: 720px;
+    background-color: #fff;
+}
+</style>

+ 264 - 22
src/views/HomeView/EarnPoints.vue

@@ -4,7 +4,7 @@
       <el-tabs style="padding: 0 20px 40px 20px;" v-model="activeName" @tab-click="handleClick">
         <el-tab-pane label="证书列表" name="first">
           <el-button size="small" type="primary" @click="dialogVisible = true">上传证书</el-button>
-          <el-table size="small" :data="dataList" border style="margin-top: 20px;width: 100%">
+          <el-table size="small" :data="dataList" border style="margin-top: 20px;width: 960px">
             <el-table-column align="center" type="index" width="50" label="序号"></el-table-column>
             <el-table-column align="center" min-width="200" label="附件">
               <template slot-scope="props">
@@ -20,7 +20,13 @@
             <el-table-column align="center" prop="integral" min-width="100" label="积分"></el-table-column>
             <el-table-column min-width="60" align="center" prop="statusName" label="状态"></el-table-column>
             <el-table-column min-width="150" align="center" prop="createTime" label="上传时间"></el-table-column>
-            <el-table-column min-width="150" align="center" prop="content" label="备注"></el-table-column>
+            <el-table-column min-width="80" align="center" label="备注">
+              <template slot-scope="props">
+                <el-popover width="200" trigger="hover" :content="props.row.content">
+                  <div slot="reference" class="text-overflow">{{ props.row.content }}</div>
+                </el-popover>
+              </template>
+            </el-table-column>
           </el-table>
           <!-- 分页 -->
           <div class="myPage">
@@ -30,6 +36,77 @@
             </el-pagination>
           </div>
         </el-tab-pane>
+        <el-tab-pane label="表彰列表" name="third">
+          <el-button size="small" type="primary" @click="dialogVisibleCite = true">上传表彰</el-button>
+          <el-table size="small" :data="dataListCite" border style="margin-top: 20px;width: 960px">
+            <el-table-column align="center" type="index" width="50" label="序号"></el-table-column>
+            <el-table-column align="center" min-width="200" label="附件">
+              <template slot-scope="props">
+                <div v-for="(item, index) in props.row.files" :key="index">
+                  <a style="color: #1e80ff;" target="_blank" :href="item.url">{{ item.oldName }}</a>
+                </div>
+
+              </template>
+            </el-table-column>
+            <el-table-column align="center" prop="typeName" min-width="80" label="表彰类型"></el-table-column>
+            <el-table-column align="center" min-width="100" label="表彰人员">
+              <template slot-scope="props">
+                <el-popover trigger="hover">
+                  <el-table :data="props.row.groupUsers" border size="mini">
+                    <el-table-column min-width="200" align="center" prop="deptName" label="部门"></el-table-column>
+                    <el-table-column min-width="100" align="center" prop="userName" label="姓名"></el-table-column>
+                    <el-table-column min-width="100" align="center" prop="employeNo" label="员工号"></el-table-column>
+                  </el-table>
+                  <span style="color: #1e80ff;cursor: pointer;" slot="reference">
+                    {{ props.row.userName }}
+                  </span>
+                </el-popover>
+              </template>
+            </el-table-column>
+            <el-table-column align="center" min-width="100" label="客户名称">
+              <template slot-scope="props">
+                <el-popover width="200" trigger="hover" :content="props.row.customerName">
+                  <div slot="reference" class="text-overflow">{{ props.row.customerName }}</div>
+                </el-popover>
+              </template>
+            </el-table-column>
+            <el-table-column align="center" min-width="100" label="表彰名称">
+              <template slot-scope="props">
+                <el-popover width="200" trigger="hover" :content="props.row.title">
+                  <div slot="reference" class="text-overflow">{{ props.row.title }}</div>
+                </el-popover>
+              </template>
+            </el-table-column>
+            <el-table-column min-width="100" align="center" label="表彰描述">
+              <template slot-scope="props">
+                <el-popover width="400" trigger="hover" :content="props.row.content">
+                  <div slot="reference" class="text-overflow">{{ props.row.content }}</div>
+                </el-popover>
+              </template>
+            </el-table-column>
+            <el-table-column min-width="100" align="center" label="状态">
+              <template slot-scope="props">
+                <el-popover trigger="hover">
+                  <el-table :data="props.row.logs" border size="mini">
+                    <el-table-column min-width="120" align="center" prop="auditor" label="处理人"></el-table-column>
+                    <el-table-column min-width="160" align="center" prop="comment" label="处理结果"></el-table-column>
+                    <!-- <el-table-column min-width="120" align="center" prop="statusName" label="状态"></el-table-column> -->
+                    <el-table-column min-width="180" align="center" prop="createTime" label="处理时间"></el-table-column>
+                  </el-table>
+                  <span style="color: #1e80ff;cursor: pointer;" slot="reference">{{ props.row.statusName }}</span>
+                </el-popover>
+              </template>
+            </el-table-column>
+            <el-table-column min-width="120" align="center" prop="createTime" label="上传时间"></el-table-column>
+          </el-table>
+          <!-- 分页 -->
+          <div class="myPage">
+            <el-pagination @size-change="handleSizeChangeCite" @current-change="handleCurrentChangeCite"
+              :current-page="currentPage" :page-sizes="[10, 20, 30, 40]" :page-size="10"
+              layout="total, sizes, prev, pager, next, jumper" :total="totalCite">
+            </el-pagination>
+          </div>
+        </el-tab-pane>
         <el-tab-pane label="积分获取规则" name="second">
           <el-empty v-if="!integralRules" :image-size="200"></el-empty>
           <div v-else v-html="integralRules"></div>
@@ -39,15 +116,14 @@
     </div>
     <el-dialog title="上传证书" :visible.sync="dialogVisible" width="40%">
       <el-form :rules="rules" ref="dataForm" :model="dataForm" label-width="100px">
-        <el-form-item label="类别:" prop="type">
+        <el-form-item label="证书类别:" prop="type">
           <el-cascader clearable size="small" style="width: 95%;" v-model="dataForm.type" :options="typeList"
-          :props="{ value: 'id',label: 'typeName',children: 'children'}"
-            @change="handleChange"></el-cascader>
+            :props="{ value: 'id', label: 'typeName', children: 'children' }" @change="handleChange"></el-cascader>
         </el-form-item>
         <el-form-item label="证书名称:" prop="title">
           <el-input clearable style="width: 95%;" size="small" v-model="dataForm.title"></el-input>
         </el-form-item>
-        
+
         <el-form-item label="证书附件:" prop="fileIds">
           <el-upload :action="fileUrl" :file-list="dataForm.files" :on-success="handleAvatarSuccess"
             :before-upload="beforeUploadFile" :on-remove="handleRemove">
@@ -59,10 +135,48 @@
         <el-button size="small" type="primary" @click="submitForm">确 定</el-button>
       </span>
     </el-dialog>
+    <el-dialog title="上传表彰" :visible.sync="dialogVisibleCite" width="40%">
+      <el-form :rules="rulesCite" ref="dataFormCite" :model="dataFormCite" label-width="100px">
+        <el-form-item label="表彰类型:" prop="type">
+          <el-select clearable size="small" style="width: 95%;" v-model="dataFormCite.type" placeholder="请选择表彰类型">
+            <el-option v-for="item in typeListCite" :key="item.dictValue" :label="item.dictLabel" :value="item.dictValue">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item v-if="dataFormCite.type == '1'" label="集体人员:" prop="groupIds">
+          <el-select size="small" v-model="dataFormCite.groupIds" multiple filterable placeholder="请选择"
+            style="width: 95%;">
+            <el-option :key="item.loginId" v-for="item in recipientsList"
+              :label="item.deptName + '_' + item.userName + '_' + item.employeNo" :value="item.loginId">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="客户名称:" prop="customerName">
+          <el-input clearable style="width: 95%;" size="small" v-model="dataFormCite.customerName"></el-input>
+        </el-form-item>
+        <el-form-item label="表彰名称:" prop="title">
+          <el-input clearable style="width: 95%;" size="small" v-model="dataFormCite.title"></el-input>
+        </el-form-item>
+        <el-form-item label="表彰描述:" prop="content">
+          <el-input type="textarea" :rows="5" maxlength="500" show-word-limit style="width: 95%;" size="small"
+            v-model="dataFormCite.content"></el-input>
+        </el-form-item>
+        <el-form-item label="表彰附件:" prop="fileIds">
+          <el-upload :action="fileUrl" :file-list="dataFormCite.files" :on-success="handleAvatarSuccessCite"
+            :before-upload="beforeUploadFileCite" :on-remove="handleRemoveCite">
+            <el-button size="small" type="primary">点击上传</el-button>
+          </el-upload>
+        </el-form-item>
+
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+        <el-button size="small" type="primary" @click="submitFormCite">确 定</el-button>
+      </span>
+    </el-dialog>
   </div>
 </template>
 <script scoped>
-import { certificatePage, certificateUpload, notice, certificatType } from "@/api/allApi";
+import { certificatePage, certificateUpload, notice, certificatType, dictList, allUserList, citeList, uploadCite } from "@/api/allApi";
 import { handleTree } from '@/utils/index'
 export default {
   data() {
@@ -85,24 +199,53 @@ export default {
       },
       dataForm: {
         type: [],
-        title:'',
+        title: '',
         fileIds: '',
-        files:[],
+        files: [],
+      },
+      typeListCite: [],
+      recipientsList: [],
+      dataListCite: [],
+      dialogVisibleCite: false,
+      rulesCite: {
+        type: [{ required: true, message: "请选择表彰类型", trigger: "blur" }],
+        groupIds: [{ required: true, message: "请选择集体人员", trigger: "blur" }],
+        customerName: [{ required: true, message: "请填写客户名称", trigger: "blur" }],
+        title: [{ required: true, message: "请填写表彰名称", trigger: "blur" }],
+        fileIds: [{ required: true, message: "请上传附件", trigger: "blur" }],
+        content: [{ required: true, message: '请填写表彰描述', trigger: 'blur' }],
+      },
+      totalCite: 0,
+      listQueryCite: {
+        page: 1,
+        limit: 10,
+      },
+      dataFormCite: {
+        type: '',
+        groupIds: [],
+        customerName: '',
+        title: '',
+        fileIds: '',
+        files: [],
+        content: ''
       }
     };
   },
   created() {
+    this.getTypeListCite();
+    this.getAllUserList();
+    this.getDataListCite();
     this.getTypeList();
     this.getDataList();
     this.getIntegralNotice();
   },
   methods: {
-    getTypeList(){
+    getTypeList() {
       certificatType().then(response => {
-          this.typeList = handleTree(response.data.data);
-          console.log(this.typeList);
-        })
-      },
+        this.typeList = handleTree(response.data.data);
+        console.log(this.typeList);
+      })
+    },
     handleClick(tab, event) {
       console.log(tab.name, event);
     },
@@ -127,10 +270,10 @@ export default {
       console.log(file);
       const size = file.size / 1024 / 1024;
       console.log(size);
-        if(size > 10 ){
-          this.$message.error("文件大小不能超过10MB!");
-            return false;
-        }
+      if (size > 10) {
+        this.$message.error("文件大小不能超过10MB!");
+        return false;
+      }
     },
     handleAvatarSuccess(res, file, fileList) {
       console.log(file, fileList);
@@ -166,10 +309,11 @@ export default {
                 type: "success",
                 duration: 2000,
               });
-              this.dataForm.type = [],
-              this.dataForm.fileIds = '',
-              this.dataForm.files = [],
-              this.getDataList();
+                this.dataForm.type = [];
+                this.dataForm.fileIds = '';
+                this.dataForm.files = [];
+                this.listQuery.page = 1;
+                this.getDataList();
             })
             .catch(() => { });
         } else {
@@ -192,10 +336,108 @@ export default {
       this.getDataList()
     },
 
+    getTypeListCite() {
+      dictList({ dictType: 'customer_treward_type' }).then(response => {
+        this.typeListCite = response.data.data;
+      })
+    },
+    getAllUserList() {
+      allUserList().then(response => {
+        this.recipientsList = response.data.data;
+      }).catch(() => { });
+    },
+    handleClick(tab, event) {
+      console.log(tab.name, event);
+    },
+    handleRemoveCite(file, fileList) {
+      console.log(file, fileList);
+      let fileIds = [];
+      for (let i in fileList) {
+        let id = fileList[i].response.data.id;
+        fileIds.push(id);
+      }
+      this.dataFormCite.fileIds = fileIds.join(",");
+    },
+    beforeUploadFileCite(file) {
+      console.log(file);
+      const size = file.size / 1024 / 1024;
+      console.log(size);
+      if (size > 10) {
+        this.$message.error("文件大小不能超过10MB!");
+        return false;
+      }
+    },
+    handleAvatarSuccessCite(res, file, fileList) {
+      console.log(file, fileList);
+      console.log("------", "==========");
+      console.log("res = ", res);
+
+      let fileIds = [];
+      for (let i in fileList) {
+        let response = fileList[i].response;
+        if (response.errno && response.errno != "0") {
+          this.$message.error("该文件上传失败,已被移除,请重新上传!");
+          // 上传失败移除该 file 对象
+          fileList.splice(i, 1);
+        } else {
+          let id = fileList[i].response.data.id;
+          fileIds.push(id);
+        }
+      }
+      this.dataFormCite.fileIds = fileIds.join(",");
+    },
+    submitFormCite() {
+      this.$refs['dataFormCite'].validate((valid) => {
+        if (valid) {
+          uploadCite(this.dataFormCite)
+            .then((response) => {
+              this.dialogVisibleCite = false;
+              this.$notify({
+                title: "成功",
+                message: "表彰上传成功",
+                type: "success",
+                duration: 2000,
+              });
+                this.dataFormCite.type = [];
+                this.dataFormCite.fileIds = '';
+                this.dataFormCite.files = [];
+                this.listQueryCite.page = 1;
+                this.getDataListCite();
+            })
+            .catch(() => { });
+        } else {
+          return false;
+        }
+      });
+    },
+    getDataListCite() {
+      citeList(this.listQueryCite).then(response => {
+        this.dataListCite = response.data.data.items;
+        this.totalCite = response.data.data.total;
+      })
+    },
+    handleSizeChangeCite(val) {
+      this.listQueryCite.limit = val
+      this.getDataListCite()
+    },
+    handleCurrentChangeCite(val) {
+      this.listQueryCite.page = val
+      this.getDataListCite()
+    },
+
   },
 };
 </script>
 <style scoped>
+.text-overflow {
+  max-width: 400px;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  display: -webkit-box;
+  -webkit-box-orient: vertical;
+  -webkit-line-clamp: 1;
+}
+
 .right-wrap {
   width: 100%;
 }

+ 35 - 11
src/views/HomeView/FestiveEvents.vue

@@ -12,8 +12,11 @@
                             <img :src="item.imgUrl" alt="图片" class="prize-img">
                         </div>
                         <div class="content">
-                            <h3 :title="item.content" class="title">{{ item.title }}</h3>
-                            <p class="desc"><span>{{ item.startTime }} ~ {{ item.endTime }}</span></p>
+                            <h3 :title="item.title" class="title">{{ item.title }}</h3>
+                            <p class="desc" v-if="item.startTime">
+                                <span :title="item.startTime+'~'+item.endTime">{{ item.startTime }} ~ {{ item.endTime }}</span>
+                            </p>
+                            <p class="desc" v-else></p>
                         </div>
                         <div class="btn-container">
                             <button v-if="item.status==1" class="ui-btn default medium btn">活动未开始</button>
@@ -72,14 +75,26 @@ export default {
             })
         },
         handleClickReceive(val){
-            // window.location.href = val;
-            this.$router.push({
-                path: '/home/festiveEvents/game',
-                query: {
-                    activityUrl: val.activityUrl,
-                    actId:val.actId
-                }
-            });
+            console.log(val);
+            //答题
+            if(val.type=='2'){
+                this.$router.push({
+                    path: '/home/festiveEvents/answerGame',
+                    query: {
+                        actId:val.actId
+                    }
+                });
+            }
+            //外部页面
+            if(val.type=='3'){
+                this.$router.push({
+                    path: '/home/festiveEvents/drawCarouselGame',
+                    query: {
+                        url: val.activityUrl,
+                        actId:val.actId
+                    }
+                });
+            }
         }
     }
 };
@@ -259,5 +274,14 @@ export default {
     justify-content: center;
 }
 </style>
-<style></style>
+<style>
+.text-overflow {
+  max-width: 400px;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  display: -webkit-box;
+  -webkit-box-orient: vertical;
+  -webkit-line-clamp: 1;
+}
+</style>
 

+ 0 - 169
src/views/HomeView/Game.vue

@@ -52,174 +52,5 @@ export default {
 .right-wrap {
     background-color: #fff;
 }
-
-.tab-header {
-    display: flex;
-    align-items: center;
-    justify-content: space-between;
-    padding: 20px 20px 16px;
-    border-bottom: 1px solid #e5e6eb;
-    overflow: hidden;
-}
-
-.tab-header .tab-title {
-    white-space: nowrap;
-    font-size: 18px;
-    font-weight: 500;
-    color: #1d2129;
-}
-.list-content{
-    padding: 0px 20px 40px;
-}
-.list-container .prize-item:nth-child(4n) {
-    margin-right: 0;
-}
-
-.list-container {
-    border-radius: 2px;
-    background-color: transparent;
-}
-
-.list-container .prize-list {
-    padding: 20px 0;
-    background: #fff;
-    display: flex;
-    flex-flow: row wrap;
-    box-sizing: border-box;
-}
-
-.list-container .prize-item {
-    width: calc(25% - 15px);
-    margin-right: 20px;
-    margin-bottom: 20px;
-    border-radius: 2px;
-}
-
-.prize-card {
-    background: #fff;
-    border: 1px solid #e4e6eb;
-    box-sizing: border-box;
-    border-radius: 2px;
-}
-
-.prize-card .img-container {
-    height: 159px;
-    background: #f7f8fa;
-    border-radius: 2px 2px 0 0;
-    display: flex;
-    align-items: center;
-    justify-content: center;
-}
-
-.prize-card .img-container .prize-img {
-    max-height: 120px;
-    max-width: 120px;
-}
-
-.prize-card .content {
-    padding: 0 16px;
-}
-
-.prize-card .content .desc,
-.prize-card .content .title {
-    white-space: nowrap;
-    overflow: hidden;
-    text-overflow: ellipsis;
-}
-
-.prize-card .content .title {
-    font-weight: 400;
-    font-size: 16px;
-    line-height: 24px;
-    margin-top: 12px;
-    color: #1d2129;
-    margin-bottom: 0;
-}
-
-.prize-card .content .desc {
-    margin: 10px 0;
-    display: inline-block;
-    font-size: 12px;
-    line-height: 18px;
-    height: 18px;
-    width: 100%;
-}
-
-.prize-card .content .desc span {
-    color: #ff7d00;
-    background: #fff7e8;
-    padding: 2px 4px;
-}
-
-.prize-card .content .redeem-info {
-    margin-top: 0;
-    margin-bottom: 0;
-    display: flex;
-    justify-content: space-between;
-    white-space: nowrap;
-    align-items: center;
-}
-
-.prize-card .content .price {
-    font-weight: 500;
-    font-size: 14px;
-    line-height: 24px;
-    color: #1e80ff;
-    flex: auto;
-    display: flex;
-    align-items: center;
-    justify-content: center;
-    justify-content: flex-start;
-}
-
-.prize-card .content .price .icon {
-    height: 16px;
-    width: 16px;
-    position: relative;
-    margin-right: 4px;
-}
-
-.prize-card .content .count {
-    font-size: 12px;
-    line-height: 20px;
-    margin-left: 12px;
-    color: #8a919f;
-}
-
-.prize-card .btn {
-    border-radius: 16px;
-}
-
-.ui-btn.medium {
-    padding: 5px 16px;
-}
-
-.ui-btn.primary {
-    background-color: #1d7dfa;
-}
-.ui-btn.default {
-    color:#8a919f;
-    /* background-color: #1d7dfa; */
-}
-
-.ui-btn {
-    box-sizing: border-box;
-    font-size: 14px;
-    line-height: 22px;
-    padding: 5px 16px;
-    color: #fff;
-    border: none;
-    white-space: nowrap;
-    cursor: pointer;
-}
-
-.prize-card .btn-container {
-    border-top: 1px solid #e4e6eb;
-    padding: 12px 16px;
-    display: flex;
-    align-items: center;
-    justify-content: center;
-}
 </style>
-<style></style>
 

+ 120 - 0
src/views/HomeView/GoodDetail.vue

@@ -0,0 +1,120 @@
+<template>
+    <div class="timeline-container">
+        <!-- <el-breadcrumb separator="/" style="margin-bottom: 13px">
+            <el-breadcrumb-item :to="{ path: '/home/pointsMall' }">积分商城</el-breadcrumb-item>
+            <el-breadcrumb-item>商品详情</el-breadcrumb-item>
+        </el-breadcrumb> -->
+        <div class="timeline-content">
+            <div class="timeline-entry-list">
+                <div class="article">
+                    <!-- <div class="article-title">
+                        {{ data.title }}
+                    </div>
+                    <div class="author-info-block">
+                        <div class="meta-box"> 
+                            {{ data.createTime }}
+                        </div>
+                    </div> -->
+                    
+                    <div class="markdown-body" v-html="data.skuDesc"></div>
+                    
+                </div>
+            </div>
+            <SiderInfo></SiderInfo>
+        </div>
+    </div>
+</template>
+<script>
+import { integralInfo } from "@/api/allApi";
+import SiderInfo from '@/components/SiderInfo.vue'
+export default{
+  components: {
+    SiderInfo
+  },
+  data() {
+    return {
+        data:{},
+    };
+  },
+  created(){
+    this.getDataInfo(this.$route.query.id);
+  },
+  methods:{
+ 
+        getDataInfo(id){
+            integralInfo({skuId:id}).then(response => {
+                    this.data = response.data.data;
+                }).catch(() => {})
+        },
+  },
+}
+</script>
+<style scoped>
+.userInfo{
+    width: 65px;
+    position: absolute;
+    top: 37%;
+    left: 46%;
+    display: flex;
+    flex-direction: column;
+    justify-content: center;
+    align-content: center;
+}
+.timeline-container{
+    margin: 0 auto;
+}
+.timeline-entry-list{
+    margin-right: 17.5rem;
+    border-radius: 2px;
+    width: 720px;
+    position: relative;
+}
+.timeline-entry-list .article{
+    border-radius: 4px 4px 0 0;
+    position: relative;
+    padding-top: 2.667rem;
+    z-index: 1;
+    overflow: hidden;
+    background-color: #fff;
+    padding-left: 2.67rem;
+    padding-right: 2.67rem;
+    margin-bottom: 2rem;
+    box-sizing: border-box;
+}
+.article .article-title{
+    margin: 0 0 1rem;
+    font-size: 1.667rem;
+    font-weight: 600;
+    line-height: 1.31;
+    color: #252933;
+}
+.article .author-info-block{
+    display: flex;
+    align-items: center;
+    margin-bottom: 1.667rem
+}
+.article .markdown-body {
+    overflow: hidden;
+    line-height: 1.75;
+    font-size: 15px;
+    /* background-image: linear-gradient(90deg,rgba(72,42,10,.05) 5%,rgba(72,42,10,0) 0),linear-gradient(1turn,rgba(72,42,10,.05) 5%,rgba(72,42,10,0) 0); */
+    background-size: 20px 20px;
+    background-position: 50%;
+    padding-top: 0!important;
+    min-height: 280px;
+}
+.markdown-body img {
+    max-width: 100%;
+}
+.markdown-body p {
+    color: #412c0c;
+    letter-spacing: 1px;
+    font-weight: 400;
+}
+.author-info-block .meta-box{
+    font-size: 1rem;
+    color: #8a919f;
+    margin-top: 2px;
+    line-height: 22px;
+}
+</style>

+ 34 - 12
src/views/HomeView/GoodsDetail.vue

@@ -62,7 +62,7 @@
                                         class="prize-img"></el-image>
                   </div>
                   <div class="prize-detail-info">
-                    <h3 class="title">{{ data.name }}</h3>
+                    <h3 style="color: #1e80ff;" class="title" @click="handleClickGood(data.skuDesc)">{{ data.name }}</h3>
                     <!-- <p class="desc">
                       <span v-if="data.location">{{ data.location }}</span>
                     </p> -->
@@ -86,9 +86,11 @@
             <tr>
               <th width="35%">兑换物品</th>
               <!-- <th>数量</th> -->
-              <th style="text-align: center;">消耗福利券</th>
               <th style="text-align: center;">物品属性</th>
+              <th style="text-align: center;">兑换卷</th>
               <th style="text-align: center;">兑换方式</th>
+              <th v-if="data.deliveryType == '1' && data.freightType=='0'" style="text-align: center;">快递费</th>
+              <th v-if="data.deliveryType == '0'" style="text-align: center;">领取地点</th>
             </tr>
           </thead>
           <tbody>
@@ -96,7 +98,7 @@
               <td>
                 <div class="prize-info">
                   <div class="prize-img-container">
-                    <el-image :src="data.imgUrl" v-if="data.imgUrl" :preview-src-list="[data.imgUrl]"
+                    <el-image :src="data.imgUrl" v-if="data.imgUrl" :preview-src-list="imgUrls.length==0?[data.imgUrl]:imgUrls"
                                         class="prize-img"></el-image>
                   </div>
                   <div class="prize-detail-info">
@@ -108,11 +110,11 @@
                 </div>
               </td>
               <!-- <td>{{ skuCount }}</td> -->
-              <td style="text-align: center;">{{ data.title }}</td>
               <td style="text-align: center;">{{ data.productAttributeName }}</td>
-              <td style="text-align: center;" class="finlly-price">
-                {{ data.deliveryTypeName }}
-              </td>
+              <td style="text-align: center;">{{ data.couponName }}</td>
+              <td style="text-align: center;">{{ data.deliveryTypeName }}</td>
+              <td v-if="data.deliveryType == '1' && data.freightType=='0'" style="text-align: center;">180 积分</td>
+              <td v-if="data.deliveryType == '0'" style="text-align: center;">{{ data.reclaimAddrName }}</td>
             </tr>
           </tbody>
         </table>
@@ -173,6 +175,9 @@
         </div>
       </div>
     </el-card>
+    <el-dialog title="物品详情" :visible.sync="dialogVisibleGoods" width="40%">
+            <div v-html="data.skuDesc"></div>
+        </el-dialog>
   </div>
 </template>
 <script>
@@ -181,11 +186,14 @@ import { orderInfo, orderConfirm } from "@/api/allApi";
 export default {
   data() {
     return {
+      skuDesc:'',
+      dialogVisibleGoods:false,
       orderId: this.$route.query.orderId,
       comment: '',
       logs: [],
       skuCount: 1,
       data: {},
+      imgUrls:[],
     };
   },
   created() {
@@ -193,10 +201,28 @@ export default {
     this.getInfo(orderId);
   },
   methods: {
+    handleClickGood(val) {
+            this.skuDesc = val;
+            if(this.skuDesc){
+                this.dialogVisibleGoods = true;
+            }
+            // this.$router.push({
+            //     path: '/home/pointsMall/goodDetail',
+            //     query: {
+            //         id: id,
+            //     }
+            // });
+        },
     getInfo(orderId) {
       orderInfo({ orderId: orderId }).then((response) => {
         this.data = response.data.data;
         this.logs = response.data.data.logs;
+        let imgs = response.data.data.imgs;
+        if(imgs){
+          imgs.forEach(element => {
+            this.imgUrls.push(element.url);
+            });
+        }               
       })
     },
     handleClickConfirm(val) {
@@ -419,6 +445,7 @@ img {
 }
 
 .table .prize-detail-info .title {
+  cursor: pointer;
   font-weight: 400;
   font-size: 14px;
   line-height: 24px;
@@ -517,9 +544,4 @@ img {
   border: 1px solid transparent;
 }
 </style>
-<style>
-.el-dialog__body {
-  padding-bottom: 0px;
-}
-</style>
 

+ 132 - 21
src/views/HomeView/MyCenter.vue

@@ -4,8 +4,7 @@
             <el-tabs style="padding: 0 20px 40px 20px;" v-model="activeName" @tab-click="handleClick">
                 <el-tab-pane label="我的积分" name="first">
                     <el-radio-group v-model="firstTabPosition" style="margin-bottom: 30px;">
-                        <el-radio-button v-for="(item, index) in firstTabsList" :key="index" :label="item.value"
-                            @click="handleClickFirstTabs(item.value)">
+                        <el-radio-button v-for="(item, index) in firstTabsList" :key="index" :label="item.value">
                             {{ item.name }}
                         </el-radio-button>
                     </el-radio-group>
@@ -16,7 +15,7 @@
                             </el-option>
                         </el-select>
                         <el-button size="small" style="margin-right: 30px;" type="primary" @click="handleFilter">查询</el-button>
-                        <el-table size="small" :data="firstList" border style="margin-top: 30px;width: 100%">
+                        <el-table size="small" :data="firstList" border style="margin-top: 30px;width: 960px">
                             <el-table-column align="center" type="index" width="50" label="序号"></el-table-column>
                             <el-table-column align="center" prop="integralTypeName" label="积分类型"></el-table-column>
                             <el-table-column align="center" prop="integral" label="积分"></el-table-column>
@@ -95,14 +94,14 @@
                                     <div v-for="(item,index) in thirdList" :key="index" class="item isVirtual">
                                         <div class="img-wapper">
                                             <el-image
-                                                :src="item.imgUrl"
+                                                :src="item.couponImg"
                                                 class="item-icon"></el-image>
                                         </div>
                                         <div class="main">
-                                            <p class="goods_name">{{ item.title }}</p>
+                                            <p class="goods_name">{{ item.couponName }}</p>
                                             <p class="date">
                                                 兑换截止时间:
-                                                {{ item.endTime }}
+                                                {{ item.enableEndTime }}
                                             </p>
                                             
                                         </div>
@@ -119,19 +118,82 @@
                         </div>
                     </div>
                 </el-tab-pane>
-
+                <el-tab-pane label="参与活动记录" name="fourth">
+                    <el-radio-group v-model="fourthTabPosition" style="margin-bottom: 30px;" @change="handleClickTabs">
+                        <el-radio-button v-for="(item, index) in fourthTabsList" :key="index" :label="item.value">
+                            {{ item.name }}
+                        </el-radio-button>
+                    </el-radio-group>
+                    <div v-if="fourthTabPosition == '1'">
+                        <el-date-picker
+                        style="width: 220px; margin-right: 30px;"
+                        size="small"
+                        class="filter-item"
+                        value-format="yyyy-MM-dd"
+                        v-model="listQuery.createTime"
+                        type="date"
+                        placeholder="答题日期">
+                        </el-date-picker>
+                        <el-button size="small" style="margin-right: 30px;" type="primary" @click="handleFilter">查询</el-button>
+                        <el-empty v-if="answerList.length==0" :image-size="200"></el-empty>
+                        <div v-else>
+                            <el-table size="small" :data="answerList" border style="margin-top: 30px;width: 960px">
+                                <el-table-column align="center" type="index" width="50" label="序号"></el-table-column>
+                                <el-table-column align="center" prop="answerDate" label="答题时间"></el-table-column>
+                                <el-table-column align="center" prop="answerTime" label="用时(毫秒)"></el-table-column>
+                                <el-table-column align="center" prop="rightQuantities" label="正确数"></el-table-column>
+                                <el-table-column align="center" prop="rownum" label="当前排名"></el-table-column>
+                            </el-table>
+                            <div class="myPage">
+                                <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange"
+                                    :current-page="currentPage" :page-sizes="[10, 20, 30, 40]" :page-size="10"
+                                    layout="total, sizes, prev, pager, next, jumper" :total="total">
+                                </el-pagination>
+                            </div>
+                        </div>
+                    </div>
+                    <div v-else>
+                        <el-date-picker
+                        style="width: 220px; margin-right: 30px;"
+                        size="small"
+                        class="filter-item"
+                        value-format="yyyy-MM-dd"
+                        v-model="listQuery.createTime"
+                        type="date"
+                        placeholder="抽奖日期">
+                        </el-date-picker>
+                        <el-button size="small" style="margin-right: 30px;" type="primary" @click="handleFilter">查询</el-button>
+                        <el-empty v-if="prizeList.length==0" :image-size="200"></el-empty>
+                        <div v-else>
+                            <el-table size="small" :data="prizeList" border style="margin-top: 30px;width: 960px">
+                                <el-table-column align="center" type="index" width="50" label="序号"></el-table-column>
+                                <el-table-column align="center" prop="createTime" label="得奖时间"></el-table-column>
+                                <el-table-column align="center" prop="actTitle" label="活动名称"></el-table-column>
+                                <el-table-column align="center" prop="prizeName" label="奖品"></el-table-column>
+                            </el-table>
+                            <div class="myPage">
+                                <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange"
+                                    :current-page="currentPage" :page-sizes="[10, 20, 30, 40]" :page-size="10"
+                                    layout="total, sizes, prev, pager, next, jumper" :total="total">
+                                </el-pagination>
+                            </div>
+                        </div>
+                        
+                    </div>
+                </el-tab-pane>
             </el-tabs>
         </div>
 
     </div>
 </template>
 <script scoped>
-import { orderList, welfareList,notice,integralTypes,userlogs, } from "@/api/allApi";
+import { orderList, myWelfareList,notice,integralTypes,userlogs,answerList,prizeList } from "@/api/allApi";
 import { getTab,setTab } from '@/utils/auth'
 export default {
     data() {
         return {
-            
+            answerList:[],
+            prizeList:[],
             firstList:[],
             firstTabPosition: 'integralList',
             firstTabsList: [
@@ -144,6 +206,18 @@ export default {
                     name: '积分规则',
                 },
             ],
+            fourthTabPosition:'1',
+            fourthTabsList: [
+                {
+                    value: '1',
+                    name: '答题',
+                },
+                {
+                    value: '2',
+                    name: '抽奖',
+                },
+            ],
+            
             secondList:[
                
             ],
@@ -186,7 +260,8 @@ export default {
             listQuery: {
                 page: 1,
                 limit: 10,
-                type:''
+                type:'',
+                createTime:''
             },
         };
     },
@@ -205,6 +280,18 @@ export default {
         this.getIntegralNotice();
     },
     methods: {
+        getAnswerList(){
+            answerList(this.listQuery).then(response=>{
+                this.answerList = response.data.data.items; 
+                this.total = response.data.data.total;
+            })
+        },
+        getPrizeList(){
+            prizeList(this.listQuery).then(response=>{
+                this.prizeList = response.data.data.items; 
+                this.total = response.data.data.total;
+            })
+        },
         setTab(){
             setTab('gift');
         },
@@ -230,14 +317,12 @@ export default {
             })
         },
         getThirdList(){
-            welfareList({status:'1'}).then(response=>{
+            myWelfareList().then(response=>{
                 const dataList = response.data.data;
                 dataList.forEach(element => {
-                    element.imgUrl = element.relationWelfareVo.imgUrl;
-                    element.title = element.relationWelfareVo.title;
-                    element.startTime = element.relationWelfareVo.startTime;
-                    element.endTime = element.relationWelfareVo.endTime;
-                    element.welfareId = element.relationWelfareVo.welfareId;
+                    element.couponImg = element.couponVo.couponImg;
+                    element.couponName = element.couponVo.couponName;
+                    element.enableEndTime = element.couponVo.enableEndTime;
                 });
                 this.thirdList = dataList;
             })
@@ -253,17 +338,35 @@ export default {
         handleFilter() {
             this.listQuery.page = 1
             this.getFirstList();
+            this.getAnswerList();
+            this.getPrizeList();
         },
         handleSizeChange(val) {
             this.listQuery.limit = val;
             this.getFirstList();
+            this.getAnswerList();
+            this.getPrizeList();
         },
         handleCurrentChange(val) {
             this.listQuery.page = val;
             this.getFirstList();
+            this.getAnswerList();
+            this.getPrizeList();
         },
-        handleClickFirstTabs(val) {
-            console.log(val);
+        handleClickTabs(val) {
+            this.total = 0;
+            this.listQuery = {
+                page: 1,
+                limit: 10,
+                type:'',
+                createTime:''
+            };
+            if(val=='1'){
+                this.getAnswerList();
+            }
+            if(val=='2'){
+                this.getPrizeList();
+            }
         },
         handleClickSecondTabs(val) {
             if(val=='all'){
@@ -272,9 +375,14 @@ export default {
             this.getSecondList(val);
         },
 
-        handleClick(tab, event) {
-            console.log('111');
-            console.log(tab.name, event);
+        handleClick(tab) {
+            this.total = 0;
+            this.listQuery = {
+                page: 1,
+                limit: 10,
+                type:'',
+                createTime:''
+            };
             var name = tab.name;
             if(name=='first'){
                 this.getFirstList();
@@ -285,6 +393,9 @@ export default {
             if(name=='third'){
                 this.getThirdList();
             }
+            if(name=='fourth'){
+                this.getAnswerList();
+            }
         },
         
     }

+ 78 - 28
src/views/HomeView/PointsMall.vue

@@ -7,7 +7,7 @@
                     <el-carousel indicator-position="none" height="250px" :interval="5000" v-if="bannerList.length > 0">
                         <el-carousel-item v-for="(item, index) in bannerList" :key="index">
                             <!-- <router-link to="/productTrials"> -->
-                                <img style="width: 100%; height: 100%" :src="item.url" class="banner" />
+                                <img style="width: 100%; height: 100%" :src="item.dictValue" class="banner" />
                             <!-- </router-link> -->
                         </el-carousel-item>
                     </el-carousel>
@@ -64,11 +64,11 @@
                         <div v-else class="prize-list">
                             <div v-for="(item, index) in goodsList" :key="index" class="prize-card prize-item">
                                 <div class="img-container">
-                                    <el-image :src="item.imgUrl" v-if="item.imgUrl" :preview-src-list="[item.imgUrl]"
+                                    <el-image :src="item.imgUrl" v-if="item.imgUrl" :preview-src-list="item.imgUrls.length==0?[item.imgUrl]:item.imgUrls"
                                         class="prize-img"></el-image>
                                 </div>
                                 <div class="content">
-                                    <h3 :title="item.name" class="title">{{ item.name }}</h3>
+                                    <h3 style="color: #1e80ff;" :title="item.name" class="title" @click="handleClickGood(item.skuId)">{{ item.name }}</h3>
                                     <p class="desc"><span v-if="item.deliveryTypeName">{{ item.deliveryTypeName }}</span></p>
                                     <p class="redeem-info">
                                         <span title="积分" class="price">
@@ -117,11 +117,11 @@
                         <div class="prize-list">
                             <div v-for="(item, index) in giftList" :key="index" class="prize-card prize-item">
                                 <div class="img-container">
-                                    <el-image :src="item.imgUrl" v-if="item.imgUrl" :preview-src-list="[item.imgUrl]"
+                                    <el-image :src="item.imgUrl" v-if="item.imgUrl" :preview-src-list="item.imgUrls.length==0?[item.imgUrl]:item.imgUrls"
                                         class="prize-img"></el-image>
                                 </div>
                                 <div class="content">
-                                    <h3 :title="item.name" class="title">{{ item.name }}</h3>
+                                    <h3 style="color: #1e80ff;" :title="item.name" class="title" @click="handleClickGood(item.skuId)">{{ item.name }}</h3>
                                     <p class="desc"><span v-if="item.deliveryTypeName">{{ item.deliveryTypeName }}</span></p>
                                     <p class="redeem-info">
                                         <span title="福利券" class="price">
@@ -139,7 +139,7 @@
                                                     d="M375.466667 426.666667a51.2 51.2 0 0 1 51.2 51.2v273.066666a51.2 51.2 0 0 1-102.4 0v-273.066666a51.2 51.2 0 0 1 51.2-51.2z"
                                                     fill="#FFFFFF" p-id="1487"></path>
                                             </svg>
-                                            {{ item.title }}
+                                            兑换券
                                         </span>
                                         <span class="count">{{ item.stock }}库存</span>
                                     </p>
@@ -162,27 +162,22 @@
                 </el-tab-pane>
             </el-tabs>
         </div>
+        <el-dialog title="物品详情" :visible.sync="dialogVisible" width="40%">
+            <div v-html="skuDesc"></div>
+        </el-dialog>
 
     </div>
 </template>
 <script>
-import { integralList, festivalList, notice, welfareType, integralTypes } from "@/api/allApi";
+import { integralInfo,integralList, festivalList, notice, welfareType, dictList } from "@/api/allApi";
 import { getTab } from '@/utils/auth'
 import { debounce } from '@/utils/index'
 export default {
     data() {
         return {
-            bannerList: [
-            {
-                url: require('@/assets/image/banner5.png')
-            },
-            {
-                url: require('@/assets/image/banner6.png')
-            },
-            {
-                url: require('@/assets/image/banner7.png')
-            },
-        ],
+            dialogVisible: false,
+            skuDesc:'',
+            bannerList: [],
             page: 1,
             pages: 1,
             // tab 列表
@@ -239,6 +234,7 @@ export default {
         };
     },
     created() {
+        this.getBannerList();
         const Tab = getTab();
         if (Tab == 'gift') {
             this.activeName = 'giftNotice';
@@ -249,6 +245,25 @@ export default {
         this.getNotice(this.activeName);
     },
     methods: {
+        getDataInfo(id){
+            integralInfo({skuId:id}).then(response => {
+                    this.data = response.data.data;
+                }).catch(() => {})
+        },
+        getBannerList(){
+            dictList({dictType:'index_lbt'}).then(response=>{
+                this.bannerList = response.data.data; 
+            })
+        },
+        handleClickGood(id) {
+            integralInfo({skuId:id}).then(response => {
+                    this.skuDesc = response.data.data.skuDesc;
+                    if(this.skuDesc){
+                        this.dialogVisible = true;
+                    }
+                }).catch(() => {})
+            
+        },
         handleFilter() {
             this.page = 1;
             this.getFirstList();
@@ -263,7 +278,7 @@ export default {
             this.getFirstList();
         },
         getIntegralTypes() {
-            integralTypes({ dictType: 'mall_sku_attribute' }).then(response => {
+            dictList({ dictType: 'mall_sku_attribute' }).then(response => {
                 console.log(response.data.data);
                 const dataList = response.data.data;
                 const data = {
@@ -298,10 +313,21 @@ export default {
 
                     });
                     this.choseList = dataList;
-                    this.curChosed = dataList[0].welfareId;
-                    festivalList({ welfareId: this.curChosed }).then(response => {
+                    this.curChosed = dataList[0].actId;
+                    festivalList({ actId: this.curChosed }).then(response => {
                         console.log(response.data.data);
-                        this.giftList = response.data.data
+                        let list = response.data.data;
+                        list.forEach((element,index) => {
+                            let imgUrls = []
+                            if(element.imgs){
+                                for (let i in element.imgs) {
+                                    imgUrls.push(element.imgs[i].url)
+                                }
+                            } 
+                            list[index].imgUrls = imgUrls;
+                        });
+                        console.log(list);
+                        this.giftList = list;
                     })
                 }
             })
@@ -329,7 +355,7 @@ export default {
                 element.checked = false;
             });
             item.checked = true;
-            this.curChosed = item.welfareId;
+            this.curChosed = item.actId;
             this.getSecondList();
         },
         getNotice(val) {
@@ -349,23 +375,45 @@ export default {
             }
 
             integralList(params).then(response => {
+                let list = response.data.data.list;
+                list.forEach((element,index) => {
+                    let imgUrls = []
+                    if(element.imgs){
+                        for (let i in element.imgs) {
+                            imgUrls.push(element.imgs[i].url)
+                        }
+                    } 
+                    list[index].imgUrls = imgUrls;
+                });
+                console.log(list);
                 if (this.page == 1) {
-                    this.goodsList = response.data.data.list;
+                    this.goodsList = list;
                     this.page = response.data.data.pageNum;
                     this.pages = response.data.data.pages;
                 } else {
                     this.goodsList = [
                         ...this.goodsList,
-                        ...response.data.data.list
+                        ...list
                     ]
                 }
                 ++this.page
             })
         },
         getSecondList() {
-            festivalList({ welfareId: this.curChosed }).then(response => {
+            festivalList({ actId: this.curChosed }).then(response => {
                 console.log(response.data.data);
-                this.giftList = response.data.data;
+                let list = response.data.data;
+                list.forEach((element,index) => {
+                    let imgUrls = []
+                    if(element.imgs){
+                        for (let i in element.imgs) {
+                            imgUrls.push(element.imgs[i].url)
+                        }
+                    } 
+                    list[index].imgUrls = imgUrls;
+                });
+                console.log(list);
+                this.giftList = list;
             })
         },
         handleClick(tab, event) {
@@ -383,7 +431,8 @@ export default {
                 path: '/home/pointsMall/redeem',
                 query: {
                     id: id,
-                    activeName: this.activeName
+                    name: this.activeName,
+                    type:this.curChosed,
                 }
             });
         },
@@ -487,6 +536,7 @@ button {
 
 .prize-card .content .desc,
 .prize-card .content .title {
+    cursor: pointer;
     white-space: nowrap;
     overflow: hidden;
     text-overflow: ellipsis;

+ 164 - 47
src/views/HomeView/RedeemView.vue

@@ -105,11 +105,11 @@
                             <td>
                                 <div class="prize-info">
                                     <div class="prize-img-container">
-                                        <el-image :src="data.imgUrl" v-if="data.imgUrl" :preview-src-list="[data.imgUrl]"
+                                        <el-image :src="data.imgUrl" v-if="data.imgUrl" :preview-src-list="imgUrls.length==0?[data.imgUrl]:imgUrls"
                                             class="prize-img"></el-image>
                                     </div>
                                     <div class="prize-detail-info">
-                                        <h3 class="title">{{ data.name }}</h3>
+                                        <h3 style="color: #1e80ff;" class="title" @click="handleClickGood(data.skuDesc)">{{ data.name }}</h3>
                                         <!-- <p class="desc">
                                             <span v-if="data.location">{{ data.location }}</span>
                                         </p> -->
@@ -148,12 +148,20 @@
                 <table class="table">
                     <thead>
                         <tr>
-                            <th width="35%">兑换物品</th>
-                            <th style="text-align: center">消耗福利券</th>
-                            <th style="text-align: center">物品属性</th>
-                            <th style="text-align: center" width="20%">
+                            <th width="25%">兑换物品</th>
+                            <th style="text-align: center" width="15%">物品属性</th>
+                            <th style="text-align: center" width="15%">
+                                <span style="color: red">*</span>兑换券
+                            </th>
+                            <th style="text-align: center" width="15%">
                                 <span style="color: red">*</span>兑换方式
                             </th>
+                            <th v-if="deliveryType == '1' && data.freightType=='0'" style="text-align: center" width="15%">
+                               快递费
+                            </th>
+                            <th v-if="deliveryType == '0'" style="text-align: center" width="15%">
+                                <span style="color: red">*</span>领取地点
+                            </th>
                         </tr>
                     </thead>
                     <tbody>
@@ -161,29 +169,43 @@
                             <td>
                                 <div class="prize-info">
                                     <div class="prize-img-container">
-                                        <el-image :src="data.imgUrl" v-if="data.imgUrl" :preview-src-list="[data.imgUrl]"
+                                        <el-image :src="data.imgUrl" v-if="data.imgUrl" :preview-src-list="imgUrls.length==0?[data.imgUrl]:imgUrls"
                                             class="prize-img"></el-image>
                                     </div>
                                     <div class="prize-detail-info">
-                                        <h3 class="title">{{ data.name }}</h3>
+                                        <h3 style="color: #1e80ff;" class="title" @click="handleClickGood(data.skuDesc)">{{ data.name }}</h3>
                                         <!-- <p class="desc">
                                             <span v-if="data.location">{{ data.location }}</span>
                                         </p> -->
                                     </div>
                                 </div>
                             </td>
-                            <td style="text-align: center">{{ data.title }}</td>
+                            <td style="text-align: center">{{ data.productAttributeName }}</td>
                             <td style="text-align: center">
-                                {{ data.productAttributeName }}
+                                <el-select size="small" clearable v-model="voucher" placeholder="请选择" value-key="value"
+                                    @change="changeCouponList">
+                                    <el-option :key="item.voucher" v-for="item in couponList"
+                                        :label="item.couponName" :value="item.voucher">
+                                    </el-option>
+                                </el-select>
                             </td>
-                            <td style="text-align: center" class="finlly-price">
+                            <td style="text-align: center">
                                 <el-select size="small" clearable v-model="deliveryType" placeholder="请选择" value-key="value"
-                                    @change="changeDeliveryType">
+                                    @change="changeDeliveryTypeGift">
                                     <el-option :key="item.dictValue" v-for="item in deliveryTypeList"
                                         :label="item.dictLabel" :value="item.dictValue">
                                     </el-option>
                                 </el-select>
                             </td>
+                            <td v-if="deliveryType == '1' && data.freightType=='0'" style="text-align: center">180 积分</td>
+                            <td v-if="deliveryType == '0'" style="text-align: center">
+                                <el-select size="small" clearable v-model="reclaimAddr" placeholder="请选择" value-key="value"
+                                    @change="changeReclaimAddr">
+                                    <el-option :key="item.dictValue" v-for="item in reclaimAddrList" :label="item.dictLabel"
+                                        :value="item.dictValue">
+                                    </el-option>
+                                </el-select>
+                            </td>
                         </tr>
                     </tbody>
                 </table>
@@ -192,7 +214,7 @@
             <div class="footer">
                 <div class="right" v-if="data.stock != 0">
                     <div class="btn-line">
-                        <el-button :disabled="disabled" @click="dialogVisible = true" type="primary" round>确认兑换</el-button>
+                        <el-button :disabled="disabled" @click="handleClick" type="primary" round>确认兑换</el-button>
                     </div>
                 </div>
             </div>
@@ -224,7 +246,7 @@
         </el-dialog>
         <el-dialog title="手机充值" :visible.sync="dialogFormPhoneNumber" width="500px">
             <el-form :model="dataFormPhoneNumber" ref="dataFormPhoneNumber" :rules="rules">
-                <el-form-item label="充值手机" :label-width="formLabelWidth" prop="phoneNumber">
+                <el-form-item label="充值手机" :label-width="formLabelWidth" prop="phoneNumber">
                     <el-input size="medium" v-model="dataFormPhoneNumber.phoneNumber" placeholder="请输入11位手机号码"></el-input>
                 </el-form-item>
             </el-form>
@@ -314,16 +336,56 @@
             </div>
         </el-dialog>
         <el-dialog title="兑换确认" :visible.sync="dialogVisible" width="30%">
-            <span>是否确认兑换该物品?</span>
+            <div class="checklist">
+                <div class="listItem">
+                    <div class="itemName">商品名称</div>
+                    <div class="itemValue">{{ data.name }}</div>
+                </div>
+                <div v-if="activeName=='giftNotice'" class="listItem">
+                    <div class="itemName">商品属性</div>
+                    <div class="itemValue">{{ data.productAttributeName }}</div>
+                </div>
+                <div v-if="activeName=='giftNotice'" class="listItem">
+                    <div class="itemName">兑换卷</div>
+                    <div class="itemValue">{{ couponName }}</div>
+                </div>
+                <div v-if="activeName=='goodsNotice'" class="listItem">
+                    <div class="itemName">商品积分</div>
+                    <div class="itemValue">{{ data.price }}</div>
+                </div>
+                <div v-if="activeName=='goodsNotice'" class="listItem">
+                    <div class="itemName">商品数量</div>
+                    <div class="itemValue">{{ skuCount }}</div>
+                </div>
+                <div v-if="deliveryType == '1' && data.freightType == '0'" class="listItem">
+                    <div class="itemName">快递费</div>
+                    <div class="itemValue red">+180 积分</div>
+                </div>
+                <div class="listItem">
+                    <div class="itemName">兑换方式</div>
+                    <div class="itemValue">{{ deliveryTypeName }}</div>
+                </div>
+                <div v-if="deliveryType == '0'" class="listItem">
+                    <div class="itemName">领取地点</div>
+                    <div class="itemValue">{{ reclaimAddrName }}</div>
+                </div>
+                <div v-if="activeName=='goodsNotice'" class="listItem">
+                    <div class="itemName">合计</div>
+                    <div class="itemValue">{{ total }}</div>
+                </div>
+            </div>
             <span slot="footer" class="dialog-footer">
                 <el-button @click="dialogVisible = false">取 消</el-button>
                 <el-button type="primary" @click="handleClickExchange">确 定</el-button>
             </span>
         </el-dialog>
+        <el-dialog title="物品详情" :visible.sync="dialogVisibleGoods" width="40%">
+            <div v-html="data.skuDesc"></div>
+        </el-dialog>
     </div>
 </template>
 <script>
-import { integralInfo, festivalInfo, start, kill } from "@/api/allApi";
+import { integralInfo, start, kill, couponList } from "@/api/allApi";
 import {regionData,codeToText,} from "element-china-area-data";
 import { setTab } from "@/utils/auth";
 import { debounce } from "@/utils/index";
@@ -343,15 +405,23 @@ export default {
             }
         };
         return {
+            couponName:'',
+            voucher:'',
+            couponList:[],
+            skuDesc:'',
+            dialogVisibleGoods:false,
             dialogVisible:false,
             options: regionData,
             reclaimAddr: "",
+            reclaimAddrName: "",
             reclaimAddrList: [],
             phoneNumber: "",
             deliveryTypeList: [],
             deliveryType: "",
+            deliveryTypeName:"",
             contactInfo: {},
-            activeName: this.$route.query.activeName,
+            activeName: this.$route.query.name,
+            activeType: this.$route.query.type,
             name: "",
             phone: "",
             addressArr: [],
@@ -362,6 +432,7 @@ export default {
             skuCount: 1,
             total: undefined,
             data: {},
+            imgUrls:[],
             dialogFormOrderInfo: false,
             dialogFormPhoneNumber: false,
             addressDetail: false,
@@ -423,13 +494,39 @@ export default {
     },
     created() {
         const skuId = this.$route.query.id;
-        const activeName = this.$route.query.activeName;
         this.dataForm.skuId = skuId;
-        this.getInfo(skuId, activeName);
+        this.getInfo(skuId);
+        this.getCouponList(skuId);
     },
     methods: {
+        changeCouponList(val){
+            this.couponName = this.couponList.find(item => item.voucher == val).couponName;
+        },
+        getCouponList(id){
+            couponList({ actId: this.activeType,skuId:id })
+                    .then((response) => {
+                        this.couponList = response.data.data;
+                    });
+        },
+        handleClickGood(val) {
+            this.skuDesc = val;
+            if(this.skuDesc){
+                this.dialogVisibleGoods = true;
+            }
+        },
         handleClick(){
-            this.dialogVisible = true;
+            if(this.activeName=='giftNotice'){
+                if(!this.voucher){
+                    this.$message({
+                        message: '请选择兑换卷',
+                        type: 'warning'
+                    });
+                }else{
+                    this.dialogVisible = true;
+                }
+            }else{
+                this.dialogVisible = true;
+            }
         },
         handleChange(value) {
             console.log(value);
@@ -448,8 +545,10 @@ export default {
             if (val) {
                 this.disabled = false;
             }
+            this.reclaimAddrName = this.reclaimAddrList.find(item => item.dictValue == val).dictLabel;
         },
         changeDeliveryType(val) {
+            this.reclaimAddr = '';
             this.disabled = true;
             if (val == "0" || val == "") {
                 this.total = this.data.price;
@@ -457,7 +556,7 @@ export default {
             }
             if (val == "1") {
                 debugger;
-                if (this.data.productAttribute == "exchange_logo") {
+                if (this.data.freightType == "0") {
                     this.total = this.data.price * this.skuCount + 180;
                     this.dialogFormOrderInfo = true;
                 }
@@ -478,6 +577,34 @@ export default {
                     this.disabled = false;
                 }
             }
+            this.deliveryTypeName = this.deliveryTypeList.find(item => item.dictValue == val).dictLabel;
+        },
+        changeDeliveryTypeGift(val){
+            this.reclaimAddr = '';
+            this.disabled = true;
+            if (val == "0" || val == "") {
+                this.total = this.data.price;
+                this.skuCount = 1;
+            }
+            if (val == "1") {
+                if (this.address) {
+                    this.addressDetail = true;
+                    this.disabled = false;
+                }
+            }
+            if (val == "2" || val == "3") {
+                this.total = this.data.price;
+                this.skuCount = 1;
+                this.disabled = false;
+            }
+            if (val == "4") {
+                this.total = this.data.price;
+                this.skuCount = 1;
+                if (this.phoneNumber) {
+                    this.disabled = false;
+                }
+            }
+            this.deliveryTypeName = this.deliveryTypeList.find(item => item.dictValue == val).dictLabel;
         },
         setTab() {
             setTab("exchange");
@@ -486,7 +613,7 @@ export default {
             this.total = this.data.price * val;
             if (
                 this.deliveryType == "1" &&
-                this.data.productAttribute == "exchange_logo"
+                this.data.freightType == "0"
             ) {
                 this.total = this.data.price * val + 180;
             }
@@ -497,9 +624,8 @@ export default {
                 path: "/home/pointsMall",
             });
         },
-        getInfo(skuId, activeName) {
-            if (activeName == "goodsNotice") {
-                integralInfo({ skuId: skuId })
+        getInfo(skuId) {
+            integralInfo({ skuId: skuId })
                     .then((response) => {
                         this.data = response.data.data;
                         this.deliveryTypeList = response.data.data.dictDataList;
@@ -514,25 +640,15 @@ export default {
                             this.address = this.contactInfo.contactAddr;
                         }
                         this.total = response.data.data.price;
-                    })
-                    .catch(() => { });
-            } else {
-                festivalInfo({ skuId: skuId })
-                    .then((response) => {
-                        this.data = response.data.data;
-                        this.contactInfo = response.data.data.contactInfo;
-                        this.deliveryTypeList = response.data.data.dictDataList;
-                        if (this.contactInfo) {
-                            this.name = this.contactInfo.contact;
-                            this.phone = this.contactInfo.contactPhone;
-                            this.addressArr = this.contactInfo.addressArr;
-                            this.addressStr = this.contactInfo.addressStr;
-                            this.street = this.contactInfo.street;
-                            this.address = this.contactInfo.contactAddr;
+                        let imgs = response.data.data.imgs;
+                        if(imgs){
+                            imgs.forEach(element => {
+                                this.imgUrls.push(element.url);
+                            });
                         }
+                        
                     })
                     .catch(() => { });
-            }
         },
         handleClickPhoneNumber() {
             this.dialogFormPhoneNumber = true;
@@ -582,6 +698,8 @@ export default {
             this.dialogVisible = false;
             if (this.deliveryType == "1") {
                 var params = {
+                    actId: this.activeType,
+                    voucher:this.voucher,
                     skuId: this.data.skuId,
                     skuCount: this.skuCount,
                     price: this.data.price,
@@ -598,6 +716,8 @@ export default {
                 };
             } else if (this.deliveryType == "4") {
                 var params = {
+                    actId: this.activeType,
+                    voucher:this.voucher,
                     skuId: this.data.skuId,
                     skuCount: this.skuCount,
                     price: this.data.price,
@@ -609,6 +729,8 @@ export default {
                 };
             } else {
                 var params = {
+                    actId: this.activeType,
+                    voucher:this.voucher,
                     skuId: this.data.skuId,
                     skuCount: this.skuCount,
                     price: this.data.price,
@@ -862,6 +984,7 @@ img {
 }
 
 .table .prize-detail-info .title {
+    cursor: pointer;
     font-weight: 400;
     font-size: 14px;
     line-height: 24px;
@@ -966,10 +1089,4 @@ img {
     max-width: 300px;
 }
 </style>
-<style>
-.el-dialog__body {
-    padding-bottom: 0px;
-    padding-top: 10px;
-}
-</style>
 

+ 7 - 0
src/views/HomeView/SignIn.vue

@@ -14,6 +14,12 @@
                   <span class="text">本月累计签到天数</span>
                 </div>
               </div>
+              <div class="figure-card">
+                <div class="figure" style="color: #1e80ff;">{{ continuousSignCount }}</div>
+                <div class="attention">
+                  <span class="text">本月连续签到天数</span>
+                </div>
+              </div>
               <div class="figure-card">
                 <div class="figure">{{ integral }}</div>
                 <div class="attention">
@@ -117,6 +123,7 @@ export default {
           this.markDate = response.data.data.signDays;
           this.integral = response.data.data.integral;
           this.signDays = response.data.data.signDays.length;
+          this.continuousSignCount = response.data.data.continuousSignCount;
       });
     },
     signIn() {

+ 20 - 19
src/views/HomeView/WelfareList.vue

@@ -12,14 +12,14 @@
                             <img :src="item.imgUrl" alt="图片" class="prize-img">
                         </div>
                         <div class="content">
-                            <h3 :title="item.content" class="title">{{ item.title }}</h3>
-                            <p class="desc"><span>{{ item.startTime }} ~ {{ item.endTime }}</span></p>
+                            <h3 :title="item.title" class="title">{{ item.title }}</h3>
+                            <p class="desc"><span :title="item.startTime+'~'+item.endTime">{{ item.startTime }} ~ {{ item.endTime }}</span></p>
                         </div>
                         <div class="btn-container">
-                            <button v-if="item.status==1" class="ui-btn default medium btn">已领取</button>
-                            <button v-if="item.status==9" class="ui-btn default medium btn">已过期</button>
-                            <button v-if="item.status==8" class="ui-btn default medium btn">敬请期待</button>
-                            <button v-if="item.status==0" @click="handleClickReceive(item.id)"
+                            <button v-if="item.receiveType==1" class="ui-btn default medium btn">已领取</button>
+                            <!-- <button v-if="item.status==9" class="ui-btn default medium btn">已过期</button>
+                            <button v-if="item.status==8" class="ui-btn default medium btn">敬请期待</button> -->
+                            <button v-else @click="handleClickReceive(item.actId)"
                                 class="ui-btn primary medium btn">立即领取</button>
                         </div>
                     </div>
@@ -68,26 +68,27 @@ export default {
             setTab('welfare');
         },
         getList() {
-            welfareList({status:'0,1,8,9'}).then(response => {
-                const dataList = response.data.data;
-                dataList.forEach(element => {
-                    element.imgUrl = element.relationWelfareVo.imgUrl;
-                    element.title = element.relationWelfareVo.title;
-                    element.startTime = element.relationWelfareVo.startTime;
-                    element.endTime = element.relationWelfareVo.endTime;
-                    element.welfareId = element.relationWelfareVo.welfareId;
-                });
-                console.log(dataList);
-                this.goodsList = dataList;
+            welfareList().then(response => {
+                this.goodsList = response.data.data;
+                // const dataList = response.data.data;
+                // dataList.forEach(element => {
+                //     element.imgUrl = element.relationWelfareVo.imgUrl;
+                //     element.title = element.relationWelfareVo.title;
+                //     element.startTime = element.relationWelfareVo.startTime;
+                //     element.endTime = element.relationWelfareVo.endTime;
+                //     element.welfareId = element.relationWelfareVo.welfareId;
+                // });
+                // console.log(dataList);
+                // this.goodsList = dataList;
             }).catch(() => {
                
             })
         },
         handleClickReceive(id){
-            receiveWelfare({voucherId:id,status:1}).then(response => {
+            receiveWelfare({actId:id}).then(response => {
                 if(response.data.errno==0){
                     this.goodsList.forEach(element => {
-                        if(element.id==id){
+                        if(element.actId==id){
                             this.imgUrl = element.imgUrl;
                             this.title = element.title;
                         }

Разлика између датотеке није приказан због своје велике величине
+ 32 - 10
src/views/NoticeCenter.vue


+ 1 - 1
vue.config.js

@@ -14,7 +14,7 @@ const cdn = {
 };
 module.exports = defineConfig({
   devServer:{
-    host: '192.168.100.185',
+    host: '192.168.100.73',
     open:true
   },
   transpileDependencies: true,