laosan2382995021@163.com 4 tahun lalu
induk
melakukan
7010706ff0
100 mengubah file dengan 1557 tambahan dan 136 penghapusan
  1. TEMPAT SAMPAH
      dist.zip
  2. 36 0
      package-lock.json
  3. 1 0
      package.json
  4. 13 0
      public/aipay.html
  5. TEMPAT SAMPAH
      public/favicon.ico
  6. 4 0
      public/font/font.css
  7. 4 2
      public/index.html
  8. 0 3
      src/assets/scss/entry/style.scss
  9. 6 0
      src/components/flat-list/props.ts
  10. 1 0
      src/components/flat-list/src/main.vue
  11. TEMPAT SAMPAH
      src/components/popup/images/background-green.png
  12. 5 0
      src/components/popup/props.ts
  13. 6 3
      src/components/popup/src/main.vue
  14. 1 1
      src/components/popup/style.scss
  15. 6 1
      src/components/scroll-view/mixins/style.ts
  16. 6 0
      src/components/scroll-view/props.ts
  17. 1 1
      src/components/scroll-view/src/main.vue
  18. 7 1
      src/components/scroll-view/types/style.d.ts
  19. 2 1
      src/components/sound-recording/mixins/handle.ts
  20. 1 0
      src/components/sound-recording/src/main.vue
  21. 4 2
      src/components/v-image/api/image.ts
  22. 1 1
      src/config/config.ts
  23. 3 0
      src/layout/layout-chat/index.ts
  24. 19 0
      src/layout/layout-chat/mixins/handle.ts
  25. 2 0
      src/layout/layout-chat/mixins/index.ts
  26. 5 0
      src/layout/layout-chat/props.ts
  27. 32 0
      src/layout/layout-chat/src/main.vue
  28. 71 0
      src/layout/layout-chat/style.scss
  29. 4 2
      src/layout/layout-play/mixins/handle.ts
  30. 7 17
      src/mixins/cate.ts
  31. 31 1
      src/mixins/pay/index.ts
  32. 79 0
      src/mixins/pay/mixins/alipay.ts
  33. 5 0
      src/mixins/pay/mixins/index.ts
  34. 129 0
      src/mixins/pay/mixins/weChat.ts
  35. 9 0
      src/mixins/popup.ts
  36. 28 0
      src/popup/popup-alipay/data/input.ts
  37. 3 0
      src/popup/popup-alipay/index.ts
  38. 116 0
      src/popup/popup-alipay/mixins/handle.ts
  39. 6 0
      src/popup/popup-alipay/mixins/index.ts
  40. 79 0
      src/popup/popup-alipay/src/main.vue
  41. 5 0
      src/popup/popup-alipay/style.scss
  42. 11 0
      src/popup/popup-chat/components/chat-content/data/control.ts
  43. 8 0
      src/popup/popup-chat/components/chat-content/data/message-control.ts
  44. 14 0
      src/popup/popup-chat/components/chat-content/data/userContral.ts
  45. TEMPAT SAMPAH
      src/popup/popup-chat/components/chat-content/images/blacklist.png
  46. TEMPAT SAMPAH
      src/popup/popup-chat/components/chat-content/images/expression.png
  47. TEMPAT SAMPAH
      src/popup/popup-chat/components/chat-content/images/follow.png
  48. TEMPAT SAMPAH
      src/popup/popup-chat/components/chat-content/images/gift.png
  49. TEMPAT SAMPAH
      src/popup/popup-chat/components/chat-content/images/order.png
  50. TEMPAT SAMPAH
      src/popup/popup-chat/components/chat-content/images/report.png
  51. TEMPAT SAMPAH
      src/popup/popup-chat/components/chat-content/images/user-data.png
  52. TEMPAT SAMPAH
      src/popup/popup-chat/components/chat-content/images/user-follow.png
  53. 3 0
      src/popup/popup-chat/components/chat-content/index.ts
  54. 14 0
      src/popup/popup-chat/components/chat-content/mixins/handle.ts
  55. 3 0
      src/popup/popup-chat/components/chat-content/mixins/index.ts
  56. 4 0
      src/popup/popup-chat/components/chat-content/props.ts
  57. 96 0
      src/popup/popup-chat/components/chat-content/src/main.vue
  58. 116 0
      src/popup/popup-chat/components/chat-content/style.scss
  59. 3 0
      src/popup/popup-chat/components/chat-conversation/index.ts
  60. 5 0
      src/popup/popup-chat/components/chat-conversation/mixins/handle.ts
  61. 3 0
      src/popup/popup-chat/components/chat-conversation/mixins/index.ts
  62. 4 0
      src/popup/popup-chat/components/chat-conversation/props.ts
  63. 46 0
      src/popup/popup-chat/components/chat-conversation/src/main.vue
  64. 60 0
      src/popup/popup-chat/components/chat-conversation/style.scss
  65. 9 0
      src/popup/popup-chat/components/index.ts
  66. 21 0
      src/popup/popup-chat/data/tab.ts
  67. TEMPAT SAMPAH
      src/popup/popup-chat/images/follow-s.png
  68. TEMPAT SAMPAH
      src/popup/popup-chat/images/follow.png
  69. TEMPAT SAMPAH
      src/popup/popup-chat/images/message-s.png
  70. TEMPAT SAMPAH
      src/popup/popup-chat/images/message.png
  71. TEMPAT SAMPAH
      src/popup/popup-chat/images/user-s.png
  72. TEMPAT SAMPAH
      src/popup/popup-chat/images/user.png
  73. 3 0
      src/popup/popup-chat/index.ts
  74. 10 0
      src/popup/popup-chat/mixins/handle.ts
  75. 5 0
      src/popup/popup-chat/mixins/index.ts
  76. 78 0
      src/popup/popup-chat/src/main.vue
  77. 50 0
      src/popup/popup-chat/style.scss
  78. 1 1
      src/popup/popup-choosing/mixins/handle.ts
  79. 1 0
      src/popup/popup-detail/components/game/style.scss
  80. 2 2
      src/popup/popup-detail/src/main.vue
  81. 3 2
      src/popup/popup-detail/style.scss
  82. 5 1
      src/popup/popup-export/components.ts
  83. 13 1
      src/popup/popup-export/const/index.ts
  84. 1 1
      src/popup/popup-export/global.ts
  85. 5 5
      src/popup/popup-login/components/login/src/main.vue
  86. 16 10
      src/popup/popup-login/components/register/src/main.vue
  87. 3 1
      src/popup/popup-order/src/main.vue
  88. 4 1
      src/popup/popup-personal/components/my-wallet/data/data.ts
  89. 11 1
      src/popup/popup-personal/components/personal-data/data/footer.ts
  90. 1 1
      src/popup/popup-personal/components/personal-data/src/main.vue
  91. 1 1
      src/popup/popup-personal/props.ts
  92. 3 70
      src/popup/popup-recharge/mixins/handle.ts
  93. 1 1
      src/popup/popup-settle/components/fill-information/data/input.ts
  94. 8 1
      src/popup/popup-settle/components/fill-information/mixins/handle.ts
  95. 3 0
      src/popup/popup-withdrawal/index.ts
  96. 77 0
      src/popup/popup-withdrawal/mixins/handle.ts
  97. 5 0
      src/popup/popup-withdrawal/mixins/index.ts
  98. 71 0
      src/popup/popup-withdrawal/src/main.vue
  99. 15 0
      src/popup/popup-withdrawal/style.scss
  100. 3 0
      src/popup/popup-wx-pay/index.ts

TEMPAT SAMPAH
dist.zip


+ 36 - 0
package-lock.json

@@ -7,6 +7,7 @@
     "": {
       "version": "0.1.0",
       "dependencies": {
+        "@rongcloud/imlib-v4": "^4.4.1",
         "ant-design-vue": "^2.1.6",
         "axios": "^0.21.1",
         "core-js": "^3.6.5",
@@ -1519,6 +1520,29 @@
         "node": ">= 6"
       }
     },
+    "node_modules/@rongcloud/engine": {
+      "version": "4.4.1",
+      "resolved": "https://registry.npmjs.org/@rongcloud/engine/-/engine-4.4.1.tgz",
+      "integrity": "sha512-MNzc/laZ+JmtTOAYN2khnrP1gpBMAElsK1yEBFqTkCLlEKDoeV1TActSxqef+WMV38/hfa9XnfhLDDs6Lk7gcA==",
+      "peer": true,
+      "engines": {
+        "node": ">=10.0.0"
+      }
+    },
+    "node_modules/@rongcloud/imlib-v4": {
+      "version": "4.4.1",
+      "resolved": "https://registry.npmjs.org/@rongcloud/imlib-v4/-/imlib-v4-4.4.1.tgz",
+      "integrity": "sha512-y55KdBL/ynil9BW3tCcxfnpf4eCnFLAnnouj6Fh/paiDppuPJ8BKiU9b8zWR6gTP0JTl6a5AgouJ+BtTxqR6pw==",
+      "dependencies": {
+        "@rongcloud/engine": "~4.4.1"
+      },
+      "engines": {
+        "node": ">=10.0.0"
+      },
+      "peerDependencies": {
+        "@rongcloud/engine": "~4.4.1"
+      }
+    },
     "node_modules/@simonwep/pickr": {
       "version": "1.8.1",
       "resolved": "https://registry.npmjs.org/@simonwep/pickr/-/pickr-1.8.1.tgz",
@@ -17646,6 +17670,18 @@
       "integrity": "sha1-K1o6s/kYzKSKjHVMCBaOPwPrphs=",
       "dev": true
     },
