소스 검색

书架删除

gdy96 5 년 전
부모
커밋
5333193f8b

+ 2 - 2
.eslintrc.json

@@ -47,7 +47,7 @@
     ],
     "quotes": [
       "warn",
-      "double",
+      "single",
       {
         "avoidEscape": true,
         "allowTemplateLiterals": true
@@ -59,7 +59,7 @@
     ],
     "semi": [
       "warn",
-      "always"
+      "never"
     ]
   }
 }

+ 8 - 0
babel.config.old.20191028_165807.js

@@ -0,0 +1,8 @@
+module.exports = function(api) {
+  api.cache(true)
+  return {
+    presets: ['@babel/preset-env'],
+    plugins: ['@babel/plugin-transform-modules-commonjs'],
+    babelrcRoots: ['.', 'node_modules']
+  }
+}

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 8165 - 0
package-lock.json


+ 2 - 2
package.json

@@ -2,7 +2,7 @@
   "name": "zsy_quick_app",
   "version": "1.0.0",
   "subversion": {
-    "toolkit": "0.6.5"
+    "toolkit": "0.6.6"
   },
   "description": "",
   "scripts": {
@@ -16,7 +16,7 @@
     "babel-eslint": "^10.0.1",
     "eslint": "^5.12.1",
     "eslint-plugin-hybrid": "0.0.5",
-    "hap-toolkit": "^0.6.5",
+    "hap-toolkit": "^0.6.6",
     "less": "^3.10.3",
     "less-loader": "^5.0.0"
   },

+ 21 - 9
src/api/fly.js

@@ -8,40 +8,52 @@
 import fetch from "@system.fetch";
 import Fly from "flyio/dist/npm/hap";
 import apiConfig from "./config";
+import prompt from '@system.prompt';
 import { getToken, clearToken } from "./utils";
 
 var fly = new Fly(fetch);
-
+var qs = require('qs');
 fly.config.baseURL = apiConfig.baseURL;
-fly.config.headers["Content-Type"] = "application/x-www-form-urlencoded;charset=utf-8";
+fly.config.headers["Content-Type"] =
+  "application/x-www-form-urlencoded;charset=utf-8";
 
-const filterNoToken = ["/login"]
+const filterNoToken = ["/login"];
 
 fly.interceptors.request.use(async config => {
-  // 过滤一些不需要登录的路由
+  // 过滤一些不需要登录的路由d
   if (filterNoToken.indexOf(config.url) === -1) {
     let token = await getToken();
     if (config.headers) config.headers.Authorization = token;
     else config.headers = { Authorization: token };
+    if (config.method === "POST") {
+      config.body=qs.stringify(config.body);
+    } 
+    console.log('请求开始!',config);
     return config;
   } else return config;
-})
+});
 
 fly.interceptors.response.use(
   res => {
+    console.log('响应开始',res);
     if (!res.data.code) {
-      return res.data.data
+      return res.data.data;
     } else if (res.data.code === 10023) {
       // token失效
       clearToken();
       return getToken().then(token => {
-        return r(res.config)
+        return r(res.config);
+      });
+    } 
+    else {
+      prompt.showToast({
+        message: res.data.msg
       })
-    } else {
-      return Promise.reject(res)
+      return Promise.reject(res);
     }
   },
   err => {
+    console.log('err',err)
     return Promise.reject(err);
   }
 );

+ 56 - 2
src/api/index.js

@@ -13,6 +13,11 @@ export const getHomeList = sex => {
   return fly.get(`/books/${sex}/index`);
 };
 
+//充值记录
+export const rechargeApi = params => {
+  return fly.get("/order/chargeRecordLists", params);
+};
+
 // 获取分类
 export const getCategory = () => {
   return fly.get("/books/getCategory");
@@ -36,14 +41,38 @@ export const getSimilarBooks = (category_id, bid) => {
   });
 };
 
+//获取章节消费记录
+export const chapterApi = params => {
+  return fly.get("/order/chapterOrderList", params);
+};
+//获取全本消费记录
+export const bookApi = params => {
+  return fly.get("/order/bookOrderList", params);
+};
+
+// 获取详情页中的目录
+export const getShortCatalog = bid => {
+  return fly
+    .get(`/books/${bid}/catalog`, {
+      page_size: 10,
+      page: 1
+    })
+    .then(r => r.list);
+};
+
 // 获取充值列表
 export const getChargeList = () => {
   return fly.get("/order/chargeList");
 };
 
+// 添加书籍进书架
+export const postUserShelfBooks = params => {
+  return fly.post(`/userShelfBooks`, params);
+};
+
 // 获取书架数据
-export const getUserShelfBooks = params => {
-  return fly.get(`/userShelfBooks`, params);
+export const getUserShelfBooks = () => {
+  return fly.get(`/userShelfBooks`);
 };
 
 // 获取章节
@@ -60,3 +89,28 @@ export const getChapters = params => {
 export const getIsonshelf = params => {
   return fly.get(`/userShelfBooks/isonshelf`, params);
 };
+
+// 删除书架书籍
+export const deleteShelfBook = params => {
+  return fly.get(`/userShelfBooks/delete`, params);
+};
+
+// 充值
+export const getPayQuery = params => {
+  return fly.get("/goToPay", params);
+};
+
+//获取用户信息
+export const getUserInfo = () => {
+  return fly.get(`/userinfo`);
+};
+
+//发送短信
+export const sendCode = params => {
+  return fly.post(`/user/sendCode`, params);
+};
+
+//用户绑定
+export const userBind = params => {
+  return fly.post(`/user/bindPhone`, params);
+};

+ 109 - 38
src/api/utils.js

@@ -1,9 +1,11 @@
 import "./promise.finally";
 import fly from "./fly";
 import qs from "qs";
-import storage from '@system.storage';
-import device from '@system.device';
-
+import storage from "@system.storage";
+import device from "@system.device";
+import request from "@system.request";
+import media from "@system.media";
+import prompt from "@system.prompt";
 // 获取token
 let token = null;
 export const getToken = async () => {
@@ -12,7 +14,9 @@ export const getToken = async () => {
   if (!token) token = (await storage.get({ key: "token" })).data;
 
   // token格式化
-  if (token && (typeof token === "string")) token = JSON.parse(token);
+  if (token && typeof token === "string") token = JSON.parse(token);
+
+  console.log("checkToken", checkToken(token));
 
   if (!token) getToken.promise = login();
   else if (checkToken(token)) return Promise.resolve(token.token);
@@ -21,16 +25,16 @@ export const getToken = async () => {
       return login();
     });
   }
-
-  getToken.promise = getToken.promise.finally(() => {
-    console.log("done");
-    getToken.promise = null;
-  }).then(r => {
-    return setToken(r);
-  })
+  getToken.promise = getToken.promise
+    .finally(() => {
+      getToken.promise = null;
+    })
+    .then(r => {
+      return setToken(r);
+    });
 
   return getToken.promise;
-}
+};
 
 // 登录
 export const login = async () => {
@@ -44,50 +48,117 @@ export const login = async () => {
   let ret = await fly.post("/login", data);
   console.log("login over");
   return ret;
-}
+};
 
 // 检测数据结果
-export const checkResult = (r) => {
+export const checkResult = r => {
   if (!r.data.code) {
     return r.data.data;
   } else {
-    return Promise.reject(r)
+    return Promise.reject(r);
   }
-}
+};
 
 // 刷新token
 const refreshToken = () => {
-  return fly.get("/RefreshToken", {
-    token: token.token
-  }).then(r => {
-    return checkResult(r)
-  }).catch(e => {
-    console.error('刷新token失败')
-    return Promise.reject(e)
-  })
-}
+  return fly
+    .get("/RefreshToken", {
+      token: token.token
+    })
+    .then(r => {
+      return checkResult(r);
+    })
+    .catch(e => {
+      console.error("刷新token失败");
+      return Promise.reject(e);
+    });
+};
 
 // 检查token的有效期
-const checkToken = (t) => {
-  return new Date() < t.time
-}
+const checkToken = t => {
+  return new Date() < t.time;
+};
 
 // 设置token
-const setToken = async (t) => {
+const setToken = async t => {
   token = formatToken(t);
   await storage.set({ key: "token", value: token });
   return t.token;
-}
+};
 
 // 清除token
 export const clearToken = async () => {
-  token = null
-  await storage.delete({ key: 'token' })
-}
+  token = null;
+  await storage.delete({ key: "token" });
+};
 
 // 处理token的格式
