Ver código fonte

1、实现切换公司

zhoux 2 anos atrás
pai
commit
fbe6a13878

+ 10 - 6
src/assets/al-icon/iconfont.css

@@ -1,11 +1,11 @@
 @font-face {
   font-family: "iconfont"; /* Project id 3389785 */
-  src: url('iconfont.eot?t=1703648956228'); /* IE9 */
-  src: url('iconfont.eot?t=1703648956228#iefix') format('embedded-opentype'), /* IE6-IE8 */
-       url('iconfont.woff2?t=1703648956228') format('woff2'),
-       url('iconfont.woff?t=1703648956228') format('woff'),
-       url('iconfont.ttf?t=1703648956228') format('truetype'),
-       url('iconfont.svg?t=1703648956228#iconfont') format('svg');
+  src: url('iconfont.eot?t=1710820213493'); /* IE9 */
+  src: url('iconfont.eot?t=1710820213493#iefix') format('embedded-opentype'), /* IE6-IE8 */
+       url('iconfont.woff2?t=1710820213493') format('woff2'),
+       url('iconfont.woff?t=1710820213493') format('woff'),
+       url('iconfont.ttf?t=1710820213493') format('truetype'),
+       url('iconfont.svg?t=1710820213493#iconfont') format('svg');
 }
 
 .iconfont {
@@ -16,6 +16,10 @@
   -moz-osx-font-smoothing: grayscale;
 }
 
+.icon-branch:before {
+  content: "\e648";
+}
+
 .icon-noPic:before {
   content: "\f2b9";
 }

BIN
src/assets/al-icon/iconfont.eot


Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 0
src/assets/al-icon/iconfont.js


+ 7 - 0
src/assets/al-icon/iconfont.json

