소스 검색

no message

laosan2382995021@163.com 4 년 전
부모
커밋
448bbd19a3
76개의 변경된 파일1922개의 추가작업 그리고 64개의 파일을 삭제
  1. 3 2
      public/index.html
  2. 2 2
      src/components/button/mixins/handle.ts
  3. 8 3
      src/components/file/mixins/handle.js
  4. 7 0
      src/components/sound-recording/mixins/handle.ts
  5. 16 0
      src/components/sound-recording/props.ts
  6. 2 2
      src/components/sound-recording/src/main.vue
  7. 1 0
      src/components/sound-recording/style.scss
  8. 2 0
      src/components/sound-recording/style/index.scss
  9. 19 0
      src/components/sound-recording/style/simplicity.scss
  10. 18 11
      src/components/upload/mixins/handle.ts
  11. 6 0
      src/components/upload/props.ts
  12. 2 3
      src/components/upload/src/main.vue
  13. 1 1
      src/components/v-image/mixins/size.ts
  14. 1 1
      src/components/v-image/props.ts
  15. 5 0
      src/mixins/cate.ts
  16. 3 0
      src/mixins/time.ts
  17. 7 7
      src/mixins/trigger/class/function.ts
  18. 5 8
      src/mixins/trigger/class/index.ts
  19. 1 2
      src/mixins/trigger/class/router.ts
  20. 3 0
      src/popup/popup-choosing/index.ts
  21. 105 0
      src/popup/popup-choosing/mixins/handle.ts
  22. 5 0
      src/popup/popup-choosing/mixins/index.ts
  23. 80 0
      src/popup/popup-choosing/src/main.vue
  24. 87 0
      src/popup/popup-choosing/style.scss
  25. 3 0
      src/popup/popup-export/components.ts
  26. 7 1
      src/popup/popup-export/const/index.ts
  27. 1 1
      src/popup/popup-export/global.ts
  28. 16 1
      src/popup/popup-personal/components/personal-data/data/footer.ts
  29. 19 0
      src/popup/popup-personal/components/personal-data/mixins/handle.ts
  30. 2 1
      src/popup/popup-personal/components/personal-data/mixins/index.ts
  31. 1 1
      src/popup/popup-personal/components/personal-data/src/main.vue
  32. 30 4
      src/popup/popup-real-name/data/input.ts
  33. 11 0
      src/popup/popup-real-name/global.scss
  34. BIN
      src/popup/popup-real-name/images/other.png
  35. BIN
      src/popup/popup-real-name/images/positive.png
  36. 109 0
      src/popup/popup-real-name/mixins/handle.ts
  37. 3 1
      src/popup/popup-real-name/mixins/index.ts
  38. 76 3
      src/popup/popup-real-name/src/main.vue
  39. 107 2
      src/popup/popup-real-name/style.scss
  40. 79 0
      src/popup/popup-settle/components/fill-information/data/input.ts
  41. BIN
      src/popup/popup-settle/components/fill-information/images/1.png
  42. BIN
      src/popup/popup-settle/components/fill-information/images/2.png
  43. BIN
      src/popup/popup-settle/components/fill-information/images/3.png
  44. BIN
      src/popup/popup-settle/components/fill-information/images/4.png
  45. BIN
      src/popup/popup-settle/components/fill-information/images/5.png
  46. BIN
      src/popup/popup-settle/components/fill-information/images/6.png
  47. BIN
      src/popup/popup-settle/components/fill-information/images/7.png
  48. BIN
      src/popup/popup-settle/components/fill-information/images/8.png
  49. 3 0
      src/popup/popup-settle/components/fill-information/index.ts
  50. 119 0
      src/popup/popup-settle/components/fill-information/mixins/handle.ts
  51. 3 0
      src/popup/popup-settle/components/fill-information/mixins/index.ts
  52. 7 0
      src/popup/popup-settle/components/fill-information/props.ts
  53. 149 0
      src/popup/popup-settle/components/fill-information/src/main.vue
  54. 127 0
      src/popup/popup-settle/components/fill-information/style.scss
  55. 65 0
      src/popup/popup-settle/components/skill-certification/data/input.ts
  56. 16 0
      src/popup/popup-settle/components/skill-certification/global.scss
  57. 3 0
      src/popup/popup-settle/components/skill-certification/index.ts
  58. 46 0
      src/popup/popup-settle/components/skill-certification/mixins/handle.ts
  59. 3 0
      src/popup/popup-settle/components/skill-certification/mixins/index.ts
  60. 7 0
      src/popup/popup-settle/components/skill-certification/props.ts
  61. 134 0
      src/popup/popup-settle/components/skill-certification/src/main.vue
  62. 82 0
      src/popup/popup-settle/components/skill-certification/style.scss
  63. 16 0
      src/popup/popup-settle/data/step.ts
  64. 3 0
      src/popup/popup-settle/index.ts
  65. 57 0
      src/popup/popup-settle/mixins/handle.ts
  66. 4 0
      src/popup/popup-settle/mixins/index.ts
  67. 8 0
      src/popup/popup-settle/props.ts
  68. 64 0
      src/popup/popup-settle/src/main.vue
  69. 55 0
      src/popup/popup-settle/style.scss
  70. 32 2
      src/store/modules/cate.ts
  71. 2 2
      src/types/trigger-data.d.ts
  72. 13 1
      src/utils/verification/const/index.ts
  73. 25 0
      src/utils/verification/format.ts
  74. 7 0
      src/utils/verification/index.ts
  75. 17 1
      src/views/view-footer/data/control.ts
  76. 2 1
      src/views/view-footer/mixins/index.ts

+ 3 - 2
public/index.html