-const formatToken = (t) => {
-  t.token = 'Bearer ' + t.token
-  t.time = t.time * 1000 - 5 * 1000 * 60
-  return t
-}
+const formatToken = t => {
+  t.token = "Bearer " + t.token;
+  t.time = t.time * 1000 - 5 * 1000 * 60;
+  return t;
+};
+
+// 下载图片
+export const downImg = photoPath => {
+  //获取图片名
+  let list = photoPath.split(".");
+  let timeValue = new Date().valueOf();
+  /* 获取图片后缀 */
+  let photoExt = list[list.length - 1];
+  /* 设置要保存的图片名 */
+  let filename = `${timeValue}.${photoExt}`;
+  request.download({
+    url: photoPath,
+    filename: filename,
+    success: data => {
+      request.onDownloadComplete({
+        token: data.token,
+        success: data => {
+          /* 保存图片 */
+          media.saveToPhotosAlbum({
+            uri: data.uri,
+            success: () => {
+              prompt.showToast({
+                message: "图片保存成功!"
+              });
+            },
+            fail: (data, code) => {
+              if (code == 201) {
+                prompt.showToast({
+                  message: "授权成功后才能保存图片哦"
+                });
+              } else if (code == 202) {
+                prompt.showToast({
+                  message: "请刷新后重试"
+                });
+              } else if (code == 300) {
+                prompt.showToast({
+                  message: "图片保存失败"
+                });
+              }
+            }
+          });
+        },
+        fail: (data, code) => {
+          if (code == 1000) {
+            prompt.showToast({
+              message: "图片下载失败"
+            });
+          } else if (code == 1001) {
+            prompt.showToast({
+              message: "下载任务不存在"
+            });
+          }
+        }
+      });
+    },
+    fail: () => {}
+  });
+};
+//校验手机号
+export const validatePhone = phone => {
+  const VALIDATE_REG = /^(0|86|17951)?(13[0-9]|15[012356789]|166|17[0-9]|18[0-9]|14[57]|19[89])[0-9]{8}$/;
+  const isMobile = VALIDATE_REG.test(phone);
+  return isMobile;
+};

+ 2 - 1
src/app.ux

@@ -28,7 +28,8 @@ export default {
   createShortcut: it.hasCreateShortCut,
   data: {
     backClickCount: 0,
-    cutomerQrcode: "https://cdn-novel.iycdm.com/static/img/kefu.jpg"
+    cutomerQrcode: "https://cdn-novel.iycdm.com/static/img/kefu20190331.png",
+    weChat:"wxlxf1099"
   }
 };
 </script>

BIN
src/assets/imgs/declining.png


BIN
src/assets/imgs/pop_close.png


BIN
src/assets/imgs/sign_bg.jpg


BIN
src/assets/imgs/sign_checked.jpg


BIN
src/assets/imgs/sign_coin.jpg


BIN
src/assets/imgs/sign_gift.jpg


BIN
src/assets/imgs/sign_show.png


+ 27 - 6
src/assets/less/index.less

@@ -46,7 +46,7 @@
   align-items: center;
 
   .customer-popup {
-    width: 610px;
+    width: 600px;
     border-radius: 6px;
     background-color: #fff;
     flex-direction: column;
@@ -54,17 +54,38 @@
 
     .title {
       width: 100%;
-      font-size: 36px;
+      font-size: 30px;
       text-align: center;
       color: #333;
-      padding: 30px 0;
+      line-height:104px;
       border-bottom: 2px solid #f7f7f7;
     }
+    .desc{
+      margin:40px 80px;
+      font-size:28px;
+      color:#666;
+      text-align: center;
 
+    }
     image {
-      margin: 20px 0;
-      width: 400px;
-      height: 400px;
+      margin: 0 auto 10px;
+      width: 280px;
+      height: 280px;
+    }
+    .duplication{
+      margin-bottom: 40px;
+    }
+    .duplication-text{
+      font-size:24px;
+    }
+    .duplication-button{
+      color:#EF5952;
+      border:2px solid #EF5952;
+      padding:2px 8px;
+      border-radius: 20px;
+      font-size:20px;
+     margin-left:10px;
+
     }
   }
 }

+ 22 - 39
src/assets/less/my.less

@@ -2,54 +2,25 @@
   flex-direction: column;
 
   .user-info__wrap {
-    background-color: #3284ff;
-    padding: 40px;
+    background-color: #fff;
+    padding: 40px 30px;
 
     image {
-      width: 160px;
-      height: 160px;
-      border-radius: 100px;
+      width: 124px;
+      height: 124px;
+      border-radius: 80px;
+      border-color:#EBEBEB;
+      border-width:2px;
       margin-right: 40px;
     }
 
     text {
-      color: #fff;
-      font-size: 32px;
+      color: #333;
+      font-size: 30px;
     }
   }
 
-  .user-coin__wrap {
-    background-color: #3284ff;
-    justify-content: space-between;
-    align-items: center;
-    padding: 40px 120px;
-    
-    .user-rest {
-      flex-direction: row;
-      justify-content: flex-start;
-      align-items: center;
-      
-      text {
-        color: #fff;
-        font-size: 32px;
-      }
-
-      .rest-coin {
-        color: #ff6060;
-        font-weight: bold;
-      }
-    }
-
-    .pay-btn {
-      background-color: #ff6060;
-      color: #fff;
-      width: 100px;
-      height: 48px;
-      line-height: 48px;
-      text-align: center;
-      border-radius: 6px;
-    }
-  }
+  
 
   .operator-item__wrap {
     flex-direction: column;
@@ -72,6 +43,9 @@
         text {
           font-size: 30px;
           color: #545454;
+          .red{
+            color:#EF5952;
+          }
         }
       }
 
@@ -88,6 +62,15 @@
           width: 12px;
         }
       }
+      .operator-button{
+        background-color: #EF5952;
+        width: 116px;
+        height:44px;
+        border-radius: 4px;
+        color:#fff;
+        text-align: center;
+        font-size: 26px;
+      }
     }
   }
 

+ 11 - 8
src/assets/less/pay.less

@@ -7,14 +7,17 @@
   }
 
   .wrap-fixed {
-    height: 120px;
-    flex-shrink: 0;
-    background-color: #fff;
-    border-top: 2px solid #f7f7f7;
-    background-color: #fff;
-    justify-content: space-between;
-    align-items: center;
-    padding: 28px 24px;
+    flex-direction: column;
+    
+    .total-wrap {
+      height: 120px;
+      flex-shrink: 0;
+      background-color: #fff;
+      background-color: #fff;
+      justify-content: space-between;
+      align-items: center;
+      padding: 28px 24px;
+    }
 
     .total-cost {
       flex: 1;

+ 40 - 0
src/assets/less/phone.less

@@ -0,0 +1,40 @@
+.phone-wrap {
+  flex-direction: column;
+  .input-content {
+    flex-direction: column;
+    width: 600px;
+    margin: 200px auto 0;
+  }
+  .input-item {
+    background-color: #f7f7f7;
+    border: 1px solid #e6e6e6;
+    border-radius: 4px;
+    height: 90px;
+    margin-bottom: 40px;
+    align-items: center;
+    justify-content: space-between;
+    .input-text {
+      padding: 0 20px;
+      font-size: 28px;
+      border:0;
+      width: 300px;
+    }
+    .send-msg{
+      font-size:24px;
+      color:#EF5952;
+      margin-right:20px;
+    }
+    .disabled{
+      color:#ccc;
+    }
+  }
+  .bind-button{
+    height:90px;
+    line-height: 90px;
+    width:500px;
+    background-color:#EF5952;
+    color:#fff;
+    font-size:30px;
+    margin:40px auto 0;
+  }
+}

+ 23 - 8
src/assets/less/shelf.less

@@ -19,7 +19,7 @@
       }
 
       .cur {
-        color: #EF5952;
+        color: #ef5952;
         font-size: 36px;
         font-weight: bold;
       }
@@ -27,7 +27,7 @@
       .choose-bar {
         width: 38px;
         height: 4px;
-        background-color: #EF5952;
+        background-color: #ef5952;
         border-radius: 2px;
         margin-top: 10px;
       }
@@ -38,7 +38,7 @@
     height: 36px;
     background-color: #f7f7f7;
   }
