Kaynağa Gözat

添加平台账号切换和机构信息修改

lex-xin 3 yıl önce
ebeveyn
işleme
851c79db7b

+ 97 - 1
src/layout/components/Navbar.vue

@@ -170,11 +170,17 @@
         </div>
         <el-dropdown-menu slot="dropdown" class="user-dropdown">
           <!-- divided -->
+          <el-dropdown-item v-if="tenantStatus">
+            <span style="display: block" @click="onTenantChange">{{ tenantName }} <i class="el-icon-sort"></i></span>
+          </el-dropdown-item>
           <el-dropdown-item>
             <span style="display: block" @click="resetPassWord">修改密码</span>
           </el-dropdown-item>
           <el-dropdown-item>
-            <span style="display: block" @click="logout">退出</span>
+            <span style="display: block" @click="accountSetting">账号设置</span>
+          </el-dropdown-item>
+          <el-dropdown-item>
+            <span style="display: block" @click="logout">安全退出</span>
           </el-dropdown-item>
         </el-dropdown-menu>
       </el-dropdown>
@@ -256,6 +262,43 @@
       </div>
     </el-dialog>
 
+    <el-dialog
+      title="切换机构"
+      width="500px"
+      append-to-body
+      v-if="tenantVisible"
+      :visible.sync="tenantVisible"
+    >
+      <el-form
+        :model="tenantForm"
+        label-position="right"
+        label-width="100px"
+        ref="tenantForm"
+      >
+        <el-form-item
+          label="选择机构"
+          :rules="[
+            { required: true, message: '请选择机构', trigger: 'change' }
+          ]"
+          prop="tenantId"
+        >
+          <el-select
+            v-model.trim="tenantForm.tenantId"
+            filterable
+            placeholder="请选择机构"
+            clearable
+            style="width: 100% !important"
+          >
+            <el-option v-for="(item, index) in  tenantList" :key="index" :label="item.name" :value="item.id"></el-option>
+          </el-select>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="tenantVisible = false">取 消</el-button>
+        <el-button type="primary" @click="submitTenant">确 定</el-button>
+      </div>
+    </el-dialog>
+
     <portal-target name="AppMain" ref="target">
       <instructions ref="instructions" @checkShow="checkShow" />
     </portal-target>
@@ -273,10 +316,13 @@ import AppLink from "./Sidebar/Link";
 import { getBelongTopMenuPath } from "@/utils/permission";
 import instructions from "./instructions";
 import { validOaUrl } from '@/utils/validate'
