Browse Source

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

sunlupeng 2 years ago
parent
commit
e41f3b4b4c
80 changed files with 4081 additions and 764 deletions
  1. 1 0
      .gitignore
  2. 3 1
      package.json
  3. 518 0
      public/drawCarousel.html
  4. 1 1
      public/index.html
  5. 7 1
      src/App.vue
  6. 132 4
      src/api/allApi.js
  7. 26 3
      src/assets/icon/demo_index.html
  8. 7 3
      src/assets/icon/iconfont.css
  9. 1 1
      src/assets/icon/iconfont.js
  10. 7 0
      src/assets/icon/iconfont.json
  11. BIN
      src/assets/icon/iconfont.ttf
  12. BIN
      src/assets/icon/iconfont.woff
  13. BIN
      src/assets/icon/iconfont.woff2
  14. BIN
      src/assets/image/answerGame/home/answer.png
  15. BIN
      src/assets/image/answerGame/home/exit.png
  16. BIN
      src/assets/image/answerGame/home/homeBg.png
  17. BIN
      src/assets/image/answerGame/home/rules.png
  18. BIN
      src/assets/image/answerGame/item/error.png
  19. BIN
      src/assets/image/answerGame/item/fail.png
  20. BIN
      src/assets/image/answerGame/item/finish.png
  21. BIN
      src/assets/image/answerGame/item/goHome.png
  22. BIN
      src/assets/image/answerGame/item/itemBg.png
  23. BIN
      src/assets/image/answerGame/item/right.png
  24. BIN
      src/assets/image/answerGame/item/timer.png
  25. BIN
      src/assets/image/answerGame/item/topicNum.png
  26. BIN
      src/assets/image/answerGame/qiXi/answer.png
  27. BIN
      src/assets/image/answerGame/qiXi/error.png
  28. BIN
      src/assets/image/answerGame/qiXi/exit.png
  29. BIN
      src/assets/image/answerGame/qiXi/fail.png
  30. BIN
      src/assets/image/answerGame/qiXi/finish.png
  31. BIN
      src/assets/image/answerGame/qiXi/goHome.png
  32. BIN
      src/assets/image/answerGame/qiXi/homeBg.png
  33. BIN
      src/assets/image/answerGame/qiXi/itemBg.png
  34. BIN
      src/assets/image/answerGame/qiXi/right.png
  35. BIN
      src/assets/image/answerGame/qiXi/rules.png
  36. BIN
      src/assets/image/answerGame/qiXi/timer.png
  37. BIN
      src/assets/image/answerGame/qiXi/topicNum.png
  38. BIN
      src/assets/image/banner.jpg
  39. BIN
      src/assets/image/banner.png
  40. BIN
      src/assets/image/banner2.png
  41. BIN
      src/assets/image/banner3.png
  42. BIN
      src/assets/image/banner4.png
  43. BIN
      src/assets/image/banner5.png
  44. BIN
      src/assets/image/banner6.png
  45. BIN
      src/assets/image/banner7.png
  46. BIN
      src/assets/image/birthday.png
  47. BIN
      src/assets/image/logo.png
  48. BIN
      src/assets/image/recordBtn.png
  49. 47 3
      src/components/AppHeader.vue
  50. 24 17
      src/components/AppSidebar.vue
  51. 15 36
      src/components/SiderInfo.vue
  52. 5 1
      src/main.js
  53. 5 2
      src/permission.js
  54. 26 2
      src/router/index.js
  55. 5 0
      src/store/getters.js
  56. 15 0
      src/store/index.js
  57. 35 0
      src/store/modules/user.js
  58. 11 5
      src/utils/request.js
  59. 525 0
      src/views/HomeView/AnswerGame/AnswerGame.vue
  60. 525 0
      src/views/HomeView/AnswerGame/QiXiAnswerGame.vue
  61. 492 0
      src/views/HomeView/CiteList.vue
  62. 15 4
      src/views/HomeView/Commend.vue
  63. 115 0
      src/views/HomeView/CommendDetail.vue
  64. 67 0
      src/views/HomeView/DrawCarouselGame/DrawCarouselGame.vue
  65. 273 24
      src/views/HomeView/EarnPoints.vue
  66. 39 13
      src/views/HomeView/FestiveEvents.vue
  67. 0 169
      src/views/HomeView/Game.vue
  68. 120 0
      src/views/HomeView/GoodDetail.vue
  69. 46 20
      src/views/HomeView/GoodsDetail.vue
  70. 17 21
      src/views/HomeView/Index.vue
  71. 29 2
      src/views/HomeView/MsgDetail.vue
  72. 132 21
      src/views/HomeView/MyCenter.vue
  73. 16 152
      src/views/HomeView/MyMedal.vue
  74. 126 37
      src/views/HomeView/PointsMall.vue
  75. 555 151
      src/views/HomeView/RedeemView.vue
  76. 24 38
      src/views/HomeView/SignIn.vue
  77. 24 21
      src/views/HomeView/WelfareList.vue
  78. 32 10
      src/views/NoticeCenter.vue
  79. 1 1
      vue.config.js
  80. 17 0
      yarn.lock

+ 1 - 0
.gitignore

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

+ 3 - 1
package.json

@@ -10,12 +10,14 @@
   "dependencies": {
   "dependencies": {
     "axios": "0.17.1",
     "axios": "0.17.1",
     "core-js": "^3.8.3",
     "core-js": "^3.8.3",
+    "element-china-area-data": "^6.0.2",
     "element-ui": "^2.15.12",
     "element-ui": "^2.15.12",
     "js-cookie": "2.2.0",
     "js-cookie": "2.2.0",
     "node-sass": "6.0.0",
     "node-sass": "6.0.0",
     "sass-loader": "11.1.0",
     "sass-loader": "11.1.0",
     "vue": "^2.6.14",
     "vue": "^2.6.14",
-    "vue-router": "^3.5.1"
+    "vue-router": "^3.5.1",
+    "vuex": "3.0.1"
   },
   },
   "devDependencies": {
   "devDependencies": {
     "@babel/core": "^7.12.16",
     "@babel/core": "^7.12.16",

+ 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>

+ 1 - 1
public/index.html

@@ -6,7 +6,7 @@
     <meta name="viewport" content="width=device-width,initial-scale=1.0">
     <meta name="viewport" content="width=device-width,initial-scale=1.0">
     <link rel="icon" href="<%= BASE_URL %>favicon.ico">
     <link rel="icon" href="<%= BASE_URL %>favicon.ico">
     <!-- <title><%= htmlWebpackPlugin.options.title %></title> -->
     <!-- <title><%= htmlWebpackPlugin.options.title %></title> -->
-    <title>积分商城</title>
+    <title>商城</title>
   </head>
   </head>
   <body>
   <body>
     <noscript>
     <noscript>

+ 7 - 1
src/App.vue

@@ -25,6 +25,9 @@ export default {
       visible:true,
       visible:true,
     };
     };
   },
   },
