xiongzhu 4 rokov pred
rodič
commit
9d2ed1e939

+ 0 - 1
android/app/src/main/assets/capacitor.config.json

@@ -13,7 +13,6 @@
         }
     },
     "server": {
-        "url": "http://192.168.50.116:8082",
         "cleartext": true
     },
     "android": {

+ 0 - 1
capacitor.config.json

@@ -13,7 +13,6 @@
         }
     },
     "server": {
-        "url": "http://192.168.50.116:8082",
         "cleartext": true
     },
     "android": {

+ 0 - 1
ios/App/App/capacitor.config.json

@@ -13,7 +13,6 @@
         }
     },
     "server": {
-        "url": "http://192.168.50.116:8082",
         "cleartext": true
     },
     "android": {

BIN
src/assets/icon_clear.png


BIN
src/assets/icon_more.png


BIN
src/assets/img_qa.png


BIN
src/assets/img_topic.png


+ 1 - 0
src/components/newsItem.vue

@@ -23,6 +23,7 @@ export default {
 .news-item {
     padding: 8px 16px;
     .flex();
+    background: white;
     &:active {
         background: shade(#ffffff, 5%);
     }

+ 6 - 0
src/main.js

@@ -65,6 +65,12 @@ Vue.mixin({
                 return false;
             }
             return true;
+        },
+        toDate(datetimeStr) {
+            if (datetimeStr && /\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/.test(datetimeStr)) {
+                return datetimeStr.split(' ')[0];
+            }
+            return '';
         }
     }
 });

+ 6 - 0
src/router.js

@@ -240,6 +240,12 @@ const router = new Router({
             name: 'myInteract',
             component: () => import(/* webpackChunkName: "myInteract" */ '@/views/myInteract.vue'),
             meta: {}
+        },
+        {
+            path: '/search',
+            name: 'search',
+            component: () => import(/* webpackChunkName: "search" */ '@/views/search.vue'),
+            meta: { statusBar: 'dark' }
         }
     ]
 });

+ 71 - 34
src/views/collections.vue

@@ -1,40 +1,20 @@
 <template>
-    <div>
-        <nav-bar title="我的收藏" @click-left="$router.go(-1)">
-            <div slot="append">
-                <div class="tab-row">
-                    <van-tabs
-                        v-model="type"
-                        :color="$colors.prim"
-                        :title-active-color="$colors.prim"
-                        title-inactive-color="#000000"
-                    >
-                        <van-tab title="技术发布"></van-tab>
-                        <van-tab title="产品发布"></van-tab>
-                        <van-tab title="资源共享"></van-tab>
-                        <van-tab title="技术需求"></van-tab>
-                        <van-tab title="产品需求"></van-tab>
-                        <van-tab title="融资需求"></van-tab>
-                    </van-tabs>
-                </div>
-                <div class="filter-row"></div>
-            </div>
-        </nav-bar>
-        <div style="height:49px;"></div>
+    <div class="collections">
+        <nav-bar title="我的收藏" @click-left="$router.go(-1)"> </nav-bar>
+        <van-empty v-if="empty" description="还未收藏任何供需信息哦~">
+            <router-link :to="{ name: 'sTech' }" replace class="btn-lg" style="width:180px">去逛逛</router-link>
+        </van-empty>
         <div class="list">
-            <van-swipe-cell>
-                <div class="list-item">
-                    <img
-                        class="cover"
-                        src="https://jxjmrh.oss-cn-hangzhou.aliyuncs.com/image/2021-01-05-18-52-55JaQkFqst.png"
-                    />
+            <van-swipe-cell v-for="item in list" :key="item.id" class="item-swipe">
+                <div class="list-item" @click="detail(item)">
+                    <van-image width="110" height="110" fit="cover" class="cover" :src="(item.images || [])[0]" />
                     <div class="info">
-                        <div class="name">TAS系列回馈式交流精密电子回馈式交流精密电子</div>
-                        <div class="desc">新能源汽车一体化集成动力系统相关高速油冷电机及其控制器产品</div>
+                        <div class="name">{{ item.name }}</div>
+                        <div class="desc">{{ item.typeDesc }}</div>
                     </div>
                 </div>
                 <template #right>
-                    <div class="btn-cancel">
+                    <div class="btn-cancel" @click="cancelCollect(item)">
                         <img src="../assets/icon_collect.png" />
                         取消收藏
                     </div>
@@ -44,15 +24,68 @@
     </div>
 </template>
 <script>
+import { mapState } from 'vuex';
 export default {
     data() {
         return {
-            type: 0
+            type: 0,
+            list: [],
+            typeOptions: [
+                { label: '技术需求', value: 'TECH_DEMAND' },
+                { label: '产品需求', value: 'PRODUCT_DEMAND' },
+                { label: '融资需求', value: 'FINANCING_DEMAND' },
+                { label: '技术发布', value: 'TECH_SUPPLY' },
+                { label: '产品发布', value: 'PRODUCT_SUPPLY' },
+                { label: '共享资源', value: 'RES_SUPPLY' }
+            ],
+            empty: false
         };
+    },
+    created() {
+        this.getData();
+    },
+    computed: {
+        ...mapState(['userInfo'])
+    },
+    methods: {
+        getData() {
+            this.$http.get('/resourceSupplyAndDemand/myCollect', { size: 1000, sort: 'createdAt,desc' }).then(res => {
+                res.content.forEach(i => {
+                    i.typeDesc = (this.typeOptions.find(t => t.value === i.type) || {}).label;
+                });
+                this.list = res.content;
+                this.empty = res.totalElements === 0;
+            });
+        },
+        cancelCollect(item) {
+            this.$toast.loading();
+            this.$http
+                .get(`/collect/${item.id}`)
+                .then(res => {
+                    this.getData();
+                    this.$toast.clear();
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.$toast.clear();
+                });
+        },
+        detail(item) {
+            this.$router.push({
+                name: 'sndDetail',
+                query: {
+                    id: item.id,
+                    type: item.type
+                }
+            });
+        }
     }
 };
 </script>
 <style lang="less" scoped>
+.collections {
+    background: @bg !important;
+}
 /deep/ .van-tabs__line {
     bottom: 23px;
 }