+import { tenantInfoQueryPage } from '@/views/organManager/api'
 import Cookies from 'js-cookie'
 import axios from 'axios'
 export default {
   data() {
+    const tenantId = sessionStorage.getItem('tenantId')
+    const tenantName = sessionStorage.getItem('tenantName')
     return {
       username: "",
       organName: this.$store.getters.organName,
@@ -292,6 +338,12 @@ export default {
       timerCount: 60,
       btnName: "获取验证码",
       isShowIns: false,
+      tenantVisible: false,
+      tenantName: tenantName || null,
+      tenantForm: {
+        tenantId: Number(tenantId) || null,
+      },
+      tenantList: []
     };
   },
 
@@ -308,6 +360,10 @@ export default {
       //  (route, getBelongTopMenuPath(route))
       return getBelongTopMenuPath(route);
     },
+    tenantStatus() { // 判断是否是平台账号 true 是
+      const baseTenantId = sessionStorage.getItem('baseTenantId')
+      return baseTenantId < 0 ? true : false
+    },
   },
   mounted() {
     // 手动加入
@@ -326,6 +382,46 @@ export default {
       this.$router.push(`/login`);
       window.location.reload();
     },
+    async onTenantChange() {
+      try {
+        const res = await tenantInfoQueryPage({ page: 1, rows: 999 }, )
+        this.tenantList = res.data?.rows || []
+        this.tenantVisible = true
+      } catch(e) {}
+    },
+    accountSetting() {
+      // 账号设置
+      this.$router.push('/tenantSetting/tenantInfoSetting')
+    },
+    submitTenant() {
+      this.$refs['tenantForm'].validate((res) => {
+        if(res) {
+          const tenantForm = this.tenantForm
+          let tenantName = null
+          this.tenantList.forEach(item => {
+            if(item.id == tenantForm.tenantId) {
+              tenantName = item.name
+            }
+          });
+          const tenantId = sessionStorage.getItem('tenantId')
+          if(tenantId != tenantForm.tenantId) {
+            //判断是否是当前路由
+            // if(url == this.$route.path) {
+              sessionStorage.setItem('tenantId', tenantForm.tenantId)
+              sessionStorage.setItem('tenantName', tenantName)
+              this.$router.push({
+                  path: '/redirect',
+                  query: this.$route.fullPath
+              })
+            // } else {
+            //     this.$router.push({
+            //     path: url
+            //     })
+            // }
+          }
+        }
+      })
+    },
     gotoRecode() {
       this.$router.push("/journal/journal");
     },

+ 7 - 0
src/router/index.js

@@ -101,6 +101,11 @@ export const constantRoutes = [
     hidden: true
   },
   {
+    path: '/redirect',
+    component: () => import('@/views/Layout/centerpage'),
+    hidden: true
+  },
+  {
     path: '/404',
     component: () => import('@/views/404'),
     hidden: true
@@ -488,6 +493,8 @@ export const asyncRoutes = {
   platformCourseDeault:()=>import('@/views/platformManager/platformCourseDeault'),
   // 特殊参数默认值
   specialDeault:() => import('@/views/baseRulesManager/special.vue'),
+  // 机构设置
+  tenantInfoSetting:() => import('@/views/tenantSetting/tenantInfo.vue'),
 
 }
 

+ 19 - 7
src/store/modules/user.js

@@ -1,5 +1,6 @@
 import { login, logout, getInfo } from '@/api/user'
 import { getToken, setToken, removeToken, removeCrossToken, setCrossToken } from '@/utils/auth'
+import { tenantInfoQueryPage, tenantInfoInfo } from '@/views/organManager/api'
 import { resetRouter } from '@/router'
 // import qs from 'qs'
 const state = {
@@ -46,6 +47,20 @@ const mutations = {
   }
 }
 
+async function tenantQueryPage(id) {
+  try {
+    let tenantId = id
+    if(tenantId < 0) {
+      const res = await tenantInfoQueryPage({ page: 1, rows: 1 })
+      const tenantList = res.data?.rows || []
+      tenantId = tenantList[0]?.id
+    }
+    const info = await tenantInfoInfo({id: tenantId})
+    sessionStorage.setItem('tenantId', info.data.id)
+    sessionStorage.setItem('tenantName', info.data.name)
+  } catch(e) {}
+}
+
 const actions = {
   // user login
   login ({ commit }, userInfo) {
@@ -73,8 +88,7 @@ const actions = {
   getInfo ({ commit, state }) {
 
     return new Promise((resolve, reject) => {
-
-      getInfo(state.token).then(response => {
+      getInfo(state.token).then(async (response) => {
         if (response.code == 200) {
           const data = response
           if (!data.data) {
@@ -87,10 +101,9 @@ const actions = {
           const phone = data.data.phone
           const isSuperAdmin = data.data.isSuperAdmin
           const roles = data.data.roles
-          if(data.data.tenantId) { // 设置机构编号
-            sessionStorage.setItem('tenantId', data.data.tenantId)
-          }
-          // const { name, avatar } = data
+          const tenantId = data.data.tenantId
+          await tenantQueryPage(tenantId)
+          sessionStorage.setItem('baseTenantId', tenantId)
           commit('SET_NAME', username)
           commit('SET_AVATAR', avatar)
           commit('SET_ORGAN', organ)
@@ -105,7 +118,6 @@ const actions = {
       })
     })
   },
-
   // 登出
   logout ({ commit }) {
     return new Promise((resolve, reject) => {

+ 1 - 1
src/utils/request.js

@@ -81,7 +81,7 @@ service.interceptors.request.use(
       // config.headers['content-type'] = "application/x-www-form-urlencoded"
     }
     const tenantId = sessionStorage.getItem('tenantId') || null
-    if(tenantId) {
+    if(tenantId && tenantId != 'undefined') {
       config.headers['tenantId'] = tenantId
     }
     config.params = cleanDeep(config.params)

+ 2 - 1
src/utils/request2.js

@@ -82,7 +82,8 @@ service.interceptors.request.use(
       config.headers['Authorization'] = getToken()
     }
     const tenantId = sessionStorage.getItem('tenantId') || null
-    if(tenantId) {
+    // const tenantStatus = config.data?.tenantStatus || config.params?.tenantStatus || null
+    if(tenantId && tenantId != 'undefined') {
       config.headers['tenantId'] = tenantId
     }
     if (config.requestType === 'form') {

+ 22 - 0
src/views/Layout/centerpage.vue

@@ -0,0 +1,22 @@
+<template>
+    <div></div>
+</template>
+<script>
+  export default {
+    data() {
+      return {
+      }
+    },
+    created() {
+      let url = this.$route.query;
+      let str = '';
+      for(let i in url) {
+        str += url[i];
+      }
+      const path = this.$route.query;
+      this.$router.push({
+        path: str,
+      });
+    }
+  }
+  </script>

+ 2 - 1
src/views/organManager/api.js

@@ -1,9 +1,10 @@
 
 import request2 from '@/utils/request2'
 
-export const tenantInfoQueryPage = data => request2({
+export const tenantInfoQueryPage = (data) => request2({
   url: '/api-web/tenantInfo/queryPage',
   method: 'post',
+  // tenantStatus: data.tenantStatus,
   data,
 })
 

+ 39 - 12
src/views/organManager/components/organInfo.vue

@@ -2,12 +2,13 @@
 <template>
   <div class="m-core">
     <el-alert
-        title="机构信息"
+        :title="tenantInfo == 'SETTING' ? '基本信息' : '机构信息'"
         type="info"
         :closable="false"
         style="margin-bottom: 20px"
       ></el-alert>
-      <el-form ref="form" :model="form" label-width="140px" :inline="true">
+      <!-- label-position="top" -->
+      <el-form ref="form"  :model="form" label-width="140px" :inline="true">
         <el-col :span="24">
           <el-form-item label="机构LOGO" prop="logo"
             :rules="[{ required: true, message: '请上传机构LOGO', trigger: 'blur, change' }]">
@@ -18,7 +19,6 @@
               :headers="headers"
               :show-file-list="false"
               :disabled="isDisabled"
-              
               :on-success="handleAvatarSuccess"
               :before-upload="beforeAvatarUpload"
             >
@@ -27,12 +27,41 @@
             </el-upload>
             <div class="tips" v-show="!isDisabled" style="line-height: 1;color: red;">图片尺寸:258x74;支持的格式:png;</div>
           </el-form-item>
+          <!-- <el-form-item label="整体风格" prop="theme"
+          :rules="[{ required: true, message: '请选择整体风格', trigger: 'change' }]">
+            <el-select
+              v-model="form.theme"
+              :disabled="isDisabled"
+              placeholder="请选择整体风格"
+              style="width: 238px !important"
+            >
+              <el-option label="大雅绿" value="green"></el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="主题色" prop="themeColor" :rules="[{ required: true, message: '请选择主题色', trigger: 'change' }]">
+            <el-color-picker v-model="themeColor"></el-color-picker>
+          </el-form-item> -->
         </el-col>
+        <el-form-item label="公司全称" prop="tsignName" v-show="tenantInfo != 'SETTING'"
+          :rules="[{ required: true, message: '请输入公司全称', trigger: 'blur' }]">
+          <el-input
+            v-model.trim="form.tsignName"
+            :disabled="isDisabled"
+            placeholder="请输入公司全称"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="营业执照编号" prop="tsignCode" v-show="tenantInfo != 'SETTING'"
+          :rules="[{ required: true, message: '请输入营业执照编号', trigger: 'blur' }]">
+          <el-input
+            v-model.trim="form.tsignCode"
+            :disabled="isDisabled"
+            placeholder="请输入营业执照编号"
+          ></el-input>
+        </el-form-item>
         <el-form-item label="机构名称" prop="name"
           :rules="[{ required: true, message: '请输入机构名称', trigger: 'blur' }]">
           <el-input
             v-model.trim="form.name"
-            
             :disabled="isDisabled"
             placeholder="请输入机构名称"
           ></el-input>
@@ -41,7 +70,6 @@
           :rules="[{ required: true, message: '请输入机构联系人', trigger: 'blur' }]">
           <el-input
             v-model.trim="form.contacts"
-            
             :disabled="isDisabled"
             placeholder="请输入机构联系人"
           ></el-input>
@@ -51,7 +79,6 @@
             { pattern: /^1[3456789]\d{9}$/, message: '请输入正确的手机号', trigger: 'blur' }]">
           <el-input
             v-model.trim="form.phone"
-            
             :max="11"
             :disabled="isDisabled"
             type="number"
@@ -65,7 +92,6 @@
             { pattern: /^\w+((.\w+)|(-\w+))@[A-Za-z0-9]+((.|-)[A-Za-z0-9]+).[A-Za-z0-9]+$/, message: '请输入正确的邮箱格式', trigger: 'blur' }]">
           <el-input
             v-model.trim="form.email"
-            
             :disabled="isDisabled"
             placeholder="请输入机构邮箱"
           ></el-input>
@@ -73,7 +99,6 @@
         <el-form-item label="机构客服电话" prop="customerServicePhone">
           <el-input
             v-model.trim="form.customerServicePhone"
-            
             type="number"
             :disabled="isDisabled"
             placeholder="请输入机构客服电话"
@@ -82,7 +107,6 @@
         <el-form-item label="机构地址" prop="address">
           <el-input
             v-model.trim="form.address"
-            
             :disabled="isDisabled"
             placeholder="请输入机构地址"
           ></el-input>
@@ -90,7 +114,6 @@
         <el-form-item label="机构简介" prop="remark">
           <el-input
             type="textarea"
-            
             show-word-limit
             :max="200"
             :disabled="isDisabled"
@@ -104,13 +127,15 @@
 <script>
 import { getToken } from "@/utils/auth";
 export default {
-  props: ['type', 'data'],
+  props: ['type', 'data', 'tenantInfo'],
   data () {
     return {
       headers: {
         Authorization: getToken(),
       },
       form: {
+        tsignName: null,
+        tsignCode: null,
         logo: null,
         name: null,
         contacts: null,
@@ -119,12 +144,14 @@ export default {
         address: null,
         customerServicePhone: null,
         remark: null,
+        theme: 'green',
+        themeColor: '#14928a'
       },
       payState: null,
       imageWidthM: 258,
       imageHeightM: 74,
     };
-  }, 
+  },
   mounted () {
     if(this.data) {
       this.form = { ...this.data }

+ 0 - 1
src/views/organManager/index.vue

@@ -10,7 +10,6 @@
       ref="searchForm"
       @submit="search"
       @reset="reset"
-      
       :saveKey="'platformServiceManager'"
       :model.sync="searchForm"
     >

+ 65 - 0
src/views/tenantSetting/tenantInfo.vue

@@ -0,0 +1,65 @@
+<template>
+  <div class="m-container">
+    <h2>
+      <div class="squrt"></div>
+      机构管理
+    </h2>
+    <!-- 列表 -->
+    <div class="m-core" v-if="status">
+      <!-- 机构基本信息 -->
+        <organInfo ref="organInfo" :data="info" type="update" tenantInfo="SETTING" />
+
+        <div style="padding-left: 140px;display: flex;width: 100%;">
+          <el-button type="primary"  @click="onNext">确认</el-button>
+        </div>
+    </div>
+  </div>
+</template>
+<script>
+import { tenantInfoInfo, tenantInfoUpdate } from "../organManager/api";
+import organInfo from '../organManager/components/organInfo'
+export default {
+  components: { organInfo },
+  data() {
+    return {
+      tableList: [],
+      form: {
+
+      },
+      info: {},
+      status: false,
+    };
+  },
+  mounted() {
+    this.__init();
+  },
+  methods: {
+    async __init() {
+      try {
+        const tenantId = sessionStorage.getItem('tenantId')
+        const res = await tenantInfoInfo({ id: tenantId })
+        this.status = true
+        const { config, productInfo, ...other } = res.data
+        this.info = { ...other }
+      } catch (e) {}
+    },
+    async onNext() {
+      const organStatus = await this.$refs.organInfo.onSubmit()
+      if(!organStatus) return
+      const organData = await this.$refs.organInfo.getValues()
+      let params = {
+        ...organData
+      }
+      try {
+          const res = await tenantInfoUpdate(params)
+          this.$message.success('修改更新成功')
+        } catch(e) {}
+    }
+  },
+};
+</script>
+<style lang="scss" scoped>
+.courseMask .el-dialog__body {
+  padding-bottom: 0;
+}
+</style>