浏览代码

个人银行卡列表建设中

JXDS18FUJT 2 年之前
父节点
当前提交
f23f9073b9
共有 60 个文件被更改,包括 7618 次插入79 次删除
  1. 1 1
      index.html
  2. 4621 1
      package-lock.json
  3. 3 2
      package.json
  4. 0 10
      src/api/api.ts
  5. 20 0
      src/api/index.ts
  6. 49 0
      src/api/modules/cashOut.ts
  7. 21 0
      src/api/modules/login.ts
  8. 108 0
      src/api/modules/order.ts
  9. 17 0
      src/api/modules/user.ts
  10. 48 0
      src/api/modules/wx.ts
  11. 53 8
      src/api/request.ts
  12. 46 0
      src/api/types/cashOut.d.ts
  13. 10 0
      src/api/types/common.d.ts
  14. 26 0
      src/api/types/login.d.ts
  15. 28 0
      src/api/types/order.d.ts
  16. 27 0
      src/api/types/user.d.ts
  17. 21 0
      src/api/types/wx.d.ts
  18. 二进制
      src/assets/img/bgImg.png
  19. 二进制
      src/assets/img/bill.png
  20. 二进制
      src/assets/img/config.png
  21. 二进制
      src/assets/img/leftArrow.png
  22. 二进制
      src/assets/img/message.png
  23. 二进制
      src/assets/img/moneyBg.png
  24. 二进制
      src/assets/img/order.png
  25. 二进制
      src/assets/img/people1.png
  26. 二进制
      src/assets/img/review.png
  27. 二进制
      src/assets/img/unLoginHead.png
  28. 二进制
      src/assets/img/招行.png
  29. 二进制
      src/assets/img/提现到银行卡.png
  30. 27 0
      src/components/m-button/index.vue
  31. 16 4
      src/components/m-nav-bar/index.vue
  32. 二进制
      src/components/m-nav-bar/leftArrow_black.png
  33. 二进制
      src/components/m-nav-bar/leftArrow_white.png
  34. 70 0
      src/hooks/bank/wxBank.ts
  35. 24 0
      src/hooks/user/index.ts
  36. 2 1
      src/main.ts
  37. 53 0
      src/model/cashOut.ts
  38. 59 0
      src/model/collection.ts
  39. 26 0
      src/model/myBranchList.ts
  40. 124 0
      src/model/test.ts
  41. 5 2
      src/router/guard.ts
  42. 7 5
      src/router/index.ts
  43. 7 28
      src/store/index.ts
  44. 30 4
      src/store/state.ts
  45. 3 1
      src/style/main.scss
  46. 30 0
      src/utils/mount-component.ts
  47. 0 1
      src/views/About.tsx
  48. 2 2
      src/views/Home.tsx
  49. 109 0
      src/views/cashout copy/components/cashoutDialog.vue
  50. 195 0
      src/views/cashout copy/index.vue
  51. 109 0
      src/views/cashout/components/cashoutDialog.vue
  52. 418 0
      src/views/cashout/index.vue
  53. 219 0
      src/views/drawByBank/index.vue
  54. 153 0
      src/views/drawByBankRecord/index.vue
  55. 363 0
      src/views/home/index.vue
  56. 192 0
      src/views/income/index.vue
  57. 238 0
      src/views/order/index.vue
  58. 2 2
      src/views/teacherApply/index.vue
  59. 22 0
      src/views/teacherReview/index.vue
  60. 14 7
      vite.config.ts

+ 1 - 1
index.html

@@ -4,7 +4,7 @@
   <meta charset="UTF-8">
   <link rel="icon" href="/favicon.ico" />
   <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0;" name="viewport" />
-  <title>教练端</title>
+  <title>速达财仝</title>
 </head>
 <body>
   <div id="app"></div>

文件差异内容过多而无法显示
+ 4621 - 1
package-lock.json


+ 3 - 2
package.json

