guhongwei 3 年之前
父节点
当前提交
15b9737209
共有 44 个文件被更改,包括 2840 次插入25 次删除
  1. 二进制
      src/assets/fmzl.jpg
  2. 二进制
      src/assets/icon.jpg
  3. 二进制
      src/assets/kjpx.jpg
  4. 二进制
      src/assets/noimage.jpg
  5. 二进制
      src/assets/user.jpg
  6. 二进制
      src/assets/userbj.jpg
  7. 100 0
      src/layout/login/login-1.vue
  8. 57 0
      src/layout/login/login-2.vue
  9. 97 0
      src/layout/login/register-1.vue
  10. 90 0
      src/layout/login/register-2.vue
  11. 64 0
      src/router/index.js
  12. 2 2
      src/store/index.js
  13. 87 0
      src/views/account/adminCenter/mechanism/detail.vue
  14. 71 0
      src/views/account/adminCenter/mechanism/index.vue
  15. 66 0
      src/views/account/adminCenter/mechanism/parts/detail_1.vue
  16. 82 0
      src/views/account/adminCenter/mechanism/parts/list_1.vue
  17. 93 0
      src/views/account/adminCenter/users/detail.vue
  18. 101 0
      src/views/account/adminCenter/users/index.vue
  19. 88 0
      src/views/account/adminCenter/users/parts/company-1.vue
  20. 77 0
      src/views/account/adminCenter/users/parts/company-detail.vue
  21. 85 0
      src/views/account/adminCenter/users/parts/personal-1.vue
  22. 69 0
      src/views/account/adminCenter/users/parts/personal-detail.vue
  23. 83 8
      src/views/account/index.vue
  24. 87 0
      src/views/account/mechCenter/patent/index.vue
  25. 81 0
      src/views/account/mechCenter/patent/parts/info-1.vue
  26. 84 0
      src/views/account/mechCenter/patent/parts/list-1.vue
  27. 108 0
      src/views/account/mechCenter/users/detail.vue
  28. 110 0
      src/views/account/mechCenter/users/index.vue
  29. 88 0
      src/views/account/mechCenter/users/parts/company-1.vue
  30. 77 0
      src/views/account/mechCenter/users/parts/company-detail.vue
  31. 98 0
      src/views/account/mechCenter/users/parts/personal-1.vue
  32. 84 0
      src/views/account/mechCenter/users/parts/personal-detail.vue
  33. 48 0
      src/views/account/parts/role-1.vue
  34. 47 0
      src/views/account/parts/role-2.vue
  35. 43 0
      src/views/account/parts/role-3.vue
  36. 105 0
      src/views/account/userCenter/basic/index.vue
  37. 72 0
      src/views/account/userCenter/parts/basic-1.vue
  38. 104 0
      src/views/account/userCenter/parts/company-1.vue
  39. 91 0
      src/views/account/userCenter/parts/user-1.vue
  40. 68 0
      src/views/account/userCenter/password/index.vue
  41. 1 1
      src/views/index.vue
  42. 39 7
      src/views/login.vue
  43. 36 0
      src/views/patent/index.vue
  44. 57 7
      src/views/register.vue

二进制
src/assets/fmzl.jpg


二进制
src/assets/icon.jpg


二进制
src/assets/kjpx.jpg


二进制
src/assets/noimage.jpg


二进制
src/assets/user.jpg


二进制
src/assets/userbj.jpg


+ 100 - 0
src/layout/login/login-1.vue