-  
+
   .shelf-total {
     padding: 32px 22px;
     justify-content: space-between;
@@ -50,11 +50,11 @@
     }
 
     .manager {
-      border: 2px solid #EF5952;
+      border: 2px solid #ef5952;
       border-radius: 6px;
       background-color: #fff;
       font-size: 26px;
-      color: #EF5952;
+      color: #ef5952;
       width: 88px;
       height: 38px;
       text-align: center;
@@ -75,7 +75,7 @@
       margin-right: 50px;
 
       .book-del__wrap {
-        background-color: rgba(255, 255, 255, .6);;
+        background-color: rgba(255, 255, 255, 0.6);
         width: 200px;
         height: 264px;
         border-radius: 6px;
@@ -142,11 +142,26 @@
 
       .shelf-status {
         font-size: 24px;
-        color: #EF5952;
+        color: #ef5952;
         padding: 6px 17px;
         background-color: #f7f7f7;
         border-radius: 24px;
       }
     }
+    .book-del__item {
+      justify-content: center;
+      align-items: center;
+      flex-direction: column;
+      width: 100%;
+      background-color: rgba(255, 255, 255, 0.6);
+      image {
+        width: 40px;
+      }
+
+      text {
+        color: #4d4d4d;
+        margin-top: 20px;
+      }
+    }
   }
-}
+}

+ 3 - 2
src/components/book/book.ux

