zs 1 ano atrás
pai
commit
ef4c905955

+ 3 - 5
src/lang/package/zh-cn/menus.js

@@ -2,6 +2,8 @@ export default {
   home: '首页',
   system: '系统设置',
   user: '用户管理',
+  center: '个人中心',
+  password: '修改密码',
   system_menus: '菜单设置',
   system_role: '角色设置',
   system_parameter: '系统参数',
@@ -9,9 +11,6 @@ export default {
   system_dict_data: '字典数据',
   user_admin: '管理员用户',
   user_user: '平台用户',
-  user_unit: '科研机构',
-  user_company: '企业用户',
-  user_expert: '专家用户',
   platform: '信息管理',
   platform_policy: '政策法规',
   platform_news: '新闻资讯',
@@ -22,6 +21,5 @@ export default {
   demand_demand: '需求信息管理',
   match: '赛事管理',
   match_sign: '报名管理',
-  achievement: '成果管理',
-  password: '修改密码'
+  achievement: '成果管理'
 }

+ 5 - 1
src/layout/parts/Header.vue

@@ -13,7 +13,7 @@
             </el-icon>
             <template #dropdown>
               <el-dropdown-menu>
-                <el-dropdown-item>{{ $t('navbar.my') }}</el-dropdown-item>
+                <el-dropdown-item @click="center">{{ $t('navbar.my') }}</el-dropdown-item>
                 <el-dropdown-item @click="logout">{{ $t('navbar.logout') }}</el-dropdown-item>
               </el-dropdown-menu>
             </template>
@@ -40,6 +40,10 @@ const logout = () => {
   tagsViewStore.delAllViews()
   router.push('/login')
 }
+// 个人中心
+const center = () => {
+  router.push('/center')
+}
 </script>
 <style scoped lang="scss">
 .main {

+ 5 - 0
src/router/index.js

@@ -38,6 +38,11 @@ export const constantRoutes = [
         },
         component: () => import('@/views/home/index.vue')
       },
+      {
+        path: '/center',
+        meta: { title: i18n.global.t('menus.center') },
+        component: () => import('@/views/account/center/index.vue')
+      },
       {
         path: '401',
         component: () => import('@/views/error-page/401.vue'),

Diferenças do arquivo suprimidas por serem muito extensas
+ 1384 - 10956
src/utils/city.js


+ 0 - 20
src/views/acccount/updatepd/index.vue

@@ -1,20 +0,0 @@
-<template>
-  <div id="index">
-    <el-row>
-      <el-col :span="24" class="main animate__animated animate__backInRight" v-loading="loading">
-        <el-col :span="24" class="one"> 修改密码 </el-col>
-      </el-col>
-    </el-row>
-  </div>
-</template>
-
-<script setup>
-// 加载中
-const loading = ref(false)
-// 请求
-onMounted(async () => {
-  loading.value = true
-  loading.value = false
-})
-</script>
-<style scoped lang="scss"></style>

+ 43 - 0
src/views/account/center/index.vue

@@ -0,0 +1,43 @@
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="main animate__animated animate__backInRight" v-loading="loading">
+        <el-card>
+          <template #header>
+            <div class="card-header">
+              <span>基本信息</span>
+            </div>
+          </template>
+          <el-col :span="24" class="one">
+            <el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
+              <el-tab-pane label="基本信息" name="first">
+                <basic></basic>
+              </el-tab-pane>
+              <el-tab-pane label="修改密码" name="second">
+                <password></password>
+              </el-tab-pane>
+            </el-tabs>
+          </el-col>
+        </el-card>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script setup>
+import basic from './parts/basic.vue'
+import password from './parts/password.vue'
+// 加载中
+const loading = ref(false)
+// 请求
+onMounted(async () => {
+  loading.value = true
+  loading.value = false
+})
+const activeName = ref('first')
+
+const handleClick = (tab, event) => {
+  console.log(tab, event)
+}
+</script>
+<style scoped lang="scss"></style>

+ 76 - 0
src/views/account/center/parts/basic.vue

@@ -0,0 +1,76 @@
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="main animate__animated animate__backInRight" v-loading="loading">
+        <el-col :span="24" class="one">
+          <custom-form v-model="form" :fields="fields" :rules="rules" @save="toSave">
+            <template #is_super="{ item }">
+              <template v-if="item.model === 'is_super'">
+                <el-col :span="24" class="one_1">{{ form.is_super == true ? '是' : '否' }}</el-col>
+              </template>
+            </template>
+            <template #role="{ item }">
+              <template v-if="item.model === 'role'">
+                <el-col :span="24" class="one_1" v-if="form.role?.length > 0">{{ getRole(form.role) }}</el-col>
+                <el-col :span="24" class="one_1" v-else>暂无角色</el-col>
+              </template>
+            </template>
+          </custom-form>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script setup>
+// import { UserStore } from '@/store/user'
+import { RoleStore } from '@/store/api/system/role'
+const roleStore = RoleStore()
+// const userStore = UserStore()
+// const user = computed(() => userStore.user)
+// const router = useRouter()
+const $checkRes = inject('$checkRes')
+// 加载中
+const loading = ref(false)
+// 表单
+const form = ref({})
+const fields = ref([
+  { label: '昵称', model: 'name' },
+  { label: '账号', model: 'account', options: { readonly: true } },
+  { label: '角色', model: 'role', custom: true },
+  { label: '超级管理员', model: 'is_super', options: { readonly: true }, custom: true }
+])
+const rules = ref({
+  name: [{ required: true, message: '请输入用户昵称', trigger: 'blur' }],
+  is_super: [{ required: true, message: '请输入超级管理员', trigger: 'blur' }],
+  account: [{ required: true, message: '请输入用户账号', trigger: 'blur' }]
+})
+const roleList = ref([])
+// 请求
+onMounted(async () => {
+  loading.value = true
+  await searchOther()
+  await search()
+  loading.value = false
+})
+const searchOther = async () => {
+  let result
+  // 是否使用
+  result = await roleStore.query({ is_use: '0' })
+  if ($checkRes(result)) roleList.value = result.data
+}
+const search = async () => {}
+const getRole = (i) => {
+  const arr = []
+  for (const val of i) {
+    const r = this.roleList.find((f) => f._id === val)
+    if (r) arr.push(r.name)
+  }
+  return arr.join(';')
+}
+// 提交保存
+const toSave = async (data) => {
+  console.log(data)
+}
+</script>
+<style scoped lang="scss"></style>

+ 62 - 0
src/views/account/center/parts/password.vue

@@ -0,0 +1,62 @@
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="main animate__animated animate__backInRight" v-loading="loading">
+        <el-col :span="24" class="one">
+          <custom-form v-model="form" :fields="fields" :rules="rules" @save="toSave"></custom-form>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script setup>
+import { UserStore } from '@/store/user'
+import { useTagsViewStore } from '@/store'
+import { LoginStore } from '@/store/api/login'
+const store = LoginStore()
+const userStore = UserStore()
+const tagsViewStore = useTagsViewStore()
+const user = computed(() => userStore.user)
+const router = useRouter()
+const $checkRes = inject('$checkRes')
+// 加载中
+const loading = ref(false)
+// 表单
+const form = ref({})
+const fields = ref([
+  { label: '新密码', model: 'password', type: 'password' },
+  { label: '确认新密码', model: 'ispassword', type: 'password' }
+])
+const rules = ref({
+  password: [{ required: true, message: '请输入新密码' }],
+  ispassword: [
+    { required: true, message: '请输入确认新密码' },
+    {
+      trigger: 'blur',
+      validator: (rule, value, callback) => {
+        if (form.value.password !== value) {
+          callback(new Error('两次输入的密码不一致'))
+        } else {
+          callback()
+        }
+      }
+    }
+  ]
+});
+// 请求
+onMounted(async () => {
+  loading.value = true
+  loading.value = false
+})
+// 提交保存
+const toSave = async (data) => {
+  let res = await store.rp({ _id: user._id, password: data.password, type: user.role });
+  if ($checkRes(res, true)) {
+    userStore.logOut()
+    tagsViewStore.delAllViews()
+    router.push('/login')
+  }
+}
+</script>
+<style scoped lang="scss"></style>

+ 2 - 10
src/views/achievement/index.vue

@@ -28,9 +28,6 @@
             <template #field>
               <el-option v-for="i in fieldList" :key="i._id" :label="i.label" :value="i.value"></el-option>
             </template>
-            <template #type>
-              <el-option v-for="i in typeList" :key="i._id" :label="i.label" :value="i.value"></el-option>
-            </template>
             <template #attribute>
               <el-option v-for="i in attributeList" :key="i._id" :label="i.label" :value="i.value"></el-option>
             </template>
@@ -44,7 +41,7 @@
               <el-option v-for="i in technologyList" :key="i._id" :label="i.label" :value="i.value"></el-option>
             </template>
             <template #area>
-              <el-cascader v-model="form.area" :props="{ value: 'name', label: 'name' }" :options="cityList" @change="handleChange" style="width: 100%" />
+              <el-cascader v-model="form.area" :props="{ value: 'label', label: 'label' }" :options="cityList" @change="handleChange" style="width: 100%" />
             </template>
             <template #file>
               <custom-upload model="file" :list="form.file" :limit="1" url="/files/web/template/upload" @change="onUpload"></custom-upload>
@@ -101,7 +98,6 @@ const total = ref(20)
 const isUseList = ref([])
 const statusList = ref([])
 const fieldList = ref([])
-const typeList = ref([])
 const attributeList = ref([])
 const matureList = ref([])
 const sellList = ref([])
@@ -114,7 +110,6 @@ const formFields = ref([
   { label: t('pages.achievement.name'), model: 'name' },
   { label: t('pages.achievement.patent'), model: 'patent' },
   { label: t('pages.achievement.field'), model: 'field', type: 'select' },
-  { label: t('pages.achievement.type'), model: 'type', type: 'select' },
   { label: t('pages.achievement.attribute'), model: 'attribute', type: 'select' },
   { label: t('pages.achievement.mature'), model: 'mature', type: 'select' },
   { label: t('pages.achievement.sell'), model: 'sell', type: 'select' },
@@ -164,14 +159,11 @@ const searchOther = async () => {
   // 属性
   result = await dictDataStore.query({ code: 'attribute', is_use: '0' })
   if ($checkRes(result)) attributeList.value = result.data
-  // 类型
-  result = await dictDataStore.query({ code: 'type', is_use: '0' })
-  if ($checkRes(result)) typeList.value = result.data
   // 技术分类
   result = await dictDataStore.query({ code: 'technology', is_use: '0' })
   if ($checkRes(result)) technologyList.value = result.data
   // 成果状态
-  result = await dictDataStore.query({ code: 'achievementStatus', is_use: '0' })
+  result = await dictDataStore.query({ code: 'demandStatus', is_use: '0' })
   if ($checkRes(result)) achievementList.value = result.data
 }
 const search = async (query = { skip: 0, limit }) => {

+ 1 - 1
src/views/platform/demand/demand/index.vue

@@ -35,7 +35,7 @@
               <el-option v-for="i in methodList" :key="i._id" :label="i.label" :value="i.value"></el-option>
             </template>
             <template #area>
-              <el-cascader v-model="form.area" :props="{ value: 'name', label: 'name' }" :options="cityList" @change="handleChange" style="width: 100%" />
+              <el-cascader v-model="form.area" :props="{ value: 'label', label: 'label' }" :options="cityList" @change="handleChange" style="width: 100%" />
             </template>
           </custom-form>
         </el-col>

+ 1 - 1
src/views/platform/demand/supply/index.vue

@@ -35,7 +35,7 @@
               <el-option v-for="i in methodList" :key="i._id" :label="i.label" :value="i.value"></el-option>
             </template>
             <template #area>
-              <el-cascader v-model="form.area" :props="{ value: 'name', label: 'name' }" :options="cityList" @change="handleChange" style="width: 100%" />
+              <el-cascader v-model="form.area" :props="{ value: 'label', label: 'label' }" :options="cityList" @change="handleChange" style="width: 100%" />
             </template>
           </custom-form>
         </el-col>