@@ -0,0 +1,100 @@
+<template>
+  <div id="login-1">
+    <van-row>
+      <van-col span="24" class="main">
+        <van-form @submit="onSubmit">
+          <van-field v-model="form.phone" name="phone" label="账号" placeholder="账号" :rules="[{ required: true, message: '账号' }]" />
+          <van-field v-model="form.password" type="password" name="password" label="密码" placeholder="密码" :rules="[{ required: true, message: '密码' }]" />
+          <van-field name="role" label="用户类别">
+            <template #input>
+              <van-radio-group v-model="form.role" direction="horizontal">
+                <van-radio name="4">个人用户</van-radio>
+                <!-- <van-radio name="5">企业用户</van-radio> -->
+              </van-radio-group>
+            </template>
+          </van-field>
+          <div style="margin: 16px">
+            <van-button round block type="info" native-type="submit">登录</van-button>
+          </div>
+        </van-form>
+        <van-col span="24" class="register">
+          <span class="text">还没有账号?</span>
+          <van-button type="info" size="mini" plain @click="regBtn">现在注册</van-button>
+        </van-col>
+      </van-col>
+    </van-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: organization } = createNamespacedHelpers('organization');
+const { mapActions: personal } = createNamespacedHelpers('personal');
+export default {
+  name: 'login-1',
+  props: {},
+  components: {},
+  data: function () {
+    return {
+      form: {},
+    };
+  },
+  created() {},
+  methods: {
+    ...personal(['perLogin']),
+    ...organization(['orgLogin', 'wxLogin']),
+    async onSubmit(values) {
+      if (values.role == '4') {
+        // 个人用户
+        let res = await this.perLogin({ user: values });
+        if (this.$checkRes(res)) {
+          this.$router.push({ path: '/account/index' });
+        } else {
+          this.$toast({ type: 'fail', message: res.errmsg });
+        }
+      } else if (values.role == '5') {
+        // 企业用户
+        values.institution_code = values.phone;
+        let res = await this.orgLogin({ user: values });
+        if (this.$checkRes(res)) {
+          this.$router.push({ path: '/account/index' });
+        } else {
+          this.$toast({ type: 'fail', message: res.errmsg });
+        }
+      }
+    },
+    // 注册
+    regBtn() {
+      this.$router.push({ path: '/register' });
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  .register {
+    text-align: center;
+    .text {
+      position: relative;
+      top: 4px;
+      padding: 0 10px;
+      font-size: 12px;
+      color: #666;
+    }
+  }
+}
+</style>

+ 57 - 0
src/layout/login/login-2.vue

@@ -0,0 +1,57 @@
+<template>
+  <div id="login-2">
+    <van-row>
+      <van-col span="24" class="main">
+        <van-form @submit="onSubmit">
+          <van-field v-model="form.code_phone" name="code_phone" label="账号" placeholder="账号" :rules="[{ required: true, message: '账号' }]" />
+          <van-field v-model="form.passwd" type="password" name="passwd" label="密码" placeholder="密码" :rules="[{ required: true, message: '密码' }]" />
+          <div style="margin: 16px">
+            <van-button round block type="info" native-type="submit">登录</van-button>
+          </div>
+        </van-form>
+      </van-col>
+    </van-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: adminLogin } = createNamespacedHelpers('adminLogin');
+export default {
+  name: 'login-2',
+  props: {},
+  components: {},
+  data: function () {
+    return {
+      form: {},
+    };
+  },
+  created() {},
+  methods: {
+    ...adminLogin(['login']),
+    async onSubmit(values) {
+      let res = await this.login({ user: values });
+      if (this.$checkRes(res)) {
+        this.$router.push({ path: '/account/index' });
+      } else {
+        this.$toast({ type: 'fail', message: res.errmsg });
+      }
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 97 - 0
src/layout/login/register-1.vue

@@ -0,0 +1,97 @@
+<template>
+  <div id="register-1">
+    <van-row>
+      <van-col span="24" class="main">
+        <van-form @submit="onSubmit" label-width="6em">
+          <van-field v-model="form.name" name="name" label="用户名" :rules="[{ required: true, message: '用户名' }]" />
+          <van-field v-model="form.phone" name="phone" label="手机号" :rules="[{ required: true, message: '手机号' }]" />
+          <van-field v-model="form.password" type="password" name="password" label="登录密码" :rules="[{ required: true, message: '登录密码' }]" />
+          <van-field v-model="form.code" name="code" label="邀请码" :rules="[{ required: false, message: '邀请码' }]" />
+          <van-field name="type" label="用户类别" :rules="[{ required: true, message: '用户类别' }]">
+            <template #input>
+              <van-radio-group v-model="form.type" direction="horizontal">
+                <van-radio name="4">个人用户</van-radio>
+                <!-- <van-radio name="5">企业用户</van-radio> -->
+              </van-radio-group>
+            </template>
+          </van-field>
+          <van-field v-model="form.email" name="email" label="电子邮箱" />
+          <van-field v-model="form.addr" name="addr" label="联系地址" />
+          <van-field v-model="form.office_phone" name="office_phone" label="办公电话" />
+          <van-field readonly clickable name="juris" :value="form.juris" label="所属辖区" placeholder="点击选择" @click="showPicker = true" />
+          <van-popup v-model="showPicker" position="bottom">
+            <van-picker show-toolbar :columns="jurisList" @confirm="confirm" @cancel="showPicker = false" />
+          </van-popup>
+          <div class="btn">
+            <van-button round type="danger" size="normal" @click="reseat">取消注册</van-button>
+            <van-button round type="primary" size="normal" native-type="submit" v-if="form.type == '4'">提交注册</van-button>
+            <van-button round type="info" size="normal" @click="next" v-if="form.type == '5'">下一步</van-button>
+          </div>
+        </van-form>
+      </van-col>
+    </van-row>
+  </div>
+</template>
+
+<script>
+import { juris } from '@common/dict/index';
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'register-1',
+  props: {
+    form: { type: Object },
+  },
+  components: {},
+  data: function () {
+    return {
+      showPicker: false,
+      jurisList: juris,
+    };
+  },
+  created() {},
+  methods: {
+    // 取消注册
+    reseat() {
+      this.$router.push({ path: '/login' });
+    },
+    onSubmit(values) {
+      this.$emit('onSubmit', values);
+    },
+    // 下一步
+    next() {
+      this.$emit('next');
+    },
+
+    // 选择辖区
+    confirm(value) {
+      this.$set(this.form, `juris`, value);
+      this.showPicker = false;
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  .btn {
+    margin: 16px;
+    text-align: center;
+    .van-button {
+      margin: 0 10px;
+    }
+  }
+}
+</style>

+ 90 - 0
src/layout/login/register-2.vue

@@ -0,0 +1,90 @@
+<template>
+  <div id="register-2">
+    <van-row>
+      <van-col span="24" class="main">
+        <van-form @submit="onSubmit" label-width="5em">
+          <van-field v-model="form.institution_code" name="institution_code" label="统一社会信用代码" />
+          <van-field v-model="form.companytype" name="companytype" label="注册类型" />
+          <van-field readonly clickable name="calendar" :value="form.companydate" label="注册时间" placeholder="点击选择日期" @click="showCalendar = true" />
+          <van-calendar v-model="showCalendar" @confirm="onConfirm" />
+          <van-field v-model="form.companycapital" name="companycapital" label="注册资金" />
+          <van-field v-model="form.companyperson" name="companyperson" label="企业法人" />
+          <van-field v-model="form.sndqyzsr" name="sndqyzsr" label="企业总收入" />
+          <van-field v-model="form.sndyffy" name="sndyffy" label="研发费用" />
+          <van-field v-model="form.companytotal" name="companytotal" label="企业总人数" />
+          <van-field v-model="form.zjzyfrs" name="zjzyfrs" label="研发人数" />
+          <van-field v-model="form.companybrief" name="companybrief" label="企业简介" rows="1" autosize type="textarea" />
+          <van-field v-model="form.mainproduct" name="mainproduct" label="主要产品" rows="1" autosize type="textarea" />
+          <van-field v-model="form.qualifications" name="qualifications" label="资质&荣誉" rows="1" autosize type="textarea" />
+          <div class="btn">
+            <van-button round type="danger" size="normal" @click="reseat">取消注册</van-button>
+            <van-button round type="info" size="normal" @click="up">上一步</van-button>
+            <van-button round type="primary" size="normal" native-type="submit">提交注册</van-button>
+          </div>
+        </van-form>
+      </van-col>
+    </van-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+const _ = require('lodash');
+const moment = require('moment');
+export default {
+  name: 'register-2',
+  props: {
+    form: { type: Object },
+  },
+  components: {},
+  data: function () {
+    return {
+      showCalendar: false,
+    };
+  },
+  created() {},
+  methods: {
+    // 取消注册
+    reseat() {
+      this.$emit('reseat');
+    },
+    onSubmit(values) {
+      this.$emit('onSubmit', values);
+    },
+    // 上一步
+    up() {
+      this.$emit('up');
+    },
+    // 选择注册时间
+    onConfirm(value) {
+      this.$set(this.form, `companydate`, moment(value).format('YYYY-MM-DD'));
+      this.showCalendar = false;
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  .btn {
+    margin: 16px;
+    text-align: center;
+    .van-button {
+      margin: 0 10px;
+    }
+  }
+}
+</style>

+ 64 - 0
src/router/index.js

@@ -46,6 +46,68 @@ const service = [
     component: () => import('../views/service/interflow/index.vue'),
   },
 ];
+const account = [
+  {
+    path: '/account/index',
+    meta: { title: '管理中心' },
+    component: () => import('../views/account/index.vue'),
+  },
+  // 个人用户
+  {
+    path: '/account/userCenter/basic/index',
+    meta: { title: '基本信息' },
+    component: () => import('../views/account/userCenter/basic/index.vue'),
+  },
+  {
+    path: '/account/userCenter/password/index',
+    meta: { title: '修改密码' },
+    component: () => import('../views/account/userCenter/password/index.vue'),
+  },
+  // 机构用户
+  {
+    path: '/account/mechCenter/users/index',
+    meta: { title: '平台用户' },
+    component: () => import('../views/account/mechCenter/users/index.vue'),
+  },
+  {
+    path: '/account/mechCenter/users/detail',
+    meta: { title: '平台用户-信息维护' },
+    component: () => import('../views/account/mechCenter/users/detail.vue'),
+  },
+  {
+    path: '/account/mechCenter/patent/index',
+    meta: { title: '平台用户-专利信息' },
+    component: () => import('../views/account/mechCenter/patent/index.vue'),
+  },
+  // 管理用户
+  {
+    path: '/account/adminCenter/mechanism/index',
+    meta: { title: '机构用户' },
+    component: () => import('../views/account/adminCenter/mechanism/index.vue'),
+  },
+  {
+    path: '/account/adminCenter/mechanism/detail',
+    meta: { title: '机构用户-信息维护' },
+    component: () => import('../views/account/adminCenter/mechanism/detail.vue'),
+  },
+  {
+    path: '/account/adminCenter/users/index',
+    meta: { title: '平台用户' },
+    component: () => import('../views/account/adminCenter/users/index.vue'),
+  },
+  {
+    path: '/account/adminCenter/users/detail',
+    meta: { title: '平台用户-信息维护' },
+    component: () => import('../views/account/adminCenter/users/detail.vue'),
+  },
+];
+const patent = [
+  {
+    path: '/patent/index',
+    meta: { title: '专利管理中心' },
+    component: () => import('../views/patent/index.vue'),
+  },
+];
 const web = [
   {
     path: '/',
@@ -55,6 +117,8 @@ const web = [
   },
   ...market,
   ...service,
+  ...account,
+  ...patent,
   {
     path: '/login',
     name: 'login',

+ 2 - 2
src/store/index.js

@@ -47,9 +47,9 @@ import patentnotice from '@common/src/store/patent/patentnotice';
 import patentapply from '@common/src/store/patent/patentapply';
 // 专利申请预警表
 import patentwarning from '@common/src/store/patent/patentwarning';
-// 专利分析
+// 查新检索
 import patentanalysis from '@common/src/store/patent/patentanalysis';
-// 专利评估
+// 价值评估
 import patentassess from '@common/src/store/patent/patentassess';
 // 专利信息
 import patentinfo from '@common/src/store/patent/patentinfo';

+ 87 - 0
src/views/account/adminCenter/mechanism/detail.vue

@@ -0,0 +1,87 @@
+<template>
+  <div id="detail">
+    <admin-frame :usePage="false" topType="2" :rightArrow="false" @back="back" :useNav="false">
+      <template v-slot:info>
+        <detail-1 :form="form" :pidList="pidList" @onSubmit="onSubmit"></detail-1>
+      </template>
+    </admin-frame>
+  </div>
+</template>
+
+<script>
+import detail1 from './parts/detail_1.vue';
+import adminFrame from '@frame/src/components/mobile-frame/mobile-main.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: adminLogin } = createNamespacedHelpers('adminLogin');
+export default {
+  name: 'detail',
+  props: {},
+  components: {
+    adminFrame,
+    detail1,
+  },
+  data: function () {
+    return {
+      form: {},
+      pidList: [],
+    };
+  },
+  async created() {
+    await this.search();
+  },
+  methods: {
+    ...adminLogin(['query', 'fetch', 'update', 'delete']),
+    async search() {
+      let res = await this.query({ role: '1' });
+      if (this.$checkRes(res)) {
+        this.$set(this, `pidList`, res.data);
+      }
+      if (this.id) {
+        res = await this.fetch(this.id);
+        if (this.$checkRes(res)) {
+          res.data.pidName = this.pidList.find((i) => i.id == res.data.pid).name;
+          this.$set(this, `form`, res.data);
+        }
+      }
+    },
+    // 查看详情
+    async onSubmit(data) {
+      data.role = '2';
+      if (data.id) {
+        let res = await this.update(data);
+        if (this.$checkRes(res)) {
+          this.$toast({ type: `success`, message: `信息修改成功` });
+          this.back();
+        }
+      } else {
+        let res = await this.create(data);
+        if (this.$checkRes(res)) {
+          this.$toast({ type: `success`, message: `信息创建成功` });
+          this.back();
+        }
+      }
+    },
+    back() {
+      this.$router.push({ path: `/account/adminCenter/mechanism/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>

+ 71 - 0
src/views/account/adminCenter/mechanism/index.vue

@@ -0,0 +1,71 @@
+<template>
+  <div id="index">
+    <admin-frame @search="search" :limit="limit" :total="total" topType="2" @add="add" @back="back" :useNav="false">
+      <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: adminLogin } = createNamespacedHelpers('adminLogin');
+export default {
+  name: 'index',
+  props: {},
+  components: {
+    adminFrame,
+    list1,
+  },
+  data: function () {
+    return {
+      list: [],
+      limit: 5,
+      total: 0,
+    };
+  },
+  async created() {
+    await this.search();
+  },
+  methods: {
+    ...adminLogin(['query', 'fetch', 'update', 'delete']),
+    async search({ skip = 0, limit = this.limit, searchName, ...info } = {}) {
+      if (this.user.role == '1' || this.user.role == '2') info.pid = this.user.id;
+      if (searchName) info.name = this.searchName;
+      let res = await this.query({ skip, limit, role: '2', ...info });
+      if (this.$checkRes(res)) {
+        this.$set(this, `list`, res.data);
+        this.$set(this, `total`, res.total);
+      }
+    },
+    // 查看详情
+    detail(data) {
+      this.$router.push({ path: `/account/adminCenter/mechanism/detail`, query: { id: data.id } });
+    },
+    add() {
+      this.$router.push({ path: `/account/adminCenter/mechanism/detail` });
+    },
+    back() {
+      this.$router.push({ path: `/account/index` });
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 66 - 0
src/views/account/adminCenter/mechanism/parts/detail_1.vue

@@ -0,0 +1,66 @@
+<template>
+  <div id="detail_1">
+    <van-row>
+      <van-col span="24" class="main">
+        <van-form @submit="onSubmit">
+          <van-field v-model="form.pid" name="pid" label="管理员id" style="display: none" />
+          <van-field readonly clickable name="pidName" :value="form.pidName" label="管理员" placeholder="点击选择" @click="showPicker = true" />
+          <van-popup v-model="showPicker" position="bottom">
+            <van-picker show-toolbar :columns="pidList" value-key="name" @confirm="pidCon" @cancel="showPicker = false" />
+          </van-popup>
+          <van-field v-model="form.code" name="code" label="机构代码或邀请码" :rules="[{ required: true, message: '机构代码或邀请码' }]" />
+          <van-field v-model="form.deptname" name="deptname" label="机构代码" :rules="[{ required: true, message: '机构代码' }]" />
+          <van-field v-model="form.name" name="name" label="姓名" :rules="[{ required: true, message: '姓名' }]" />
+          <van-field v-model="form.phone" name="phone" label="手机号" :rules="[{ required: true, message: '手机号' }]" />
+          <van-field v-model="form.passwd" name="passwd" label="密码" type="password" :rules="[{ required: true, message: '密码' }]" />
+          <div style="margin: 16px">
+            <van-button round block type="info" native-type="submit">提交</van-button>
+          </div>
+        </van-form>
+      </van-col>
+    </van-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'detail_1',
+  props: {
+    form: { type: Object },
+    pidList: { type: Array },
+  },
+  components: {},
+  data: function () {
+    return {
+      showPicker: false,
+    };
+  },
+  created() {},
+  methods: {
+    onSubmit() {
+      this.$emit('onSubmit', this.form);
+    },
+    pidCon(value) {
+      this.$set(this.form, `pid`, value.id);
+      this.$set(this.form, `pidName`, value.name);
+      this.showPicker = false;
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 82 - 0
src/views/account/adminCenter/mechanism/parts/list_1.vue

@@ -0,0 +1,82 @@
+<template>
+  <div id="list_1">
+    <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">
+          {{ item.name }}
+        </van-col>
+        <van-col span="24" class="other">
+          <van-col span="24" class="otherInfo">
+            机构代码或邀请码:<span style="color: zzzzz#ff0000">{{ item.code || '暂无' }}</span>
+          </van-col>
+          <van-col span="24" class="otherInfo">
+            机构名称:<span>{{ item.deptname || '暂无' }}</span>
+          </van-col>
+          <van-col span="24" class="otherInfo">
+            联系电话:<span>{{ item.phone || '暂无' }}</span>
+          </van-col>
+        </van-col>
+      </van-col>
+    </van-col>
+  </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 {
+      .otherInfo {
+        font-size: 14px;
+        color: #666;
+        margin: 0 0 5px 0;
+        span {
+          color: #000;
+        }
+      }
+    }
+  }
+}
+</style>

+ 93 - 0
src/views/account/adminCenter/users/detail.vue

@@ -0,0 +1,93 @@
+<template>
+  <div id="detail">
+    <admin-frame :usePage="false" topType="2" :rightArrow="false" @back="back" :useNav="false">
+      <template v-slot:info>
+        <personal-detail v-if="type == '1'" :form="form" @onSubmit="onSubmit"></personal-detail>
+        <company-detail v-if="type == '2'" :form="form" @onSubmit="onSubmit"></company-detail>
+      </template>
+    </admin-frame>
+  </div>
+</template>
+
+<script>
+import personalDetail from './parts/personal-detail.vue';
+import companyDetail from './parts/company-detail.vue';
+import adminFrame from '@frame/src/components/mobile-frame/mobile-main.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: personal } = createNamespacedHelpers('personal');
+const { mapActions: organization } = createNamespacedHelpers('organization');
+export default {
+  name: 'detail',
+  props: {},
+  components: {
+    adminFrame,
+    personalDetail,
+    companyDetail,
+  },
+  data: function () {
+    return {
+      form: {},
+    };
+  },
+  async created() {
+    if (this.id) await this.search();
+  },
+  methods: {
+    ...personal({ personalFetch: 'fetch', personalUpdate: 'update' }),
+    ...organization({ organizationFetch: 'fetch', organizationUpdate: 'update' }),
+    async search() {
+      if (this.type == '1') {
+        let res = await this.personalFetch(this.id);
+        if (this.$checkRes(res)) {
+          this.$set(this, `form`, res.data);
+        }
+      } else if (this.type == '2') {
+        let res = await this.organizationFetch(this.id);
+        if (this.$checkRes(res)) {
+          this.$set(this, `form`, res.data);
+        }
+      }
+    },
+    // 審核
+    async onSubmit(data) {
+      if (this.type == '1') {
+        let res = await this.personalUpdate(data);
+        if (this.$checkRes(res)) {
+          this.$toast({ type: `success`, message: `信息审核成功` });
+          this.back();
+        }
+      } else if (this.type == '2') {
+        let res = await this.organizationUpdate(data);
+        if (this.$checkRes(res)) {
+          this.$toast({ type: `success`, message: `信息审核成功` });
+          this.back();
+        }
+      }
+    },
+    back() {
+      this.$router.push({ path: `/account/adminCenter/users/index` });
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    id() {
+      return this.$route.query.id;
+    },
+    type() {
+      return this.$route.query.type;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 101 - 0
src/views/account/adminCenter/users/index.vue

@@ -0,0 +1,101 @@
+<template>
+  <div id="index">
+    <admin-frame @search="search" :limit="limit" :total="total" topType="2" @back="back" :rightArrow="false" :useNav="false">
+      <template v-slot:info>
+        <!-- <van-tabs v-model="active" @change="change">
+          <van-tab title="个人用户">
+            <personal-1 :list="personalList" @detail="perDetail"></personal-1>
+          </van-tab>
+          <van-tab title="企业用户">
+            <company-1 :list="companyList" @detail="orgDetail"></company-1>
+          </van-tab>
+        </van-tabs> -->
+        <personal-1 :list="personalList" @detail="perDetail"></personal-1>
+      </template>
+    </admin-frame>
+  </div>
+</template>
+
+<script>
+import personal1 from './parts/personal-1.vue';
+import company1 from './parts/company-1.vue';
+import adminFrame from '@frame/src/components/mobile-frame/mobile-main.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: personal } = createNamespacedHelpers('personal');
+const { mapActions: organization } = createNamespacedHelpers('organization');
+export default {
+  name: 'index',
+  props: {},
+  components: {
+    adminFrame,
+    personal1,
+  },
+  data: function () {
+    return {
+      active: 0,
+      personalList: [],
+      companyList: [],
+      total: 0,
+      limit: 5,
+    };
+  },
+  async created() {
+    await this.search();
+  },
+  methods: {
+    ...personal(['query']),
+    ...organization({ orgQuery: 'query' }),
+    // 查询列表
+    async search({ skip = 0, limit = this.limit, ...info } = {}) {
+      let user = this.user;
+      if (this.active == '0') {
+        if (user.role != '0') info.code = 'JLKJQYJD';
+        let res = await this.query({ skip, limit, ...info });
+        if (this.$checkRes(res)) {
+          this.$set(this, `personalList`, res.data);
+          this.$set(this, `total`, res.total);
+        }
+      } else if (this.active == '1') {
+        if (user.role != '0') info.code = user.code;
+        let res = await this.orgQuery({ skip, limit, ...info });
+        if (this.$checkRes(res)) {
+          this.$set(this, `companyList`, res.data);
+          this.$set(this, `total`, res.total);
+        }
+      }
+    },
+    // 个人详情
+    perDetail(data) {
+      this.$router.push({ path: `/account/adminCenter/users/detail`, query: { id: data.id, type: '1' } });
+    },
+    // 企业详情
+    orgDetail(data) {
+      this.$router.push({ path: `/account/adminCenter/users/detail`, query: { id: data.id, type: '2' } });
+    },
+    // 选择用户类别
+    change(type) {
+      this.$set(this, `active`, type);
+      this.search();
+    },
+    // 返回
+    back() {
+      this.$router.push({ path: `/account/index` });
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 88 - 0
src/views/account/adminCenter/users/parts/company-1.vue

@@ -0,0 +1,88 @@
+<template>
+  <div id="company-1">
+    <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">
+          {{ item.name }}
+        </van-col>
+        <van-col span="24" class="other">
+          <van-col span="24" class="otherInfo">
+            机构代码或邀请码:<span style="color: #ff0000">{{ item.code || '暂无' }}</span>
+          </van-col>
+          <van-col span="24" class="otherInfo">
+            社会统一信用代码:<span>{{ item.institution_code || '暂无' }}</span>
+          </van-col>
+          <van-col span="12" class="otherInfo">
+            联系电话:<span>{{ item.phone || '暂无' }}</span>
+          </van-col>
+          <van-col span="12" class="otherInfo">
+            所属辖区:<span>{{ item.juris || '暂无' }}</span>
+          </van-col>
+          <van-col span="24" class="otherInfo">
+            审核状态:<span>{{ item.status == '0' ? '待审中' : item.status == '1' ? '审核通过' : '审核拒绝' }}</span>
+          </van-col>
+        </van-col>
+      </van-col>
+    </van-col>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'company-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 {
+      .otherInfo {
+        font-size: 14px;
+        color: #666;
+        margin: 0 0 5px 0;
+        span {
+          color: #000;
+        }
+      }
+    }
+  }
+}
+</style>

+ 77 - 0
src/views/account/adminCenter/users/parts/company-detail.vue

@@ -0,0 +1,77 @@
+<template>
+  <div id="company-detail">
+    <van-row>
+      <van-col span="24" class="main">
+        <van-form @submit="onSubmit">
+          <van-field v-model="form.name" name="name" label="姓名" readonly />
+          <van-field v-model="form.phone" name="phone" label="手机号" readonly />
+          <van-field v-model="form.code" name="code" label="机构代码" readonly />
+          <van-field v-model="form.email" name="email" label="电子邮箱" readonly />
+          <van-field v-model="form.addr" name="addr" label="地址" readonly />
+          <van-field v-model="form.office_phone" name="office_phone" label="办公电话" readonly />
+          <van-field v-model="form.profession" name="profession" label="所属行业" readonly />
+          <van-field v-model="form.juris" name="juris" label="所属辖区" readonly />
+          <van-field v-model="form.institution_code" name="institution_code" label="统一社会信用代码" readonly />
+          <van-field v-model="form.companytype" name="companytype" label="注册类型" readonly />
+          <van-field v-model="form.companydate" name="companydate" label="注册时间" readonly />
+          <van-field v-model="form.companycapital" name="companycapital" label="注册资金" readonly />
+          <van-field v-model="form.companyperson" name="companyperson" label="企业法人" readonly />
+          <van-field v-model="form.sndqyzsr" name="sndqyzsr" label="上年度企业总收入" readonly />
+          <van-field v-model="form.sndyffy" name="sndyffy" label="上年度研发费用" readonly />
+          <van-field v-model="form.companytotal" name="companytotal" label="企业总人数" readonly />
+          <van-field v-model="form.zjzyfrs" name="zjzyfrs" label="专&兼职研发人数" readonly />
+          <van-field v-model="form.companybrief" name="companybrief" label="企业简介" rows="1" autosize type="textarea" readonly />
+          <van-field v-model="form.mainproduct" name="mainproduct" label="主要产品" rows="1" autosize type="textarea" readonly />
+          <van-field v-model="form.qualifications" name="qualifications" label="企业资质&荣誉" rows="1" autosize type="textarea" readonly />
+          <van-field name="status" label="状态">
+            <template #input>
+              <van-radio-group v-model="form.status" direction="horizontal">
+                <van-radio name="0">待审</van-radio>
+                <van-radio name="1">通过</van-radio>
+                <van-radio name="2">拒绝</van-radio>
+              </van-radio-group>
+            </template>
+          </van-field>
+          <div style="margin: 16px">
+            <van-button round block type="info" native-type="submit">提交</van-button>
+          </div>
+        </van-form>
+      </van-col>
+    </van-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'company-detail',
+  props: {
+    form: { type: Object },
+  },
+  components: {},
+  data: function () {
+    return {};
+  },
+  created() {},
+  methods: {
+    onSubmit() {
+      this.$emit('onSubmit', this.form);
+    },
+  },
+  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/account/adminCenter/users/parts/personal-1.vue

@@ -0,0 +1,85 @@
+<template>
+  <div id="personal-1">
+    <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">
+          {{ item.name }}
+        </van-col>
+        <van-col span="24" class="other">
+          <van-col span="24" class="otherInfo">
+            机构代码或邀请码:<span style="color: #ff0000">{{ item.code || '暂无' }}</span>
+          </van-col>
+          <van-col span="12" class="otherInfo">
+            联系电话:<span>{{ item.phone || '暂无' }}</span>
+          </van-col>
+          <van-col span="12" class="otherInfo">
+            所属辖区:<span>{{ item.juris || '暂无' }}</span>
+          </van-col>
+          <van-col span="24" class="otherInfo">
+            审核状态:<span>{{ item.status == '0' ? '待审中' : item.status == '1' ? '审核通过' : '审核拒绝' }}</span>
+          </van-col>
+        </van-col>
+      </van-col>
+    </van-col>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'personal-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 {
+      .otherInfo {
+        font-size: 14px;
+        color: #666;
+        margin: 0 0 5px 0;
+        span {
+          color: #000;
+        }
+      }
+    }
+  }
+}
+</style>

+ 69 - 0
src/views/account/adminCenter/users/parts/personal-detail.vue

@@ -0,0 +1,69 @@
+<template>
+  <div id="personal-detail">
+    <van-row>
+      <van-col span="24" class="main">
+        <van-form @submit="onSubmit">
+          <van-field v-model="form.name" name="name" label="姓名" readonly />
+          <van-field v-model="form.phone" name="phone" label="手机号" readonly />
+          <van-field v-model="form.code" name="code" label="机构代码" readonly />
+          <van-field v-model="form.email" name="email" label="电子邮箱" readonly />
+          <van-field v-model="form.addr" name="addr" label="地址" readonly />
+          <van-field v-model="form.office_phone" name="office_phone" label="办公电话" readonly />
+          <van-field v-model="form.profession" name="profession" label="所属行业" readonly />
+          <van-field v-model="form.juris" name="juris" label="所属辖区" readonly />
+          <van-field v-model="form.school" name="院校" label="院校" placeholder="院校" />
+          <van-field v-model="form.major" name="专业" label="专业" placeholder="专业" />
+          <van-field v-model="form.card" name="身份证号" label="身份证号" placeholder="身份证号" />
+          <van-field v-model="form.zwzc" name="职务职称" label="职务职称" placeholder="职务职称" />
+          <van-field name="status" label="状态">
+            <template #input>
+              <van-radio-group v-model="form.status" direction="horizontal">
+                <van-radio name="0">待审</van-radio>
+                <van-radio name="1">通过</van-radio>
+                <van-radio name="2">拒绝</van-radio>
+              </van-radio-group>
+            </template>
+          </van-field>
+          <div style="margin: 16px">
+            <van-button round block type="info" native-type="submit">提交</van-button>
+          </div>
+        </van-form>
+      </van-col>
+    </van-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'personal-detail',
+  props: {
+    form: { type: Object },
+  },
+  components: {},
+  data: function () {
+    return {};
+  },
+  created() {},
+  methods: {
+    onSubmit() {
+      this.$emit('onSubmit', this.form);
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 83 - 8
src/views/account/index.vue

@@ -1,22 +1,71 @@
 <template>
   <div id="index">
-    <el-row>
-      <el-col :span="24" class="main"> 个人中心 </el-col>
-    </el-row>
+    <admin-frame :useTop="false" :usePage="false" :useNav="false">
+      <template v-slot:info>
+        <van-col span="24" class="one">
+          <van-col span="24" class="image">
+            <van-image :src="icon"></van-image>
+          </van-col>
+          <van-col span="24" class="other">
+            <van-col span="24" class="otherInfo">
+              {{ userInfo.name }}
+            </van-col>
+            <van-col span="24" class="otherInfo">
+              {{ userInfo.phone }}
+            </van-col>
+          </van-col>
+        </van-col>
+        <van-col span="24" class="two">
+          <role-1 v-if="userInfo.role == '1'"></role-1>
+          <role-2 v-else-if="userInfo.role == '2'"></role-2>
+          <role-3 v-else></role-3>
+          <van-cell title="专利运营" @click="patentBtn" is-link />
+          <van-cell title="退出登录" @click="logout" is-link />
+        </van-col>
+      </template>
+    </admin-frame>
   </div>
 </template>
 
 <script>
+import role1 from './parts/role-1.vue';
+import role2 from './parts/role-2.vue';
+import role3 from './parts/role-3.vue';
+import adminFrame from '@frame/src/components/mobile-frame/mobile-main.vue';
 import { mapState, createNamespacedHelpers } from 'vuex';
 export default {
   name: 'index',
   props: {},
-  components: {},
+  components: {
+    adminFrame,
+    role1,
+    role2,
+    role3,
+  },
   data: function () {
-    return {};
+    return {
+      icon: require('@a/icon.jpg'),
+      userInfo: {},
+    };
+  },
+  async created() {
+    if (this.user) this.$set(this, `userInfo`, this.user);
+  },
+  methods: {
+    // 退出登录
+    logout() {
+      let token = localStorage.removeItem('token');
+      let openid = sessionStorage.removeItem('openid');
+      if (token == undefined && openid == undefined) {
+        this.$toast({ type: 'fail', message: '退出登录成功' });
+        this.$router.push({ path: '/login', query: { path: '/account/index', type: '1' } });
+      }
+    },
+    // 专利运营
+    patentBtn() {
+      this.$router.push({ path: '/patent/index' });
+    },
   },
-  created() {},
-  methods: {},
   computed: {
     ...mapState(['user']),
   },
@@ -33,4 +82,30 @@ export default {
 };
 </script>
 
-<style lang="less" scoped></style>
+<style lang="less" scoped>
+.one {
+  background: url('~@/assets/userbj.jpg');
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  .image {
+    text-align: center;
+    padding: 10px 0 10px 0;
+    .van-image {
+      width: 66px;
+      height: 66px;
+      /deep/.van-image__img {
+        border-radius: 90px;
+      }
+    }
+  }
+  .other {
+    text-align: center;
+    .otherInfo {
+      font-size: 16px;
+      color: #000;
+      font-weight: bold;
+      margin: 0 0 5px 0;
+    }
+  }
+}
+</style>

+ 87 - 0
src/views/account/mechCenter/patent/index.vue

@@ -0,0 +1,87 @@
+<template>
+  <div id="index">
+    <admin-frame @search="search" :limit="limit" :total="total" topType="2" @back="back" :rightArrow="false" :useNav="false">
+      <template v-slot:info>
+        <list-1 :list="list" @detail="detail"></list-1>
+      </template>
+    </admin-frame>
+    <van-dialog class="dialog" v-model="show" title="详细信息" :show-confirm-button="false" show-cancel-button>
+      <info-1 :info="info"></info-1>
+    </van-dialog>
+  </div>
+</template>
+
+<script>
+import list1 from './parts/list-1.vue';
+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,
+    list1,
+    info1,
+  },
+  data: function () {
+    return {
+      limit: 5,
+      total: 0,
+      list: [],
+      info: {},
+      show: false,
+    };
+  },
+  async created() {
+    if (this.id) await this.search();
+  },
+  methods: {
+    ...patentinfo(['query']),
+    async search({ skip = 0, limit = this.limit, ...info } = {}) {
+      info.user_id = this.id;
+      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) {
+      data.inventor = JSON.stringify(data.inventor.map((i) => i.name));
+      this.$set(this, `info`, data);
+      this.show = true;
+    },
+    // 返回
+    back() {
+      this.$router.push({ path: '/account/mechCenter/users/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>
+.dialog {
+  /deep/.van-dialog__content {
+    height: 350px;
+    overflow-y: auto;
+  }
+}
+</style>

+ 81 - 0
src/views/account/mechCenter/patent/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-col>
+        <van-col span="24" class="two">
+          <van-form>
+            <van-field v-model="info.term" name="term" label="专利有效性" />
+            <van-field v-model="info.name" name="name" label="名称" />
+            <van-field v-model="info.create_number" name="create_number" label="申请号" />
+            <van-field v-model="info.create_date" name="create_date" label="申请日" />
+            <van-field v-model="info.success_number" name="success_number" label="公开(公告)号" />
+            <van-field v-model="info.success_date" name="success_date" label="公开(公告)日" />
+            <van-field v-model="info.type" name="type" label="专利类型" />
+            <van-field v-model="info.inventor" name="inventor" label="发明人" />
+            <van-field v-model="info.address" name="address" label="发明人地址" />
+            <van-field v-model="info.apply_personal" name="apply_personal" label="申请人" />
+            <van-field v-model="info.agent_personal" name="agent_personal" label="代理人" />
+            <van-field v-model="info.agent" name="agent" label="代理机构" />
+            <van-field v-model="info.abstract" name="abstract" label="摘要" rows="1" autosize type="textarea" />
+          </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 {
+    height: 220px;
+    border-bottom: 1px solid #f1f1f1;
+    .van-image {
+      width: 100%;
+      height: 219px;
+    }
+  }
+}
+</style>

+ 84 - 0
src/views/account/mechCenter/patent/parts/list-1.vue

@@ -0,0 +1,84 @@
+<template>
+  <div id="list-1">
+    <van-row>
+      <van-col span="24" class="main">
+        <van-col span="24" class="one">
+          <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-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 {
+  .one {
+    margin: 8px 0 0 0;
+    .list {
+      background-color: #fff;
+      margin: 0 0 10px 0;
+      box-shadow: 0 0 5px #f1f1f1;
+      padding: 8px;
+      .title {
+        font-size: 16px;
+        font-weight: bold;
+        margin: 0 0 5px 0;
+      }
+      .other {
+        .otherInfo {
+          font-size: 14px;
+          color: #666;
+          margin: 0 0 5px 0;
+          span {
+            color: #000;
+          }
+        }
+      }
+    }
+  }
+}
+</style>

+ 108 - 0
src/views/account/mechCenter/users/detail.vue

@@ -0,0 +1,108 @@
+<template>
+  <div id="detail">
+    <admin-frame :usePage="false" topType="2" :rightArrow="false" @back="back" :useNav="false">
+      <template v-slot:info>
+        <personal-detail v-if="type == '1'" :form="form" @onSubmit="onSubmit"></personal-detail>
+        <company-detail v-if="type == '2'" :form="form" @onSubmit="onSubmit"></company-detail>
+      </template>
+    </admin-frame>
+  </div>
+</template>
+
+<script>
+import personalDetail from './parts/personal-detail.vue';
+import companyDetail from './parts/company-detail.vue';
+import adminFrame from '@frame/src/components/mobile-frame/mobile-main.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: personal } = createNamespacedHelpers('personal');
+const { mapActions: organization } = createNamespacedHelpers('organization');
+export default {
+  name: 'detail',
+  props: {},
+  components: {
+    adminFrame,
+    personalDetail,
+    companyDetail,
+  },
+  data: function () {
+    return {
+      form: {},
+    };
+  },
+  async created() {
+    await this.search();
+  },
+  methods: {
+    ...personal({ personalFetch: 'fetch', personalUpdate: 'update', personalCreate: 'create' }),
+    ...organization({ organizationFetch: 'fetch', organizationUpdate: 'update' }),
+    async search() {
+      if (this.id) {
+        if (this.type == '1') {
+          let res = await this.personalFetch(this.id);
+          if (this.$checkRes(res)) {
+            this.$set(this, `form`, res.data);
+          }
+        } else if (this.type == '2') {
+          let res = await this.organizationFetch(this.id);
+          if (this.$checkRes(res)) {
+            this.$set(this, `form`, res.data);
+          }
+        }
+      } else {
+        let data = { code: this.user.code };
+        this.$set(this, `form`, data);
+      }
+    },
+    // 審核
+    async onSubmit(data) {
+      if (data.id) {
+        if (this.type == '1') {
+          let res = await this.personalUpdate(data);
+          if (this.$checkRes(res)) {
+            this.$toast({ type: `success`, message: `操作成功` });
+            this.back();
+          }
+        } else if (this.type == '2') {
+          let res = await this.organizationUpdate(data);
+          if (this.$checkRes(res)) {
+            this.$toast({ type: `success`, message: `操作成功` });
+            this.back();
+          }
+        }
+      } else {
+        if (this.type == '1') {
+          let res = await this.personalCreate(data);
+          if (this.$checkRes(res)) {
+            this.$toast({ type: `success`, message: `操作成功` });
+            this.back();
+          }
+        }
+      }
+    },
+    back() {
+      this.$router.push({ path: `/account/mechCenter/users/index` });
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    id() {
+      return this.$route.query.id;
+    },
+    type() {
+      return this.$route.query.type;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 110 - 0
src/views/account/mechCenter/users/index.vue

@@ -0,0 +1,110 @@
+<template>
+  <div id="index">
+    <admin-frame @search="search" :limit="limit" :total="total" topType="2" @back="back" @add="add" :useNav="false">
+      <template v-slot:info>
+        <!-- <van-tabs v-model="active" @change="change">
+          <van-tab title="个人用户">
+            <personal-1 :list="personalList" @detail="perDetail"></personal-1>
+          </van-tab>
+          <van-tab title="企业用户">
+            <company-1 :list="companyList" @detail="orgDetail"></company-1>
+          </van-tab>
+        </van-tabs> -->
+        <personal-1 :list="personalList" @detail="perDetail" @patent="toPatent"></personal-1>
+      </template>
+    </admin-frame>
+  </div>
+</template>
+
+<script>
+import personal1 from './parts/personal-1.vue';
+import company1 from './parts/company-1.vue';
+import adminFrame from '@frame/src/components/mobile-frame/mobile-main.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: personal } = createNamespacedHelpers('personal');
+const { mapActions: organization } = createNamespacedHelpers('organization');
+export default {
+  name: 'index',
+  props: {},
+  components: {
+    adminFrame,
+    personal1,
+    // company1,
+  },
+  data: function () {
+    return {
+      active: 0,
+      personalList: [],
+      companyList: [],
+      total: 0,
+      limit: 5,
+    };
+  },
+  async created() {
+    await this.search();
+  },
+  methods: {
+    ...personal(['query']),
+    ...organization({ orgQuery: 'query' }),
+    // 查询列表
+    async search({ skip = 0, limit = this.limit, ...info } = {}) {
+      let user = this.user;
+      if (this.active == '0') {
+        if (user.role != '0') info.code = user.code;
+        let res = await this.query({ skip, limit, ...info });
+        if (this.$checkRes(res)) {
+          this.$set(this, `personalList`, res.data);
+          this.$set(this, `total`, res.total);
+        }
+      } else if (this.active == '1') {
+        if (user.role != '0') info.code = user.code;
+        let res = await this.orgQuery({ skip, limit, ...info });
+        if (this.$checkRes(res)) {
+          this.$set(this, `companyList`, res.data);
+          this.$set(this, `total`, res.total);
+        }
+      }
+    },
+    // 添加
+    add() {
+      this.$router.push({ path: `/account/mechCenter/users/detail`, query: { type: '1' } });
+    },
+    // 个人详情
+    perDetail(data) {
+      this.$router.push({ path: `/account/mechCenter/users/detail`, query: { id: data.id, type: '1' } });
+    },
+    // 查询专利信息
+    toPatent(data) {
+      this.$router.push({ path: `/account/mechCenter/patent/index`, query: { id: data._id } });
+    },
+    // 企业详情
+    orgDetail(data) {
+      this.$router.push({ path: `/account/mechCenter/users/detail`, query: { id: data.id, type: '2' } });
+    },
+    // 选择用户类别
+    change(type) {
+      this.$set(this, `active`, type);
+      this.search();
+    },
+    // 返回
+    back() {
+      this.$router.push({ path: `/account/index` });
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 88 - 0
src/views/account/mechCenter/users/parts/company-1.vue

@@ -0,0 +1,88 @@
+<template>
+  <div id="company-1">
+    <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">
+          {{ item.name }}
+        </van-col>
+        <van-col span="24" class="other">
+          <van-col span="24" class="otherInfo">
+            机构代码或邀请码:<span style="color: #ff0000">{{ item.code || '暂无' }}</span>
+          </van-col>
+          <van-col span="24" class="otherInfo">
+            社会统一信用代码:<span>{{ item.institution_code || '暂无' }}</span>
+          </van-col>
+          <van-col span="12" class="otherInfo">
+            联系电话:<span>{{ item.phone || '暂无' }}</span>
+          </van-col>
+          <van-col span="12" class="otherInfo">
+            所属辖区:<span>{{ item.juris || '暂无' }}</span>
+          </van-col>
+          <van-col span="24" class="otherInfo">
+            审核状态:<span>{{ item.status == '0' ? '待审中' : item.status == '1' ? '审核通过' : '审核拒绝' }}</span>
+          </van-col>
+        </van-col>
+      </van-col>
+    </van-col>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'company-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 {
+      .otherInfo {
+        font-size: 14px;
+        color: #666;
+        margin: 0 0 5px 0;
+        span {
+          color: #000;
+        }
+      }
+    }
+  }
+}
+</style>

+ 77 - 0
src/views/account/mechCenter/users/parts/company-detail.vue

@@ -0,0 +1,77 @@
+<template>
+  <div id="company-detail">
+    <van-row>
+      <van-col span="24" class="main">
+        <van-form @submit="onSubmit">
+          <van-field v-model="form.name" name="name" label="姓名" readonly />
+          <van-field v-model="form.phone" name="phone" label="手机号" readonly />
+          <van-field v-model="form.code" name="code" label="机构代码" readonly />
+          <van-field v-model="form.email" name="email" label="电子邮箱" readonly />
+          <van-field v-model="form.addr" name="addr" label="地址" readonly />
+          <van-field v-model="form.office_phone" name="office_phone" label="办公电话" readonly />
+          <van-field v-model="form.profession" name="profession" label="所属行业" readonly />
+          <van-field v-model="form.juris" name="juris" label="所属辖区" readonly />
+          <van-field v-model="form.institution_code" name="institution_code" label="统一社会信用代码" readonly />
+          <van-field v-model="form.companytype" name="companytype" label="注册类型" readonly />
+          <van-field v-model="form.companydate" name="companydate" label="注册时间" readonly />
+          <van-field v-model="form.companycapital" name="companycapital" label="注册资金" readonly />
+          <van-field v-model="form.companyperson" name="companyperson" label="企业法人" readonly />
+          <van-field v-model="form.sndqyzsr" name="sndqyzsr" label="上年度企业总收入" readonly />
+          <van-field v-model="form.sndyffy" name="sndyffy" label="上年度研发费用" readonly />
+          <van-field v-model="form.companytotal" name="companytotal" label="企业总人数" readonly />
+          <van-field v-model="form.zjzyfrs" name="zjzyfrs" label="专&兼职研发人数" readonly />
+          <van-field v-model="form.companybrief" name="companybrief" label="企业简介" rows="1" autosize type="textarea" readonly />
+          <van-field v-model="form.mainproduct" name="mainproduct" label="主要产品" rows="1" autosize type="textarea" readonly />
+          <van-field v-model="form.qualifications" name="qualifications" label="企业资质&荣誉" rows="1" autosize type="textarea" readonly />
+          <van-field name="status" label="状态">
+            <template #input>
+              <van-radio-group v-model="form.status" direction="horizontal">
+                <van-radio name="0">待审</van-radio>
+                <van-radio name="1">通过</van-radio>
+                <van-radio name="2">拒绝</van-radio>
+              </van-radio-group>
+            </template>
+          </van-field>
+          <div style="margin: 16px">
+            <van-button round block type="info" native-type="submit">提交</van-button>
+          </div>
+        </van-form>
+      </van-col>
+    </van-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'company-detail',
+  props: {
+    form: { type: Object },
+  },
+  components: {},
+  data: function () {
+    return {};
+  },
+  created() {},
+  methods: {
+    onSubmit() {
+      this.$emit('onSubmit', this.form);
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 98 - 0
src/views/account/mechCenter/users/parts/personal-1.vue

@@ -0,0 +1,98 @@
+<template>
+  <div id="personal-1">
+    <van-col span="24" class="main">
+      <van-col span="24" class="list" v-for="(item, index) in list" :key="index">
+        <van-col span="24" class="title">
+          {{ item.name }}
+        </van-col>
+        <van-col span="24" class="other">
+          <van-col span="24" class="otherInfo">
+            机构代码或邀请码:<span style="color: #ff0000">{{ item.code || '暂无' }}</span>
+          </van-col>
+          <van-col span="12" class="otherInfo">
+            联系电话:<span>{{ item.phone || '暂无' }}</span>
+          </van-col>
+          <van-col span="12" class="otherInfo">
+            所属辖区:<span>{{ item.juris || '暂无' }}</span>
+          </van-col>
+          <van-col span="24" class="otherInfo">
+            审核状态:<span>{{ item.status == '0' ? '待审中' : item.status == '1' ? '审核通过' : '审核拒绝' }}</span>
+          </van-col>
+        </van-col>
+        <van-col span="24" class="btn">
+          <van-button type="info" size="small" @click="detail(item)">查看详情</van-button>
+          <van-button type="info" size="small" @click="patent(item)">查看专利</van-button>
+        </van-col>
+      </van-col>
+    </van-col>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'personal-1',
+  props: {
+    list: { type: Array },
+  },
+  components: {},
+  data: function () {
+    return {};
+  },
+  created() {},
+  methods: {
+    detail(data) {
+      this.$emit('detail', data);
+    },
+    patent(data) {
+      this.$emit('patent', 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 {
+      .otherInfo {
+        font-size: 14px;
+        color: #666;
+        margin: 0 0 5px 0;
+        span {
+          color: #000;
+        }
+      }
+    }
+    .btn {
+      text-align: center;
+      .van-button {
+        margin: 0 10px;
+      }
+    }
+  }
+}
+</style>

+ 84 - 0
src/views/account/mechCenter/users/parts/personal-detail.vue

@@ -0,0 +1,84 @@
+<template>
+  <div id="personal-detail">
+    <van-row>
+      <van-col span="24" class="main">
+        <van-form @submit="onSubmit">
+          <van-field v-model="form.name" name="name" label="姓名" />
+          <van-field v-model="form.phone" name="phone" label="手机号" />
+          <van-field v-model="form.password" name="password" type="password" label="密码" v-if="id == null" />
+          <van-field v-model="form.code" name="code" label="机构代码" />
+          <van-field v-model="form.email" name="email" label="电子邮箱" />
+          <van-field v-model="form.addr" name="addr" label="地址" />
+          <van-field v-model="form.office_phone" name="office_phone" label="办公电话" />
+          <van-field v-model="form.profession" name="profession" label="所属行业" />
+          <van-field clickable name="juris" :value="form.juris" label="所属辖区" placeholder="点击选择" @click="showPicker = true" />
+          <van-field v-model="form.school" name="院校" label="院校" placeholder="院校" />
+          <van-field v-model="form.major" name="专业" label="专业" placeholder="专业" />
+          <van-field v-model="form.card" name="身份证号" label="身份证号" placeholder="身份证号" />
+          <van-field v-model="form.zwzc" name="职务职称" label="职务职称" placeholder="职务职称" />
+          <van-popup v-model="showPicker" position="bottom">
+            <van-picker show-toolbar :columns="jurisList" @confirm="onConfirm" @cancel="showPicker = false" />
+          </van-popup>
+          <van-field name="status" label="状态">
+            <template #input>
+              <van-radio-group v-model="form.status" direction="horizontal">
+                <van-radio name="0">待审</van-radio>
+                <van-radio name="1">通过</van-radio>
+                <van-radio name="2">拒绝</van-radio>
+              </van-radio-group>
+            </template>
+          </van-field>
+          <div style="margin: 16px">
+            <van-button round block type="info" native-type="submit">提交</van-button>
+          </div>
+        </van-form>
+      </van-col>
+    </van-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'personal-detail',
+  props: {
+    form: { type: Object },
+  },
+  components: {},
+  data: function () {
+    return {
+      showPicker: false,
+      jurisList: ['长春新区', '净月区', '汽开区', '经开区', '高新区', '南关区', '朝阳区', '宽城区', '二道区', '绿园区', '双阳区', '九台区'],
+    };
+  },
+  created() {},
+  methods: {
+    onSubmit() {
+      this.$emit('onSubmit', this.form);
+    },
+    // 选择辖区
+    onConfirm(value) {
+      this.$set(this.form, `juris`, value);
+      this.showPicker = false;
+    },
+  },
+  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>

+ 48 - 0
src/views/account/parts/role-1.vue

@@ -0,0 +1,48 @@
+<template>
+  <div id="role-1">
+    <van-row>
+      <van-col span="24" class="main">
+        <van-cell title="机构用户" @click="to('mechanism')" is-link />
+        <van-cell title="平台用户" @click="to('users')" is-link />
+        <!-- <van-cell title="我的消息" @click="to('message')" is-link />
+        <van-cell title="申请管理" @click="to('disclosure')" is-link />
+        <van-cell title="专利管理" @click="to('patent')" is-link />
+        <van-cell title="交易管理" @click="to('trade')" is-link /> 
+        <van-cell title="统计" is-link /> -->
+      </van-col>
+    </van-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'role-1',
+  props: {},
+  components: {},
+  data: function () {
+    return {};
+  },
+  created() {},
+  methods: {
+    to(type) {
+      this.$router.push({ path: `/account/adminCenter/${type}/index` });
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 47 - 0
src/views/account/parts/role-2.vue

@@ -0,0 +1,47 @@
+<template>
+  <div id="role-2">
+    <van-row>
+      <van-col span="24" class="main">
+        <van-cell title="平台用户" @click="to('users')" is-link />
+        <!-- <van-cell title="我的消息" @click="to('message')" is-link />
+        <van-cell title="申请管理" @click="to('disclosure')" is-link />
+        <van-cell title="专利管理" @click="to('patent')" is-link />
+        <van-cell title="交易管理" @click="to('trade')" is-link />
+        <van-cell title="统计" is-link /> -->
+      </van-col>
+    </van-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'role-2',
+  props: {},
+  components: {},
+  data: function () {
+    return {};
+  },
+  created() {},
+  methods: {
+    to(type) {
+      this.$router.push({ path: `/account/mechCenter/${type}/index` });
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 43 - 0
src/views/account/parts/role-3.vue

@@ -0,0 +1,43 @@
+<template>
+  <div id="role-3">
+    <van-row>
+      <van-col span="24" class="main">
+        <van-cell title="基本信息" @click="to('basic')" is-link />
+        <van-cell title="修改密码" @click="to('password')" is-link />
+      </van-col>
+    </van-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'role-3',
+  props: {},
+  components: {},
+  data: function () {
+    return {};
+  },
+  created() {},
+  methods: {
+    to(type) {
+      this.$router.push({ path: `/account/userCenter/${type}/index` });
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 105 - 0
src/views/account/userCenter/basic/index.vue

@@ -0,0 +1,105 @@
+<template>
+  <div id="index">
+    <admin-frame :usePage="false" topType="2" @back="back">
+      <template v-slot:info>
+        <van-tabs v-model="active">
+          <van-tab title="基本信息">
+            <basic-1 :userInfo="userInfo" @onSubmit="onSubmit"></basic-1>
+          </van-tab>
+          <van-tab title="详细信息" v-if="isCom(userInfo)">
+            <company-1 :userInfo="userInfo" @onSubmit="onSubmit"></company-1>
+          </van-tab>
+        </van-tabs>
+      </template>
+    </admin-frame>
+  </div>
+</template>
+
+<script>
+import basic1 from '../parts/basic-1.vue';
+import company1 from '../parts/company-1.vue';
+import adminFrame from '@/layout/common/admin-frame.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: organization } = createNamespacedHelpers('organization');
+const { mapActions: personal } = createNamespacedHelpers('personal');
+export default {
+  name: 'index',
+  props: {},
+  components: {
+    adminFrame,
+    basic1,
+    company1,
+  },
+  data: function () {
+    return {
+      active: 0,
+      userInfo: {},
+    };
+  },
+  async created() {
+    if (this.user) await this.search();
+  },
+  methods: {
+    ...organization(['fetch', 'update']),
+    ...personal({ personalFetch: 'fetch', personalUpdate: 'update' }),
+    async search() {
+      if (this.user.is_expert == undefined) {
+        let res = await this.fetch(this.user.id);
+        if (this.$checkRes(res)) {
+          this.$set(this, `userInfo`, res.data);
+        }
+      } else {
+        let res = await this.personalFetch(this.user.id);
+        if (this.$checkRes(res)) {
+          this.$set(this, `userInfo`, res.data);
+        }
+      }
+    },
+    // 保存基本信息
+    async onSubmit({ data }) {
+      if (this.user.is_expert == undefined) {
+        let res = await this.update(data);
+        if (this.$checkRes(res)) {
+          this.$notify({
+            message: '基本信息修改成功',
+            type: 'success',
+          });
+          this.search();
+        }
+      } else {
+        let res = await this.personalUpdate(data);
+        if (this.$checkRes(res)) {
+          this.$notify({
+            message: '基本信息修改成功',
+            type: 'success',
+          });
+          this.search();
+        }
+      }
+    },
+    back() {
+      this.$router.push({ path: '/account/index' });
+    },
+    // 判断是否是企业
+    isCom(data) {
+      if (data.is_expert == false || data.is_expert == true) return false;
+      else return true;
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 72 - 0
src/views/account/userCenter/parts/basic-1.vue

@@ -0,0 +1,72 @@
+<template>
+  <div id="basic-1">
+    <van-row>
+      <van-col span="24" class="main">
+        <van-form>
+          <van-field v-model="userInfo.name" name="用户名称" label="用户名称" placeholder="用户名称" />
+          <van-field v-model="userInfo.phone" name="联系电话" label="联系电话" placeholder="联系电话" />
+          <van-field v-model="userInfo.code" name="所属机构" label="所属机构" placeholder="所属机构" readonly />
+          <van-field v-model="userInfo.email" name="电子邮箱" label="电子邮箱" placeholder="电子邮箱" />
+          <van-field v-model="userInfo.addr" name="联系地址" label="联系地址" placeholder="联系地址" />
+          <van-field v-model="userInfo.office_phone" name="办公电话" label="办公电话" placeholder="办公电话" />
+          <van-field v-model="userInfo.profession" name="所属行业" label="所属行业" placeholder="所属行业" />
+          <van-field readonly clickable name="picker" :value="userInfo.juris" label="所属辖区" placeholder="点击选择" @click="showPicker = true" />
+          <van-popup v-model="showPicker" position="bottom">
+            <van-picker show-toolbar :columns="jurisList" @confirm="onConfirm" @cancel="showPicker = false" />
+          </van-popup>
+          <van-field v-model="userInfo.school" name="院校" label="院校" placeholder="院校" />
+          <van-field v-model="userInfo.major" name="专业" label="专业" placeholder="专业" />
+          <van-field v-model="userInfo.card" name="身份证号" label="身份证号" placeholder="身份证号" />
+          <van-field v-model="userInfo.zwzc" name="职务职称" label="职务职称" placeholder="职务职称" />
+          <van-col span="24" class="btn">
+            <van-button round block type="info" @click="onSubmit">保存信息</van-button>
+            <!-- <van-button round block type="info" @click="upgradeBtn" v-if="userInfo.is_expert == false">升级用户</van-button> -->
+          </van-col>
+        </van-form>
+      </van-col>
+    </van-row>
+  </div>
+</template>
+
+<script>
+import { juris } from '@common/dict/index';
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'basic-1',
+  props: {
+    userInfo: { type: Object },
+  },
+  components: {},
+  data: function () {
+    return {
+      showPicker: false,
+      jurisList: juris,
+    };
+  },
+  created() {},
+  methods: {
+    onSubmit() {
+      this.$emit('onSubmit', { data: this.userInfo });
+    },
+    onConfirm(value) {
+      this.$set(this.userInfo, `juris`, value);
+      this.showPicker = false;
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 104 - 0
src/views/account/userCenter/parts/company-1.vue

@@ -0,0 +1,104 @@
+<template>
+  <div id="company-1">
+    <van-row>
+      <van-col span="24" class="main">
+        <van-form>
+          <van-field v-model="userInfo.institution_code" name="信用代码" label="信用代码" placeholder="信用代码" disabled />
+          <van-field v-model="userInfo.companyperson" name="企业法人" label="企业法人" placeholder="企业法人" />
+          <van-field v-model="userInfo.companycapital" name="注册资金" label="注册资金" placeholder="注册资金" />
+          <van-field
+            readonly
+            clickable
+            name="calendar"
+            :value="userInfo.companydate"
+            label="注册时间"
+            placeholder="点击选择日期"
+            @click="showCalendar = true"
+          />
+          <van-calendar v-model="showCalendar" @confirm="onConfirm" />
+          <van-field v-model="userInfo.companytype" name="注册类型" label="注册类型" placeholder="注册类型" />
+          <van-field v-model="userInfo.companytotal" name="企业总人数" label="企业总人数" placeholder="企业总人数" />
+          <van-field v-model="userInfo.sndyffy" name="研发费用" label="研发费用" placeholder="研发费用" />
+          <van-field v-model="userInfo.sndqyzsr" name="企业总收入" label="企业总收入" placeholder="企业总收入" />
+          <van-field v-model="userInfo.zjzyfrs" name="研发人数" label="研发人数" placeholder="研发人数" />
+          <van-field
+            v-model="userInfo.companybrief"
+            name="企业简介"
+            label="企业简介"
+            placeholder="企业简介"
+            type="textarea"
+            rows="2"
+            autosize
+            maxlength="300"
+            show-word-limit
+          />
+          <van-field
+            v-model="userInfo.mainproduct"
+            name="主要产品"
+            label="主要产品"
+            placeholder="主要产品"
+            type="textarea"
+            rows="2"
+            autosize
+            maxlength="300"
+            show-word-limit
+          />
+          <van-field
+            v-model="userInfo.qualifications"
+            name="企业资质"
+            label="企业资质"
+            placeholder="企业资质"
+            type="textarea"
+            rows="2"
+            autosize
+            maxlength="300"
+            show-word-limit
+          />
+          <van-col span="24" class="btn">
+            <van-button round block type="info" @click="onSubmit">保存信息</van-button>
+          </van-col>
+        </van-form>
+      </van-col>
+    </van-row>
+  </div>
+</template>
+
+<script>
+var moment = require('moment');
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'company-1',
+  props: { userInfo: { type: Object } },
+  components: {},
+  data: function () {
+    return {
+      showCalendar: false,
+    };
+  },
+  created() {},
+  methods: {
+    onSubmit() {
+      this.$emit('onSubmit', { data: this.userInfo });
+    },
+    onConfirm(date) {
+      this.$set(this.userInfo, `companydate`, moment(date).format('YYYY-MM-DD'));
+      this.showCalendar = false;
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 91 - 0
src/views/account/userCenter/parts/user-1.vue

@@ -0,0 +1,91 @@
+<template>
+  <div id="list-1">
+    <van-col span="24" class="main">
+      <van-col span="24" class="list" v-for="(item, index) in list" :key="index">
+        <van-col span="24" class="title">
+          {{ item.name }}
+        </van-col>
+        <van-col span="24" class="other">
+          <van-col span="24" class="otherInfo">
+            组织机构代码:<span>{{ item.institution_code || '暂无' }}</span>
+          </van-col>
+          <van-col span="24" class="otherInfo">
+            所属辖区:<span>{{ item.juris || '暂无' }}</span>
+          </van-col>
+        </van-col>
+        <van-col span="24" class="btn">
+          <el-button type="primary" size="mini" @click="bind(item)" v-if="item.openid == null">绑定</el-button>
+          <el-button type="danger" size="mini" @click="removeBind(item)" v-if="item.openid">解绑</el-button>
+        </van-col>
+      </van-col>
+    </van-col>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'list-1',
+  props: {
+    list: { type: Array },
+  },
+  components: {},
+  data: function () {
+    return {};
+  },
+  created() {},
+  methods: {
+    // 绑定微信
+    bind(data) {
+      this.$emit('bind', data);
+    },
+    // 接触绑定
+    removeBind(data) {
+      this.$emit('removeBind', 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 {
+      .otherInfo {
+        font-size: 14px;
+        color: #666;
+        margin: 0 0 5px 0;
+        span {
+          color: #000;
+        }
+      }
+    }
+    .btn {
+      text-align: center;
+    }
+  }
+}
+</style>

+ 68 - 0
src/views/account/userCenter/password/index.vue

@@ -0,0 +1,68 @@
+<template>
+  <div id="login">
+    <admin-frame topType="2" @back="back" :rightArrow="false" :usePage="false" :useNav="false">
+      <template v-slot:info>
+        <van-form @submit="onSubmit">
+          <van-field v-model="form.password" type="password" name="password" label="新密码" :rules="[{ required: true, message: '请填写密码' }]" />
+          <div style="margin: 16px">
+            <van-button round block type="info" native-type="submit">提交修改</van-button>
+          </div>
+        </van-form>
+      </template>
+    </admin-frame>
+  </div>
+</template>
+
+<script>
+import adminFrame from '@frame/src/components/mobile-frame/mobile-main.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: personal } = createNamespacedHelpers('personal');
+export default {
+  name: 'login',
+  props: {},
+  components: {
+    adminFrame,
+  },
+  data: function () {
+    return {
+      form: {},
+    };
+  },
+  async created() {},
+  methods: {
+    ...personal(['updatePassword']),
+    async onSubmit(values) {
+      let data = { id: this.user.id, password: values.password };
+      let res = await this.updatePassword(data);
+      if (this.$checkRes(res)) {
+        let token = localStorage.removeItem('token');
+        let openid = sessionStorage.removeItem('openid');
+        if (token == undefined && openid == undefined) {
+          this.$toast({ type: 'fail', message: '退出登录成功' });
+          this.$router.push({ path: '/login', query: { path: '/account/index', type: '1' } });
+        }
+      } else {
+        this.$toast({ type: `fail`, message: `${res.errmsg}` });
+      }
+    },
+    back() {
+      this.$router.push({ path: '/account/index' });
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 1 - 1
src/views/index.vue

@@ -50,7 +50,7 @@ export default {
           router: '/service/interflow/index',
         },
         {
-          label: '账号管理个人中心',
+          label: '账号管理-个人中心',
           router: '/account/index',
         },
       ],

+ 39 - 7
src/views/login.vue

@@ -1,21 +1,42 @@
 <template>
   <div id="login">
-    <van-row>
-      <van-col span="24" class="main"> 登录 </van-col>
-    </van-row>
+    <admin-frame :useTop="false" :usePage="false" :useNav="false">
+      <template v-slot:info>
+        <van-col span="24" class="one">吉林专利市场</van-col>
+        <van-col span="24" class="two">
+          <van-tabs v-model="active" color="#409eff">
+            <van-tab title="平台用户">
+              <login-1></login-1>
+            </van-tab>
+            <van-tab title="管理用户">
+              <login-2></login-2>
+            </van-tab>
+          </van-tabs>
+        </van-col>
+      </template>
+    </admin-frame>
   </div>
 </template>
 
 <script>
+import login1 from '@/layout/login/login-1.vue';
+import login2 from '@/layout/login/login-2.vue';
+import adminFrame from '@frame/src/components/mobile-frame/mobile-main.vue';
 import { mapState, createNamespacedHelpers } from 'vuex';
 export default {
   name: 'login',
   props: {},
-  components: {},
+  components: {
+    adminFrame,
+    login1,
+    login2,
+  },
   data: function () {
-    return {};
+    return {
+      active: 0,
+    };
   },
-  created() {},
+  async created() {},
   methods: {},
   computed: {
     ...mapState(['user']),
@@ -33,4 +54,15 @@ export default {
 };
 </script>
 
-<style lang="less" scoped></style>
+<style lang="less" scoped>
+.one {
+  text-align: center;
+  padding: 30px 0;
+  font-size: 30px;
+  font-family: cursive;
+  font-weight: bold;
+}
+.two {
+  padding: 0 10px;
+}
+</style>

+ 36 - 0
src/views/patent/index.vue

@@ -0,0 +1,36 @@
+<template>
+  <div id="index">
+    <van-row>
+      <van-col span="24" class="main"> test </van-col>
+    </van-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'index',
+  props: {},
+  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>

+ 57 - 7
src/views/register.vue

@@ -1,22 +1,72 @@
 <template>
   <div id="register">
-    <van-row>
-      <van-col span="24" class="main"> 注册 </van-col>
-    </van-row>
+    <admin-frame :usePage="false" topType="2" :leftArrow="false" :rightArrow="false" :useNav="false">
+      <template v-slot:info>
+        <van-col span="24" class="one">
+          <register-1 :form="perForm" @onSubmit="onSubmit" @next="next" @reseat="reseat" v-if="active == '1'"></register-1>
+          <register-2 :form="orgForm" @onSubmit="orgSubmit" @up="up" @reseat="reseat" v-else-if="active == '2'"></register-2>
+        </van-col>
+      </template>
+    </admin-frame>
   </div>
 </template>
 
 <script>
+import register1 from '@/layout/login/register-1.vue';
+import register2 from '@/layout/login/register-2.vue';
+import adminFrame from '@frame/src/components/mobile-frame/mobile-main.vue';
 import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: personal } = createNamespacedHelpers('personal');
+const { mapActions: organization } = createNamespacedHelpers('organization');
 export default {
   name: 'register',
   props: {},
-  components: {},
+  components: {
+    adminFrame,
+    register1,
+    register2,
+  },
   data: function () {
-    return {};
+    return {
+      active: '1',
+      perForm: { type: '4' },
+      orgForm: {},
+    };
+  },
+  async created() {},
+  methods: {
+    ...personal({ personalCreate: 'create' }),
+    ...organization({ organizationCreate: 'create' }),
+    async onSubmit(data) {
+      let res = await this.personalCreate(data);
+      if (this.$checkRes(res)) {
+        this.$toast({ type: 'success', message: '注册成功,待管理员审核通过,方可登录' });
+      } else {
+        this.$toast({ type: 'fail', message: res.errmsg });
+      }
+    },
+    async orgSubmit(data) {
+      let newData = { ...data, ...this.perForm };
+      let res = await this.organizationCreate(newData);
+      if (this.$checkRes(res)) {
+        this.$toast({ type: 'success', message: '注册成功,待管理员审核通过,方可登录' });
+      } else {
+        this.$toast({ type: 'fail', message: res.errmsg });
+      }
+    },
+    // 下一步
+    next() {
+      this.active = '2';
+    },
+    // 上一步
+    up() {
+      this.active = '1';
+    },
+    // 取消注册
+    reseat() {
+      this.$router.push({ path: '/login' });
+    },
   },
-  created() {},
-  methods: {},
   computed: {
     ...mapState(['user']),
   },