@@ -63,18 +63,19 @@ export default {
   },
   getBooks(book) {
     if (this.prevent) return;
+    console.log("click_book", book);
     if (this.similar) {
       router.replace({
         uri: "/views/Detail",
         params: {
-          bid: book.bid || ""
+          bid: book.book_id || ""
         }
       })
     } else {
       router.push({
         uri: "/views/Detail",
         params: {
-          bid: book.bid || ""
+          bid: book.book_id || ""
         }
       })
     }

+ 32 - 0
src/components/loading/loading.ux

@@ -0,0 +1,32 @@
+<template>
+  <div class="loading-wrap">
+    <text>{{text}}</text>
+  </div>
+</template>
+
+<script>
+export default {
+  props: {
+    text: {
+      type: String,
+      default: "加载ing..."
+    }
+  },
+}
+</script>
+
+
+<style lang="less" scoped>
+.loading-wrap {
+  flex: 1;
+  flex-direction: column;
+  justify-content: center;
+  align-items: center;
+  margin-top: 80px;
+
+  text {
+    font-size: 26px;
+    color: #999;
+  }
+}
+</style>

+ 109 - 0
src/components/sign/index.ux

@@ -0,0 +1,109 @@
+<template>
+	<div class="sign-wrap">
+		<div class="sign-content">
+			<div class="sign-banner">
+				<text class="sign-banner__text">获得<span class="orange">50</span>书币</text>
+			</div>
+			<div class="sign-line">
+				<div class="sign-line__item" for="{{signList}}">
+					<text class="sign-line__day">{{$item.day}}天</text>
+					<image src="../../assets/imgs/sign_{{$item.iconType}}.jpg"></image>
+					<text class="sign-line__fee">{{$item.fee}}书币</text>
+				</div>
+			</div>
+		</div>
+		<image src="../../assets/imgs/pop_close.png" class="close-icon" @click="setSignPop"></image>
+	</div>
+</template>
+<script>
+// 子组件
+export default {
+	data: {
+		signList: [
+			{ day: 1, iconType: 'coin', fee: 50 },
+			{ day: 2, iconType: 'coin', fee: 50 },
+			{ day: 3, iconType: 'gift', fee: 150 },
+			{ day: 4, iconType: 'coin', fee: 50 },
+			{ day: 5, iconType: 'coin', fee: 50 },
+			{ day: 6, iconType: 'coin', fee: 50 },
+			{ day: 7, iconType: 'gift', fee: 150 },
+		]
+	},
+	onInit() {
+
+	},
+	setSignPop() {
+		this.$dispatch('dispathEvt')
+	}
+}
+</script>
+<style lang="less" scoped>
+.sign {
+  &-wrap {
+    position: fixed;
+    top: 0;
+    bottom: 0;
+    left: 0;
+    right: 0;
+    background-color: rgba(0, 0, 0, 0.56);
+    flex-direction: column;
+    align-items: center;
+  }
+  &-content {
+    width: 650px;
+    height: 520px;
+    border-radius: 30px;
+    background-color: #fff;
+    margin-top: 240px;
+    flex-direction: column;
+  }
+  &-line {
+    margin-bottom: 20px;
+    margin-top: 10px;
+    height: 140px;
+    &__item {
+      flex: 1;
+      flex-direction: column;
+      align-items: center;
+      justify-content: space-around;
+    }
+    &__day {
+      color: #999;
+      font-size: 22px;
+    }
+    image {
+      width: 40px;
+      height: 40px;
+    }
+    &__fee {
+      font-size: 22px;
+    }
+  }
+  &-banner {
+    background-image: url(../../assets/imgs/sign_bg.jpg);
+    background-size: cover;
+    background-repeat: no-repeat;
+    justify-content: center;
+    width: 100%;
+    height: 350px;
+    border-top-left-radius: 30px;
+    border-top-right-radius: 30px;
+    &__text {
+      font-size: 34px;
+      color: #fff;
+      font-weight: bold;
+      margin-top: 200px;
+      .orange {
+        color: #ffc017;
+        font-size: 46px;
+        padding: 0 6px;
+      }
+    }
+  }
+}
+.close-icon {
+  width: 60px;
+  height: 60px;
+  margin-top: 60px;
+}
+</style>

+ 74 - 0
src/helper/index.js

@@ -0,0 +1,74 @@
+
+import wxpay from '@service.wxpay';
+import { getPayQuery } from "../api";
+
+export const pageLoad = (meta, fn, params) => {
+  return new Promise(async (resolve, reject) => {
+    if (meta.current_page) {
+      if (meta.next_page_url) {
+        let ret = await fn(params);
+        resolve(ret);
+      } else reject("last page");
+    } else {
+      console.log("first page");
+      let ret = await fn(params);
+      resolve(ret);
+    }
+  })
+}
+
+// 支付配置
+export const configWxPay = async (params) => {
+  let config = await getPayQuery(params);
+  console.log("pay config", config);
+  let prepayid = config.prepay_id;
+  // app中的配置信息
+  let extraAppConfig = {
+    app_id: config.appId,
+    partner_id: "",
+    package_value: "",
+    nonce_str: config.nonce_str,
+    time_stamp: "",
+    order_sign: config.sign
+  }
+  // web端的配置信息
+  let extraWebConfig = {
+    mweb_url: "http://www.baidu.com"
+  }
+  let payType = wxpay.getType();
+  let ret = null;
+  console.log(payType);
+  // return;
+  switch (payType) {
+    case "APP": ret = await useWxPay(prepayid, extraAppConfig); break;
+    case "MWEB": ret = await useWxPay(prepayid, extraWebConfig); break;
+    default: ret = "app not install or wx pay is not avaliable";
+  }
+
+  console.log(ret);
+}
+
+let useWxPay = (prepayid, extra) => {
+  return new Promise((resolve, reject) => {
+    console.log(prepayid);
+    console.log(extra);
+    wxpay.pay({
+      prepayid: prepayid,
+      extra: extra,
+      success: (data) => {
+        console.log("success", data);
+        // app中返回prepayid web中返回final_url
+        resolve(data);
+      },
+      fail: (data, code) => {
+        console.log("error");
+        console.log(data, code);
+        reject({ data, code });
+      },
+      cancel: () => {
+        console.log("user cancel");
+        reject({ message: "user cancel" });
+      }
+    })
+  })
+}

+ 19 - 2
src/manifest.json

@@ -1,5 +1,5 @@
 {
-  "package": "com.application.demo",
+  "package": "com.application.zhuishuyun",
   "name": "追书云小说",
   "versionName": "1.0.0",
   "versionCode": "1",
@@ -10,6 +10,15 @@
       "name": "system.app"
     },
     {
+      "name": "system.clipboard"
+    },
+    {
+      "name": "system.media"
+    },
+    {
+      "name": "system.request"
+    },
+    {
       "name": "system.prompt"
     },
     {
@@ -26,6 +35,14 @@
     },
     {
       "name": "system.storage"
+    },
+    {
+      "name": "service.wxpay",
+      "params": {
+        "package": "com.application.zhuishuyun",
+        "sign": "",
+        "url": ""
+      }
     }
   ],
   "permissions": [
@@ -37,7 +54,7 @@
     "logLevel": "debug"
   },
   "router": {
-    "entry": "views/Shelf",
+    "entry": "views/Index",
     "pages": {
       "views/Index": {
         "component": "index"

+ 2 - 2
src/views/Catalog/index.ux

@@ -27,9 +27,9 @@ export default {
     startpage: 1
   },
   onInit() {
-    let page = 2
+    let page = 1
     this.startpage = page
-    getCatalog({ bid: '5pNo6A7wqQmB1WgQygDjkOM9VZn2vXeY', page: page }).then(r => {
+    getCatalog({ bid: this.bid, page: page }).then(r => {
       console.log(r)
       this.list = r.list
       this.meta = r.meta

+ 109 - 23
src/views/Category/index.ux

@@ -1,4 +1,6 @@
 <import name="x-book" src="../../components/book/book.ux"></import>
+<import name="x-loading" src="../../components/loading/loading.ux"></import>
+ 
  
 <template>
   <div class="category-wrap">
@@ -6,47 +8,45 @@
       <list-item type="search" class="search-bar">
         <div class="search-bar__wrap">
           <image src="https://yueduyun.oss-cn-hangzhou.aliyuncs.com/xiaochengxu/img/search.png"></image>
-          <input type="text" placeholder="书名"></input>
+          <input id="search" type="text" enterkeytype="search" placeholder="书名" @enterkeyclick="bookSearch"></input>
         </div>
       </list-item>
       <list-item type="filter" class="filter-wrap">
         <div class="filter-item">
           <text class="filter-item__name">频道</text>
           <div class="filter-item__list">
-            <text class="filter-item__item cur">全部</text>
-            <text class="filter-item__item">女频</text>
-            <text class="filter-item__item">男频</text>
+            <block for="channel">
+              <text class="filter-item__item {{$item.key === filter.channel_id ? 'cur' : ''}}" @click="filterChange('channel_id', $item.key)">{{$item.name}}</text>
+            </block>
+            <!-- <text class="filter-item__item cur">全部</text> -->
           </div>
         </div>
         <div class="filter-item">
           <text class="filter-item__name">类型</text>
           <div class="filter-item__list">
-            <text class="filter-item__item cur">不限</text>
-            <text class="filter-item__item">豪门虐情</text>
-            <text class="filter-item__item">婚恋生活</text>
-            <text class="filter-item__item">青春校园</text>
-            <text class="filter-item__item">名国情院</text>
-            <text class="filter-item__item">女生玄幻</text>
-            <text class="filter-item__item">穿越重生</text>
-            <text class="filter-item__item">经商种田</text>
-            <text class="filter-item__item">女生灵异</text>
+            <block for="(category[filter.channel_id] && category[filter.channel_id].children)">
+              <text class="filter-item__item {{$item.id === filter.category_id ? 'cur': ''}}" @click="filterChange('category_id', $item.id)">{{$item.name}}</text>
+            </block>
           </div>
         </div>
         <div class="filter-item">
           <text class="filter-item__name">是否完结</text>
           <div class="filter-item__list">
-            <text class="filter-item__item">不限</text>
-            <text class="filter-item__item cur">完结</text>
-            <text class="filter-item__item">连载</text>
+            <block for="status">
+              <text class="filter-item__item {{$item.value === filter.status ? 'cur' : ''}}" @click="filterChange('status', $item.value)">{{$item.name}}</text>
+            </block>
           </div>
         </div>
       </list-item>
-      <block for="mockList">
+      <list-item type="loading" if="!list.length">
+        <x-loading text="{{loadingText}}"></x-loading>
+      </list-item>
+      <block for="list">
         <list-item type="books-item" class="books-item__wrap {{$idx === 0 ? 'book-item__wrap--first' : ''}}">
-          <x-book multi="{{true}}" width="{{150}}">
+          <x-book multi="{{true}}" width="{{150}}" book="{{$item}}">
             <div class="book-info">
-              <text class="name">惊世妖娆凤凰月惊123123世妖娆凤凰月</text>
-              <text class="intro">我作为一名公司普通的小职员,一觉醒来居然被人睡了,本来以为只是一次简单的意外事件,却不料因此被人蓄意利用卷卷卷进,我作为一名公司普通的小职员,一觉醒来居然被人睡了,本来以为只是一次简单的意外事件,却不料因此被人蓄意利用卷卷卷进...</text>
+              <text class="name">{{$item.book_name}}</text>
+              <text class="intro">{{$item.book_summary}}</text>
               <!-- <text class="status">豪门虐情 完结</text>
               <text class="words">字数:1231231</text>
               <div class="update">
@@ -63,17 +63,103 @@
 </template>
 
 <script>
+import { getCategory, getBooksList } from "../../api";
+import { pageLoad } from "../../helper";
+import storage from '@system.storage';
+
 export default {
   props: {},
   data() {
     return {
-      mockList: [1, 2, 3, 4, 5, 4, 6, 7, 8, 9, 10]
+      channel: [],
+      category: [],
+      list: [],
+      status: [
+        {
+          name: "完结",
+          value: 1
+        },
+        {
+          name: "连载",
+          value: 0
+        }
+      ],
+      filter: {
+        key: "",
+        channel_id: "",
+        category_id: "",
+        order_field: "recommend_index",
+        order_seq: "asc",
+        page_size: 100,
+        page: 1,
+        status: 1
+      },
+      meta: {},
+      loadingText: "加载ing..."
     }
   },
   onReachBottom() {
     // 请求更多数据
-    console.log("到达底部")
-  }
+    this.getBooksArray();
+  },
+  async getCategory() {
+    this.category = this.initCategory(await getCategory());
+    await this.initChannel(this.category);
+    this.getBooksArray();
+  },
+  async initChannel(category) {
+    this.filter.channel_id = +((await storage.get({ key: "sex" })).data);
+    this.filter.category_id = category[this.filter.channel_id].id;
+    this.channel = category.map((c, i) => {
+      return {
+        name: c.name,
+        id: c.id,
+        key: i
+      }
+    });
+  },
+  initCategory(category) {
+    category.forEach(cate => {
+      cate.children.unshift({
+        id: cate.id,
+        name: "不限"
+      })
+    });
+    return category;
+  },
+  filterChange(field, value) {
+    this.filter[field] = value;
+    if (field === "channel_id") this.filter.category_id = this.category[value].id;
+    this.getBooksArray(false);
+  },
+  bookSearch(iptValue) {
+    this.filter.key = iptValue.value;
+    this.getBooksArray(false);
+    this.$element('search').focus({ focus: false });
+  },
+  getBooksArray(isLoad = true) {
+    this.loadingText = "加载ing...";
+    this.filter.page = (this.meta.current_page || 0) + 1;
+    if (!isLoad) {
+      this.filter.page = 1;
+      this.meta = {};
+    }
+    let params = this.filter;
+    console.log(params);
+    pageLoad(this.meta, getBooksList, params).then(ret => {
+      let newList = isLoad ? this.list : [];
+      let dataList = ret.list;
+      newList.push(...dataList);
+      this.meta = ret.meta;
+      this.list = newList;
+      if (!this.list.length) this.loadingText = "没有更多数据";
+    }).catch(e => {
+      console.log("e", e);
+    })
+  },
+  onInit() {
+    this.getCategory();
+  },
 }
 </script>
 

+ 71 - 13
src/views/Consume/index.ux

@@ -12,50 +12,108 @@
     </div>
     <list class="consume-wrap">
       <block if="curTab === 0">
-        <block for="consumeList">
+        <block for="{{chapter.list}}">
           <list-item type="chapter" class="consume-item">
             <div class="consume-info">
-              <text class="name">爱妃在上</text>
-              <text class="chapter">第339章:爱妃,好久不见</text>
-              <text class="create">2019-08-28 14:11:11</text>
+              <text class="name">{{$item.book_name}}</text>
+              <text class="chapter">{{$item.chapter_name}}</text>
+              <text class="create">{{$item.created_at}}</text>
             </div>
-            <text class="consume-price">54 书币</text>
+            <text class="consume-price">{{$item.fee}}书币</text>
           </list-item>
         </block>
       </block>
       <block elif="curTab === 1">
-        <block for="consumeList">
+        <block for="{{book.list}}">
           <list-item type="book" class="consume-item">
             <div class="consume-info">
-              <text class="name">爱妃在上</text>
-              <text class="create">2019-08-28 14:11:11</text>
+              <text class="name">{{$item.book_name}}</text>
+              <text class="create">{{$item.created_at}}</text>
             </div>
-            <text class="consume-price">54 书币</text>
+            <text class="consume-price">{{$item.fee}}书币</text>
           </list-item>
         </block>
       </block>
       <list-item type="page" class="consume-wrap">
-        <x-page current="{{1}}" total="{{2}}" @prev="prev" @next="next"></x-page>
+        <x-page current="{{currentPage.current}}" total="{{currentPage.total}}" @prev="prev" @next="next"></x-page>
       </list-item>
     </list>
   </div>
 </template>
 
 <script>
+import { chapterApi, bookApi } from "../../api/index";
 export default {
   private: {
     curTab: 0,
     tabs: ["章节", "整本"],
-    consumeList: [1, 2, 3, 4, 5, 5, 23, 523, 213, 1, 23, 3, 4, 2, 1],
+    chapter: {
+      list: [],
+      page: {
+        total: 0,
+        current: 1
+      },
+    },
+    book: {
+      list: [],
+      page: {
+        total: 0,
+        current: 1
+      },
+    },
+    currentPage: {
+      total: 0,
+      current: 1
+    }
+
+  },
+  onInit() {
+    this.getOrderChapter();
+  },
+  async getOrderChapter(page = 1, page_size = 10) {
+    let res = await chapterApi({ page: page, page_size });
+    let { list, meta } = res;
+    let pages = { total: meta.last_page, current: meta.current_page };
+    this.chapter = { ...this.chapter, list, page: pages };
+    this.currentPage = pages;
+  },
+  async getOrderBook(page = 1, page_size = 2) {
+    let res = await bookApi({ page: page, page_size });
+    let { list, meta } = res;
+    let pages = { total: meta.last_page, current: meta.current_page };
+    this.book = { ...this.book, list, page: pages };
+    this.currentPage = pages;
   },
   tabChange(index) {
     this.curTab = index;
+    switch (index) {
+      case 0:
+        this.getOrderChapter();
+        break;
+      case 1:
+        this.getOrderBook();
+        break;
+    }
   },
   prev() {
-    console.log("上一页");
+    switch (this.curTab) {
+      case 0:
+        this.getOrderChapter(--this.currentPage.current);
+        break;
+      case 1:
+        this.getOrderBook(--this.currentPage.current);
+        break;
+    }
   },
   next() {
-    console.log("下一页");
+    switch (this.curTab) {
+      case 0:
+        this.getOrderChapter(++this.currentPage.current);
+        break;
+      case 1:
+        this.getOrderBook(++this.currentPage.current);
+        break;
+    }
   }
 }
 </script>

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 38 - 20
src/views/Detail/index.ux


+ 3 - 3
src/views/Home/index.ux

@@ -68,6 +68,7 @@
 
 <script>
 import { getHomeList } from "../../api";
+import storage from '@system.storage';
 
 export default {
   props: {},
@@ -99,12 +100,11 @@ export default {
     this.$emit('change');
   },
   async getCityListByTabChange(index) {
-    console.log(index);
+    await storage.set({ key: "sex", value: index || 0 });
     let sex = index ? "female" : "male";
-    let ret = await getHomeList(sex)
+    let ret = await getHomeList(sex);
     this.banner = ret.slice(0, 1)[0];
     this.list = ret.slice(1);
-    console.log("list", this.list);
   }
 }
 </script>

+ 34 - 7
src/views/Index/index.ux

@@ -2,7 +2,7 @@
 <import name="category-page" src="../Category/index.ux"></import>
 <import name="shelf-page" src="../Shelf/index.ux"></import>
 <import name="my-page" src="../My/index.ux"></import>
- 
+ <import name="sign-page" src="../../components/sign/index.ux"></import>
 <template>
   <stack class="stack-wrap">
     <div class="index-wrap">
@@ -26,16 +26,24 @@
         </div>
       </div>
     </div>
+    <sign-page if="{{showSignPop}}" onemitEvt="emitEvt"></sign-page>
     <div class="stack-popup" @click="closeWrap" if="showPopup">
-      <div class="customer-popup" @click="copyWechat">
+      <div class="customer-popup">
         <text class="title">联系客服</text>
-        <image src="{{$app.$def.data.cutomerQrcode}}"></image>
+        <text class="desc">
+          复制微信号或者保存二维码到本地至微信添加客服好友
+        </text>
+        <image src="{{$app.$def.data.cutomerQrcode}}" @longpress="saveImg"></image>
+        <div class="duplication"><text class="duplication-text">微信号:{{$app.$def.data.weChat}}</text><text class="duplication-button" @click="duplication">复制</text></div>
       </div>
     </div>
   </stack>
 </template>
 
 <script>
+import clipboard from '@system.clipboard';
+import prompt from '@system.prompt';
+import {downImg} from '../../api/utils.js';
 export default {
   private: {
     tabbar: [
@@ -68,9 +76,13 @@ export default {
         index: 3
       }
     ],
-    current: 0,
-    showPopup: false
+    current: 1,
+    showPopup: false,
+    showSignPop:true
   },
+  onInit(){
+      this.$on('dispathEvt',this.changeSignPop)
+    },
   onBackPress() {
     // 退出逻辑
     if (this.$app.$def.data.backClickCount === 0) {
@@ -93,11 +105,26 @@ export default {
   pageSwitch() {
     this.current = 1;
   },
+  changeSignPop() {
+    this.showSignPop = false;
+  },
   closeWrap() {
     this.showPopup = false;
   },
-  copyWechat(e) {
-    e.stopPropagation();
+  //复制客服微信
+  duplication() {
+    clipboard.set({
+      text: this.$app.$def.data.weChat,
+      success: function (data) {
+        prompt.showToast({
+          message: '复制成功!'
+        })
+      },
+    })
+  },
+  //长按保存图片
+  saveImg() {
+    downImg(this.$app.$def.data.cutomerQrcode);
   },
   openCustomer() {
     this.showPopup = true;

+ 27 - 14
src/views/My/index.ux

@@ -1,20 +1,21 @@
 <template>
   <div class="user-wrap">
     <div class="user-info__wrap">
-      <image src="http://thirdwx.qlogo.cn/mmopen/dOnU7xaqjEYxcrJjHWw4HnyXer3EgjuyibYjzM1ncrtQVpgX8icrXYCnwLpd8htFvg1jrAc88PdE2gVkmKnYByAHrULcMlyOwY/132"></image>
-      <text>ID:123123123</text>
-    </div>
-    <div class="user-coin__wrap">
-      <div class="user-rest">
-        <text>您还剩</text>
-        <text class="rest-coin">52222</text>
-        <text>书币</text>
-      </div>
-      <text class="pay-btn" @click="pageChange('Pay')">充值</text>
+      <image src="{{user.head_img}}"></image>
+      <text>ID:{{user.id}}</text>
     </div>
     <div class="operator-item__wrap">
       <div class="operator-item">
         <div class="item-name">
+          <image src="../../assets/imgs/declining.png"></image>
+          <text>您还剩<span class="red">{{user.balance}}</span>书币</text>
+        </div>
+        <text class="operator-button" @click="pageChange('Pay')">
+         充值
+        </text>
+      </div>
+      <div class="operator-item" @click="toUrl('https://sitenlp5w4yepme7xrqz.zhuishuyun.com/sign')">
+        <div class="item-name">
           <image src="../../assets/imgs/sign.png"></image>
           <text>签到</text>
         </div>
@@ -22,8 +23,6 @@
           <image class="arrow" src="../../assets/imgs/arrow-right.png"></image>
         </div>
       </div>
-    </div>
-    <div class="operator-item__wrap">
       <div class="operator-item" @click="pageChange('Recharge')">
         <div class="item-name">
           <image src="../../assets/imgs/recharge_record.png"></image>
@@ -67,11 +66,20 @@
 
 <script>
 import router from "@system.router";
-
+import {  getUserInfo } from "../../api/index";
 export default {
   props: {},
   data() {
-    return {}
+    return {
+      user: {}
+    }
+  },
+  onInit() {
+    this.getUser();
+  },
+  async getUser(){
+  let user =await getUserInfo();
+    this.user=user;
   },
   showCustomerQrcode() {
     this.$emit('customer');
@@ -80,6 +88,11 @@ export default {
     router.push({
       uri: `/views/${page}`
     })
+  },
+  toUrl(url) {
+    router.push({
+      uri: url
+    })
   }
 }
 </script>

+ 21 - 87
src/views/Pay/index.ux

@@ -34,7 +34,7 @@
                   <div class="recharge-item {{curSelect === $idx ? 'recharge-item__select' : ''}}">
                     <text class="price {{curSelect === $idx ? 'price__select' : ''}}">{{charge.price}}</text>
                     <text class="send {{curSelect === $idx ? 'send__select' : ''}}">{{charge.text}}</text>
-                    <div class="discount {{curSelect === $idx ? 'discount__select' : ''}}">
+                    <div class="discount {{curSelect === $idx ? 'discount__select' : ''}}" if="charge.save_text">
                       <block if="!charge.is_year_order">
                         <text>省</text>
                       </block>
@@ -53,16 +53,22 @@
       </tab-content>
     </tabs>
     <div class="wrap-fixed">
-      <div class="total-cost">
-        <text>合计:{{total}}</text>
-        <text class="notice">选择充值金额(1元=100书币)</text>
+      <image src="../../assets/imgs/shadow.png" class="shadow"></image>
+      <div class="total-wrap">
+        <div class="total-cost">
+          <text>合计:{{total}}</text>
+          <text class="notice">选择充值金额(1元=100书币)</text>
+        </div>
+        <text class="go-to-pay" @click="toPay">立即充值</text>
       </div>
-      <text class="go-to-pay">立即充值</text>
     </div>
   </div>
 </template>
 
 <script>
+import { getChargeList } from "../../api";
+import { configWxPay } from "../../helper";
+
 export default {
   private: {
     curPayType: 1,
@@ -80,86 +86,7 @@ export default {
         value: 2
       }
     ],
-    rechargeList: [
-      {
-
-        price: "5元",
-        is_year_order: 0,
-        is_month_order: 0,
-        text: "500+300书币",
-        first_charge: false,
-        today_special: false,
-        save_text: "3元",
-        product_id: 5448,
-        show_free_ads: 0
-      },
-      {
-        price: "9.9元",
-        is_year_order: 0,
-        is_month_order: 0,
-        text: "990+450书币",
-        first_charge: false,
-        today_special: false,
-        save_text: "4.5元",
-        product_id: 5057,
-        show_free_ads: 0
-      },
-      {
-        price: "18元",
-        is_year_order: 0,
-        is_month_order: 0,
-        text: "1800+900书币",
-        first_charge: false,
-        today_special: false,
-        save_text: "9元",
-        product_id: 5059,
-        show_free_ads: 0
-      },
-      {
-        price: "30元",
-        is_year_order: 0,
-        is_month_order: 0,
-        text: "3000+1500书币",
-        first_charge: false,
-        today_special: false,
-        save_text: "15元",
-        product_id: 5061,
-        show_free_ads: 0
-      },
-      {
-        price: "50元",
-        is_year_order: 0,
-        is_month_order: 0,
-        text: "5000+3000书币",
-        first_charge: false,
-        today_special: true,
-        save_text: "30元",
-        product_id: 5062,
-        show_free_ads: 0
-      },
-      {
-        price: "100元",
-        is_year_order: 0,
-        is_month_order: 0,
-        text: "10000+9000书币",
-        first_charge: false,
-        today_special: false,
-        save_text: "90元",
-        product_id: 5063,
-        show_free_ads: 0
-      },
-      {
-        price: "365元",
-        is_year_order: 1,
-        is_month_order: 0,
-        text: "每天1元,全年免费看",
-        first_charge: false,
-        today_special: false,
-        save_text: "年费vip会员",
-        product_id: 5064,
-        show_free_ads: 0
-      }
-    ]
+    rechargeList: []
   },
   changePayType(type) {
     this.curPayType = type.value;
@@ -168,14 +95,21 @@ export default {
     this.curSelect = key;
     this.total = this.rechargeList[key].price;
   },
-  onInit() {
-    // 选择默认
+  async initChargeList() {
+    this.rechargeList = await getChargeList();
     this.rechargeList.forEach((p, k) => {
       if (p.today_special) {
         this.curSelect = k;
       }
     })
   },
+  toPay() {
+    let product_id = this.rechargeList[this.curSelect].product_id;
+    configWxPay({ product_id: product_id })
+  },
+  onInit() {
+    this.initChargeList();
+  },
   onHide() {
     this.$app.$def.createShortcut(true);
   }

+ 85 - 1
src/views/Phone/index.ux

@@ -1,5 +1,89 @@
 <template>
   <div class="phone-wrap">
-    <text>绑定手机</text>
+    <div class="input-content">
+      <div class="input-item">
+        <input class="input-text" type="tel" placeholder="请输入手机号" value="{{mobile}}" style="placeholder-color: #CCC" onchange="updateMobile"></input>
+      </div>
+      <div class="input-item">
+        <input class="input-text" type="number" maxlength="6" placeholder="请输入验证码" value="{{code}}" style="placeholder-color: #CCC" onchange="updateMessage"></input>
+        <text class="send-msg" if="{{!hasSend}}" @click="sendMsg">获取验证码</text>
+        <text class="send-msg disabled" else>重新获取{{duration}}</text>
+      </div>
+    </div>
+    <input type="button" value="绑定手机号" class="bind-button" @click="bindUser"> </input>
   </div>
 </template>
+<script>
+import { validatePhone } from '../../api/utils';
+import { sendCode, userBind } from '../../api/index';
+import prompt from '@system.prompt';
+export default {
+  private: {
+    hasSend: false,
+    duration: 60,
+    mobile: null,
+    code: null
+
+  },
+  onInit() {
+
+  },
+  async sendMsg() {
+    let result = validatePhone(this.mobile);
+    if (result) {
+      let res = await sendCode({ phone: this.mobile });
+      this.countDown();
+    } else {
+      prompt.showToast({
+        message: '手机号格式不正确'
+      })
+    }
+  },
+  updateMobile(e) {
+    this.mobile = e.value;
+  },
+  updateMessage(e) {
+    this.code = e.value;
+  },
+  //倒计时
+  countDown() {
+    this.hasSend = true;
+    let time = setInterval(() => {
+      this.duration--;
+      if (this.duration < 1) {
+        clearInterval(time);
+        this.duration = 120;
+        this.hasSend = false;
+      }
+    }, 1000);
+  },
+  //绑定用户
+  async bindUser() {
+    if (!this.mobile || !this.code) {
+      prompt.showToast({
+        message: '请输入手机号和验证码'
+      })
+      return false;
+    }
+    if (!validatePhone(this.mobile)) {
+      prompt.showToast({
+        message: '手机号码格式不正确'
+      })
+      return false;
+    }
+    let params = {
+      phone: this.mobile,
+      code: this.code
+    }
+    let res = await userBind(params);
+    prompt.showToast({
+      message: '绑定成功!'
+    })
+
+  }
+
+}
+</script>
+<style lang="less">
+@import "../../assets/less/phone.less";
+</style>

+ 2 - 2
src/views/Reader/index.ux

@@ -17,7 +17,7 @@
 
 <script>
 import router from "@system.router";
-import { getChapters, getIsonshelf, getUserShelfBooks } from "../../api";
+import { getChapters, getIsonshelf, postUserShelfBooks } from "../../api";
 
 export default {
   protected: {
@@ -38,7 +38,7 @@ export default {
   addShelf() {
     console.log("add shelf");
     getIsonshelf({ bid: this.bid }).then(r => {
-      r.is_on ? '' : getUserShelfBooks({ bid: this.bid })
+      r.is_on ? '' : postUserShelfBooks({ bid: this.bid })
     })
   },
   toCatalog() {

+ 33 - 10
src/views/Recharge/index.ux

@@ -10,7 +10,7 @@
       <div class="balance-bar">
         <div class="balance">
           <text>余额:</text>
-          <text class="balance-number">123123</text>
+          <text class="balance-number">{{user.balance}}</text>
           <text>书币</text>
         </div>
         <text class="pay-btn" @click="toPay">立即充值</text>
@@ -22,32 +22,55 @@
         <text class="title">充值订单</text>
       </div>
       <div class="recharge-list">
-        <block for="rechargeList">
+        <block for="{{rechargeList}}">
           <div class="recharge-item">
             <div class="item-info">
               <text class="item-name">订单号:</text>
-              <text class="item-number">1231241234234123123123</text>
+              <text class="item-number">{{$item.trade_no}}</text>
               <div class="item-pay">
                 <text>充值</text>
-                <text class="pay-number">0.01</text>
+                <text class="pay-number">{{$item.price}}</text>
                 <text>元</text>
               </div>
             </div>
-            <text class="item-status un-pay">未支付</text>
+            <text class="item-status">{{$item.status==='UNPAID'?'未支付':'已支付'}}</text>
           </div>
         </block>
       </div>
     </div>
-    <x-page current="{{1}}" total="{{2}}" @prev="prev" @next="next"></x-page>
+    <x-page current="{{page.current}}" total="{{page.total}}" @prev="prev" @next="next"></x-page>
   </div>
 </template>
 
 <script>
 import router from "@system.router";
-
+import { rechargeApi, getUserInfo } from "../../api/index";
 export default {
   private: {
-    rechargeList: [1, 2, 3, 4, 5, 6, 76, 78]
+    rechargeList: [],
+    user:{},
+    page:{
+      total:0,
+      current:1
+    },
+    user: {},
+  },
+  onInit() {
+    this.getOrder();
+    this.getUserInfo();
+  },
+  async getUserInfo(){
+    let user =await getUserInfo();
+    this.user=user;
+  },
+  async getOrder(page=1,page_size=10) {
+    let res= await rechargeApi({page:page,page_size});
+    let {list,meta}=res;
+    this.rechargeList=list;
+    this.page={
+      total:meta.last_page,
+      current:meta.current_page
+    }
   },
   toPay() {
     router.push({
@@ -55,10 +78,10 @@ export default {
     })
   },
   prev() {
-    console.log("上一页");
+    this.getOrder(--this.page.current);
   },
   next() {
-    console.log("下一页");
+    this.getOrder(++this.page.current);
   }
 }
 </script>

+ 28 - 12
src/views/Shelf/index.ux

@@ -20,7 +20,7 @@
           <div class="book-item__wrap {{(($idx + 1)%3 === 0) ? 'm0' : ''}}">
             <stack>
               <x-book book='{{$item}}'></x-book>
-              <div class="book-del__wrap" show="{{isDelMode}}">
+              <div class="book-del__wrap" show="{{isDelMode}}" @click='deleteBook($item)'>
                 <image src="https://yueduyun.oss-cn-hangzhou.aliyuncs.com/xiaochengxu/img/delete.png"></image>
                 <text>删除</text>
               </div>
@@ -37,14 +37,20 @@
       <list class="recent-list">
         <block for="mockList">
           <list-item type="recent-item" class="recent-item">
-            <x-book multi="{{true}}" width="{{150}}">
-              <div class="book-info__wrap">
-                <text class="name">爱的邂逅</text>
-                <text class="lastest">最新 第2556章 又来了一个张老三</text>
-                <text class="last-read">上次阅读:第23章 张老三是个蓝精灵</text>
-                <text class="shelf-status">❤️ 已加入书架</text>
+            <stack>
+              <x-book multi="{{true}}" book='{{$item}}' width="{{150}}">
+                <div class="book-info__wrap">
+                  <text class="name">{{$item.book_name}}</text>
+                  <text class="lastest">最新 {{$item.last_chapter}}</text>
+                  <text class="last-read">上次阅读:{{$item.recent_reading_chapter}}</text>
+                  <text class="shelf-status">❤️ 已加入书架</text>
+                </div>
+              </x-book>
+              <div class="book-del__item" show="{{isDelMode}}" @click='deleteBook($item)'>
+                <image src="https://yueduyun.oss-cn-hangzhou.aliyuncs.com/xiaochengxu/img/delete.png"></image>
+                <text>删除</text>
               </div>
-            </x-book>
+            </stack>
           </list-item>
         </block>
       </list>
@@ -53,13 +59,13 @@
 </template>
 
 <script>
-import { getUserShelfBooks } from "../../api";
+import { getUserShelfBooks, deleteShelfBook } from "../../api";
 
 export default {
   props: {},
   data() {
     return {
-      current: 0,
+      current: 1,
       isDelMode: false,
       modeText: "管理",
       mockList: [],
@@ -76,15 +82,24 @@ export default {
     }
   },
   onInit() {
+    this.getUserShelfBooks()
+    this.$watch('isDelMode', 'listenMode')
+  },
+  getUserShelfBooks() {
+    console.log(1)
     getUserShelfBooks().then(r => {
       r.map(m => {
         m.cover_url = m.cover
         delete m.cover
       })
-      console.log(1)
       this.mockList = r
     })
-    this.$watch('isDelMode', 'listenMode')
+  },
+  deleteBook(book) {
+    console.log(book)
+    deleteShelfBook({ bid: book.bid }).then(r => {
+      this.getUserShelfBooks()
+    })
   },
   changeMode() {
     this.isDelMode = !this.isDelMode;
@@ -94,6 +109,7 @@ export default {
   },
   toCategory() {
     this.$emit('change');
+
   },
   typeChange(index) {
     this.current = index;

+ 56 - 52
yarn.lock

@@ -662,14 +662,14 @@
     lodash "^4.17.13"
     to-fast-properties "^2.0.0"
 
-"@hap-toolkit/compiler@^0.6.5":
-  version "0.6.5"
-  resolved "https://registry.yarnpkg.com/@hap-toolkit/compiler/-/compiler-0.6.5.tgz#c43f64341b29c34a80404b5101db09670dd740d3"
-  integrity sha512-xCVCbI6xLsFjoaQmBcVSNcPiNEBQG793YA/jj/cR2mlEiUwOZqKdBopTvc82U49JgprskiLXV2OjIwMDbHurzQ==
+"@hap-toolkit/compiler@^0.6.6":
+  version "0.6.6"
+  resolved "https://registry.yarnpkg.com/@hap-toolkit/compiler/-/compiler-0.6.6.tgz#df3d0aa3eb78d7828a03e5c1938d64ddd135b607"
+  integrity sha512-2KaQxfXfJiYK5knOtvC0HVVnaNkiPNJAOc6HHfHxvsokFmEeapCkkLjnstFscMidsw82yC4c1Iz57ySYtURzMw==
   dependencies:
     "@babel/core" "^7.3.4"
     "@babel/plugin-transform-template-literals" "^7.2.0"
-    "@hap-toolkit/shared-utils" "^0.6.5"
+    "@hap-toolkit/shared-utils" "^0.6.6"
     css "^2.2.4"
     css-what "^2.1.3"
     escodegen "^1.11.1"
@@ -680,12 +680,12 @@
     source-map "^0.7.3"
     webpack "^4.29.5"
 
-"@hap-toolkit/debugger@^0.6.5":
-  version "0.6.5"
-  resolved "https://registry.yarnpkg.com/@hap-toolkit/debugger/-/debugger-0.6.5.tgz#4320f9638693de5802bfe4c5e752c468cfc44e38"
-  integrity sha512-ngd8m34hYb002YWbwR0PKd40a/do3xi1vj1tVcFYRq3XH4SS7+chtb088u/BNgtrb4+yQMmdpXdrt8pYPu71/A==
+"@hap-toolkit/debugger@^0.6.6":
+  version "0.6.6"
+  resolved "https://registry.yarnpkg.com/@hap-toolkit/debugger/-/debugger-0.6.6.tgz#bb68d7ecff4b7f5c58f1406c6027f5a787c75b2c"
+  integrity sha512-ce6oitq5z63+E45lZJp9mW9O50JUVw6Jc4ISnX2un66hLK+wxi7EcRsC7NgXS6iqxtQcW3wcjI+WQbbQRRCZ7Q==
   dependencies:
-    "@hap-toolkit/shared-utils" "^0.6.5"
+    "@hap-toolkit/shared-utils" "^0.6.6"
     adb-commander "^0.1.8"
     adb-devices-emitter "^0.1.8"
     chrome-simple-launcher "0.1.3"
@@ -696,14 +696,14 @@
     qr-image "^3.2.0"
     socket.io "^2.2.0"
 
-"@hap-toolkit/dsl-vue@^0.6.5":
-  version "0.6.5"
-  resolved "https://registry.yarnpkg.com/@hap-toolkit/dsl-vue/-/dsl-vue-0.6.5.tgz#2cb2d4b97601d83baf3759f2e19c175d0580bfd7"
-  integrity sha512-AwOcqJTdpdpE9p/7Rs71TKTc1jPLmtQ+Ua+/wH4fpq09++0LHcfi87Nti2cO8XW9mQF5T+11vOQk0lwGkRzVgw==
+"@hap-toolkit/dsl-vue@^0.6.6":
+  version "0.6.6"
+  resolved "https://registry.yarnpkg.com/@hap-toolkit/dsl-vue/-/dsl-vue-0.6.6.tgz#5b85f99cc62e06ebffd001c1e7058b444d939aa7"
+  integrity sha512-2uvUXzmyTTeXrGgIasR73pVxNYtGQ+xTav+lSyRRFQWjmAmWfo9ldp6aHqGuI8FaS1++UhVOsMX+SUiU7AKU2A==
   dependencies:
-    "@hap-toolkit/compiler" "^0.6.5"
-    "@hap-toolkit/packager" "^0.6.5"
-    "@hap-toolkit/shared-utils" "^0.6.5"
+    "@hap-toolkit/compiler" "^0.6.6"
+    "@hap-toolkit/packager" "^0.6.6"
+    "@hap-toolkit/shared-utils" "^0.6.6"
     css-loader "^2.1.1"
     md5 "^2.2.1"
     mini-css-extract-plugin "^0.5.0"
@@ -712,28 +712,28 @@
     vue-template-compiler "^2.6.7"
     webpack-sources "^1.3.0"
 
-"@hap-toolkit/dsl-xvm@^0.6.5":
-  version "0.6.5"
-  resolved "https://registry.yarnpkg.com/@hap-toolkit/dsl-xvm/-/dsl-xvm-0.6.5.tgz#eef1dd2f156321c38cd9f927e24af2800c132ced"
-  integrity sha512-HT8l2KOLKgjWCD0jnlCNgISXQG1XZe2uI6tF6OVljs2AMlJuN3FORtva9We6JYKTIoMTCmERGBe/TTH+mVtlTA==
+"@hap-toolkit/dsl-xvm@^0.6.6":
+  version "0.6.6"
+  resolved "https://registry.yarnpkg.com/@hap-toolkit/dsl-xvm/-/dsl-xvm-0.6.6.tgz#e7a17b1993569327a750f6a80a764d729e01fbd9"
+  integrity sha512-kN1GFn32CWa5qMVppTsEaLT697XHN/iKo1Emk/592qXK1I9KTwiCnkVxgmM6mnxcObmm9v5kLd3CWFqZJ0geYQ==
   dependencies:
-    "@hap-toolkit/compiler" "^0.6.5"
-    "@hap-toolkit/packager" "^0.6.5"
-    "@hap-toolkit/shared-utils" "^0.6.5"
+    "@hap-toolkit/compiler" "^0.6.6"
+    "@hap-toolkit/packager" "^0.6.6"
+    "@hap-toolkit/shared-utils" "^0.6.6"
     css-loader "^2.1.1"
     url-loader "^2.1.0"
 
-"@hap-toolkit/packager@^0.6.5":
-  version "0.6.5"
-  resolved "https://registry.yarnpkg.com/@hap-toolkit/packager/-/packager-0.6.5.tgz#b4937061c5b579f65494b4c388778a56bad6ac08"
-  integrity sha512-ng9eK+qsRRKts7V4GxwlMyJqmlBRBaqkN++3mVXyoRL7iT8OuSawld8Oczl7SLdMJMA7BVqtyX3x0ZDaZQ035w==
+"@hap-toolkit/packager@^0.6.6":
+  version "0.6.6"
+  resolved "https://registry.yarnpkg.com/@hap-toolkit/packager/-/packager-0.6.6.tgz#42869da8f0ce199d1fa3ed7067bdc547277ea450"
+  integrity sha512-/PqE0+VhJozFUpdHKvr0KLxa2yzjmGuTn0jkudociWqDnIfhs9oVjkQTBUe2xuXK/atHxyhuqT6IpQ/i0RqMRA==
   dependencies:
     "@babel/core" "^7.3.3"
     "@babel/preset-env" "^7.3.1"
     "@babel/register" "^7.0.0"
     "@babel/runtime" "^7.3.1"
-    "@hap-toolkit/compiler" "^0.6.5"
-    "@hap-toolkit/shared-utils" "^0.6.5"
+    "@hap-toolkit/compiler" "^0.6.6"
+    "@hap-toolkit/shared-utils" "^0.6.6"
     aaptjs "^1.3.1"
     babel-loader "^8.0.5"
     fs-extra "^7.0.1"
@@ -745,15 +745,15 @@
     qr-image "^3.2.0"
     webpack "^4.29.5"
 
-"@hap-toolkit/server@^0.6.5":
-  version "0.6.5"
-  resolved "https://registry.yarnpkg.com/@hap-toolkit/server/-/server-0.6.5.tgz#fdbdc0f8458a042e25a2ee34c602e7639374b1b6"
-  integrity sha512-ltAsdvKXCiI2AwO1uOGO+p7FXoROGIqHHwxqtOPwlZbf2k6yRpISr5jbiW4yS+G8mg6uC+GNcvUPnADz19+0Vg==
+"@hap-toolkit/server@^0.6.6":
+  version "0.6.6"
+  resolved "https://registry.yarnpkg.com/@hap-toolkit/server/-/server-0.6.6.tgz#88f1b56813cda059b8eda504d8260d18a9cea3ee"
+  integrity sha512-IJkMVeJ+My+Tj+dn44jnE68NKEKkbFE2vNTa7RdpI1uwA4R766J6/fHd6tD/rCo7MgClOaH0mvcEQDLtsYaOkQ==
   dependencies:
     "@babel/runtime" "^7.3.1"
-    "@hap-toolkit/debugger" "^0.6.5"
-    "@hap-toolkit/packager" "^0.6.5"
-    "@hap-toolkit/shared-utils" "^0.6.5"
+    "@hap-toolkit/debugger" "^0.6.6"
+    "@hap-toolkit/packager" "^0.6.6"
+    "@hap-toolkit/shared-utils" "^0.6.6"
     jszip "^3.2.0"
     koa "^2.7.0"
     koa-body "^4.0.8"
@@ -765,10 +765,10 @@
     portfinder "^1.0.20"
     qr-image "^3.2.0"
 
-"@hap-toolkit/shared-utils@^0.6.5":
-  version "0.6.5"
-  resolved "https://registry.yarnpkg.com/@hap-toolkit/shared-utils/-/shared-utils-0.6.5.tgz#a7d2261ca0f758d5c17baca66ef8913c6a83b9a1"
-  integrity sha512-ki/0TVFTmlNr3HYeq9bF7cl7s9ci1RYWRAbrTdlN+PhCZrUgx17kgN4stnd/3v4Tk9ceDJzKyOxO07PKMuK+CA==
+"@hap-toolkit/shared-utils@^0.6.6":
+  version "0.6.6"
+  resolved "https://registry.yarnpkg.com/@hap-toolkit/shared-utils/-/shared-utils-0.6.6.tgz#775cfd21ffa896456b8e51f113f45a9143528a7d"
+  integrity sha512-qEzuij1YmX0oHuwSNTr3OspxPWFiSDBzyHABqxX2KOndRV7CdX2LVJFyYrzaIrecrt49veoETqrHfOw6ymLt4A==
   dependencies:
     chalk "^2.4.2"
     qrcode-terminal "^0.12.0"
@@ -791,6 +791,10 @@
   resolved "https://registry.yarnpkg.com/@types/node/-/node-12.7.12.tgz#7c6c571cc2f3f3ac4a59a5f2bd48f5bdbc8653cc"
   integrity sha512-KPYGmfD0/b1eXurQ59fXD1GBzhSQfz6/lKBxkaHX9dKTzjXbK68Zt7yGUxUsCS1jeTy/8aL+d9JEr+S54mpkWQ==
 
+"@types/quickapp@git+https://github.com/vivoquickapp/quickapp-types.git":
+  version "1.0.0"
+  resolved "git+https://github.com/vivoquickapp/quickapp-types.git#b195ca92b2e8880d12e102af2c51662b456f66a1"
+
 "@vue/component-compiler-utils@^3.0.0":
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/@vue/component-compiler-utils/-/component-compiler-utils-3.0.0.tgz#d16fa26b836c06df5baaeb45f3d80afc47e35634"
@@ -2713,23 +2717,23 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6
   resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.2.tgz#6f0952605d0140c1cfdb138ed005775b92d67b02"
   integrity sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==
 
-hap-toolkit@^0.6.5:
-  version "0.6.5"
-  resolved "https://registry.yarnpkg.com/hap-toolkit/-/hap-toolkit-0.6.5.tgz#75c4f059a3ba33f424bde04deb11d7d50aeae995"
-  integrity sha512-OJSotl3y1SIm5jlZ2phuztyeWAyB+Jwn/z2FtgOVciuVU3m7QApbvMX7zCvVAgEBCJDnM+tt6DxmMJQfCIEclQ==
+hap-toolkit@^0.6.6:
+  version "0.6.6"
+  resolved "https://registry.yarnpkg.com/hap-toolkit/-/hap-toolkit-0.6.6.tgz#3ce2fd5d81fdc38755365a992bf0289c776d2744"
+  integrity sha512-ks2ddDy01pERyqZIL2eX+UwEcNe5mbeeOlJ3HQ4R10i2MYCwo7AfhpAp5agSolHfFvEfZAKOdlWdru1/Kb9z/w==
   dependencies:
     "@babel/core" "^7.1.6"
     "@babel/plugin-syntax-jsx" "^7.0.0"
     "@babel/preset-env" "^7.0.0"
     "@babel/register" "^7.0.0"
     "@babel/runtime" "^7.0.0"
-    "@hap-toolkit/compiler" "^0.6.5"
-    "@hap-toolkit/debugger" "^0.6.5"
-    "@hap-toolkit/dsl-vue" "^0.6.5"
-    "@hap-toolkit/dsl-xvm" "^0.6.5"
-    "@hap-toolkit/packager" "^0.6.5"
-    "@hap-toolkit/server" "^0.6.5"
-    "@hap-toolkit/shared-utils" "^0.6.5"
+    "@hap-toolkit/compiler" "^0.6.6"
+    "@hap-toolkit/debugger" "^0.6.6"
+    "@hap-toolkit/dsl-vue" "^0.6.6"
+    "@hap-toolkit/dsl-xvm" "^0.6.6"
+    "@hap-toolkit/packager" "^0.6.6"
+    "@hap-toolkit/server" "^0.6.6"
+    "@hap-toolkit/shared-utils" "^0.6.6"
     babel-loader "^8.0.4"
     chalk "^2.3.0"
     chokidar "^3.0.1"