+    "@rongcloud/engine": {
+      "version": "4.4.1",
+      "resolved": "https://registry.npmjs.org/@rongcloud/engine/-/engine-4.4.1.tgz",
+      "integrity": "sha512-MNzc/laZ+JmtTOAYN2khnrP1gpBMAElsK1yEBFqTkCLlEKDoeV1TActSxqef+WMV38/hfa9XnfhLDDs6Lk7gcA==",
+      "peer": true
+    },
+    "@rongcloud/imlib-v4": {
+      "version": "4.4.1",
+      "resolved": "https://registry.npmjs.org/@rongcloud/imlib-v4/-/imlib-v4-4.4.1.tgz",
+      "integrity": "sha512-y55KdBL/ynil9BW3tCcxfnpf4eCnFLAnnouj6Fh/paiDppuPJ8BKiU9b8zWR6gTP0JTl6a5AgouJ+BtTxqR6pw==",
+      "requires": {}
+    },
     "@simonwep/pickr": {
       "version": "1.8.1",
       "resolved": "https://registry.npmjs.org/@simonwep/pickr/-/pickr-1.8.1.tgz",

+ 1 - 0
package.json

@@ -7,6 +7,7 @@
     "build": "vue-cli-service build"
   },
   "dependencies": {
+    "@rongcloud/imlib-v4": "^4.4.1",
     "ant-design-vue": "^2.1.6",
     "axios": "^0.21.1",
     "core-js": "^3.6.5",

+ 13 - 0
public/aipay.html

@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Title</title>
+    <script>
+        window.close();
+    </script>
+</head>
+<body>
+
+</body>
+</html>

TEMPAT SAMPAH
public/favicon.ico


+ 4 - 0
public/font/font.css

@@ -50,3 +50,7 @@
   content: "\e67b";
 }
 
+
+#app{
+  background: url("../images/background.jpeg") repeat;
+}

+ 4 - 2
public/index.html

@@ -6,7 +6,7 @@
     <meta name="viewport" content="width=device-width,initial-scale=1.0">
     <link rel="icon" href="<%= BASE_URL %>favicon.ico">
     <link rel="stylesheet" type="text/css" href="./font/font.css" />
-    <title><%= htmlWebpackPlugin.options.title %></title>
+    <title>巧鱼</title>
 
       <script>
           var inputContent = {
@@ -25,7 +25,8 @@
                   multiple:100,  // 倍数
                   ref:1920,  // 参照,
                   startHeight: window.innerHeight,
-                  maxWidth:999999999
+                  maxWidth:1920,
+                  minWidth: 1700
               };
 
               doc.onblur = function(){
@@ -43,6 +44,7 @@
                       doc.documentElement.style.minHeight = screen_conf.height + 'px';
                   }
                   screen_conf.width = screen_conf.width >= win.screen_conf.maxWidth?win.screen_conf.maxWidth:screen_conf.width;
+                  screen_conf.width = screen_conf.width <= win.screen_conf.minWidth?win.screen_conf.minWidth:screen_conf.width;
                   screen_conf.proportion = screen_conf.width / screen_conf.ref;
                   screen_conf.fontSize = screen_conf.proportion * screen_conf.multiple;
                   doc.documentElement.style.fontSize = screen_conf.fontSize+'px';

+ 0 - 3
src/assets/scss/entry/style.scss

@@ -17,9 +17,6 @@ body{
   font-family: PingFang SC !important;
   -webkit-overflow-scrolling: touch;
 }
-#app{
-  background: url("/images/background.jpeg") repeat;
-}
 html{
   overflow: hidden;
 }

+ 6 - 0
src/components/flat-list/props.ts

@@ -24,6 +24,12 @@ export default {
         default:10
     },
 
