liyongli 3 年之前
父節點
當前提交
435973a085
共有 10 個文件被更改,包括 351 次插入31 次删除
  1. 1 1
      package.json
  2. 26 0
      src/api/vote/vote.js
  3. 7 5
      src/assets/css/reset.scss
  4. 二進制
      src/assets/image/main.jpg
  5. 二進制
      src/assets/image/top.jpg
  6. 5 0
      src/config/page.js
  7. 1 1
      src/pages/study/Index.vue
  8. 264 0
      src/pages/vote/Index.vue
  9. 16 0
      src/pages/vote/index.js
  10. 31 24
      yarn.lock

+ 1 - 1
package.json

@@ -17,7 +17,7 @@
     "good-storage": "^1.1.0",
     "node-sass": "4.14.1",
     "normalize.css": "^8.0.1",
-    "vant": "^2.12.10",
+    "vant": "^2.12.27",
     "vue": "^2.6.10",
     "vue-pdf": "^4.2.0",
     "vue-video-player": "^5.0.2"

+ 26 - 0
src/api/vote/vote.js

@@ -0,0 +1,26 @@
+import request from "@/utils/request.js";
+
+/**
+ * 投票列表
+ * @param params
+ * @returns {AxiosPromise}
+ */
+export function voteList(data) {
+  return request({
+    url: "/app/info/list?" + data,
+    method: "get"
+  });
+}
+
+/**
+ * 获提交投票
+ * @param params
+ * @returns {AxiosPromise}
+ */
+export function saveVote(params) {
+  return request({
+    url: "/app/vote",
+    method: "post",
+    data: params
+  });
+}

+ 7 - 5
src/assets/css/reset.scss

@@ -1,12 +1,14 @@
+
+$themeColor: #e42417;
 .van-tabs__line,
 .van-radio__icon--checked .van-icon {
-    background-color: #e42417;
-    border-color: #e42417;
+    background-color: $themeColor;
+    border-color: $themeColor;
 }
 
 .van-nav-bar .van-icon,
 .van-nav-bar__text {
-    color: #e42417;
+    color: $themeColor;
 }
 
 
@@ -21,5 +23,5 @@
 }
 
 .van-icon{
-    color:#e42417
-}
+    color:$themeColor
+}

二進制
src/assets/image/main.jpg


二進制
src/assets/image/top.jpg


+ 5 - 0
src/config/page.js

