xiongzhu 4 rokov pred
rodič
commit
eb6e7b9307

+ 1 - 1
android/app/capacitor.build.gradle

@@ -9,7 +9,7 @@ android {
 
 apply from: "../capacitor-cordova-android-plugins/cordova.variables.gradle"
 dependencies {
-
+    implementation project(':capacitor-community-keep-awake')
 
 }
 

+ 11 - 9
android/app/src/main/java/com/izouma/jmrh/MainActivity.java

@@ -4,18 +4,20 @@ import android.os.Bundle;
 
 import com.getcapacitor.BridgeActivity;
 import com.getcapacitor.Plugin;
+import com.getcapacitor.community.keepawake.KeepAwake;
 
 import java.util.ArrayList;
 
 public class MainActivity extends BridgeActivity {
-  @Override
-  public void onCreate(Bundle savedInstanceState) {
-    super.onCreate(savedInstanceState);
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
 
-    // Initializes the Bridge
-    this.init(savedInstanceState, new ArrayList<Class<? extends Plugin>>() {{
-      // Additional plugins you've installed go here
-      // Ex: add(TotallyAwesomePlugin.class);
-    }});
-  }
+        // Initializes the Bridge
+        this.init(savedInstanceState, new ArrayList<Class<? extends Plugin>>() {{
+            // Additional plugins you've installed go here
+            // Ex: add(TotallyAwesomePlugin.class);
+            add(KeepAwake.class);
+        }});
+    }
 }

+ 3 - 0
android/capacitor.settings.gradle

@@ -1,3 +1,6 @@
 // DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN
 include ':capacitor-android'
 project(':capacitor-android').projectDir = new File('../node_modules/@capacitor/android/capacitor')
+
+include ':capacitor-community-keep-awake'
+project(':capacitor-community-keep-awake').projectDir = new File('../node_modules/@capacitor-community/keep-awake/android')

+ 1 - 1
ios/App/Podfile

@@ -10,7 +10,7 @@ def capacitor_pods
   # Automatic Capacitor Pod dependencies, do not delete
   pod 'Capacitor', :path => '../../node_modules/@capacitor/ios'
   pod 'CapacitorCordova', :path => '../../node_modules/@capacitor/ios'
-  
+  pod 'CapacitorCommunityKeepAwake', :path => '../../node_modules/@capacitor-community/keep-awake'
   # Do not delete
 end
 

+ 1 - 0
package.json