@@ -63,10 +63,11 @@
           window.console = (function () {
 
               var c = {
-                  log: window.console.log
+                  log: window.console.log,
+                  error:window.console.error
               };
 
-              c.warn = c.debug = c.info = c.error = c.time = c.dir = c.profile = c.clear = c.exception = c.trace = c.assert = function () { };
+              c.warn = c.debug = c.info = c.time = c.dir = c.profile = c.clear = c.exception = c.trace = c.assert = function () { };
 
               return c;
 

+ 2 - 2
src/components/button/mixins/handle.ts

@@ -27,8 +27,8 @@ export default <LibMixins>{
         trigger(){
             if (this.disabled || this._status === Status.success || this._status === Status.loading) return;
 
-            if (this.$attrs.onClick) {
-                return this.$emit('click');
+            if (this.$attrs.onPress) {
+                return this.$emit('press');
             }
 
             if (this.$attrs.onSubmitVerify) {

+ 8 - 3
src/components/file/mixins/handle.js

@@ -6,13 +6,18 @@ export default {
 		}
 	},
 
+	emits:['change'],
+
 	methods:{
 
 		onChange:function () {
-			this.$emit('change',this.input.files);
 
-			if (this.clear) {
-				this.input.value = '';
+			if (this.input.value) {
+				this.$emit('change',this.input.files);
+
+				if (this.clear) {
+					this.input.value = '';
+				}
 			}
 
 		},

+ 7 - 0
src/components/sound-recording/mixins/handle.ts

@@ -110,6 +110,7 @@ export default <LibMixins>{
                       // 设置资源
                       this.setAssets(data.blob);
                       this.setAudioStatus(AudioStatus.loading);
+
                       // 设置路径
                       file.createdPath(data.blob).then((data)=>{
                           return this.switchSrc(data);
@@ -146,6 +147,9 @@ export default <LibMixins>{
                 this.stroageBlob = blob;
                 this.assets = true;
                 this.stroageUpload = null;
+                if (!this.upload) {
+                    this.$emit('update:value',blob);
+                }
             }
         },
 
@@ -155,6 +159,9 @@ export default <LibMixins>{
                 this.assets = false;
                 this.stroageBlob = null;
                 this.stroageUpload = null;
+                if (!this.upload) {
+                    this.$emit('update:value',undefined);
+                }
             }
         }
 

+ 16 - 0
src/components/sound-recording/props.ts

@@ -16,6 +16,22 @@ export default {
     src:{
         type:String,
         default:''
+    },
+
+    // 样式类型
+    /*
+    *   default 默认
+    *   simplicity 简约
+    * */
+    type:{
+        type:String,
+        default:'default'
+    },
+
+    // 是否可以上传
+    upload:{
+        type: Boolean,
+        default: true
     }
 
 }

+ 2 - 2
src/components/sound-recording/src/main.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="screen">
+  <div class="screen" :class="['sound-'+type]">
 
     <!--  如果录音模块属于结束触发  -->
     <section class="screen center" v-if="SoundStatus.end !== soundStatus">
@@ -64,7 +64,7 @@
           'cursor-pointer': constStatus.loading !== status
         }"
         @click="submitAssets"
-        v-if="assets"
+        v-if="assets&&upload"
       >
         <svg v-if="constStatus.none === status" t="1622600601691" class="recording-close-icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3301" width="200" height="200">
           <defs>

+ 1 - 0
src/components/sound-recording/style.scss

@@ -1,3 +1,4 @@
+@import "style/index";
 /* 录音模块 */
 .sound-recording{
   height: 38px;

+ 2 - 0
src/components/sound-recording/style/index.scss

@@ -0,0 +1,2 @@
+// 简约风格
+@import "simplicity";

+ 19 - 0
src/components/sound-recording/style/simplicity.scss

@@ -0,0 +1,19 @@
+.sound-simplicity .sound-recording-title{
+  display: none;
+}
+
+.sound-simplicity .sound-recording{
+  background: transparent;
+  border: 2px solid #00D39E;
+}
+
+.sound-simplicity .sound-icon{
+  background-color: #00D39E;
+}
+.sound-simplicity .sound-title{
+  font-size: 14px;
+}
+
+.sound-simplicity .audio-modal{
+  margin:0;
+}

+ 18 - 11
src/components/upload/mixins/handle.ts

@@ -43,8 +43,10 @@ export default <LibMixins>{
 
             if (this.status === Status.loading) return ;
 
-            // 设置当前状态
-            this.setStatus(Status.loading);
+            if (this.upload) {
+                // 设置当前状态
+                this.setStatus(Status.loading);
+            }
 
             // 获取文件
             file = file[0];
@@ -56,6 +58,7 @@ export default <LibMixins>{
             this.uploadItem = null;
 
             if (retry) {
+
                 // 如果设置图片压缩触发
                 return this.triggerUpload(file);
             } else {
@@ -68,9 +71,9 @@ export default <LibMixins>{
                     } else {
                         return this.triggerUpload(file);
                     }
-                }).catch(()=>{
+                }).catch((fail)=>{
                     this.setSrc('');
-                    return  this.triggerUpload(file)
+                    return this.triggerUpload(file)
                 });
             }
         },
@@ -83,16 +86,22 @@ export default <LibMixins>{
             }).catch(()=>  this.triggerUpload(file));
         },
 
-        // 执行上传操作
-        triggerUpload(file){
-
-            $request.uploadFile({
+        triggerUploadPromise(file){
+            return $request.uploadFile({
                 url:'hxupload/img_upload',
                 data:{
                     file
                 },
                 token:true
-            }).then((data)=>{
+            });
+        },
+
+        // 执行上传操作
+        triggerUpload(file){
+
+            if (!this.upload) return this.$emit('update:value',file);
+
+            this.triggerUploadPromise(file).then((data)=>{
 
                 if (data.isSuccess) {
 
@@ -103,7 +112,6 @@ export default <LibMixins>{
                 }
 
             }).catch(()=> this.setStatus(Status.fail));
-
         },
 
         triggerUploadSuccess(data){
@@ -112,7 +120,6 @@ export default <LibMixins>{
 
             !this.vSrc && this.setSrc(this.uploadItem.data);
 
-            console.log(this);
             if (this.$attrs.onUploadNext) {
                 return this.statusFetch(true,data.data);
             } else {

+ 6 - 0
src/components/upload/props.ts

@@ -30,6 +30,12 @@ export default {
         default: 500
     },
 
+    // 是否上传
+    upload:{
+        type:Boolean,
+        default:true
+    },
+
     // size 类型 small big
     size:{
         type:String,

+ 2 - 3
src/components/upload/src/main.vue

@@ -1,6 +1,6 @@
 <template>
   <section class="screen upload-container overflow relative"
-    :class="['upload-container-'+size]"
+    :class="['upload-container-'+size,$attrs.class]"
   >
     <!--  上传照片  -->
     <section @click="triggerFile" class="screen cursor-pointer">
@@ -18,8 +18,7 @@
       :class="{
         'cursor-pointer': triggerImage
       }"
-      v-show="vSrc"
-      :show="!!vSrc"
+      v-if="vSrc"
       @click="triggerFile('image')"
     >
       <v-image :src="vSrc" class="screen" :mergeSuccessColor="true" backgroundColor="#fff">

+ 1 - 1
src/components/v-image/mixins/size.ts

@@ -45,7 +45,7 @@ export default <LibMixins> {
             return this.installSize();
         }
       },
-      show(value:boolean){
+     display(value:boolean){
           if (value === true && this.container && this.containerSize && this.containerSize.width <= 0 && this.containerSize.height <= 0) {
               this.containerSize = this.getElementSize(this.container);
 

+ 1 - 1
src/components/v-image/props.ts

@@ -177,7 +177,7 @@ export default {
     },
 
     /* 如果不希望通过body 获取 可以指定当前的显示状态 会根据显示的状态来设置获取 */
-    show:{
+    display:{
         type: Boolean,
         default:undefined
     }

+ 5 - 0
src/mixins/cate.ts

@@ -10,6 +10,11 @@ export default {
             get(){
                 return this.$store.state.cate.recommendGameCate;
             }
+        },
+        gameStatusCate:{
+            get(){
+                return this.$store.state.cate.gameStatusCate;
+            }
         }
     }
 

+ 3 - 0
src/mixins/time.ts

@@ -23,6 +23,7 @@ export default <LibMixins>{
 
             if (this.timeFormat) return;
 
+
             let resultData:LibData = undefined;
             for (let i=0,count=data.length;i<count;i++) {
                 if (item.code === data[i].key) {
@@ -33,6 +34,8 @@ export default <LibMixins>{
                 }
             }
 
+            console.log(item,data);
+
             if (resultData) {
                 resultData.key = 'mobile';
                 verification.verificationPromise(resultData,true).then((data)=>{

+ 7 - 7
src/mixins/trigger/class/function.ts

@@ -1,22 +1,22 @@
-import TriggerData, {Trigger} from "@/types/data";
+
 
 interface FunctionUseFunction {
-    (this:Vue, item:TriggerData, index:number): any
+    (this:LibMixins, item:TriggerData, index:number): any
 }
 
 interface FunctionUseAsyncFunction {
-    (this:Vue, item:TriggerData, index:number): Promise<FunctionUseFunction>
+    (this:LibMixins, item:TriggerData, index:number): Promise<FunctionUseFunction>
 }
 
 type FunctionUseParams = string | FunctionUseFunction | FunctionUseAsyncFunction;
 
-export default class FunctionTrigger extends Trigger {
+export default class FunctionTrigger implements Trigger {
 
     constructor(private triggerFunction:FunctionUseParams){
-        super();
+
     }
 
-    trigger(item: TriggerData, index: number, target: Vue): void {
+    trigger(item: TriggerData, index: number, target: LibMixins): void {
 
         if (typeof this.triggerFunction === 'string') {
             // @ts-ignore
@@ -31,7 +31,7 @@ export default class FunctionTrigger extends Trigger {
         }
     }
 
-    triggerTarget(trigger:FunctionUseFunction, item: TriggerData, index: number, target: Vue):any{
+    triggerTarget(trigger:FunctionUseFunction, item: TriggerData, index: number, target: LibMixins):any{
         if (typeof trigger === 'function') {
             return trigger.call(target,item,index);
         }

+ 5 - 8
src/mixins/trigger/class/index.ts

@@ -1,11 +1,8 @@
-import Router from './router';
+import RouterTrigger from './router';
 
 import FunctionTrigger from './function';
 
-export default <TriggerDataObject> {
-
-   [TriggerName.Router]: Router,
-
-   [TriggerName.Function]: FunctionTrigger
-
-}
+export {
+   FunctionTrigger,
+    RouterTrigger
+}

+ 1 - 2
src/mixins/trigger/class/router.ts

@@ -30,7 +30,7 @@ interface RouterAsyncFunction {
 // 可传入的参数列表
 type RouterUseParams = RouterUseDefaultParams | RouterFunction | RouterAsyncFunction;
 
-export default class Router extends Trigger {
+export default class Router implements Trigger {
 
     /* 跳转方式 */
     static routerMode = RouterMode;
@@ -43,7 +43,6 @@ export default class Router extends Trigger {
 
     // 构造器
     constructor(routerParams: RouterUseParams,config:RouterConfig | undefined = undefined){
-        super();
         /* 初始化设置 */
         this.config = config;
         this.routerParams = routerParams;

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

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

+ 105 - 0
src/popup/popup-choosing/mixins/handle.ts

@@ -0,0 +1,105 @@
+import {InstructionsMessageType} from "$utils/request";
+
+import popup from "$utils/tool/popup";
+import {PopupExportComponent} from "$popup/popup-export/const";
+
+export default <LibMixins>{
+
+    data(){
+      return {
+          statusData:{
+              '1':{
+                  label:'审核中',
+                  disabled:true
+              },
+              '2':{
+                  label:'已认证',
+                  disabled:true
+              },
+              '3':{
+                  label:'已拒绝'
+              }
+          }
+      }
+    },
+
+    methods:{
+
+        getGame(item){
+
+            if (this.statusData[item.status] && this.statusData[item.status].disabeld) return ;
+
+            if (this.loadingSatus) return ;
+            this.setLoadingStatus(true);
+
+            this.gameTime = setTimeout(()=>{
+                popup.$loading('选取中');
+            },500);
+
+            // @ts-ignore
+            return Promise.all([this.getGamePrice(),this.getGameDetail(item)]).then(([prices,detail])=>{
+
+                this.setLoadingStatus(false);
+                if (prices.isSuccess && detail.isSuccess) {
+                    // 如果都为真触发
+                    detail.data.priceList = prices.data;
+
+                    this.close();
+
+                    return popup.$popup && popup.$popup.open(PopupExportComponent.settle,{
+                        config: detail.data
+                    });
+
+                }
+
+            }).catch(()=>{
+                this.setLoadingStatus(false);
+            })
+
+        },
+
+        getGameDetail(item){
+
+            return this.$request({
+                url:'game/get_game_info',
+                data:{
+                    gid: item.gid
+                },
+                cache:true,
+                loading:'选取中',
+                failMessage:true,
+                message:InstructionsMessageType.other
+            });
+
+        },
+
+        getGamePrice(){
+            return this.$request({
+                url:'player/get_player_price_list',
+                token:true,
+                cache:true,
+                message:InstructionsMessageType.other,
+                failMessage:true,
+            })
+        },
+
+        setLoadingStatus(status:boolean){
+
+            if (this.loadingSatus !== status) {
+                clearTimeout(this.gameTime);
+                popup.hideLoading();
+                this.loadingSatus = status;
+            }
+        },
+
+        getCate(){
+            this.$store.dispatch('initializationGameStatusPromise');
+        }
+
+    },
+
+    created(){
+        this.getCate();
+    }
+
+}

+ 5 - 0
src/popup/popup-choosing/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];

+ 80 - 0
src/popup/popup-choosing/src/main.vue

@@ -0,0 +1,80 @@
+<template>
+  <popup v-model:value="value" content-animate="scale" @close="$emit('destroy-popup')">
+    <section class="choosing-skill-container flex relative">
+      <header class="rowACenter choosing-skill-header">
+        <div class="choosing-skill-title flex-1">选择技能</div>
+      </header>
+      <div @click="close" class="choosing-skill-close-wrap cursor-pointer absolute animate-rotate-hover">
+        <icon type="close" class="choosing-skill-close"></icon>
+      </div>
+
+      <section class="flex-1 overflow">
+
+        <scroll-view>
+          <aside
+              v-for="(item,index) in gameStatusCate"
+              :key="'skill-cate-'+index"
+              :class="{'skill-cate-margin':index!==0}"
+          >
+            <header class="row aCenter skill-header-item">
+              <div class="skill-header-icon"></div>
+              <div>{{item.label}}</div>
+            </header>
+
+            <section class="rowACenter wrap skill-header-content">
+              <template
+                  v-for="(item) in item.children"
+              >
+                <aside
+                    class="skill-item center"
+                    :key="'skill-'+item.gid"
+                    v-if="item.gid > 0"
+                    :class="{
+                      'skill-status-item': statusData[item.status],
+                      'skill-item-disabled': statusData[item.status] && statusData[item.status].disabled
+                    }"
+                    @click="getGame(item)"
+                >
+                  <v-image
+                      :src="item.game_ico"
+                      class="skill-icon"
+                      mode="center"
+                      backgroundColor="transparent"
+                  ></v-image>
+                  <div class="line-1">{{item.game_name}}</div>
+                  <div class="skill-status" v-if="statusData[item.status]">({{statusData[item.status].label}})</div>
+                </aside>
+              </template>
+            </section>
+
+          </aside>
+        </scroll-view>
+
+      </section>
+
+
+    </section>
+  </popup>
+</template>
+
+<script>
+import {
+  Popup,
+  icon,
+  vImage,
+  scrollView
+} from '$components';
+import mixins from '../mixins';
+export default {
+  name: "popup-choosing",
+  components:{
+    Popup,
+    icon,
+    vImage,
+    scrollView
+  },
+  mixins
+}
+</script>
+
+<style scoped lang="scss" src="../style.scss"></style>

+ 87 - 0
src/popup/popup-choosing/style.scss

@@ -0,0 +1,87 @@
+/* 容器 */
+.choosing-skill-container{
+  width: 856px;
+  height: 526px;
+  border: 2px solid #5F3CC6;
+  background-color: #342971;
+  border-radius: 10px;
+  padding: 25px 32px;
+}
+/* 容器 */
+
+/* 头部 */
+.choosing-skill-header{
+  margin-bottom: 8px;
+}
+.choosing-skill-title{
+  font-size: 18px;
+  font-weight: bold;
+  line-height: 25px;
+}
+.choosing-skill-close{
+  font-size: 18px;
+}
+.choosing-skill-close-wrap{
+  right: 20px;
+  top: 24px;
+}
+/* 头部 */
+
+/* 游戏分类的头部 */
+.skill-header-item {
+  font-size: 14px;
+  line-height: 18px;
+  color: #fff;
+  font-weight: 500;
+}
+.skill-cate-margin{
+  margin-top: 20px;
+}
+.skill-header-content{
+  margin-right: -14px;
+}
+.skill-item{
+  width: 86px;
+  height: 96px;
+  border-radius: 10px;
+  background-color: rgba(255,255,255,0.1);
+  margin-right: 14px;
+  margin-top: 15px;
+  font-size: 14px;
+  line-height: 25px;
+  cursor: pointer;
+  padding: 5px;
+  text-align: center;
+}
+.skill-item:hover{
+  background: $main-linear;
+}
+.skill-header-icon{
+  @include square(14px);
+  background: $main-linear;
+  border-radius: 50%;
+  margin-right: 7px;
+}
+.skill-icon{
+  @include square(42px);
+  margin-bottom: 5px;
+  flex-shrink: 0;
+}
+.skill-status{
+  font-size: 12px;
+  line-height: 14px;
+}
+.skill-item-disabled{
+  opacity: 0.7;
+  cursor: default;
+}
+.skill-item-disabled:hover{
+  background: rgba(255,255,255,0.1);
+}
+.skill-status-item .skill-icon {
+  margin-bottom: 2px;
+}
+.skill-status-item {
+  line-height: 20px;
+}
+/* 游戏分类的头部 */

+ 3 - 0
src/popup/popup-export/components.ts

@@ -8,4 +8,7 @@ export default {
     [PopupExportComponent.loading]: defineAsyncComponent(()=> import('$popup/popup-loading')),
     [PopupExportComponent.confirm]: defineAsyncComponent(()=> import('$popup/popup-confirm')),
     [PopupExportComponent.realName]:defineAsyncComponent(()=> import('$popup/popup-real-name')),
+    [PopupExportComponent.choosingSkill]: defineAsyncComponent(()=> import('$popup/popup-choosing')),
+    [PopupExportComponent.settle]: defineAsyncComponent(()=> import('$popup/popup-settle'))
+
 }

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

@@ -16,7 +16,13 @@ const enum PopupExportComponent {
     confirm='popup-confirm',
 
     // 实名认证
-    realName='popup-real-name'
+    realName='popup-real-name',
+
+    // 选择技能
+    choosingSkill='popup-choosing-skill',
+
+    //大神入驻
+    settle='popup-settle'
 
 }
 

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

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

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

@@ -1,8 +1,23 @@
+import {PopupExportComponent} from "$popup/popup-export/const";
+
 export default [
 
     {
         icon:require('../images/authentication.png'),
-        label:'实名认证'
+        label:'实名认证',
+        key:'is_real',
+        dataObject:{
+            '2':{
+                label:'认证',
+                open: PopupExportComponent.realName
+            },
+            '3':{
+                label: '审核中'
+            },
+            '1':{
+                label:'已认证'
+            }
+        }
     },
     {
         icon:require('../images/alipay.png'),

+ 19 - 0
src/popup/popup-personal/components/personal-data/mixins/handle.ts

@@ -0,0 +1,19 @@
+import popup from '$utils/tool/popup';
+
+export default <LibMixins> {
+
+    methods:{
+
+        triggerFooter(item){
+
+            if (item && item.open) {
+
+                return popup.$popup&&popup.$popup.open(item.open);
+
+            }
+
+        }
+
+    }
+
+}

+ 2 - 1
src/popup/popup-personal/components/personal-data/mixins/index.ts

@@ -1,5 +1,6 @@
 import info from './info';
 import assets from './assets';
 import user from '$mixins/user';
+import handle from './handle';
 
-export default [info,user,assets];
+export default [handle,info,user,assets];

+ 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 class="cursor-pointer personal-footer-button center">认证</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>
     </footer>
 

+ 30 - 4
src/popup/popup-real-name/data/input.ts

@@ -1,5 +1,7 @@
 import { VerificationType } from '$utils/verification/const';
 
+import user from '$config/user';
+
 export default function () {
 
     return {
@@ -8,7 +10,8 @@ export default function () {
             {
                 label:'真实姓名',
                 placeholder:'请输入姓名',
-                rules:''
+                rules:'',
+                key:'real_name',
             },
             {
                 label: '手机号',
@@ -16,12 +19,18 @@ export default function () {
                 rules:{
                     [VerificationType.empty]:'',
                     [VerificationType.mobile]:'手机号格式不正确'
-                }
+                },
+                value:user.user && user.user.user_name || '',
+                disabled:true,
+                key:'mobile',
+                maxLength:11
             },
             {
                 label:'验证码',
                 placeholder:'请输入验证码',
-                code:true,
+                code:'mobile',
+                codeType:'1',
+                key:'code',
                 rules:''
             },
             {
@@ -30,7 +39,24 @@ export default function () {
                 rules:{
                     [VerificationType.empty]:'',
                     [VerificationType.id]:'身份证号格式不正确'
-                }
+                },
+                key:'card_id',
+                maxLength:18
+            }
+        ] as LibDataArray,
+
+        right:[
+            {
+                label:'拍摄正面',
+                icon: require('../images/positive.png'),
+                key:'identity1',
+                rules:'请上传身份证正面'
+            },
+            {
+                label:'拍摄反面',
+                icon: require('../images/other.png'),
+                key:'identity2',
+                rules:'请上传身份证反面'
             }
         ] as LibDataArray
 

+ 11 - 0
src/popup/popup-real-name/global.scss

@@ -0,0 +1,11 @@
+/* 上传身份证 */
+.upload-real-item{
+  border-radius: 5px;
+  overflow: hidden;
+  width: 148px;
+  height: 122px;
+}
+.upload-real-item-margin{
+  margin-left: 23px;
+}
+/* 上传身份证 */

BIN
src/popup/popup-real-name/images/other.png


BIN
src/popup/popup-real-name/images/positive.png


+ 109 - 0
src/popup/popup-real-name/mixins/handle.ts

@@ -1,7 +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:'player/real_name_authentication',
+                token:true,
+                data: obj.data,
+                message: true
+            }).then((resultData)=>{
+                obj.none();
+                if (resultData.isSuccess) {
+
+                    this.user = { is_real:3 };
+
+                    return this.close();
+                }
+
+            }).catch(obj.fail);
+        }
+
     }
 
 }

+ 3 - 1
src/popup/popup-real-name/mixins/index.ts

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

+ 76 - 3
src/popup/popup-real-name/src/main.vue

@@ -9,6 +9,73 @@
         <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">{{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>
+
+        <div class="real-line"></div>
+
+        <aside class="upload-real jCenter">
+          <header class="rowACenter">
+            <div class="real-circular"></div>
+            <div class="real-input-label upload-real-label">上传身份证</div>
+          </header>
+          <section class="upload-real-group rowACenter">
+            <v-upload
+              :upload="false"
+              v-for="(item,index) in inputData.right"
+              :key="'real-upload-'+index"
+              class="upload-real-item"
+              :class="{'upload-real-item-margin':index!==0}"
+              v-model:value="item.value"
+              :ref="item.key"
+            >
+              <template v-slot:upload>
+                <section class="screen">
+                  <img class="upload-real-icon" :src="item.icon" />
+                  <div class="upload-real-input-label center">{{item.label}}</div>
+                </section>
+              </template>
+            </v-upload>
+          </section>
+        </aside>
+
+      </section>
+
+      <div class="center">
+          <v-button class="real-name-button" @submit-verify="submitVerify" @submit="submit">提交审核</v-button>
+      </div>
 
 
     </section>
@@ -19,17 +86,23 @@
 <script>
 import {
   Popup,
-  icon
+  icon,
+  vUpload,
+  vButton
 } from '$components';
 import mixins from '../mixins';
 export default {
   name: "popup-real-name",
   components:{
+    vButton,
     Popup,
-    icon
+    icon,
+    vUpload
   },
   mixins
 }
 </script>
 
-<style scoped lang="scss" src="../style.scss"></style>
+<style scoped lang="scss" src="../style.scss"></style>
+
+<style lang="scss" src="../global.scss"></style>

+ 107 - 2
src/popup/popup-real-name/style.scss

@@ -10,7 +10,7 @@
 
 /* 头部 */
 .real-name-header{
-  padding: 30px 60px 40px;
+  padding: 30px 60px 46px;
 }
 .real-name-title{
   font-size: 18px;
@@ -24,4 +24,109 @@
   right: 20px;
   top: 14px;
 }
-/* 头部 */
+/* 头部 */
+
+/* 步骤 */
+.real-name-screen{
+  height: 250px;
+}
+/* 步骤 */
+
+/* 输入框 */
+.input-real-container{
+  padding: 0 60px 0 55px;
+}
+.real-circular{
+  @include square(14px);
+  background: $main-linear;
+  border-radius: 50%;
+}
+.input-real-margin{
+  margin-top: 30px;
+}
+.real-input-label{
+  font-size: 14px;
+  line-height: 18px;
+  color: #fff;
+  width: 76px;
+  padding-left: 8px;
+  padding-right: 10px;
+}
+.real-input-container{
+  width: 260px;
+  height: 40px;
+  border-radius: 20px;
+  background-color: rgba(255,255,255,0.1);
+  padding: 0 23px;
+}
+.real-input-container input {
+  font-size: 14px;
+  line-height: 16px;
+  font-weight: 400;
+  color: #fff;
+}
+.real-input-container input::placeholder{
+  color: #C1BED5;
+}
+/* 输入框 */
+
+/* 验证码按钮 */
+.real-code-button{
+  width: 84px;
+  height: 26px;
+  border: 1px solid #fff;
+  border-radius: 13px;
+  font-size: 12px;
+  line-height: 14px;
+  color: #fff;
+  font-weight: 400;
+  margin-right: -13px;
+  cursor: pointer;
+}
+.real-code-disabled{
+  cursor: default;
+  border-color: #C1BED5;
+  color:#C1BED5;
+}
+/* 验证码按钮 */
+
+/* 线 */
+.real-line{
+  width: 1px;
+  height:100%;
+  background-color: #eee;
+}
+/* 线 */
+
+/* 上传 */
+.upload-real{
+  margin-left: 36px;
+  height: 100%;
+}
+.upload-real-label{
+  margin-left: 10px;
+  padding: 0;
+  width: auto;
+}
+.upload-real-group{
+  margin-top: 30px;
+}
+.upload-real-icon{
+  width: 100%;
+  height: 94px;
+}
+.upload-real-input-label{
+  background-color: #6A8CFA;
+  height: 28px;
+  font-size: 12px;
+  line-height: 14px;
+  font-weight: 500;
+}
+/* 上传 */
+
+/* 按钮 */
+.real-name-button{
+  width: 276px;
+  margin-top: 64px;
+}
+/* 按钮 */

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

@@ -0,0 +1,79 @@
+import { LibDataComponents } from '$utils/verification/const';
+
+// import user from '$config/user';
+
+export default function () {
+
+    return {
+
+        left: [
+            {
+                label: '封面(认证需要美观的真人头像,请按照右侧规范检查一下当前封面)',
+                key: 'cover_image',
+                rules: '请选择封面',
+                component: LibDataComponents.upload,
+                data:[
+                    {
+                        label:'标准头像',
+                        icon:require('../images/1.png'),
+                        status:true
+                    },
+                    {
+                        label: '面部遮挡',
+                        icon:require('../images/2.png'),
+                    },
+                    {
+                        label: '面部遮挡',
+                        icon:require('../images/3.png'),
+                    },
+                    {
+                        label: '合照',
+                        icon:require('../images/4.png'),
+                    },
+                    {
+                        label: '网红',
+                        icon:require('../images/5.png'),
+                    },
+                    {
+                        label: '暴漏色情',
+                        icon:require('../images/6.png'),
+                    },
+                    {
+                        label: '带有文字',
+                        icon:require('../images/7.png'),
+                    },
+                    {
+                        label: '表情包',
+                        icon:require('../images/8.png'),
+                    }
+                ]
+            }
+        ] as unknown as LibDataArray,
+
+        right:[
+            // {
+            //     label: '昵称',
+            //     key:'price',
+            //     placeholder: '请输入昵称',
+            //     value: user.user && user.user.nick_name,
+            //     rules:''
+            // },
+            {
+                label: '语音介绍',
+                warringLabel:'请确认您的麦克风正常',
+                key:'sound',
+                rules:'请录制语音介绍',
+                component: LibDataComponents.audio
+            },
+            {
+                label: '陪玩介绍',
+                key:'introduction',
+                placeholder: '不可涉黄,不可私自定价,可以介绍自己的特色技能,如游戏等级!',
+                rules:'请输入陪玩介绍',
+                component: LibDataComponents.textarea
+            }
+        ] as unknown as LibDataArray
+
+    }
+
+}

BIN
src/popup/popup-settle/components/fill-information/images/1.png


BIN
src/popup/popup-settle/components/fill-information/images/2.png


BIN
src/popup/popup-settle/components/fill-information/images/3.png


BIN
src/popup/popup-settle/components/fill-information/images/4.png


BIN
src/popup/popup-settle/components/fill-information/images/5.png


BIN
src/popup/popup-settle/components/fill-information/images/6.png


BIN
src/popup/popup-settle/components/fill-information/images/7.png


BIN
src/popup/popup-settle/components/fill-information/images/8.png


+ 3 - 0
src/popup/popup-settle/components/fill-information/index.ts

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

+ 119 - 0
src/popup/popup-settle/components/fill-information/mixins/handle.ts

@@ -0,0 +1,119 @@
+import inputData from '../data/input';
+
+import verification from '$utils/verification';
+
+import {LibDataComponents} from '$utils/verification/const';
+
+
+export default <LibMixins>{
+
+    data(){
+        return {
+            inputData:inputData(),
+
+            components: LibDataComponents
+        }
+    },
+
+    inject:['setResultData','setStep','close'],
+
+    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)=>{
+                resultData.sound_duration = this.$refs.sound && this.$refs.sound.countdown || 3;
+                return callback(this.setResultData(resultData));
+            });
+
+        },
+
+        submit(obj){
+
+            console.log(obj);
+
+            return this.uploadImageAll(obj.data).then((resultData)=>{
+
+                this.$request({
+                    url:'player/apply_play_game',
+                    data: resultData,
+                    token:true,
+                    message:true,
+                    failMessage:true
+                }).then((data)=>{
+                    if (data.isSuccess) {
+                        return this.close();
+                    } else {
+                        return obj.none();
+                    }
+                }).catch(obj.fail);
+
+            }).catch(obj.fail);
+
+        },
+
+        // 执行图片上传
+        uploadImageAll(resultData){
+
+            return new Promise((resolve, reject)=>{
+
+                let upload = [];
+                for (let key in resultData) {
+                    if (resultData.hasOwnProperty(key)) {
+                        let item = resultData[key];
+                        // 如果为文件触发
+                        if (item instanceof File || item instanceof Blob) {
+                            upload.push(this.uploadFile(resultData,key,item));
+                        }
+                    }
+                }
+
+                if (upload.length > 0) {
+                    Promise.all(upload).then(()=>{
+                        return resolve(resultData);
+                    }).catch(reject);
+                } else {
+                    return resolve(resultData);
+                }
+
+            });
+
+        },
+
+        uploadFile(resultData,key,file){
+
+            return new Promise<void>( (resolve, reject)=>{
+
+                // @ts-ignore
+                this.$request.uploadFile({
+                    url:'hxupload/img_upload',
+                    data:{
+                        file:file
+                    },
+                    token:true
+                }).then((data)=>{
+
+                    if (data.isSuccess)  {
+                        resultData[key] = data.data;
+                        resolve();
+                    } else {
+                        reject();
+                    }
+
+                }).catch(reject);
+
+            });
+
+        }
+
+    }
+
+}

+ 3 - 0
src/popup/popup-settle/components/fill-information/mixins/index.ts

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

+ 7 - 0
src/popup/popup-settle/components/fill-information/props.ts

@@ -0,0 +1,7 @@
+export default {
+
+    config:{
+        type:Object
+    }
+
+}

+ 149 - 0
src/popup/popup-settle/components/fill-information/src/main.vue

@@ -0,0 +1,149 @@
+<template>
+    <section class="screen fill-container">
+
+      <section class="skill-cer-screen row jCenter relative">
+
+        <aside class="jCenter fill-info-left">
+
+          <div
+            v-for="(item,index) in inputData.left"
+            :key="'input-left-'+index"
+          >
+
+            <template
+              v-if="components.upload === item.component"
+            >
+              <header class="skill-header fill-info-header row aCenter">
+                <div class="skill-cer-icon"></div>
+                <div>{{item.label}}</div>
+              </header>
+              <section class="rowACenter">
+                <section class="fill-info-upload">
+                  <v-upload
+                      :upload="false"
+                      v-model:value="item.value"
+                      upload-text="选择封面"
+                  >
+
+                  </v-upload>
+                </section>
+                <section class="row wrap fill-info-photo">
+                  <aside
+                    v-for="(item,index) in item.data"
+                    :key="'user-photo-'+index"
+                    class="fill-info-item center"
+                  >
+                    <img :src="item.icon" />
+                    <div class="row center">
+                      <div class="fill-info-icon center"
+                        :class="{'fill-icon-success':item.status}"
+                      >
+                        <svg t="1622880092411" v-if="item.status" class="screen" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4312" width="200" height="200"><path d="M416.832 798.08C400.64 798.08 384.512 791.872 372.16 779.52L119.424 525.76C94.784 500.992 94.784 460.8 119.424 436.032 144.128 411.264 184.128 411.264 208.768 436.032L416.832 644.928 814.4 245.76C839.04 220.928 879.04 220.928 903.744 245.76 928.384 270.528 928.384 310.656 903.744 335.424L461.504 779.52C449.152 791.872 432.96 798.08 416.832 798.08Z" p-id="4313" fill="#ffffff"></path></svg>
+                        <svg t="1622879980730" v-else class="screen" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3457" width="200" height="200"><path d="M882.048 209.216L209.28 882.048c-18.624 18.56-48.768 18.56-67.328 0s-18.56-48.704 0-67.328L814.72 141.952c18.624-18.56 48.768-18.56 67.328 0 18.56 18.56 18.56 48.704 0 67.264z" fill="#ffffff" p-id="3458"></path><path d="M882.048 882.048c-18.56 18.56-48.704 18.56-67.328 0L141.952 209.216c-18.56-18.624-18.56-48.704 0-67.264 18.56-18.56 48.704-18.56 67.328 0L882.048 814.72c18.56 18.624 18.56 48.768 0 67.328z" fill="#ffffff" p-id="3459"></path></svg>
+                      </div>
+                      <div>{{item.label}}</div>
+                    </div>
+                  </aside>
+                </section>
+              </section>
+            </template>
+          </div>
+
+        </aside>
+
+        <div class="skill-cer-line fill-line"></div>
+
+        <aside class="skill-cer-right jCenter">
+
+          <aside
+               v-for="(item,index) in inputData.right"
+               :key="'input-right-'+index"
+          >
+
+            <template v-if="components.textarea === item.component">
+              <header class="skill-header row aCenter">
+                <div class="skill-cer-icon"></div>
+                <div>{{item.label}}</div>
+              </header>
+
+              <div class="fill-textarea-container">
+                <textarea class="fill-textarea"
+                    :placeholder="item.placeholder"
+                    v-model="item.value"
+                ></textarea>
+              </div>
+            </template>
+
+            <template v-else-if="components.audio === item.component">
+              <header class="skill-header row aCenter">
+                <div class="skill-cer-icon"></div>
+                <div>{{item.label}}</div>
+                <div v-if="item.warringLabel" class="fill-warring-label">{{item.warringLabel}}</div>
+              </header>
+
+              <section class="fill-audio">
+                <sound-recording ref="sound" :upload="false" v-model:value="item.value" type="simplicity"></sound-recording>
+              </section>
+
+            </template>
+
+            <template v-else>
+
+              <section class="rowACenter fill-input-warp">
+                <header class="skill-header fill-input-header row aCenter">
+                  <div class="skill-cer-icon"></div>
+                  <div>{{item.label}}</div>
+                </header>
+                <div class="flex-1 fill-input">
+                  <input class="screen fill-input-target" :placeholder="item.placeholder" v-model="item.value" />
+                </div>
+
+              </section>
+
+            </template>
+
+
+          </aside>
+
+        </aside>
+
+      </section>
+
+      <div class="center">
+          <v-button class="real-name-button fill-button" @submit="submit" @submit-verify="submitVerify" >下一步</v-button>
+      </div>
+
+
+    </section>
+</template>
+
+<script>
+import {
+  icon,
+  vUpload,
+  vButton,
+  vImage,
+  soundRecording
+} from '$components';
+import {
+  Select
+} from 'ant-design-vue';
+import props from '../props';
+import mixins from '../mixins';
+export default {
+  name: "fill-information",
+  components:{
+    vImage,
+    vButton,
+    icon,
+    vUpload,
+    [Select.name]:Select,
+    [Select.Option.displayName]:Select.Option,
+    soundRecording
+  },
+  props,
+  mixins
+}
+</script>
+
+<style scoped lang="scss" src="../style.scss"></style>

+ 127 - 0
src/popup/popup-settle/components/fill-information/style.scss

@@ -0,0 +1,127 @@
+@import "../skill-certification/style";
+
+/* 容器 */
+.fill-container{
+  margin-top: 10px;
+}
+.fill-container .skill-header{
+ font-size: 12px;
+}
+/* 容器 */
+
+/* 左侧 */
+.fill-info-left{
+  width: 440px;
+  flex-shrink: 0;
+}
+.fill-info-header{
+  margin-bottom: 30px;
+}
+.fill-info-upload{
+  @include square(100px);
+  flex-shrink: 0;
+}
+.fill-info-photo{
+  font-size: 12px;
+  color: #fff;
+  line-height: 25px;
+  margin-left: 27px;
+}
+.fill-info-item {
+  margin-right: 25px;
+  margin-top: 17px;
+  width: 58px;
+  white-space: nowrap;
+}
+.fill-info-item:nth-of-type(4n){
+  margin-right: 0;
+}
+.fill-info-item img{
+  @include square(58px);
+  margin-bottom: 4px;
+}
+.fill-info-icon{
+  @include square(12px);
+  padding: 2px;
+  border-radius: 50%;
+  background-color: #ff0100;
+  margin-right: 2px;
+
+}
+.fill-icon-success{
+  background-color: #06e07f;
+}
+/* 左侧 */
+
+/* 线 */
+.fill-line{
+  margin: 0 25px;
+  flex-shrink: 0;
+}
+/* 线 */
+
+/* input */
+.fill-input-warp{
+  margin-bottom: 20px;
+}
+.fill-input-header{
+  margin-right: 8px;
+}
+.fill-input{
+  width: 238px;
+  height: 40px;
+  border-radius: 20px;
+  padding: 0 10px;
+}
+/* input */
+
+/* textarea */
+.fill-textarea-container{
+  width: 270px;
+  height: 92px;
+  margin-top: 10px;
+  margin-left: 10px;
+  padding: 6px 0;
+  border-radius: 10px;
+
+}
+.fill-input,.fill-textarea-container{
+  background-color: rgba(255,255,255,0.1);
+}
+.fill-textarea{
+  height: 80px;
+  width: 100%;
+  resize: none;
+  padding: 0 8px;
+}
+.fill-input-target,.fill-textarea{
+  font-size: 12px;
+  line-height: 16px;
+  color: #fff;
+}
+.fill-textarea::placeholder,.fill-input-target::placeholder{
+  color: rgba(255,255,255,0.5);
+}
+/* textarea */
+
+/* audio */
+.fill-warring-label{
+  margin-left: 13px;
+  color: #FF9D96;
+  font-size: 12px;
+  line-height: 25px;
+}
+.fill-audio{
+  width: 158px;
+  margin-left: 10px;
+  margin-top: 10px;
+  margin-bottom: 15px;
+
+}
+/* audio */
+
+/* 按钮 */
+.fill-button{
+  margin-top: 30px;
+}
+/* 按钮 */

+ 65 - 0
src/popup/popup-settle/components/skill-certification/data/input.ts

@@ -0,0 +1,65 @@
+import { LibDataComponents } from '$utils/verification/const';
+
+import format from '$utils/verification/format';
+
+export default function (data) {
+
+    let gameLevelName = format.formatData(data.skill_level_list, {
+        label: 'game_level_name',
+        value: 'lid'
+    });
+
+    let priceName = format.formatData(data.priceList, {
+        label: '/小时',
+        value: ''
+    });
+
+    return {
+
+        left: [
+            {
+                label: '上传图片(请上传游戏等级或娱乐资质相关图片)',
+                key: 'skill_image',
+                rules: '请上传图片',
+                component: LibDataComponents.upload
+            },
+            {
+                label: '段位选择',
+                data: gameLevelName,
+                value: gameLevelName[0] && gameLevelName[0].value || '',
+                placeholder: '请选择段位',
+                key:'skill_level',
+                component: LibDataComponents.picker
+            }
+        ] as unknown as LibDataArray,
+
+        right:[
+            {
+                label: '价格选择',
+                data: priceName,
+                key:'price',
+                value: priceName[0] && priceName[0].value || '',
+                placeholder: '请选择价格',
+                component: LibDataComponents.picker
+            },
+            // {
+            //     label: '性别选择',
+            //     data: [
+            //         {
+            //             label:'男',
+            //             value:1
+            //         },
+            //         {
+            //             label: '女',
+            //             value:0
+            //         }
+            //     ],
+            //     value:0,
+            //     placeholder: '请选择性别',
+            //     component: LibDataComponents.picker
+            // }
+        ] as unknown as LibDataArray
+
+    }
+
+}

+ 16 - 0
src/popup/popup-settle/components/skill-certification/global.scss

@@ -0,0 +1,16 @@
+/* 选择 */
+.skill-select-target .ant-select-selector{
+  background-color: transparent !important;
+  border: none !important;
+  height: 100% !important;
+  outline: none !important;
+  box-shadow: none !important;
+  color: #fff !important;
+}
+.skill-select-target .ant-select-arrow{
+  display: none;
+}
+.skill-select-target .ant-select-selection-item{
+  color: #fff !important;
+}
+/* 选择 */

+ 3 - 0
src/popup/popup-settle/components/skill-certification/index.ts

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

+ 46 - 0
src/popup/popup-settle/components/skill-certification/mixins/handle.ts

@@ -0,0 +1,46 @@
+import inputData from '../data/input';
+
+import verification from '$utils/verification';
+
+import {LibDataComponents} from '$utils/verification/const';
+
+
+export default <LibMixins>{
+
+    data(){
+        return {
+            inputData:{},
+
+            components: LibDataComponents
+        }
+    },
+
+    inject:['setResultData','setStep'],
+
+    methods:{
+
+        submitVerify(){
+
+            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)=>{
+                this.setResultData(resultData);
+                return this.setStep(2);
+
+            });
+
+        }
+
+    },
+
+    created(){
+        this.inputData = inputData(this.config);
+    }
+
+}

+ 3 - 0
src/popup/popup-settle/components/skill-certification/mixins/index.ts

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

+ 7 - 0
src/popup/popup-settle/components/skill-certification/props.ts

@@ -0,0 +1,7 @@
+export default {
+
+    config:{
+        type:Object
+    }
+
+}

+ 134 - 0
src/popup/popup-settle/components/skill-certification/src/main.vue

@@ -0,0 +1,134 @@
+<template>
+    <section class="screen relative">
+
+      <section class="skill-cer-screen row jCenter relative">
+
+        <aside class="jCenter skill-cer-left">
+
+          <div
+            v-for="(item,index) in inputData.left"
+            :key="'input-left-'+index"
+          >
+
+            <template
+              v-if="components.upload === item.component"
+            >
+              <header class="skill-header row aCenter">
+                <div class="skill-cer-icon"></div>
+                <div>{{item.label}}</div>
+              </header>
+              <section class="skill-cer-upload">
+                <v-upload
+                  :upload="false"
+                  v-model:value="item.value"
+                >
+
+                </v-upload>
+              </section>
+            </template>
+            <template v-else>
+
+              <aside class="rowACenter skill-select-item">
+
+                <header class="skill-header row aCenter">
+                  <div class="skill-cer-icon"></div>
+                  <div>{{item.label}}</div>
+                </header>
+
+                <div class="flex-1"></div>
+
+                <aside class="skill-select relative">
+                  <a-select v-model:value="item.value" class="screen skill-select-target" :placeholder="item.placeholder">
+                    <a-select-option
+                      v-for="(cItem) in item.data"
+                      :key="'option-'+cItem.value"
+                      :value="cItem.value"
+                    >{{cItem.label}}</a-select-option>
+                  </a-select>
+                  <svg t="1622876349167" class="absolute skill-select-down" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3183" width="200" height="200"><path d="M878.592 250.88q29.696 0 48.128 11.264t24.576 29.696 0 41.472-26.624 45.568q-82.944 92.16-159.744 180.224t-148.48 164.864q-19.456 20.48-45.568 31.744t-53.76 11.776-53.248-8.704-43.008-28.672q-39.936-44.032-82.944-90.112l-88.064-92.16q-43.008-46.08-85.504-90.624t-79.36-86.528q-17.408-19.456-22.528-40.448t1.024-38.4 23.552-28.672 45.056-11.264q35.84 0 98.816-0.512t137.728-0.512l153.6 0 150.528 0 125.952 0 79.872 0z" p-id="3184"></path></svg>
+                </aside>
+
+              </aside>
+
+            </template>
+
+
+          </div>
+
+        </aside>
+
+        <div class="skill-cer-line"></div>
+
+        <aside class="skill-cer-right jCenter">
+
+          <header class="skill-examples">
+            <div class="skill-examples-title">示例图</div>
+            <v-image class="skill-examples-image" :src="config.skill_image"></v-image>
+          </header>
+
+          <aside class="rowACenter skill-select-item"
+               v-for="(item,index) in inputData.right"
+               :key="'input-right-'+index"
+          >
+
+            <header class="skill-header row aCenter">
+              <div class="skill-cer-icon"></div>
+              <div>{{item.label}}</div>
+            </header>
+
+            <div class="flex-1"></div>
+
+            <aside class="skill-select relative">
+              <a-select v-model:value="item.value" class="screen skill-select-target" :placeholder="item.placeholder">
+                <a-select-option
+                    v-for="(cItem) in item.data"
+                    :key="'option-'+cItem.value"
+                    :value="cItem.value"
+                >{{cItem.label}}</a-select-option>
+              </a-select>
+              <svg t="1622876349167" class="absolute skill-select-down" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3183" width="200" height="200"><path d="M878.592 250.88q29.696 0 48.128 11.264t24.576 29.696 0 41.472-26.624 45.568q-82.944 92.16-159.744 180.224t-148.48 164.864q-19.456 20.48-45.568 31.744t-53.76 11.776-53.248-8.704-43.008-28.672q-39.936-44.032-82.944-90.112l-88.064-92.16q-43.008-46.08-85.504-90.624t-79.36-86.528q-17.408-19.456-22.528-40.448t1.024-38.4 23.552-28.672 45.056-11.264q35.84 0 98.816-0.512t137.728-0.512l153.6 0 150.528 0 125.952 0 79.872 0z" p-id="3184"></path></svg>
+            </aside>
+
+          </aside>
+
+        </aside>
+
+      </section>
+
+      <div class="center">
+          <v-button class="real-name-button" @submit-verify="submitVerify" >下一步</v-button>
+      </div>
+
+
+    </section>
+</template>
+
+<script>
+import {
+  icon,
+  vUpload,
+  vButton,
+  vImage
+} from '$components';
+import {
+  Select
+} from 'ant-design-vue';
+import props from '../props';
+import mixins from '../mixins';
+export default {
+  name: "skill-certification",
+  components:{
+    vImage,
+    vButton,
+    icon,
+    vUpload,
+    [Select.name]:Select,
+    [Select.Option.displayName]:Select.Option,
+  },
+  props,
+  mixins
+}
+</script>
+
+<style scoped lang="scss" src="../style.scss"></style>
+<style lang="scss" src="../global.scss"></style>

+ 82 - 0
src/popup/popup-settle/components/skill-certification/style.scss

@@ -0,0 +1,82 @@
+
+
+/* 步骤 */
+.skill-cer-screen{
+  height: 256px;
+}
+/* 步骤 */
+
+/* 基本标识符 */
+.skill-header{
+  font-size: 14px;
+  line-height: 25px;
+  white-space: nowrap;
+  font-weight: 500;
+}
+.skill-cer-icon{
+  @include square(14px);
+  background: $main-linear;
+  border-radius: 50%;
+  margin-right: 10px;
+  flex-shrink: 0;
+}
+/* 基本标识符 */
+
+/* 左侧 */
+.skill-cer-left,.skill-cer-right{
+  width: 300px;
+}
+.skill-cer-upload{
+  width: 100%;
+  height: 168px;
+  margin-top: 12px;
+}
+.skill-select-item{
+  margin-top: 22px;
+  width: 100%;
+}
+.skill-select{
+  width: 174px;
+  height: 30px;
+  border-radius: 14px;
+  background-color: rgba(255,255,255,0.1);
+}
+.skill-select-down{
+  @include square(12px);
+  fill: #fff;
+  right: 13px;
+  top: 9px;
+  pointer-events: none;
+}
+/* 左侧 */
+
+/* 中间线 */
+.skill-cer-line{
+  margin: 0 50px;
+  width: 1px;
+  background-color: #EEEEEE;
+}
+/* 中间线 */
+
+/* 右侧 */
+.skill-examples-title{
+  font-size: 14px;
+  line-height: 25px;
+  color: #fff;
+}
+.skill-examples-image{
+  width: 200px;
+  height: 112px;
+  margin-top: 6px;
+}
+//.skill-cer-right .skill-select-item{
+//  margin-top: 17px;
+//}
+/* 右侧 */
+
+/* 按钮 */
+.real-name-button{
+  width: 276px;
+  margin-top: 40px;
+}
+/* 按钮 */

+ 16 - 0
src/popup/popup-settle/data/step.ts

@@ -0,0 +1,16 @@
+export default [
+    {
+        label:'实名认证'
+    },
+    {
+        label:'技能认证',
+        component:'skill-certification'
+    },
+    {
+        label:'填写资料',
+        component:'fill-information'
+    },
+    {
+        label:'客服审核'
+    }
+] as LibDataArray

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

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

+ 57 - 0
src/popup/popup-settle/mixins/handle.ts

@@ -0,0 +1,57 @@
+import step from '../data/step';
+
+export default <LibMixins>{
+
+    data(){
+        return {
+            stepData:step,
+
+            // 当前步骤
+            stepNumber:-1,
+
+            // 设置当前步骤
+            stepItem:{}
+        }
+    },
+
+    provide(){
+      return {
+          setStep:(index:number)=> this.setStep(index),
+          setResultData:(data:Record<string, any>)=> this.setResultData(data),
+          close:()=> this.close()
+      }
+    },
+
+    methods:{
+
+        setStep(index:number){
+            if (this.stepNumber !== index) {
+                this.stepNumber = index;
+                this.stepItem = step[index]
+            }
+        },
+
+        setResultData(data:Record<string, any> = {}):Record<string, any>{
+
+            for (let key in data) {
+                if (data.hasOwnProperty(key) && this.storageResultData[key] !== data[key]) {
+                    this.storageResultData[key] = data[key];
+                }
+            }
+            
+            return this.storageResultData;
+
+        },
+
+    },
+
+    created(){
+        // 直接跳转到第一步
+        this.setStep(1);
+        // 用于存储提交数据
+        this.storageResultData = {
+            gid: this.config.gid
+        };
+    }
+
+}

+ 4 - 0
src/popup/popup-settle/mixins/index.ts

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

+ 8 - 0
src/popup/popup-settle/props.ts

@@ -0,0 +1,8 @@
+export default {
+
+    config:{
+        type:Object,
+        default: {}
+    }
+
+}

+ 64 - 0
src/popup/popup-settle/src/main.vue

@@ -0,0 +1,64 @@
+<template>
+  <popup v-model:value="value" content-animate="scale" @close="$emit('destroy-popup')">
+    <section class="settle-container flex">
+      <!--  标题   -->
+      <header class="settle-header row aCenter">
+        <div class="flex-1">{{config.game_name}}</div>
+        <div class="settle-close cursor-pointer animate-rotate-hover" @click="close">
+          <icon type="close"></icon>
+        </div>
+      </header>
+      <!--   步骤类   -->
+      <section class="center settle-step">
+        <div class="rowACenter">
+          <aside
+            v-for="(item,index) in stepData"
+            :key="'step-'+index"
+            class="row"
+            :class="{'settle-step-checked': index <= stepNumber}"
+          >
+            <div class="settle-step-line" v-if="index!==0"></div>
+            <section class="center">
+              <div class="settle-step-icon center">{{index+1}}</div>
+              <div class="settle-step-label">{{item.label}}</div>
+            </section>
+
+          </aside>
+        </div>
+      </section>
+
+      <!--   剩余空间   -->
+      <aside class="flex-1" style="overflow: visible">
+        <component
+          v-if="stepItem.component"
+          :is="stepItem.component"
+          :config="config"
+        ></component>
+      </aside>
+    </section>
+  </popup>
+</template>
+
+<script>
+import {
+  Popup,
+  icon
+} from '$components';
+import mixins from '../mixins';
+import props from '../props';
+import skillCertification from '../components/skill-certification';
+import fillInformation from '../components/fill-information';
+export default {
+  name: "popup-settle",
+  components:{
+    Popup,
+    icon,
+    skillCertification,
+    fillInformation
+  },
+  props,
+  mixins
+}
+</script>
+
+<style scoped lang="scss" src="../style.scss"></style>

+ 55 - 0
src/popup/popup-settle/style.scss

@@ -0,0 +1,55 @@
+/* 容器 */
+.settle-container{
+  width: 856px;
+  height: 526px;
+  border:2px solid #5F3CC6;
+  background-color: #342971;
+  border-radius: 10px;
+  padding: 24px 44px;
+}
+/* 容器 */
+
+/* 头部 */
+.settle-header{
+  font-size: 18px;
+  line-height: 25px;
+  font-weight: bold;
+}
+.settle-close{
+  color: #C1BED5;
+  margin-right: -24px;
+  margin-top: -14px;
+}
+/* 头部 */
+
+/* 步骤 */
+.settle-step{
+  margin: 20px 0;
+}
+.settle-step-icon{
+  @include square(26px);
+  background-color: rgba(255,255,255,0.1);
+  border-radius: 50%;
+  font-size: 16px;
+  line-height: 25px;
+  font-weight: bold;
+}
+.settle-step-line{
+  width: 66px;
+  height: 2px;
+  background: linear-gradient(90deg, #342871, #FFFFFF);
+  opacity: 0.5;
+  margin: 12px 14px 0;
+}
+.settle-step-label{
+  font-size: 12px;
+  line-height: 25px;
+  font-weight: 400;
+  margin-top: 10px;
+}
+.settle-step-checked .settle-step-icon{
+  background: linear-gradient(90deg, #629CFF, #7870F1);
+  color: #342971;
+}
+
+/* 步骤 */

+ 32 - 2
src/store/modules/cate.ts

@@ -8,7 +8,8 @@ export default <Module<any,any>>{
 
     state:{
         gameCate:[],
-        recommendGameCate:[]
+        recommendGameCate:[],
+        gameStatusCate:[]
     },
 
     mutations:{
@@ -49,10 +50,26 @@ export default <Module<any,any>>{
 
             recommendGameCate.push(...cate.gameCate.config.footer);
 
-
             state.gameCate = gameCate;
             state.recommendGameCate = recommendGameCate;
 
+        },
+
+        setGameStatusCate(state,data){
+            let gameCate = [
+                {
+                    label:'游戏类',
+                    children:[]
+                }
+            ];
+
+            gameCate.map((item,index)=>{
+
+                item.children = data;
+
+            });
+
+            state.gameStatusCate = gameCate;
         }
 
     },
@@ -72,7 +89,20 @@ export default <Module<any,any>>{
                 }).catch(reject)
             });
 
+        },
 
+        initializationGameStatusPromise({commit}) {
+            return new Promise(function (resolve, reject) {
+                $request({
+                    url:'player/get_player_game_list',
+                    cache:true,
+                    token:true,
+                    failMessage:true
+                }).then((data)=>{
+                    commit('setGameStatusCate',data.data);
+                    return resolve(data.data);
+                }).catch(reject)
+            });
         }
 
     }

+ 2 - 2
src/types/trigger-data.d.ts

@@ -1,6 +1,6 @@
-abstract class Trigger {
+interface Trigger {
 
-    abstract trigger(item:LibData, index:number, target:Vue):void;
+    trigger(item:LibData, index:number, target:Vue):void;
 
 }
 

+ 13 - 1
src/utils/verification/const/index.ts

@@ -11,4 +11,16 @@ enum VerificationType {
     id
 }
 
-export { VerificationType };
+enum LibDataComponents {
+    text,
+    input,
+    date,
+    address,
+    textarea,
+    upload,
+    radio,
+    picker,
+    audio
+}
+
+export { VerificationType,LibDataComponents };

+ 25 - 0
src/utils/verification/format.ts

@@ -0,0 +1,25 @@
+export default {
+
+    formatData(data,object:{label:string,value:string}){
+
+        let keys = Object.keys(object);
+        return data.map((item)=>{
+
+            let resultItem = {};
+            keys.map((cItem,index)=> {
+
+                if (typeof item === 'object') {
+                    resultItem[cItem] = item[object[cItem]];
+                } else {
+                    resultItem[cItem] = item+(object[cItem] || '');
+                }
+
+            });
+
+            return resultItem;
+
+        })
+
+    }
+
+}

+ 7 - 0
src/utils/verification/index.ts

@@ -47,6 +47,13 @@ export default {
             return false;
         },
 
+        // 身份证号
+        [VerificationType.id]:function(value){
+            if (!value || typeof value === 'object') return false;
+            else value = String(value);
+            return /^[1-9][0-9]{5}([1][9][0-9]{2}|[2][0][0|1][0-9])([0][1-9]|[1][0|1|2])([0][1-9]|[1|2][0-9]|[3][0|1])[0-9]{3}([0-9]|[X])$/.test(value);
+        }
+
 
     } as VerificationTrigger,
 

+ 17 - 1
src/views/view-footer/data/control.ts

@@ -1,3 +1,8 @@
+import {FunctionTrigger} from '$mixins/trigger/class/index';
+
+import popup from "$utils/tool/popup";
+import {PopupExportComponent} from "$popup/popup-export/const";
+
 export default <LibDataArray>[
     {
         label:'急速点单',
@@ -5,7 +10,18 @@ export default <LibDataArray>[
     },
     {
         label:'大神入驻',
-        icon:require('../images/great.png')
+        icon:require('../images/great.png'),
+        trigger: new FunctionTrigger(function (item){
+
+            if (this.user.is_real == '2') {
+                popup.$toast('请先完成实名认证');
+                return popup.$popup && popup.$popup.open(PopupExportComponent.realName);
+            } else if (this.user.is_real == '3') {
+                return  popup.$toast('请耐心等待实名认证审核');
+            } else {
+                return popup.$popup && popup.$popup.open(PopupExportComponent.choosingSkill);
+            }
+        })
     },
     {
         label:'在线客服',

+ 2 - 1
src/views/view-footer/mixins/index.ts

@@ -1,3 +1,4 @@
 import trigger from '$mixins/trigger';
+import user from '$mixins/user';
 
-export default [trigger];
+export default [trigger,user];