@@ -62,13 +95,17 @@ export default {
 /deep/ .van-tab--active .van-tab__text {
     transform: scale(1.28);
 }
+.item-swipe {
+    margin: 10px 16px;
+    border-radius: 4px;
+    overflow: hidden;
+}
 .list-item {
     .flex();
     background: white;
-    border-radius: 4px;
     overflow: hidden;
     align-items: flex-start;
-    padding: 5px 16px;
+    padding-right: 14px;
     &:active {
         background: shade(#ffffff, 5%);
     }

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

@@ -6,7 +6,7 @@
         </div>
         <transition name="fade">
             <div class="nav-bar" v-if="showNavBar">
-                <div class="search">
+                <div class="search" @click="$router.push({ name: 'search' })">
                     <img src="../../assets/icon_search.png" />
                     搜索新闻/政策/供需...
                 </div>
@@ -19,7 +19,7 @@
         <div class="lengend-wrapper">
             <img class="legend" src="../../assets/home_legend.png" />
             <div class="card">
-                <div class="search">
+                <div class="search" @click="$router.push({ name: 'search' })">
                     <img src="../../assets/icon_search.png" class="icon" />
                     搜索...
                 </div>

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

@@ -4,8 +4,8 @@
             <div slot="left"></div>
             <div class="tabs" :class="navTheme" slot="title">
                 <div class="tab-item" :class="{ active: tab === 0 }" @click="changeTab(0)">官答</div>
-                <div class="tab-item" :class="{ active: tab === 1 }" @click="changeTab(1)">热议</div>
-                <div class="tab-item" :class="{ active: tab === 2 }" @click="changeTab(2)">互动</div>
+                <div class="tab-item" :class="{ active: tab === 1 }" @click="changeTab(1)">话题</div>
+                <div class="tab-item" :class="{ active: tab === 2 }" @click="changeTab(2)">提问</div>
             </div>
         </nav-bar>
         <div class="top-banner-wrapper">

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

@@ -22,11 +22,11 @@
                 <div class="text">我的互动</div>
                 <img src="../../assets/icon_into.png" class="into" />
             </router-link>
-            <div class="item">
+            <router-link to="/profile" class="item">
                 <img src="../../assets/my_menu_icon_3.png" class="icon" />
                 <div class="text">资料编辑</div>
                 <img src="../../assets/icon_into.png" class="into" />
-            </div>
+            </router-link>
             <div class="item">
                 <img src="../../assets/my_menu_icon_4.png" class="icon" />
                 <div class="text">关于我们</div>

+ 14 - 8
src/views/interact/forumDetail.vue

@@ -1,6 +1,6 @@
 <template>
     <div class="form-detail-root">
-        <nav-bar title="问答详情" right-icon="share" @click-left="$router.go(-1)"></nav-bar>
+        <nav-bar :title="title" right-icon="share" @click-left="$router.go(-1)"></nav-bar>
         <div class="forum-title">{{ post.title }}</div>
         <div class="forum-content">
             {{ post.content }}
@@ -87,13 +87,6 @@ export default {
     data() {
         return {
             type: 'forum',
-            images: [
-                'http://www.ikanins.com/wp-content/uploads/2021/02/www.ikanins.com-20210221-93p-77.jpg',
-                'http://www.ikanins.com/wp-content/uploads/2021/02/www.ikanins.com-20210221-93p-2.jpg',
-                'http://www.ikanins.com/wp-content/uploads/2021/02/www.ikanins.com-20210221-93p-5.jpg',
-                'http://www.ikanins.com/wp-content/uploads/2021/02/www.ikanins.com-20210221-93p-9.jpg',
-                'http://www.ikanins.com/wp-content/uploads/2021/02/www.ikanins.com-20210221-93p-12.jpg'
-            ],
             showCommentDialog: false,
             fileList: [],
             content: '',
@@ -105,12 +98,25 @@ export default {
     },
     created() {
         this.type = this.$route.query.type;
+        this.$http.get(`/post/view/${this.$route.query.id}`);
         this.getData();
     },
     activated() {
         this.type = this.$route.query.type;
         this.getData();
     },
+    computed: {
+        title() {
+            switch (this.type) {
+                case 'forum':
+                    return '话题详情';
+                case 'qa':
+                    return '问答详情';
+                default:
+                    return '';
+            }
+        }
+    },
     methods: {
         getData() {
             this.$http.get(`/post/getDTO/${this.$route.query.id}`).then(res => {

+ 7 - 2
src/views/interact/official.vue

@@ -19,12 +19,13 @@
             </div>
             <div class="answer">
                 <img class="icon" src="../../assets/interact_icon_answer.png" />
-                <div class="content">
+                <div class="content" v-if="item.comment">
                     <div class="txt">
-                        {{ item.reply }}
+                        {{ item.comment.content }}
                     </div>
                     <div class="btn-more">查看详情</div>
                 </div>
+                <div class="content empty" v-else>暂未答复,请耐心等待!</div>
             </div>
         </div>
 
@@ -159,6 +160,7 @@ export default {
             background: @bg;
             padding: 10px 12px;
             border-radius: 0px 16px 16px 16px;
+            flex-grow: 1;
             .txt {
                 font-size: 16px;
                 color: black;
@@ -174,6 +176,9 @@ export default {
                     color: fade(@prim, 60%);
                 }
             }
+            &.empty {
+                color: @text3;
+            }
         }
     }
 }

+ 8 - 2
src/views/interact/officialDetail.vue

@@ -25,7 +25,8 @@
         <div class="reply-title"><img src="../../assets/icon_reply.png" />官方答复</div>
         <div class="answer">
             <img class="icon" src="../../assets/interact_icon_answer.png" />
-            <div class="answer-content">{{ (comments[0] || {}).content }}</div>
+            <div class="answer-content" v-if="comments && comments[0]">{{ comments[0].content }}</div>
+            <div class="answer-content empty" v-else>暂未答复,请耐心等待!</div>
         </div>
     </div>
 </template>
@@ -48,6 +49,7 @@ export default {
         };
     },
     created() {
+        this.$http.get(`/post/view/${this.$route.query.id}`);
         this.$http.get(`/post/getDTO/${this.$route.query.id}`).then(res => {
             this.post = res;
         });
@@ -112,7 +114,7 @@ export default {
 }
 .answer {
     .flex();
-    padding: 18px 16px calc(16px + var(--safe-top) 14px);
+    padding: 18px 16px calc(16px + var(--safe-top)) 14px;
     align-items: flex-start;
     .icon {
         width: 26px;
@@ -125,6 +127,10 @@ export default {
         border-radius: 0px 16px 16px 16px;
         font-size: 16px;
         line-height: 1.65;
+        flex-grow: 1;
+        &.empty {
+            color: @text3;
+        }
     }
 }
 </style>

+ 30 - 4
src/views/leaveMessage.vue

@@ -4,11 +4,11 @@
         <div class="info">
             <div class="row">
                 <img src="../assets/icon_org_gray.png" class="icon" />
-                <div class="txt">阿里巴巴股份有限公司</div>
+                <div class="txt">{{ (userInfo || {}).orgName }}</div>
             </div>
             <div class="row" style="margin-top:10px">
                 <img src="../assets/icon_user_gray.png" class="icon" />
-                <div class="txt">夏秋雨 15686868686</div>
+                <div class="txt">{{ (userInfo || {}).contactName }}&nbsp;{{ (userInfo || {}).contactPhone }}</div>
             </div>
             <div class="btn" @click="$router.push({ name: 'profile' })">编辑<img src="../assets/icon_into.png" /></div>
         </div>
@@ -19,26 +19,52 @@
         <div class="btn-wrapper">
             <div class="btn-lg" @click="submit">提交</div>
         </div>
-        <van-dialog v-model="showDialog" show-cancel-button class="dialog-submit">
+        <van-dialog v-model="showDialog" show-cancel-button class="dialog-submit" @close="close">
             <img src="../assets/img_submit.png" />
             <div class="msg">已提交留言信息,请等待企业回复</div>
         </van-dialog>
     </div>
 </template>
 <script>
+import { mapState } from 'vuex';
 export default {
     data() {
         return {
             content: '',
-            showDialog: true
+            showDialog: false
         };
     },
+    computed: {
+        ...mapState(['userInfo'])
+    },
     methods: {
         submit() {
             if (!this.content) {
                 this.$toast('请输入内容');
                 return;
             }
+            this.$toast.loading();
+            this.$http
+                .post(
+                    '/message/save',
+                    {
+                        orgName: this.userInfo.orgName,
+                        userName: this.userInfo.contactName,
+                        userPhone: this.userInfo.contactPhone,
+                        description: this.content
+                    },
+                    { body: 'json' }
+                )
+                .then(res => {
+                    this.$toast.clear();
+                    this.showDialog = true;
+                })
+                .catch(e => {
+                    this.$toast(e.error || '提交失败,请稍后再试');
+                });
+        },
+        close() {
+            this.$router.go(-1);
         }
     }
 };

+ 11 - 11
src/views/login.vue

@@ -3,11 +3,11 @@
         <nav-bar title="登录" @click-left="$router.go(-1)"></nav-bar>
         <div class="cell" style="margin-top:40px;">
             <img class="icon" src="../assets/login_icon_phone.png" />
-            <input placeholder="请输入用户名" v-model="username" />
+            <input placeholder="请输入手机号" type="tel" v-model="phone" />
         </div>
         <div class="cell">
             <img class="icon" src="../assets/login_icon_pwd.png" />
-            <input placeholder="请输入密码" v-model="password" type="password" />
+            <input placeholder="请输入验证码" v-model="code" type="number" />
         </div>
         <div class="btn-lg btn-login" @click="login">登录</div>
         <router-link tag="div" to="/register" replace class="btn-lg-o btn-register">
@@ -19,25 +19,25 @@
 export default {
     data() {
         return {
-            username: '',
-            password: ''
+            phone: '',
+            code: ''
         };
     },
     methods: {
         login() {
-            if (!this.username) {
-                this.$toast('请输入用户名');
+            if (!this.phone) {
+                this.$toast('请输入手机号');
                 return;
             }
-            if (!this.password) {
-                this.$toast('请输入码');
+            if (!this.code) {
+                this.$toast('请输入验证码');
                 return;
             }
             this.$toast.loading();
             this.$http
-                .post('/auth/login', {
-                    username: this.username,
-                    password: this.password
+                .post('/auth/phoneLogin', {
+                    phone: this.phone,
+                    code: this.code
                 })
                 .then(res => {
                     localStorage.setItem('token', res);

+ 264 - 4
src/views/myInteract.vue

@@ -3,20 +3,157 @@
         <nav-bar @click-left="$router.go(-1)">
             <div class="tabs" slot="title">
                 <div class="tab-item" :class="{ active: tab === 0 }" @click="tab = 0">官答</div>
-                <div class="tab-item" :class="{ active: tab === 1 }" @click="tab = 1">热议</div>
-                <div class="tab-item" :class="{ active: tab === 2 }" @click="tab = 2">互动</div>
+                <div class="tab-item" :class="{ active: tab === 1 }" @click="tab = 1">话题</div>
+                <div class="tab-item" :class="{ active: tab === 2 }" @click="tab = 2">提问</div>
             </div>
         </nav-bar>
+        <van-empty v-if="empty" description="还未发布任何互动信息哦~">
+            <router-link :to="{ name: 'official' }" replace class="btn-lg" style="width:180px">去逛逛</router-link>
+        </van-empty>
+        <div class="list">
+            <div class="item" v-for="item in list" :key="item.id" @click="detail(item)">
+                <div class="info">
+                    <van-image width="24" height="24" round fit="cover" :src="($store.state.userInfo || {}).avatar" />
+                    <div class="name">{{ ($store.state.userInfo || {}).nickname }}</div>
+                    <div class="desc">{{ item.comment ? '回复' : '发布' }}</div>
+                    <img src="../assets/icon_more.png" class="icon" />
+                </div>
+                <template v-if="item.post && item.post.type === 'OFFICIAL'">
+                    <div class="item-title">{{ item.post.content }}</div>
+                    <div class="opt">
+                        <div class="time">{{ toDate(item.createdAt) }}</div>
+                    </div>
+                    <div class="reply">
+                        <img class="icon" src="../assets/interact_icon_answer.png" />
+                        <div class="content-wrapper">
+                            <div class="content" v-if="item.comment">{{ item.comment.content }}</div>
+                            <div class="empty" v-else>暂未答复,请耐心等待!</div>
+                        </div>
+                    </div>
+                </template>
+                <template v-else-if="item.comment">
+                    <div class="item-title">{{ item.comment.content }}</div>
+                    <div class="opt">
+                        <div class="time">{{ toDate(item.createdAt) }}</div>
+                        <div class="opt-btn">
+                            <img src="../assets/interact_icon_dislike.png" />
+                            <div class="num">{{ item.comment.dislikeNum }}</div>
+                        </div>
+                        <div class="opt-btn">
+                            <img src="../assets/interact_icon_like.png" />
+                            <div class="num">{{ item.comment.likeNum }}</div>
+                        </div>
+                    </div>
+                    <div class="orig-info">
+                        <div class="info">
+                            <div class="orig-title">{{ item.post.title }}</div>
+                            <div class="type">{{ getType(item.post) }}</div>
+                        </div>
+                        <img
+                            :src="
+                                item.post.type === 'QA'
+                                    ? require('../assets/img_qa.png')
+                                    : require('../assets/img_topic.png')
+                            "
+                        />
+                    </div>
+                </template>
+                <template v-else>
+                    <div class="item-title">{{ item.post.title }}</div>
+                    <div class="item-desc">{{ item.post.content }}</div>
+                    <div class="opt">
+                        <div class="time">{{ toDate(item.createdAt) }}</div>
+                        <div class="opt-btn">
+                            <img src="../assets/interact_icon_hot.png" />
+                            <div class="num">{{ item.post.viewNum }}</div>
+                        </div>
+                        <div class="opt-btn">
+                            <img src="../assets/interact_icon_comment.png" />
+                            <div class="num">{{ item.post.commentNum }}</div>
+                        </div>
+                        <div class="opt-btn">
+                            <img src="../assets/interact_icon_like.png" />
+                            <div class="num">{{ item.post.likeNum }}</div>
+                        </div>
+                    </div>
+                </template>
+            </div>
+        </div>
     </div>
 </template>
 <script>
 export default {
     data() {
         return {
-            tab: 0
+            tab: 0,
+            list: [],
+            empty: false
         };
     },
-    methods: {}
+    created() {
+        this.getData();
+    },
+    methods: {
+        getData() {
+            let type = '';
+            switch (this.tab) {
+                case 0:
+                    type = 'OFFICIAL';
+                    break;
+                case 1:
+                    type = 'TOPIC';
+                    break;
+                case 2:
+                    type = 'QA';
+                    break;
+            }
+            this.$http.get('/post/my', { type }).then(res => {
+                this.list = res;
+                this.empty = res.length === 0;
+            });
+        },
+        getType(item) {
+            switch (item.type) {
+                case 'OFFICIAL':
+                    return '官答';
+                case 'TOPIC':
+                    return '话题';
+                case 'QA':
+                    return '提问';
+            }
+        },
+        detail(item) {
+            if (item.post.del) {
+                this.$toast(`该${this.getType(item.post)}已删除`);
+            } else {
+                switch (item.post.type) {
+                    case 'OFFICIAL':
+                        this.$router.push({
+                            name: 'officialDetail',
+                            query: { id: item.post.id }
+                        });
+                        break;
+                    case 'TOPIC':
+                        this.$router.push({
+                            name: 'forumDetail',
+                            query: { id: item.post.id, type: 'forum' }
+                        });
+                        break;
+                    case 'QA':
+                        this.$router.push({
+                            name: 'forumDetail',
+                            query: { id: item.post.id, type: 'qa' }
+                        });
+                        break;
+                }
+            }
+        }
+    },
+    watch: {
+        tab() {
+            this.getData();
+        }
+    }
 };
 </script>
 <style lang="less" scoped>
@@ -39,4 +176,127 @@ export default {
         }
     }
 }
+.list {
+    .item {
+        padding: 20px 16px;
+        .flex-col();
+        position: relative;
+        &::after {
+            .setBottomLine();
+            left: 16px;
+            right: 16px;
+        }
+        .info {
+            color: @text3;
+            font-size: 13px;
+            line-height: 24px;
+            .flex();
+            .name {
+                margin-left: 6px;
+            }
+            .desc {
+                margin-left: 6px;
+                flex-grow: 1;
+            }
+            .icon {
+                width: 24px;
+                height: 24px;
+            }
+        }
+        .item-title {
+            margin-left: 30px;
+            font-size: 16px;
+            font-weight: bold;
+            color: black;
+            line-height: 24px;
+            margin-top: 6px;
+            .ellipsisLn(2);
+        }
+        .item-desc {
+            color: @text3;
+            font-size: 14px;
+            line-height: 24px;
+            margin-top: 6px;
+            margin-left: 30px;
+            .ellipsisLn(2);
+        }
+        .opt {
+            margin: 6px -16px 0 30px;
+            .flex();
+            font-size: 13px;
+            .time {
+                color: @text4;
+                flex-grow: 1;
+            }
+            .opt-btn {
+                color: @text3;
+                .flex();
+                margin-left: 16px;
+                img {
+                    width: 24px;
+                    height: 24px;
+                }
+                .num {
+                    width: 40px;
+                }
+            }
+        }
+        .orig-info {
+            border-radius: 0px 16px 16px 16px;
+            background: @bg;
+            padding: 12px;
+            margin: 10px 0 0 30px;
+            .flex();
+            .info {
+                height: 70px;
+                flex-grow: 1;
+                .flex-col();
+                align-items: flex-start;
+                justify-content: space-between;
+                .orig-title {
+                    color: @text2;
+                    font-size: 14px;
+                    line-height: 22px;
+                    .ellipsisLn(2);
+                }
+                .type {
+                    color: @text4;
+                    line-height: 24px;
+                }
+            }
+            img {
+                width: 70px;
+                height: 70px;
+                margin-left: 12px;
+                min-width: 70px;
+            }
+        }
+        .reply {
+            .flex();
+            margin: 8px 0 0 -2px;
+            align-items: flex-start;
+            .icon {
+                width: 26px;
+                height: 26px;
+            }
+            .content-wrapper {
+                margin: 8px 0 0 6px;
+                border-radius: 0px 16px 16px 16px;
+                background: @bg;
+                padding: 10px 12px;
+                font-size: 16px;
+                line-height: 26px;
+                flex-grow: 1;
+                .flex();
+                .content {
+                    color: black;
+                    .ellipsisLn(3);
+                }
+                .empty {
+                    color: @text3;
+                }
+            }
+        }
+    }
+}
 </style>

+ 54 - 11
src/views/profile.vue

@@ -19,7 +19,7 @@
         </div>
         <div class="cell">
             <div class="label">电话</div>
-            <input v-model="phone" class="value" placeholder="请输入您的电话" />
+            <input v-model="contactPhone" class="value" placeholder="请输入您的电话" type="tel" />
         </div>
         <div class="cell">
             <div class="label">邮箱</div>
@@ -28,24 +28,20 @@
         <div class="page-title" style="margin-top:30px;">实名认证</div>
         <div class="cell">
             <div class="label">姓名</div>
-            <input v-model="realName" class="value" placeholder="请输入您的真实名字" />
+            <input v-model="contactName" class="value" placeholder="请输入您的真实名字" />
         </div>
         <div class="cell">
-            <div class="label">证件类型</div>
-            <input class="value" disabled placeholder="身份证" />
-            <img src="../assets/icon_into.png" class="into" />
-        </div>
-        <div class="cell">
-            <div class="label">证件编号</div>
+            <div class="label">身份证号</div>
             <input v-model="idNo" class="value" placeholder="请输入您的证件号" />
         </div>
         <div style="height:calc(66px + var(--safe-bottom))"></div>
         <div class="btn-wrapper">
-            <div class="btn-lg btn-save">确认</div>
+            <div class="btn-lg btn-save" @click="save">确认</div>
         </div>
     </div>
 </template>
 <script>
+import { mapState } from 'vuex';
 export default {
     data() {
         return {
@@ -54,11 +50,58 @@ export default {
             navTheme: 'light',
             orgName: '',
             occupation: '',
-            phone: '',
+            contactPhone: '',
             email: '',
-            realName: '',
+            contactName: '',
             idNo: ''
         };
+    },
+    created() {
+        this.orgName = this.userInfo.orgName || '';
+        this.occupation = this.userInfo.occupation || '';
+        this.contactPhone = this.userInfo.contactPhone || '';
+        this.contactName = this.userInfo.contactName || '';
+        this.idNo = this.userInfo.idNo || '';
+        this.email = this.userInfo.email || '';
+    },
+    computed: {
+        ...mapState(['userInfo'])
+    },
+    methods: {
+        save() {
+            if (!this.orgName) {
+                this.$toast('请输入公司名称');
+            } else if (!this.occupation) {
+                this.$toast('请输入您的职业');
+            } else if (!/1[3-9]\d{9}/.test(this.contactPhone)) {
+                this.$toast('请输入正确的手机号');
+            } else if (!/^[^\s@]+@[^\s@]+$/i.test(this.email)) {
+                this.$toast('请输入正确的邮箱');
+            } else if (!this.contactName) {
+                this.$toast('请输入真实姓名');
+            } else if (!/^\d{6}(18|19|20)?\d{2}(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])\d{3}(\d|[xX])$/.test(this.idNo)) {
+                this.$toast('请输入正确的身份证号');
+            } else {
+                this.$toast.loading();
+                this.$http
+                    .post('/user/updateProfile', {
+                        orgName: this.orgName,
+                        occupation: this.occupation,
+                        contactPhone: this.contactPhone,
+                        email: this.email,
+                        contactName: this.contactName,
+                        idNo: this.idNo
+                    })
+                    .then(res => {
+                        this.$toast.success('保存成功');
+                        this.$store.dispatch('updateUserInfo');
+                        this.$router.go(-1);
+                    })
+                    .catch(e => {
+                        this.$toast(e.error || '');
+                    });
+            }
+        }
     }
 };
 </script>

+ 37 - 4
src/views/register.vue

@@ -3,13 +3,17 @@
         <nav-bar title="注册" @click-left="$router.go(-1)"></nav-bar>
         <div class="cell" style="margin-top:40px;">
             <img class="icon" src="../assets/login_icon_phone.png" />
-            <input placeholder="请输入用户名" v-model="username" />
+            <input placeholder="请输入手机号" v-model="phone" type="tel" />
         </div>
         <div class="cell">
             <img class="icon" src="../assets/login_icon_pwd.png" />
-            <input placeholder="请输入密码" v-model="password" type="password" />
+            <input placeholder="请输入验证码" v-model="code" type="number" />
         </div>
-        <div class="btn-lg btn-login">登录</div>
+        <div class="cell">
+            <img class="icon" src="../assets/login_icon_pwd.png" />
+            <input placeholder="请输入密码" v-model="password" />
+        </div>
+        <div class="btn-lg btn-login" @click="register">注册</div>
         <router-link class="btn-lg-o btn-register" tag="div" to="/login" replace>
             已有账号,立即登录
         </router-link>
@@ -19,9 +23,38 @@
 export default {
     data() {
         return {
-            username: '',
+            phone: '',
+            code: '',
             password: ''
         };
+    },
+    methods: {
+        register() {
+            if (!/^1[3-9]\d{9}$/.test(this.phone)) {
+                this.$toast('请输入正确的手机号');
+            } else if (!this.code) {
+                this.$toast('请输入验证码');
+            } else if (!this.password) {
+                this.$toast('请输入密码');
+            } else {
+                this.$toast.loading();
+                this.$http
+                    .post('/auth/phoneLogin', {
+                        phone: this.phone,
+                        code: this.code,
+                        password: this.password
+                    })
+                    .then(res => {
+                        localStorage.setItem('token', res);
+                        this.$store.dispatch('updateUserInfo');
+                        this.$router.go(-1);
+                        this.$toast.success('登录成功');
+                    })
+                    .catch(e => {
+                        this.$toast(e.error || '注册失败,请稍后再试');
+                    });
+            }
+        }
     }
 };
 </script>

+ 238 - 0
src/views/search.vue

@@ -0,0 +1,238 @@
+<template>
+    <div class="search-page">
+        <nav-bar @click-left="$router.go(-1)">
+            <div slot="title" class="nav-title">
+                <div class="search">
+                    <img src="../assets/icon_search.png" class="icon-search" />
+                    <input v-model="searchKey" placeholder="搜索" @keyup.enter="search" />
+                    <img src="../assets/icon_clear.png" class="icon-clear" v-if="searchKey" @click="searchKey = ''" />
+                </div>
+                <div class="btn" @click="$router.go(-1)">取消</div>
+            </div>
+            <div slot="append">
+                <div class="nav-tabs">
+                    <div class="tab" :class="{ active: tab === 0 }" @click="tab = 0">供需({{ sndList.length }})</div>
+                    <div class="tab" :class="{ active: tab === 1 }" @click="tab = 1">新闻({{ newsList.length }})</div>
+                    <div class="tab" :class="{ active: tab === 2 }" @click="tab = 2">政策({{ policyList.length }})</div>
+                    <div class="indicator" :style="{ left: (tab * 100) / 3 + '%' }"></div>
+                </div>
+            </div>
+        </nav-bar>
+        <div style="height:44px"></div>
+        <div class="list" v-if="tab === 0" key="0">
+            <div
+                v-for="item in sndList"
+                :key="item.id"
+                class="snd-item"
+                @click="$router.push({ name: 'sndDetail', query: { type: item.type, id: item.id } })"
+            >
+                <van-image width="110" height="110" fit="cover" class="cover" :src="(item.images || [])[0]" />
+                <div class="info">
+                    <div class="name">{{ item.name }}</div>
+                    <div class="desc">{{ item.typeDesc }}</div>
+                </div>
+            </div>
+        </div>
+        <div class="list" v-if="tab === 1" key="1">
+            <news-item v-for="item in newsList" :key="item.id" :content="item"></news-item>
+        </div>
+        <div class="list" v-if="tab === 2" key="2">
+            <news-item v-for="item in policyList" :key="item.id" :content="item"></news-item>
+        </div>
+    </div>
+</template>
+<script>
+import newsItem from '../components/newsItem';
+export default {
+    components: {
+        newsItem
+    },
+    data() {
+        return {
+            searchKey: '',
+            tab: 0,
+            sndList: [],
+            newsList: [],
+            policyList: [],
+            sndTypeOptions: [
+                { label: '技术需求', value: 'TECH_DEMAND' },
+                { label: '产品需求', value: 'PRODUCT_DEMAND' },
+                { label: '融资需求', value: 'FINANCING_DEMAND' },
+                { label: '技术发布', value: 'TECH_SUPPLY' },
+                { label: '产品发布', value: 'PRODUCT_SUPPLY' },
+                { label: '共享资源', value: 'RES_SUPPLY' }
+            ]
+        };
+    },
+    created() {
+        this.search();
+    },
+    methods: {
+        search() {
+            if (!this.searchKey) {
+                return;
+            }
+            this.$toast.loading();
+            Promise.all([
+                this.$http
+                    .get('/resourceSupplyAndDemand/all', { search: this.searchKey, sort: 'createdAt,desc' })
+                    .then(res => {
+                        res.content.forEach(i => {
+                            i.typeDesc = (this.sndTypeOptions.find(t => t.value === i.type) || {}).label;
+                        });
+                        this.sndList = res.content;
+                    }),
+                this.$http
+                    .get('/article/all', { search: this.searchKey, query: { typeId: 1004 }, sort: 'createdAt,desc' })
+                    .then(res => {
+                        this.newsList = res.content;
+                    }),
+                this.$http
+                    .get('/article/all', {
+                        search: this.searchKey,
+                        query: { type: { keyType: 'zcfg' } },
+                        sort: 'createdAt,desc'
+                    })
+                    .then(res => {
+                        this.policyList = res.content;
+                    })
+            ])
+                .then(res => {
+                    this.$toast.clear();
+                })
+                .catch(e => {
+                    this.$toast.clear();
+                });
+        }
+    }
+};
+</script>
+<style lang="less" scoped>
+.search-page {
+    background: @bg !important;
+}
+.nav-title {
+    .flex();
+    width: 100%;
+    padding-left: 59px;
+    .search {
+        .flex();
+        flex-grow: 1;
+        background: @bg;
+        height: 34px;
+        border-radius: 17px;
+        padding: 0 6px 0 10px;
+        .icon-search {
+            width: 16px;
+            height: 16px;
+            min-width: 16px;
+        }
+        input {
+            margin-left: 6px;
+            font-size: 14px;
+            flex-grow: 1;
+            line-height: 34px;
+            height: 34px;
+            padding-left: 0;
+            &::-webkit-input-placeholder {
+                color: @text4;
+            }
+        }
+        .icon-clear {
+            width: 24px;
+            height: 24px;
+            min-width: 24px;
+            margin-right: 6px;
+            margin-left: 6px;
+        }
+    }
+    .btn {
+        padding: 0 16px 0 12px;
+        height: 44px;
+        line-height: 44px;
+        font-size: 14px;
+        color: @prim;
+    }
+}
+.nav-tabs {
+    height: 44px;
+    .flex();
+    position: relative;
+    .tab {
+        flex-basis: 0;
+        flex-grow: 1;
+        text-align: center;
+        font-size: 15px;
+        color: black;
+        transition: all 0.2s;
+        &.active {
+            color: @prim;
+            font-weight: bold;
+        }
+    }
+    .indicator {
+        position: absolute;
+        bottom: 8px;
+        height: 2px;
+        width: 33.33%;
+        transition: all 0.2s;
+        &::after {
+            content: '';
+            width: 18px;
+            height: 2px;
+            position: absolute;
+            left: 0;
+            right: 0;
+            bottom: 0;
+            margin: auto;
+            background: @prim;
+        }
+    }
+}
+.snd-item {
+    .flex();
+    background: white;
+    overflow: hidden;
+    align-items: flex-start;
+    padding-right: 14px;
+    margin: 10px 16px;
+    border-radius: 4px;
+    overflow: hidden;
+    &:active {
+        background: shade(#ffffff, 5%);
+    }
+    &:last-child {
+        margin-bottom: calc(var(--safe-bottom) + 16px);
+    }
+    .cover {
+        width: 110px;
+        height: 110px;
+        object-fit: cover;
+        min-width: 110px;
+    }
+    .info {
+        flex-basis: 0;
+        flex-grow: 1;
+        .flex-col();
+        padding-left: 10px;
+        padding-top: 10px;
+        .name {
+            font-size: 16px;
+            color: black;
+            line-height: 26px;
+            .ellipsisLn(2);
+        }
+        .desc {
+            font-size: 12px;
+            color: @text3;
+            line-height: 22px;
+            .ellipsisLn(2);
+            margin-top: 4px;
+            .money {
+                color: @prim;
+                margin-left: 8px;
+            }
+        }
+    }
+}
+</style>

+ 4 - 4
src/views/snd/dFinancial.vue

@@ -29,11 +29,11 @@
             <van-empty v-if="empty" description="暂无内容" />
             <van-list v-else v-model="loading" :finished="last" finished-text="没有更多了" @load="loadmore">
                 <div class="list-item" v-for="item in list" :key="item.id" @click="detail(item.id, 'dFinancial')">
-                    <img v-if="item.pic" class="cover" :src="item.pic" />
+                    <img v-if="item.images && item.images.length" class="cover" :src="item.images[0]" />
                     <div class="info">
                         <div class="name">{{ item.name }}</div>
-                        <div class="desc">
-                            计划融资<span class="money">{{ item.planMoney }}</span>
+                        <div class="desc" v-if="item.series">
+                            计划融资<span class="money">{{ item.series }}</span>
                         </div>
                     </div>
                 </div>
@@ -47,7 +47,7 @@ export default {
     mixins: [subSnd],
     data() {
         return {
-            url: '/financingNeeds/all',
+            type: 'FINANCING_DEMAND',
             filters: [
                 {
                     name: '融资阶段',

+ 2 - 2
src/views/snd/dProduct.vue

@@ -29,7 +29,7 @@
             <van-empty v-if="empty" description="暂无内容" />
             <van-list v-else v-model="loading" :finished="last" finished-text="没有更多了" @load="loadmore">
                 <div class="list-item" v-for="item in list" :key="item.id" @click="detail(item.id, 'dProduct')">
-                    <img v-if="item.pic" class="cover" :src="item.pic" />
+                    <img v-if="item.images && item.images.length" class="cover" :src="item.images[0]" />
                     <div class="info">
                         <div class="name">{{ item.name }}</div>
                         <div class="desc">{{ item.needInfo }}</div>
@@ -45,7 +45,7 @@ export default {
     mixins: [subSnd],
     data() {
         return {
-            url: '/productNeed/all',
+            type: 'PRODUCT_DEMAND',
             filters: [
                 {
                     name: '应用领域',

+ 2 - 2
src/views/snd/dTech.vue

@@ -29,7 +29,7 @@
             <van-empty v-if="empty" description="暂无内容" />
             <van-list v-else v-model="loading" :finished="last" finished-text="没有更多了" @load="loadmore">
                 <div class="list-item" v-for="item in list" :key="item.id" @click="detail(item.id, 'dTech')">
-                    <img v-if="item.pic" class="cover" :src="item.pic" />
+                    <img v-if="item.images && item.images.length" class="cover" :src="item.images[0]" />
                     <div class="info">
                         <div class="name">{{ item.name }}</div>
                         <div class="desc">{{ item.needInfo }}</div>
@@ -45,7 +45,7 @@ export default {
     mixins: [subSnd],
     data() {
         return {
-            url: '/artNeed/all',
+            type: 'TECH_DEMAND',
             filters: [
                 {
                     name: '应用领域',

+ 2 - 2
src/views/snd/sProduct.vue

@@ -29,7 +29,7 @@
             <van-empty v-if="empty" description="暂无内容" />
             <van-list v-else v-model="loading" :finished="last" finished-text="没有更多了" @load="loadmore">
                 <div class="list-item" v-for="item in list" :key="item.id" @click="detail(item.id, 'sProduct')">
-                    <img v-if="item.picList && item.picList.length" class="cover" :src="item.picList[0].url" />
+                    <img v-if="item.images && item.images.length" class="cover" :src="item.images[0]" />
                     <div class="info">
                         <div class="name">{{ item.name }}</div>
                         <div class="desc">{{ item.description }}</div>
@@ -45,7 +45,7 @@ export default {
     mixins: [subSnd],
     data() {
         return {
-            url: '/product/all',
+            type: 'PRODUCT_DEMAND',
             filters: [
                 {
                     name: '应用领域',

+ 3 - 2
src/views/snd/sResource.vue

@@ -29,7 +29,7 @@
             <van-empty v-if="empty" description="暂无内容" />
             <van-list v-else v-model="loading" :finished="last" finished-text="没有更多了" @load="loadmore">
                 <div class="list-item" v-for="item in list" :key="item.id" @click="detail(item.id, 'sResource')">
-                    <img v-if="item.picList && item.picList.length" class="cover" :src="item.picList[0].url" />
+                    <img v-if="item.images && item.images.length" class="cover" :src="item.images[0]" />
                     <div class="info">
                         <div class="name">{{ item.name }}</div>
                         <div class="desc">{{ item.description }}</div>
@@ -45,7 +45,8 @@ export default {
     mixins: [subSnd],
     data() {
         return {
-            url: '/tresource/all',
+            url: '/resourceSupplyAndDemand/all',
+            type: 'RES_SUPPLY',
             filters: [
                 {
                     name: '应用领域',

+ 2 - 2
src/views/snd/sTech.vue

@@ -29,7 +29,7 @@
             <van-empty v-if="empty" description="暂无内容" />
             <van-list v-else v-model="loading" :finished="last" finished-text="没有更多了" @load="loadmore">
                 <div class="list-item" v-for="item in list" :key="item.id" @click="detail(item.id, 'sTech')">
-                    <img v-if="item.picList && item.picList.length" class="cover" :src="item.picList[0].url" />
+                    <img v-if="item.images && item.images.length" class="cover" :src="item.images[0]" />
                     <div class="info">
                         <div class="name">{{ item.name }}</div>
                         <div class="desc">{{ item.description }}</div>
@@ -45,7 +45,7 @@ export default {
     mixins: [subSnd],
     data() {
         return {
-            url: '/artProduct/all',
+            type: 'TECH_SUPPLY',
             filters: [
                 {
                     name: '应用领域',

+ 67 - 23
src/views/snd/sndDetail.vue

@@ -13,21 +13,21 @@
 
         <div class="article-title">{{ detail.name }}</div>
         <div class="form">
-            <div class="row" v-for="(item, index) in properties" :key="index">
-                <div class="label">{{ item.label }}</div>
+            <div class="row" v-for="(item, index) in detail.resSnDPropertyList" :key="index">
+                <div class="label">{{ item.name }}</div>
                 <div class="value">{{ item.value }}</div>
             </div>
-            <div class="row">
+            <div class="row" v-if="detail.contact">
                 <div class="label">联系人</div>
-                <div class="value">{{ detail.contactName }}</div>
+                <div class="value">{{ detail.contact }}</div>
             </div>
-            <div class="row">
-                <div class="label">联系人</div>
-                <div class="value">{{ detail.contactName }}</div>
-            </div>
-            <div class="row">
+            <div class="row" v-if="detail.phone">
                 <div class="label">联系方式</div>
-                <div class="value">{{ detail.contactPhone }}</div>
+                <div class="value">{{ detail.phone }}</div>
+            </div>
+            <div class="row" v-if="detail.address">
+                <div class="label">联系地址</div>
+                <div class="value">{{ detail.address }}</div>
             </div>
         </div>
         <div class="desc" v-if="detail.needInfo || detail.description">{{ detail.needInfo || detail.description }}</div>
@@ -44,9 +44,16 @@
         <div class="article-content" v-html="detail.details"></div>
         <div class="bottom-holder">
             <div class="bottom-body">
-                <div class="like">
-                    <img src="../../assets/icon_collect.png" class="icon" />
-                    <div class="txt">收藏</div>
+                <div class="like" @click="collect">
+                    <img
+                        :src="
+                            collected
+                                ? require('../../assets/icon_collect_pre.png')
+                                : require('../../assets/icon_collect.png')
+                        "
+                        class="icon"
+                    />
+                    <div class="txt" :class="{ active: collected }">收藏</div>
                 </div>
                 <div class="btn-msg" @click="contact">
                     <img src="../../assets/icon_msg.png" class="icon" />
@@ -57,20 +64,29 @@
     </div>
 </template>
 <script>
+import { mapState } from 'vuex';
 export default {
     data() {
         return {
-            detail: {},
-            type: ''
+            detail: { resSnDPropertyList: [] },
+            type: '',
+            collected: false
         };
     },
     created() {
         this.type = this.$route.query.type;
-        this.$http.get(`${this.url}/${this.$route.query.id}`).then(res => {
-            this.detail = res;
+        this.$http.get(`resourceSupplyAndDemand/get/${this.$route.query.id}`).then(res => {
+            this.detail = {
+                ...res.resourceSupplyAndDemand,
+                orgInfo: res.orgInfo
+            };
+        });
+        this.$http.get(`/collect/get/${this.$route.query.id}`).then(res => {
+            this.collected = res;
         });
     },
     computed: {
+        ...mapState(['userInfo']),
         pics() {
             if (this.detail.pic) {
                 return [this.detail.pic];
@@ -84,12 +100,18 @@ export default {
                 case 'dFinancial':
                 case 'dProduct':
                 case 'dTech':
+                case 'PRODUCT_DEMAND':
+                case 'FINANCING_DEMAND':
+                case 'TECH_DEMAND':
                     return '需求详情';
                 case 'sProduct':
+                case 'PRODUCT_SUPPLY':
                     return '产品详情';
                 case 'sTech':
+                case 'TECH_SUPPLY':
                     return '技术详情';
                 case 'sResource':
+                case 'RES_SUPPLY':
                     return '资源详情';
                 default:
                     return '详情';
@@ -98,16 +120,22 @@ export default {
         url() {
             switch (this.type) {
                 case 'dFinancial':
+                case 'FINANCING_DEMAND':
                     return '/financingNeeds/get';
                 case 'dProduct':
+                case 'PRODUCT_DEMAND':
                     return '/productNeed/get';
                 case 'dTech':
+                case 'TECH_DEMAND':
                     return '/artNeed/get';
                 case 'sProduct':
+                case 'PRODUCT_SUPPLY':
                     return '/product/get';
                 case 'sTech':
+                case 'TECH_SUPPLY':
                     return '/artProduct/get';
                 case 'sResource':
+                case 'RES_SUPPLY':
                     return '/tresource/get';
                 default:
                     return '';
@@ -149,12 +177,25 @@ export default {
     methods: {
         contact() {
             if (this.checkLogin()) {
-                this.$router.push({
-                    name: 'leaveMessage',
-                    query: {
-                        id: this.$route.query.id
-                    }
-                });
+                if (this.userInfo.orgName && this.userInfo.contactName && this.userInfo.contactPhone) {
+                    this.$router.push({
+                        name: 'leaveMessage',
+                        query: {
+                            id: this.$route.query.id
+                        }
+                    });
+                } else {
+                    this.$router.push({
+                        name: 'profile'
+                    });
+                }
+            }
+        },
+        collect() {
+            this.collected = !this.collected;
+            this.$http.get(`/collect/${this.$route.query.id}`);
+            if (this.collected) {
+                this.$toast.success('收藏成功');
             }
         }
     }
@@ -279,6 +320,9 @@ export default {
                 font-size: 10px;
                 color: @text1;
                 line-height: 16px;
+                &.active {
+                    color: @prim;
+                }
             }
         }
         .btn-msg {

+ 3 - 1
src/views/snd/sndList.vue

@@ -1,7 +1,9 @@
 <template>
     <div class="snd-root">
         <nav-bar @click-left="$router.go(-1)">
-            <div slot="title" class="nav-title-search"><img src="../../assets/icon_search.png" />搜索供需...</div>
+            <div slot="title" class="nav-title-search" @click="$router.push({ name: 'search' })">
+                <img src="../../assets/icon_search.png" />搜索供需...
+            </div>
             <div slot="append">
                 <div class="tab-row">
                     <van-tabs

+ 15 - 7
src/views/snd/subSnd.js

@@ -67,23 +67,31 @@ export default {
             }
             let data = {
                 page: this.page,
-                query: {}
+                query: {
+                    type: this.type
+                }
             };
             if (this.sort) {
                 data.sort = this.sort;
             }
-            this.filters.forEach(i => {
-                if (i.value !== -1) {
-                    data.query[i.field] = { id: i.value };
-                }
-            });
+            data.query.resSnDPropertyList = this.filters
+                .filter(i => i.value > -1)
+                .map(i => {
+                    return `name:${i.name},value:${i.text}`;
+                })
+                .join(';');
             this.$http
-                .get(this.url, data)
+                .get('/resourceSupplyAndDemand/all', data)
                 .then(res => {
                     if (res.first) {
                         this.list = [];
                     }
                     this.list = this.list.concat(res.content);
+                    if (this.type === 'FINANCING_DEMAND') {
+                        this.list.forEach(i => {
+                            this.$set(i, 'series', (i.resSnDPropertyList.find(i => i.name === '融资阶段') || {}).value);
+                        });
+                    }
                     this.last = res.last;
                     this.empty = res.totalElements === 0;
                     this.$nextTick(() => {

BIN
zouma.jks