@@ -1,5 +1,10 @@
 //这里做页面参数约定和说明,如果url没有携带requiredParams的参数则无法初始化页面
 module.exports = {
+  vote: {
+    title: "投票",
+    requiredParams: {},
+    optionalParams: {}
+  },
   userProtocol: {
     title: "用户协议",
     requiredParams: {},

+ 1 - 1
src/pages/study/Index.vue

@@ -7,7 +7,7 @@
       <van-swipe-item
         @click="() => toUrlDetail(item.id)"
         v-for="item in list"
-        :key="item.id"
+        :key="item.id + Math.random()"
       >
         <div class="bannerItem">
           <van-image :src="item.imgUrl" />

+ 264 - 0
src/pages/vote/Index.vue

@@ -0,0 +1,264 @@
+<template>
+  <div
+    style="height: 100%;font-size: 0;overflow-y: scroll;"
+    ref="votePage"
+    @scroll="scroll"
+  >
+    <img :src="require('@/assets/image/top.jpg')" alt="" srcset="" />
+    <div ref="vote" class="vote">
+      <van-checkbox-group v-model="checkboxGroup">
+        <van-cell-group>
+          <van-cell
+            :label="'作者:' + item.userName"
+            v-for="item in appNameList"
+            :key="item.infoId"
+            size="large"
+          >
+            <template #title>
+              <!-- :disabled="disable" -->
+              <van-checkbox
+                :disabled="disable"
+                checked-color="#e42417"
+                icon-size="16px"
+                :name="item.infoId"
+              >
+                {{ item.appName }}
+              </van-checkbox>
+            </template>
+            <template #default v-if="item.appDesc">
+              <van-icon
+                position="bottom"
+                @click="() => showPop(item)"
+                name="question-o"
+              />
+            </template>
+          </van-cell>
+        </van-cell-group>
+      </van-checkbox-group>
+      <div class="bottom" v-if="!disable">
+        <!-- <div class="bottom"> -->
+        <van-button type="danger" color="#e42417" @click="submit" block>
+          提 交
+        </van-button>
+      </div>
+      <van-popup
+        v-model="show"
+        closeable
+        round
+        @close="closePop"
+        position="bottom"
+        :style="{ height: '80%' }"
+      >
+        <div class="introduction">
+          <div class="head van-hairline--bottom">简介</div>
+          <div class="body" v-text="doc"></div>
+        </div>
+      </van-popup>
+    </div>
+  </div>
+</template>
+
+<script>
+import {
+  Button as vanButton,
+  Popup as vanPopup,
+  Icon as vanIcon,
+  Cell as vanCell,
+  CellGroup as vanCellGroup,
+  Checkbox as vanCheckbox,
+  CheckboxGroup as vanCheckboxGroup,
+  // Progress as vanProgress,
+  Dialog,
+  Toast
+} from "vant";
+import "vant/lib/field/style";
+import "vant/lib/dialog/style";
+import "vant/lib/toast/style";
+import "vant/lib/checkbox/style";
+import "vant/lib/button/style";
+import "vant/lib/progress/style";
+import "vant/lib/checkbox-group/style";
+
+import { voteList, saveVote } from "@/api/vote/vote.js";
+import { isIphone, isAndroid } from "@/utils/isTerminal.js";
+import { setToken } from "@/utils/common.js";
+
+let data = {
+  size: 50,
+  total: 0
+};
+let getload = true;
+export default {
+  name: "app",
+  data: function() {
+    return {
+      checkboxGroup: [],
+      appNameList: [],
+      show: false,
+      doc: "",
+      appName: "",
+      disable: false
+    };
+  },
+  methods: {
+    addList() {
+      if (!getload) return;
+      getload = false;
+      voteList("size=" + data.size + "&total=" + data.total).then(res => {
+        this.appNameList.push(...(res || []));
+        data.total = this.appNameList.length;
+        let checkboxGroup = [];
+        this.appNameList.map(v => {
+          if (v.voted) {
+            checkboxGroup.push(v.infoId);
+            if (!this.disable) this.disable = true;
+          }
+        });
+        this.checkboxGroup = checkboxGroup;
+        this.$nextTick(() => {
+          res.length && (getload = true);
+        });
+      });
+    },
+    showPop(item) {
+      if (!item.appDesc) return;
+      this.show = true;
+      this.doc = item.appDesc;
+      this.appName = item.appName;
+    },
+    closePop() {
+      this.doc = "";
+      this.appName = "";
+    },
+    scroll() {
+      console.log(this.$refs.votePage);
+      let a = this.$refs.votePage.scrollHeight;
+      let b = this.$refs.votePage.clientHeight;
+      let c = this.$refs.votePage.scrollTop;
+      if (b + c + 20 < a) return;
+      this.addList();
+    },
+    submit() {
+      if (!this.$user.accessToken) {
+        if (isAndroid) window.H5Listener.doLogin();
+        if (isIphone) window.webkit.messageHandlers.doLogin.postMessage("");
+        return;
+      }
+      Dialog.confirm({
+        title: "提交投票",
+        message: "结果提交后将无法修改,请确认是否提交?"
+      })
+        .then(() => {
+          if (!this.checkboxGroup.length)
+            return Toast({
+              message: "请选择",
+              position: "bottom"
+            });
+          let r = [];
+          for (let i = 0; i < this.checkboxGroup.length; i++) {
+            let v = this.appNameList.find(v => {
+              return v.infoId === this.checkboxGroup[i];
+            });
+            r.push({
+              infoId: v.infoId,
+              view: ""
+            });
+          }
+          saveVote({ source: "智慧融媒", items: r })
+            .then(() => {
+              this.disable = true;
+            })
+            .catch(err => {
+              console.log(err);
+            });
+          return false;
+        })
+        .catch(err => {
+          console.error(err);
+        });
+    }
+  },
+  mounted() {
+    window.voteNext = () => {
+      var payload = {
+        type: "JSbridge",
+        functionName: "getUserInfo",
+        arguments: {}
+      };
+      if (isIphone) this.$user = window.prompt(JSON.stringify(payload)) || {};
+      if (isAndroid && window.H5Listener)
+        this.$user = window.H5Listener.getUserInfo() || {};
+      this.$user = JSON.parse(this.$user);
+      console.log("-->", this.$user);
+      if (this.$user) setToken(this.$user.accessToken);
+      else setToken("");
+    };
+    window.voteNext();
+    this.addList();
+    let height = document.body.offsetHeight || 0;
+    let width = document.body.offsetWidth || 0;
+    this.$refs.vote.style.minHeight = height - (856 / 1500) * width + "px";
+  },
+  beforeDestroy: function() {},
+  components: {
+    vanPopup,
+    vanIcon,
+    vanCell,
+    vanButton,
+    vanCheckbox,
+    vanCellGroup,
+    vanCheckboxGroup
+  }
+};
+</script>
+<style lang="scss">
+$themeColor: #e6837c;
+
+.vote {
+  width: 100%;
+  padding: 1em 1em 46px 1em;
+  background-image: url("../../assets/image/main.jpg");
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+
+  .introduction {
+    .head {
+      height: 54px;
+      line-height: 54px;
+      text-align: center;
+    }
+    .body {
+      line-height: 30px;
+      text-indent: 2em;
+    }
+  }
+
+  .bottom {
+    position: fixed;
+    width: 100%;
+    left: 0%;
+    padding: 1em 0;
+    bottom: 0;
+    background-image: linear-gradient(
+      0deg,
+      rgba(170, 170, 170, 0.8) 5%,
+      rgba(0, 0, 0, 0)
+    );
+  }
+
+  .van-cell {
+    background-color: rgba(0, 0, 0, 0);
+  }
+
+  .van-checkbox__icon--checked {
+    background: #fff;
+    .van-icon-success {
+      background: $themeColor;
+      border-color: $themeColor;
+    }
+  }
+  .van-checkbox__label--disabled {
+    color: #323233;
+  }
+}
+</style>

+ 16 - 0
src/pages/vote/index.js

@@ -0,0 +1,16 @@
+import Vue from "vue";
+import App from "./Index.vue";
+import "@/pages/common.js";
+import { validateInitPage } from "@/utils/validateInitPage.js";
+
+validateInitPage() //这里还可以链式then做一些权限拦截
+  .then((pageName, pageParams) => {
+    Vue.prototype.$pageName = pageName || "";
+    Vue.prototype.$pageParams = pageParams || "";
+    new Vue({
+      render: h => h(App)
+    }).$mount("#app");
+  })
+  .catch(e => {
+    console.log(e);
+  });

+ 31 - 24
yarn.lock

@@ -759,7 +759,14 @@
     js-levenshtein "^1.1.3"
     semver "^5.5.0"
 
-"@babel/runtime@7.x", "@babel/runtime@^7.12.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.9.2":
+"@babel/runtime@7.x":
+  version "7.15.4"
+  resolved "https://registry.nlark.com/@babel/runtime/download/@babel/runtime-7.15.4.tgz#fd17d16bfdf878e6dd02d19753a39fa8a8d9c84a"
+  integrity sha1-/RfRa/34eObdAtGXU6OfqKjZyEo=
+  dependencies:
+    regenerator-runtime "^0.13.4"
+
+"@babel/runtime@^7.12.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.9.2":
   version "7.13.10"
   resolved "https://registry.npm.taobao.org/@babel/runtime/download/@babel/runtime-7.13.10.tgz?cache=0&sync_timestamp=1615243551514&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fruntime%2Fdownload%2F%40babel%2Fruntime-7.13.10.tgz#47d42a57b6095f4468da440388fdbad8bebf0d7d"
   integrity sha1-R9QqV7YJX0Ro2kQDiP262L6/DX0=
@@ -870,10 +877,10 @@
   resolved "https://registry.npm.taobao.org/@nodelib/fs.stat/download/@nodelib/fs.stat-1.1.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40nodelib%2Ffs.stat%2Fdownload%2F%40nodelib%2Ffs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b"
   integrity sha1-K1o6s/kYzKSKjHVMCBaOPwPrphs=
 
-"@popperjs/core@^2.5.4":
-  version "2.9.1"
-  resolved "https://registry.npm.taobao.org/@popperjs/core/download/@popperjs/core-2.9.1.tgz#7f554e7368c9ab679a11f4a042ca17149d70cf12"
-  integrity sha1-f1VOc2jJq2eaEfSgQsoXFJ1wzxI=
+"@popperjs/core@^2.9.2":
+  version "2.10.1"
+  resolved "https://registry.nlark.com/@popperjs/core/download/@popperjs/core-2.10.1.tgz?cache=0&sync_timestamp=1630646793367&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40popperjs%2Fcore%2Fdownload%2F%40popperjs%2Fcore-2.10.1.tgz#728ecd95ab207aab8a9a4e421f0422db329232be"
+  integrity sha1-co7NlasgequKmk5CHwQi2zKSMr4=
 
 "@soda/friendly-errors-webpack-plugin@^1.7.1":
   version "1.7.1"
@@ -928,17 +935,17 @@
   resolved "https://registry.npm.taobao.org/@types/q/download/@types/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8"
   integrity sha1-aQoUdbhPKohP0HzXl8APXzE1bqg=
 
-"@vant/icons@1.5.2":
-  version "1.5.2"
-  resolved "https://registry.npm.taobao.org/@vant/icons/download/@vant/icons-1.5.2.tgz?cache=0&sync_timestamp=1613997821784&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vant%2Ficons%2Fdownload%2F%40vant%2Ficons-1.5.2.tgz#3f3ea353a0eacd38c113757bd31836489facb10b"
-  integrity sha1-Pz6jU6DqzTjBE3V70xg2SJ+ssQs=
+"@vant/icons@^1.5.3":
+  version "1.7.0"
+  resolved "https://registry.nlark.com/@vant/icons/download/@vant/icons-1.7.0.tgz?cache=0&sync_timestamp=1626958951873&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40vant%2Ficons%2Fdownload%2F%40vant%2Ficons-1.7.0.tgz#02d427532a8142c35db159da9c364fe6890c3ac9"
+  integrity sha1-AtQnUyqBQsNdsVnanDZP5okMOsk=
 
 "@vant/popperjs@^1.0.0":
-  version "1.0.4"
-  resolved "https://registry.npm.taobao.org/@vant/popperjs/download/@vant/popperjs-1.0.4.tgz#49c20809a3828e7b036e23d50fb56121e997618f"
-  integrity sha1-ScIICaOCjnsDbiPVD7VhIemXYY8=
+  version "1.1.0"
+  resolved "https://registry.npm.taobao.org/@vant/popperjs/download/@vant/popperjs-1.1.0.tgz?cache=0&sync_timestamp=1617714772966&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vant%2Fpopperjs%2Fdownload%2F%40vant%2Fpopperjs-1.1.0.tgz#b4edee5bbfa6fb18705986e313d4fd5f17942a0f"
+  integrity sha1-tO3uW7+m+xhwWYbjE9T9XxeUKg8=
   dependencies:
-    "@popperjs/core" "^2.5.4"
+    "@popperjs/core" "^2.9.2"
 
 "@videojs/http-streaming@2.4.2":
   version "2.4.2"
@@ -973,9 +980,9 @@
     is-function "^1.0.1"
 
 "@vue/babel-helper-vue-jsx-merge-props@^1.0.0":
-  version "1.0.0"
-  resolved "https://registry.npm.taobao.org/@vue/babel-helper-vue-jsx-merge-props/download/@vue/babel-helper-vue-jsx-merge-props-1.0.0.tgz#048fe579958da408fb7a8b2a3ec050b50a661040"
-  integrity sha1-BI/leZWNpAj7eosqPsBQtQpmEEA=
+  version "1.2.1"
+  resolved "https://registry.nlark.com/@vue/babel-helper-vue-jsx-merge-props/download/@vue/babel-helper-vue-jsx-merge-props-1.2.1.tgz#31624a7a505fb14da1d58023725a4c5f270e6a81"
+  integrity sha1-MWJKelBfsU2h1YAjclpMXycOaoE=
 
 "@vue/babel-plugin-transform-vue-jsx@^1.1.2":
   version "1.1.2"
@@ -7271,9 +7278,9 @@ regenerator-runtime@^0.13.2:
   integrity sha1-fPanfY9cb2Drc8X8GVWyzrAea/U=
 
 regenerator-runtime@^0.13.4:
-  version "0.13.7"
-  resolved "https://registry.npm.taobao.org/regenerator-runtime/download/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55"
-  integrity sha1-ysLazIoepnX+qrrriugziYrkb1U=
+  version "0.13.9"
+  resolved "https://registry.nlark.com/regenerator-runtime/download/regenerator-runtime-0.13.9.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fregenerator-runtime%2Fdownload%2Fregenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52"
+  integrity sha1-iSV0Kpj/2QgUmI11Zq0wyjsmO1I=
 
 regenerator-transform@^0.14.0:
   version "0.14.1"
@@ -8777,13 +8784,13 @@ validate-npm-package-license@^3.0.1:
     spdx-correct "^3.0.0"
     spdx-expression-parse "^3.0.0"
 
-vant@^2.12.10:
-  version "2.12.10"
-  resolved "https://registry.npm.taobao.org/vant/download/vant-2.12.10.tgz#b4a64f847c098c71ad696ce34d68cea07c02c308"
-  integrity sha1-tKZPhHwJjHGtaWzjTWjOoHwCwwg=
+vant@^2.12.27:
+  version "2.12.27"
+  resolved "https://registry.nlark.com/vant/download/vant-2.12.27.tgz#2e250d05639acaa5a579394200417720ab57e7f6"
+  integrity sha1-LiUNBWOayqWleTlCAEF3IKtX5/Y=
   dependencies:
     "@babel/runtime" "7.x"
-    "@vant/icons" "1.5.2"
+    "@vant/icons" "^1.5.3"
     "@vant/popperjs" "^1.0.0"
     "@vue/babel-helper-vue-jsx-merge-props" "^1.0.0"
     vue-lazyload "1.2.3"