@@ -15,6 +15,7 @@
   "author": "",
   "license": "ISC",
   "dependencies": {
+    "@capacitor-community/keep-awake": "^1.0.0",
     "@capacitor/android": "2.4.6",
     "@capacitor/cli": "^2.4.6",
     "@capacitor/core": "^2.4.6",

+ 3 - 1
src/App.vue

@@ -1,6 +1,8 @@
 <template>
     <transition :name="'transition-' + $store.state.direction">
-        <router-view class="router-page" id="root" v-transition></router-view>
+        <keep-alive :include="['sndList']">
+            <router-view class="router-page" id="root" v-transition></router-view>
+        </keep-alive>
     </transition>
 </template>
 <script>

BIN
src/assets/icon_like.png


BIN
src/assets/icon_like_pre.png


BIN
src/assets/icon_msg.png


BIN
src/assets/icon_org.png


+ 3 - 1
src/main.js

@@ -33,10 +33,12 @@ Vue.component('nav-bar', NavBar);
 Vue.use(vueg, router, {});
 
 const { StatusBar } = Plugins;
-
 StatusBar.setOverlaysWebView({
     overlay: true
 });
+if (process.env.NODE_ENV === 'development') {
+    Plugins.KeepAwake.keepAwake();
+}
 const vm = new Vue({
     router,
     store,

+ 8 - 0
src/router.js

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

+ 16 - 0
src/styles/common/index.less

@@ -124,3 +124,19 @@
         background-color: #8f9294;
     }
 }
+.btn-sm {
+    height: 30px;
+    .flex();
+    justify-content: center;
+    padding: 0 12px;
+    background: @prim;
+    border-radius: 4px;
+    color: white;
+    font-size: 13px;
+    &:active {
+        background: shade(@prim, 10%);
+    }
+    &.disabled {
+        background-color: #8f9294;
+    }
+}

+ 2 - 0
src/views/article.vue

@@ -37,6 +37,8 @@ export default {
 .article-content {
     margin: 10px 16px 0 16px;
     line-height: 1.5;
+    font-size: 14px;
+    line-height: 24px;
     /deep/ img {
         width: 100%;
         height: auto;

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

@@ -32,11 +32,11 @@
                         <img class="icon" src="../../assets/home_menu_2.png" />
                         <div class="text">政策法规</div>
                     </router-link>
-                    <router-link to="/news" class="item">
+                    <router-link to="/sndList/sProduct" class="item">
                         <img class="icon" src="../../assets/home_menu_3.png" />
                         <div class="text">找产品</div>
                     </router-link>
-                    <router-link to="/news" class="item">
+                    <router-link to="/sndList/dTech" class="item">
                         <img class="icon" src="../../assets/home_menu_4.png" />
                         <div class="text">看需求</div>
                     </router-link>

+ 6 - 6
src/views/index/snd.vue

@@ -6,21 +6,21 @@
             style="margin-top:calc(26px + var(--safe-top))"
         />
         <router-link
-            to="/sndList"
+            to="/sndList/sTech"
             class="item"
             :style="{ backgroundImage: `url(${require('../../assets/gongying_img_01.png')})` }"
         >
             <img src="../../assets/gongying_icon_01.png" />技术发布
         </router-link>
         <router-link
-            to="/sndList"
+            to="/sndList/sProduct"
             class="item"
             :style="{ backgroundImage: `url(${require('../../assets/gongying_img_02.png')})` }"
         >
             <img src="../../assets/gongying_icon_02.png" />产品发布
         </router-link>
         <router-link
-            to="/sndList"
+            to="/sndList/sResource"
             class="item"
             :style="{ backgroundImage: `url(${require('../../assets/gongying_img_03.png')})` }"
         >
@@ -28,21 +28,21 @@
         </router-link>
         <img src="../../assets/gongying_text_02.png" class="img-title" style="margin-top:42px" />
         <router-link
-            to="/sndList"
+            to="/sndList/dTech"
             class="item"
             :style="{ backgroundImage: `url(${require('../../assets/gongying_img_04.png')})` }"
         >
             <img src="../../assets/gongying_icon_04.png" />技术需求
         </router-link>
         <router-link
-            to="/sndList"
+            to="/sndList/sProduct"
             class="item"
             :style="{ backgroundImage: `url(${require('../../assets/gongying_img_05.png')})` }"
         >
             <img src="../../assets/gongying_icon_05.png" />产品需求
         </router-link>
         <router-link
-            to="/sndList"
+            to="/sndList/dFinancial"
             class="item"
             :style="{ backgroundImage: `url(${require('../../assets/gongying_img_06.png')})` }"
         >

+ 67 - 3
src/views/snd/dFinancial.vue

@@ -1,11 +1,75 @@
 <template>
-    <div></div>
+    <div class="sub-snd">
+        <div class="filters">
+            <div class="filter-item btn" :class="{ active: filtered }" style="width:16%" @click="sort = ''">综合</div>
+            <div class="filter-item btn" :class="{ active: !!sort }" style="width:28%" @click="changeSort">
+                发布时间
+                <img src="../../assets/icon_sort_desc.png" class="icon" v-if="sort === 'createdAt,desc'" />
+                <img src="../../assets/icon_sort_asc.png" class="icon" v-else-if="sort === 'createdAt'" />
+                <img src="../../assets/icon_sort.png" class="icon" v-else />
+            </div>
+            <van-dropdown-menu
+                v-for="item in filters"
+                :key="item.keyType"
+                class="filter-item"
+                style="width:28%;padding-right:8px"
+            >
+                <van-dropdown-item
+                    v-model="item.value"
+                    :options="item.options"
+                    @change="onDropdownChange(item, $event)"
+                >
+                    <div slot="title" :class="{ active: item.value !== -1 }">
+                        {{ item.value === -1 ? item.name : item.text }}
+                    </div>
+                </van-dropdown-item>
+            </van-dropdown-menu>
+        </div>
+        <van-pull-refresh class="list" v-model="refreshing" @refresh="refresh">
+            <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')">
+                    <div v-if="item.pic" class="cover" :style="{ backgroundImage: `url(${item.pic})` }"></div>
+                    <div class="info">
+                        <div class="name">{{ item.name }}</div>
+                        <div class="desc">
+                            计划融资<span class="money">{{ item.planMoney }}</span>
+                        </div>
+                    </div>
+                </div>
+            </van-list>
+        </van-pull-refresh>
+    </div>
 </template>
 <script>
+import subSnd from './subSnd';
 export default {
+    mixins: [subSnd],
     data() {
-        return {};
+        return {
+            url: '/financingNeeds/all',
+            filters: [
+                {
+                    name: '融资阶段',
+                    keyType: 'rzjd',
+                    field: 'stageType',
+                    options: [],
+                    value: -1,
+                    text: ''
+                },
+                {
+                    name: '融资行业',
+                    keyType: 'rzhy',
+                    field: 'dataType',
+                    options: [],
+                    value: -1,
+                    text: ''
+                }
+            ]
+        };
     }
 };
 </script>
-<style lang="less" scoped></style>
+<style lang="less" scoped>
+@import url('./subSnd.less');
+</style>

+ 65 - 3
src/views/snd/dProduct.vue

@@ -1,11 +1,73 @@
 <template>
-    <div></div>
+    <div class="sub-snd">
+        <div class="filters">
+            <div class="filter-item btn" :class="{ active: filtered }" style="width:16%" @click="sort = ''">综合</div>
+            <div class="filter-item btn" :class="{ active: !!sort }" style="width:28%" @click="changeSort">
+                发布时间
+                <img src="../../assets/icon_sort_desc.png" class="icon" v-if="sort === 'createdAt,desc'" />
+                <img src="../../assets/icon_sort_asc.png" class="icon" v-else-if="sort === 'createdAt'" />
+                <img src="../../assets/icon_sort.png" class="icon" v-else />
+            </div>
+            <van-dropdown-menu
+                v-for="item in filters"
+                :key="item.keyType"
+                class="filter-item"
+                style="width:28%;padding-right:8px"
+            >
+                <van-dropdown-item
+                    v-model="item.value"
+                    :options="item.options"
+                    @change="onDropdownChange(item, $event)"
+                >
+                    <div slot="title" :class="{ active: item.value !== -1 }">
+                        {{ item.value === -1 ? item.name : item.text }}
+                    </div>
+                </van-dropdown-item>
+            </van-dropdown-menu>
+        </div>
+        <van-pull-refresh class="list" v-model="refreshing" @refresh="refresh">
+            <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')">
+                    <div v-if="item.pic" class="cover" :style="{ backgroundImage: `url(${item.pic})` }"></div>
+                    <div class="info">
+                        <div class="name">{{ item.name }}</div>
+                        <div class="desc">{{ item.needInfo }}</div>
+                    </div>
+                </div>
+            </van-list>
+        </van-pull-refresh>
+    </div>
 </template>
 <script>
+import subSnd from './subSnd';
 export default {
+    mixins: [subSnd],
     data() {
-        return {};
+        return {
+            url: '/productNeed/all',
+            filters: [
+                {
+                    name: '应用领域',
+                    keyType: 'yyly',
+                    field: 'applicationField',
+                    options: [],
+                    value: -1,
+                    text: ''
+                },
+                {
+                    name: '设备类型',
+                    keyType: 'sblx',
+                    field: 'dataType',
+                    options: [],
+                    value: -1,
+                    text: ''
+                }
+            ]
+        };
     }
 };
 </script>
-<style lang="less" scoped></style>
+<style lang="less" scoped>
+@import url('./subSnd.less');
+</style>

+ 65 - 3
src/views/snd/dTech.vue

@@ -1,11 +1,73 @@
 <template>
-    <div></div>
+    <div class="sub-snd">
+        <div class="filters">
+            <div class="filter-item btn" :class="{ active: filtered }" style="width:16%" @click="sort = ''">综合</div>
+            <div class="filter-item btn" :class="{ active: !!sort }" style="width:28%" @click="changeSort">
+                发布时间
+                <img src="../../assets/icon_sort_desc.png" class="icon" v-if="sort === 'createdAt,desc'" />
+                <img src="../../assets/icon_sort_asc.png" class="icon" v-else-if="sort === 'createdAt'" />
+                <img src="../../assets/icon_sort.png" class="icon" v-else />
+            </div>
+            <van-dropdown-menu
+                v-for="item in filters"
+                :key="item.keyType"
+                class="filter-item"
+                style="width:28%;padding-right:8px"
+            >
+                <van-dropdown-item
+                    v-model="item.value"
+                    :options="item.options"
+                    @change="onDropdownChange(item, $event)"
+                >
+                    <div slot="title" :class="{ active: item.value !== -1 }">
+                        {{ item.value === -1 ? item.name : item.text }}
+                    </div>
+                </van-dropdown-item>
+            </van-dropdown-menu>
+        </div>
+        <van-pull-refresh class="list" v-model="refreshing" @refresh="refresh">
+            <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')">
+                    <div v-if="item.pic" class="cover" :style="{ backgroundImage: `url(${item.pic})` }"></div>
+                    <div class="info">
+                        <div class="name">{{ item.name }}</div>
+                        <div class="desc">{{ item.needInfo }}</div>
+                    </div>
+                </div>
+            </van-list>
+        </van-pull-refresh>
+    </div>
 </template>
 <script>
+import subSnd from './subSnd';
 export default {
+    mixins: [subSnd],
     data() {
-        return {};
+        return {
+            url: '/artNeed/all',
+            filters: [
+                {
+                    name: '应用领域',
+                    keyType: 'yyly',
+                    field: 'applicationField',
+                    options: [],
+                    value: -1,
+                    text: ''
+                },
+                {
+                    name: '技术类型',
+                    keyType: 'jslx',
+                    field: 'dataType',
+                    options: [],
+                    value: -1,
+                    text: ''
+                }
+            ]
+        };
     }
 };
 </script>
-<style lang="less" scoped></style>
+<style lang="less" scoped>
+@import url('./subSnd.less');
+</style>

+ 8 - 4
src/views/snd/sProduct.vue

@@ -28,11 +28,15 @@
         <van-pull-refresh class="list" v-model="refreshing" @refresh="refresh">
             <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">
-                    <div v-if="item.pic" class="cover" :style="{ backgroundImage: `url(${item.pic})` }"></div>
+                <div class="list-item" v-for="item in list" :key="item.id" @click="detail(item.id, 'sProduct')">
+                    <div
+                        v-if="item.picList && item.picList.length"
+                        class="cover"
+                        :style="{ backgroundImage: `url(${item.picList[0].url})` }"
+                    ></div>
                     <div class="info">
                         <div class="name">{{ item.name }}</div>
-                        <div class="desc">{{ item.needInfo }}</div>
+                        <div class="desc">{{ item.description }}</div>
                     </div>
                 </div>
             </van-list>
@@ -45,7 +49,7 @@ export default {
     mixins: [subSnd],
     data() {
         return {
-            url: '/artNeed/all',
+            url: '/product/all',
             filters: [
                 {
                     name: '应用领域',

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

@@ -1,11 +1,77 @@
 <template>
-    <div></div>
+    <div class="sub-snd">
+        <div class="filters">
+            <div class="filter-item btn" :class="{ active: filtered }" style="width:16%" @click="sort = ''">综合</div>
+            <div class="filter-item btn" :class="{ active: !!sort }" style="width:28%" @click="changeSort">
+                发布时间
+                <img src="../../assets/icon_sort_desc.png" class="icon" v-if="sort === 'createdAt,desc'" />
+                <img src="../../assets/icon_sort_asc.png" class="icon" v-else-if="sort === 'createdAt'" />
+                <img src="../../assets/icon_sort.png" class="icon" v-else />
+            </div>
+            <van-dropdown-menu
+                v-for="item in filters"
+                :key="item.keyType"
+                class="filter-item"
+                style="width:28%;padding-right:8px"
+            >
+                <van-dropdown-item
+                    v-model="item.value"
+                    :options="item.options"
+                    @change="onDropdownChange(item, $event)"
+                >
+                    <div slot="title" :class="{ active: item.value !== -1 }">
+                        {{ item.value === -1 ? item.name : item.text }}
+                    </div>
+                </van-dropdown-item>
+            </van-dropdown-menu>
+        </div>
+        <van-pull-refresh class="list" v-model="refreshing" @refresh="refresh">
+            <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')">
+                    <div
+                        v-if="item.picList && item.picList.length"
+                        class="cover"
+                        :style="{ backgroundImage: `url(${item.picList[0].url})` }"
+                    ></div>
+                    <div class="info">
+                        <div class="name">{{ item.name }}</div>
+                        <div class="desc">{{ item.description }}</div>
+                    </div>
+                </div>
+            </van-list>
+        </van-pull-refresh>
+    </div>
 </template>
 <script>
+import subSnd from './subSnd';
 export default {
+    mixins: [subSnd],
     data() {
-        return {};
+        return {
+            url: '/tresource/all',
+            filters: [
+                {
+                    name: '应用领域',
+                    keyType: 'yyly',
+                    field: 'applicationField',
+                    options: [],
+                    value: -1,
+                    text: ''
+                },
+                {
+                    name: '技术类型',
+                    keyType: 'jslx',
+                    field: 'dataType',
+                    options: [],
+                    value: -1,
+                    text: ''
+                }
+            ]
+        };
     }
 };
 </script>
-<style lang="less" scoped></style>
+<style lang="less" scoped>
+@import url('./subSnd.less');
+</style>

+ 8 - 4
src/views/snd/sTech.vue

@@ -28,11 +28,15 @@
         <van-pull-refresh class="list" v-model="refreshing" @refresh="refresh">
             <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">
-                    <div v-if="item.pic" class="cover" :style="{ backgroundImage: `url(${item.pic})` }"></div>
+                <div class="list-item" v-for="item in list" :key="item.id" @click="detail(item.id, 'sTech')">
+                    <div
+                        v-if="item.picList && item.picList.length"
+                        class="cover"
+                        :style="{ backgroundImage: `url(${item.picList[0].url})` }"
+                    ></div>
                     <div class="info">
                         <div class="name">{{ item.name }}</div>
-                        <div class="desc">{{ item.needInfo }}</div>
+                        <div class="desc">{{ item.description }}</div>
                     </div>
                 </div>
             </van-list>
@@ -45,7 +49,7 @@ export default {
     mixins: [subSnd],
     data() {
         return {
-            url: '/artNeed/all',
+            url: '/artProduct/all',
             filters: [
                 {
                     name: '应用领域',

+ 298 - 0
src/views/snd/sndDetail.vue

@@ -0,0 +1,298 @@
+<template>
+    <div>
+        <nav-bar right-icon="share" @click-left="$router.go(-1)" :title="title"></nav-bar>
+        <van-swipe v-if="pics.length" class="swiper" :autoplay="3000" indicator-color="white">
+            <van-swipe-item
+                class="swiper-item"
+                v-for="(item, index) in pics"
+                :key="index"
+                :style="{ backgroundImage: `url(${item})` }"
+            >
+            </van-swipe-item>
+        </van-swipe>
+
+        <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="value">{{ item.value }}</div>
+            </div>
+            <div class="row">
+                <div class="label">联系人</div>
+                <div class="value">{{ detail.contactName }}</div>
+            </div>
+            <div class="row">
+                <div class="label">联系人</div>
+                <div class="value">{{ detail.contactName }}</div>
+            </div>
+            <div class="row">
+                <div class="label">联系方式</div>
+                <div class="value">{{ detail.contactPhone }}</div>
+            </div>
+        </div>
+        <div class="desc" v-if="detail.needInfo || detail.description">{{ detail.needInfo || detail.description }}</div>
+        <div class="org" v-if="detail.orgInfo">
+            <div class="logo" :style="{ backgroundImage: `url(${detail.orgInfo.logo || detail.orgInfo.loge})` }"></div>
+            <div class="info">
+                <div class="org-name">
+                    {{ detail.orgInfo.orgName }}<img src="../../assets/icon_org.png" class="icon-org" />
+                </div>
+                <div class="btn-sm btn-org">查看企业</div>
+            </div>
+        </div>
+        <div class="divider"></div>
+        <div class="article-content" v-html="detail.details"></div>
+        <div class="bottom-holder">
+            <div class="bottom-body">
+                <div class="like">
+                    <img src="../../assets/icon_like.png" class="icon" />
+                    <div class="txt">收藏</div>
+                </div>
+                <div class="btn-msg">
+                    <img src="../../assets/icon_msg.png" class="icon" />
+                    联系对接
+                </div>
+            </div>
+        </div>
+    </div>
+</template>
+<script>
+export default {
+    data() {
+        return {
+            detail: {},
+            type: ''
+        };
+    },
+    created() {
+        this.type = this.$route.query.type;
+        this.$http.get(`${this.url}/${this.$route.query.id}`).then(res => {
+            this.detail = res;
+        });
+    },
+    computed: {
+        pics() {
+            if (this.detail.pic) {
+                return [this.detail.pic];
+            } else if (this.detail.picList) {
+                return this.detail.picList.map(i => i.url);
+            }
+            return [];
+        },
+        title() {
+            switch (this.type) {
+                case 'dFinancial':
+                case 'dProduct':
+                case 'dTech':
+                    return '需求详情';
+                case 'sProduct':
+                    return '产品详情';
+                case 'sTech':
+                    return '技术详情';
+                case 'sResource':
+                    return '资源详情';
+                default:
+                    return '详情';
+            }
+        },
+        url() {
+            switch (this.type) {
+                case 'dFinancial':
+                    return '/financingNeeds/get';
+                case 'dProduct':
+                    return '/productNeed/get';
+                case 'dTech':
+                    return '/artNeed/get';
+                case 'sProduct':
+                    return '/product/get';
+                case 'sTech':
+                    return '/artProduct/get';
+                case 'sResource':
+                    return '/tresource/get';
+                default:
+                    return '';
+            }
+        },
+        properties() {
+            const nameMap = {
+                yyly: '应用领域',
+                jslx: '技术类型',
+                sblx: '设备类型',
+                rzjd: '融资阶段',
+                rzhy: '融资行业'
+            };
+            let properties = [];
+            if (this.detail.applicationField) {
+                properties.push(this.detail.applicationField);
+            }
+            if (this.detail.dataType) {
+                properties.push(this.detail.dataType);
+            }
+            if (this.detail.stageType) {
+                properties.push(this.detail.stageType);
+            }
+            properties = properties.map(i => {
+                return {
+                    label: nameMap[i.keyType],
+                    value: i.name
+                };
+            });
+            if (this.detail.planMoney) {
+                properties.push({
+                    label: '计划融资',
+                    value: this.detail.planMoney
+                });
+            }
+            return properties;
+        }
+    }
+};
+</script>
+<style lang="less" scoped>
+.article-title {
+    margin: 16px 16px 0 16px;
+    font-size: 20px;
+    color: black;
+    font-weight: bold;
+}
+.article-desc {
+    margin: 10px 16px 0 16px;
+    font-size: 13px;
+    color: @text3;
+}
+.article-content {
+    margin: 10px 16px 0 16px;
+    line-height: 1.5;
+    font-size: 14px;
+    line-height: 24px;
+    /deep/ img {
+        width: 100%;
+        height: auto;
+        border-radius: 8px;
+    }
+}
+.swiper {
+    height: 100vw;
+    .swiper-item {
+        height: 100vw;
+        background-position: center;
+        background-size: cover;
+    }
+}
+.form {
+    background: @bg;
+    margin: 16px 16px 0 16px;
+    border-radius: 8px;
+    padding: 14px;
+    .flex-col();
+    .row {
+        height: 24px;
+        .flex();
+        margin-top: 12px;
+        font-size: 14px;
+        &:first-child {
+            margin-top: 0;
+        }
+        .label {
+            width: 72px;
+            min-width: 72px;
+            color: @text3;
+        }
+        .value {
+            color: black;
+        }
+    }
+}
+.desc {
+    font-size: 14px;
+    margin: 16px 16px 0 16px;
+    color: black;
+    line-height: 24px;
+}
+.org {
+    margin: 20px 16px 0 16px;
+    .flex();
+    .logo {
+        width: 70px;
+        height: 70px;
+        background-position: center;
+        background-size: cover;
+    }
+    .info {
+        .flex-col();
+        margin-left: 8px;
+        .org-name {
+            .flex();
+            font-size: 14px;
+            color: black;
+            font-weight: bold;
+            margin-top: 2px;
+            .icon-org {
+                width: 24px;
+                height: 24px;
+            }
+        }
+        .btn-org {
+            margin-top: 8px;
+            align-self: flex-start;
+        }
+    }
+}
+.divider {
+    margin: 20px 16px 0 16px;
+    height: 1px;
+    background: @bg;
+}
+.bottom-holder {
+    height: calc(56px + var(--safe-bottom));
+    .bottom-body {
+        height: calc(56px + var(--safe-bottom));
+        box-sizing: border-box;
+        padding-bottom: var(--safe-bottom);
+        position: fixed;
+        bottom: 0;
+        left: 0;
+        width: 100%;
+        background: white;
+        .flex();
+        .like {
+            .flex-col();
+            width: 92px;
+            align-items: center;
+            justify-content: center;
+            .icon {
+                width: 24px;
+                height: 24px;
+            }
+            .txt {
+                font-size: 10px;
+                color: @text1;
+                line-height: 16px;
+            }
+        }
+        .btn-msg {
+            .flex();
+            background: @prim;
+            height: 40px;
+            border-radius: 4px;
+            .flex();
+            justify-content: center;
+            font-size: 14px;
+            color: white;
+            flex-grow: 1;
+            margin-right: 20px;
+            .icon {
+                width: 24px;
+                height: 24px;
+                margin-right: 8px;
+            }
+            &:active {
+                background: shade(@prim, 10%);
+            }
+            &.disabled {
+                background-color: #8f9294;
+            }
+        }
+    }
+}
+</style>

+ 9 - 0
src/views/snd/sndList.vue

@@ -27,6 +27,7 @@
 </template>
 <script>
 export default {
+    name: 'sndList',
     data() {
         return {
             type: 0
@@ -40,6 +41,14 @@ export default {
             ),
             0
         );
+    },
+    activated() {
+        this.type = Math.max(
+            ['sTech', 'sProduct', 'sResource', 'dTech', 'dProduct', 'dFinancial'].findIndex(
+                i => i === this.$route.name
+            ),
+            0
+        );
     }
 };
 </script>

+ 9 - 0
src/views/snd/subSnd.js

@@ -127,6 +127,15 @@ export default {
             this.page = 0;
             this.last = false;
             this.getData();
+        },
+        detail(id, type) {
+            this.$router.push({
+                path: '/sndDetail',
+                query: {
+                    id: id,
+                    type: type
+                }
+            });
         }
     },
     watch: {

+ 8 - 3
src/views/snd/subSnd.less

@@ -80,6 +80,7 @@
     margin: 16px 16px 0 16px;
     overflow: hidden;
     padding-right: 14px;
+    align-items: flex-start;
     &:active {
         background: shade(#ffffff, 5%);
     }
@@ -92,13 +93,13 @@
         background-position: center;
         background-size: cover;
         min-width: 110px;
-        margin-right: 10px;
     }
     .info {
         flex-basis: 0;
         flex-grow: 1;
         .flex-col();
-        justify-content: center;
+        padding-left: 10px;
+        padding-top: 10px;
         .name {
             font-size: 16px;
             color: black;
@@ -111,6 +112,10 @@
             line-height: 22px;
             .ellipsisLn(2);
             margin-top: 4px;
+            .money {
+                color: @prim;
+                margin-left: 8px;
+            }
         }
     }
-}
+}

+ 5 - 0
yarn.lock

@@ -656,6 +656,11 @@
     lodash "^4.17.19"
     to-fast-properties "^2.0.0"
 
+"@capacitor-community/keep-awake@^1.0.0":
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/@capacitor-community/keep-awake/-/keep-awake-1.0.0.tgz#f570e9395f056a546facbadaa592a71a2619d68a"
+  integrity sha512-4CMFpkLRnnQKBk4i0yz9gGAC48XgCqUtSG96g+miCVUzoPhzO4LcrFa5FcNLUahHkcCiaICyf1tnAr6k1cpc5g==
+
 "@capacitor/android@2.4.6":
   version "2.4.6"
   resolved "https://registry.yarnpkg.com/@capacitor/android/-/android-2.4.6.tgz#57c65f67d6a4e6b67f7f0f7fd23fa4c3c324ecc2"