+    // 兼容的滚动条安全尺寸
+    securitySize:{
+        type:Number,
+        default:0
+    },
+
     // 是否创建索引id
     indexes:{
       type:String,

+ 1 - 0
src/components/flat-list/src/main.vue

@@ -25,6 +25,7 @@
       class="screen"
       @scroll-lower="pagingLoading"
       :lowerThreshold="lowerThreshold"
+      :security-size="securitySize"
     >
       <slot name="layout" :data="data">
 

TEMPAT SAMPAH
src/components/popup/images/background-green.png


+ 5 - 0
src/components/popup/props.ts

@@ -26,6 +26,11 @@ export default {
     headerTitle:{
         type:String,
         default:''
+    },
+
+    headerStyle:{
+        type:String,
+        default:'default'
     }
 
 }

+ 6 - 3
src/components/popup/src/main.vue

@@ -3,10 +3,10 @@
            @click="trigger && changeValue"
            :class="{'center':center}"
   >
-    <section @click.stop :class="['popup-content-'+contentAnimate]" class="relative popup-content">
+    <section @click.stop :class="['popup-content-'+contentAnimate]" class="relative popup-content flex overflow">
       <header v-if="headerTitle" class="absolute popup-header center">
         <div class="popup-header-background center"
-          :style="{background:'url('+headerBackground+') 0 0'}"
+          :style="{background:'url('+background[headerStyle]+') 0 0'}"
         >
           {{headerTitle}}
         </div>
@@ -24,7 +24,10 @@ export default <LibMixins>{
   data(){
     return {
       vValue:false,
-      headerBackground: require('../images/background.png')
+      background:{
+        default: require('../images/background.png'),
+        green: require('../images/background-green.png')
+      }
     }
   },
 

+ 1 - 1
src/components/popup/style.scss

@@ -12,7 +12,7 @@
 
 /* 弹窗内容 */
 .popup-content{
-  max-height: 90%;
+  max-height: 95%;
 }
 /* 弹窗内容 */
 

+ 6 - 1
src/components/scroll-view/mixins/style.ts

@@ -1,5 +1,7 @@
 import {ContainerScrollStyle, ContainerStyle, ContainerStyleFlex} from "$components/scroll-view/types/style";
 
+import unit from "$utils/unit/unit";
+
 export default <LibMixins>{
 
     computed:{
@@ -19,10 +21,13 @@ export default <LibMixins>{
 
         },
         // 滚动容器
-        scrollContainer():ContainerScrollStyle{
+        scrollContainer():any{
             return {
                 overflowY: this.scrollY ? 'auto':'hidden',
                 overflowX: this.scrollX ? 'auto':'hidden',
+                width: this.securitySize ? 'auto': '',
+                paddingRight: unit.unitPx(this.securitySize)  + 'px',
+                marginRight: unit.unitPx(this.securitySize) * -1  + 'px',
             }
         }
     }

+ 6 - 0
src/components/scroll-view/props.ts

@@ -66,6 +66,12 @@ export default {
         default:0
     },
 
+    // 兼容的滚动条安全尺寸
+    securitySize:{
+        type:Number,
+        default:0
+    },
+
     // 滚动条类型
     scrollType:{
         type:String,

+ 1 - 1
src/components/scroll-view/src/main.vue

@@ -7,7 +7,7 @@
     <div class="scrollContainer"
       :style="scrollContainer"
       ref="scroll"
-         :class="['scroll-type-'+scrollType]"
+
     >
       <!--  视图收容器   -->
       <section class="scrollContainerTake" ref="scrollTake">

+ 7 - 1
src/components/scroll-view/types/style.d.ts

@@ -22,6 +22,12 @@ export interface ContainerScrollStyle {
     overflowY?:string,
 
     // x 轴
-    overflowX?:string
+    overflowX?:string,
+
+    paddingRight?:string,
+
+    marginRight?:string,
+
+    [propName:string]:any
 
 }

+ 2 - 1
src/components/sound-recording/mixins/handle.ts

@@ -17,7 +17,8 @@ export default <LibMixins>{
             soundStatusMessage:{
                 [SoundStatus.none]:'长按开始录音',
                 [SoundStatus.sound]:'正在录音',
-                [SoundStatus.jurisdiction]:'浏览器授权后,请点击重试'
+                [SoundStatus.jurisdiction]:'浏览器授权后,请点击重试',
+                [SoundStatus.support]:'暂不支持'
             },
             countdown:0,
             support:true,

+ 1 - 0
src/components/sound-recording/src/main.vue

@@ -17,6 +17,7 @@
           <div v-if="soundStatus === SoundStatus.jurisdiction" class="flex-1 sound-title">请授权麦克风</div>
           <div v-else-if="soundStatus === SoundStatus.none" class="flex-1 sound-title">按住说话{{min}}~{{max}}S</div>
           <div v-else-if="soundStatus === SoundStatus.sound" class="flex-1 sound-title">松开后结束({{countdown || 0}}秒)</div>
+          <div v-else-if="soundStatus === SoundStatus.supper" class="flex-1 sound-title">暂不支持</div>
         </aside>
 
       </section>

+ 4 - 2
src/components/v-image/api/image.ts

@@ -18,6 +18,8 @@ export default <ImageApi>{
 
         let width = 0;
         let height = 0;
+        let containerWidth = params.container.width - 2;
+        let containerHeight = params.container.height - 2;
 
         // 如果全部小于该尺寸触发
         if (
@@ -37,10 +39,10 @@ export default <ImageApi>{
 
             // 对长边进行设置
             if (isHeightMax) {
-                height = params.container.height;
+                height = containerHeight;
                 width = calculation.getRatioWidth(height,ratio);
             } else {
-                width = params.container.width;
+                width = containerWidth;
                 height = calculation.getRatioHeight(width,ratio);
             }
 

+ 1 - 1
src/config/config.ts

@@ -2,6 +2,6 @@ export default <Config>{
 
     baseApiURL:'/api',
 
-    baseURL:'http://newqiaoyu.com/',
+    baseURL:'http://newqiaoyu.lanmaonet.com/',
 
 }

+ 3 - 0
src/layout/layout-chat/index.ts

@@ -0,0 +1,3 @@
+import main from './src/main.vue';
+
+export default main;

+ 19 - 0
src/layout/layout-chat/mixins/handle.ts

@@ -0,0 +1,19 @@
+
+export default <LibMixins>{
+
+    computed:{
+
+        reverse(){
+            return true;
+        },
+
+        message(){
+            let message = '你好啊\n我是谁\n我也不知道';
+            return message.replace(/[\n\r]/g,function () {
+                return '<br />';
+            });
+        }
+
+    }
+
+}

+ 2 - 0
src/layout/layout-chat/mixins/index.ts

@@ -0,0 +1,2 @@
+import handle from './handle';
+export default [handle];

+ 5 - 0
src/layout/layout-chat/props.ts

@@ -0,0 +1,5 @@
+export default {
+
+
+
+}

+ 32 - 0
src/layout/layout-chat/src/main.vue

@@ -0,0 +1,32 @@
+<template>
+  <section class="layout-chat row"
+    :class="{
+      'layout-chat-reverse':reverse
+    }"
+  >
+    <v-image class="layout-chat-avatar" radius="50%"></v-image>
+    <aside class="flex-1 layout-chat-content relative rowACenter">
+      <div class="layout-chat-message relative" v-html="message"></div>
+    </aside>
+  </section>
+</template>
+
+<script>
+import {
+  vImage,
+  icon
+} from '$components';
+import props from '../props';
+import mixins from '../mixins';
+export default {
+  name: "layout-chat",
+  components:{
+    icon,
+    vImage
+  },
+  mixins,
+  props
+}
+</script>
+
+<style scoped lang="scss" src="../style.scss"></style>

+ 71 - 0
src/layout/layout-chat/style.scss

@@ -0,0 +1,71 @@
+/* 外层模块 */
+.layout-chat{
+  padding: 0 14px;
+  margin-top: 24px;
+}
+/* 外层模块 */
+/* 用户头像 */
+.layout-chat-avatar{
+  @include square(40px);
+}
+/* 用户头像 */
+
+/* 内容 */
+.layout-chat-content{
+  margin-left: 6px;
+  min-height: 40px;
+  padding-left: 10px;
+}
+.layout-chat-message{
+  padding: 7px 10px;
+  min-height: 28px;
+  background-color: rgba(255,255,255,0.1);
+  border-radius: 5px;
+  font-size: 12px;
+  line-height: 20px;
+}
+.layout-chat-icon{
+  fill: rgba(255,255,255,0.1);
+  @include square(13px);
+  left: 0;
+  top: 9px;
+}
+.layout-chat-message:before {
+  content:'';
+  width: 0;
+  height: 0;
+  position: absolute;
+  left: -10px;
+  top:8px;
+  border: 4px solid transparent;
+  border-right: 6px solid rgba(255,255,255,0.1);
+}
+.layout-chat-message{
+  -webkit-user-select:auto; /*webkit浏览器*/
+  -khtml-user-select:auto; /*早期浏览器*/
+  -moz-user-select:auto;/*火狐*/
+  -ms-user-select:auto; /*IE10*/
+  user-select:auto;
+}
+/* 内容 */
+
+/* right 方向 */
+.layout-chat-reverse{
+  flex-direction: row-reverse;
+}
+.layout-chat-reverse .layout-chat-content{
+  justify-content: flex-end;
+  margin-left: 0;
+  margin-right: 6px;
+}
+.layout-chat-reverse .layout-chat-content{
+  padding-left: 0;
+  padding-right: 10px;
+}
+.layout-chat-reverse .layout-chat-message:before{
+  right: -10px;
+  left: auto;
+  border-right: 4px solid transparent;
+  border-left: 6px solid rgba(255,255,255,0.1);
+}
+/* right 方向 */

+ 4 - 2
src/layout/layout-play/mixins/handle.ts

@@ -4,6 +4,8 @@ import popup from "$utils/tool/popup";
 import {InstructionsCacheType} from "$utils/request";
 import {PopupExportComponent} from "$popup/popup-export/const";
 
+import user from '$config/user';
+
 export default <LibMixins>{
 
     computed:{
@@ -73,12 +75,12 @@ export default <LibMixins>{
                 }
             }
 
-
-
         },
 
         triggerDetail(){
 
+            if (!user.verificationLogin()) return;
+
             this.clearTargetDetail();
 
             this.detailTime = setTimeout(()=>{

+ 7 - 17
src/mixins/cate.ts

@@ -1,21 +1,11 @@
+import { mapState } from 'vuex';
+
 export default {
 
-    computed:{
-        gameCate:{
-            get(){
-                return this.$store.state.cate.gameCate;
-            }
-        },
-        recommendGameCate:{
-            get(){
-                return this.$store.state.cate.recommendGameCate;
-            }
-        },
-        gameStatusCate:{
-            get(){
-                return this.$store.state.cate.gameStatusCate;
-            }
-        }
-    }
+    computed:mapState<any>({
+        gameStatusCate: state => state.cate.gameStatusCate,
+        gameCate: state => state.cate.gameCate,
+        recommendGameCate: state => state.cate.recommendGameCate,
+    })
 
 }

+ 31 - 1
src/mixins/pay/index.ts

@@ -1,5 +1,8 @@
 import payData from './data/payData';
 import Status from "$mixins/status/const/status";
+import popup from "$utils/tool/popup";
+
+import mixins from './mixins';
 
 export default <LibMixins>{
 
@@ -66,6 +69,33 @@ export default <LibMixins>{
         },
 
 
-    }
+        // 支付等待过程
+        triggerPayEnd(data){
+
+            this.storagePayReuslt = data;
+            this.nowPayStatus = false;
+            let type = this.payOrder[this.payCheck];
+            if (type === 'alipay') {
+                return this.triggerPayAlipay(data);
+            } else if(type === 'weChat') {
+                return this.triggerPayWeChat(data);
+            }
+
+        },
+
+        // 打开弹窗
+        openPayInfoConfirm(confirm = undefined,cancel=undefined){
+            popup.$confirm({
+                title:'是否支付完成?',
+                confirmText:'支付完成',
+                cancelText:'未完成',
+                confirm,
+                cancel
+            });
+        },
+
+    },
+
+    mixins
 
 }

+ 79 - 0
src/mixins/pay/mixins/alipay.ts

@@ -0,0 +1,79 @@
+import popup from "$utils/tool/popup";
+import {InstructionsMessageType} from "$utils/request";
+
+export default {
+
+    methods:{
+
+        // 触发 支付宝的回调
+        triggerPayAlipay(data){
+            window.open(data.result);
+            this.setAlipayWaitPattern();
+        },
+
+        // 设置等待模式
+        setAlipayWaitPattern(){
+
+            // 开启验证弹窗
+            this.openPayInfoConfirm(()=> this.checkAliPayStatus());
+
+            let nowTime = Math.floor(new Date().getTime() / 1000);
+
+            // 设置终止时间
+            this.pattern = setInterval(()=>{
+
+                let diff =  Math.floor(new Date().getTime()/1000) - nowTime;
+
+                // 如果满足任意一种主动释放 本次循环
+                if (document.hidden === true || document.hidden === undefined || diff >= 300) {
+                    clearInterval(this.pattern);
+                }
+
+                if (document.hidden === true) {
+                    this.checkAliPayStatus();
+                }
+
+
+            },1000);
+
+        },
+
+        // 检查支付宝支付状态
+        checkAliPayStatus(){
+
+            // 防止未清除掉
+            clearInterval(this.pattern);
+
+            // 关闭弹窗
+            popup.closeConfirm();
+
+            return this.$request({
+                url:'hxpay/user_recharge_info',
+                data:{
+                  oid:this.storagePayReuslt.oid
+                },
+                token:true,
+                failMessage:true,
+                loading:'验证中',
+                message: InstructionsMessageType.other
+            }).then((data)=>{
+
+                if (data.isSuccess) {
+                    if (data.data ==2) {
+                        popup.$toast('支付成功');
+                        this.nowPayStatus = true;
+                        this.$store.dispatch('updateUserMoneyPromise');
+                        return this.paySuccessCallback && this.paySuccessCallback();
+                    } else {
+                        popup.$toast('支付未成功');
+                    }
+                }
+
+                return  this.openPayInfoConfirm(()=> this.checkAliPayStatus());
+
+            }).catch(()=>  this.openPayInfoConfirm(()=> this.checkAliPayStatus()));
+        },
+
+    }
+
+}

+ 5 - 0
src/mixins/pay/mixins/index.ts

@@ -0,0 +1,5 @@
+import alipay from "./alipay";
+
+import weChat from "./weChat";
+
+export default [alipay,weChat];

+ 129 - 0
src/mixins/pay/mixins/weChat.ts

@@ -0,0 +1,129 @@
+import popup from "$utils/tool/popup";
+import {PopupExportComponent} from "$popup/popup-export/const";
+import {InstructionsMessageType} from "$utils/request";
+
+export default {
+
+    methods:{
+        // 触发 微信的回调
+        triggerPayWeChat(data){
+            this.triggerPayWeChatPopupUnique = popup.$popup && popup.$popup.open(PopupExportComponent.wxPay,{
+                src:data.result,
+                onclose:()=>{
+                    this.destroyWeChatPayPool();
+                    if (!this.nowPayStatus) {
+                        return this.openPayWeChatConfirm();
+                    }
+                }
+            });
+
+            return this.setWeChatWaitPattern();
+        },
+
+        // 设置等待模式
+        setWeChatWaitPattern(){
+
+            this.payWeChatWaitTime = Math.floor(new Date().getTime() / 1000);
+
+            // 设置终止时间
+            this.payWeChatTypeTime = setInterval(()=>{
+
+                let diff =  Math.floor(new Date().getTime()/1000) - this.payWeChatWaitTime;
+
+                // 如果满足任意一种主动释放 本次循环
+                if (this.nowPayStatus || diff >= 300 || this.triggerPayWeChatPopupUnique === undefined) {
+                    return this.destroyWeChatPayPool();
+                } else {
+                    this.queryWeChatPayStatus();
+                }
+
+            },5000);
+
+        },
+
+        // 设置查询支付状态
+        queryWeChatPayStatus(){
+            if (this.nowPayStatus) return;
+            this.queryWeChatPayStatusRequest().then((data)=>{
+                if (data.data == 2) {
+                    return this.payWeChatSuccess();
+                }
+            });
+        },
+
+        // 确认框查询
+        queryWeChatPayConfirmStatus(){
+            if (this.nowPayStatus) return;
+            popup.closeConfirm();
+            this.queryWeChatPayStatusRequest({
+                loading:'查询中',
+                message:InstructionsMessageType.other,
+                failMessage:true
+            }).then((data)=>{
+                if (data.isSuccess) {
+                    if (data.data == 2) {
+                        return this.payWeChatSuccess();
+                    } else {
+                        popup.$toast('支付未成功');
+                    }
+                }
+                return this.openPayWeChatConfirm();
+
+            }).catch(()=> this.openPayWeChatConfirm());
+        },
+
+        openPayWeChatConfirm() {
+            return  this.openPayInfoConfirm(()=> this.queryWeChatPayConfirmStatus(),()=>{
+                if (!this.nowPayStatus && this.storagePayReuslt) {
+                    this.triggerPayWeChat(this.storagePayReuslt);
+                }
+            });
+        },
+
+        // 校验
+        queryWeChatPayStatusRequest(options?:Record<string, any>){
+
+            let requestData:LibRequestOptions = {
+                url:'hxpay/user_recharge_info',
+                data:{
+                    oid: this.storagePayReuslt.oid
+                },
+                token:true
+            };
+
+            if (options) {
+                requestData = {
+                    ...requestData,
+                    ...options,
+                }
+            }
+
+            return this.$request(requestData);
+        },
+
+        // 设置支付成功
+        payWeChatSuccess(){
+            this.destroyWeChatPayPool();
+            this.closePayWeChatPopup();
+            this.nowPayStatus = true;
+            popup.closeConfirm();
+            popup.$toast('支付成功');
+            this.$store.dispatch('updateUserMoneyPromise');
+
+            return this.paySuccessCallback && this.paySuccessCallback();
+        },
+
+        // 释放递归请求
+        destroyWeChatPayPool(){
+            clearTimeout(this.payWeChatTypeTime);
+            this.triggerPayWeChatPopupUnique = undefined;
+        },
+
+        // 关闭微信弹窗
+        closePayWeChatPopup(){
+            clearTimeout(this.payWeChatTypeTime);
+            return popup.$popup && popup.$popup.close(this.triggerPayWeChatPopupUnique);
+        }
+    }
+
+}

+ 9 - 0
src/mixins/popup.ts

@@ -10,10 +10,19 @@ export default {
 
         close(){
             if (this.value) {
+
+                if (typeof this.$attrs.onclose === 'function') {
+                    this.$attrs.onclose();
+                }
+
                 this.value = false;
             }
         }
 
+    },
+
+    beforeUnmount() {
+        return this.close();
     }
 
 }

+ 28 - 0
src/popup/popup-alipay/data/input.ts

@@ -0,0 +1,28 @@
+import user from '$config/user';
+
+export default function () {
+
+    return {
+
+        left:[
+            {
+                label:'真实姓名',
+                placeholder:'请输入姓名',
+                rules:'',
+                value: user.user && user.user.alipay_name,
+                key:'alipay_name',
+            },
+            {
+                label:'支付宝账号',
+                placeholder:'请输入支付宝账号',
+                rules:'',
+                value: user.user && user.user.alipay_account,
+                key:'alipay_account',
+            },
+        ] as LibDataArray,
+
+        right:[]
+
+    }
+
+}

+ 3 - 0
src/popup/popup-alipay/index.ts

@@ -0,0 +1,3 @@
+import main from './src/main.vue';
+
+export default main;

+ 116 - 0
src/popup/popup-alipay/mixins/handle.ts

@@ -0,0 +1,116 @@
+import inputData from '../data/input';
+
+import verification from '$utils/verification';
+import {InstructionsMessageType} from "$utils/request";
+
+export default <LibMixins>{
+
+    data(){
+        return {
+            inputData:inputData()
+        }
+    },
+
+    methods:{
+
+        submitVerify(callback){
+
+            let useInputData = [];
+
+            for (let key in this.inputData) {
+                if (this.inputData.hasOwnProperty(key)) {
+                    useInputData.push(...this.inputData[key]);
+                }
+            }
+
+            return verification.verificationPromise(useInputData,true).then((resultData)=>{
+                return callback(resultData);
+            });
+
+        },
+
+        submit(obj){
+
+            // this.verificationCode(obj.data).then((resultData)=>{
+
+                // if (resultData.isSuccess) {
+
+                    // 获取所有需要上传的image
+                    let upload = [];
+                    let uploadItem = [];
+
+                    this.inputData.right.map((item)=>{
+                        if (typeof obj.data[item.key] !== 'string' && obj.data[item.key] && this.$refs[item.key]) {
+                            upload.push(this.$refs[item.key].triggerUploadPromise(obj.data[item.key]));
+                            uploadItem.push(item);
+                        }
+                    });
+
+                    if (upload.length > 0) {
+
+                        Promise.all(upload).then((data)=>{
+
+                            let failMessage;
+                            uploadItem.map((item,index)=>{
+                                if (data[index].isSuccess) {
+                                    item.value = data[index].data;
+                                    obj.data[item.key] = item.value;
+                                } else {
+                                    failMessage = data[index].msg || '上传失败';
+                                }
+                            });
+
+                            if (failMessage) {
+                                obj.none();
+                                return this.$toast(failMessage);
+                            } else {
+                                return this.authentication(obj);
+                            }
+
+                        }).catch(obj.fail);
+
+                    } else {
+                        return this.authentication(obj);
+                    }
+
+                // } else {
+                //     return obj.none();
+                // }
+
+            // }).catch(obj.fail);
+
+        },
+
+        // 验证验证码是否正确
+        verificationCode(resultData){
+
+            return this.$request({
+                url:'api/verification_code',
+                data:resultData,
+                message: InstructionsMessageType.other
+            });
+
+        },
+
+        // 实名认证
+        authentication(obj){
+            return this.$request({
+                url:'user/binding_zfb',
+                token:true,
+                data: obj.data,
+                message: true
+            }).then((resultData)=>{
+                obj.none();
+                if (resultData.isSuccess) {
+
+                    this.user = { is_ali:1,...obj.data };
+
+                    return this.close();
+                }
+
+            }).catch(obj.fail);
+        }
+
+    }
+
+}

+ 6 - 0
src/popup/popup-alipay/mixins/index.ts

@@ -0,0 +1,6 @@
+import popup from "$mixins/popup";
+import handle from './handle';
+import time from '$mixins/time';
+import user from '$mixins/user';
+
+export default [popup,time,handle,user];

+ 79 - 0
src/popup/popup-alipay/src/main.vue

@@ -0,0 +1,79 @@
+<template>
+  <popup v-model:value="value" content-animate="scale" @close="$emit('destroy-popup')">
+
+    <section class="real-name-container relative">
+      <header class="rowACenter real-name-header">
+        <div class="real-name-title flex-1">支付宝认证</div>
+      </header>
+      <div @click="close" class="real-name-close-wrap cursor-pointer absolute animate-rotate-hover">
+        <icon type="close" class="real-name-close"></icon>
+      </div>
+
+      <section class="real-name-screen row relative">
+
+        <aside class="input-real-container">
+
+          <div
+            v-for="(item,index) in inputData.left"
+            :key="'real-name-'+index"
+            class="row aCenter input-real"
+            :class="{'input-real-margin':index!==0}"
+          >
+            <div class="real-circular"></div>
+            <div class="real-input-label alipay-label">{{item.label}}</div>
+            <div class="real-input-container rowACenter">
+              <div class="flex-1">
+                <input
+                    class="flex-1"
+                    :placeholder="item.placeholder"
+                    :type="item.type || 'text'"
+                    v-model="item.value"
+                    :maxlength="item.maxlength || 50"
+                    :disabled="item.disabled"
+                />
+              </div>
+              <div v-if="item.code" class="real-code-button center"
+                @click="triggerTimeDate(item,inputData.left)"
+                   :class="{
+                      'real-code-disabled': timeFormat
+                   }"
+              >{{timeFormat || timeConfig.default}}</div>
+
+            </div>
+          </div>
+
+        </aside>
+
+      </section>
+
+      <div class="center">
+          <v-button class="real-name-button" @submit-verify="submitVerify" @submit="submit">提交审核</v-button>
+      </div>
+
+
+    </section>
+
+  </popup>
+</template>
+
+<script>
+import {
+  Popup,
+  icon,
+  vUpload,
+  vButton
+} from '$components';
+import mixins from '../mixins';
+export default {
+  name: "popup-alipay",
+  components:{
+    vButton,
+    Popup,
+    icon,
+    vUpload
+  },
+  mixins
+}
+</script>
+
+<style scoped lang="scss" src="../style.scss"></style>

+ 5 - 0
src/popup/popup-alipay/style.scss

@@ -0,0 +1,5 @@
+@import "../popup-real-name/style";
+
+.alipay-label{
+  width: 110px;
+}

+ 11 - 0
src/popup/popup-chat/components/chat-content/data/control.ts

@@ -0,0 +1,11 @@
+export default [
+    {
+        icon:require('../images/follow.png')
+    },
+    {
+        icon:require('../images/report.png')
+    },
+    {
+        icon:require('../images/blacklist.png')
+    }
+]

+ 8 - 0
src/popup/popup-chat/components/chat-content/data/message-control.ts

@@ -0,0 +1,8 @@
+export default [
+    {
+        icon:require('../images/expression.png')
+    },
+    {
+        icon:require('../images/gift.png')
+    }
+]

+ 14 - 0
src/popup/popup-chat/components/chat-content/data/userContral.ts

@@ -0,0 +1,14 @@
+export default [
+    {
+        label:'下单',
+        icon:require('../images/order.png')
+    },
+    {
+        label: '资料',
+        icon:require('../images/user-data.png')
+    },
+    {
+        label: '关注',
+        icon:require('../images/user-follow.png')
+    }
+]

TEMPAT SAMPAH
src/popup/popup-chat/components/chat-content/images/blacklist.png


TEMPAT SAMPAH
src/popup/popup-chat/components/chat-content/images/expression.png


TEMPAT SAMPAH
src/popup/popup-chat/components/chat-content/images/follow.png


TEMPAT SAMPAH
src/popup/popup-chat/components/chat-content/images/gift.png


TEMPAT SAMPAH
src/popup/popup-chat/components/chat-content/images/order.png


TEMPAT SAMPAH
src/popup/popup-chat/components/chat-content/images/report.png


TEMPAT SAMPAH
src/popup/popup-chat/components/chat-content/images/user-data.png


TEMPAT SAMPAH
src/popup/popup-chat/components/chat-content/images/user-follow.png


+ 3 - 0
src/popup/popup-chat/components/chat-content/index.ts

@@ -0,0 +1,3 @@
+import main from './src/main.vue';
+
+export default main;

+ 14 - 0
src/popup/popup-chat/components/chat-content/mixins/handle.ts

@@ -0,0 +1,14 @@
+import controlData from '../data/control';
+import userControlData from '../data/userContral';
+import messageControlData from '../data/message-control';
+export default <LibMixins>{
+
+    data(){
+        return {
+            controlData,
+            userControlData,
+            messageControlData
+        }
+    }
+
+}

+ 3 - 0
src/popup/popup-chat/components/chat-content/mixins/index.ts

@@ -0,0 +1,3 @@
+import handle from './handle';
+
+export default [handle];

+ 4 - 0
src/popup/popup-chat/components/chat-content/props.ts

@@ -0,0 +1,4 @@
+export default {
+
+
+}

+ 96 - 0
src/popup/popup-chat/components/chat-content/src/main.vue

@@ -0,0 +1,96 @@
+<template>
+  <section class="screen flex">
+    <header class="chat-content-header rowACenter">
+      <div class="flex-1">
+        <div class="line-1">巧鱼客服</div>
+      </div>
+      <section class="chat-control rowACenter">
+        <aside
+          v-for="(item,index) in controlData"
+          :key="'chat-control-'+index"
+          class="chat-control-item center cursor-pointer"
+        >
+          <v-image :src="item.icon" class="chat-control-icon" backgroundColor="transparent" mode="center" ></v-image>
+        </aside>
+      </section>
+    </header>
+    <section class="flex-1 overflow row">
+      <aside class="chat-content-container flex-1 overflow">
+        <section class="flex-1 overflow chat-message-container">
+          <scroll-view>
+            <layout-chat></layout-chat>
+            <div class="chat-bottom-fixed"></div>
+          </scroll-view>
+        </section>
+        <article class="chat-message flex">
+          <header class="chat-message-header rowACenter">
+            <section class="flex-1 rowACenter">
+              <v-image
+                v-for="(item,index) in messageControlData"
+                class="chat-message-icon cursor-pointer"
+                :src="item.icon"
+                mode="center"
+                backgroundColor="transparent"
+                :key="'message-control-'+index"
+              ></v-image>
+            </section>
+            <div class="chat-message-introduce rowACenter">
+              <svg t="1623468612885" class="chat-introduce-icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="7151" width="200" height="200"><path d="M512 42.667A729.813 729.813 0 0 1 128 182.4v467.84c37.76 170.667 384 331.093 384 331.093S858.24 820.907 896 650.24V182.4A729.813 729.813 0 0 1 512 42.667z m214.613 370.986l-241.706 241.92a32 32 0 0 1-45.227 0L297.387 513.28a32 32 0 0 1 45.226-45.227l119.68 119.68 219.094-219.306a32 32 0 0 1 45.226 45.226z" p-id="7152" fill="#ffac4d"></path></svg>
+              <div>为保障用户权益,请勿在平台外进行交易,谨防被骗</div>
+            </div>
+          </header>
+          <section class="flex-1 overflow">
+            <div class="flex-1">
+              <textarea maxlength="2000" class="screen chat-textarea" placeholder="请输入信息"></textarea>
+            </div>
+            <section class="flex chat-message-button-warp">
+              <div class="button chat-message-button">发送</div>
+            </section>
+          </section>
+        </article>
+      </aside>
+      <aside class="chat-content-user aCenter">
+        <v-image class="chat-content-avatar" radius="50%"></v-image>
+        <div class="chat-user-name">巧鱼客服</div>
+        <div class="chat-user-message">这是一段个人简介,这是一段个
+          人简介,这是</div>
+        <section
+          class="chat-user-control rowACenter"
+        >
+          <aside
+            v-for="(item,index) in userControlData"
+            :key="'user-control-'+index"
+            class="chat-user-control-item center cursor-pointer"
+          >
+            <v-image :src="item.icon" class="chat-user-control-icon" mode="center" backgroundColor="transparent"></v-image>
+            <div>{{item.label}}</div>
+          </aside>
+        </section>
+      </aside>
+    </section>
+  </section>
+</template>
+
+<script>
+import {
+  vImage,
+  icon,
+  scrollView
+} from '$components';
+import layoutChat from '$layout/layout-chat';
+import props from '../props';
+import mixins from '../mixins';
+export default {
+  name: "chat-content",
+  components:{
+    icon,
+    vImage,
+    layoutChat,
+    scrollView
+  },
+  mixins,
+  props
+}
+</script>
+
+<style scoped lang="scss" src="../style.scss"></style>

+ 116 - 0
src/popup/popup-chat/components/chat-content/style.scss

@@ -0,0 +1,116 @@
+/* 头部 */
+.chat-content-header{
+  height: 67px;
+  border-bottom: 1px solid rgba(255,255,255,0.2);
+  font-size: 18px;
+  line-height: 20px;
+  padding: 0 20px;
+}
+.chat-control-item{
+  @include square(40px);
+  border-radius: 50%;
+  background-color: rgba(255,255,255,0.2);
+  margin-left: 20px;
+}
+.chat-control{
+  margin-right: 60px;
+}
+.chat-control-icon{
+  @include square(22px);
+}
+/* 头部 */
+
+/* 用户资料信息 */
+.chat-content-user{
+  width: 260px;
+  border-left: 1px solid rgba(255,255,255,0.2);
+  height: 100%;
+  padding: 70px 30px;
+}
+.chat-content-avatar{
+  @include square(86px);
+}
+.chat-user-name{
+  font-size: 18px;
+  line-height: 22px;
+  margin-top: 14px;
+  font-weight: bold;
+}
+.chat-user-message{
+  margin-top: 5px;
+  font-size: 14px;
+  line-height: 20px;
+  font-weight: 400;
+}
+.chat-user-control{
+  margin-top: 30px;
+}
+.chat-user-control-icon{
+  @include square(23px);
+  margin-bottom: 6px;
+}
+.chat-user-control-item{
+  font-size: 14px;
+  line-height: 16px;
+  margin-right: 36px;
+}
+.chat-user-control-item:last-child{
+  margin-right: 0;
+}
+/* 用户资料信息 */
+
+/* 用户消息模块 */
+.chat-content-container{
+  padding: 0 20px;
+}
+.chat-bottom-fixed{
+  height: 24px;
+}
+.chat-message-container{
+  border-radius: 10px;
+  background-color: rgba(255,255,255,0.08);
+}
+.chat-message{
+  height: 140px;
+}
+.chat-message-header{
+  margin-top: 10px;
+  margin-bottom: 5px;
+}
+.chat-message-icon{
+  @include square(20px);
+  margin-right: 10px;
+}
+.chat-message-introduce{
+  height: 24px;
+  padding: 0 10px;
+  background-color: rgba(255,255,255,0.08);
+  border-radius: 12px;
+  font-size: 12px;
+  line-height: 14px;
+}
+.chat-introduce-icon{
+  @include square(15px);
+  margin-right: 2px;
+}
+.chat-textarea{
+  font-size: 12px;
+  line-height: 18px;
+  resize: none;
+  color: #fff;
+}
+.chat-textarea::placeholder{
+  color: rgba(255,255,255,0.5);
+}
+.chat-message-button-warp{
+  margin-bottom: 15px;
+  margin-top: 4px;
+  align-items: flex-end;
+}
+.chat-message-button{
+  width: 70px;
+  height: 30px;
+  font-size: 16px;
+  line-height: 20px;
+}
+/* 用户消息模块 */

+ 3 - 0
src/popup/popup-chat/components/chat-conversation/index.ts

@@ -0,0 +1,3 @@
+import main from './src/main.vue';
+
+export default main;

+ 5 - 0
src/popup/popup-chat/components/chat-conversation/mixins/handle.ts

@@ -0,0 +1,5 @@
+export default <LibMixins>{
+
+
+
+}

+ 3 - 0
src/popup/popup-chat/components/chat-conversation/mixins/index.ts

@@ -0,0 +1,3 @@
+import handle from './handle';
+
+export default [handle];

+ 4 - 0
src/popup/popup-chat/components/chat-conversation/props.ts

@@ -0,0 +1,4 @@
+export default {
+
+
+}

+ 46 - 0
src/popup/popup-chat/components/chat-conversation/src/main.vue

@@ -0,0 +1,46 @@
+<template>
+  <section class="screen">
+
+    <aside class="chat-layout-item rowACenter">
+      <v-image class="chat-layout-avatar" radius="50%">
+        <div class="chat-dot absolute center">
+          <span>9</span>
+        </div>
+      </v-image>
+      <div class="flex-1 chat-layout-content">
+        <header class="rowACenter">
+          <div class="chat-layout-title">系统消息</div>
+<!--          <div class="chat-layout-label center">官方</div>-->
+          <div class="rowCenter chat-layout-label chat-layout-label-boy">
+            <icon type="boy" class="chat-layout-label-icon"></icon>
+            <div>14</div>
+          </div>
+        </header>
+        <div class="line-1 chat-message">这里展示最新的一条信息这里展示最新的一条信息,最多展示20个字</div>
+      </div>
+    </aside>
+
+  </section>
+</template>
+
+<script>
+import {
+  vImage,
+  icon,
+  FlatList
+} from '$components';
+import props from '../props';
+import mixins from '../mixins';
+export default {
+  name: "chat-conversation",
+  components:{
+    icon,
+    vImage,
+    FlatList
+  },
+  mixins,
+  props
+}
+</script>
+
+<style scoped lang="scss" src="../style.scss"></style>

+ 60 - 0
src/popup/popup-chat/components/chat-conversation/style.scss

@@ -0,0 +1,60 @@
+/* 视图内容 */
+.chat-layout-item {
+  height: 80px;
+  border-bottom: 1px solid rgba(255,255,255,0.2);
+  padding: 0 20px;
+}
+.chat-layout-item-active{
+  background-color: rgba(0,0,0,0.2);
+  //chat-layout-item-active
+}
+.chat-layout-avatar{
+  @include square(40px);
+}
+.chat-layout-content{
+  margin-left: 7px;
+  font-size: 14px;
+  color: #fff;
+}
+.chat-layout-label{
+  background: $main-linear;
+  height: 16px;
+  padding: 5px;
+  border-radius: 8px;
+  margin-left: 5px;
+  font-size: 12px;
+  line-height: 12px;
+}
+.chat-message{
+  margin-top: 2px;
+  font-size: 12px;
+  color: rgba(255,255,255,0.5);
+  line-height: 16px;
+}
+.chat-layout-label-icon{
+  font-size: 12px;
+  line-height: 12px;
+  margin-right: 2px;
+}
+.chat-layout-label-boy{
+  background: #5497F2;
+}
+.chat-layout-label-girl{
+  background: #FE75CC;
+}
+.chat-dot {
+  right: -5px;
+  height: 17px;
+  min-width: 17px;
+  background-color: #FF7D7D;
+  border-radius: 8.5px;
+  padding: 0 1px;
+  width: auto;
+  border: 1px solid #fff;
+  line-height: 12px;
+}
+.chat-dot span{
+  font-size: 12px;
+  transform: scale(0.8);
+}
+/* 视图内容 */

+ 9 - 0
src/popup/popup-chat/components/index.ts

@@ -0,0 +1,9 @@
+// 会话列表
+import chatConversation from './chat-conversation';
+// 会话内容
+import chatContent from './chat-content';
+
+export default {
+    chatConversation,
+    chatContent
+}

+ 21 - 0
src/popup/popup-chat/data/tab.ts

@@ -0,0 +1,21 @@
+export default [
+    {
+        icon:require('../images/message.png'),
+        checkIcon:require('../images/message-s.png'),
+        label:'消息',
+        component:'chat-conversation',
+        slot:'1'
+    },
+    {
+        icon:require('../images/follow.png'),
+        checkIcon:require('../images/follow-s.png'),
+        label: '关注',
+        slot:'2'
+    },
+    {
+        icon:require('../images/user.png'),
+        checkIcon:require('../images/user-s.png'),
+        label: '粉丝',
+        slot:'3'
+    }
+]

TEMPAT SAMPAH
src/popup/popup-chat/images/follow-s.png


TEMPAT SAMPAH
src/popup/popup-chat/images/follow.png


TEMPAT SAMPAH
src/popup/popup-chat/images/message-s.png


TEMPAT SAMPAH
src/popup/popup-chat/images/message.png


TEMPAT SAMPAH
src/popup/popup-chat/images/user-s.png


TEMPAT SAMPAH
src/popup/popup-chat/images/user.png


+ 3 - 0
src/popup/popup-chat/index.ts

@@ -0,0 +1,3 @@
+import main from './src/main.vue';
+
+export default main;

+ 10 - 0
src/popup/popup-chat/mixins/handle.ts

@@ -0,0 +1,10 @@
+import tabData from '../data/tab';
+export default <LibMixins>{
+
+    data(){
+      return {
+          tabData
+      }
+    }
+
+}

+ 5 - 0
src/popup/popup-chat/mixins/index.ts

@@ -0,0 +1,5 @@
+import popup from "$mixins/popup";
+import handle from './handle';
+import cate from '$mixins/cate';
+
+export default [popup,handle,cate];

+ 78 - 0
src/popup/popup-chat/src/main.vue

@@ -0,0 +1,78 @@
+<template>
+  <popup v-model:value="value" content-animate="scale" @close="$emit('destroy-popup')">
+    <section class="chat-container flex row relative">
+
+      <div @click="close" class="chat-close-wrap cursor-pointer absolute animate-rotate-hover">
+        <icon type="close" class="chat-close"></icon>
+      </div>
+
+      <aside class="chat-left">
+        <tab
+          :data="tabData"
+        >
+
+          <template v-slot:header="{data,trigger,select}">
+            <header class="chat-header row">
+              <aside
+                class="flex-1 center"
+                v-for="(item,index) in data"
+                :key="'chat-item-'+index"
+                @click="trigger(index)"
+                :class="{
+                  'cursor-pointer': index !== select,
+                  'chat-item-active': index === select
+                }"
+              >
+                <v-image :src="index === select ? item.checkIcon :item.icon" mode="center" class="chat-header-item" backgroundColor="transparent"></v-image>
+                <div class="chat-label">{{item.label}}</div>
+              </aside>
+            </header>
+          </template>
+
+          <template
+            v-for="(item,index) in tabData"
+            v-slot:[item.slot]
+          >
+            <component
+              :is="item.component"
+              v-if="item.component"
+              :key="'chat-tab-content-'+index"
+            ></component>
+          </template>
+
+        </tab>
+      </aside>
+
+      <aside class="chat-left-line absolute"></aside>
+
+      <aside class="flex-1 overflow">
+        <chat-content></chat-content>
+      </aside>
+
+    </section>
+  </popup>
+</template>
+
+<script>
+import {
+  Popup,
+  icon,
+  vImage,
+  tab
+} from '$components';
+import components from '../components';
+import mixins from '../mixins';
+export default {
+  name: "popup-chat",
+  components:{
+    Popup,
+    icon,
+    vImage,
+    tab,
+    ...components
+  },
+  mixins
+}
+</script>
+
+<style scoped lang="scss" src="../style.scss"></style>

+ 50 - 0
src/popup/popup-chat/style.scss

@@ -0,0 +1,50 @@
+/* 聊天室 */
+.chat-container{
+  width: 1272px;
+  height: 682px;
+  background-color: #1B1839;
+  border-radius: 20px;
+  overflow: hidden;
+  border: 4px solid #2D2A49;
+}
+.chat-close-wrap{
+  right: 15px;
+  top: 10px;
+}
+.chat-close{
+  font-size: 14px;
+  font-weight: bold;
+}
+/* 聊天室 */
+
+/* 聊天室左侧 */
+.chat-left{
+  width: 320px;
+  background-color: rgba(255,255,255,0.08);
+  height: 100%;
+}
+.chat-header{
+  height: 101px;
+  border-bottom: 1px solid rgba(255,255,255,0.2);
+}
+.chat-header-item{
+  @include square(27px);
+}
+.chat-left-line{
+  left: 320px;
+  top: -4px;
+  bottom: -4px;
+  width: 1px;
+  z-index: 999;
+  background-color: rgba(255,255,255,0.2);
+}
+.chat-item-active .chat-label{
+  color: #fff;
+}
+.chat-label{
+  font-size: 14px;
+  line-height: 22px;
+  color: rgba(255,255,255,0.4);
+  margin-top: 5px;
+}
+/* 聊天室左侧 */

+ 1 - 1
src/popup/popup-choosing/mixins/handle.ts

@@ -61,7 +61,7 @@ export default <LibMixins>{
         getGameDetail(item){
 
             return this.$request({
-                url:'game/get_game_info',
+                url:'game/get_game_info?gid='+item.gid,
                 data:{
                     gid: item.gid
                 },

+ 1 - 0
src/popup/popup-detail/components/game/style.scss

@@ -43,6 +43,7 @@
 /* 步进器 */
 .game-number{
   margin-top: 8px;
+  height: 36px;
 }
 .stepper-margin{
   margin-left: 10px;

+ 2 - 2
src/popup/popup-detail/src/main.vue

@@ -1,6 +1,6 @@
 <template>
   <popup v-model:value="value" content-animate="scale" @close="$emit('destroy-popup')">
-    <section class="center detail-container-warp">
+    <section class="detail-container-warp flex overflow">
       <section class="detail-container flex overflow">
         <!-- 头部 -->
         <header class="rowACenter detail-header" >
@@ -28,7 +28,7 @@
         </header>
         <!-- 内容部分 -->
         <section class="detail-content flex-1 overflow row">
-          <scroll-view>
+          <scroll-view class="screen overflow">
             <section class="detail-content-scroll row overflow">
               <aside class="detail-left">
                 <section class="detail-banner">

+ 3 - 2
src/popup/popup-detail/style.scss

@@ -1,10 +1,11 @@
 /* 容器 */
-.detail-container-warp,.detail-container{
-  max-height: 100%;
+.detail-container-warp{
+  height: 100%;
 }
 .detail-container{
   width: 1100px;
   height: 1010px;
+  max-height: 100%;
   background-color: #F1F1F1;
   border-radius: 20px;
 }

+ 5 - 1
src/popup/popup-export/components.ts

@@ -15,5 +15,9 @@ export default {
     [PopupExportComponent.recharge]: defineAsyncComponent(()=> import('$popup/popup-recharge')),
     [PopupExportComponent.message]: defineAsyncComponent(()=> import('$popup/popup-message')),
     [PopupExportComponent.help]: defineAsyncComponent(()=> import('$popup/popup-help')),
-    [PopupExportComponent.exchangeCoin]: defineAsyncComponent(()=> import('$popup/popup-exchange-coin'))
+    [PopupExportComponent.exchangeCoin]: defineAsyncComponent(()=> import('$popup/popup-exchange-coin')),
+    [PopupExportComponent.wxPay]: defineAsyncComponent(()=> import('$popup/popup-wx-pay')),
+    [PopupExportComponent.withdrawal]: defineAsyncComponent(()=> import('$popup/popup-withdrawal')),
+    [PopupExportComponent.alipay]: defineAsyncComponent(()=> import('$popup/popup-alipay')),
+    [PopupExportComponent.chat]: defineAsyncComponent(()=> import('$popup/popup-chat'))
 }

+ 13 - 1
src/popup/popup-export/const/index.ts

@@ -40,7 +40,19 @@ const enum PopupExportComponent {
     help='popup-help',
 
     // 兑换巧鱼币
-    exchangeCoin='popup-exchange-coin'
+    exchangeCoin='popup-exchange-coin',
+
+    // 微信支付
+    wxPay = 'popup-wx-pay',
+
+    // 提现
+    withdrawal = 'popup-withdrawal',
+
+    // 支付宝认证
+    alipay='popup-alipay',
+
+    // chat
+    chat='popup-chat'
 
 }
 

+ 1 - 1
src/popup/popup-export/global.ts

@@ -25,7 +25,7 @@ export default {
                 }
             }
 
-            popup.$popup.open(PopupExportComponent.personal);
+            popup.$popup.open(PopupExportComponent.chat);
 
         });
 

+ 5 - 5
src/popup/popup-login/components/login/src/main.vue

@@ -78,7 +78,7 @@ export default {
       return this.$request({
         url:'login/user_login',
         data:obj.data,
-        message: InstructionsMessageType.other
+        message: true
       }).then((data)=>{
 
         if (data.isSuccess) {
@@ -87,7 +87,7 @@ export default {
 
           this.$request.getUserInfo().then((resultData)=>{
              this.$store.commit('setUserInfo',Object.assign({},data.data,resultData));
-             return obj.success();
+             return this.$emit('close');
           }).catch(obj.fail);
         } else {
           return obj.none();
@@ -107,9 +107,9 @@ export default {
 
     },
 
-    loginSuccess:function () {
-      return this.$emit('close');
-    }
+    // loginSuccess:function () {
+    //   return this.$emit('close');
+    // }
   },
 
   components:{

+ 16 - 10
src/popup/popup-login/components/register/src/main.vue

@@ -45,7 +45,6 @@
       <v-button class="login-button register-button"
           @submit-verify="submitVerify"
           @submit="submit"
-          @change-success="toLogin"
           success-text="注册成功"
       >同意协议并注册</v-button>
 
@@ -85,15 +84,22 @@ export default {
     submit:function (obj) {
 
       this.storageData = obj.data;
-      setTimeout(()=> obj.success(),1000);
-
-      // return this.$request({
-      //   url:'login/user_reg',
-      //   data:obj.data,
-      //   message: InstructionsMessageType.other
-      // }).then((data)=>{
-      //   return data.isSuccess ? obj.success() : obj.none();
-      // }).catch(obj.fail);
+
+      return this.$request({
+        url:'login/user_reg',
+        data:obj.data,
+        message: true
+      }).then((data)=>{
+
+        if (data.isSuccess) {
+          this.storageData && this.setLoginParams(this.storageData);
+
+          // 跳转 login 同时释放自身
+          return this.openModal('login',false);
+        }
+
+        return obj.none();
+      }).catch(obj.fail);
     },
     //跳转登录
     toLogin(){

+ 3 - 1
src/popup/popup-order/src/main.vue

@@ -71,7 +71,9 @@
           <aside class="rowACenter order-pay-item order-pay-item-margin">
             <div class="order-pay-label">实付款:</div>
             <section class="flex-1 order-pay-price">
-              <div class="line-1">{{payTotalFormat}}</div>
+              <div class="line-1">¥{{total}}</div>
+
+<!--              <div class="line-1">{{payTotalFormat}}</div>-->
             </section>
           </aside>
         </section>

+ 4 - 1
src/popup/popup-personal/components/my-wallet/data/data.ts

@@ -30,7 +30,10 @@ export default [
                 })
             },
             {
-                label: '提现'
+                label: '提现',
+                trigger:new FunctionTrigger(function (){
+                    return popup.$popup && popup.$popup.open(PopupExportComponent.withdrawal);
+                })
             }
         ]
     }

+ 11 - 1
src/popup/popup-personal/components/personal-data/data/footer.ts

@@ -21,7 +21,17 @@ export default [
     },
     {
         icon:require('../images/alipay.png'),
-        label:'支付宝认证'
+        label:'支付宝认证',
+        key:'is_ali',
+        dataObject:{
+            '0':{
+                label:'认证',
+                open: PopupExportComponent.alipay
+            },
+            '1':{
+                label: '已认证'
+            }
+        }
     },
 
 ]

+ 1 - 1
src/popup/popup-personal/components/personal-data/src/main.vue

@@ -129,7 +129,7 @@
       >
         <img :src="item.icon" class="personal-footer-icon"  />
         <div class="flex-1">{{item.label}}</div>
-        <div @click="triggerFooter(item.key && item.dataObject ? item.dataObject[user[item.key]]:undefined)" class="cursor-pointer personal-footer-button center">{{item.key && item.dataObject ? item.dataObject[user[item.key]].label :'认证'}}</div>
+        <div @click="triggerFooter(item.key && item.dataObject ? item.dataObject[user[item.key]]:undefined)" class="cursor-pointer personal-footer-button center">{{item.key && item.dataObject && item.dataObject[user[item.key]] ? item.dataObject[user[item.key]].label :'认证'}}</div>
       </div>
     </footer>
 

+ 1 - 1
src/popup/popup-personal/props.ts

@@ -8,7 +8,7 @@ export default {
     // 默认选中的
     page:{
         type: String,
-        default:'myWallet'
+        default:'personalData'
     }
 
 }

+ 3 - 70
src/popup/popup-recharge/mixins/handle.ts

@@ -76,8 +76,7 @@ export default <LibMixins>{
             }).then((data)=>{
 
                 if (data.isSuccess) {
-                    window.open(data.data);
-                    this.setWaitPattern();
+                    this.triggerPayEnd(data.data);
                 }
 
                 return obj.none();
@@ -86,74 +85,8 @@ export default <LibMixins>{
 
         },
 
-        // 设置等待模式
-        setWaitPattern(){
-
-            // 开启验证弹窗
-            this.openConfirm();
-
-            let nowTime = Math.floor(new Date().getTime() / 1000);
-
-            // 设置终止时间
-            this.pattern = setInterval(()=>{
-
-                let diff =  Math.floor(new Date().getTime()/1000) - nowTime;
-
-                // 如果满足任意一种主动释放 本次循环
-                if (document.hidden === true || document.hidden === undefined || diff <= 300) {
-                    clearInterval(this.pattern);
-                }
-
-                if (document.hidden === true) {
-                    this.checkPayStatus();
-                }
-
-
-            },1000);
-
-        },
-
-        // 打开弹窗
-        openConfirm(){
-            popup.$confirm({
-               title:'是否支付完成?',
-               confirmText:'支付完成',
-               cancelText:'未完成',
-               confirm:()=> this.checkPayStatus()
-            });
-        },
-
-        // 查看是否 支付成功
-        checkPayStatus(){
-
-            // 防止未清除掉
-            clearInterval(this.pattern);
-
-            // 关闭弹窗
-            popup.closeConfirm();
-
-            return this.$request({
-                url:'user/get_user_info',
-                token:true,
-                failMessage:true,
-                loading:'验证中',
-                message: InstructionsMessageType.other
-            }).then((data)=>{
-
-                if (data.isSuccess) {
-                    if (data.data.integral !== this.user.integral) {
-
-                        this.user = data.data;
-
-                        popup.$toast('支付成功');
-                    } else {
-                        popup.$toast('支付未成功');
-                    }
-                }
-
-                return this.openConfirm();
-
-            }).catch(()=> this.openConfirm());
+        paySuccessCallback(){
+          return this.close();
         },
 
         openRecharge(){

+ 1 - 1
src/popup/popup-settle/components/fill-information/data/input.ts

@@ -62,7 +62,7 @@ export default function () {
                 label: '语音介绍',
                 warringLabel:'请确认您的麦克风正常',
                 key:'sound',
-                rules:'请录制语音介绍',
+                // rules:'请录制语音介绍',
                 component: LibDataComponents.audio
             },
             {

+ 8 - 1
src/popup/popup-settle/components/fill-information/mixins/handle.ts

@@ -38,7 +38,6 @@ export default <LibMixins>{
 
         submit(obj){
 
-            console.log(obj);
 
             return this.uploadImageAll(obj.data).then((resultData)=>{
 
@@ -50,6 +49,14 @@ export default <LibMixins>{
                     failMessage:true
                 }).then((data)=>{
                     if (data.isSuccess) {
+
+                        this.$store.commit('setGameItemStatus',{
+                            gid: resultData.gid,
+                            status:1
+                        });
+
+                        this.$store.dispatch('updateGameStatusPromise');
+
                         return this.close();
                     } else {
                         return obj.none();

+ 3 - 0
src/popup/popup-withdrawal/index.ts

@@ -0,0 +1,3 @@
+import main from './src/main.vue';
+
+export default main;

+ 77 - 0
src/popup/popup-withdrawal/mixins/handle.ts

@@ -0,0 +1,77 @@
+import verification, {VerificationType} from '$utils/verification';
+
+import popup from "$utils/tool/popup";
+
+export default <LibMixins>{
+
+    data(){
+      return{
+          moneyValue:'',
+          disabled:false
+      }
+    },
+
+
+    methods:{
+
+        allExChange(){
+
+            if (this.disabled) return;
+
+            let intMoney = parseInt(this.$store.getters.money);
+
+            if (this.moneyValue !== intMoney) {
+                this.moneyValue = intMoney;
+            }
+        },
+
+        submitVerify(callback){
+
+            if (!verification.trigger[VerificationType.empty](this.moneyValue)) {
+                return popup.$toast('请输入提现金额');
+            } else if (this.moneyValue > this.$store.getters.money) {
+                return popup.$toast('提现金额不能大于余额');
+            }
+
+            return callback();
+
+        },
+
+        submit(obj){
+
+            let value = this.moneyValue;
+            return this.$request({
+                url:'user/user_withdrawal',
+                data:{
+                    money: value,
+                    code:'9999'
+                },
+                next:({status})=>{
+                    this.disabled = status;
+                },
+                token:true,
+                message:true,
+                failMessage:true
+            }).then((data)=>{
+
+                if (data.isSuccess) {
+
+                    this.user = {
+                        money: this.$store.getters.money - value
+                    }
+
+                    // 执行更新 补救措施
+                    this.$store.dispatch('updateUserMoneyPromise');
+
+                    return  this.close();
+                }
+
+                return obj.none();
+
+            }).catch(obj.none);
+
+        }
+
+    }
+
+}

+ 5 - 0
src/popup/popup-withdrawal/mixins/index.ts

@@ -0,0 +1,5 @@
+import popup from "$mixins/popup";
+import handle from './handle';
+import user from '$mixins/user';
+
+export default [popup,handle,user];

+ 71 - 0
src/popup/popup-withdrawal/src/main.vue

@@ -0,0 +1,71 @@
+<template>
+  <popup v-model:value="value" header-title="余额提现" header-style="green" content-animate="scale" @close="$emit('destroy-popup')">
+    <section class="recharge-container exchange-container relative jCenter withdrawal-container">
+      <div @click="close" class="recharge-close-wrap cursor-pointer absolute animate-rotate-hover">
+        <icon type="close" class="recharge-close"></icon>
+      </div>
+
+      <section class="screen">
+
+        <aside class="rowACenter exchange-item withdrawal-item-margin">
+          <div class="exchange-label">我的余额:</div>
+          <div class="flex-1">
+            <div class="line-1 exchange-value">{{$store.getters.money}}</div>
+          </div>
+        </aside>
+
+        <aside class="rowACenter exchange-item">
+          <div class="exchange-label">提现金额</div>
+          <div class="exchange-input-warp">
+            <a-input-number
+                class="recording-input screen exchange-input"
+                :min="1"
+                :precision="0"
+                v-model:value="moneyValue"
+                :max="$store.getters.money"
+                :disabled="disabled"
+            ></a-input-number>
+          </div>
+          <div @click="allExChange" class="exchange-all-button"
+            :class="{
+              'button-active': !disabled
+            }"
+          >全部兑换</div>
+        </aside>
+
+        <div class="center">
+          <v-button @submit-verify="submitVerify" @submit="submit" class="exchange-button withdrawal-button">立即兑换</v-button>
+        </div>
+
+
+      </section>
+
+    </section>
+  </popup>
+</template>
+
+<script>
+import {
+  Popup,
+  icon,
+  vButton
+} from '$components';
+import {
+  InputNumber
+} from 'ant-design-vue';
+import mixins from '../mixins';
+export default {
+  name: "popup-withdrawal",
+  components:{
+    Popup,
+    icon,
+    vButton,
+    [InputNumber.name]:InputNumber
+  },
+  mixins
+}
+</script>
+
+<style scoped lang="scss" src="../style.scss"></style>
+
+<style lang="scss" src="../../popup-exchange-coin/global.scss"></style>

+ 15 - 0
src/popup/popup-withdrawal/style.scss

@@ -0,0 +1,15 @@
+@import "../popup-message/style";
+@import "../popup-exchange-coin/style";
+
+.withdrawal-container{
+  height: 423px;
+  border-color: #15CBA2;
+}
+
+.withdrawal-item-margin{
+  margin-top: 40px;
+}
+
+.withdrawal-button{
+  margin-top: 60px;
+}

+ 3 - 0
src/popup/popup-wx-pay/index.ts

@@ -0,0 +1,3 @@
+import main from './src/main.vue';
+
+export default main;

Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini