XiaBx 3 лет назад
Сommit
d91a448f4f
100 измененных файлов с 1418 добавлено и 0 удалено
  1. 31 0
      .babelrc
  2. 9 0
      .editorconfig
  3. 18 0
      .gitignore
  4. 9 0
      .postcssrc.js
  5. 21 0
      README.md
  6. 7 0
      config/dev.env.js
  7. 91 0
      config/index.js
  8. 4 0
      config/prod.env.js
  9. 12 0
      index.html
  10. 46 0
      index.prod.html
  11. 122 0
      other/help.html
  12. 87 0
      other/safe.html
  13. 77 0
      package.json
  14. 103 0
      src/App.vue
  15. 54 0
      src/analog-data/QA.json
  16. 49 0
      src/api/axios.js
  17. 606 0
      src/api/index.js
  18. 72 0
      src/api/util/index.js
  19. BIN
      src/assets/1.png
  20. BIN
      src/assets/1234.jpg
  21. BIN
      src/assets/2.png
  22. BIN
      src/assets/3.png
  23. BIN
      src/assets/activity_banner.jpg
  24. BIN
      src/assets/android_collect.png
  25. BIN
      src/assets/beij.jpg
  26. BIN
      src/assets/bg.jpg
  27. BIN
      src/assets/big-red-he.png
  28. BIN
      src/assets/binding.png
  29. BIN
      src/assets/book/1.jpg
  30. BIN
      src/assets/book/10.jpg
  31. BIN
      src/assets/book/2.jpg
  32. BIN
      src/assets/book/3.jpg
  33. BIN
      src/assets/book/4.jpg
  34. BIN
      src/assets/book/5.jpg
  35. BIN
      src/assets/book/6.jpg
  36. BIN
      src/assets/book/7.jpg
  37. BIN
      src/assets/book/8.jpg
  38. BIN
      src/assets/book/9.jpg
  39. BIN
      src/assets/checkbox.png
  40. BIN
      src/assets/checkbox_checked.png
  41. BIN
      src/assets/close_icon.png
  42. BIN
      src/assets/coupon _pay.png
  43. BIN
      src/assets/coupon-entry.png
  44. BIN
      src/assets/coupon_bg1.png
  45. BIN
      src/assets/coupon_diabled.png
  46. BIN
      src/assets/coupon_expire.png
  47. BIN
      src/assets/cz.jpg
  48. BIN
      src/assets/declining.png
  49. BIN
      src/assets/default.png
  50. BIN
      src/assets/demo.png
  51. BIN
      src/assets/entry.png
  52. BIN
      src/assets/fansbanner.jpg
  53. BIN
      src/assets/free-read.jpg
  54. BIN
      src/assets/gift_default.png
  55. BIN
      src/assets/gold-bi.png
  56. BIN
      src/assets/huo.png
  57. BIN
      src/assets/icon_coupon.png
  58. BIN
      src/assets/icon_pay_coupon.png
  59. BIN
      src/assets/iphone_collect.png
  60. BIN
      src/assets/jinri.png
  61. BIN
      src/assets/loading-1.png
  62. BIN
      src/assets/mi_wan_year.jpg
  63. BIN
      src/assets/mi_wan_year_check.jpg
  64. BIN
      src/assets/month_order.png
  65. BIN
      src/assets/month_order_1.png
  66. BIN
      src/assets/month_order_check.png
  67. BIN
      src/assets/my_coupon.png
  68. BIN
      src/assets/no-enough.png
  69. BIN
      src/assets/no-gift.png
  70. BIN
      src/assets/no_coupon.png
  71. BIN
      src/assets/notfind.jpg
  72. BIN
      src/assets/open.png
  73. BIN
      src/assets/price.png
  74. BIN
      src/assets/push-more-suc.png
  75. BIN
      src/assets/push-more.png
  76. BIN
      src/assets/qr-back.png
  77. BIN
      src/assets/qr-banner.jpg
  78. BIN
      src/assets/qr-bg.jpg
  79. BIN
      src/assets/qr-title.jpg
  80. BIN
      src/assets/rank_1.png
  81. BIN
      src/assets/rank_2.png
  82. BIN
      src/assets/rank_3.png
  83. BIN
      src/assets/reader_bg.png
  84. BIN
      src/assets/recent-free__entry.png
  85. BIN
      src/assets/red-he.png
  86. BIN
      src/assets/red_package.png
  87. BIN
      src/assets/report-success.png
  88. BIN
      src/assets/share-bg.jpg
  89. BIN
      src/assets/share_entry.png
  90. BIN
      src/assets/shoc.png
  91. BIN
      src/assets/sign-bg.jpg
  92. BIN
      src/assets/sign.png
  93. BIN
      src/assets/sign2.png
  94. BIN
      src/assets/sign2_15.png
  95. BIN
      src/assets/sign2_7.png
  96. BIN
      src/assets/sign2_coin.png
  97. BIN
      src/assets/sign_15.png
  98. BIN
      src/assets/sign_7.png
  99. BIN
      src/assets/sign_coin.png
  100. 0 0
      src/assets/sign_notice__wrap.png

+ 31 - 0
.babelrc

@@ -0,0 +1,31 @@
+{
+  "presets": [
+    [
+      "env",
+      {
+        "modules": false
+      }
+    ],
+    "stage-2"
+  ],
+  "plugins": [
+    "transform-runtime",
+    [
+      "component",
+      [
+        {
+          "libraryName": "mint-ui",
+          "style": true
+        }
+      ]
+    ]
+  ],
+  "env": {
+    "test": {
+      "presets": [
+        "env",
+        "stage-2"
+      ]
+    }
+  }
+}

+ 9 - 0
.editorconfig

@@ -0,0 +1,9 @@
+root = true
+
+[*]
+charset = utf-8
+indent_style = space
+indent_size = 2
+end_of_line = lf
+insert_final_newline = true
+trim_trailing_whitespace = true

+ 18 - 0
.gitignore

@@ -0,0 +1,18 @@
+.DS_Store
+node_modules/
+/dist/
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+dist.zip
+dist.rar
+
+# Editor directories and files
+.idea
+.vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+package-lock.json
+yarn.lock

+ 9 - 0
.postcssrc.js

@@ -0,0 +1,9 @@
+// https://github.com/michael-ciniawsky/postcss-load-config
+
+module.exports = {
+  "plugins": {
+    // to edit target browsers: use "browserslist" field in package.json
+    "postcss-import": {},
+    "autoprefixer": {}
+  }
+}

+ 21 - 0
README.md

@@ -0,0 +1,21 @@
+# y
+
+> A Vue.js project
+
+## Build Setup
+
+``` bash
+# install dependencies
+npm install
+
+# serve with hot reload at localhost:8080
+npm run dev
+
+# build for production with minification
+npm run build
+
+# build for production and view the bundle analyzer report
+npm run build --report
+```
+
+For a detailed explanation on how things work, check out the [guide](http://vuejs-templates.github.io/webpack/) and [docs for vue-loader](http://vuejs.github.io/vue-loader).

+ 7 - 0
config/dev.env.js

@@ -0,0 +1,7 @@
+'use strict'
+const merge = require('webpack-merge')
+const prodEnv = require('./prod.env')
+
+module.exports = merge(prodEnv, {
+  NODE_ENV: '"development"'
+})

+ 91 - 0
config/index.js

@@ -0,0 +1,91 @@
+/*
+ * @Author: ZhengXiaowei
+ * @Date: 2019-04-12 14:35:42
+ * LastEditors: 晓晓晓晓晓丶vv
+ * LastEditTime: 2020-08-21 15:26:55
+ * @Description: file content
+ */
+"use strict";
+// Template version: 1.2.8
+// see http://vuejs-templates.github.io/webpack for documentation.
+
+const path = require("path");
+// "https://siteywmkx29emyevn514.leyuee.com/
+module.exports = {
+  dev: {
+    // Paths
+    assetsSubDirectory: "static",
+    assetsPublicPath: "/",
+    proxyTable: {
+      "/api": {
+        target: "http://site2.pre.aizhuishu.com/",
+        changeOrigin: true
+      },
+      "/testLogin": {
+        target: "http://site2.pre.aizhuishu.com/",
+        changeOrigin: true
+      }
+    },
+
+    // Various Dev Server settings
+    host: "0.0.0.0", // can be overwritten by process.env.HOST
+    port: 8080, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
+    autoOpenBrowser: false,
+    errorOverlay: true,
+    notifyOnErrors: true,
+    poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions-
+
+    /**
+     * Source Maps
+     */
+
+    // https://webpack.js.org/configuration/devtool/#development
+    // devtool: "cheap-module-eval-source-map",
+    devtool: "cheap-module-eval-source-map",
+
+    // If you have problems debugging vue-files in devtools,
+    // set this to false - it *may* help
+    // https://vue-loader.vuejs.org/en/options.html#cachebusting
+    cacheBusting: true,
+
+    // CSS Sourcemaps off by default because relative paths are "buggy"
+    // with this option, according to the CSS-Loader README
+    // (https://github.com/webpack/css-loader#sourcemaps)
+    // In our experience, they generally work as expected,
+    // just be aware of this issue when enabling this option.
+    cssSourceMap: false,
+    disableHostCheck: true
+  },
+
+  build: {
+    // Template for index.html
+    index: path.resolve(__dirname, "../dist/index.html"),
+
+    // Paths
+    assetsRoot: path.resolve(__dirname, "../dist"),
+    assetsSubDirectory:
+      "static" + new Date().toLocaleDateString().replace(/\//g, "-"),
+    assetsPublicPath: "https://cdn-novel.iycdm.com/",
+
+    /**
+     * Source Maps
+     */
+
+    productionSourceMap: true,
+    // https://webpack.js.org/configuration/devtool/#production
+    devtool: "#source-map",
+
+    // Gzip off by default as many popular static hosts such as
+    // Surge or Netlify already gzip all static assets for you.
+    // Before setting to `true`, make sure to:
+    // npm install --save-dev compression-webpack-plugin
+    productionGzip: false,
+    productionGzipExtensions: ["js", "css"],
+
+    // Run the build command with an extra argument to
+    // View the bundle analyzer report after build finishes:
+    // `npm run build --report`
+    // Set to `true` or `false` to always turn it on or off
+    bundleAnalyzerReport: process.env.npm_config_report
+  }
+};

+ 4 - 0
config/prod.env.js

@@ -0,0 +1,4 @@
+'use strict'
+module.exports = {
+  NODE_ENV: '"production"'
+}

+ 12 - 0
index.html

@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" >
+    <title>aaa</title>
+  </head>
+  <body>
+    <div id="app"></div>
+    <!-- built files will be auto injected -->
+  </body>
+</html>

+ 46 - 0
index.prod.html

@@ -0,0 +1,46 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+  <meta charset="utf-8">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
+  <link rel="icon" type="image/png" href="data:image/png;base64,iVBORw0KGgo=">
+  <script>window.errOptions || document.write('<script src="https://cdn-novel.iycdm.com/static/errOptions.js"><\/script>')</script>
+  <script>window.Vue || document.write('<script src="https://cdn-novel.iycdm.com/static/vue.min.js"><\/script>')</script>
+  <script>window.VueRouter || document.write('<script src="https://cdn-novel.iycdm.com/static/vue-router.min.js"><\/script>')</script>
+  <script>(window.Vue && window.VueLazyload) || document.write('<script src="https://cdn-novel.iycdm.com/static/vue-lazyload.js"><\/script>')</script>
+  <!-- <script src="https://cdn-novel.iycdm.com/static/fundebug.1.2.3.min.js"></script>
+  <script src="https://cdn-novel.iycdm.com/static/fundebug.option.js"></script> -->
+  <title>{{$title}}</title>
+</head>
+
+<body>
+  <div id="app"></div>
+  <script>
+    var _mtac = {};
+    (function () {
+      var mta = document.createElement("script");
+      mta.src = "https://pingjs.qq.com/h5/stats.js?v2.0.2";
+      mta.setAttribute("name", "MTAH5");
+      mta.setAttribute("sid", "500633040");
+      var s = document.getElementsByTagName("script")[0];
+      s.parentNode.insertBefore(mta, s);
+    })();
+  </script>
+  <script>
+    var _hmt = window._hmt || [];
+    (function () {
+      var hm = document.createElement("script");
+      hm.src = "https://hm.baidu.com/hm.js?a027c0fdf2b6e70f1892dbd8227cbb2b";
+      var s = document.getElementsByTagName("script")[0];
+      s.parentNode.insertBefore(hm, s);
+      window._hmt.push(['_setAutoPageview',false])
+    })();
+  </script>
+  <script id="options">
+    window.options = {!! $options!!};
+  </script>
+  <!-- built files will be auto injected -->
+</body>
+
+</html>

+ 122 - 0
other/help.html

@@ -0,0 +1,122 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+  <meta charset="UTF-8">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
+  <meta http-equiv="X-UA-Compatible" content="ie=edge">
+  <link href="favicon.ico" type=image/x-icon rel="shortcut icon">
+  <title>Document</title>
+  <style>
+    * {
+      padding: 0;
+      margin: 0;
+    }
+
+    body {
+      font-size: 14px;
+      padding: 1em;
+    }
+
+    .QA-title {
+      color: #ff6060;
+      font-size: 17px;
+      margin: 1em 0;
+    }
+
+    .QA-title:first-child {
+      margin-top: 0;
+    }
+
+    .QA-title::before {
+      content: "";
+      background-color: #ff6060;
+      display: inline-block;
+      width: .2em;
+      height: 1em;
+      border-radius: 0.1em;
+      vertical-align: -0.1em;
+      margin-right: 0.2em;
+    }
+
+    .question-title {
+      font-size: 16px;
+      margin: 1em 0;
+      color: #333;
+    }
+
+    .answer {
+      padding: .6em;
+      line-height: 1.8;
+      color: #999;
+      background-color: #f7f7f7;
+    }
+  </style>
+</head>
+
+<body>
+  <div class="QA-title">充值问题</div>
+  <div class="item">
+    <div class="question-title">1.1如何进行充值</div>
+    <div class="answer">
+      <p>方式一:点击公众号菜单栏【用户中心】-【我要充值】;</p>
+      <p>方式二:进入追书云书城首页,点击【个人中心】-【充值】 目前充值仅限使用微信支付。</p>
+    </div>
+  </div>
+  <div class="item">
+    <div class="question-title">1.2充值成功后书币未到账情况</div>
+    <div class="answer">
+      <p>1.2.1确认充值是否成功,系统是否已经扣除了充值费用。</p>
+      <p>1.2.2充值成功后书币到账可能有延迟情况,如1小时内仍未到帐请发送商户单号,客服将为您进行核实处理(复制或截图发送皆可)。</p>
+      <p>商户单号获取路径: </p>
+      <p>⑴进入微信的【钱包】,点击右上角四个点,然后点击【交易记录】 </p>
+      <p>⑵点开充值书币的记录,找到【商户单号】</p>
+    </div>
+  </div>
+  <div class="QA-title">收费问题</div>
+  </div>
+  <div class="item">
+    <div class="question-title">2.1小说网站会重复收费吗?</div>
+    <div class="answer">
+      <p>普通会员: 在某个公众号下阅读充值,该公众号下正常订阅(不包括年费VIP会员)的章节再次阅读是不会重复扣费的。 </p>
+      <p>年费VIP会员:在某个公众号下阅读充值,该公众号下年费VIP会员到期之后(即自订购之日起365天后),再次阅读是需要订阅扣费的。 </p>
+      <p>如还有其他关于资费问题,请直接留言,客服收到后会及时回复。</p>
+    </div>
+  </div>
+  <div class="item">
+    <div class="question-title">2.2如何无限畅读全站小说?</div>
+    <div class="answer">
+      <p>追书云为大家提供了年费VIP会员服务,为了保障小说爱好者畅通阅读和节省钱包,建议大家选择充值年费VIP会员,就可以免费阅读平台所有小说。</p>
+    </div>
+  </div>
+  <div class="QA-title">其他问题 </div>
+  <div class="item">
+    <div class="question-title"> 3.1如何领取免费书币? </div>
+    <div class="answer">
+      <p>每日首次阅读,即可免费获取50书币。</p>
+    </div>
+  </div>
+  <div class="item">
+    <div class="question-title">3.2如何查找您的阅读入口?</div>
+    <div class="answer">
+      <p>方式一:翻阅自己聊天记录查找自己关注的公众号 </p>
+      <p>方式二:点击微信的【通信录】-【公众号】查找</p>
+    </div>
+  </div>
+  <div class="item">
+    <div class="question-title">3.3如何继续阅读之前的章节?</div>
+    <div class="answer">
+      <p>方式一:点击公众号菜单栏【继续阅读】</p>
+      <p>方式二:点击公众号菜单栏【用户中心】-【阅读记录】</p>
+      <p>方式三:进入追书云书城首页,点击【书架】-【最近阅读】</p>
+    </div>
+  </div>
+  <div class="item">
+    <div class="question-title">3.3.4退款声明</div>
+    <div class="answer">
+      <p>书币是属于追书云小说平台专用的虚拟货币,用于用户支付订阅等服务,一经充值不可退款。</p>
+    </div>
+  </div>
+</body>
+
+</html>

Разница между файлами не показана из-за своего большого размера
+ 87 - 0
other/safe.html


+ 77 - 0
package.json

@@ -0,0 +1,77 @@
+{
+  "name": "y",
+  "version": "1.0.0",
+  "description": "A Vue.js project",
+  "author": "autumnLeaves0 <461563994@qq.com>",
+  "private": true,
+  "scripts": {
+    "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
+    "start": "npm run dev",
+    "build": "node build/build.js"
+  },
+  "dependencies": {
+    "axios": "^0.17.1",
+    "clipboard": "^2.0.4",
+    "fundebug-javascript": "^1.2.3",
+    "html2canvas": "^1.0.0-rc.4",
+    "mint-ui": "^2.2.10",
+    "qrcodejs2": "0.0.2",
+    "vconsole": "^3.2.0",
+    "vue": "^2.5.2",
+    "vue-clipboard2": "^0.3.1",
+    "vue-router": "^3.0.1",
+    "vue-touch": "^2.0.0-beta.4",
+    "vuex": "^3.0.1",
+    "weixin-js-sdk": "^1.4.0-test"
+  },
+  "devDependencies": {
+    "autoprefixer": "^7.1.2",
+    "babel-core": "^6.22.1",
+    "babel-loader": "^7.1.1",
+    "babel-plugin-component": "^0.10.1",
+    "babel-plugin-syntax-dynamic-import": "^6.18.0",
+    "babel-plugin-transform-runtime": "^6.22.0",
+    "babel-preset-env": "^1.3.2",
+    "babel-preset-stage-2": "^6.22.0",
+    "babel-register": "^6.22.0",
+    "chalk": "^2.0.1",
+    "copy-webpack-plugin": "^4.0.1",
+    "css-loader": "^0.28.0",
+    "eventsource-polyfill": "^0.9.6",
+    "extract-text-webpack-plugin": "^3.0.0",
+    "file-loader": "^1.1.4",
+    "friendly-errors-webpack-plugin": "^1.6.1",
+    "html-webpack-plugin": "^2.30.1",
+    "node-notifier": "^5.1.2",
+    "node-sass": "^4.12.0",
+    "optimize-css-assets-webpack-plugin": "^3.2.0",
+    "ora": "^1.2.0",
+    "portfinder": "^1.0.13",
+    "postcss-import": "^11.0.0",
+    "postcss-loader": "^2.0.8",
+    "postcss-url": "^7.3.0",
+    "rimraf": "^2.6.0",
+    "sass-loader": "^6.0.6",
+    "semver": "^5.3.0",
+    "shelljs": "^0.7.6",
+    "url-loader": "^0.5.8",
+    "vue-loader": "^13.3.0",
+    "vue-style-loader": "^3.0.1",
+    "vue-template-compiler": "^2.5.2",
+    "webpack": "^3.6.0",
+    "webpack-bundle-analyzer": "^2.9.0",
+    "webpack-dev-server": "^2.9.1",
+    "webpack-merge": "^4.1.0"
+  },
+  "engines": {
+    "node": ">= 4.0.0",
+    "npm": ">= 3.0.0"
+  },
+  "browserslist": [
+    "> 1%",
+    "last 2 versions",
+    "not ie <= 8",
+    "iOS >= 7",
+    "Android > 4.4"
+  ]
+}

+ 103 - 0
src/App.vue

@@ -0,0 +1,103 @@
+<!--
+ * @Author: your name
+ * @Date: 2020-09-08 10:49:07
+ * @LastEditTime: 2021-06-29 11:45:03
+ * @LastEditors: your name
+ * @Description: In User Settings Edit
+ * @FilePath: \ydy_wap_front\src\App.vue
+-->
+<template>
+  <div id="app" :class="theme">
+    <router-view :key="$route.fullpath" />
+    <div class="package-wrap" @touchmove.prevent v-if="showWrap">
+      <img @click.stop="closeWrap" :src="imgs" alt="" />
+    </div>
+    <!-- <template v-if="isTargetChannel&&showIframe">
+      <iframe src='//wap.apyingcaisw.com/xingzuo'
+              width='1px'
+              height='1px'
+              style="visibility:hidden"></iframe>
+    </template> -->
+  </div>
+</template>
+
+<script>
+export default {
+  name: "app",
+  data() {
+    return {
+      theme: localStorage.getItem("theme") || "girl",
+      showRed: window.options.fission,
+      activity_imgs: window.options.channel_activities,
+      redImage: require("./assets/red_package.png"),
+      imgs: null,
+      showWrap: false,
+      // todayDate: new Date().toLocaleDateString(),
+      isTargetChannel: window.options.is_show_ad_frame,
+      showIframe: false
+    };
+  },
+  watch: {
+    $route(v) {
+      if (v.name === "BookCity") {
+        v.query.sex && (this.theme = v.query.sex);
+      }
+    }
+  },
+  created() {
+    let { site_gender } = window.options;
+    if (site_gender) {
+      // 关注用户 根据用户性别 首页展示不同的频道
+      this.theme = site_gender === "male" ? "boy" : "girl";
+    } else this.theme = "girl";
+    this.initWrap();
+  },
+  methods: {
+    closeWrap() {
+      if (window.options.fission) {
+        this.showWrap = false;
+        window.options.fission = 0;
+        setTimeout(() => {
+          this.initWrap();
+        }, 500);
+      } else {
+        this.showWrap = false;
+        window.options.channel_activities.shall_reward = 0;
+      }
+    },
+    initWrap() {
+      if (window.options.fission) {
+        // 红包弹窗弹出
+        this.showWrap = true;
+        this.imgs = this.redImage;
+      } else {
+        if (window.options.channel_activities.shall_reward) {
+          // 活动弹
+          this.showWrap = true;
+          this.imgs = this.activity_imgs.image;
+        }
+      }
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+.package-wrap {
+  position: fixed;
+  top: 0;
+  bottom: 0;
+  left: 0;
+  width: 100%;
+  background: rgba($color: #000000, $alpha: 0.6);
+  z-index: 9999;
+
+  img {
+    position: absolute;
+    width: 80%;
+    left: 50%;
+    top: 50%;
+    transform: translate(-50%, -50%);
+  }
+}
+</style>

+ 54 - 0
src/analog-data/QA.json

@@ -0,0 +1,54 @@
+[
+  {
+    "Q": "充值问题",
+    "title": true
+  },
+  {
+    "Q": "1.1如何进行充值",
+    "A": "方式一:点击公众号菜单栏【用户中心】-【我要充值】;\n方式二:进入追书云书城首页,点击【个人中心】-【充值】\n目前充值仅限使用微信支付。",
+    "index":0
+  },
+  {
+    "Q": "1.2充值成功后书币未到账情况",
+    "A": "1.2.1确认充值是否成功,系统是否已经扣除了充值费用。\n1.2.2充值成功后书币到账可能有延迟情况,如1小时内仍未到帐请发送商户单号,客服将为您进行核实处理(复制或截图发送皆可)。\n商户单号获取路径:\n⑴进入微信的【钱包】,点击右上角四个点,然后点击【交易记录】\n⑵点开充值书币的记录,找到【商户单号】",
+    "index":1    
+  },
+  {
+    "Q": "收费问题",
+    "title": true
+  },
+  {
+    "Q": "2.1小说网站会重复收费吗?",
+    "A": "普通会员: 在某个公众号下阅读充值,该公众号下正常订阅(不包括年费VIP会员)的章节再次阅读是不会重复扣费的,\n年费VIP会员:在某个公众号下阅读充值,该公众号下年费VIP会员到期之后(即自订购之日起365天后),再次阅读是需要订阅扣费的。\n如还有其他关于资费问题,请直接留言,客服收到后会及时回复。",
+    "index":2
+  },
+  {
+    "Q": "2.2如何无限畅读全站小说?",
+    "A": "追书云为大家提供了年费VIP会员服务,为了保障小说爱好者畅通阅读和节省钱包,建议大家选择充值年费VIP会员,就可以免费阅读平台所有小说。",
+    "index":3
+  },
+  {
+    "Q": "其他问题",
+    "title": true
+  },
+  {
+    "Q": "3.1如何领取免费书币?",
+    "A": "每日首次阅读,即可免费获取50书币。",
+    "index":4
+  },
+  {
+    "Q": "3.2如何查找您的阅读入口?",
+    "A": "方式一:翻阅自己聊天记录查找自己关注的公众号\n方式二:点击微信的【通信录】-【公众号】查找",
+    "index":5
+  },
+  {
+    "Q": "3.3如何继续阅读之前的章节?",
+    "A": "方式一:点击公众号菜单栏【继续阅读】\n方式二:点击公众号菜单栏【用户中心】-【阅读记录】\n方式三:进入追书云书城首页,点击【书架】-【最近阅读】",
+    "index":6
+  },
+  {
+    "Q": "3.4退款声明",
+    "A": "书币是属于追书云小说平台专用的虚拟货币,用于用户支付订阅等服务,一经充值不可退款。",
+    "index":7
+  }
+]

+ 49 - 0
src/api/axios.js

@@ -0,0 +1,49 @@
+import axios from "axios";
+import router from "../router/index.js";
+import { Undertheshelf } from "../view/namespace.js";
+import { undefinedCollect } from './index.js'
+
+// var instance = axios.create(
+//   process.env.NODE_ENV === "development"
+//     ? {
+//         baseURL: "http://site1.aizhuishu.com/api",
+//         withCredentials: true
+//       }
+//     : {
+//         baseURL: "/api"
+//       }
+// );
+
+var instance = axios.create({
+  baseURL: "/api"
+});
+
+instance.interceptors.response.use(function (res) {
+  if (res.data.code === 0) {
+    return res.data.data;
+  }
+  if (res.data.code === 10018) {
+    router.replace(Undertheshelf.route);
+  } else {
+    return Promise.reject(res);
+  }
+});
+instance.interceptors.request.use(function (config) {
+  if (config.method === 'get' && config.url && config.url.indexOf('undefined') !== -1) {
+    undefinedCollect({
+      name: 'undefined',
+      content: JSON.stringify({
+        current_page: location.href,
+        next_page: window.nextPage,
+        prev_page: window.prevPage,
+        api: config.url,
+        user_id: window.options && window.options.uid,
+        channel_id: window.options && window.options.distribution_channel_id,
+      })
+    })
+  }
+
+  return config;
+});
+
+export default instance;

+ 606 - 0
src/api/index.js

@@ -0,0 +1,606 @@
+/*
+ * @Author: ZhengXiaowei
+ * @Date: 2019-07-24 17:21:47
+ * @LastEditors: Please set LastEditors
+ * @LastEditTime: 2021-06-28 15:51:55
+ * @Description: file content
+ */
+import Axios from "axios";
+import axios from "./axios";
+import {
+  bookListFormat,
+  bookFormat,
+  urlFormat,
+  contentFormat,
+  recordFormat,
+  shelfFormat
+} from "./util";
+import cache from "../util/cache.js";
+import { Subscribe, Pay } from "../view/namespace.js";
+import bus from "../util/bus";
+
+//获取首页(书城)内容
+let index = {};
+export function getIndex(type) {
+  //male or female
+  if (type === "boy") type = "male";
+  else if (type === "girl") type = "female";
+  else type = "male";
+  if (index[type]) return Promise.resolve(index[type]);
+  return axios(`/books/${type}/index`).then(r => {
+    r.forEach(list => {
+      bookListFormat(list.books);
+    });
+    index[type] = r;
+    return r;
+  });
+}
+/**
+获取书库书籍
+关键字 key	String 
+分类id category_id	Number 
+页码 page String	
+完结 status 完结:1 | 连载:0	
+ */
+
+export function getBook(params) {
+  getBook.source = Axios.CancelToken.source();
+  return axios("/books/library", { cancelToken: getBook.source.token, params })
+    .then(r => {
+      bookListFormat(r.list);
+      return r;
+    })
+    .catch(function(thrown) {
+      if (!Axios.isCancel(thrown)) {
+        return Promise.reject(thrown);
+      }
+    });
+}
+
+//获取分类
+let category = null;
+export function getCategory() {
+  if (category) return Promise.resolve(category);
+  return (category = axios("/books/getCategory").then(r => {
+    r.unshift({
+      name: "不限",
+      id: 0
+    });
+    return r;
+  }));
+}
+// 获取详情
+// 创建一个书籍详情的缓存池
+let detail = new cache({
+  meta: {
+    name: "书籍详情"
+  },
+  limit: 40
+});
+
+//更新书籍信息中的是否在书架上(is_on_user_shelf)
+function detailUpdate(id, status) {
+  let book = detail.find(id);
+  if (book.complete) {
+    book.result.data.is_on_user_shelf = status;
+  }
+}
+export function getDetail(id, s = "",pos='') {
+  return detail
+    .getAsync(id, function() {
+      return axios("/book/" + id + "?s=" + s + '&pos=' + pos).then(r => {
+        return {
+          id,
+          data: r
+        };
+      });
+    })
+    .then(r => {
+      return bookFormat(r.result.data);
+    });
+}
+
+// 获取目录
+// 创建一个目录的缓存池
+let catalog = new cache({
+  meta: {
+    name: "目录"
+  },
+  limit: 20
+});
+export function getCatalog(id, page = 1, s = "") {
+  return catalog
+    .getAsync(id + "+" + page, function() {
+      return axios(`/books/${id}/catalog`, {
+        params: { page_size: 100, page, s }
+      }).then(r => {
+        return {
+          id: id + "+" + page,
+          data: r.list,
+          meta: r.meta
+        };
+      });
+    })
+    .then(r => {
+      return r.result;
+    });
+}
+
+// 获取同款推荐
+// 创建一个同款推荐的缓存池
+let similar = new cache({
+  meta: {
+    name: "同款推荐"
+  },
+  limit: 20
+});
+
+export function getSimilar(bid, category_id) {
+  return similar
+    .getAsync(bid, function() {
+      return axios(`/books/similar`, { params: { category_id, bid } }).then(
+        r => {
+          let data = bookListFormat(r);
+          detail.push(
+            data.map(v => {
+              return {
+                id: v.book_id,
+                data: v
+              };
+            })
+          );
+          return {
+            id: bid,
+            data: data
+          };
+        }
+      );
+    })
+    .then(r => {
+      return r.result.data;
+    });
+}
+
+//获取用户信息
+let userinfo = null;
+export function getUserInfo() {
+  // if (userinfo) return Promise.resolve(userinfo)
+  return axios("/userinfo").then(r => {
+    return r;
+  });
+}
+
+//获取书架
+let shelf = null;
+export function getShelf() {
+  if (shelf) return Promise.resolve(shelf);
+  return axios("/userShelfBooks").then(r => {
+    r = shelfFormat(r);
+    return r;
+  });
+}
+
+//删除书架
+export function delShelf(bid) {
+  return axios("/userShelfBooks/delete?bid=" + bid).then(r => {
+    detailUpdate(bid, 0);
+    return r;
+  });
+}
+
+//添加书架
+export function addShelf(bid) {
+  return axios.post("/userShelfBooks", { bid }).then(r => {
+    shelf = null;
+    detailUpdate(bid, 1);
+    return r;
+  });
+}
+
+//获取阅读记录
+let readerRecord = null;
+
+export function getReadrecord() {
+  if (readerRecord) return Promise.resolve(readerRecord);
+  return axios("/readrecord").then(r => {
+    return r.map(book => {
+      book.book_id = book.bid;
+      return book;
+    });
+  });
+}
+
+// 添加阅读记录
+export function setReadrecord(params) {
+  return axios.post("/readrecord", params);
+}
+//删除阅读记录
+export function delReadrecord(bid) {
+  return axios.post("/readrecord/delete", { bid }).then(r => {
+    return r;
+  });
+}
+
+// 签到记录
+export function getSignRecord(page = 1) {
+  return axios(`/user/sign_record?page=${page}`);
+}
+
+//获取章节内容
+// 创建一个同款推荐的缓存池
+
+/*
+错误处理
+10012       未关注(默认链接)
+10014       全本订阅余额不足(rmb)
+10015       章订余额不足(充值)
+10016       购买章节(书币)
+10017       购买图书(书币)
+10019       全本订阅余额不足(充值)
+10023       未关注 (跳转渠道接诶)
+----- 以上是弹窗  -------
+10020       全本订阅余额不足,直接进入充值页
+10021       章节订阅余额不足,直接进入充值页
+10022       进入版权站
+*/
+let content = new cache({
+  meta: {
+    name: "章节内容"
+  },
+  limit: 20
+});
+
+export function getContent(bid, cid, adStatus = 0, from, code = "") {
+  console.log(from);
+  let url = options.adTargetId
+    ? `/books/${bid}/chapters/${cid}?ad_status=${adStatus}&page_from=${from}&code=${encodeURIComponent(
+        code
+      )}`
+    : `/books/${bid}/chapters/${cid}?page_from=${from}&code=${encodeURIComponent(
+        code
+      )}`;
+  return content
+    .getAsync(bid + "+" + cid, function() {
+      return axios(url).then(r => {
+        return {
+          id: bid + "+" + cid,
+          data: contentFormat(r)
+        };
+      });
+    })
+    .then(r => {
+      if (!r.fresh) {
+        setReadrecord({ bid, cid, chapter_name: r.result.data.chapter_name });
+      }
+      // TODO: 暂时这么做
+      // let cacheTap = localStorage.getItem(cid)
+      // if (cacheTap) {
+      //   r.result.data.chapter_comment = cacheTap
+      // }
+      return r.result.data;
+    });
+}
+
+//余额支付
+export function subscribeByBalance(bid, cid, remind) {
+  let params = remind ? { params: { remind: 1 } } : {};
+  return axios(`/books/${bid}/balance/chapterOrders/${cid}`, params).then(r => {
+    content.push({
+      id: bid + "+" + cid,
+      data: contentFormat(r)
+    });
+    return r;
+  });
+}
+
+//RMB支付
+export function subscribeByRMB(params) {
+  const a = document.createElement("a");
+  const redirect = {
+    host: location.origin,
+    pathname: "/reader",
+    query: {
+      bid: params.book_id,
+      cid: params.chapter_id
+    }
+  };
+  const href = {
+    host: window.options.pay_url,
+    query: {
+      product_id: params.product_id,
+      uid: window.options.uid,
+      distribution_channel_id: window.options.distribution_channel_id,
+      send_order_id: window.options.send_order_id,
+      pay_redirect_url: encodeURIComponent(urlFormat(redirect))
+    }
+  };
+  a.href = urlFormat(href);
+  a.click();
+}
+
+// 排行帮
+//type	Int (点击帮:1|字数帮:2|新书榜:3)
+//time	Int (周:1|月:2|总:3)
+let rank = {};
+export function getRank(type = 1, time = 1) {
+  let id = type + "+" + time;
+  if (rank[id]) return Promise.resolve(rank);
+  return axios("/books/rank", {
+    params: {
+      type,
+      time
+    }
+  }).then(r => {
+    bookListFormat(r.male);
+    bookListFormat(r.female);
+    rank[id] = r;
+    return rank;
+  });
+}
+
+//充值产品列表
+let product = null;
+export function getProductList(bid) {
+  if (product) return product;
+  else return axios("/order/chargeList", { params: { bid } });
+}
+
+//充值
+export function recharge({ product_id, bid, cid, use_coupon }) {
+  const a = document.createElement("a");
+  const redirect =
+    bid && cid
+      ? {
+          host: location.origin,
+          pathname: "/reader",
+          query: {
+            bid,
+            cid
+          }
+        }
+      : {
+          host: location.origin,
+          pathname: "/recent"
+        };
+  const href = {
+    host: window.options.pay_url,
+    query: {
+      product_id: product_id,
+      uid: window.options.uid,
+      use_coupon,
+      distribution_channel_id: window.options.distribution_channel_id,
+      send_order_id: window.options.send_order_id,
+      from: window.options.from,
+      bid,
+      cid,
+      pay_redirect_url: encodeURIComponent(urlFormat(redirect)),
+      crm: window.options.crm || ""
+    }
+  };
+  a.href = urlFormat(href);
+  a.click();
+}
+
+//单本消费记录
+export function getRecordOrderByBook(page) {
+  return axios("/order/bookOrderList", { params: { page } });
+}
+
+//章节消费记录
+export function getRecordOrderByChapter(page) {
+  return axios("/order/chapterOrderList", { params: { page } });
+}
+
+//充值记录
+export function getRecordRecharge(page) {
+  return axios("/order/chargeRecordLists", { params: { page } }).then(r => {
+    recordFormat(r.list);
+    return r;
+  });
+}
+//赠送记录
+export function getRecordSend(page) {
+  return axios("/getGivenRocords", { params: { page } }).then(r => {
+    return r;
+  });
+}
+
+// 尾页推荐
+export function getReadOverRecommend(bid) {
+  return axios("/books/readOverRecommend", { params: { bid } }).then(r => {
+    bookListFormat(r.recommend_result);
+    return r;
+  });
+}
+
+// 获取弱关二维码
+export function getweakSubscribeQR() {
+  return axios("/subscribe/qrcode");
+}
+
+// 用户行为
+export function PostUserBehavior(data) {
+  return axios.post("/userBehavior", data);
+}
+
+// 错误捕获
+export function undefinedCollect(data) {
+  return axios.post("/error/undefinedCollect", data);
+}
+
+// 章节底部评价
+export function chapterComment(bid, chapter, tags) {
+  return axios.post("/chapter/comment", { bid, chapter, tags });
+}
+
+// 获取章节底部评价
+export function getChapterComment(bid, chapter) {
+  return axios("/chapter/getComment", { params: { bid, chapter } });
+}
+
+// 签到页面
+export function toSign() {
+  return axios("user/sign");
+}
+
+// 获取礼物列表
+export function getGiftList() {
+  return axios("/gift/getGiftsList");
+}
+
+// 送礼
+export function sendGift(data) {
+  return axios.post("/gift/sendGifts", data);
+}
+
+// 送礼记录
+export function getSendGiftRecord(params) {
+  return axios("/gift/getUserSendGiftsRecord", { params });
+}
+
+// 消费记录中的送礼记录
+export function getUserSendGiftRecord(page) {
+  return axios("/gift/getUserGiftsConsumeRecord", { params: { page } });
+}
+
+// 获取代付用户数据
+export function getSubstitutePay(product_id) {
+  return axios("/order/substitutePay", { params: { product_id } });
+}
+
+// 获取代付充值列表
+export function getSubstitutePayList(product_id, su) {
+  return axios("/order/substitutePayChargeList", {
+    params: { product_id, su }
+  });
+}
+
+// 代充
+export function substituteRecharge({ product_id, uid }) {
+  const a = document.createElement("a");
+  const href = {
+    host: window.options.pay_url,
+    query: {
+      product_id: product_id,
+      suid: window.options.uid,
+      uid: uid,
+      distribution_channel_id: window.options.distribution_channel_id,
+      send_order_id: window.options.send_order_id,
+      from: window.options.from
+    }
+  };
+  a.href = urlFormat(href);
+  a.click();
+}
+
+// 最近阅读轮播
+export function recentSlideList() {
+  return axios("/books/H5SmartRecommendBooks?pos=h5RecentReadLoop");
+}
+
+// 获取代付充值列表
+export function getbookFromWhere(bid, fromwhere) {
+  return axios("/bookFromWhere/" + bid, { params: { fromwhere } });
+}
+
+// 获取分享按钮是否显示
+export function getRecordShare(bid, cid) {
+  return axios("/user/recordShare", { params: { bid, cid } });
+}
+
+// 获取分享签名
+export function getWechatJsConfig(bid, cid, url) {
+  return axios("/chapter/getWechatJsConfig", { params: { bid, cid, url } });
+}
+
+// 广告点击情况
+export function recordAdClickStatus(bid, cid, type = "UNLOCK") {
+  return axios.post("/user/advisitstat", {
+    bid,
+    cid,
+    type
+  });
+}
+
+// 尾页推荐催更
+export function upgBookStatus(bid) {
+  return axios("/user/urgeUpdate", { params: { bid } });
+}
+
+// 获取举报内容
+export function getReportList() {
+  return axios("/complaints/getComplaintTags");
+}
+
+// 举报
+export function uploadReport(data) {
+  return axios.post("/complaints/add", data);
+}
+
+// 获取广告banner
+export function getReaderAdBanner() {
+  return axios("//banner.66kshu.com/b.gif");
+}
+
+// 发送验证码
+export function getPhoneCode(phone) {
+  return axios.post("/bindphone/sendcode", { phone });
+}
+
+// 绑定手机
+export function phoneBind(data) {
+  return axios.post("/bindphone/bind", data);
+}
+
+// 获取fakebook详情
+export function getBookDetail(id) {
+  return axios("/red_book/getBookDetail?id=" + id);
+}
+
+// 获取fakebook详情
+export function getChapterList(id) {
+  return axios("/red_book/getChapterList?id=" + id);
+}
+
+// 查询包月订单是否成功
+export function isMonthOrderSuc() {
+  return axios("/monthorder/issuccess");
+}
+
+// 配置wx分享
+export function getWxConfig(url) {
+  return axios.post("/weixin/jsSdkConfig", { url });
+}
+
+// 获取要展示的banner数组
+export function getMergeBanner() {
+  let { crm_public } = window.options;
+  if (crm_public) return axios(crm_public.url);
+  else return Promise.reject("");
+}
+
+// 个人中心客服
+export function getCustomQRCode(distribution_channel_id, openid) {
+  return axios("/custom_qrcode", {
+    params: { distribution_channel_id, openid }
+  });
+}
+
+// 限免书单
+export function getBookLimitFree() {
+  return axios("/books/freeBook");
+}
+
+// 新版排行列表
+export function getRankListV2() {
+  return axios("/books/rankList");
+}
+//用户优惠券列表
+export function getUserCoupon() {
+  return axios("/user/userCoupon");
+}
+
+//支付可用优惠券
+export function getOrderCoupon() {
+  return axios("/order/effectiveCoupon");
+}

+ 72 - 0
src/api/util/index.js

@@ -0,0 +1,72 @@
+/*
+支付成功:39a4ff
+未支付:ff6060
+退款:32dc86
+失败:666666
+*/
+const label = {
+  PAID: "已支付",
+  UNPAID: "未支付",
+  FAIL: "失败",
+  REFUND: "退款"
+};
+
+const color = {
+  PAID: "#39a4ff",
+  UNPAID: "#ff6060",
+  FAIL: "#666666",
+  REFUND: "#32dc86"
+};
+
+export function recordFormat(list) {
+  return list.map(item => {
+    item.color = color[item.status];
+    item.label = label[item.status];
+    return item;
+  });
+}
+
+export function bookListFormat(list) {
+  return list.map(bookFormat);
+}
+export function bookFormat(book) {
+  book.name = book.book_name;
+  book.cover = book.cover_url;
+  book.intro = book.book_summary;
+  book.author = book.book_author;
+  return book;
+}
+
+export function urlFormat(urlObj) {
+  if (!urlObj) return null;
+  let url = "";
+  if (urlObj.host) url += urlObj.host;
+  if (urlObj.pathname) url += urlObj.pathname;
+  if (urlObj.query) {
+    url += "?";
+    for (let i in urlObj.query) {
+      url += i;
+      if (urlObj.query[i]) url += "=" + urlObj.query[i];
+      url += "&";
+    }
+    return (url = url.slice(0, -1));
+  }
+  return encodeURI(url);
+}
+
+export function contentFormat(r) {
+  r.name = r.chapter_name;
+  r.content = r.chapter_content;
+  r.sequence = r.chapter_sequence;
+  delete r.chapter_sequence;
+  delete r.chapter_content;
+  delete r.chapter_content;
+  return r;
+}
+
+export function shelfFormat(r) {
+  return r.map(book => {
+    book.name = book.book_name;
+    return book;
+  });
+}

BIN
src/assets/1.png


BIN
src/assets/1234.jpg


BIN
src/assets/2.png


BIN
src/assets/3.png


BIN
src/assets/activity_banner.jpg


BIN
src/assets/android_collect.png


BIN
src/assets/beij.jpg


BIN
src/assets/bg.jpg


BIN
src/assets/big-red-he.png


BIN
src/assets/binding.png


BIN
src/assets/book/1.jpg


BIN
src/assets/book/10.jpg


BIN
src/assets/book/2.jpg


BIN
src/assets/book/3.jpg


BIN
src/assets/book/4.jpg


BIN
src/assets/book/5.jpg


BIN
src/assets/book/6.jpg


BIN
src/assets/book/7.jpg


BIN
src/assets/book/8.jpg


BIN
src/assets/book/9.jpg


BIN
src/assets/checkbox.png


BIN
src/assets/checkbox_checked.png


BIN
src/assets/close_icon.png


BIN
src/assets/coupon _pay.png


BIN
src/assets/coupon-entry.png


BIN
src/assets/coupon_bg1.png


BIN
src/assets/coupon_diabled.png


BIN
src/assets/coupon_expire.png


BIN
src/assets/cz.jpg


BIN
src/assets/declining.png


BIN
src/assets/default.png


BIN
src/assets/demo.png


BIN
src/assets/entry.png


BIN
src/assets/fansbanner.jpg


BIN
src/assets/free-read.jpg


BIN
src/assets/gift_default.png


BIN
src/assets/gold-bi.png


BIN
src/assets/huo.png


BIN
src/assets/icon_coupon.png


BIN
src/assets/icon_pay_coupon.png


BIN
src/assets/iphone_collect.png


BIN
src/assets/jinri.png


BIN
src/assets/loading-1.png


BIN
src/assets/mi_wan_year.jpg


BIN
src/assets/mi_wan_year_check.jpg


BIN
src/assets/month_order.png


BIN
src/assets/month_order_1.png


BIN
src/assets/month_order_check.png


BIN
src/assets/my_coupon.png


BIN
src/assets/no-enough.png


BIN
src/assets/no-gift.png


BIN
src/assets/no_coupon.png


BIN
src/assets/notfind.jpg


BIN
src/assets/open.png


BIN
src/assets/price.png


BIN
src/assets/push-more-suc.png


BIN
src/assets/push-more.png


BIN
src/assets/qr-back.png


BIN
src/assets/qr-banner.jpg


BIN
src/assets/qr-bg.jpg


BIN
src/assets/qr-title.jpg


BIN
src/assets/rank_1.png


BIN
src/assets/rank_2.png


BIN
src/assets/rank_3.png


BIN
src/assets/reader_bg.png


BIN
src/assets/recent-free__entry.png


BIN
src/assets/red-he.png


BIN
src/assets/red_package.png


BIN
src/assets/report-success.png


BIN
src/assets/share-bg.jpg


BIN
src/assets/share_entry.png


BIN
src/assets/shoc.png


BIN
src/assets/sign-bg.jpg


BIN
src/assets/sign.png


BIN
src/assets/sign2.png


BIN
src/assets/sign2_15.png


BIN
src/assets/sign2_7.png


BIN
src/assets/sign2_coin.png


BIN
src/assets/sign_15.png


BIN
src/assets/sign_7.png


BIN
src/assets/sign_coin.png


+ 0 - 0
src/assets/sign_notice__wrap.png


Некоторые файлы не были показаны из-за большого количества измененных файлов