@@ -6,6 +6,13 @@
   "description": "",
   "glyphs": [
     {
+      "icon_id": "10909255",
+      "name": "branch",
+      "font_class": "branch",
+      "unicode": "e648",
+      "unicode_decimal": 58952
+    },
+    {
       "icon_id": "35148863",
       "name": "无图片",
       "font_class": "noPic",

Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 0
src/assets/al-icon/iconfont.svg


BIN
src/assets/al-icon/iconfont.ttf


BIN
src/assets/al-icon/iconfont.woff


BIN
src/assets/al-icon/iconfont.woff2


+ 77 - 12
src/components/main/components/user/user.vue

@@ -1,6 +1,5 @@
 <!-- @desc:  @auth:洪旭东  @time:2022-05-14 11:30 -->
 <template>
-
   <div class="user-avator-dropdown">
     <Dropdown @on-click="handleClick">
       <Badge :dot="!!messageUnreadCount">
@@ -8,7 +7,21 @@
       </Badge>
       <!--设置语言-->
       <!--      <Icon :size="18" type="md-arrow-dropdown"></Icon>-->
-      <DropdownMenu slot="list" style="line-height: 0;">
+      <DropdownMenu slot="list" style="line-height: 0;" class="dropDownCp">
+        <!--切换公司-->
+        <Dropdown placement="left">
+          <DropdownItem name="changeCp">
+            {{ $t('changeCp') }}
+            <Icon type="ios-arrow-forward"></Icon>
+          </DropdownItem>
+
+          <DropdownMenu slot="list">
+            <DropdownItem v-for="(item,index) in joinedCpList" :key="index+'l'" :name="'changeCp_' + item.cpId"
+                          :selected="item.cpId === $store.state.user.cpId">
+              {{ (item.cpId === $store.state.user.cpId ? '●' : '\u00A0\u00A0') + "\u3000" + item.cpName }}
+            </DropdownItem>
+          </DropdownMenu>
+        </Dropdown>
         <Dropdown placement="left">
           <DropdownItem name="lang">
             {{ $t('languageSetting') }}
@@ -37,7 +50,7 @@
         <!--        <DropdownItem name="personalInfo">{{ $t('personalInfo') }}</DropdownItem>-->
         <DropdownItem name="refresh">{{ $t('refreshBasicData') }}</DropdownItem>
         <DropdownItem name="update">{{ $t('editPassword') }}</DropdownItem>
-        <DropdownItem name="changeMenu">{{ menuType === 'drawer' ? $t('treeMenu'):$t('drawerMenu') }}</DropdownItem>
+        <DropdownItem name="changeMenu">{{ menuType === 'drawer' ? $t('treeMenu') : $t('drawerMenu') }}</DropdownItem>
         <DropdownItem name="logout">{{ $t('logout') }}</DropdownItem>
       </DropdownMenu>
     </Dropdown>
@@ -217,7 +230,7 @@ import {convertToChildrenMain, handleMenu} from "@/libs/tools/user-tools";
 
 export default {
   name: 'User',
-  components: { ImageViewer},
+  components: {ImageViewer},
   inject: ['dkMain'],
   props: {
     userAvator: {
@@ -235,13 +248,13 @@ export default {
       saveLoading: false,
       pullLoading: false,
       imageViewerFlag: false,
-      dkLogo:dk_logo,
+      dkLogo: dk_logo,
       personalFlag: false,
+      joinedCpList: self.$store.state.user.joinedCpList,// 加入公司
       imagePathType: null, /* WXQY AL-OSS */
       personalInfo: {},
       langList: self.$config.languages,   // 语言包
       fontSizeList: self.$config.fontSizes,   // 字体
-      currentLang: localRead('local'),
       currentFontSize: localRead('fontSize') || '12', // 读取字体(默认字体12)
       personalInfoRules: {
         userName: [
@@ -282,7 +295,7 @@ export default {
      * @author : 洪旭东
      * @date   : 2023-08-11 15:46
      */
-    menuType(){
+    menuType() {
       return this.$store.state.app.menuType
     }
   },
@@ -298,7 +311,13 @@ export default {
   },
   methods: {
     ...mapActions([
-      'handleLogOut', 'cleanTokenAccess', 'setUserTableSettingAfter', 'setMenuListAfter'
+      'handleLogOut', 'cleanTokenAccess', 'setUserTableSettingAfter', 'setMenuListAfter', 'handleLogin',
+      'afterLogin',
+      'updateCompany',
+      'updateToken',
+      'changeCp',
+      'getInfoAfterLogin',
+      'handleAfterLoginInfo'
     ]),
     ...mapMutations([
       'setMenuType',
@@ -621,7 +640,7 @@ export default {
      */
     refreshBasicData() {
       this.excute(this.$service.commonService, this.$service.commonService.refreshBasicData,
-        {appCode:this.$config.appCode.WEB}, true, this.$t('refresh')).then(res => {
+        {appCode: this.$config.appCode.WEB}, true, this.$t('refresh')).then(res => {
         if (res.code === this.$config.SUCCESS_CODE) {
           if (res.data) {
             let menu = res.data.menu;
@@ -663,12 +682,44 @@ export default {
       }
     },
     /**
+     * @desc   : 切换公司
+     * @author : 周兴
+     * @date   : 2024/3/19 14:18
+     */
+    async chooseCp(cpId) {
+      if (cpId) {
+        let item = this.joinedCpList.filter(it=>it.cpId == cpId);
+        if(!item || item.length == 0){
+          return;
+        }
+        await this.updateCompany(item[0]);
+        // 点击切换公司
+        this.changeCp(this.joinedCps).then(res => {
+          // 更新token
+          this.updateToken(res.data);
+          setTimeout(() => {
+            // 登录后获取信息
+            this.getInfoAfterLogin().then(r => {
+              if (r.code == this.$config.SUCCESS_CODE) {
+                this.handleAfterLoginInfo(r.data);
+                // 关闭所有的窗体
+                if (this.dkMain) {
+                  this.dkMain.handleAllClose();
+                }
+                // 刷新页面
+                location.reload();
+              }
+            });
+          }, 50)
+        })
+      }
+    },
+    /**
      * @desc   : 下拉点击
      * @author : 洪旭东
      * @date   : 2022-05-14 11:28
      */
     handleClick(name) {
-      //console.log('333', name)
       switch (name) {
         case 'logout':
           this.logout()
@@ -708,7 +759,7 @@ export default {
             this.setMenuType('drawer')
           }
           // 把菜单打开模式保存到缓存中
-          localSave('sideMenuType',this.menuType)
+          localSave('sideMenuType', this.menuType)
           // this.excute(this.$service.userBasicSetService, this.$service.userBasicSetService.update,
           //   {menuType:this.$store.state.app.menuType}).then(res=>{
           //     if (res.code === this.$config.SUCCESS_CODE) {
@@ -719,6 +770,13 @@ export default {
           //   })
           break
       }
+      if(name.indexOf('changeCp')>= 0){
+        let values = name.split('_')
+        if(values && values.length > 1){
+          // 切换公司
+          this.chooseCp(values[1])
+        }
+      }
     }
   },
   created() {
@@ -781,7 +839,14 @@ export default {
 }
 
 /*下拉菜单层级*/
-.user-avator-dropdown /deep/ .ivu-select-dropdown{
+.user-avator-dropdown /deep/ .ivu-select-dropdown {
   z-index: 99999;
 }
+
+.dropDownCp /deep/ .ivu-dropdown-menu {
+  /*min-width: auto;*/
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  overflow: hidden;
+}
 </style>

+ 9 - 0
src/config/index.js

@@ -24,6 +24,15 @@ export default {
    */
   homeName: 'home',
   /**
+   * @desc   : 体验公司Id
+   * @author : 周兴
+   * @date   : 2024/3/19 10:49
+   */
+  expCp:{
+    cpId:-1,
+    cpName:'东科智云-标准版-体验'
+  },
+  /**
    * @description 需要加载的插件
    */
   plugin: {

+ 4 - 0
src/locale/lang/zh-CN.js

@@ -692,6 +692,10 @@ export const others = {
   line: '折线图',
   pie: '饼状图',
   allocationRatio: '分配比例',
+  editPassword:'修改密码',
+  treeMenu:'树形菜单',
+  refreshBasicData:'刷新菜单',
+  changeCp:'切换公司',
 }
 
 

+ 1 - 1
src/router/index.js

@@ -66,7 +66,7 @@ router.beforeEach((to, from, next) => {
   // console.log('to',to,from,next)
   iView.LoadingBar.start()
   let token = sessionStorage.getItem('token')
-  // console.log(token)
+  // console.log('dd',token)
   /* 先看你是不是登陆了 */
   if (token) {
     next()

+ 64 - 9
src/store/module/user.js

@@ -61,7 +61,9 @@ export default {
     // 系统参数
     setting: {},
     // 服务代码
-    svcCode: ''
+    svcCode: '',
+    // 加入的公司
+    joinedCpList:[]
   },
   mutations: {
     setUserPwd(state, userPwd) {
@@ -160,6 +162,10 @@ export default {
     },
     setBaseUrl(state, baseUrl){
       state.baseUrl = baseUrl
+    },
+    setJoinedCpList(state, joinedCpList){
+      console.log('rrr',joinedCpList)
+      state.joinedCpList = joinedCpList
     }
   },
   getters: {
@@ -206,13 +212,28 @@ export default {
       })
     },
     /**
+     * @desc   : 切换公司
+     * @author : 周兴
+     * @date   : 2024/3/19 15:39
+     */
+    changeCp(data,joinedCps){
+      let params = {}
+      params.appCode = config.appCode.WEB
+      params.userId = data.state.id
+      params.userName = data.state.userName
+      params.cpId = data.state.cpId
+      params.currentCp = data.state.cpId
+      params.joinedCps  = joinedCps;
+      params.cpCode = data.state.cpCode
+      return request('oauth-server/oauth/change_cp', params)
+    },
+    /**
      * @desc   : 登录之后获取基础数据
      * @author : 周兴
      * @date   : 2024/3/4 15:43
      */
     getInfoAfterLogin(data){
       let params = {}
-      console.log('data',data)
       params.appCode = config.appCode.WEB
       params.userId = data.state.id
       params.cpId = data.state.cpId
@@ -226,7 +247,6 @@ export default {
      * @date   : 2024/3/4 17:25
      */
     handleAfterLoginInfo({commit}, data){
-      console.log('data',data)
       // menu菜单
       let menu = data.menuList;
       let menuCopy = menu.copy();
@@ -255,6 +275,15 @@ export default {
       router.addRoutes(filterAsyncRouter(arr,menu))
     },
     /**
+     * @desc   : 更新token
+     * @author : 周兴
+     * @date   : 2024/3/19 16:13
+     */
+    updateToken({commit}, data){
+      sessionStorage.setItem('token', data.accessToken)
+      commit('setToken', data)
+    },
+    /**
      * @desc   : 登录后处理
      * @author : 洪旭东
      * @date   : 2022-06-09 16:14
@@ -271,6 +300,13 @@ export default {
       commit('setUserCode', data.userPhone)
       commit('setUserName', data.userName)
       commit('setToken', data.accessToken)
+      let joinedCpList = []
+      if (data.joinedCpList && data.joinedCpList.length > 0) {
+        joinedCpList = data.joinedCpList;
+      }
+      // 加入体验公司
+      joinedCpList.push(config.expCp);
+      commit('setJoinedCpList', joinedCpList)
       // commit('setLoginType', data.user.sysId)
       // todo 前台保存权限
       // commit('setAccess', data.user.funCodeList)
@@ -279,13 +315,15 @@ export default {
       // commit('setFlgInitPwd', data.user.flgInitPwd)
       // commit('setOrgId', data.user.orgId)
       // commit('setOrgName', data.user.orgName)
-      commit('setCpId', data.company.cpId)
-      commit('setCpCode', data.company.cpCode)
-      commit('setCpName', data.company.cpName)
-      commit('setSvcCode', data.company.svcCode)
+      if(data.company){
+        commit('setCpId', data.company.cpId)
+        commit('setCpCode', data.company.cpCode)
+        commit('setCpName', data.company.cpName)
+        commit('setSvcCode', data.company.svcCode)
 
-      if(data.company.svcIp && data.company.svcPort){
-        commit('setBaseUrl', data.company.svcIp + ':' + data.company.svcPort )
+        if(data.company.svcIp && data.company.svcPort){
+          commit('setBaseUrl', data.company.svcIp + ':' + data.company.svcPort )
+        }
       }
 
       // commit('setStaffId', data.user.staffId)
@@ -298,6 +336,23 @@ export default {
     },
 
     /**
+     * @desc   : 登录后处理
+     * @author : 洪旭东
+     * @date   : 2022-06-09 16:14
+     */
+    updateCompany({commit}, company) {
+      if(company){
+        commit('setCpId', company.cpId)
+        commit('setCpCode', company.cpCode)
+        commit('setCpName', company.cpName)
+        commit('setSvcCode', company.svcCode)
+        if(company.svcIp && company.svcPort){
+          commit('setBaseUrl', company.svcIp + ':' + company.svcPort )
+        }
+      }
+    },
+
+    /**
      * @desc   : 给用户表格缓存赋值
      * @author : 周兴
      * @date   : 2023/5/11 10:39

+ 102 - 25
src/view/login/login.vue

@@ -35,15 +35,29 @@
               <div style="font-size: 50px;font-weight: bold;color: #1B3769;">智云版</div>
             </div>
           </div>
-<!--          <div style="width: 90%;display: flex;justify-content: end">-->
-<!--            {{ this.$config.loginSubTitle }}-->
-<!--          </div>-->
-                  <div class="tab-class">
-                    <div :class="active == 0? 'btn-active-class':'btn-class' " id="user" @click="changeMode">密码登录</div>
-                    <div :class="active == 1? 'btn-active-class':'btn-class' " id="scan" @click="changeMode">扫码登录</div>
-                  </div>
+          <!--          <div style="width: 90%;display: flex;justify-content: end">-->
+          <!--            {{ this.$config.loginSubTitle }}-->
+          <!--          </div>-->
+          <div class="tab-class">
+            <div :class="active == 0? 'btn-active-class':'btn-class' " id="user" @click="changeMode">密码登录</div>
+            <div :class="active == 1? 'btn-active-class':'btn-class' " id="scan" @click="changeMode">扫码登录</div>
+          </div>
           <div v-show="active == 0" class="content">
-            <login-form @on-success-valid="handleSubmit" :loading="loading"></login-form>
+            <!--登录界面-->
+            <login-form v-if="step == 0" @on-success-valid="handleSubmit" :loading="loading"></login-form>
+            <!--选择公司-->
+            <div v-if="step == 1" style="overflow-y: auto;overflow-x:hidden;height: 300px;margin-bottom: 40px">
+              <DkButton v-for="(item,index) in joinedCpList" icon="iconfont iconfont icon-branch" :key="index"
+                        ref="save" type="text"
+                        style="margin-right: 10px;" @click="chooseCp(item)">
+                <div style="display: flex;margin-left: 20px">
+                  <div>{{ item.cpName }}</div>
+                </div>
+              </DkButton>
+              <!--              <div>-->
+              <!--                <Icon type="ios-arrow-round-forward" />-->
+              <!--              </div>-->
+            </div>
           </div>
           <div v-show="active == 1" id="scan-login" style="text-align: center; padding: 21px">
             <img :src="qrcodeUrl" style="width: 250px;height: 250px" v-if="qrcodeUrl"/>
@@ -64,8 +78,10 @@ import {mapActions} from 'vuex'
 import dk_logo from '@/assets/images/dongke_logo.png'
 import dk_mini from '@/assets/images/iboss_mini.png'
 import {localRead, localSave} from "@/libs/base/util";
-import { getQrCode, checkLoginOpenId } from '@/api/system/user/login'
+import {getQrCode, checkLoginOpenId} from '@/api/system/user/login'
 import uuidv4 from 'uuid/v4'
+import config from "@/config";
+import {request} from "@/api/base";
 
 export default {
   components: {
@@ -86,13 +102,19 @@ export default {
       checkLoginOpenId: checkLoginOpenId,
       loginUuid: null,
       qrcodeUrl: null,
-      interval: null
+      interval: null,
+      step: 0,// 用于跳转到选择公司页面
+      joinedCpList: [], // 公司数据源
+      joinedCps:[],// 加入公司
     }
   },
   methods: {
     ...mapActions([
       'handleLogin',
       'afterLogin',
+      'updateCompany',
+      'updateToken',
+      'changeCp',
       'getInfoAfterLogin',
       'handleAfterLoginInfo'
     ]),
@@ -109,7 +131,7 @@ export default {
         this.active = 1;
         let _this = this
         this.interval = setInterval(() => {
-          _this.checkLoginOpenId(_this.loginUuid).then(r=>{
+          _this.checkLoginOpenId(_this.loginUuid).then(r => {
             let res = r.data
             if (res.code === _this.$config.SUCCESS_CODE) {
               clearInterval(_this.interval)
@@ -117,7 +139,7 @@ export default {
               this.$router.push({
                 name: this.$config.homeName
               })
-            } else if (res.code === 1015){
+            } else if (res.code === 1015) {
               _this.$Message.warning(res.message)
             }
           })
@@ -135,29 +157,68 @@ export default {
       this.$i18n.locale = this.lang
     },
     /**
+     * @desc   : 选择公司
+     * @author : 周兴
+     * @date   : 2024/3/19 14:18
+     */
+    async chooseCp(e) {
+      if(e){
+        await this.updateCompany(e);
+        // 点击切换公司
+        this.changeCp(this.joinedCps).then(res=>{
+          // 更新token
+          this.updateToken(res.data);
+          setTimeout(()=>{
+            // 登录后获取信息
+            this.getInfoAfterLogin().then(r => {
+              if (r.code == this.$config.SUCCESS_CODE) {
+                this.handleAfterLoginInfo(r.data);
+                this.$router.push({
+                  name: this.$config.homeName
+                })
+              }
+            });
+          },50)
+        })
+      }
+    },
+    /**
      *   @desc   : 密码账号登录提交
      *   @date   : 2022/5/13 16:52
      *   @author : 洪旭东
      */
-    handleSubmit({ftyCode, userCode, userPwd, appCode}) {
+    handleSubmit({userCode, userPwd, appCode}) {
       this.loading = true
-      this.handleLogin({ftyCode, userCode, userPwd, appCode}).then(res => {
+      this.handleLogin({userCode, userPwd, appCode}).then(res => {
         this.$Message.destroy()
         if (res.code === this.$config.SUCCESS_CODE) {
           if (res.data) {
             clearInterval(this.interval)
-            // 登录后获取信息
-            this.getInfoAfterLogin(res.data).then(r=>{
-              if(r.code == this.$config.SUCCESS_CODE){
-                this.handleAfterLoginInfo(r.data);
-                this.$router.push({
-                  name: this.$config.homeName
-                })
+            // 如果当前公司为空,加入公司有值,那么打开选择公司的页面
+            if (!res.data.company) {
+              let joinedCpList = []
+              if (res.data.joinedCpList && res.data.joinedCpList.length > 0) {
+                joinedCpList = res.data.joinedCpList;
+                this.joinedCps = res.data.joinedCps;
               }
-            });
+              // 加入体验公司
+              joinedCpList.push(this.$config.expCp);
+              this.joinedCpList = joinedCpList;
+              this.step = 1;
+            } else {
+              // 登录后获取信息
+              this.getInfoAfterLogin(res.data).then(r => {
+                if (r.code == this.$config.SUCCESS_CODE) {
+                  this.handleAfterLoginInfo(r.data);
+                  this.$router.push({
+                    name: this.$config.homeName
+                  })
+                }
+              });
+            }
+            // 登录后更新相关信息
             this.afterLogin(res.data)
           }
-
         } else {
           let message = res.message
           this.$Message.warning({content: message})
@@ -179,7 +240,7 @@ export default {
 
     //生成uuid并获取二维码
     this.loginUuid = uuidv4()
-    this.getQrCode(this.loginUuid).then(r=>{
+    this.getQrCode(this.loginUuid).then(r => {
       let res = r.data
       if (res.code === this.$config.SUCCESS_CODE) {
         this.qrcodeUrl = res.data
@@ -255,7 +316,7 @@ export default {
   bottom: 50px;
 }
 
-/deep/.ivu-btn-primary{
+/deep/ .ivu-btn-primary {
   display: flex;
   align-items: center;
   justify-content: center;
@@ -269,5 +330,21 @@ export default {
   height: calc(100vh - 150px)
 }
 
+/deep/ .ivu-btn-text {
+  width: 100%;
+  height: 60px;
+  font-size: 20px !important;
+  background: #ffffff;
+  display: flex;
+  justify-content: left;
+  align-items: center;
+  margin: 20px 20px;
+}
+
+
+/deep/ .ivu-btn .ivu-btn-text > span {
+  width: calc(100% - 50px);
+}
+
 
 </style>

Alguns arquivos não foram mostrados porque muitos arquivos mudaram nesse diff