+  created(){
+    this.$store.dispatch('GetUserInfo');
+  },
   methods:{
   methods:{
     // 保存滚动值,这是兼容的写法
     // 保存滚动值,这是兼容的写法
     handleScroll () {
     handleScroll () {
@@ -71,6 +74,9 @@ export default {
 }
 }
 </script>
 </script>
 <style>
 <style>
+.el-dialog__body{
+  padding-top: 0px !important;
+}
 .view-container{
 .view-container{
   position: relative;
   position: relative;
   margin: 0 auto;
   margin: 0 auto;
@@ -84,7 +90,7 @@ export default {
 .slide-left-enter-active,
 .slide-left-enter-active,
 .slide-left-leave-active {
 .slide-left-leave-active {
   will-change: transform;
   will-change: transform;
-  transition: all 250ms;
+  transition: all 80ms;
   position: fixed;
   position: fixed;
 }
 }

+ 132 - 4
src/api/allApi.js

@@ -1,5 +1,105 @@
 import request from '@/utils/request'
 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) {
 export function lockStatus(query) {
   return request({
   return request({
@@ -49,6 +149,24 @@ export function commendPage(query) {
   })
   })
 }
 }
 
 
+//勋章墙
+export function medalList(query) {
+  return request({
+    url: '/mall-user-medal/list',
+    method: 'get',
+    params:query
+  })
+}
+
+// 表彰详情
+export function commendDetail(query) {
+  return request({
+    url: '/mall-commend/commend/staff/info',
+    method: 'get',
+    params: query
+  })
+}
+
 //证书类型
 //证书类型
 export function certificatType(query) {
 export function certificatType(query) {
   return request({
   return request({
@@ -140,7 +258,7 @@ export function start(query) {
 //福利券兑换
 //福利券兑换
 export function kill(query) {
 export function kill(query) {
   return request({
   return request({
-    url: '/mall-order/kill',
+    url: '/mall-order/coupon/start',
     method: 'post',
     method: 'post',
     data:query
     data:query
   })
   })
@@ -157,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) {
 export function welfareList(query) {
   return request({
   return request({
-    url: '/mall-welfare/welfare/user/list',
+    url: '/mall-act/user/welfare/list',
     method: 'get',
     method: 'get',
     params:query
     params:query
   })
   })
 }
 }
+
 //用户福利领取
 //用户福利领取
 export function receiveWelfare(query) {
 export function receiveWelfare(query) {
   return request({
   return request({
-    url: '/mall-welfare/receive',
+    url: '/coupon/user/receive',
     method: 'post',
     method: 'post',
     params:query
     params:query
   })
   })

+ 26 - 3
src/assets/icon/demo_index.html

@@ -54,6 +54,12 @@
       <div class="content unicode" style="display: block;">
       <div class="content unicode" style="display: block;">
           <ul class="icon_lists dib-box">
           <ul class="icon_lists dib-box">
           
           
+            <li class="dib">
+              <span class="icon iconfont">&#xe608;</span>
+                <div class="name">通知</div>
+                <div class="code-name">&amp;#xe608;</div>
+              </li>
+          
             <li class="dib">
             <li class="dib">
               <span class="icon iconfont">&#xe620;</span>
               <span class="icon iconfont">&#xe620;</span>
                 <div class="name">功能管理</div>
                 <div class="name">功能管理</div>
@@ -150,9 +156,9 @@
 <pre><code class="language-css"
 <pre><code class="language-css"
 >@font-face {
 >@font-face {
   font-family: 'iconfont';
   font-family: 'iconfont';
-  src: url('iconfont.woff2?t=1681783689038') format('woff2'),
-       url('iconfont.woff?t=1681783689038') format('woff'),
-       url('iconfont.ttf?t=1681783689038') format('truetype');
+  src: url('iconfont.woff2?t=1687225905766') format('woff2'),
+       url('iconfont.woff?t=1687225905766') format('woff'),
+       url('iconfont.ttf?t=1687225905766') format('truetype');
 }
 }
 </code></pre>
 </code></pre>
           <h3 id="-iconfont-">第二步:定义使用 iconfont 的样式</h3>
           <h3 id="-iconfont-">第二步:定义使用 iconfont 的样式</h3>
@@ -178,6 +184,15 @@
       <div class="content font-class">
       <div class="content font-class">
         <ul class="icon_lists dib-box">
         <ul class="icon_lists dib-box">
           
           
+          <li class="dib">
+            <span class="icon iconfont icon-mall-tongzhi"></span>
+            <div class="name">
+              通知
+            </div>
+            <div class="code-name">.icon-mall-tongzhi
+            </div>
+          </li>
+          
           <li class="dib">
           <li class="dib">
             <span class="icon iconfont icon-mall-gongnengguanli"></span>
             <span class="icon iconfont icon-mall-gongnengguanli"></span>
             <div class="name">
             <div class="name">
@@ -322,6 +337,14 @@
       <div class="content symbol">
       <div class="content symbol">
           <ul class="icon_lists dib-box">
           <ul class="icon_lists dib-box">
           
           
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-mall-tongzhi"></use>
+                </svg>
+                <div class="name">通知</div>
+                <div class="code-name">#icon-mall-tongzhi</div>
+            </li>
+          
             <li class="dib">
             <li class="dib">
                 <svg class="icon svg-icon" aria-hidden="true">
                 <svg class="icon svg-icon" aria-hidden="true">
                   <use xlink:href="#icon-mall-gongnengguanli"></use>
                   <use xlink:href="#icon-mall-gongnengguanli"></use>

+ 7 - 3
src/assets/icon/iconfont.css

@@ -1,8 +1,8 @@
 @font-face {
 @font-face {
   font-family: "iconfont"; /* Project id 4020610 */
   font-family: "iconfont"; /* Project id 4020610 */
-  src: url('iconfont.woff2?t=1681783689038') format('woff2'),
-       url('iconfont.woff?t=1681783689038') format('woff'),
-       url('iconfont.ttf?t=1681783689038') format('truetype');
+  src: url('iconfont.woff2?t=1687225905766') format('woff2'),
+       url('iconfont.woff?t=1687225905766') format('woff'),
+       url('iconfont.ttf?t=1687225905766') format('truetype');
 }
 }
 
 
 .iconfont {
 .iconfont {
@@ -22,6 +22,10 @@
   -moz-osx-font-smoothing: grayscale;
   -moz-osx-font-smoothing: grayscale;
 }
 }
 
 
+.icon-mall-tongzhi:before {
+  content: "\e608";
+}
+
 .icon-mall-gongnengguanli:before {
 .icon-mall-gongnengguanli:before {
   content: "\e620";
   content: "\e620";
 }
 }

File diff suppressed because it is too large
+ 1 - 1
src/assets/icon/iconfont.js


+ 7 - 0
src/assets/icon/iconfont.json

@@ -5,6 +5,13 @@
   "css_prefix_text": "icon-mall-",
   "css_prefix_text": "icon-mall-",
   "description": "",
   "description": "",
   "glyphs": [
   "glyphs": [
+    {
+      "icon_id": "27003809",
+      "name": "通知",
+      "font_class": "tongzhi",
+      "unicode": "e608",
+      "unicode_decimal": 58888
+    },
     {
     {
       "icon_id": "1320055",
       "icon_id": "1320055",
       "name": "功能管理",
       "name": "功能管理",

BIN
src/assets/icon/iconfont.ttf


BIN
src/assets/icon/iconfont.woff


BIN
src/assets/icon/iconfont.woff2


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/banner.jpg


BIN
src/assets/image/banner.png


BIN
src/assets/image/banner2.png


BIN
src/assets/image/banner3.png


BIN
src/assets/image/banner4.png


BIN
src/assets/image/banner5.png


BIN
src/assets/image/banner6.png


BIN
src/assets/image/banner7.png


BIN
src/assets/image/birthday.png


BIN
src/assets/image/logo.png


BIN
src/assets/image/recordBtn.png


+ 47 - 3
src/components/AppHeader.vue

@@ -1,16 +1,18 @@
 <template>
 <template>
     <div style="position: relative;height: 5rem;">
     <div style="position: relative;height: 5rem;">
         <nav class="header-box" :class="{'visible':visible}">
         <nav class="header-box" :class="{'visible':visible}">
+            <img class="logo" src="./../assets/image/logo.png"/>
             <router-link to="/home">
             <router-link to="/home">
                 <div class="header-item">
                 <div class="header-item">
-                    <i class="icon-mall-gongnengguanli"></i>功能列表
+                    <i class="icon-mall-gongnengguanli"></i>首页
                 </div>
                 </div>
             </router-link>
             </router-link>
             <router-link to="/noticeCenter">
             <router-link to="/noticeCenter">
                 <div class="header-item">
                 <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>
                         <i class="el-icon-message-solid"></i>
-                    <!-- </el-badge> -->
+                    </el-badge>
                     消息中心
                     消息中心
                 </div>
                 </div>
             </router-link>
             </router-link>
@@ -19,16 +21,58 @@
                     <i class="el-icon-trophy"></i>积分排行
                     <i class="el-icon-trophy"></i>积分排行
                 </div>
                 </div>
             </router-link> -->
             </router-link> -->
+            <div class="userInfo flex-center">
+                <el-avatar fit="fill" :size="50" :src="avatar"></el-avatar>
+                <div class="nameAndIntegral">
+                    <div>姓名: {{ userInfo.userName }}</div>
+                    <div>积分: <span class="blue">{{ userInfo.surplusIntegral }}</span></div>
+                </div>
+            </div>
         </nav>
         </nav>
     </div>
     </div>
 </template>
 </template>
 <script>
 <script>
+import { mapGetters } from 'vuex'
 export default {
 export default {
     props:['visible'],
     props:['visible'],
+    data() {
+        return {};
+    },
+    computed: {
+        // 将 getter 映射到当前组件的计算属性
+        ...mapGetters(['userInfo','avatar'])
+    },
+    created() {},
+    methods: {},
 }
 }
 </script>
 </script>
 
 
 <style>
 <style>
+.logo{
+    position: absolute;
+    left: 80px;
+    width: 160px;
+}
+.userInfo{
+    position: absolute;
+    right: 80px;
+    
+}
+.flex-center{
+    display: flex;
+    justify-content: center;
+    align-items: center;
+}
+.nameAndIntegral{
+    margin-left: 10px;
+    font-size: 14px;
+    color: #252933;
+    line-height: px;
+    line-height: 23px;
+}
+.blue {
+    color: #1e80ff;
+}
 .header-box {
 .header-box {
   display: flex;
   display: flex;
   justify-content: center;
   justify-content: center;

+ 24 - 17
src/components/AppSidebar.vue

@@ -20,11 +20,18 @@ export default {
   data() {
   data() {
     return {
     return {
         sideBarList:[
         sideBarList:[
+            {
+                value:'pointsMall',
+                name:'积分商城',
+                path:'/home/pointsMall',
+                icon:'icon-mall-jifenshangcheng',
+                checked:false,
+            },
             {
             {
                 value:'index',
                 value:'index',
-                name:'首页',
+                name:'最新通知',
                 path:'/home/index',
                 path:'/home/index',
-                icon:'icon-mall-shouye',
+                icon:'icon-mall-tongzhi',
                 checked:false,
                 checked:false,
             },
             },
             {
             {
@@ -34,27 +41,20 @@ export default {
                 icon:'icon-mall-qiandao',
                 icon:'icon-mall-qiandao',
                 checked:false,
                 checked:false,
             },
             },
-            {
-                value:'pointsMall',
-                name:'积分商城',
-                path:'/home/pointsMall',
-                icon:'icon-mall-jifenshangcheng',
-                checked:false,
-            },
             {
             {
                 value:'festiveEvents',
                 value:'festiveEvents',
-                name:'节日活动',
+                name:'活动列表',
                 path:'/home/festiveEvents',
                 path:'/home/festiveEvents',
                 icon:'icon-mall-huodong',
                 icon:'icon-mall-huodong',
                 checked:false,
                 checked:false,
             },
             },
-            // {
-            //     value:'myMedal',
-            //     name:'我的勋章',
-            //     path:'/home/myMedal',
-            //     icon:'icon-mall-xunzhang',
-            //     checked:false,
-            // },
+            {
+                value:'myMedal',
+                name:'我的勋章',
+                path:'/home/myMedal',
+                icon:'icon-mall-xunzhang',
+                checked:false,
+            },
             {
             {
                 value:'commend',
                 value:'commend',
                 name:'员工表彰',
                 name:'员工表彰',
@@ -83,6 +83,13 @@ export default {
                 icon:'icon-mall-zuorenwuzhuanjifen',
                 icon:'icon-mall-zuorenwuzhuanjifen',
                 checked:false,
                 checked:false,
             },
             },
+            // {
+            //     value:'citeList',
+            //     name:'表彰上传',
+            //     path:'/home/citeList',
+            //     icon:'icon-mall-zuorenwuzhuanjifen',
+            //     checked:false,
+            // },
         ],
         ],
         employeeDynamics: false,
         employeeDynamics: false,
         pointsMall: false,
         pointsMall: false,

+ 15 - 36
src/components/SiderInfo.vue

@@ -10,74 +10,59 @@
                     <div class="second-line">点亮在商城的每一天</div>
                     <div class="second-line">点亮在商城的每一天</div>
                 </div>
                 </div>
                 <button class="btn signedin-btn">
                 <button class="btn signedin-btn">
-                    <span @click="goToSignIn" v-if="dataInfo.signStatus==0" class="btn-text sign-text">去签到</span>
+                    <span @click="goToSignIn" v-if="userInfo.signStatus==0" class="btn-text sign-text">去签到</span>
                     <span v-else class="btn-text signed-text">已签到</span>
                     <span v-else class="btn-text signed-text">已签到</span>
                 </button>
                 </button>
             </div>
             </div>
         </div>
         </div>
         <div class="signin-tip sidebar-block">
         <div class="signin-tip sidebar-block">
             <div class="avatar">
             <div class="avatar">
-                <el-avatar fit="fill" :size="65" :src="avatarUrl"></el-avatar>
-                <span class="name">{{ dataInfo.userName }}</span>
+                <el-avatar fit="fill" :size="65" :src="avatar"></el-avatar>
+                <span class="name">{{ userInfo.userName }}</span>
             </div>
             </div>
             <div class="info">
             <div class="info">
                 <div class="info-item">
                 <div class="info-item">
                     <div class="item-title">部门:</div>
                     <div class="item-title">部门:</div>
-                    <div :title="dataInfo.deptName" class="item-content" style="line-height: 1.5rem;">{{ dataInfo.deptName }}</div>
+                    <div :title="userInfo.deptName" class="item-content" style="line-height: 1.5rem;">{{ userInfo.deptName }}</div>
                 </div>
                 </div>
                 <div class="info-item">
                 <div class="info-item">
                     <div class="item-title">积分:</div>
                     <div class="item-title">积分:</div>
-                    <div class="item-content blue">{{ dataInfo.surplusIntegral }}</div>
+                    <div class="item-content blue">{{ userInfo.surplusIntegral }}</div>
                 </div>
                 </div>
-                <!-- <div class="info-item">
-                    <div class="item-title">排行:</div>
-                    <div class="item-content blue">{{ dataInfo.nowtop }}</div>
-                </div> -->
-                <!-- <div class="info-item">
-                    <div class="item-title">勋章:</div>
-                    <div class="item-content blue">{{ dataInfo.medalCount }}枚</div>
-                </div> -->
             </div>
             </div>
         </div>
         </div>
         <div class="sidebar-block sticky-block">
         <div class="sidebar-block sticky-block">
             <div class="avatar">
             <div class="avatar">
-                <el-avatar :size="65" :src="avatarUrl"></el-avatar>
-                <span class="name">{{ dataInfo.userName }}</span>
+                <el-avatar :size="65" :src="avatar"></el-avatar>
+                <span class="name">{{ userInfo.userName }}</span>
             </div>
             </div>
             <div class="info">
             <div class="info">
                 <div class="info-item">
                 <div class="info-item">
                     <div class="item-title">部门:</div>
                     <div class="item-title">部门:</div>
-                    <div :title="dataInfo.deptName" class="item-content">{{ dataInfo.deptName }}</div>
+                    <div :title="userInfo.deptName" class="item-content">{{ userInfo.deptName }}</div>
                 </div>
                 </div>
                 <div class="info-item">
                 <div class="info-item">
                     <div class="item-title">积分:</div>
                     <div class="item-title">积分:</div>
-                    <div class="item-content blue">{{ dataInfo.surplusIntegral }}</div>
+                    <div class="item-content blue">{{ userInfo.surplusIntegral }}</div>
                 </div>
                 </div>
-                <!-- <div class="info-item">
-                    <div class="item-title">排行:</div>
-                    <div class="item-content blue">{{ dataInfo.nowtop }}</div>
-                </div> -->
-                <!-- <div class="info-item">
-                    <div class="item-title">勋章:</div>
-                    <div class="item-content blue">{{ dataInfo.medalCount }}枚</div>
-                </div> -->
             </div>
             </div>
         </div>
         </div>
     </div>
     </div>
 </template>
 </template>
 <script>
 <script>
-import { useInfo } from "@/api/allApi";
+import { mapGetters } from 'vuex'
 export default {
 export default {
     data() {
     data() {
         return {
         return {
             hoursTip:'你好!',
             hoursTip:'你好!',
             isActive: false,
             isActive: false,
-            dataInfo:{},
-            avatarUrl: "https://cube.elemecdn.com/3/7c/3ea6beec64369c2642b92c6726f1epng.png",
         };
         };
     },
     },
+    computed: {
+        // 将 getter 映射到当前组件的计算属性
+        ...mapGetters(['userInfo','avatar'])
+    },
     created() {
     created() {
-        this.getUserInfo();
         this.getHoursTip()
         this.getHoursTip()
     },
     },
     methods: {
     methods: {
@@ -86,12 +71,6 @@ export default {
                 path: '/home/signIn',
                 path: '/home/signIn',
             });
             });
         },
         },
-        getUserInfo(){
-            useInfo().then(response=>{
-                this.dataInfo = response.data.data;
-                this.avatarUrl = this.dataInfo.httpFile + this.dataInfo.headImage;
-            })
-        },
         getHoursTip() {
         getHoursTip() {
             let date = new Date();
             let date = new Date();
             if (date.getHours() >= 0 && date.getHours() < 12) {
             if (date.getHours() >= 0 && date.getHours() < 12) {
@@ -241,7 +220,7 @@ destroyed() {
 }
 }
 
 
 .info .info-item {
 .info .info-item {
-    font-size: 1rem;
+    font-size: 14px;
     display: flex;
     display: flex;
     justify-content: space-between;
     justify-content: space-between;
     line-height: 1.5rem;
     line-height: 1.5rem;

+ 5 - 1
src/main.js

@@ -2,13 +2,16 @@ import Vue from 'vue'
 import App from './App.vue'
 import App from './App.vue'
 // import { msgTips } from "@/api/allApi";
 // import { msgTips } from "@/api/allApi";
 import router from './router'
 import router from './router'
+import store from './store'
 import ElementUI from 'element-ui';
 import ElementUI from 'element-ui';
 import 'element-ui/lib/theme-chalk/index.css';
 import 'element-ui/lib/theme-chalk/index.css';
 import './assets/css/global.css';
 import './assets/css/global.css';
 import './assets/icon/iconfont.css';
 import './assets/icon/iconfont.css';
 import './permission' // permission control
 import './permission' // permission control
 
 
-const prodUrl = 'http://47.103.79.143:9085/admin/storage/create';//发布地址
+// const prodUrl = 'https://xiaoyou.dgtis.com/admin/storage/create';//正式地址
+
+const prodUrl = 'http://47.103.79.143:9085/admin/storage/create';//阿里云地址
 
 
 const devUrl = 'http://47.103.79.143:9085/admin/storage/create';//测试地址
 const devUrl = 'http://47.103.79.143:9085/admin/storage/create';//测试地址
 
 
@@ -25,5 +28,6 @@ Vue.config.productionTip = false;
 Vue.use(ElementUI);
 Vue.use(ElementUI);
 new Vue({
 new Vue({
   router,
   router,
+  store,
   render: h => h(App)
   render: h => h(App)
 }).$mount('#app')
 }).$mount('#app')

+ 5 - 2
src/permission.js

@@ -4,6 +4,7 @@ import { getToken, setToken } from '@/utils/auth' // getToken from cookie
 import { lockStatus,unlock } from "@/api/allApi";
 import { lockStatus,unlock } from "@/api/allApi";
 //路由跳转之前
 //路由跳转之前
 router.beforeEach((to, _from, next) => {
 router.beforeEach((to, _from, next) => {
+  // setToken('3ea044ab331806ba7b38202175e1cf31');
   const path = to.path;
   const path = to.path;
   const Authorization = 'c17596fa2a5fb3b1c3d8515d9f69d468'
   const Authorization = 'c17596fa2a5fb3b1c3d8515d9f69d468'
   setToken(Authorization);
   setToken(Authorization);
@@ -17,7 +18,7 @@ router.beforeEach((to, _from, next) => {
       lockStatus().then(response=>{
       lockStatus().then(response=>{
         let lockStatus = response.data.data;
         let lockStatus = response.data.data;
           if(lockStatus==0){
           if(lockStatus==0){
-            MessageBox.alert('欢迎来到DGT积分商城系统,已为您发放工龄年限积分,请前往个人中心查看。', '积分发放通知', {
+            MessageBox.alert('欢迎来到DGT商城系统,已为您发放工龄年限积分,请前往个人中心查看。', '积分发放通知', {
               confirmButtonText: '确定',
               confirmButtonText: '确定',
               showClose:false,
               showClose:false,
               callback: action => {
               callback: action => {
@@ -33,7 +34,9 @@ router.beforeEach((to, _from, next) => {
       
       
     }else{
     }else{
       
       
-      const prodHref = 'http://dgtcloud.dgtis.com/oneportal/login';//发布地址
+      // const prodHref = 'http://dgt.dgtis.com/oneportal/login';//正式地址
+
+      const prodHref = 'http://dgtcloud.dgtis.com/oneportal/login';//阿里云地址
       
       
       const devHref = 'http://dgtcloud.dgtis.com/oneportal/login';//测试地址
       const devHref = 'http://dgtcloud.dgtis.com/oneportal/login';//测试地址
 
 

+ 26 - 2
src/router/index.js

@@ -13,7 +13,7 @@ const routes = [
   {
   {
     path: '/home',
     path: '/home',
     component: HomeView,
     component: HomeView,
-    redirect:'/home/index',
+    redirect:'/home/pointsMall',
     children: [
     children: [
       {
       {
         path: '/home/index',
         path: '/home/index',
@@ -38,10 +38,18 @@ const routes = [
         path: '/home/commend',
         path: '/home/commend',
         component: () => import('@/views/HomeView/Commend.vue')
         component: () => import('@/views/HomeView/Commend.vue')
       },
       },
+      {
+        path: '/home/commend/commendDetail',
+        component: () => import('@/views/HomeView/CommendDetail.vue')
+      },
       {
       {
         path: '/home/earnPoints',
         path: '/home/earnPoints',
         component: () => import('@/views/HomeView/EarnPoints.vue')
         component: () => import('@/views/HomeView/EarnPoints.vue')
       },
       },
+      {
+        path: '/home/citeList',
+        component: () => import('@/views/HomeView/CiteList.vue')
+      },
       {
       {
         path: '/home/pointsMall',
         path: '/home/pointsMall',
         component: () => import('@/views/HomeView/PointsMall.vue')
         component: () => import('@/views/HomeView/PointsMall.vue')
@@ -54,6 +62,10 @@ const routes = [
         path: '/home/myCenter/goodsDetail',
         path: '/home/myCenter/goodsDetail',
         component: () => import('@/views/HomeView/GoodsDetail.vue')
         component: () => import('@/views/HomeView/GoodsDetail.vue')
       },
       },
+      {
+        path: '/home/pointsMall/goodDetail',
+        component: () => import('@/views/HomeView/GoodDetail.vue')
+      },
       {
       {
         path: '/home/welfareList',
         path: '/home/welfareList',
         component: () => import('@/views/HomeView/WelfareList.vue')
         component: () => import('@/views/HomeView/WelfareList.vue')
@@ -69,7 +81,19 @@ const routes = [
       {
       {
         path: '/home/festiveEvents/game',
         path: '/home/festiveEvents/game',
         component: () => import('@/views/HomeView/Game.vue')
         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')
+      },
     ]
     ]
   },
   },
   {
   {

+ 5 - 0
src/store/getters.js

@@ -0,0 +1,5 @@
+const getters = {
+  userInfo: state => state.user.userInfo,
+  avatar: state => state.user.avatar,
+}
+export default getters

+ 15 - 0
src/store/index.js

@@ -0,0 +1,15 @@
+import Vue from 'vue'
+import Vuex from 'vuex'
+import user from './modules/user'
+import getters from './getters'
+
+Vue.use(Vuex)
+
+const store = new Vuex.Store({
+  modules: {
+    user
+  },
+  getters
+})
+
+export default store

+ 35 - 0
src/store/modules/user.js

@@ -0,0 +1,35 @@
+import { useInfo } from '@/api/allApi'
+
+const user = {
+  state: {
+    userInfo:{},
+    avatar: '',
+  },
+
+  mutations: {
+    SET_USERINFO: (state, userInfo) => {
+      state.userInfo = userInfo
+    },
+    SET_AVATAR: (state, avatar) => {
+      state.avatar = avatar
+    },
+  },
+
+  actions: {
+    // 获取用户信息
+    GetUserInfo({ commit }) {
+      return new Promise((resolve, reject) => {
+        useInfo().then(response => {
+          const data = response.data.data
+          commit('SET_USERINFO', data)
+          commit('SET_AVATAR', data.httpFile + data.headImage)
+          resolve(response)
+        }).catch(error => {
+          reject(error)
+        })
+      })
+    },
+  }
+}
+
+export default user

+ 11 - 5
src/utils/request.js

@@ -2,9 +2,13 @@ import axios from 'axios'
 import { Message, MessageBox } from 'element-ui'
 import { Message, MessageBox } from 'element-ui'
 import { getToken } from '@/utils/auth'
 import { getToken } from '@/utils/auth'
 
 
-let prodBaseURL = 'http://47.103.79.143:9085/admin';//发布地址
+// let prodBaseURL = 'https://xiaoyou.dgtis.com/admin';//正式地址
 
 
-let devBaseURL = 'http://47.103.79.143:9085/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
 // create an axios instance
 const service = axios.create({
 const service = axios.create({
   baseURL: process.env.NODE_ENV === 'production' ? prodBaseURL : devBaseURL,// api 的 base_url
   baseURL: process.env.NODE_ENV === 'production' ? prodBaseURL : devBaseURL,// api 的 base_url
@@ -36,9 +40,11 @@ service.interceptors.response.use(
           type: 'error'
           type: 'error'
         }).then(() => {
         }).then(() => {
             
             
-            const prodHref = 'http://dgtcloud.dgtis.com/oneportal/login';//发布地址
-            //测试地址
-            const devHref = 'http://dgtcloud.dgtis.com/oneportal/login'; //测试地址
+            // const prodHref = 'http://dgt.dgtis.com/oneportal/login';//正式地址
+
+            const prodHref = 'http://dgtcloud.dgtis.com/oneportal/login';//阿里云地址
+          
+            const devHref = 'http://192.168.100.208:8080/oneportal/login'; //测试地址
 
 
             location.href = process.env.NODE_ENV === 'production' ? prodHref : devHref;
             location.href = process.env.NODE_ENV === 'production' ? prodHref : devHref;
         })
         })

+ 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>

+ 15 - 4
src/views/HomeView/Commend.vue

@@ -7,7 +7,7 @@
                     <div v-else class="content-body">
                     <div v-else class="content-body">
                         <div v-for="(item,index) in dataList" :key="index" class="serie">
                         <div v-for="(item,index) in dataList" :key="index" class="serie">
                             <div class="badge-icon-list">
                             <div class="badge-icon-list">
-                                <div v-for="(childItem,childIndex) in item.userInfos" :key="childIndex" class="badge-icon-item">
+                                <div v-for="(childItem,childIndex) in item.recipientsList" :key="childIndex" @click="handleClickCommend(childItem)" class="badge-icon-item">
                                     <div class="badge-item-icon">
                                     <div class="badge-item-icon">
                                         <img :src="httpFile + childItem.headImage" style="border-radius: 50%;">
                                         <img :src="httpFile + childItem.headImage" style="border-radius: 50%;">
                                     </div> 
                                     </div> 
@@ -25,7 +25,7 @@
                     <div v-else class="content-body">
                     <div v-else class="content-body">
                         <div v-for="(item,index) in dataList" :key="index" class="serie">
                         <div v-for="(item,index) in dataList" :key="index" class="serie">
                             <div class="badge-icon-list">
                             <div class="badge-icon-list">
-                                <div v-for="(childItem,childIndex) in item.userInfos" :key="childIndex" class="badge-icon-item">
+                                <div v-for="(childItem,childIndex) in item.recipientsList" :key="childIndex" @click="handleClickCommend(childItem)" class="badge-icon-item">
                                     <div class="badge-item-icon">
                                     <div class="badge-item-icon">
                                         <img :src="httpFile + childItem.headImage" style="border-radius: 50%;">
                                         <img :src="httpFile + childItem.headImage" style="border-radius: 50%;">
                                     </div> 
                                     </div> 
@@ -44,7 +44,7 @@
                     <div v-else class="content-body">
                     <div v-else class="content-body">
                         <div v-for="(item,index) in dataList" :key="index" class="serie">
                         <div v-for="(item,index) in dataList" :key="index" class="serie">
                             <div class="badge-icon-list">
                             <div class="badge-icon-list">
-                                <div v-for="(childItem,childIndex) in item.userInfos" :key="childIndex" class="badge-icon-item">
+                                <div v-for="(childItem,childIndex) in item.recipientsList" :key="childIndex" @click="handleClickCommend(childItem)" class="badge-icon-item">
                                     <div class="badge-item-icon">
                                     <div class="badge-item-icon">
                                         <img :src="httpFile + childItem.headImage" style="border-radius: 50%;">
                                         <img :src="httpFile + childItem.headImage" style="border-radius: 50%;">
                                     </div> 
                                     </div> 
@@ -64,7 +64,7 @@
     </div>
     </div>
 </template>
 </template>
 <script scoped>
 <script scoped>
-import { commendPage, } from "@/api/allApi";
+import { commendPage } from "@/api/allApi";
 export default {
 export default {
     data() {
     data() {
         return {
         return {
@@ -77,6 +77,17 @@ export default {
         this.getList(32);
         this.getList(32);
     },
     },
     methods: {
     methods: {
+        handleClickCommend(val) {
+            debugger
+            console.log(val);
+            this.$router.push({
+                path: '/home/commend/commendDetail',
+                query: {
+                    id: val.commendId,
+                    loginId:val.loginId
+                }
+            });
+        },
         getList(val){
         getList(val){
             commendPage({type:val}).then(response=>{
             commendPage({type:val}).then(response=>{
                 this.httpFile = response.data.data.httpFile;
                 this.httpFile = response.data.data.httpFile;

+ 115 - 0
src/views/HomeView/CommendDetail.vue

@@ -0,0 +1,115 @@
+<template>
+  <div class="timeline-container">
+      <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.content"></div>
+                  
+              </div>
+          </div>
+          <SiderInfo></SiderInfo>
+      </div>
+  </div>
+</template>
+<script>
+import { commendDetail } from "@/api/allApi";
+import SiderInfo from '@/components/SiderInfo.vue'
+export default{
+components: {
+  SiderInfo
+},
+data() {
+  return {
+      data:{},
+  };
+},
+created(){
+  this.getDataInfo(this.$route.query.id,this.$route.query.loginId);
+},
+methods:{
+      getDataInfo(id,loginId){
+        commendDetail({commendId:id,loginId:loginId}).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.2rem;
+  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>

+ 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>

+ 273 - 24
src/views/HomeView/EarnPoints.vue

@@ -4,11 +4,9 @@
       <el-tabs style="padding: 0 20px 40px 20px;" v-model="activeName" @tab-click="handleClick">
       <el-tabs style="padding: 0 20px 40px 20px;" v-model="activeName" @tab-click="handleClick">
         <el-tab-pane label="证书列表" name="first">
         <el-tab-pane label="证书列表" name="first">
           <el-button size="small" type="primary" @click="dialogVisible = true">上传证书</el-button>
           <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" type="index" width="50" label="序号"></el-table-column>
-            <el-table-column min-width="100" align="center" prop="typeName" label="类型"></el-table-column>
-            <el-table-column align="center" prop="categoryName" min-width="100" label="名称"></el-table-column>
-            <el-table-column align="center" min-width="200" label="证书">
+            <el-table-column align="center" min-width="200" label="附件">
               <template slot-scope="props">
               <template slot-scope="props">
                 <div v-for="(item, index) in props.row.files" :key="index">
                 <div v-for="(item, index) in props.row.files" :key="index">
                   <a style="color: #1e80ff;" target="_blank" :href="item.url">{{ item.oldName }}</a>
                   <a style="color: #1e80ff;" target="_blank" :href="item.url">{{ item.oldName }}</a>
@@ -16,9 +14,19 @@
 
 
               </template>
               </template>
             </el-table-column>
             </el-table-column>
+            <el-table-column min-width="100" align="center" prop="typeName" label="证书大类"></el-table-column>
+            <el-table-column align="center" prop="categoryName" min-width="100" label="证书类型"></el-table-column>
+            <el-table-column align="center" prop="title" min-width="100" label="证书名称"></el-table-column>
             <el-table-column align="center" prop="integral" min-width="100" label="积分"></el-table-column>
             <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="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="createTime" 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>
           </el-table>
           <!-- 分页 -->
           <!-- 分页 -->
           <div class="myPage">
           <div class="myPage">
@@ -28,6 +36,77 @@
             </el-pagination>
             </el-pagination>
           </div>
           </div>
         </el-tab-pane>
         </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-tab-pane label="积分获取规则" name="second">
           <el-empty v-if="!integralRules" :image-size="200"></el-empty>
           <el-empty v-if="!integralRules" :image-size="200"></el-empty>
           <div v-else v-html="integralRules"></div>
           <div v-else v-html="integralRules"></div>
@@ -36,14 +115,16 @@
       </el-tabs>
       </el-tabs>
     </div>
     </div>
     <el-dialog title="上传证书" :visible.sync="dialogVisible" width="40%">
     <el-dialog title="上传证书" :visible.sync="dialogVisible" width="40%">
-      <el-form :rules="rules" ref="dataForm" :model="dataForm" label-width="80px">
-        <el-form-item label="类别:" prop="type">
+      <el-form :rules="rules" ref="dataForm" :model="dataForm" label-width="100px">
+        <el-form-item label="证书类别:" prop="type">
           <el-cascader clearable size="small" style="width: 95%;" v-model="dataForm.type" :options="typeList"
           <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>
 
 
-        <el-form-item label="证书:" prop="fileIds">
+        <el-form-item label="证书附件:" prop="fileIds">
           <el-upload :action="fileUrl" :file-list="dataForm.files" :on-success="handleAvatarSuccess"
           <el-upload :action="fileUrl" :file-list="dataForm.files" :on-success="handleAvatarSuccess"
             :before-upload="beforeUploadFile" :on-remove="handleRemove">
             :before-upload="beforeUploadFile" :on-remove="handleRemove">
             <el-button size="small" type="primary">点击上传</el-button>
             <el-button size="small" type="primary">点击上传</el-button>
@@ -54,10 +135,48 @@
         <el-button size="small" type="primary" @click="submitForm">确 定</el-button>
         <el-button size="small" type="primary" @click="submitForm">确 定</el-button>
       </span>
       </span>
     </el-dialog>
     </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>
   </div>
 </template>
 </template>
 <script scoped>
 <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'
 import { handleTree } from '@/utils/index'
 export default {
 export default {
   data() {
   data() {
@@ -70,6 +189,7 @@ export default {
       dialogVisible: false,
       dialogVisible: false,
       rules: {
       rules: {
         type: [{ required: true, message: "请选择证书类别", trigger: "blur" }],
         type: [{ required: true, message: "请选择证书类别", trigger: "blur" }],
+        title: [{ required: true, message: "请填写证书名称", trigger: "blur" }],
         fileIds: [{ required: true, message: "请上传附件", trigger: "blur" }],
         fileIds: [{ required: true, message: "请上传附件", trigger: "blur" }],
       },
       },
       total: 0,
       total: 0,
@@ -79,23 +199,53 @@ export default {
       },
       },
       dataForm: {
       dataForm: {
         type: [],
         type: [],
+        title: '',
         fileIds: '',
         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() {
   created() {
+    this.getTypeListCite();
+    this.getAllUserList();
+    this.getDataListCite();
     this.getTypeList();
     this.getTypeList();
     this.getDataList();
     this.getDataList();
     this.getIntegralNotice();
     this.getIntegralNotice();
   },
   },
   methods: {
   methods: {
-    getTypeList(){
+    getTypeList() {
       certificatType().then(response => {
       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) {
     handleClick(tab, event) {
       console.log(tab.name, event);
       console.log(tab.name, event);
     },
     },
@@ -120,10 +270,10 @@ export default {
       console.log(file);
       console.log(file);
       const size = file.size / 1024 / 1024;
       const size = file.size / 1024 / 1024;
       console.log(size);
       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) {
     handleAvatarSuccess(res, file, fileList) {
       console.log(file, fileList);
       console.log(file, fileList);
@@ -159,10 +309,11 @@ export default {
                 type: "success",
                 type: "success",
                 duration: 2000,
                 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(() => { });
             .catch(() => { });
         } else {
         } else {
@@ -185,10 +336,108 @@ export default {
       this.getDataList()
       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>
 </script>
 <style scoped>
 <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 {
 .right-wrap {
   width: 100%;
   width: 100%;
 }
 }

+ 39 - 13
src/views/HomeView/FestiveEvents.vue

@@ -12,8 +12,11 @@
                             <img :src="item.imgUrl" alt="图片" class="prize-img">
                             <img :src="item.imgUrl" alt="图片" class="prize-img">
                         </div>
                         </div>
                         <div class="content">
                         <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>
                         <div class="btn-container">
                         <div class="btn-container">
                             <button v-if="item.status==1" class="ui-btn default medium btn">活动未开始</button>
                             <button v-if="item.status==1" class="ui-btn default medium btn">活动未开始</button>
@@ -72,14 +75,26 @@ export default {
             })
             })
         },
         },
         handleClickReceive(val){
         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
+                    }
+                });
+            }
         }
         }
     }
     }
 };
 };
@@ -148,8 +163,10 @@ export default {
 }
 }
 
 
 .prize-card .img-container .prize-img {
 .prize-card .img-container .prize-img {
-    max-height: 120px;
-    max-width: 120px;
+    width: 100%;
+    height: 100%;
+    /* max-height: 120px;
+    max-width: 120px; */
 }
 }
 
 
 .prize-card .content {
 .prize-card .content {
@@ -257,5 +274,14 @@ export default {
     justify-content: center;
     justify-content: center;
 }
 }
 </style>
 </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 {
 .right-wrap {
     background-color: #fff;
     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></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>

+ 46 - 20
src/views/HomeView/GoodsDetail.vue

@@ -35,7 +35,7 @@
                 </div>
                 </div>
               </div>
               </div>
               <p class="phone">{{ data.contactPhone }}</p>
               <p class="phone">{{ data.contactPhone }}</p>
-              <p class="address">{{ data.contactAddr }}{{ data.contactEmail }}</p>
+              <p class="address">{{ data.addressStr + data.street + data.contactAddr }}</p>
             </div>
             </div>
           </div>
           </div>
       </div>
       </div>
@@ -49,6 +49,7 @@
               <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 style="text-align: center;">兑换方式</th>
               <th style="text-align: center;">兑换方式</th>
+              <th v-if="data.reclaimAddrName" style="text-align: center;">领取地点</th>
               <th style="text-align: center;">总计</th>
               <th style="text-align: center;">总计</th>
             </tr>
             </tr>
           </thead>
           </thead>
@@ -57,20 +58,21 @@
               <td>
               <td>
                 <div class="prize-info">
                 <div class="prize-info">
                   <div class="prize-img-container">
                   <div class="prize-img-container">
-                    <el-image :src="data.imgUrl" :preview-src-list="[data.imgUrl]"
+                    <el-image :src="data.imgUrl" v-if="data.imgUrl" :preview-src-list="[data.imgUrl]"
                                         class="prize-img"></el-image>
                                         class="prize-img"></el-image>
                   </div>
                   </div>
                   <div class="prize-detail-info">
                   <div class="prize-detail-info">
-                    <h3 class="title">{{ data.name }}</h3>
-                    <p class="desc">
+                    <h3 style="color: #1e80ff;" class="title" @click="handleClickGood(data.skuDesc)">{{ data.name }}</h3>
+                    <!-- <p class="desc">
                       <span v-if="data.location">{{ data.location }}</span>
                       <span v-if="data.location">{{ data.location }}</span>
-                    </p>
+                    </p> -->
                   </div>
                   </div>
                 </div>
                 </div>
               </td>
               </td>
               <td style="text-align: center;">{{ data.skuCount }}</td>
               <td style="text-align: center;">{{ data.skuCount }}</td>
               <td style="text-align: center;">{{ data.price }} 积分</td>
               <td style="text-align: center;">{{ data.price }} 积分</td>
               <td style="text-align: center;">{{ data.deliveryTypeName }}</td>
               <td style="text-align: center;">{{ data.deliveryTypeName }}</td>
+              <td v-if="data.reclaimAddrName" style="text-align: center;">{{ data.reclaimAddrName }}</td>
               <td style="text-align: center;" class="finlly-price">
               <td style="text-align: center;" class="finlly-price">
                 {{ data.total }} 积分
                 {{ data.total }} 积分
               </td>
               </td>
@@ -84,9 +86,11 @@
             <tr>
             <tr>
               <th width="35%">兑换物品</th>
               <th width="35%">兑换物品</th>
               <!-- <th>数量</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 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>
             </tr>
           </thead>
           </thead>
           <tbody>
           <tbody>
@@ -94,23 +98,23 @@
               <td>
               <td>
                 <div class="prize-info">
                 <div class="prize-info">
                   <div class="prize-img-container">
                   <div class="prize-img-container">
-                    <el-image :src="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>
                                         class="prize-img"></el-image>
                   </div>
                   </div>
                   <div class="prize-detail-info">
                   <div class="prize-detail-info">
                     <h3 class="title">{{ data.name }}</h3>
                     <h3 class="title">{{ data.name }}</h3>
-                    <p class="desc">
+                    <!-- <p class="desc">
                       <span v-if="data.location">{{ data.location }}</span>
                       <span v-if="data.location">{{ data.location }}</span>
-                    </p>
+                    </p> -->
                   </div>
                   </div>
                 </div>
                 </div>
               </td>
               </td>
               <!-- <td>{{ skuCount }}</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;">{{ 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>
             </tr>
           </tbody>
           </tbody>
         </table>
         </table>
@@ -122,7 +126,7 @@
         <el-table-column align="center" prop="orderStatus" label="状态"></el-table-column>
         <el-table-column align="center" prop="orderStatus" label="状态"></el-table-column>
         <el-table-column align="center" prop="createTime" label="处理时间"></el-table-column>
         <el-table-column align="center" prop="createTime" label="处理时间"></el-table-column>
       </el-table>
       </el-table>
-      <div class="footer" v-if="(data.orderType == 3 || data.orderType == 4) && data.deliveryType != 3">
+      <div class="footer" v-if="(data.orderType == 3 || data.orderType == 4) && (data.deliveryType == 0 || data.deliveryType == 1 || data.deliveryType == 2)">
         <div class="left-info">
         <div class="left-info">
           <span class="info-title">
           <span class="info-title">
             <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"
             <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"
@@ -163,7 +167,7 @@
           </div>
           </div>
         </div>
         </div>
       </div>
       </div>
-      <div v-if="data.deliveryType == 3">
+      <div v-if="data.deliveryType == 3 || data.deliveryType == 4">
         <div class="right" style="text-align: right;" v-if="data.orderType == 3">
         <div class="right" style="text-align: right;" v-if="data.orderType == 3">
           <div class="btn-line">
           <div class="btn-line">
             <el-button @click="handleClickConfirm(0)" type="primary" round>确认收货</el-button>
             <el-button @click="handleClickConfirm(0)" type="primary" round>确认收货</el-button>
@@ -171,18 +175,25 @@
         </div>
         </div>
       </div>
       </div>
     </el-card>
     </el-card>
+    <el-dialog title="物品详情" :visible.sync="dialogVisibleGoods" width="40%">
+            <div v-html="data.skuDesc"></div>
+        </el-dialog>
   </div>
   </div>
 </template>
 </template>
 <script>
 <script>
+import { setTab } from '@/utils/auth';
 import { orderInfo, orderConfirm } from "@/api/allApi";
 import { orderInfo, orderConfirm } from "@/api/allApi";
 export default {
 export default {
   data() {
   data() {
     return {
     return {
+      skuDesc:'',
+      dialogVisibleGoods:false,
       orderId: this.$route.query.orderId,
       orderId: this.$route.query.orderId,
       comment: '',
       comment: '',
       logs: [],
       logs: [],
       skuCount: 1,
       skuCount: 1,
       data: {},
       data: {},
+      imgUrls:[],
     };
     };
   },
   },
   created() {
   created() {
@@ -190,10 +201,28 @@ export default {
     this.getInfo(orderId);
     this.getInfo(orderId);
   },
   },
   methods: {
   methods: {
+    handleClickGood(val) {
+            this.skuDesc = val;
+            if(this.skuDesc){
+                this.dialogVisibleGoods = true;
+            }
+            // this.$router.push({
+            //     path: '/home/pointsMall/goodDetail',
+            //     query: {
+            //         id: id,
+            //     }
+            // });
+        },
     getInfo(orderId) {
     getInfo(orderId) {
       orderInfo({ orderId: orderId }).then((response) => {
       orderInfo({ orderId: orderId }).then((response) => {
         this.data = response.data.data;
         this.data = response.data.data;
         this.logs = response.data.data.logs;
         this.logs = response.data.data.logs;
+        let imgs = response.data.data.imgs;
+        if(imgs){
+          imgs.forEach(element => {
+            this.imgUrls.push(element.url);
+            });
+        }               
       })
       })
     },
     },
     handleClickConfirm(val) {
     handleClickConfirm(val) {
@@ -212,6 +241,7 @@ export default {
           message: '提交成功!',
           message: '提交成功!',
           type: 'success'
           type: 'success'
         });
         });
+        setTab('exchange');
         this.$router.push({
         this.$router.push({
           path: '/home/myCenter',
           path: '/home/myCenter',
         });
         });
@@ -415,6 +445,7 @@ img {
 }
 }
 
 
 .table .prize-detail-info .title {
 .table .prize-detail-info .title {
+  cursor: pointer;
   font-weight: 400;
   font-weight: 400;
   font-size: 14px;
   font-size: 14px;
   line-height: 24px;
   line-height: 24px;
@@ -513,9 +544,4 @@ img {
   border: 1px solid transparent;
   border: 1px solid transparent;
 }
 }
 </style>
 </style>
-<style>
-.el-dialog__body {
-  padding-bottom: 0px;
-}
-</style>
 
 

+ 17 - 21
src/views/HomeView/Index.vue

@@ -2,16 +2,15 @@
     <div class="timeline-container">
     <div class="timeline-container">
         <div class="timeline-content">
         <div class="timeline-content">
             <div class="timeline-entry-list">
             <div class="timeline-entry-list">
-                <div class="hot-list-wrap">
+                <img src="@/assets/image/banner4.png" alt="banner" class="banner">
+                <!-- <div class="hot-list-wrap">
                     <el-empty :image-size="200" v-if="bannerList.length < 1"></el-empty>
                     <el-empty :image-size="200" v-if="bannerList.length < 1"></el-empty>
-                    <el-carousel arrow="never" indicator-position="none" height="207px" :interval="5000" v-if="bannerList.length > 0">
+                    <el-carousel arrow="never" indicator-position="none" height="120px" :interval="5000" v-if="bannerList.length > 0">
                         <el-carousel-item v-for="(item, index) in bannerList" :key="index">
                         <el-carousel-item v-for="(item, index) in bannerList" :key="index">
-                            <!-- <router-link to="/productTrials"> -->
-                                <img style="width: 100%; height: 100%" :src="item.url" />
-                            <!-- </router-link> -->
+                                <img style="width: 100%; height: 100%" :src="item.url" class="banner" />
                         </el-carousel-item>
                         </el-carousel-item>
                     </el-carousel>
                     </el-carousel>
-                </div>
+                </div> -->
                 <div class="entry-list-container">
                 <div class="entry-list-container">
                     <div class="tab-header">
                     <div class="tab-header">
                         <span class="tab-title">最新通知</span>
                         <span class="tab-title">最新通知</span>
@@ -21,7 +20,7 @@
                         <div v-for="(item,index) in dataList" :key="index" @click="handleClickMag(item.msgId)" class="list-item">
                         <div v-for="(item,index) in dataList" :key="index" @click="handleClickMag(item.msgId)" class="list-item">
                             <div class="meta-container">
                             <div class="meta-container">
                                 <div class="user-message">
                                 <div class="user-message">
-                                        系统通知
+                                    {{ item.type==2 ? '生日祝福' : '系统通知'}}
                                 </div> 
                                 </div> 
                                 <div class="dividing"></div> 
                                 <div class="dividing"></div> 
                                 <div class="date">{{ item.createTime }}</div>
                                 <div class="date">{{ item.createTime }}</div>
@@ -46,7 +45,7 @@
     </div>
     </div>
 </template>
 </template>
 <script scoped>
 <script scoped>
-import { msgList,useInfo } from "@/api/allApi";
+import { msgList } from "@/api/allApi";
 import SiderInfo from '@/components/SiderInfo.vue';
 import SiderInfo from '@/components/SiderInfo.vue';
 import { debounce } from '@/utils/index';
 import { debounce } from '@/utils/index';
 export default{
 export default{
@@ -58,10 +57,7 @@ export default{
         dataInfo:'',
         dataInfo:'',
         bannerList: [
         bannerList: [
             {
             {
-                url: require('@/assets/image/banner.png')
-            },
-            {
-                url: require('@/assets/image/banner.jpg')
+                url: require('@/assets/image/banner4.png')
             },
             },
         ],
         ],
         dataList:[],
         dataList:[],
@@ -71,14 +67,6 @@ export default{
   },
   },
  created(){
  created(){
     this.getDataList();
     this.getDataList();
-    // useInfo().then(response=>{
-    //     let lockStatus = response.data.data.lockStatus;
-    //     if(lockStatus==0){
-
-    //     }else{
-    //         this.getDataList();
-    //     }
-    // })
   },
   },
   methods:{
   methods:{
     handleClickMag(id) {
     handleClickMag(id) {
@@ -93,7 +81,7 @@ export default{
         let data = {
         let data = {
             limit:10,
             limit:10,
             page:this.page,
             page:this.page,
-            type:0,
+            type:'0,2',
         };
         };
         msgList(data).then(response=>{
         msgList(data).then(response=>{
             if(this.page==1){
             if(this.page==1){
@@ -140,6 +128,14 @@ export default{
 }
 }
 </script>
 </script>
 <style scoped>
 <style scoped>
+.banner {
+    width: 100%;
+    height: 100px;
+    background-color: #2c82fe;
+    border-radius: 4px;
+    margin-bottom: 15px;
+    display: block;
+}
 .timeline-container{
 .timeline-container{
     margin: 0 auto;
     margin: 0 auto;
 }
 }

+ 29 - 2
src/views/HomeView/MsgDetail.vue

@@ -11,7 +11,15 @@
                             {{ data.createTime }}
                             {{ data.createTime }}
                         </div>
                         </div>
                     </div>
                     </div>
-                    <div class="markdown-body" v-html="data.content"></div>
+                    <div v-if="data.type==2" class="markdown-body">
+                        <div class="userInfo">
+                            <el-avatar fit="fill" :size="65" :src="avatarUrl"></el-avatar>
+                            <div style="text-align: center;font-size: 16px;font-weight: 600;">{{ dataInfo.userName }}</div>
+                        </div>
+                        <img  src="./../../assets/image/birthday.png">
+                    </div>
+                    <div v-else class="markdown-body" v-html="data.content"></div>
+                    
                 </div>
                 </div>
             </div>
             </div>
             <SiderInfo></SiderInfo>
             <SiderInfo></SiderInfo>
@@ -19,7 +27,7 @@
     </div>
     </div>
 </template>
 </template>
 <script>
 <script>
-import { msgInfo } from "@/api/allApi";
+import { msgInfo,useInfo } from "@/api/allApi";
 import SiderInfo from '@/components/SiderInfo.vue'
 import SiderInfo from '@/components/SiderInfo.vue'
 export default{
 export default{
   components: {
   components: {
@@ -28,12 +36,21 @@ export default{
   data() {
   data() {
     return {
     return {
         data:{},
         data:{},
+        dataInfo:{},
+        avatarUrl: "",
     };
     };
   },
   },
   created(){
   created(){
+    this.getUserInfo();
     this.getDataInfo(this.$route.query.id);
     this.getDataInfo(this.$route.query.id);
   },
   },
   methods:{
   methods:{
+    getUserInfo(){
+            useInfo().then(response=>{
+                this.dataInfo = response.data.data;
+                this.avatarUrl = this.dataInfo.httpFile + this.dataInfo.headImage;
+            })
+        },
         getDataInfo(id){
         getDataInfo(id){
             msgInfo({msgId:id}).then(response => {
             msgInfo({msgId:id}).then(response => {
                     this.data = response.data.data;
                     this.data = response.data.data;
@@ -43,6 +60,16 @@ export default{
 }
 }
 </script>
 </script>
 <style scoped>
 <style scoped>
+.userInfo{
+    width: 65px;
+    position: absolute;
+    top: 37%;
+    left: 46%;
+    display: flex;
+    flex-direction: column;
+    justify-content: center;
+    align-content: center;
+}
 .timeline-container{
 .timeline-container{
     margin: 0 auto;
     margin: 0 auto;
 }
 }

+ 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-tabs style="padding: 0 20px 40px 20px;" v-model="activeName" @tab-click="handleClick">
                 <el-tab-pane label="我的积分" name="first">
                 <el-tab-pane label="我的积分" name="first">
                     <el-radio-group v-model="firstTabPosition" style="margin-bottom: 30px;">
                     <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 }}
                             {{ item.name }}
                         </el-radio-button>
                         </el-radio-button>
                     </el-radio-group>
                     </el-radio-group>
@@ -16,7 +15,7 @@
                             </el-option>
                             </el-option>
                         </el-select>
                         </el-select>
                         <el-button size="small" style="margin-right: 30px;" type="primary" @click="handleFilter">查询</el-button>
                         <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" 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="integralTypeName" label="积分类型"></el-table-column>
                             <el-table-column align="center" prop="integral" 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 v-for="(item,index) in thirdList" :key="index" class="item isVirtual">
                                         <div class="img-wapper">
                                         <div class="img-wapper">
                                             <el-image
                                             <el-image
-                                                :src="item.imgUrl"
+                                                :src="item.couponImg"
                                                 class="item-icon"></el-image>
                                                 class="item-icon"></el-image>
                                         </div>
                                         </div>
                                         <div class="main">
                                         <div class="main">
-                                            <p class="goods_name">{{ item.title }}</p>
+                                            <p class="goods_name">{{ item.couponName }}</p>
                                             <p class="date">
                                             <p class="date">
                                                 兑换截止时间:
                                                 兑换截止时间:
-                                                {{ item.endTime }}
+                                                {{ item.enableEndTime }}
                                             </p>
                                             </p>
                                             
                                             
                                         </div>
                                         </div>
@@ -119,19 +118,82 @@
                         </div>
                         </div>
                     </div>
                     </div>
                 </el-tab-pane>
                 </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>
             </el-tabs>
         </div>
         </div>
 
 
     </div>
     </div>
 </template>
 </template>
 <script scoped>
 <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'
 import { getTab,setTab } from '@/utils/auth'
 export default {
 export default {
     data() {
     data() {
         return {
         return {
-            
+            answerList:[],
+            prizeList:[],
             firstList:[],
             firstList:[],
             firstTabPosition: 'integralList',
             firstTabPosition: 'integralList',
             firstTabsList: [
             firstTabsList: [
@@ -144,6 +206,18 @@ export default {
                     name: '积分规则',
                     name: '积分规则',
                 },
                 },
             ],
             ],
+            fourthTabPosition:'1',
+            fourthTabsList: [
+                {
+                    value: '1',
+                    name: '答题',
+                },
+                {
+                    value: '2',
+                    name: '抽奖',
+                },
+            ],
+            
             secondList:[
             secondList:[
                
                
             ],
             ],
@@ -186,7 +260,8 @@ export default {
             listQuery: {
             listQuery: {
                 page: 1,
                 page: 1,
                 limit: 10,
                 limit: 10,
-                type:''
+                type:'',
+                createTime:''
             },
             },
         };
         };
     },
     },
@@ -205,6 +280,18 @@ export default {
         this.getIntegralNotice();
         this.getIntegralNotice();
     },
     },
     methods: {
     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(){
             setTab('gift');
             setTab('gift');
         },
         },
@@ -230,14 +317,12 @@ export default {
             })
             })
         },
         },
         getThirdList(){
         getThirdList(){
-            welfareList({status:'1'}).then(response=>{
+            myWelfareList().then(response=>{
                 const dataList = response.data.data;
                 const dataList = response.data.data;
                 dataList.forEach(element => {
                 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;
                 this.thirdList = dataList;
             })
             })
@@ -253,17 +338,35 @@ export default {
         handleFilter() {
         handleFilter() {
             this.listQuery.page = 1
             this.listQuery.page = 1
             this.getFirstList();
             this.getFirstList();
+            this.getAnswerList();
+            this.getPrizeList();
         },
         },
         handleSizeChange(val) {
         handleSizeChange(val) {
             this.listQuery.limit = val;
             this.listQuery.limit = val;
             this.getFirstList();
             this.getFirstList();
+            this.getAnswerList();
+            this.getPrizeList();
         },
         },
         handleCurrentChange(val) {
         handleCurrentChange(val) {
             this.listQuery.page = val;
             this.listQuery.page = val;
             this.getFirstList();
             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) {
         handleClickSecondTabs(val) {
             if(val=='all'){
             if(val=='all'){
@@ -272,9 +375,14 @@ export default {
             this.getSecondList(val);
             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;
             var name = tab.name;
             if(name=='first'){
             if(name=='first'){
                 this.getFirstList();
                 this.getFirstList();
@@ -285,6 +393,9 @@ export default {
             if(name=='third'){
             if(name=='third'){
                 this.getThirdList();
                 this.getThirdList();
             }
             }
+            if(name=='fourth'){
+                this.getAnswerList();
+            }
         },
         },
         
         
     }
     }

File diff suppressed because it is too large
+ 16 - 152
src/views/HomeView/MyMedal.vue


+ 126 - 37
src/views/HomeView/PointsMall.vue

@@ -1,6 +1,17 @@
 <template>
 <template>
     <div class="right-wrap">
     <div class="right-wrap">
-        <img src="@/assets/image/banner4.png" alt="banner" class="banner">
+        <!-- <img src="@/assets/image/banner4.png" alt="banner" class="banner"> -->
+        <div class="hot-list-wrap">
+                    <el-empty :image-size="200" v-if="bannerList.length < 1"></el-empty>
+                    <!-- arrow="never" indicator-position="none" -->
+                    <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.dictValue" class="banner" />
+                            <!-- </router-link> -->
+                        </el-carousel-item>
+                    </el-carousel>
+                </div>
         <div class="notice-board">
         <div class="notice-board">
             <div class="notice-header">
             <div class="notice-header">
                 <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"
                 <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"
@@ -36,12 +47,12 @@
                             {{ item.dictLabel }}
                             {{ item.dictLabel }}
                         </div>
                         </div>
                     </div>
                     </div>
-                    <div class="tab-list" style="margin-top: 10px;">
+                    <!-- <div class="tab-list" style="margin-top: 10px;">
                         <div :class="{ 'tab': true, 'checked': item.checked }" v-for="(item) in deliveryTypeList"
                         <div :class="{ 'tab': true, 'checked': item.checked }" v-for="(item) in deliveryTypeList"
                             :key="item.type" @click="choseDeliveryType(item)">
                             :key="item.type" @click="choseDeliveryType(item)">
                             {{ item.name }}
                             {{ item.name }}
                         </div>
                         </div>
-                    </div>
+                    </div> -->
                     <div class="tab-list" style="margin-top: 10px;">
                     <div class="tab-list" style="margin-top: 10px;">
                         <div :class="{ 'tab': true, 'checked': item.checked }" v-for="(item) in orderByClauseList"
                         <div :class="{ 'tab': true, 'checked': item.checked }" v-for="(item) in orderByClauseList"
                             :key="item.orderByClause" @click="changeOrderByClause(item)">
                             :key="item.orderByClause" @click="changeOrderByClause(item)">
@@ -53,11 +64,11 @@
                         <div v-else class="prize-list">
                         <div v-else class="prize-list">
                             <div v-for="(item, index) in goodsList" :key="index" class="prize-card prize-item">
                             <div v-for="(item, index) in goodsList" :key="index" class="prize-card prize-item">
                                 <div class="img-container">
                                 <div class="img-container">
-                                    <el-image :src="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>
                                         class="prize-img"></el-image>
                                 </div>
                                 </div>
                                 <div class="content">
                                 <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="desc"><span v-if="item.deliveryTypeName">{{ item.deliveryTypeName }}</span></p>
                                     <p class="redeem-info">
                                     <p class="redeem-info">
                                         <span title="积分" class="price">
                                         <span title="积分" class="price">
@@ -81,9 +92,13 @@
                                     </p>
                                     </p>
                                 </div>
                                 </div>
                                 <div class="btn-container">
                                 <div class="btn-container">
-                                    <button @click="handleClickExchange(item.skuId)"
-                                        class="ui-btn primary medium default btn">
-                                        {{item.stock == 0 ? '敬请期待' : '立即兑换'}}
+                                    <button v-if="item.stock == 0" @click="handleClickExchange(item.skuId)"
+                                        class="ui-btn gray medium btn">
+                                        敬请期待
+                                    </button>
+                                    <button v-else @click="handleClickExchange(item.skuId)"
+                                        class="ui-btn primary medium btn">
+                                       立即兑换
                                     </button>
                                     </button>
                                 </div>
                                 </div>
                             </div>
                             </div>
@@ -102,11 +117,11 @@
                         <div class="prize-list">
                         <div class="prize-list">
                             <div v-for="(item, index) in giftList" :key="index" class="prize-card prize-item">
                             <div v-for="(item, index) in giftList" :key="index" class="prize-card prize-item">
                                 <div class="img-container">
                                 <div class="img-container">
-                                    <el-image :src="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>
                                         class="prize-img"></el-image>
                                 </div>
                                 </div>
                                 <div class="content">
                                 <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="desc"><span v-if="item.deliveryTypeName">{{ item.deliveryTypeName }}</span></p>
                                     <p class="redeem-info">
                                     <p class="redeem-info">
                                         <span title="福利券" class="price">
                                         <span title="福利券" class="price">
@@ -124,15 +139,19 @@
                                                     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"
                                                     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>
                                                     fill="#FFFFFF" p-id="1487"></path>
                                             </svg>
                                             </svg>
-                                            {{ item.title }}
+                                            兑换券
                                         </span>
                                         </span>
                                         <span class="count">{{ item.stock }}库存</span>
                                         <span class="count">{{ item.stock }}库存</span>
                                     </p>
                                     </p>
                                 </div>
                                 </div>
                                 <div class="btn-container">
                                 <div class="btn-container">
-                                    <button @click="handleClickExchange(item.skuId)"
+                                    <button v-if="item.stock == 0" @click="handleClickExchange(item.skuId)"
+                                        class="ui-btn medium default btn">
+                                        敬请期待
+                                    </button>
+                                    <button v-else @click="handleClickExchange(item.skuId)"
                                         class="ui-btn primary medium default btn">
                                         class="ui-btn primary medium default btn">
-                                        {{item.stock == 0 ? '敬请期待' : '立即兑换'}}
+                                       立即兑换
                                     </button>
                                     </button>
                                 </div>
                                 </div>
                             </div>
                             </div>
@@ -143,23 +162,29 @@
                 </el-tab-pane>
                 </el-tab-pane>
             </el-tabs>
             </el-tabs>
         </div>
         </div>
+        <el-dialog title="物品详情" :visible.sync="dialogVisible" width="40%">
+            <div v-html="skuDesc"></div>
+        </el-dialog>
 
 
     </div>
     </div>
 </template>
 </template>
 <script>
 <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 { getTab } from '@/utils/auth'
 import { debounce } from '@/utils/index'
 import { debounce } from '@/utils/index'
 export default {
 export default {
     data() {
     data() {
         return {
         return {
+            dialogVisible: false,
+            skuDesc:'',
+            bannerList: [],
             page: 1,
             page: 1,
             pages: 1,
             pages: 1,
             // tab 列表
             // tab 列表
             options: [],
             options: [],
             goodsName: '',
             goodsName: '',
             productAttribute: '',
             productAttribute: '',
-            orderByClause: 'asc',
+            orderByClause: 'desc',
             deliveryType: '',
             deliveryType: '',
             deliveryTypeList: [
             deliveryTypeList: [
                 {
                 {
@@ -190,15 +215,15 @@ export default {
             ],
             ],
             orderByClauseList: [
             orderByClauseList: [
                 {
                 {
-                    icon: 'el-icon-top',
+                    icon: 'el-icon-bottom',
                     checked: true,
                     checked: true,
-                    orderByClause: 'asc',
+                    orderByClause: 'desc',
                 },
                 },
                 {
                 {
-                    icon: 'el-icon-bottom',
+                    icon: 'el-icon-top',
                     checked: false,
                     checked: false,
-                    orderByClause: 'desc',
-                }
+                    orderByClause: 'asc',
+                },
             ],
             ],
             choseList: [],
             choseList: [],
             curChosed: '',
             curChosed: '',
@@ -209,6 +234,7 @@ export default {
         };
         };
     },
     },
     created() {
     created() {
+        this.getBannerList();
         const Tab = getTab();
         const Tab = getTab();
         if (Tab == 'gift') {
         if (Tab == 'gift') {
             this.activeName = 'giftNotice';
             this.activeName = 'giftNotice';
@@ -219,6 +245,25 @@ export default {
         this.getNotice(this.activeName);
         this.getNotice(this.activeName);
     },
     },
     methods: {
     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() {
         handleFilter() {
             this.page = 1;
             this.page = 1;
             this.getFirstList();
             this.getFirstList();
@@ -233,7 +278,7 @@ export default {
             this.getFirstList();
             this.getFirstList();
         },
         },
         getIntegralTypes() {
         getIntegralTypes() {
-            integralTypes({ dictType: 'mall_sku_attribute' }).then(response => {
+            dictList({ dictType: 'mall_sku_attribute' }).then(response => {
                 console.log(response.data.data);
                 console.log(response.data.data);
                 const dataList = response.data.data;
                 const dataList = response.data.data;
                 const data = {
                 const data = {
@@ -268,10 +313,21 @@ export default {
 
 
                     });
                     });
                     this.choseList = dataList;
                     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);
                         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;
                     })
                     })
                 }
                 }
             })
             })
@@ -299,7 +355,7 @@ export default {
                 element.checked = false;
                 element.checked = false;
             });
             });
             item.checked = true;
             item.checked = true;
-            this.curChosed = item.welfareId;
+            this.curChosed = item.actId;
             this.getSecondList();
             this.getSecondList();
         },
         },
         getNotice(val) {
         getNotice(val) {
@@ -315,27 +371,49 @@ export default {
                 name: this.goodsName,
                 name: this.goodsName,
                 productAttribute: this.productAttribute,
                 productAttribute: this.productAttribute,
                 orderByClause: this.orderByClause,
                 orderByClause: this.orderByClause,
-                deliveryType: this.deliveryType
+                // deliveryType: this.deliveryType
             }
             }
 
 
             integralList(params).then(response => {
             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) {
                 if (this.page == 1) {
-                    this.goodsList = response.data.data.list;
+                    this.goodsList = list;
                     this.page = response.data.data.pageNum;
                     this.page = response.data.data.pageNum;
                     this.pages = response.data.data.pages;
                     this.pages = response.data.data.pages;
                 } else {
                 } else {
                     this.goodsList = [
                     this.goodsList = [
                         ...this.goodsList,
                         ...this.goodsList,
-                        ...response.data.data.list
+                        ...list
                     ]
                     ]
                 }
                 }
                 ++this.page
                 ++this.page
             })
             })
         },
         },
         getSecondList() {
         getSecondList() {
-            festivalList({ welfareId: this.curChosed }).then(response => {
+            festivalList({ actId: this.curChosed }).then(response => {
                 console.log(response.data.data);
                 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) {
         handleClick(tab, event) {
@@ -353,7 +431,8 @@ export default {
                 path: '/home/pointsMall/redeem',
                 path: '/home/pointsMall/redeem',
                 query: {
                 query: {
                     id: id,
                     id: id,
-                    activeName: this.activeName
+                    name: this.activeName,
+                    type:this.curChosed,
                 }
                 }
             });
             });
         },
         },
@@ -387,11 +466,14 @@ export default {
 };
 };
 </script>
 </script>
 <style scoped>
 <style scoped>
+.hot-list-wrap{
+    margin-bottom: 10px;
+}
 button {
 button {
     -webkit-appearance: none;
     -webkit-appearance: none;
     -moz-appearance: none;
     -moz-appearance: none;
     appearance: none;
     appearance: none;
-    background-color: #007fff;
+    /* background-color: #007fff; */
     color: #fff;
     color: #fff;
     border-radius: 2px;
     border-radius: 2px;
     border: none;
     border: none;
@@ -442,6 +524,8 @@ button {
 }
 }
 
 
 .prize-card .img-container .prize-img {
 .prize-card .img-container .prize-img {
+    /* width: 100%;
+    height: 100%; */
     max-height: 120px;
     max-height: 120px;
     max-width: 120px;
     max-width: 120px;
 }
 }
@@ -452,6 +536,7 @@ button {
 
 
 .prize-card .content .desc,
 .prize-card .content .desc,
 .prize-card .content .title {
 .prize-card .content .title {
+    cursor: pointer;
     white-space: nowrap;
     white-space: nowrap;
     overflow: hidden;
     overflow: hidden;
     text-overflow: ellipsis;
     text-overflow: ellipsis;
@@ -494,7 +579,7 @@ button {
     font-weight: 500;
     font-weight: 500;
     font-size: 14px;
     font-size: 14px;
     line-height: 24px;
     line-height: 24px;
-    color: #1e80ff;
+    color: #ff8462;
     flex: auto;
     flex: auto;
     display: flex;
     display: flex;
     align-items: center;
     align-items: center;
@@ -520,12 +605,16 @@ button {
     border-radius: 16px;
     border-radius: 16px;
 }
 }
 
 
-.ui-btn.medium {
+.medium {
     padding: 5px 16px;
     padding: 5px 16px;
 }
 }
 
 
-.ui-btn.primary {
-    background-color: #1d7dfa;
+.primary {
+    background-image: linear-gradient(to right, #f5b543,#faa029);
+}
+.gray{
+    background-color: gray;
+    opacity: 0.5;
 }
 }
 
 
 .ui-btn {
 .ui-btn {
@@ -604,7 +693,7 @@ button {
     height: 1.8rem;
     height: 1.8rem;
     background-color: #fff;
     background-color: #fff;
     border-radius: 1rem;
     border-radius: 1rem;
-    font-size: 0.5rem;
+    font-size: 12px;
     line-height: 1.8rem;
     line-height: 1.8rem;
     color: #8a9aa9;
     color: #8a9aa9;
     padding: 0 0.83rem;
     padding: 0 0.83rem;

File diff suppressed because it is too large
+ 555 - 151
src/views/HomeView/RedeemView.vue


+ 24 - 38
src/views/HomeView/SignIn.vue

@@ -14,6 +14,12 @@
                   <span class="text">本月累计签到天数</span>
                   <span class="text">本月累计签到天数</span>
                 </div>
                 </div>
               </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-card">
                 <div class="figure">{{ integral }}</div>
                 <div class="figure">{{ integral }}</div>
                 <div class="attention">
                 <div class="attention">
@@ -33,7 +39,7 @@
       <div class="index-aside aside" :class="{ 'sticky top': isActive }">
       <div class="index-aside aside" :class="{ 'sticky top': isActive }">
         <div class="signin-tip sidebar-block signin">
         <div class="signin-tip sidebar-block signin">
           <div class="first-line">
           <div class="first-line">
-            <button @click="signIn" v-if="dataInfo.signStatus == 0" class="btn">
+            <button @click="signIn" v-if="userInfo.signStatus == 0" class="btn">
               立即签到
               立即签到
             </button>
             </button>
             <button v-else class="btn signed-btn">今日已签到</button>
             <button v-else class="btn signed-btn">今日已签到</button>
@@ -41,54 +47,38 @@
         </div>
         </div>
         <div class="signin-tip sidebar-block">
         <div class="signin-tip sidebar-block">
           <div class="avatar">
           <div class="avatar">
-            <el-avatar :size="65" :src="avatarUrl"></el-avatar>
-            <span class="name">{{ dataInfo.userName }}</span>
+            <el-avatar :size="65" :src="avatar"></el-avatar>
+            <span class="name">{{ userInfo.userName }}</span>
           </div>
           </div>
           <div class="info">
           <div class="info">
             <div class="info-item">
             <div class="info-item">
               <div class="item-title">部门:</div>
               <div class="item-title">部门:</div>
-              <div :title="dataInfo.deptName" class="item-content">{{ dataInfo.deptName }}</div>
+              <div :title="userInfo.deptName" class="item-content">{{ userInfo.deptName }}</div>
             </div>
             </div>
             <div class="info-item">
             <div class="info-item">
               <div class="item-title">积分:</div>
               <div class="item-title">积分:</div>
               <div class="item-content blue">
               <div class="item-content blue">
-                {{ dataInfo.surplusIntegral }}
+                {{ userInfo.surplusIntegral }}
               </div>
               </div>
             </div>
             </div>
-            <!-- <div class="info-item">
-                    <div class="item-title">排行:</div>
-                    <div class="item-content blue">{{ dataInfo.nowtop }}</div>
-                </div> -->
-                <!-- <div class="info-item">
-                    <div class="item-title">勋章:</div>
-                    <div class="item-content blue">{{ dataInfo.medalCount }}枚</div>
-                </div> -->
           </div>
           </div>
         </div>
         </div>
         <div class="sidebar-block sticky-block">
         <div class="sidebar-block sticky-block">
           <div class="avatar">
           <div class="avatar">
-            <el-avatar :size="65" :src="avatarUrl"></el-avatar>
-            <span class="name">{{ dataInfo.userName }}</span>
+            <el-avatar :size="65" :src="avatar"></el-avatar>
+            <span class="name">{{ userInfo.userName }}</span>
           </div>
           </div>
           <div class="info">
           <div class="info">
             <div class="info-item">
             <div class="info-item">
               <div class="item-title">部门:</div>
               <div class="item-title">部门:</div>
-              <div :title="dataInfo.deptName" class="item-content" style="line-height: 1.5rem;">{{ dataInfo.deptName }}</div>
+              <div :title="userInfo.deptName" class="item-content" style="line-height: 1.5rem;">{{ userInfo.deptName }}</div>
             </div>
             </div>
             <div class="info-item">
             <div class="info-item">
               <div class="item-title">积分:</div>
               <div class="item-title">积分:</div>
               <div class="item-content blue">
               <div class="item-content blue">
-                {{ dataInfo.surplusIntegral }}
+                {{ userInfo.surplusIntegral }}
               </div>
               </div>
             </div>
             </div>
-            <!-- <div class="info-item">
-                    <div class="item-title">排行:</div>
-                    <div class="item-content blue">{{ dataInfo.nowtop }}</div>
-                </div> -->
-                <!-- <div class="info-item">
-                    <div class="item-title">勋章:</div>
-                    <div class="item-content blue">{{ dataInfo.medalCount }}枚</div>
-                </div> -->
           </div>
           </div>
         </div>
         </div>
       </div>
       </div>
@@ -96,7 +86,8 @@
   </div>
   </div>
 </template>
 </template>
 <script>
 <script>
-import { sign, signInfo,useInfo } from "@/api/allApi";
+import { mapGetters } from 'vuex'
+import { sign, signInfo } from "@/api/allApi";
 import calendar from '@/components/Calendar'
 import calendar from '@/components/Calendar'
 export default {
 export default {
   components: {
   components: {
@@ -108,15 +99,15 @@ export default {
       integral:'',
       integral:'',
       markDate: [],
       markDate: [],
       isActive: false,
       isActive: false,
-      dataInfo: {},
-      avatarUrl:
-        "https://cube.elemecdn.com/3/7c/3ea6beec64369c2642b92c6726f1epng.png",
       dataList: [],
       dataList: [],
     };
     };
   },
   },
+  computed: {
+        // 将 getter 映射到当前组件的计算属性
+        ...mapGetters(['userInfo','avatar'])
+  },
   created() {
   created() {
     this.getSignInfo();
     this.getSignInfo();
-    this.getUserInfo();
   },
   },
   methods: {
   methods: {
     // 点击日期
     // 点击日期
@@ -127,17 +118,12 @@ export default {
     changeMonth(date) {
     changeMonth(date) {
       console.log(date);
       console.log(date);
     },
     },
-    getUserInfo() {
-      useInfo().then((response) => {
-        this.dataInfo = response.data.data;
-        this.avatarUrl = this.dataInfo.httpFile + this.dataInfo.headImage;
-      });
-    },
     getSignInfo() {
     getSignInfo() {
       signInfo().then((response) => {
       signInfo().then((response) => {
           this.markDate = response.data.data.signDays;
           this.markDate = response.data.data.signDays;
           this.integral = response.data.data.integral;
           this.integral = response.data.data.integral;
           this.signDays = response.data.data.signDays.length;
           this.signDays = response.data.data.signDays.length;
+          this.continuousSignCount = response.data.data.continuousSignCount;
       });
       });
     },
     },
     signIn() {
     signIn() {
@@ -148,7 +134,7 @@ export default {
           type: 'success'
           type: 'success'
         });
         });
         this.getSignInfo();
         this.getSignInfo();
-        this.getUserInfo();
+        this.$store.dispatch('GetUserInfo');
       });
       });
     },
     },
     // 保存滚动值,这是兼容的写法
     // 保存滚动值,这是兼容的写法
@@ -436,7 +422,7 @@ export default {
 }
 }
 
 
 .info .info-item {
 .info .info-item {
-  font-size: 1rem;
+  font-size: 14px;
   display: flex;
   display: flex;
   justify-content: space-between;
   justify-content: space-between;
   line-height: 1.5rem;
   line-height: 1.5rem;

+ 24 - 21
src/views/HomeView/WelfareList.vue

@@ -12,14 +12,14 @@
                             <img :src="item.imgUrl" alt="图片" class="prize-img">
                             <img :src="item.imgUrl" alt="图片" class="prize-img">
                         </div>
                         </div>
                         <div class="content">
                         <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>
                         <div class="btn-container">
                         <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>
                                 class="ui-btn primary medium btn">立即领取</button>
                         </div>
                         </div>
                     </div>
                     </div>
@@ -68,26 +68,27 @@ export default {
             setTab('welfare');
             setTab('welfare');
         },
         },
         getList() {
         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(() => {
             }).catch(() => {
                
                
             })
             })
         },
         },
         handleClickReceive(id){
         handleClickReceive(id){
-            receiveWelfare({voucherId:id,status:1}).then(response => {
+            receiveWelfare({actId:id}).then(response => {
                 if(response.data.errno==0){
                 if(response.data.errno==0){
                     this.goodsList.forEach(element => {
                     this.goodsList.forEach(element => {
-                        if(element.id==id){
+                        if(element.actId==id){
                             this.imgUrl = element.imgUrl;
                             this.imgUrl = element.imgUrl;
                             this.title = element.title;
                             this.title = element.title;
                         }
                         }
@@ -164,8 +165,10 @@ export default {
 }
 }
 
 
 .prize-card .img-container .prize-img {
 .prize-card .img-container .prize-img {
-    max-height: 120px;
-    max-width: 120px;
+    width: 100%;
+    height: 100%;
+    /* max-height: 159px;
+    max-width: 223px; */
 }
 }
 
 
 .prize-card .content {
 .prize-card .content {

File diff suppressed because it is too large
+ 32 - 10
src/views/NoticeCenter.vue


+ 1 - 1
vue.config.js

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

+ 17 - 0
yarn.lock

@@ -2309,6 +2309,11 @@ chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2:
     ansi-styles "^4.1.0"
     ansi-styles "^4.1.0"
     supports-color "^7.1.0"
     supports-color "^7.1.0"
 
 
+china-division@^2.6.1:
+  version "2.6.1"
+  resolved "https://registry.npmmirror.com/china-division/-/china-division-2.6.1.tgz#a3e3e4609e81077cc97443f78c713e03d66d7fc2"
+  integrity sha512-Iq9YCEWqPcSrD7/7McKpN9QHNbn2iibLmg1NEAxLacijqJzLbytr0sLuKJNY4Exd0LA77N18Pwr9JGgU1p5S6w==
+
 chokidar@^3.5.3:
 chokidar@^3.5.3:
   version "3.5.3"
   version "3.5.3"
   resolved "https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd"
   resolved "https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd"
@@ -3024,6 +3029,13 @@ electron-to-chromium@^1.4.284:
   resolved "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.331.tgz#c8ea823968563ef2cbb3495233e9e16c48c54a4a"
   resolved "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.331.tgz#c8ea823968563ef2cbb3495233e9e16c48c54a4a"
   integrity sha512-tdtr9y9oJl8VDiS+HeB6e/JDJqdDGjIk3yRfEMHm5rDnWQ/D5SbafybAayInxolbfbH6pouV5g7ZUAwE/WVtHw==
   integrity sha512-tdtr9y9oJl8VDiS+HeB6e/JDJqdDGjIk3yRfEMHm5rDnWQ/D5SbafybAayInxolbfbH6pouV5g7ZUAwE/WVtHw==
 
 
+element-china-area-data@^6.0.2:
+  version "6.0.2"
+  resolved "https://registry.npmmirror.com/element-china-area-data/-/element-china-area-data-6.0.2.tgz#a9fd640e1068758f8a3e333d20d54939d51a26b9"
+  integrity sha512-LGVp0crOnXrcQqNc5RHwPiR8AV2qUrDl4UgZ/Qn2n/izLqMcn924gcJ/pTRPnuT74AFin2SUyMtmmcoe5PDfQQ==
+  dependencies:
+    china-division "^2.6.1"
+
 element-ui@^2.15.12:
 element-ui@^2.15.12:
   version "2.15.13"
   version "2.15.13"
   resolved "https://registry.yarnpkg.com/element-ui/-/element-ui-2.15.13.tgz#380f019ee7d15b181105587b41fd5914c308a143"
   resolved "https://registry.yarnpkg.com/element-ui/-/element-ui-2.15.13.tgz#380f019ee7d15b181105587b41fd5914c308a143"
@@ -6995,6 +7007,11 @@ vue@^2.6.14:
     "@vue/compiler-sfc" "2.7.14"
     "@vue/compiler-sfc" "2.7.14"
     csstype "^3.1.0"
     csstype "^3.1.0"
 
 
+vuex@3.0.1:
+  version "3.0.1"
+  resolved "https://registry.npmmirror.com/vuex/-/vuex-3.0.1.tgz#e761352ebe0af537d4bb755a9b9dc4be3df7efd2"
+  integrity sha512-wLoqz0B7DSZtgbWL1ShIBBCjv22GV5U+vcBFox658g6V0s4wZV9P4YjCNyoHSyIBpj1f29JBoNQIqD82cR4O3w==
+
 watchpack@^2.4.0:
 watchpack@^2.4.0:
   version "2.4.0"
   version "2.4.0"
   resolved "https://registry.npmmirror.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d"
   resolved "https://registry.npmmirror.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d"