@@ -2,17 +2,18 @@
   "name": "vue_tsx",
   "version": "0.0.0",
   "scripts": {
-    "dev": "vite",
+    "dev": "vite --host",
     "build:dev": "vite build --mode test",
     "build": "vite build --mode production"
   },
   "dependencies": {
     "axios": "^0.22.0",
     "dayjs": "^1.10.8",
+    "vant": "^3.1.5",
     "vue": "3.0.11",
     "vue-router": "^4.0.6",
     "vuex": "4.0.0",
-    "vant": "^3.1.5"
+    "vuex-persistedstate": "^4.1.0"
   },
   "devDependencies": {
     "@types/node": "^14.14.41",

+ 0 - 10
src/api/api.ts

@@ -1,10 +0,0 @@
-import { AxiosPromise, AxiosResponse } from "axios";
-import request from "./request";
-
-export default {
-
-
-
-}
-
-

+ 20 - 0
src/api/index.ts

@@ -0,0 +1,20 @@
+import order from './modules/order'
+import login from './modules/login'
+import user from './modules/user'
+import wx from './modules/wx'
+
+
+
+
+
+
+
+export default {
+    order,
+    login,
+    user,
+    wx
+}
+export * from "./modules/cashOut";
+
+

+ 49 - 0
src/api/modules/cashOut.ts

@@ -0,0 +1,49 @@
+import { AxiosPromise } from "axios";
+import request from "../request";
+
+export interface CashoutRes extends Common.Res {
+	data: {};
+}
+
+class CashOut {
+	/**
+	 * 查询收益列表
+	 * @returns
+	 */
+	extensionIncomeList(): AxiosPromise<CashOutType.extensionIncomeListRes> {
+		return request("/student/extension/income/extensionIncomeList");
+	}
+
+	extensionIncomePrice(): AxiosPromise<CashOutType.extensionIncomePriceRes> {
+		return request("/student/extension/income/extensionIncomePrice");
+	}
+
+	/**查询提现记录 */
+	extractList(): AxiosPromise<CashOutType.ExtractList> {
+		return request("/student/wx/extract/list");
+	}
+	// 查询微信提现到银行卡记录
+	studentWxBankList(params:Object) :AxiosPromise<CashOutType.bankList> {
+		return request("/student/wx/bank/list",{
+			params,
+			method:"get"
+		})
+	}
+	//银行卡提现
+	studentWxExtractWxwithbankdrawal(data:Object){
+		return request("/student/wx/extract/wxwithbankdrawal",{
+			data,
+			method:"post"
+		})
+
+	}
+	/**微信提现 */
+	cashout(params: { amount: number }): AxiosPromise<CashoutRes> {
+		return request("/student/wx/extract/withdraw", {
+			params,
+			method: "post",
+		});
+	}
+}
+
+export const cashOut = new CashOut();

+ 21 - 0
src/api/modules/login.ts

@@ -0,0 +1,21 @@
+import { AxiosPromise } from "axios";
+import request from "../request";
+const login = {
+    //公众号登陆
+    logingzhcode(data: {
+        authorizationCode: string
+    }): AxiosPromise<login.logingzhcode> {
+        return request({
+            url: 'login/gzhcode',
+            headers: {
+                isToken: "0",
+            },
+            method: 'post',
+            params: data
+        })
+
+    }
+
+}
+
+export default login

+ 108 - 0
src/api/modules/order.ts

@@ -0,0 +1,108 @@
+import { AxiosPromise } from "axios";
+import request from "../request";
+import { order } from "../types/order";
+const order = {
+    //按年查询每月收入
+    studentOrderInfoSelectMonthIncone(params: {
+        year: number|string
+    }):AxiosPromise<any> {
+        return request({
+            url: "student/order/info/selectMonthIncone",
+            method: "GET",
+            params
+        })
+
+    },
+    //查询订单列表
+    studentOrderInfoList(params: {
+        endTime?: string,
+        goodsName?: string,
+        outRefundNo?: string,
+        outTradeNo?: string,
+        pageNum?: number,
+        pageSize?: number,
+        referralUserId?: number,
+        startTime?: string,
+        total?: number,
+        tradeType?: string
+
+    }): AxiosPromise<order.studentOrderInfoList> {
+        return request({
+            url: 'student/order/info/list',
+            params: params,
+            method: 'GET'
+        })
+
+    },
+    //今日预估收益
+    studentOrderInfoTodayTotal(params: {
+        endTime?: string,
+        goodsName?: string,
+        outRefundNo?: string,
+        outTradeNo?: string,
+        pageNum?: number,
+        pageSize?: number,
+        referralUserId?: number,
+        startTime?: string,
+        total?: number,
+        tradeType?: string
+
+    }): AxiosPromise<order.commonResponse> {
+        return request({
+            url: 'student/order/info/todayTotal',
+            params: params,
+            method: 'GET'
+        })
+
+    },
+    //总收益
+    studentOrderInfoTotal(params: {
+        endTime?: string,
+        goodsName?: string,
+        outRefundNo?: string,
+        outTradeNo?: string,
+        pageNum?: number,
+        pageSize?: number,
+        referralUserId?: number,
+        startTime?: string,
+        total?: number,
+        tradeType?: string
+
+    }): AxiosPromise<order.commonResponse> {
+        return request({
+            url: 'student/order/info/total',
+            params: params,
+            method: 'GET'
+        })
+
+    },
+    //昨日收益
+    studentOrderInfoYesterdayTotal(params: {
+        endTime?: string,
+        goodsName?: string,
+        outRefundNo?: string,
+        outTradeNo?: string,
+        pageNum?: number,
+        pageSize?: number,
+        referralUserId?: number,
+        startTime?: string,
+        total?: number,
+        tradeType?: string
+
+    }): AxiosPromise<order.commonResponse> {
+        return request({
+            url: 'student/order/info/yesterdayTotal',
+            params: params,
+            method: 'GET'
+        })
+
+    }
+
+}
+
+
+
+export default order
+
+
+

+ 17 - 0
src/api/modules/user.ts

@@ -0,0 +1,17 @@
+import { AxiosPromise } from "axios";
+import request from "../request";
+
+const user = {
+    //查询用户信息
+    studentUserInfo():AxiosPromise<user.studentUserInfo>{
+        return request({
+            url:"student/user/info",
+            method:'GET'
+        })
+
+    }
+
+}
+
+export default user
+

+ 48 - 0
src/api/modules/wx.ts

@@ -0,0 +1,48 @@
+
+import { AxiosPromise } from "axios";
+import request from "../request";
+
+const wx = {
+    //查询微信提现列表
+     studentWxExtractlist(params:{
+        pageNum:number
+        pageSize:number
+     }):AxiosPromise<wx.wxExtractList>{
+        return request({
+            url:"student/wx/extract/list",
+            method:'get',
+            params
+        })
+
+
+    },
+    //微信提现
+    studentWxExtractWithdraw(params:{
+        amount:number
+
+    }):AxiosPromise<wx.response>{
+        return request({
+            url:"student/wx/extract/withdraw",
+            method:'post',
+            params
+        })
+
+    },
+    //银行卡提现
+    studentWxExtractWxwithbankdrawal(data:{
+        amount:number,
+        bankCode:number,
+        encBankNo:string,
+        encTrueName:string
+    }){
+        return request({
+            url:"student/wx/extract/wxwithbankdrawal",
+            method:'post',
+            data
+        })
+
+    }
+
+    
+}
+export default wx

+ 53 - 8
src/api/request.ts

@@ -1,19 +1,64 @@
-import axios from "axios";
+import axios, { AxiosResponse } from "axios";
 import { requestLogger, responseLogger } from "axios-logger";
+import { Toast } from 'vant';
 const request = axios.create({
-	baseURL: import.meta.env.MODE === "production" ? "/prod-api" : "/dev-api",
+	baseURL: import.meta.env.MODE === "production" ? "https://sdjk-admin.zzxcx.net/sdjk-admin/" : "https://sdjk-admin.zzxcx.net/sdjk-admin/",
+	//"/prod-api" : "/dev-api"
 });
-request.interceptors.request.use(config=>{
-	// let token = window.localStorage.getItem("token")
-	if (config.headers.isToken !== false) {
-	//	config.headers["Authorization"] = "Bearer " +token; // 让每个请求携带自定义token 请根据实际情况自行修改
-		config.headers["Authorization"]=""
+request.interceptors.request.use(config => {
+	const token = window.localStorage.getItem("token") || ""
+	if (config.headers.isToken === "0") {
+		config.headers["Authorization"] = ""
 	}
+	else {
+		config.headers["Authorization"] = "Bearer " + token;
+
+	}
+	// 让每个请求携带自定义token 请根据实际情况自行修改
+	// config.headers["Authorization"]="Bearer " +token;
+
 	return config;
 
 })
-request.interceptors.response.use((res) => {
+request.interceptors.response.use((res: AxiosResponse<Common.Res>) => {
+	if (res && res.data) {
+		switch (res.data.code) {
+			case 200:
+				break;
+			case 401:
+				// Toast("登录失败,需要再次登录")
+				window.setTimeout(() => {
+
+					switch (import.meta.env.MODE) {
+						case "development":
+							location.replace(`https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx3043c2c1decb01ed&redirect_uri=https://coach.zzxcx.net/&response_type=code&scope=snsapi_userinfo&state=LOGIN#wechat_redirect`)
+							break;
+						case "test":
+							location.replace(`https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx67ca1b8c9816ef28&redirect_uri=https://jpcj-h51.zzxcx.net/home/test&response_type=code&scope=snsapi_userinfo&state=LOGIN#wechat_redirect`)
+							break;
+						case "production":
+							location.replace(`https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx67ca1b8c9816ef28&redirect_uri=https://jpcj-h5.zzxcx.net/home/test&response_type=code&scope=snsapi_userinfo&state=LOGIN#wechat_redirect`);
+							break;
+					}
+				}, 2000)
+				break;
+			case 502:
+				if (res.data.msg == "微信授权无效,请重新授权") {
+					location.replace("https://coach.zzxcx.net/")
+					return
+				}
+			
+				Toast.fail(res.data.msg)
+
+				break;
+			default:
+				Toast.fail(res.data.msg)
+				break;
+		}
+	}
+
 	// console.log(res)
+
 	return res;
 });
 

+ 46 - 0
src/api/types/cashOut.d.ts

@@ -0,0 +1,46 @@
+declare namespace CashOutType {
+	interface otherUserInfo {
+		headImage: string;
+		nickName: string;
+		createTime: string;
+		hierarchy: string;
+		openid: string;
+		percentage: string;
+		profitPrice: number;
+	}
+	interface extensionIncomeListRes extends Common.Res {
+		rows: otherUserInfo[];
+		total: number;
+	}
+	interface userInfo {
+		beneficiaryOpenid: string;
+		extractPrice: number;
+		headImage: string;
+		nickName: string;
+		remainderPrice: number;
+		totalPrice: number;
+	}
+	interface extensionIncomePriceRes extends Common.Res {
+		data: userInfo;
+	}
+	interface bankList extends Common.Res {
+		rows: Array<{
+			bankCode:Number,
+			encBankNo:string,
+			encTrueName:string,
+			id:Number,
+			openid:string
+		}>;
+	}
+
+	interface ExtractList extends Common.Res {
+		rows: Array<{
+			id: number;
+			partnerTradeNo: string;
+			extractPrice: number;
+			status: number;
+			createTime: string;
+		}>;
+		total: number;
+	}
+}

+ 10 - 0
src/api/types/common.d.ts

@@ -0,0 +1,10 @@
+declare namespace Common {
+  interface Paging {
+    pageNum?: number;
+    pageSize?: number;
+  }
+  interface Res {
+    code: number;
+    msg: string;
+  }
+}

+ 26 - 0
src/api/types/login.d.ts

@@ -0,0 +1,26 @@
+declare namespace login {
+    interface response {
+        code: number,
+        msg: string
+    }
+    interface logingzhcode extends response {
+        data: {
+            thirdResult: {
+                city: string
+                country: string
+                headimgurl: string
+                nickname: string
+                openid: string
+                privilege?: []
+                province: string
+                sex: string
+                unionid: string
+            },
+            token: string
+
+        },
+
+
+    }
+
+}

+ 28 - 0
src/api/types/order.d.ts

@@ -0,0 +1,28 @@
+export declare namespace order {
+    interface response {
+        msg: string
+        code: number
+    }
+    interface commonResponse extends response {
+        msg: string
+        code: number
+        data: number
+    }
+    
+    interface studentOrderInfoList extends response {
+        rows: {
+            "createTime": string,
+            "updateTime": string,
+            "id": number,
+            "goodsName": string,
+            "outTradeNo": string,
+            "outRefundNo": string,
+            "total": number,
+            "tradeType": "APP",
+            "successTime": "2022-10-18 12:49:28",
+            "commissionPrice": 3
+        }[]
+    }
+
+
+}

+ 27 - 0
src/api/types/user.d.ts

@@ -0,0 +1,27 @@
+declare namespace user {
+    interface response {
+        msg: string
+        code: number
+    }
+    interface studentUserInfo extends response {
+
+        data: {
+            "id": number,
+            "phone": string | null,
+            "headImage": string,
+            "nickName": string,
+            "appOpenid": string,
+            "xcxOpenid": string,
+            "gzhOpenid": string,
+            "status": number,
+            "isVip": number,
+            "unionId": string,
+            "thirdPlatform": string,
+            "recommendCode": null | string,
+            "bindRecommendCode": null | string,
+            "profitPrice": 0,
+            "parentUnionId": null | string
+        }
+    }
+
+}

+ 21 - 0
src/api/types/wx.d.ts

@@ -0,0 +1,21 @@
+declare namespace wx {
+    interface response {
+        msg: string
+        code: number
+    }
+    interface wxExtractList extends response {
+        total:number
+        rows: {
+            "createTime": string,
+            "updateTime": string,
+            "id": number,
+            "openid": string,
+            "partnerTradeNo": string,
+            "remark": null,
+            "extractPrice": number,
+            "status": "1"|"2"
+
+        }[]
+    }
+
+}

二进制
src/assets/img/bgImg.png


二进制
src/assets/img/bill.png


二进制
src/assets/img/config.png


二进制
src/assets/img/leftArrow.png


二进制
src/assets/img/message.png


二进制
src/assets/img/moneyBg.png


二进制
src/assets/img/order.png


二进制
src/assets/img/people1.png


二进制
src/assets/img/review.png


二进制
src/assets/img/unLoginHead.png


二进制
src/assets/img/招行.png


二进制
src/assets/img/提现到银行卡.png


+ 27 - 0
src/components/m-button/index.vue

@@ -0,0 +1,27 @@
+<template>
+  <span class="button" :style="{ width, height }">{{ text }}</span>
+</template>
+
+<script setup lang="ts">
+const props = defineProps({
+  text: String,
+  width: String,
+  height: String,
+});
+</script>
+
+<style lang="scss" scoped>
+.button {
+  width: 100px;
+  height: 40px;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  font-size: 26px;
+  border-radius: 40px;
+  &:active {
+    background-color: #cccccc;
+    filter: brightness(50%);
+  }
+}
+</style>

+ 16 - 4
src/components/m-nav-bar/index.vue

@@ -1,21 +1,30 @@
 <template>
   <div class="header" :class="{
       'header-border-bottom':border
-  }" :style="transparent ? '' : 'background-color: #ffffff;'">
+  }" :style="background ? 'background:'+background : 'background: transparent;'">
     <!-- <m-icon type="fanhui" @click="onClickLeft" /> -->
     <div class="left">
-      <img @click="onClickLeft" class="left-arrow" src="./leftArrow.png" />
+      <img v-if="mode=='black'" @click="onClickLeft" class="left-arrow" src="./leftArrow_black.png" />
+      <img v-if="mode=='white'" @click="onClickLeft" class="left-arrow" src="./leftArrow_white.png" />
     </div>
 
-    <span class="title">{{ title }}</span>
+    <span :style="{
+      color:mode
+    }" class="title">{{ title }}</span>
   </div>
 </template>
 
 <script setup lang="ts">
 import { useRouter } from 'vue-router';
+
 const props = defineProps({
   title: String,
   border: Boolean,
+  background:String,
+  mode:{
+    type:String,
+    default:'black'
+  }
 });
 const router = useRouter();
 const onClickLeft = () => {
@@ -26,12 +35,14 @@ const onClickLeft = () => {
 <style lang="scss" scoped>
 .header-border-bottom {
   border-bottom: 2px solid #e8e8e8;
+
+
 }
 .header {
   position: sticky;
   top: 0;
   font-size: 30px;
-  padding: 28px;
+  padding: 20px;
 
   z-index: 999;
   .left {
@@ -49,6 +60,7 @@ const onClickLeft = () => {
     left: 50%;
     top: 50%;
     transform: translate(-50%, -50%);
+    font-size: 30px;
   }
 }
 </style>

二进制
src/components/m-nav-bar/leftArrow_black.png


二进制
src/components/m-nav-bar/leftArrow_white.png


+ 70 - 0
src/hooks/bank/wxBank.ts

@@ -0,0 +1,70 @@
+import { computed, reactive } from "vue";
+import { useRoute } from "vue-router";
+
+export const useWxBank = () => {
+    const wxBankList = reactive([
+        { bankName: "工商银行", bankCode: 1002 },
+        { bankName: "农业银行", bankCode: 1005 },
+        { bankName: "建设银行", bankCode: 1003 },
+        { bankName: "中国银行", bankCode: 1026 },
+        { bankName: "交通银行", bankCode: 1020 },
+        { bankName: "招商银行", bankCode: 1001 },
+        { bankName: "邮储银行", bankCode: 1066 },
+        { bankName: "民生银行", bankCode: 1006 },
+        { bankName: "平安银行", bankCode: 1010 },
+        { bankName: "中信银行", bankCode: 1021 },
+        { bankName: "浦发银行", bankCode: 1004 },
+        { bankName: "兴业银行", bankCode: 1009 },
+        { bankName: "光大银行", bankCode: 1022 },
+        { bankName: "广发银行", bankCode: 1027 },
+        { bankName: "华夏银行", bankCode: 1025 },
+        { bankName: "宁波银行", bankCode: 1056 },
+        { bankName: "北京银行", bankCode: 4836 },
+        { bankName: "上海银行", bankCode: 1024 },
+        { bankName: "南京银行", bankCode: 1054 },
+        { bankName: "长子县融汇村镇银行", bankCode: 475 },
+        { bankName: "长沙银行", bankCode: 4216 },
+        { bankName: "浙江泰隆商业银行", bankCode: 4051 },
+        { bankName: "中原银行", bankCode: 4753 },
+        { bankName: "企业银行(中国)", bankCode: 4761 },
+        { bankName: "顺德农商银行", bankCode: 4036 },
+        { bankName: "衡水银行", bankCode: 4752 },
+        { bankName: "长治银行", bankCode: 4756 },
+        { bankName: "大同银行", bankCode: 4767 },
+        { bankName: "河南省农村信用社", bankCode: 4115 },
+        { bankName: "宁夏黄河农村商业银行", bankCode: 4150 },
+        { bankName: "山西省农村信用社", bankCode: 4156 },
+        { bankName: "安徽省农村信用社", bankCode: 4166 },
+        { bankName: "甘肃省农村信用社", bankCode: 4157 },
+        { bankName: "天津农村商业银行", bankCode: 4153 },
+        { bankName: "广西壮族自治区农村信用社", bankCode: 4113 },
+        { bankName: "陕西省农村信用社", bankCode: 4108 },
+        { bankName: "深圳农村商业银行", bankCode: 4076 },
+        { bankName: "宁波鄞州农村商业银行", bankCode: 4052 },
+        { bankName: "浙江省农村信用社联合社", bankCode: 4764 },
+        { bankName: "江苏省农村信用社联合社", bankCode: 4217 },
+        { bankName: "江苏紫金农村商业银行股份有限公司", bankCode: 4072 },
+        { bankName: "北京中关村银行股份有限公司", bankCode: 4769 },
+        { bankName: "星展银行(中国)有限公司", bankCode: 4778 },
+        { bankName: "枣庄银行股份有限公司", bankCode: 4766 },
+        { bankName: "海口联合农村商业银行股份有限公司", bankCode: 4758 },
+        { bankName: "南洋商业银行(中国)有限公司", bankCode: 4763 },
+    ]);
+    const getBankNameByCode = (bankCode:number)=>{
+        let bankName = ""
+        wxBankList.forEach(item=>{
+            if(item.bankCode===bankCode){
+                bankName = item.bankName
+            }
+        })
+        return bankName
+
+
+
+    }
+    return {
+        wxBankList,
+        getBankNameByCode
+    }
+
+}

+ 24 - 0
src/hooks/user/index.ts

@@ -0,0 +1,24 @@
+import { computed, ref } from "vue";
+import { useStore } from "vuex";
+
+/**
+ * 获取用户会员到期时间
+ */
+export const useExpireTime = () => {
+	const store = useStore();
+	const expireTime = computed(() => store.getters.getUserData.expireTime);
+	return {
+		expireTime,
+	};
+};
+
+/**
+ * 获取用户可提现金额
+ */
+export const useProfitPrice = () => {
+	const store = useStore();
+	const profitPrice = computed(() => (store.getters.getUserData.profitPrice / 100).toFixed(2));
+	return {
+		profitPrice,
+	};
+};

+ 2 - 1
src/main.ts

@@ -22,4 +22,5 @@ app.directive('opacity', {
     }
 })
 
-app.use(router).use(store).mount('#app');
+app.use(router).use(store)
+app.mount('#app')

+ 53 - 0
src/model/cashOut.ts

@@ -0,0 +1,53 @@
+import { cashOut } from "@/api";
+
+/**分成收益模型 */
+export class CashOutModel {
+	private api = cashOut;
+
+	/**查询收益列表 */
+	async extensionIncomeList() {
+		const res = await this.api.extensionIncomeList();
+		return {
+			rows: res.data.rows.map((item) => {
+				item.profitPrice /= 100;
+				return {
+					...item,
+					profitPrice: item.profitPrice.toFixed(2),
+				};
+			}),
+			total: res.data.total,
+		};
+	}
+
+	/**查询收益金额(总金额、已提现金额、未提现金额) */
+	async extensionIncomePrice() {
+		const {
+			data: { data },
+		} = await this.api.extensionIncomePrice();
+
+		data.extractPrice /= 100;
+		data.remainderPrice /= 100;
+		data.totalPrice /= 100;
+		return {
+			...data,
+			extractPrice: data.extractPrice.toFixed(2),
+			remainderPrice: data.remainderPrice.toFixed(2),
+			totalPrice: data.totalPrice.toFixed(2),
+		};
+	}
+
+	async extractList() {
+		const { data } = await this.api.extractList();
+
+		return data;
+	}
+
+	/**提现 */
+	async cashout(amount: number) {
+		const { data } = await this.api.cashout({
+			amount,
+		});
+
+		return data;
+	}
+}

+ 59 - 0
src/model/collection.ts

@@ -0,0 +1,59 @@
+import { getQuestionInfoByIds, CollectionAndWrong } from "@/api";
+
+/**收藏与错题列表模型 */
+export class CollectionModel {
+	[x: string]: any;
+	private collectionApi;
+
+	constructor(apiType: CollectionAndWrongType.type) {
+		this.collectionApi = new CollectionAndWrong(apiType);
+	}
+
+	/**获取列表 */
+	async getList(params: CollectionAndWrongType.ListParams): Promise<{
+		total: number;
+		rows: Test.QuestionInfo[];
+		collectionList: CollectionAndWrongType.QuestionRes[];
+	}> {
+		const collectionListRes = await this.collectionApi.getList(params);
+		if (collectionListRes.rows.length > 0) {
+			const ids = collectionListRes.rows.map((item) => item.questionId);
+			const questions = await getQuestionInfoByIds({
+				ids,
+			});
+			return {
+				total: collectionListRes.total,
+				rows: questions.rows,
+				collectionList: collectionListRes.rows,
+			};
+		} else {
+			return {
+				total: collectionListRes.total,
+				rows: [],
+				collectionList: collectionListRes.rows,
+			};
+		}
+	}
+
+	/** 删除已收藏的问题 */
+	async deletes(ids: number[], collectionList: CollectionAndWrongType.QuestionRes[]) {
+		const deletesCollectionList = collectionList.filter((item) => {
+			return ids.includes(item.questionId);
+		});
+		const deletesIds = deletesCollectionList.map((item) => item.id);
+		const res = await this.collectionApi.deletes(deletesIds);
+		return res;
+	}
+
+	/** 新增收藏或者错题 */
+	async adds(params: CollectionAndWrongType.AddCullectionsParams) {
+		const res = await this.collectionApi.adds(params);
+		return res.data;
+	}
+
+	/** 新增收藏或者错题 */
+	async deleteAll(params: CollectionAndWrongType.listParamse) {
+		const res = await this.collectionApi.deleteAll(params);
+		return res.data;
+	}
+}

+ 26 - 0
src/model/myBranchList.ts

@@ -0,0 +1,26 @@
+import { branch, BranchTypeTest } from "@/api";
+
+/**下级代理列表模型 */
+export class MyBranchListModel {
+	private api = branch.spreadRelationList;
+
+	async getData() {
+		const res = await this.api();
+		return res.data.data;
+	}
+}
+
+/**代理模型 */
+export class BranchModel {
+	private api = branch;
+
+	async getIntegralList() {
+		const { data } = await this.api.integralList();
+		return data.data;
+	}
+
+	async integralSettlement(params: BranchTypeTest.IntegralSettlementParams) {
+		const { data } = await this.api.integralSettlement(params);
+		return data;
+	}
+}

+ 124 - 0
src/model/test.ts

@@ -0,0 +1,124 @@
+import { test } from "@/api";
+
+class TestModel {
+	/** 根据不同类型获取分类 */
+	async getTopicClass(type: "df" | "fl" | "jx" | "sx", params: Partial<Test.getTopicClassParams>) {
+		switch (type) {
+			case "df": {
+				const res = await test.selectDfQuestionInfo(params);
+				return res.data;
+			}
+			case "fl": {
+				const res = await test.selectFlQustionInfo(params);
+				return res.data;
+			}
+			case "jx": {
+				const res = await test.selectJxQustionInfo(params);
+				return res.data;
+			}
+			case "sx": {
+				const res = await test.selectSxQustionInfo(params);
+				return res.data;
+			}
+		}
+	}
+
+	/**获取用户答案初始值 */
+	private getUserAnswer = (type: string) => {
+		switch (type) {
+			case "判断题":
+				return null;
+			case "单选题":
+				return null;
+			case "多选题":
+				return [];
+		}
+	};
+
+	/**获取题目类型 */
+	private getType = (answer: Array<string>) => {
+		if (answer.length === 1) {
+			if (["√", "×"].includes(answer[0])) {
+				return "判断题";
+			} else {
+				return "单选题";
+			}
+		} else {
+			return "多选题";
+		}
+	};
+
+	/** 获取题目列表 */
+	async getList(params: Test.listParams) {
+		const res = await test.getList(params);
+
+		const data = {
+			total: res.data.total,
+			list: res.data.rows.map((item) => {
+				return {
+					...item,
+					explain: item.issue,
+					opts: item.opts.split("-").filter((item) => !!item),
+					image: item.image,
+					type: this.getType(item.answer.split("-")),
+					answer: item.answer,
+					userAnswer: this.getUserAnswer(this.getType(item.answer.split("-"))),
+					isTrue: null,
+					isCollection: false,
+				};
+			}),
+		};
+
+		return data;
+	}
+
+	/** 获取免费题目列表 */
+	async getFreeList(params: Test.listParams) {
+		const res = await test.getFreeList(params);
+
+		const data = {
+			total: res.data.total,
+			list: res.data.rows.map((item) => {
+				return {
+					...item,
+					explain: item.issue,
+					opts: item.opts.split("-").filter((item) => !!item),
+					image: item.image,
+					type: this.getType(item.answer.split("-")),
+					answer: item.answer,
+					userAnswer: this.getUserAnswer(this.getType(item.answer.split("-"))),
+					isTrue: null,
+					isCollection: false,
+				};
+			}),
+		};
+
+		return data;
+	}
+
+	/**获取模拟考试题列表 */
+	async getMockList(params: Test.listParams) {
+		const res = await test.getMockList(params);
+
+		const data = {
+			total: res.data.total,
+			list: res.data.rows.map((item) => {
+				return {
+					...item,
+					explain: item.issue,
+					opts: item.opts.split("-").filter((item) => !!item),
+					image: item.image,
+					type: this.getType(item.answer.split("-")),
+					answer: item.answer,
+					userAnswer: this.getUserAnswer(this.getType(item.answer.split("-"))),
+					isTrue: null,
+					isCollection: false,
+				};
+			}),
+		};
+
+		return data;
+	}
+}
+
+export default new TestModel();

+ 5 - 2
src/router/guard.ts

@@ -2,9 +2,12 @@ import { Router } from "vue-router";
 
 const guard = (router: Router) => {
     router.beforeEach(async (to, from, next) => {
-        console.log(to)
-        
+        console.log("ok")
+        if(to.query.state&&to.query.state=='LOGIN'){
+         
 
+        }
+        next()
     })
 
 

+ 7 - 5
src/router/index.ts

@@ -1,4 +1,5 @@
-import { RouteRecordRaw, createRouter, createWebHashHistory } from 'vue-router';
+import { RouteRecordRaw, createRouter, createWebHashHistory,createWebHistory } from 'vue-router';
+import guard  from './guard';
 // 导入views文件夹下的所有组件
 const modules = import.meta.glob("../views/**/index.vue");
 console.log(modules)
@@ -49,11 +50,11 @@ for (const path in modules) {
     children: [],
   });
 }
+
 const routes: RouteRecordRaw[] = [
   {
-    path: '/',
-    name: 'Home',
-    component: () => import('../views/Home'),
+    path:'/',
+    redirect:'/home'
   },
   {
     path: '/about',
@@ -64,8 +65,9 @@ const routes: RouteRecordRaw[] = [
 ];
 
 const router = createRouter({
-  history: createWebHashHistory(),
+  history: createWebHistory(),
   routes,
 });
+guard(router)
 
 export default router;

+ 7 - 28
src/store/index.ts

@@ -1,40 +1,19 @@
-import { state } from './state';
+import { state,State } from './state';
 import { createStore } from 'vuex';
-
+import createPersistedState from "vuex-persistedstate";
 export default createStore({
+  plugins:[createPersistedState()],
   state,
   mutations: {
-    SET_BEGINTIME(state, payload) {
-      state.beginTime = payload.beginTime
-      return state
-
-    },
-    SET_ENDTIME(state, payload) {
-      state.endTime = payload.endTime
-      return state
+    SET_USERINFO(state,payload:State["userInfo"]){
+      state.userInfo = payload
+      return
 
     }
+
   },
   actions: {
-    wxLogin() {
-      let href = ""
-      switch (import.meta.env.MODE) {
-        case "development":
-          location.replace(`https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx3043c2c1decb01ed&redirect_uri=https://coach1.zzxcx.net/&response_type=code&scope=snsapi_userinfo&state=LOGIN&connect_redirect=1#wechat_redirect`)
-          break;
-        case "test":
-          location.replace(`https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx3043c2c1decb01ed&redirect_uri=https://coach1.zzxcx.net/&response_type=code&scope=snsapi_userinfo&state=LOGIN&connect_redirect=1#wechat_redirect`)
-          break;
-        case "production":
-          location.replace(`https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx3043c2c1decb01ed&redirect_uri=https://coach.zzxcx.net/&response_type=code&scope=snsapi_userinfo&state=LOGIN&connect_redirect=1#wechat_redirect`);
-          break;
-      }
 
-     
-      
-
-
-    }
   },
   modules: {},
 });

+ 30 - 4
src/store/state.ts

@@ -1,11 +1,37 @@
+import defaultHeadimgurl from "@/assets/img/unLoginHead.png";
 export interface State {
   title: string;
-  beginTime:string
-  endTime:string
+  beginTime: string
+  endTime: string,
+  token: string,
+  userInfo: {
+    city: string
+    country: string
+    headImage: string
+    nickName: string
+    openid: string
+    privilege?: []
+    province: string
+    sex: string
+    unionid: string
+  }
 }
 
 export const state: State = {
   title: '导航页面',
-  beginTime:"",
-  endTime:""
+  beginTime: "",
+  endTime: "",
+  token: "",
+  userInfo: {
+    city: "",
+    country: "",
+    headImage: defaultHeadimgurl,
+    nickName: "请登陆",
+    openid: "",
+    privilege: [],
+    province: "",
+    sex: "0",
+    unionid: ""
+
+  }
 };

+ 3 - 1
src/style/main.scss

@@ -7,7 +7,9 @@
   width: 100%;
   height: 100%;
 }
-
+body{
+  background-color: #F2F3F5;
+}
 #nav {
   padding: 30px;
 

+ 30 - 0
src/utils/mount-component.ts

@@ -0,0 +1,30 @@
+import { createApp, Component, getCurrentInstance } from "vue";
+
+export const useUnmountComponent = () => {
+	const instance = getCurrentInstance();
+	const unmountComponent = () => {
+		instance?.appContext.app.unmount();
+		document.body.removeChild(instance?.appContext.app._container);
+	};
+
+	return {
+		unmountComponent,
+	};
+};
+
+export function mountComponent(RootComponent: Component, rootProps?: Record<string, unknown> | null | undefined) {
+	const app = createApp(RootComponent, { ...rootProps, unmount });
+	const root = document.createElement("div");
+
+	function unmount() {
+		app.unmount();
+		document.body.removeChild(root);
+	}
+
+	document.body.appendChild(root);
+
+	return {
+		instance: app.mount(root),
+		unmount,
+	};
+}

+ 0 - 1
src/views/About.tsx

@@ -8,7 +8,6 @@ export default defineComponent({
       <>
         <h1>About</h1>
         <img src={Logo}/>
-  
       </>
     );
   }

+ 2 - 2
src/views/Home.tsx

@@ -9,8 +9,8 @@ export default defineComponent({
 
     return () => (
       <>
-        <RouterLink to={'/exam/begin'}>前往模拟考试</RouterLink>
-        <RouterLink to={'/aprilExam/test'}>前往四月份新题</RouterLink>
+
+        <m-nav-bar title="个人中心"></m-nav-bar>
         <h1>{store.state.title}</h1>
       </>
     );

+ 109 - 0
src/views/cashout copy/components/cashoutDialog.vue

@@ -0,0 +1,109 @@
+<template>
+	<van-overlay :show="true">
+		<div class="wrapper" @click.stop>
+			<div class="block">
+				<van-form @submit="handleCashout">
+					<van-cellGroup inset>
+						<van-field v-model="amount" label="提现金额(元)" type="number" placeholder="请输入提现金额" />
+					</van-cellGroup>
+					<div class="submit-box">
+						<van-button :loading="loading" :disabled="!amount" type="primary" hairline native-type="submit"
+							loading-text="结算中..."> 提现 </van-button>
+						<van-button @click="closeCashout" type="default" hairline> 取消 </van-button>
+					</div>
+				</van-form>
+			</div>
+		</div>
+	</van-overlay>
+</template>
+
+<script lang="ts">
+import { Toast } from "vant";
+import { CashOutModel } from "@/model/cashOut";
+import { ref, defineComponent } from "vue";
+export default defineComponent({
+	setup(props, context) {
+		const cashOutModel = new CashOutModel();
+		const useCashout = () => {
+		
+			const amount = ref<number>();
+			const loading = ref(false);
+			const cashout = async () => {
+				if (!amount.value) {
+					Toast.fail("请输入金额");
+					return false;
+				}
+				loading.value = true;
+				const data = await cashOutModel.cashout(amount.value * 100);
+				loading.value = false;
+				if (data.code === 200) {
+					Toast.success("提现成功");
+					return true;
+				} else {
+					Toast.fail(data.msg);
+					return false;
+				}
+			};
+			const handleCashout = async () => {
+				if (await cashout()) {
+					console.log(context.emit)
+					context.emit('close')
+
+
+				}
+			};
+			const closeCashout = ()=>{
+				context.emit('close')
+
+			}
+			return {
+
+				amount,
+				loading,
+				cashout,
+				handleCashout,
+				closeCashout
+			};
+		};
+
+		return {
+			...useCashout()
+
+
+		}
+	},
+})
+</script>
+
+
+
+<style scoped lang="scss">
+.wrapper {
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	height: 100%;
+}
+
+.block {
+	width: 600px;
+	background-color: #fff;
+	padding: 20px;
+	border-radius: 10px;
+}
+
+.user-img {
+	display: flex;
+	justify-content: center;
+	align-items: center;
+	font-size: 20px;
+	margin-bottom: 10px;
+}
+
+.submit-box {
+	display: flex;
+	justify-content: space-around;
+	align-items: center;
+	margin-top: 10px;
+}
+</style>

+ 195 - 0
src/views/cashout copy/index.vue

@@ -0,0 +1,195 @@
+<template>
+	<div class="header-back">
+		<m-nav-bar :transparent="true" title="提现页面" style="color: #ffffff" />
+		<div class="user-data">
+			<div class="left">
+				<!-- <m-user-avatar /> -->
+				<div class="name">
+					<!-- <m-user-name /> -->
+					<span><span class="grade">{{ profitPrice }}</span></span>
+					<div>可提现余额(元)</div>
+				</div>
+			</div>
+			<cashoutDialog @close="()=>{showCashout=false}" v-if="showCashout"></cashoutDialog>
+			<div class="draw-button">
+				<m-button @click="()=>{
+					showCashout=true
+				}" class="continue" width="90px" height="30px" text="我要提现" />
+			</div>
+			<div class="draw-button mr15">
+				<m-button class="bank" width="90px" height="30px" text="银行卡提现" />
+			</div>
+		</div>
+	</div>
+	<div class="summary content-box">
+		<form action="/" class="search">
+			<van-search v-model="searchValue" shape="round" placeholder="请输入单号" />
+		</form>
+	</div>
+	<div class="test-scores content-box">
+		<table class="table">
+			<tr>
+				<!-- <th class="oneColunm">id</th> -->
+				<th class="oneColunm">金额</th>
+				<th class="oneColunm">提现时间</th>
+			</tr>
+			<tr>
+				<!-- <td class="oneColunm">{{ item.id }}</td> -->
+				<td class="oneColunm">{{ '1000' }}</td>
+				<td class="oneColunm">{{ '2020-05-26' }}</td>
+			</tr>
+		</table>
+	</div>
+</template>
+
+<script lang="ts">
+import { defineComponent,ref } from 'vue'
+import cashoutDialog from './components/cashoutDialog.vue'
+export default defineComponent({
+	setup() {
+		return {
+			searchValue: "",
+			profitPrice: "0.00",
+			showCashout: ref(false)
+
+		}
+	},
+	components: {
+		cashoutDialog
+
+
+	},
+})
+</script>
+
+<style lang="scss" scoped>
+.mr15 {
+	margin-top: 15px;
+}
+
+.header-back {
+	width: 750px;
+	padding-bottom: 82px;
+	background: linear-gradient(180deg, #498ef5 0%, #4da8e6 100%);
+	border-radius: 0px 0px 82px 82px;
+
+	.user-data {
+		display: flex;
+		justify-content: center;
+		flex-wrap: wrap;
+
+		.draw-button {
+			width: 100%;
+			display: flex;
+			justify-content: center;
+		}
+
+		.left {
+			display: flex;
+			justify-content: space-between;
+			align-items: center;
+			margin-bottom: 12px;
+
+			.name {
+				display: flex;
+				flex-direction: column;
+				font-size: 13px;
+				width: 100%;
+				color: #ffffff;
+				justify-content: space-between;
+				margin-left: 6px;
+
+				.grade {
+					font-size: 36px;
+					padding: 4px;
+				}
+			}
+		}
+
+		.bank {
+			font-size: 13px;
+			font-family: PingFang SC;
+			font-weight: 400;
+			line-height: 19px;
+			color: #498ef5;
+			background: #fff;
+		}
+
+		.continue {
+			font-size: 26px;
+			font-family: PingFang SC;
+			font-weight: 400;
+			line-height: 19px;
+			color: #498ef5;
+			background: #fff;
+		}
+	}
+}
+
+.content-box {
+	width: 690px;
+	background: #ffffff;
+	box-shadow: 0px 0px 16px rgba(124, 129, 136, 0.2);
+	border-radius: 40px;
+	position: relative;
+	left: 50%;
+	transform: translateX(-50%);
+	top: -164px;
+	margin-top: 20px;
+}
+
+.summary {
+	display: flex;
+	justify-content: space-around;
+	box-sizing: border-box;
+	overflow: hidden;
+
+	.search {
+		width: 100%;
+	}
+}
+
+.test-scores {
+	font-size: 26px;
+	font-family: PingFang SC;
+	font-weight: 400;
+	line-height: 38px;
+	color: #0a1a33;
+	padding: 30px;
+	box-sizing: border-box;
+
+	.table {
+		width: 100%;
+		border-collapse: collapse;
+		font-size: 26px;
+
+		th {
+			padding: 10px;
+			color: #0a1a33;
+		}
+
+		td {
+			text-align: center;
+			padding: 10px;
+			color: #8a9099;
+		}
+
+		tr {
+			&:nth-of-type(n) {
+				background: #ffffff;
+			}
+
+			&:nth-of-type(2n) {
+				background: rgba(73, 142, 245, 0.15);
+			}
+		}
+
+		.oneColunm {
+			white-space: nowrap;
+			text-overflow: ellipsis;
+			overflow: hidden;
+			width: 50px;
+		}
+	}
+}
+</style>

+ 109 - 0
src/views/cashout/components/cashoutDialog.vue

@@ -0,0 +1,109 @@
+<template>
+	<van-overlay :show="true">
+		<div class="wrapper" @click.stop>
+			<div class="block">
+				<van-form @submit="handleCashout">
+					<van-cellGroup inset>
+						<van-field v-model="amount" label="提现金额(元)" type="number" placeholder="请输入提现金额" />
+					</van-cellGroup>
+					<div class="submit-box">
+						<van-button :loading="loading" :disabled="!amount" type="primary" hairline native-type="submit"
+							loading-text="结算中..."> 提现 </van-button>
+						<van-button @click="closeCashout" type="default" hairline> 取消 </van-button>
+					</div>
+				</van-form>
+			</div>
+		</div>
+	</van-overlay>
+</template>
+
+<script lang="ts">
+import { Toast } from "vant";
+import { CashOutModel } from "@/model/cashOut";
+import { ref, defineComponent } from "vue";
+export default defineComponent({
+	setup(props, context) {
+		const cashOutModel = new CashOutModel();
+		const useCashout = () => {
+		
+			const amount = ref<number>();
+			const loading = ref(false);
+			const cashout = async () => {
+				if (!amount.value) {
+					Toast.fail("请输入金额");
+					return false;
+				}
+				loading.value = true;
+				const data = await cashOutModel.cashout(amount.value * 100);
+				loading.value = false;
+				if (data.code === 200) {
+					Toast.success("提现成功");
+					return true;
+				} else {
+					Toast.fail(data.msg);
+					return false;
+				}
+			};
+			const handleCashout = async () => {
+				if (await cashout()) {
+					console.log(context.emit)
+					context.emit('close')
+
+
+				}
+			};
+			const closeCashout = ()=>{
+				context.emit('close')
+
+			}
+			return {
+
+				amount,
+				loading,
+				cashout,
+				handleCashout,
+				closeCashout
+			};
+		};
+
+		return {
+			...useCashout()
+
+
+		}
+	},
+})
+</script>
+
+
+
+<style scoped lang="scss">
+.wrapper {
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	height: 100%;
+}
+
+.block {
+	width: 600px;
+	background-color: #fff;
+	padding: 20px;
+	border-radius: 10px;
+}
+
+.user-img {
+	display: flex;
+	justify-content: center;
+	align-items: center;
+	font-size: 20px;
+	margin-bottom: 10px;
+}
+
+.submit-box {
+	display: flex;
+	justify-content: space-around;
+	align-items: center;
+	margin-top: 10px;
+}
+</style>

+ 418 - 0
src/views/cashout/index.vue

@@ -0,0 +1,418 @@
+<template>
+	<div class="bg">
+		<m-nav-bar mode="white" title="提现"></m-nav-bar>
+
+		<img class="bg-img" :src="bgImgIcon">
+		<div class="text">
+			<div>可提现金额(元)</div>
+			<div class="text-money">{{ userInfo.profitPrice / 100 }}</div>
+		</div>
+		<div class="form">
+			<div class="head">提现金额</div>
+			<van-field class="form-input0" format-trigger="onBlur" v-model="amount" center clearable
+				placeholder="请输入金额">
+				<template #button>
+					<span @click="() => {
+						amount = userInfo.profitPrice / 100
+					
+					}" class="font26" style="color:#498EF5">全部提现</span>
+				</template>
+				<template #left-icon>
+					<span class="font48">¥</span>
+				</template>
+
+			</van-field>
+			<div class="button">
+				<van-button @click="cashToWx" class="cash-button" color="#01C18D" round icon="wechat" type="primary">
+					提现到微信</van-button>
+				<van-button @click="() => {
+					cashToCardShow = true
+				}" class="cash-button" color="#498EF5" round icon="credit-pay" type="primary">提现到银行卡
+				</van-button>
+			</div>
+			<van-dialog @confirm="cashToCard" v-model:show="cashToCardShow" title="银行卡信息" show-cancel-button>
+				<van-cell-group inset>
+					<van-field v-model="encTrueName" label="收款人" placeholder="请收款人姓名" />
+					<van-field @click="() => {
+						bankPickerShow = true
+					
+					}" is-link v-model="bankName" label="银行" placeholder="请选择银行">
+
+					</van-field>
+					<van-field type="digit" v-model="encBankNo" label="银行卡号" placeholder="请输入银行卡号" />
+				</van-cell-group>
+			</van-dialog>
+
+
+		</div>
+		<van-popup v-model:show="bankPickerShow" position="bottom">
+			<van-picker :columns-field-names="wxBankListFieldnames" :columns="wxBankList" @confirm="getBankCode"
+				@cancel="bankPickerShow = false" />
+		</van-popup>
+		<div class="record">
+			<div class="head">
+				<div class="head-rect1"></div>
+				<div class="head-text1">提现记录</div>
+			</div>
+			<div class="body">
+				<div v-for="(item, index) in wxCashoutList" :key="index" class="item">
+					<div class="item-row1">
+						<div>提现</div>
+						<div style="color:#FF4D53">¥{{ item.extractPrice / 100 }}</div>
+					</div>
+					<div class="item-row2">
+						<div>{{ item.createTime }}</div>
+						<div>状态:<span v-if="item.status == '1'" style="color:#01C18D">提现成功 </span>
+							<span v-if="item.status == '2'" style="color:red"> 提现失败</span>
+						</div>
+					</div>
+
+
+				</div>
+
+			</div>
+
+		</div>
+
+
+	</div>
+</template>
+
+<script lang="ts">
+import { computed, defineComponent, reactive, ref } from 'vue'
+import bgImgIcon from '@/assets/img/bgImg.png'
+import { useStore } from 'vuex'
+import api from '@/api'
+import { Dialog, Toast, PickerOption } from 'vant';
+
+export default defineComponent({
+	setup() {
+		const store = useStore()
+		const amount = ref(0)
+		const userInfo = computed(() => {
+			return store.state.userInfo
+		})
+		const wxCashoutList = ref<any[]>([])
+		const cashToCardShow = ref(false)
+		const bankPickerShow = ref(false)
+		const bankCode = ref<number>()
+		const bankName = ref('')
+		const encBankNo = ref('')
+		const encTrueName = ref('')
+		const wxBankListFieldnames = { text: 'bankName', values: 'values', children: 'children' }
+		const wxBankList = reactive([
+			{ bankName: "工商银行", bankCode: 1002 },
+			{ bankName: "农业银行", bankCode: 1005 },
+			{ bankName: "建设银行", bankCode: 1003 },
+			{ bankName: "中国银行", bankCode: 1026 },
+			{ bankName: "交通银行", bankCode: 1020 },
+			{ bankName: "招商银行", bankCode: 1001 },
+			{ bankName: "邮储银行", bankCode: 1066 },
+			{ bankName: "民生银行", bankCode: 1006 },
+			{ bankName: "平安银行", bankCode: 1010 },
+			{ bankName: "中信银行", bankCode: 1021 },
+			{ bankName: "浦发银行", bankCode: 1004 },
+			{ bankName: "兴业银行", bankCode: 1009 },
+			{ bankName: "光大银行", bankCode: 1022 },
+			{ bankName: "广发银行", bankCode: 1027 },
+			{ bankName: "华夏银行", bankCode: 1025 },
+			{ bankName: "宁波银行", bankCode: 1056 },
+			{ bankName: "北京银行", bankCode: 4836 },
+			{ bankName: "上海银行", bankCode: 1024 },
+			{ bankName: "南京银行", bankCode: 1054 },
+			{ bankName: "长子县融汇村镇银行", bankCode: 475 },
+			{ bankName: "长沙银行", bankCode: 4216 },
+			{ bankName: "浙江泰隆商业银行", bankCode: 4051 },
+			{ bankName: "中原银行", bankCode: 4753 },
+			{ bankName: "企业银行(中国)", bankCode: 4761 },
+			{ bankName: "顺德农商银行", bankCode: 4036 },
+			{ bankName: "衡水银行", bankCode: 4752 },
+			{ bankName: "长治银行", bankCode: 4756 },
+			{ bankName: "大同银行", bankCode: 4767 },
+			{ bankName: "河南省农村信用社", bankCode: 4115 },
+			{ bankName: "宁夏黄河农村商业银行", bankCode: 4150 },
+			{ bankName: "山西省农村信用社", bankCode: 4156 },
+			{ bankName: "安徽省农村信用社", bankCode: 4166 },
+			{ bankName: "甘肃省农村信用社", bankCode: 4157 },
+			{ bankName: "天津农村商业银行", bankCode: 4153 },
+			{ bankName: "广西壮族自治区农村信用社", bankCode: 4113 },
+			{ bankName: "陕西省农村信用社", bankCode: 4108 },
+			{ bankName: "深圳农村商业银行", bankCode: 4076 },
+			{ bankName: "宁波鄞州农村商业银行", bankCode: 4052 },
+			{ bankName: "浙江省农村信用社联合社", bankCode: 4764 },
+			{ bankName: "江苏省农村信用社联合社", bankCode: 4217 },
+			{ bankName: "江苏紫金农村商业银行股份有限公司", bankCode: 4072 },
+			{ bankName: "北京中关村银行股份有限公司", bankCode: 4769 },
+			{ bankName: "星展银行(中国)有限公司", bankCode: 4778 },
+			{ bankName: "枣庄银行股份有限公司", bankCode: 4766 },
+			{ bankName: "海口联合农村商业银行股份有限公司", bankCode: 4758 },
+			{ bankName: "南洋商业银行(中国)有限公司", bankCode: 4763 },
+		]);
+		const getBankCode = (val: {
+			bankCode: number,
+			bankName: string
+		}) => {
+			bankCode.value = val.bankCode
+			bankName.value = val.bankName
+			bankPickerShow.value = false
+
+		}
+		api.wx.studentWxExtractlist({
+			pageNum: 1,
+			pageSize: 1000
+		}).then(res => {
+			wxCashoutList.value = res.data.rows
+
+		})
+		const cashToCard = () => {
+			if (amount.value < 0.3) {
+				Toast.fail('提现金额需要0.3元以上')
+
+				return
+			}
+
+			api.wx.studentWxExtractWxwithbankdrawal({
+				amount: amount.value * 100,
+				bankCode: bankCode.value,
+				encBankNo: encBankNo.value,
+				encTrueName: encTrueName.value
+
+			}).then(res => {
+				Toast.success('提现成功,到账有延迟')
+				store.dispatch('getUserInfo');
+				api.wx.studentWxExtractlist({
+					pageNum: 1,
+					pageSize: 1000
+				}).then(res => {
+					wxCashoutList.value = res.data.rows
+
+				})
+
+
+			})
+
+
+
+
+
+		}
+		const cashToWx = () => {
+			Dialog.confirm({
+				title: '提现申请',
+				message:
+					'提现到微信',
+			})
+				.then(() => {
+					if (amount.value < 1) {
+						Toast.fail('提现金额需要大于1元')
+						return
+					}
+					api.wx.studentWxExtractWithdraw({
+						amount: amount.value * 100
+					}).then(res => {
+						Toast.success('提现成功,到账有延迟')
+						store.dispatch('getUserInfo');
+						api.wx.studentWxExtractlist({
+							pageNum: 1,
+							pageSize: 1000
+						}).then(res => {
+							wxCashoutList.value = res.data.rows
+
+						})
+
+					})
+					// on confirm
+				})
+				.catch(() => {
+					// on cancel
+				});
+
+
+
+
+
+
+		}
+		return {
+			wxBankList,
+			wxBankListFieldnames,
+			bankCode,
+			bankName,
+			encBankNo,
+			encTrueName,
+			wxCashoutList,
+
+			userInfo,
+			searchValue: "",
+			profitPrice: "0.00",
+			showCashout: ref(false),
+			bankPickerShow,
+			cashToCardShow,
+			bgImgIcon,
+			amount,
+			cashToWx,
+			cashToCard,
+			getBankCode
+
+		}
+	},
+	components: {
+
+
+
+	},
+})
+</script>
+
+<style lang="scss" scoped>
+.font48 {
+	font-size: 48px;
+}
+
+.font26 {
+	font-size: 26px;
+}
+
+.bg {
+
+	min-height: 100vh;
+	width: 100%;
+
+	.bg-img {
+		position: absolute;
+		top: 0;
+		width: 750px;
+		height: 424px;
+		left: 0;
+		z-index: -10;
+	}
+}
+
+.form {
+	width: 690px;
+	height: 334px;
+	margin: 0 auto;
+	margin-top: 40px;
+	background: #fff;
+	border-radius: 16px;
+	padding: 30px 30px 30px 30px;
+
+	.button {
+		width: 100%;
+		height: 160px;
+		display: flex;
+		align-content: center;
+		align-items: center;
+		justify-content: space-between;
+
+		.cash-button {
+			width: 300px;
+			height: 80px;
+		}
+
+	}
+
+	.head {
+		color: #0A1A33;
+		text-align: left;
+		font-size: 30px;
+		font-weight: bold;
+	}
+
+	.form-input0 {
+		font-size: 48px;
+		padding-left: 0;
+		padding-right: 0;
+		border-bottom: 2px #E8E8E8 solid;
+	}
+
+}
+
+.text {
+	margin-top: 58px;
+	color: #fff;
+	padding-left: 30px;
+	text-align: left;
+	font-size: 26px;
+
+	.text-money {
+		font-size: 80px;
+		margin-top: 20px;
+		text-align: left;
+	}
+
+	.text-money::before {
+		content: '¥ ';
+		font-size: 50px;
+	}
+}
+
+.record {
+	width: 690px;
+	padding-left: 30px;
+	padding-right: 30px;
+	background: #ffffff;
+	margin: 0 auto;
+	margin-top: 18px;
+
+	.head {
+		width: 100%;
+		height: 92px;
+		display: flex;
+		align-content: center;
+		align-items: center;
+		border-bottom: 2px #E8E8E8 solid;
+
+		.head-rect1 {
+			width: 6px;
+			height: 30px;
+			background: #498EF5;
+		}
+
+		.head-text1 {
+			font-size: 34px;
+			color: #333;
+			font-weight: bold;
+			margin-left: 15px;
+		}
+	}
+
+	.body {
+		.item {
+			display: flex;
+			width: 100%;
+			height: 138px;
+			align-items: center;
+			align-content: center;
+			flex-wrap: wrap;
+			border-bottom: 2px #E8E8E8 solid;
+
+			.item-row1 {
+				display: flex;
+				width: 100%;
+				font-size: 30px;
+				vertical-align: baseline;
+				height: 42px;
+				line-height: 42px;
+				justify-content: space-between;
+
+
+			}
+
+			.item-row2 {
+				display: flex;
+				width: 100%;
+				font-size: 24px;
+				height: 34px;
+				line-height: 34px;
+				justify-content: space-between;
+				margin-top: 14px;
+
+			}
+
+		}
+	}
+
+
+}
+</style>

+ 219 - 0
src/views/drawByBank/index.vue

@@ -0,0 +1,219 @@
+<template>
+	<div style="background: #f5f5f5">
+		<m-nav-bar  title="银行卡提现"  style="color: #333;background:#fff;" />
+		<div class="rect1"></div>
+		<van-form @submit="onSubmit" ref="drawByBank" class="custom-from">
+			<van-cell-group inset>
+				<van-field v-model="form.encTrueName" name="提现户名" label="提现户名" placeholder="提现户名" :rules="[{ required: true, message: '请填写提现户名' }]" />
+				<van-field v-model="form.encBankNo" type="number" name="提现至账户" label="提现至账户" placeholder="提现至账户" :rules="[{ required: true, message: '请填写提现至账户' }]" />
+				<van-field
+					@click="
+						() => {
+							bankVisible = true;
+						}
+					"
+					readonly
+					is-link
+					v-model="form.bankName"
+					type="text"
+					name="银行"
+					label="银行"
+					placeholder="银行"
+					:rules="[{ required: true, message: '请选择银行' }]" />
+			</van-cell-group>
+			<van-popup v-model:show="bankVisible">
+				<van-picker
+					:columns-field-names="{
+						text: 'bankName',
+						value: 'bankCode',
+					}"
+					@confirm="selectBank"
+					@cancel="
+						() => {
+							bankVisible = false;
+						}
+					"
+					title="选择银行"
+					:columns="wxBankList" />
+			</van-popup>
+
+			<div class="rect1"></div>
+			<div class="money">
+				<div class="header">提现金额</div>
+				<div class="mid"><span>¥</span> 
+                <!-- <input v-model="form.amount" class="money-input" type="text" /> -->
+                <van-field style="font-size:25px;" :rules="[{ required: true, message: '请填写金额' }]" v-model="form.amount" type="number" />
+                </div>
+				<div class="bottom">
+					<span>(可提现余额{{ profitPrice }}元)</span>
+					<span
+						style="color: #498ef5"
+						@click="
+							() => {
+								form.amount = profitPrice;
+							}
+						"
+						class=""
+						>全部提现</span
+					>
+				</div>
+			</div>
+			<div style="margin: 16px">
+				<van-button round block type="primary" native-type="primary"> 提交 </van-button>
+			</div>
+		</van-form>
+	</div>
+</template>
+
+<script setup lang="ts">
+import { onMounted, reactive, ref } from "vue";
+import type { FormInstance } from "vant";
+import { useProfitPrice } from "@/hooks/user";
+import { cashOut } from "@/api";
+import { Dialog } from "vant";
+import { useRouter } from "vue-router";
+import { useWxBank } from "@/hooks/bank/wxBank"
+
+const query = useRouter().currentRoute.value.query
+const drawByBank = ref<FormInstance>();
+
+const { profitPrice } = useProfitPrice();
+const bankVisible = ref(false);
+const { wxBankList,getBankNameByCode } = useWxBank()
+// const wxBankList = reactive([
+// 	{ bankName: "工商银行", bankCode: 1002 },
+// 	{ bankName: "农业银行", bankCode: 1005 },
+// 	{ bankName: "建设银行", bankCode: 1003 },
+// 	{ bankName: "中国银行", bankCode: 1026 },
+// 	{ bankName: "交通银行", bankCode: 1020 },
+// 	{ bankName: "招商银行", bankCode: 1001 },
+// 	{ bankName: "邮储银行", bankCode: 1066 },
+// 	{ bankName: "民生银行", bankCode: 1006 },
+// 	{ bankName: "平安银行", bankCode: 1010 },
+// 	{ bankName: "中信银行", bankCode: 1021 },
+// 	{ bankName: "浦发银行", bankCode: 1004 },
+// 	{ bankName: "兴业银行", bankCode: 1009 },
+// 	{ bankName: "光大银行", bankCode: 1022 },
+// 	{ bankName: "广发银行", bankCode: 1027 },
+// 	{ bankName: "华夏银行", bankCode: 1025 },
+// 	{ bankName: "宁波银行", bankCode: 1056 },
+// 	{ bankName: "北京银行", bankCode: 4836 },
+// 	{ bankName: "上海银行", bankCode: 1024 },
+// 	{ bankName: "南京银行", bankCode: 1054 },
+// 	{ bankName: "长子县融汇村镇银行", bankCode: 475 },
+// 	{ bankName: "长沙银行", bankCode: 4216 },
+// 	{ bankName: "浙江泰隆商业银行", bankCode: 4051 },
+// 	{ bankName: "中原银行", bankCode: 4753 },
+// 	{ bankName: "企业银行(中国)", bankCode: 4761 },
+// 	{ bankName: "顺德农商银行", bankCode: 4036 },
+// 	{ bankName: "衡水银行", bankCode: 4752 },
+// 	{ bankName: "长治银行", bankCode: 4756 },
+// 	{ bankName: "大同银行", bankCode: 4767 },
+// 	{ bankName: "河南省农村信用社", bankCode: 4115 },
+// 	{ bankName: "宁夏黄河农村商业银行", bankCode: 4150 },
+// 	{ bankName: "山西省农村信用社", bankCode: 4156 },
+// 	{ bankName: "安徽省农村信用社", bankCode: 4166 },
+// 	{ bankName: "甘肃省农村信用社", bankCode: 4157 },
+// 	{ bankName: "天津农村商业银行", bankCode: 4153 },
+// 	{ bankName: "广西壮族自治区农村信用社", bankCode: 4113 },
+// 	{ bankName: "陕西省农村信用社", bankCode: 4108 },
+// 	{ bankName: "深圳农村商业银行", bankCode: 4076 },
+// 	{ bankName: "宁波鄞州农村商业银行", bankCode: 4052 },
+// 	{ bankName: "浙江省农村信用社联合社", bankCode: 4764 },
+// 	{ bankName: "江苏省农村信用社联合社", bankCode: 4217 },
+// 	{ bankName: "江苏紫金农村商业银行股份有限公司", bankCode: 4072 },
+// 	{ bankName: "北京中关村银行股份有限公司", bankCode: 4769 },
+// 	{ bankName: "星展银行(中国)有限公司", bankCode: 4778 },
+// 	{ bankName: "枣庄银行股份有限公司", bankCode: 4766 },
+// 	{ bankName: "海口联合农村商业银行股份有限公司", bankCode: 4758 },
+// 	{ bankName: "南洋商业银行(中国)有限公司", bankCode: 4763 },
+// ]);
+const form = reactive({
+	encTrueName: "",
+	encBankNo: "",
+	bankName: "",
+	bankCode: 0,
+	amount: 0,
+});
+const selectBank = (item: any) => {
+	form.bankCode = item.bankCode;
+	form.bankName = item.bankName;
+	bankVisible.value = false;
+};
+onMounted(()=>{
+	if(query.encTrueName&&query.bankCode&&query.encBankNo){
+		form.encTrueName = query.encTrueName as string
+        form.bankCode = Number(query.bankCode) 
+        form.encBankNo = query.encBankNo as string
+        form.bankName = getBankNameByCode(form.bankCode)
+
+	}
+
+})
+const onSubmit = () => {
+	// drawByBank.drawByBank
+	let submitForm = {
+		...form,
+	};
+    submitForm.amount = Number(submitForm.amount) * 100;
+	// console.log(drawByBank,"drawByBank")
+	drawByBank.value.validate(["encTrueName", "encBankNo", "bankCode","amount"]).then(() => {
+		cashOut.studentWxExtractWxwithbankdrawal(submitForm).then((res) => {
+			if (res.data.code == 200) {
+				Dialog({ title: "成功", message: "提现成功,1到3个工作日到账" });
+			} else {
+				Dialog({ title: "失败", message: "提现失败,请检查输入的值" });
+			}
+		});
+	});
+	
+};
+</script>
+
+<style lang="scss" scoped>
+.rect1 {
+	width: 100%;
+	height: 13px;
+	background: #f5f5f5;
+}
+.custom-from {
+	:deep .van-cell-group {
+		margin: 0;
+	}
+}
+.money {
+	width: 100%;
+	height: 152px;
+	background: #fff;
+	padding: 0px 15px;
+
+	.header {
+		font-size: 13px;
+
+		height: 44px;
+		line-height: 44px;
+		border-bottom: 1px solid #e8e8e8;
+	}
+	.mid {
+		height: 64px;
+		display: flex;
+		align-content: center;
+		align-items: center;
+		.money-input {
+			border: 0;
+			width: 250px;
+		}
+	}
+	.bottom {
+		border-top: 1px solid #e8e8e8;
+		width: 100%;
+		color: #8a9099;
+		font-size: 13px;
+		display: flex;
+		justify-content: space-between;
+		align-content: center;
+		line-height: 44px;
+		align-items: center;
+	}
+}
+</style>

+ 153 - 0
src/views/drawByBankRecord/index.vue

@@ -0,0 +1,153 @@
+<template>
+	<div class="">
+		<div class="header0">
+			<m-nav-bar :transparent="true" title="提现记录" style="color: #ffffff" />
+			<div class="btn1-container">
+				<div @click="()=>{
+					push('/drawByBank')
+					}" class="btn1">
+					<img class="" src="@/assets/img/提现到银行卡.png" />
+					<span class="btn1-text">提现到银行卡</span>
+				</div>
+			</div>
+		</div>
+		<div class="rect1"></div>
+		<div class="list">
+			<div class="draw">
+				<span class="draw-text1">最近提现·一点即提</span>
+				<span class="draw-text2">查看全部</span>
+			</div>
+			<div @click="()=>{
+				push({
+					name:'drawByBank',
+					query:{
+						encBankNo:item.encBankNo,
+						encTrueName:item.encTrueName,
+						bankCode:item.bankCode
+
+					}
+				})
+				}" v-for="(item,index) in wxBankCardList" class="list-item" :key="index">
+				<img src="@/assets/img/招行.png" class="bank-logo" />
+				<div>
+					<div class="list-item-text1">{{item.encTrueName}}</div>
+					<div class="list-item-text2">{{getBankNameByCode(item.bankCode)}}({{item.encBankNo}})</div>
+				</div>
+				<div class="list-item-text3">{{item.createTime}}</div>
+			</div>
+		</div>
+	</div>
+</template>
+
+<script setup lang="ts">
+import { cashOut } from "@/api";
+import { ref } from "vue";
+import { useRouter } from "vue-router";
+import { useWxBank } from "@/hooks/bank/wxBank"
+const query = useRouter().currentRoute.value.query
+const wxBankCardList = ref([{}])
+const { wxBankList,getBankNameByCode } = useWxBank()
+const push = useRouter().push
+const getWxBankList = () => {
+	cashOut
+		.studentWxBankList({
+			pageNum: 1,
+			pageSize: 50,
+		})
+		.then((res) => {
+			wxBankCardList.value = res.data.rows;
+            console.log(res.data.rows)
+		});
+    
+};
+getWxBankList()
+</script>
+
+<style lang="scss" scoped>
+.header0 {
+	background: linear-gradient(180deg, #498ef5 0%, #4da8e6 100%);
+}
+.btn1-container {
+	padding-top: 26px;
+	padding-bottom: 30px;
+}
+.btn1 {
+	margin: 0 auto;
+	width: 256px;
+	border-radius: 10px;
+	background: #fff;
+	display: flex;
+	justify-content: center;
+	align-items: center;
+	align-content: center;
+	height: 55px;
+	.btn1-text {
+		font-size: 16px;
+		color: #498ef5;
+	}
+
+	img {
+		width: 31px;
+		height: 24px;
+		margin-right: 8px;
+	}
+}
+.rect1 {
+	width: 100%;
+	height: 13px;
+	background: #f5f5f5;
+}
+.list {
+	.draw {
+		width: 100%;
+		height: 63px;
+		padding-left: 29px;
+		padding-right: 29px;
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+		.draw-text1 {
+			font-size: 15px;
+			color: #333;
+			font-weight: 600;
+			font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", Helvetica, Segoe UI, Arial, Roboto, "PingFang SC", miui, "Hiragino Sans GB", "Microsoft Yahei", sans-serif;
+		}
+		.draw-text2 {
+			font-size: 13px;
+			color: #498ef5;
+		}
+	}
+	.list-item {
+		width: 345px;
+		height: 65px;
+		margin: 0 auto;
+		display: flex;
+		position: relative;
+		align-content: flex-start;
+		align-items: flex-start;
+		border-bottom: 1px solid #e8e8e8;
+		.bank-logo {
+			width: 25px;
+			height: 25px;
+			margin-right: 8px;
+			margin-top: 19px;
+			// opacity: 0;
+		}
+		.list-item-text1 {
+			font-size: 15px;
+			margin-top: 11px;
+		}
+		.list-item-text2 {
+			font-size: 13px;
+			color: #5c6066;
+		}
+		.list-item-text3 {
+			position: absolute;
+			right: 0;
+			font-size: 11px;
+			color: #8a9099;
+			top: 15px;
+		}
+	}
+}
+</style>

+ 363 - 0
src/views/home/index.vue

@@ -0,0 +1,363 @@
+<template>
+    <div>
+        <div class="bg">
+        </div>
+        <m-nav-bar title="个人中心"></m-nav-bar>
+        <div class="info">
+            <div class="left">
+                <img class="head" :src="userInfo.headImage" />
+                <div class="name">
+                    <div>
+                        {{userInfo.nickName}}
+                    </div>
+                    <div class="userId">
+                        ID:{{userInfo.id}}
+                    </div>
+                </div>
+                <div>
+                </div>
+            </div>
+            <!-- <div class="right">
+                <img class="icon1" :src="configIcon" />
+                <img class="icon2" :src="messageIcon" />
+
+            </div> -->
+
+
+        </div>
+        <div class="money">
+            <div class="data">
+                <div class="today">
+                    <div class="number">¥{{todayIncome}}</div>
+                    <div class="desc">今日收益</div>
+                </div>
+                <div class="border"> </div>
+                <div class="today">
+                    <div class="number">¥{{yesterdayIncome}}</div>
+                    <div class="desc">昨日收益</div>
+                </div>
+                <div class="border"> </div>
+                <div class="today">
+                    <div class="number">¥{{totalIncome}}</div>
+                    <div class="desc">累计收益</div>
+                </div>
+
+            </div>
+            <div class="button">
+                <span>可提现金额:¥{{userInfo.profitPrice}}</span>
+                <router-link to="/cashout">
+                    <div class="now">
+                        立即提现
+                    </div>
+                </router-link>
+
+            </div>
+        </div>
+        <router-link to="/income">
+            <div class="bill">
+
+                <img class="icon" :src="billIcon">
+                <span class="desc">我的账单</span>
+                <img class="arrow" src="@/assets/img/leftArrow.png">
+            </div>
+        </router-link>
+        <router-link to="/order">
+            <div class="order">
+                <img class="icon" :src="orderIcon">
+                <span class="desc">我的订单</span>
+                <img class="arrow" src="@/assets/img/leftArrow.png">
+            </div>
+        </router-link>
+    </div>
+</template>
+
+<script lang="ts">
+import { computed, defineComponent, ref } from 'vue'
+import people1Icon from '@/assets/img/people1.png'
+import configIcon from '@/assets/img/config.png'
+import messageIcon from '@/assets/img/message.png'
+import billIcon from '@/assets/img/bill.png'
+import orderIcon from '@/assets/img/order.png'
+import api from '@/api'
+import { useRoute } from 'vue-router'
+import { useStore, } from 'vuex'
+import { Toast } from 'vant'
+export default defineComponent({
+    setup() {
+        const route = useRoute()
+        const store = useStore()
+        const userInfo = computed(() => {
+            return store.state.userInfo
+        })
+        const todayIncome = ref(0)
+        const yesterdayIncome = ref(0)
+        const totalIncome = ref(0)
+        if (route.query.state === 'LOGIN') {
+
+            api.login.logingzhcode({
+                authorizationCode: route.query.code as string
+            }).then(res => {
+                Toast.success({
+                    message: '登陆成功',
+                    forbidClick: true
+                })
+                window.localStorage.setItem("token", res.data.data.token)
+
+            }).catch(err => {
+                Toast.fail({
+                    message: err,
+                    forbidClick: true
+                })
+            })
+
+        }
+        api.user.studentUserInfo().then(res=>{
+            store.commit('SET_USERINFO',res.data.data)
+            window.localStorage.setItem("userInfo",JSON.stringify(res.data.data))
+
+        })
+        //昨日收益
+        api.order.studentOrderInfoYesterdayTotal({
+        }).then(res => {
+            yesterdayIncome.value = res.data.data
+        })
+        //今日收益
+        api.order.studentOrderInfoTodayTotal({
+        }).then(res => {
+            todayIncome.value = res.data.data
+        })
+        //总收益
+        api.order.studentOrderInfoTotal({
+        }).then(res => {
+            todayIncome.value = res.data.data
+        })
+
+        return {
+            todayIncome,
+            yesterdayIncome,
+            totalIncome,
+            userInfo,
+            people1Icon: people1Icon,
+            configIcon: configIcon,
+            billIcon,
+            messageIcon,
+            orderIcon
+        }
+    }
+})
+</script>
+
+<style lang="scss" scoped>
+.bg {
+    width: 750px;
+    height: 458px;
+    background: linear-gradient(180deg, #498EF5 0%, #F2F3F5 100%);
+    border-radius: 0px 0px 0px 0px;
+    opacity: 1;
+    position: absolute;
+    top: 0;
+    z-index: -10;
+}
+
+.info {
+    margin-top: 54px;
+    height: 108px;
+    display: flex;
+    flex-wrap: wrap;
+    justify-content: space-between;
+
+    .left {
+        display: flex;
+        height: 100%;
+
+        .head {
+            width: auto;
+            height: 100%;
+            margin-left: 30px;
+
+        }
+
+        .name {
+            text-align: left;
+            margin-left: 20px;
+
+
+            .userId {
+                color: #5C6066;
+                font-size: 24px;
+                margin-top: 15px;
+            }
+        }
+
+    }
+
+    .right {
+        display: flex;
+        align-items: center;
+
+        .icon1 {
+            width: 34px;
+            height: 34px;
+            margin-right: 30px;
+
+        }
+
+        .icon2 {
+            width: 34px;
+            height: 34px;
+            margin-right: 48px;
+        }
+
+    }
+
+
+}
+
+.money {
+    width: 690px;
+    height: 276px;
+    margin: 0 auto;
+    background: #fff;
+    border-radius: 16px;
+    margin-top: 60px;
+    overflow: hidden;
+
+    .data {
+        height: 156px;
+        width: 100%;
+        display: flex;
+        align-content: center;
+        align-items: center;
+
+        .border {
+            width: 2px;
+            height: 50%;
+            background: #E8E8E8;
+        }
+
+        .today {
+            width: 32%;
+            display: flex;
+            align-items: center;
+            align-content: center;
+            flex-wrap: wrap;
+
+            .desc {
+                width: 100%;
+                font-size: 24px;
+                color: #8A9099;
+
+            }
+
+            .number {
+                width: 100%;
+                font-size: 36px;
+                font-weight: bold;
+
+            }
+
+        }
+    }
+
+    .button {
+        width: 100%;
+        height: 120px;
+        padding-left: 30px;
+        padding-right: 30px;
+        background-image: url('./../../assets/img/moneyBg.png');
+        display: flex;
+        align-content: center;
+        align-items: center;
+        color: #DBA05C;
+        font-weight: bold;
+        justify-content: space-between;
+
+        .now {
+            width: 150px;
+            height: 50px;
+            line-height: 50px;
+            border-radius: 16px;
+            background: linear-gradient(316deg, #DBA05C 0%, #F3C085 100%);
+            color: #91540F;
+            font-size: 26px;
+            cursor: pointer;
+            text-align: center;
+        }
+    }
+
+}
+
+.bill {
+    width: 690px;
+    margin: 0 auto;
+    height: 148px;
+    margin-top: 20px;
+    display: flex;
+    padding-left: 30px;
+    padding-right: 30px;
+    align-content: center;
+    align-items: center;
+    background: #fff;
+    border-radius: 16px;
+    position: relative;
+
+    .icon {
+        width: 88px;
+        height: 88px;
+    }
+
+    .desc {
+        margin-left: 24px;
+        color: #333;
+    }
+
+    .arrow {
+        position: absolute;
+        top: 50%;
+        right: 30px;
+        width: 13px;
+        height: 26px;
+        transform: translate(-50%, -50%) rotate(180deg);
+
+        transform-origin: center;
+
+    }
+}
+
+.order {
+    width: 690px;
+    margin: 0 auto;
+    height: 148px;
+    margin-top: 20px;
+    display: flex;
+    padding-left: 30px;
+    padding-right: 30px;
+    align-content: center;
+    align-items: center;
+    background: #fff;
+    border-radius: 16px;
+    position: relative;
+
+    .icon {
+        width: 88px;
+        height: 88px;
+    }
+
+    .desc {
+        margin-left: 24px;
+        color: #333;
+    }
+
+    .arrow {
+        position: absolute;
+        top: 50%;
+        right: 30px;
+        width: 13px;
+        height: 26px;
+        transform: translate(-50%, -50%) rotate(180deg);
+
+        transform-origin: center;
+
+    }
+}
+</style>

+ 192 - 0
src/views/income/index.vue

@@ -0,0 +1,192 @@
+<template>
+    <div class="bg">
+        <m-nav-bar background="#498EF5" mode="white" title="收入明细"></m-nav-bar>
+
+        <van-tabs v-model:active="active" color="#498EF5" title-active-color="#498EF5">
+            <van-tab title="收入明细">
+                <div class="incomeTable">
+                    <table cellspacing="0" style="width:100%">
+                        <tr class="head">
+                            <th>账单时间</th>
+                            <th>套餐名称</th>
+                            <th>收入金额</th>
+                        </tr>
+
+                        <tr v-for="(item, index) in orderList" :key="index" class="item">
+                            <td>{{ item.successTime }}</td>
+                            <td>{{ item.goodsName }}</td>
+                            <td style="color:#FF4D53"> {{ item.commissionPrice }}</td>
+                        </tr>
+
+
+
+                    </table>
+
+                </div>
+            </van-tab>
+            <van-tab title="结算概况">
+                <div class="calendar">
+                    <div @click="() => {
+                        pickerShow = true
+                    
+                    
+                    }" class="year"> 选择年份:2022</div>
+                </div>
+                <div>
+                    <table class="settle-table" style="width:100%" border="0">
+
+                        <th class="table-head">
+                            时间
+                        </th>
+                        <th class="table-head">
+                            预估收入
+                        </th>
+                        <th class="table-head">
+                            月结实发金额
+                        </th>
+
+                        <tr v-for="(item,index) in incomeList" :key="index">
+                            <td class="table-grid">{{item.yearMonth}}</td>
+                            <td class="table-grid">{{item.income}}</td>
+                            <td class="table-grid">{{item.income}}</td>
+                        </tr>
+                    </table>
+
+                </div>
+            </van-tab>
+        </van-tabs>
+        <van-popup v-model:show="pickerShow" round position="bottom">
+            <van-picker @cancel="pickerShow = false" @confirm="(val: number)=>{
+                year = val
+
+            }" :columns="yearColumns" />
+        </van-popup>
+
+        <div class="">
+
+        </div>
+    </div>
+</template>
+
+<script lang="ts">
+import { defineComponent, ref } from 'vue'
+import api from '@/api';
+import { order } from '@/api/types/order';
+
+export default defineComponent({
+    setup() {
+        const yearColumns = []
+        const incomeList = ref<any>([])
+        const year = ref(2022)
+        const orderList = ref<order.studentOrderInfoList["rows"]>([])
+        const currentYear = new Date().getFullYear()
+        for (let index = 0; index < 10; index++) {
+            yearColumns.push(currentYear - index)
+        }
+
+        api.order.studentOrderInfoList({
+
+
+
+        }).then(res => {
+            orderList.value = res.data.rows
+
+
+        })
+        api.order.studentOrderInfoSelectMonthIncone({
+            year: year.value
+        }).then(res => {
+            incomeList.value = res.data.rows
+
+
+        })
+        return {
+            incomeList,
+            year,
+            orderList,
+            active: ref(0),
+            currentDate: ref(''),
+            yearColumns: ref(yearColumns),
+            pickerShow: ref(false)
+        }
+    }
+})
+</script>
+
+<style lang="scss" scoped>
+.bg {
+    background: #fff;
+    min-height: 100vh;
+}
+
+.calendar {
+    width: 100%;
+    height: 82px;
+
+    .year {
+        padding-left: 30px;
+        text-align: left;
+        height: 82px;
+        line-height: 82px;
+        font-size: 26px;
+    }
+
+}
+
+.settle-table {
+    border-spacing: 0px;
+
+    .table-head {
+        width: 250px;
+        color: #8A9099;
+        font-size: 26px;
+        background: #F2F3F5;
+        height: 84px;
+        line-height: 84px;
+
+    }
+
+    .table-grid {
+        height: 84px;
+        line-height: 84px;
+        font-size: 26px;
+        border-bottom: 2px solid #E8E8E8;
+
+    }
+
+}
+
+.incomeTable {
+    padding-top: 20px;
+
+    .head {
+
+        width: 100%;
+        height: 84px;
+        padding-left: 30px;
+        padding-right: 30px;
+        color: #8A9099;
+        font-size: 26px;
+
+        background: #F2F3F5;
+
+    }
+
+    .item {
+
+        width: 100%;
+        height: 84px;
+
+        font-size: 26px;
+
+
+        background: #fff;
+
+        td {
+            border-bottom: 2px solid #E8E8E8;
+        }
+    }
+
+
+}
+</style>

+ 238 - 0
src/views/order/index.vue

@@ -0,0 +1,238 @@
+<template>
+    <div>
+        <m-nav-bar background="#498EF5" mode="white" title="订单列表"></m-nav-bar>
+        <van-calendar :max-date="maxDate" @confirm="setTimeRange" :min-date="minDate" v-model:show="calendarShow"
+            type="range" :round="false" position="bottom" />
+        <div class="calendar">
+            <van-icon @click="()=>{
+                calendarShow=true
+                
+            }" size="32" name="notes-o" />
+            <span @click="resetTimeRange" class="text">重置</span>
+        </div>
+        <div class="list">
+            <div v-for="(item,index) in orderList" :key="index" class="item">
+                <div class="order-time">下单时间:{{item.successTime}}</div>
+                <div class="order-border"></div>
+                <div class="order-name">{{item.goodsName}}</div>
+                <div class="order-money">
+                    <span style="color:#FF4D53">预估佣金¥0.50</span>
+                    <span style="color:#8A9099">付款金额¥1.00</span>
+                </div>
+                <div class="order-border"></div>
+                <div class="order-code">
+                    <span class="text">订单编号:{{item.outTradeNo}}</span>
+                    <div @click="copyCode(item.outTradeNo)" class="copy">
+                        复制
+                    </div>
+
+                </div>
+
+
+            </div>
+
+        </div>
+
+
+    </div>
+</template>
+
+<script lang="ts">
+import { defineComponent, reactive, ref } from 'vue'
+import api from '@/api'
+import { order } from '@/api/types/order'
+export default defineComponent({
+    setup() {
+        const calendarShow = ref(false)
+        const orderList = ref<order.studentOrderInfoList["rows"]>([])
+        const copyCode = (code: string | number) => {
+            code = String(code)
+            var aux = document.createElement("input");
+
+            // 获得需要复制的内容
+            aux.setAttribute("value", code);
+
+            // 添加到 DOM 元素中
+            document.body.appendChild(aux);
+
+            // 执行选中
+            // 注意: 只有 input 和 textarea 可以执行 select() 方法.
+            aux.select();
+
+            // 获得选中的内容
+            window.getSelection().toString();
+
+            // 执行复制命令
+            document.execCommand("copy");
+
+            // 将 input 元素移除
+            document.body.removeChild(aux);
+            console.log('复制成功')
+
+            return
+
+        }
+        let query = reactive({
+            endTime: "",
+            startTime: ""
+        })
+        const setTimeRange = (val: Date | Date[]) => {
+            calendarShow.value = false
+            if (Array.isArray(val)) {
+                query.startTime = `${val[0].getFullYear()}-${val[0].getMonth() + 1}-${val[0].getDate()}`
+                query.endTime = `${val[1].getFullYear()}-${val[1].getMonth() + 1}-${val[1].getDate()}`
+            }
+            api.order.studentOrderInfoList({
+                ...query
+
+
+            }).then(res => {
+                orderList.value = res.data.rows
+
+
+            })
+        }
+        const resetTimeRange = () => {
+            query.startTime = ""
+            query.endTime = ""
+
+            api.order.studentOrderInfoList({
+                ...query
+
+
+            }).then(res => {
+                orderList.value = res.data.rows
+
+
+            })
+
+
+        }
+        api.order.studentOrderInfoList({
+            ...query
+
+
+        }).then(res => {
+            orderList.value = res.data.rows
+
+
+        })
+
+        return {
+            query,
+            setTimeRange,
+            resetTimeRange,
+            maxDate: new Date(),
+            minDate: new Date('2022-1-01'),
+            orderList,
+            copyCode,
+            calendarShow
+        }
+    }
+})
+</script>
+
+<style lang="scss" scoped>
+.calendar {
+    padding-left: 30px;
+    padding-right: 30px;
+    display: flex;
+    width: 750px;
+    height: 104px;
+    align-content: center;
+    align-items: center;
+    justify-content: space-between;
+    background: #fff;
+
+    .text {
+        color: #498EF5;
+
+    }
+
+
+}
+
+.list {
+    padding-left: 30px;
+    padding-right: 30px;
+    padding-top: 40px;
+
+    .item {
+        width: 690px;
+        height: 320px;
+        margin: 0 auto;
+        border-radius: 16px;
+        background: #fff;
+        margin-bottom: 20px;
+
+        .order-time {
+            color: #8A9099;
+            line-height: 90px;
+            height: 90px;
+            width: 100%;
+            padding-left: 30px;
+            text-align: left;
+            font-size: 26px;
+
+        }
+
+        .order-border {
+            width: 100%;
+            height: 2px;
+            background: #E8E8E8;
+        }
+
+        .order-name {
+            color: #0A1A33;
+            font-size: 36px;
+            text-align: left;
+            padding-left: 30px;
+            padding-top: 20px;
+            padding-bottom: 20px;
+        }
+
+        .order-money {
+            display: flex;
+            justify-content: space-between;
+            padding-left: 30px;
+            padding-right: 30px;
+            font-size: 26px;
+            padding-bottom: 20px;
+
+            align-content: center;
+            align-items: center;
+        }
+
+        .order-code {
+            padding-left: 30px;
+            padding-right: 30px;
+            display: flex;
+            align-content: center;
+            align-items: center;
+            height: 90px;
+            font-size: 26px;
+            width: 100%;
+
+            .text {
+                width: 70%;
+                text-overflow: ellipsis;
+                overflow: hidden;
+                white-space: nowrap;
+            }
+
+            .copy {
+                width: 80px;
+                height: 40px;
+                background: #FFFFFF;
+                border-radius: 20px 20px 20px 20px;
+                opacity: 1;
+                border: 2px solid #0A1A33;
+                margin-left: 10px;
+                cursor: pointer;
+            }
+
+        }
+
+    }
+}
+</style>

+ 2 - 2
src/views/teacherApply/index.vue

@@ -1,6 +1,6 @@
 <template>
   <div>
-    <m-nav-bar :border="true" title="申请列表"></m-nav-bar>
+    <m-nav-bar :border="true" title="地址选择"></m-nav-bar>
     <van-cell-group inset>
       <!-- 输入任意文本 -->
       <van-field placeholder="请输入你的姓名" v-model="applyForm.realName" label="姓名" />
@@ -8,7 +8,7 @@
       <van-field placeholder="请输入身份证号码" v-model="applyForm.idCard" type="tel" label="身份证号" />
       <!-- 允许输入正整数,调起纯数字键盘 -->
       <van-field placeholder="请输入手机号" v-model="applyForm.phone" type="digit" label="手机号码" />
-      <!-- 允许输入数字,调起带符号的纯数字键盘 -->
+      <!-- 允许输入数字,调起带符号的纯数字键盘  -->
       <van-field placeholder="请输入所属驾校" v-model="applyForm.schoolName" type="number" label="所属驾校" />
     </van-cell-group>
   </div>

+ 22 - 0
src/views/teacherReview/index.vue

@@ -0,0 +1,22 @@
+<template>
+  <div>
+
+    <m-nav-bar :border="true" title="入驻信息审核"></m-nav-bar>
+    <div>
+    </div>
+    <div></div>
+  </div>
+</template>
+
+<script lang="ts">
+import { defineComponent } from 'vue';
+
+export default defineComponent({
+  setup() {
+    return {};
+  },
+});
+</script>
+
+<style scoped>
+</style>

+ 14 - 7
vite.config.ts

@@ -13,15 +13,22 @@ module.exports = defineConfig({
 		'@': pathResolve('./src'),
 	},
 	server: {
+		port: 443,
 		https: {
-			key: fs.readFileSync("./cert/6353984_jpcj-h5.zzxcx.net.key"),
-			cert: fs.readFileSync("./cert/6353984_jpcj-h5.zzxcx.net.pem"),
+		key: fs.readFileSync("./cert/6353984_jpcj-h5.zzxcx.net.key"),
+		cert: fs.readFileSync("./cert/6353984_jpcj-h5.zzxcx.net.pem")
 		},
-		host: "coach.zzxcx.net",
-		port: 443,
-		// https: {
-		// key: fs.readFileSync("./cert/6353984_jpcj-h5.zzxcx.net.key"),
-		// cert: fs.readFileSync("./cert/6353984_jpcj-h5.zzxcx.net.pem")
+		// proxy: {
+		// 	"/dev-api": {
+		// 		target: "https://sdjk-admin1.zzxcx.net/sdjk-admin/",
+		// 		changeOrigin: true,
+		// 		rewrite: (path) => path.replace(/^\/dev-api/, ""),
+		// 	},
+		// 	"/prod-api": {
+		// 		target: "https://sdjk-admin.zzxcx.net/sdjk-admin/",
+		// 		changeOrigin: true,
+		// 		rewrite: (path) => path.replace(/^\/prod-api/, ""),
+		// 	},
 		// },
 
 	},

部分文件因为文件数量过多而无法显示