guhongwei 3 éve
szülő
commit
1927c8964d

+ 15 - 0
src/router/index.js

@@ -13,16 +13,31 @@ const market = [
     meta: { title: '专利超市-专利展示' },
     component: () => import('../views/market/patentInfo/index.vue'),
   },
+  {
+    path: '/market/patentInfo/detail',
+    meta: { title: '专利展示-详细信息' },
+    component: () => import('../views/market/patentInfo/detail.vue'),
+  },
   {
     path: '/market/transfer/index',
     meta: { title: '专利超市-专利转让' },
     component: () => import('../views/market/transfer/index.vue'),
   },
+  {
+    path: '/market/transfer/detail',
+    meta: { title: '专利转让-详细信息' },
+    component: () => import('../views/market/transfer/detail.vue'),
+  },
   {
     path: '/market/demand/index',
     meta: { title: '专利超市-专利需求' },
     component: () => import('../views/market/demand/index.vue'),
   },
+  {
+    path: '/market/demand/detail',
+    meta: { title: '专利需求-详细信息' },
+    component: () => import('../views/market/demand/detail.vue'),
+  },
   {
     path: '/market/navigation/index',
     meta: { title: '专利超市-专利导航' },

+ 63 - 0
src/views/market/demand/detail.vue

@@ -0,0 +1,63 @@
+<template>
+  <div id="detail">
+    <admin-frame topType="2" @back="back" :rightArrow="false" :usePage="false" :useNav="false">
+      <template v-slot:info>
+        <info-1 :info="info"></info-1>
+      </template>
+    </admin-frame>
+  </div>
+</template>
+
+<script>
+import info1 from './parts/info-1.vue';
+import adminFrame from '@frame/src/components/mobile-frame/mobile-main.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: patenttrans } = createNamespacedHelpers('patenttrans');
+export default {
+  name: 'index',
+  props: {},
+  components: {
+    adminFrame,
+    info1,
+  },
+  data: function () {
+    return {
+      info: {},
+    };
+  },
+  async created() {
+    if (this.id) await this.search();
+  },
+  methods: {
+    ...patenttrans(['fetch']),
+    async search() {
+      let res = await this.fetch(this.id);
+      if (this.$checkRes(res)) {
+        this.$set(this, `info`, res.data);
+      }
+    },
+    // 返回
+    back() {
+      this.$router.push({ path: '/market/demand/index' });
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    id() {
+      return this.$route.query.id;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 19 - 2
src/views/market/demand/index.vue

@@ -1,22 +1,28 @@
 <template>
   <div id="index">
     <admin-frame @search="search" :limit="limit" :total="total" :useNav="false">
-      <template v-slot:info> 专利需求 </template>
+      <template v-slot:info>
+        <list-1 :list="list" @detail="detail"></list-1>
+      </template>
     </admin-frame>
   </div>
 </template>
 
 <script>
+import list1 from './parts/list-1.vue';
 import adminFrame from '@frame/src/components/mobile-frame/mobile-main.vue';
 import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: patenttrans } = createNamespacedHelpers('patenttrans');
 export default {
   name: 'index',
   props: {},
   components: {
     adminFrame,
+    list1,
   },
   data: function () {
     return {
+      list: [],
       limit: 5,
       total: 0,
     };
@@ -25,7 +31,18 @@ export default {
     await this.search();
   },
   methods: {
-    async search({ skip = 0, limit = 10, ...info } = {}) {},
+    ...patenttrans(['query']),
+    async search({ skip = 0, limit = this.limit, ...info } = {}) {
+      let res = await this.query({ skip, limit, ...info });
+      if (this.$checkRes(res)) {
+        this.$set(this, `list`, res.data);
+        this.$set(this, `total`, res.total);
+      }
+    },
+    // 详情
+    detail(data) {
+      this.$router.push({ path: '/market/demand/detail', query: { id: data.id } });
+    },
   },
   computed: {
     ...mapState(['user']),

+ 62 - 0
src/views/market/demand/parts/info-1.vue

@@ -0,0 +1,62 @@
+<template>
+  <div id="info-1">
+    <van-row>
+      <van-col span="24" class="main">
+        <van-col :span="24" class="one">
+          <van-form label-width="5em">
+            <van-field v-model="info.create_number" name="create_number" label="申请号" readonly />
+            <van-field v-model="info.patent_name" name="patent_name" label="专利名称" readonly />
+            <van-field v-model="info.contact" name="contact" label="联系人" readonly />
+            <van-field v-model="info.phone" name="phone" label="联系电话" readonly />
+            <van-field v-model="info.email" name="email" label="电子邮箱" readonly />
+            <van-field v-model="info.budget" name="budget" type="digit" label="投资预算" readonly />
+            <van-field v-model="info.type" name="type" label="交易类型" readonly />
+            <van-field name="is_report" label="评估报告">
+              <template #input>
+                <van-radio-group v-model="info.is_report" direction="horizontal" disabled>
+                  <van-radio :name="true">有</van-radio>
+                  <van-radio :name="false">无</van-radio>
+                </van-radio-group>
+                <van-button type="info" size="small" v-if="info.is_report == true" @click="download(info.report)">下载报告</van-button>
+              </template>
+            </van-field>
+            <van-field v-model="info.requirementdesc" name="requirementdesc" label="技术说明" rows="2" autosize type="textarea" readonly />
+            <van-field v-model="info.expect" name="expect" label="商业预期" rows="2" autosize type="textarea" readonly />
+            <van-field v-model="info.condition" name="condition" label="条件及要求" rows="2" autosize type="textarea" readonly />
+          </van-form>
+        </van-col>
+      </van-col>
+    </van-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'info-1',
+  props: {
+    info: { type: Object },
+  },
+  components: {},
+  data: function () {
+    return {};
+  },
+  created() {},
+  methods: {},
+  computed: {
+    ...mapState(['user']),
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 85 - 0
src/views/market/demand/parts/list-1.vue

@@ -0,0 +1,85 @@
+<template>
+  <div id="list-1">
+    <van-row>
+      <van-col span="24" class="main">
+        <van-col span="24" class="list" v-for="(item, index) in list" :key="index" @click.native="detail(item)">
+          <van-col span="24" class="title textOver">
+            {{ item.patent_name }}
+          </van-col>
+          <van-col span="24" class="other">
+            <van-col span="24" class="otherInfo">
+              申请号:<span>{{ item.create_number || '暂无' }}</span>
+            </van-col>
+            <van-col span="12" class="otherInfo">
+              交易类型:<span>{{ item.type || '暂无' }}</span>
+            </van-col>
+            <van-col span="12" class="otherInfo">
+              投资预算:<span>{{ item.budget || '暂无' }}万元</span>
+            </van-col>
+          </van-col>
+        </van-col>
+      </van-col>
+    </van-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'list-1',
+  props: {
+    list: { type: Array },
+  },
+  components: {},
+  data: function () {
+    return {};
+  },
+  created() {},
+  methods: {
+    detail(data) {
+      this.$emit('detail', data);
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  padding: 8px 8px 0 8px;
+  .list {
+    background-color: #fff;
+    margin: 0 0 8px 0;
+    padding: 8px;
+    border-radius: 5px;
+    .title {
+      font-size: 16px;
+      font-weight: bold;
+      margin: 0 0 5px 0;
+    }
+    .other {
+      margin: 0 0 5px 0;
+      .otherInfo {
+        font-size: 14px;
+        color: #666;
+        margin: 0 0 5px 0;
+        span {
+          color: #000;
+        }
+      }
+    }
+  }
+}
+</style>

+ 64 - 0
src/views/market/patentInfo/detail.vue

@@ -0,0 +1,64 @@
+<template>
+  <div id="detail">
+    <admin-frame topType="2" @back="back" :rightArrow="false" :usePage="false" :useNav="false">
+      <template v-slot:info>
+        <info-1 :info="info"></info-1>
+      </template>
+    </admin-frame>
+  </div>
+</template>
+
+<script>
+import info1 from './parts/info-1.vue';
+import adminFrame from '@frame/src/components/mobile-frame/mobile-main.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: patentinfo } = createNamespacedHelpers('patentinfo');
+export default {
+  name: 'index',
+  props: {},
+  components: {
+    adminFrame,
+    info1,
+  },
+  data: function () {
+    return {
+      info: {},
+    };
+  },
+  async created() {
+    if (this.id) await this.search();
+  },
+  methods: {
+    ...patentinfo(['fetch']),
+    async search() {
+      let res = await this.fetch(this.id);
+      if (this.$checkRes(res)) {
+        res.data.inventor = JSON.stringify(res.data.inventor.map((i) => i.name));
+        this.$set(this, `info`, res.data);
+      }
+    },
+    // 返回
+    back() {
+      this.$router.push({ path: '/market/patentInfo/index' });
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    id() {
+      return this.$route.query.id;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 19 - 2
src/views/market/patentInfo/index.vue

@@ -1,22 +1,28 @@
 <template>
   <div id="index">
     <admin-frame @search="search" :limit="limit" :total="total" :useNav="false">
-      <template v-slot:info> 专利展示 </template>
+      <template v-slot:info>
+        <list-1 :list="list" @detail="detail"></list-1>
+      </template>
     </admin-frame>
   </div>
 </template>
 
 <script>
+import list1 from './parts/list-1.vue';
 import adminFrame from '@frame/src/components/mobile-frame/mobile-main.vue';
 import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: patentinfo } = createNamespacedHelpers('patentinfo');
 export default {
   name: 'index',
   props: {},
   components: {
     adminFrame,
+    list1,
   },
   data: function () {
     return {
+      list: [],
       limit: 5,
       total: 0,
     };
@@ -25,7 +31,18 @@ export default {
     await this.search();
   },
   methods: {
-    async search({ skip = 0, limit = 10, ...info } = {}) {},
+    ...patentinfo(['query']),
+    async search({ skip = 0, limit = this.limit, ...info } = {}) {
+      let res = await this.query({ skip, limit, ...info });
+      if (this.$checkRes(res)) {
+        this.$set(this, `list`, res.data);
+        this.$set(this, `total`, res.total);
+      }
+    },
+    // 详情
+    detail(data) {
+      this.$router.push({ path: '/market/patentInfo/detail', query: { id: data.id } });
+    },
   },
   computed: {
     ...mapState(['user']),

+ 81 - 0
src/views/market/patentInfo/parts/info-1.vue

@@ -0,0 +1,81 @@
+<template>
+  <div id="info-1">
+    <van-row>
+      <van-col span="24" class="main">
+        <van-col :span="24" class="one">
+          <van-image :src="img_url"> </van-image>
+          <van-form>
+            <van-field v-model="info.term" label="专利有效性" readonly />
+            <van-field v-model="info.name" label="专利名称" type="textarea" autosize readonly />
+            <van-field v-model="info.create_number" label="申请号" readonly />
+            <van-field v-model="info.create_date" label="申请日" readonly />
+            <van-field v-model="info.success_number" label="公开(公告)号" readonly />
+            <van-field v-model="info.success_date" label="公开(公告)日" readonly />
+            <van-field v-model="info.type" label="专利类型" readonly />
+            <van-field v-model="info.inventor" label="发明人" type="textarea" autosize readonly />
+            <van-field v-model="info.address" label="发明人地址" readonly />
+            <van-field v-model="info.apply_personal" label="申请人" readonly />
+            <van-field v-model="info.agent_personal" label="代理人" readonly />
+            <van-field v-model="info.agent" label="代理机构" readonly />
+            <van-field v-model="info.abstract" label="摘要" type="textarea" autosize readonly />
+          </van-form>
+        </van-col>
+      </van-col>
+    </van-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'info-1',
+  props: {
+    info: { type: Object },
+  },
+  components: {},
+  data: function () {
+    return {
+      img_url: '',
+    };
+  },
+  created() {},
+  methods: {
+    searchImg(data) {
+      if (data && data.length > 0) {
+        var url = data.map((item) => item.url)[0];
+        this.$set(this, `img_url`, url);
+      } else {
+        var url = require('@/assets/fmzl.jpg');
+        this.$set(this, `img_url`, url);
+      }
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    info: {
+      deep: true,
+      immediate: true,
+      handler(val) {
+        this.searchImg(val.img_url);
+      },
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  .one {
+    .van-image {
+      width: 100%;
+      height: 220px;
+      overflow: hidden;
+    }
+  }
+}
+</style>

+ 82 - 0
src/views/market/patentInfo/parts/list-1.vue

@@ -0,0 +1,82 @@
+<template>
+  <div id="list-1">
+    <van-row>
+      <van-col span="24" class="main">
+        <van-col span="24" class="list" v-for="(item, index) in list" :key="index" @click.native="detail(item)">
+          <van-col span="24" class="title textOver">
+            {{ item.name }}
+          </van-col>
+          <van-col span="24" class="other">
+            <van-col span="24" class="otherInfo">
+              专利有效性:<span>{{ item.term || '暂无' }}</span>
+            </van-col>
+            <van-col span="24" class="otherInfo">
+              颁发时间:<span>{{ item.success_date || '暂无' }}</span>
+            </van-col>
+          </van-col>
+        </van-col>
+      </van-col>
+    </van-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'list-1',
+  props: {
+    list: { type: Array },
+  },
+  components: {},
+  data: function () {
+    return {};
+  },
+  created() {},
+  methods: {
+    detail(data) {
+      this.$emit('detail', data);
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  padding: 8px 8px 0 8px;
+  .list {
+    background-color: #fff;
+    margin: 0 0 8px 0;
+    padding: 8px;
+    border-radius: 5px;
+    .title {
+      font-size: 16px;
+      font-weight: bold;
+      margin: 0 0 5px 0;
+    }
+    .other {
+      margin: 0 0 5px 0;
+      .otherInfo {
+        font-size: 14px;
+        color: #666;
+        margin: 0 0 5px 0;
+        span {
+          color: #000;
+        }
+      }
+    }
+  }
+}
+</style>

+ 63 - 0
src/views/market/transfer/detail.vue

@@ -0,0 +1,63 @@
+<template>
+  <div id="detail">
+    <admin-frame topType="2" @back="back" :rightArrow="false" :usePage="false" :useNav="false">
+      <template v-slot:info>
+        <info-1 :info="info"></info-1>
+      </template>
+    </admin-frame>
+  </div>
+</template>
+
+<script>
+import info1 from './parts/info-1.vue';
+import adminFrame from '@frame/src/components/mobile-frame/mobile-main.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: patenttrans } = createNamespacedHelpers('patenttrans');
+export default {
+  name: 'index',
+  props: {},
+  components: {
+    adminFrame,
+    info1,
+  },
+  data: function () {
+    return {
+      info: {},
+    };
+  },
+  async created() {
+    if (this.id) await this.search();
+  },
+  methods: {
+    ...patenttrans(['fetch']),
+    async search() {
+      let res = await this.fetch(this.id);
+      if (this.$checkRes(res)) {
+        this.$set(this, `info`, res.data);
+      }
+    },
+    // 返回
+    back() {
+      this.$router.push({ path: '/market/transfer/index' });
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    id() {
+      return this.$route.query.id;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 19 - 2
src/views/market/transfer/index.vue

@@ -1,22 +1,28 @@
 <template>
   <div id="index">
     <admin-frame @search="search" :limit="limit" :total="total" :useNav="false">
-      <template v-slot:info> 专利转让 </template>
+      <template v-slot:info>
+        <list-1 :list="list" @detail="detail"></list-1>
+      </template>
     </admin-frame>
   </div>
 </template>
 
 <script>
+import list1 from './parts/list-1.vue';
 import adminFrame from '@frame/src/components/mobile-frame/mobile-main.vue';
 import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: patenttrans } = createNamespacedHelpers('patenttrans');
 export default {
   name: 'index',
   props: {},
   components: {
     adminFrame,
+    list1,
   },
   data: function () {
     return {
+      list: [],
       limit: 5,
       total: 0,
     };
@@ -25,7 +31,18 @@ export default {
     await this.search();
   },
   methods: {
-    async search({ skip = 0, limit = 10, ...info } = {}) {},
+    ...patenttrans(['query']),
+    async search({ skip = 0, limit = this.limit, ...info } = {}) {
+      let res = await this.query({ skip, limit, ...info });
+      if (this.$checkRes(res)) {
+        this.$set(this, `list`, res.data);
+        this.$set(this, `total`, res.total);
+      }
+    },
+    // 详情
+    detail(data) {
+      this.$router.push({ path: '/market/transfer/detail', query: { id: data.id } });
+    },
   },
   computed: {
     ...mapState(['user']),

+ 62 - 0
src/views/market/transfer/parts/info-1.vue

@@ -0,0 +1,62 @@
+<template>
+  <div id="info-1">
+    <van-row>
+      <van-col span="24" class="main">
+        <van-col :span="24" class="one">
+          <van-form label-width="5em">
+            <van-field v-model="info.create_number" name="create_number" label="申请号" readonly />
+            <van-field v-model="info.patent_name" name="patent_name" label="专利名称" readonly />
+            <van-field v-model="info.contact" name="contact" label="联系人" readonly />
+            <van-field v-model="info.phone" name="phone" label="联系电话" readonly />
+            <van-field v-model="info.email" name="email" label="电子邮箱" readonly />
+            <van-field v-model="info.budget" name="budget" type="digit" label="投资预算" readonly />
+            <van-field v-model="info.type" name="type" label="交易类型" readonly />
+            <van-field name="is_report" label="评估报告">
+              <template #input>
+                <van-radio-group v-model="info.is_report" direction="horizontal" disabled>
+                  <van-radio :name="true">有</van-radio>
+                  <van-radio :name="false">无</van-radio>
+                </van-radio-group>
+                <van-button type="info" size="small" v-if="info.is_report == true" @click="download(info.report)">下载报告</van-button>
+              </template>
+            </van-field>
+            <van-field v-model="info.requirementdesc" name="requirementdesc" label="技术说明" rows="2" autosize type="textarea" readonly />
+            <van-field v-model="info.expect" name="expect" label="商业预期" rows="2" autosize type="textarea" readonly />
+            <van-field v-model="info.condition" name="condition" label="条件及要求" rows="2" autosize type="textarea" readonly />
+          </van-form>
+        </van-col>
+      </van-col>
+    </van-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'info-1',
+  props: {
+    info: { type: Object },
+  },
+  components: {},
+  data: function () {
+    return {};
+  },
+  created() {},
+  methods: {},
+  computed: {
+    ...mapState(['user']),
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 85 - 0
src/views/market/transfer/parts/list-1.vue

@@ -0,0 +1,85 @@
+<template>
+  <div id="list-1">
+    <van-row>
+      <van-col span="24" class="main">
+        <van-col span="24" class="list" v-for="(item, index) in list" :key="index" @click.native="detail(item)">
+          <van-col span="24" class="title textOver">
+            {{ item.patent_name }}
+          </van-col>
+          <van-col span="24" class="other">
+            <van-col span="24" class="otherInfo">
+              申请号:<span>{{ item.create_number || '暂无' }}</span>
+            </van-col>
+            <van-col span="12" class="otherInfo">
+              交易类型:<span>{{ item.type || '暂无' }}</span>
+            </van-col>
+            <van-col span="12" class="otherInfo">
+              投资预算:<span>{{ item.budget || '暂无' }}万元</span>
+            </van-col>
+          </van-col>
+        </van-col>
+      </van-col>
+    </van-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'list-1',
+  props: {
+    list: { type: Array },
+  },
+  components: {},
+  data: function () {
+    return {};
+  },
+  created() {},
+  methods: {
+    detail(data) {
+      this.$emit('detail', data);
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  padding: 8px 8px 0 8px;
+  .list {
+    background-color: #fff;
+    margin: 0 0 8px 0;
+    padding: 8px;
+    border-radius: 5px;
+    .title {
+      font-size: 16px;
+      font-weight: bold;
+      margin: 0 0 5px 0;
+    }
+    .other {
+      margin: 0 0 5px 0;
+      .otherInfo {
+        font-size: 14px;
+        color: #666;
+        margin: 0 0 5px 0;
+        span {
+          color: #000;
+        }
+      }
+    }
+  }
+}
+</style>