瀏覽代碼

2022/8/16

Cheng 3 年之前
父節點
當前提交
6e2c11568f

+ 7 - 1
src/api/admin.js

@@ -278,5 +278,11 @@ export default {
         method: 'post',
         params: params
       })
-    },
+  },
+    /**
+    * 获取租户类型
+    */
+  getDict(params) {
+    return axios.get('/permission/api/dict/getDict', { params })
+  }
 }

+ 1 - 1
src/utils/axios.js

@@ -39,7 +39,7 @@ _axios.interceptors.request.use(
     if (config.loading) {
       loadingInstance = Loading.service({})
     }
-    console.log(config)
+    // console.log(config)
     return config;
   },
   function (error) {

+ 4 - 4
src/views/apply/index.vue

@@ -267,10 +267,10 @@ export default {
 .admin-apply {
 
 }
-.details:hover{
-  border-bottom: 1px solid black;
-  cursor: pointer;
-}
+// .details:hover{
+//   border-bottom: 1px solid black;
+//   cursor: pointer;
+// }
  .demo-table-expand {
     font-size: 0;
   }

+ 61 - 7
src/views/client/index.vue

@@ -27,6 +27,7 @@
           <el-dropdown split-button type="primary" size="small" @click="handleEdit(scope.row)">
             编辑
             <el-dropdown-menu slot="dropdown" class="text-align_center">
+              <el-dropdown-item @click.native="handleDetails(scope.row)">详情</el-dropdown-item>
               <el-dropdown-item class="color-red" @click.native="handleDelete(scope.row)" divided>删除</el-dropdown-item>
             </el-dropdown-menu>
           </el-dropdown>
@@ -37,7 +38,7 @@
       <el-pagination :current-page.sync="queryParams.current" :page-size="queryParams.size" :total="total" @current-change="handleCurrentChange" layout="total, prev, pager, next, jumper" background></el-pagination>
     </div>
     <el-dialog :title="title" :visible.sync="visible" width="500px" :before-close="close">
-      <!-- <el-form v-if="visible" :model="ruleForm" :rules="rules" ref="ruleForm" label-width="80px" label-position="left">
+      <el-form v-if="visible" :model="ruleForm" :rules="rules" ref="ruleForm" label-width="110px" label-position="left">
 
         <el-form-item label="租户名称" prop="name">
           <el-input v-model="ruleForm.name" placeholder="请输入租户名称"></el-input>
@@ -45,8 +46,7 @@
         <el-form-item label="备注" prop="remark">
           <el-input v-model="ruleForm.remark" placeholder="请输入备注" type="textarea"></el-input>
         </el-form-item>
-      </el-form> -->
-      <el-form v-if="visible" :model="ruleForm" :rules="rules" ref="ruleForm" label-width="120px" label-position="left">
+
         <el-row :gutter="24">
           <el-col :span="24">
             <el-form-item label="名称" prop="name">
@@ -103,14 +103,14 @@
           </el-col>
          
         </el-row>
-         <el-row :gutter="24">
+         <!-- <el-row :gutter="24">
           <el-col :span="24">
             <el-form-item label="管理员密码" prop="password">
               <el-input v-model="ruleForm.password" placeholder="请输入管理员密码"></el-input>
             </el-form-item>
           </el-col>
          
-        </el-row>
+        </el-row> -->
         <el-row :gutter="24">
           <el-col :span="24">
             <el-form-item label="可用功能权限" prop="power">
@@ -131,7 +131,10 @@
         <el-row :gutter="24">
           <el-col :span="24">
             <el-form-item label="类型" prop="type">
-              <el-input v-model="ruleForm.type" placeholder="请输入类型"></el-input>
+              <!-- <el-input v-model="ruleForm.type" placeholder="请输入类型"></el-input> -->
+              <el-select v-model="ruleForm.type" filterable placeholder="请选择类型" style="width: 100%">
+                <el-option v-for="item in select" :key="item.id" :value="item.dictChildLabel"></el-option>
+              </el-select>
             </el-form-item>
           </el-col>
          
@@ -142,6 +145,37 @@
         <el-button type="primary" @click="submit" :loading="btnLoading">确 定</el-button>
       </div>
     </el-dialog>
+
+    <el-dialog :title="title" :visible.sync="showvisible" width="700px" class="my-dialog-name" contentStyle="width:400px;" :before-close="close" v-if="ruleForm.apply!=null">
+        <el-form label-position="left"  class="demo-table-expand" label-width="80px">
+          <el-form-item label="管理员 :">
+            <span>{{ruleForm.apply.username}}</span>
+          </el-form-item>
+          <el-form-item label="租户名称 :">
+            <span>{{ruleForm.apply.name}}</span>
+          </el-form-item>
+          <el-form-item label="联系人 :">
+            <span>{{ruleForm.apply.contacts}}</span>
+          </el-form-item>
+          <el-form-item label="联系地址 :">
+            <span>{{ruleForm.apply.address}}</span>
+          </el-form-item>
+          <el-form-item label="租户类型 :">
+            <span>{{ruleForm.apply.type}}</span>
+          </el-form-item>
+          <el-form-item label="邮箱 :">
+            <span>{{ruleForm.apply.email}}</span>
+          </el-form-item>
+          <el-form-item label="租户状态 :">
+            <span>{{ruleForm.apply.state === 1 ? '已启用' : '未启用'}}</span>
+          </el-form-item>
+          <el-form-item label="备注 :">
+            <span>{{ruleForm.apply.describe}}</span>
+          </el-form-item>
+         
+        </el-form>
+
+    </el-dialog>
   </div>
 </template>
 
@@ -151,6 +185,8 @@ export default {
   },
   data() {
     return {
+      select: [],
+      showvisible: false,
       visible: false,
       loading: false,
       btnLoading: false,
@@ -163,7 +199,6 @@ export default {
         name: ''
       },
       ruleForm: {
-       
       },
      rules: {
         name: [{ required: true, message: '请输入名称', trigger: 'blur' },],
@@ -183,6 +218,8 @@ export default {
   },
   mounted() {
     this.getList()
+    this.getSelect()
+    // console.log(this.select)
   },
   methods: {
     handleAdd() {
@@ -196,10 +233,19 @@ export default {
       this.title = '编辑租户'
       this.visible = true
       this.ruleForm = { ...row }
+      
+    },
+    handleDetails(row) {
+      // console.log(row)
+      this.title = '租户详情'
+      this.showvisible = true
+      this.ruleForm.apply = row
     },
     close() {
       this.visible = false
+      this.showvisible = false
     },
+
     getList() {
       this.loading = true
       this.$api.getTenantList(this.queryParams).then(response => {
@@ -210,6 +256,14 @@ export default {
         this.loading = false
       })
     },
+    getSelect() {
+      this.$api.getDict().then(reponse => {
+        for (let i = 0; i < reponse.data.TENANT_TYPE.length; i++) {
+          this.select[i] = reponse.data.TENANT_TYPE[i]
+        }
+        // this.$set(this.select, reponse.data.TENANT_TYPE)
+      })
+    },
     handleCurrentChange(val) {
       this.queryParams.current = val;
       this.getList();

+ 1 - 1
src/views/layout/components/UserBar.vue

@@ -8,7 +8,7 @@
       </div>
       <template slot="dropdown">
         <el-dropdown-menu>
-<!--          <el-dropdown-item command="userinfo">个人信息</el-dropdown-item>-->
+          <!-- <el-dropdown-item command="userinfo">个人信息</el-dropdown-item> -->
           <el-dropdown-item command="changePwd">修改密码</el-dropdown-item>
           <el-dropdown-item divided command="doLogout">退出登录</el-dropdown-item>
         </el-dropdown-menu>

+ 20 - 16
src/views/layout/index.vue

@@ -7,22 +7,22 @@
         </div>
       </div>
       <div class="header-right">
-        <user-bar/>
+        <user-bar />
       </div>
     </header>
     <section class="wrapper">
       <el-container>
         <el-aside width="210px" style="overflow:hidden" class="patent-articles-menu">
-           <!-- <el-radio-group v-model="isCollapse" style="margin-bottom: 20px;">
+          <!-- <el-radio-group v-model="isCollapse" style="margin-bottom: 20px;">
   <el-radio-button :label="false">展开</el-radio-button>
   <el-radio-button :label="true">收起</el-radio-button>
 </el-radio-group> -->
-          <el-menu class="theme-dark" :default-active="activeMenu" @select="handleSelect" >
-           
-            <el-menu-item index="admin">
+          <el-menu class="theme-dark" :default-active="activeMenu" @select="handleSelect">
+
+            <!-- <el-menu-item index="admin">
                   <i class="el-icon-coordinate"></i>
                   <span slot="title">其他系统管理员管理</span>
-              </el-menu-item>
+            </el-menu-item> -->
             <el-menu-item index="client">
               <i class="el-icon-film"></i>
               <span slot="title">租户管理</span>
@@ -32,7 +32,7 @@
               <span slot="title">应用管理</span>
             </el-menu-item> -->
 
-             <!-- <el-submenu index="1">
+            <!-- <el-submenu index="1">
               <template slot="title">
                 <i class="el-icon-setting"></i>
                 <span>应用功能管理</span>
@@ -56,27 +56,27 @@
               <span slot="title">应用功能管理</span>
             </el-menu-item>
 
-             <el-menu-item index="department">
+            <el-menu-item index="department">
               <i class="el-icon-copy-document"></i>
               <span slot="title">部门管理</span>
             </el-menu-item>
-             <el-menu-item index="position">
+            <el-menu-item index="position">
               <i class="el-icon-present"></i>
               <span slot="title">职位管理</span>
             </el-menu-item>
-             <el-menu-item index="user">
+            <el-menu-item index="user">
               <i class="el-icon-user"></i>
               <span slot="title">人员管理</span>
             </el-menu-item>
-             <el-menu-item index="group">
+            <el-menu-item index="group">
               <i class="el-icon-menu"></i>
               <span slot="title">用户组管理</span>
             </el-menu-item>
-             <el-menu-item index="role">
+            <el-menu-item index="role">
               <i class="el-icon-eleme"></i>
               <span slot="title">角色管理</span>
             </el-menu-item>
-            
+
           </el-menu>
         </el-aside>
         <el-container>
@@ -123,7 +123,7 @@ export default {
     },
     getUserinfo() {
       this.$api.getUserInfo().then(response => {
-        console.log(response)
+        // console.log(response)
         this.$store.commit('SET_ADMIN_USERINFO', response.data)
       })
     },
@@ -139,16 +139,18 @@ export default {
   .header {
     height: 60px;
     background: #fff;
-    box-shadow: 0 1px 3px 0 rgba(0,0,0,.12), 0 0 3px 0 rgba(0,0,0,.04);
+    box-shadow: 0 1px 3px 0 rgba(0, 0, 0, .12), 0 0 3px 0 rgba(0, 0, 0, .04);
     border-bottom: 1px solid #d8dce5;
     margin-bottom: 10px;
     display: flex;
     justify-content: space-between;
+
     .logo-bar {
       font-size: 20px;
       font-weight: bold;
       display: flex;
       align-items: center;
+
       .logo {
         margin-right: 10px;
         width: 135px;
@@ -171,10 +173,12 @@ export default {
   .wrapper {
     width: 100%;
     height: calc(100% - 71px);
+
     .el-menu-item.is-active {
       background: #ecf5ff !important;
-      color: #409EFF!important;
+      color: #409EFF !important;
     }
+
     .admin-main-box {
       background: #fff !important;
       padding: 10px !important;

+ 332 - 231
src/views/login/index.vue

@@ -1,270 +1,371 @@
 <template>
-  <div class="login-container">
-    <el-form ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form" autocomplete="on" label-position="left">
-      <div class="title-container">
-        <h3 class="title">系统登录</h3>
+  <div class="login">
+    <div class="login-weaper">
+      <div class="login-left">
+        <div class="login-time">{{ time.txt }}</div>
+        <div class="login-left-box">
+          <div>
+            <div class="logo">{{ getThemeConfig.globalViceTitle }}</div>
+            <h2 class="title">{{ getThemeConfig.globalViceDes }}</h2>
+            <div class="msg">
+              <div class="msg-author">
+                <span>{{ quotations.name }}</span>
+                <span>{{ quotations.comeFrom }}</span>
+              </div>
+              <div class="msg-txt">{{ quotations.content }}</div>
+            </div>
+          </div>
+        </div>
       </div>
-      <el-form-item prop="username">
-        <span class="svg-container">
-          <svg-icon icon-class="user" />
-        </span>
-        <el-input
-            ref="username"
-            v-model="loginForm.username"
-            placeholder="请输入用户名"
-            name="username"
-            type="text"
-            tabindex="1"
-            autocomplete="on"
-        />
-      </el-form-item>
-      <el-tooltip v-model="capsTooltip" content="Caps lock is On" placement="right" manual>
-        <el-form-item prop="password">
-          <span class="svg-container">
-            <svg-icon icon-class="password" />
-          </span>
-          <el-input
-              :key="passwordType"
-              ref="password"
-              v-model="loginForm.password"
-              :type="passwordType"
-              placeholder="请输入密码"
-              name="password"
-              tabindex="2"
-              autocomplete="on"
-              @keyup.native="checkCapslock"
-              @blur="capsTooltip = false"
-              @keyup.enter.native="handleLogin"
-          />
-          <span class="show-pwd" @click="showPwd">
-            <svg-icon :icon-class="passwordType === 'password' ? 'eye' : 'eye-open'" />
-          </span>
-        </el-form-item>
-      </el-tooltip>
-    <el-tooltip v-model="capsTooltip" content="Caps lock is On" placement="right" manual>
-        <el-form-item prop="code">
-          <span class="svg-container">
-            <i class="el-icon-position"></i>
-          </span>
-          <el-input
-           @blur="capsTooltip = false"
-            type="text"
-            maxlength="4"
-            placeholder="请输入验证码"
-            v-model="loginForm.code"
-            clearable
-            autocomplete="off"
-            @keyup.enter.native="handleLogin"
-          />
-          <span class="show-pwd">
-            <img @click="getCode" class="login-code-img" style="margin-top: 0" :src="captcha" title="点击获取新的验证码" height="40px">
-          </span>
-        </el-form-item>
-      </el-tooltip>
-      <el-button :loading="loading" type="primary" style="width:100%;margin-bottom:30px;" @click.native.prevent="handleLogin">登 录</el-button>
-    </el-form>
+      <div class="login-right">
+        <div class="login-main">
+          <h4 class="login-title">{{ getThemeConfig.globalTitle }}</h4>
+          <el-form class="el-form login-form">
+            <el-form-item prop="username" class="margin-left_0">
+              <el-input
+                  type="text"
+                  placeholder="请输入账号"
+                  prefix-icon="el-icon-user"
+                  v-model="ruleForm.username"
+                  clearable
+                  autocomplete="off"
+                  @keyup.enter.native="submitForm"
+              >
+              </el-input>
+            </el-form-item>
+            <el-form-item prop="password" class="margin-left_0">
+              <el-input
+                  type="password"
+                  placeholder="请输入密码"
+                  prefix-icon="el-icon-lock"
+                  v-model="ruleForm.password"
+                  autocomplete="off"
+                  :show-password="true"
+                  @keyup.enter.native="submitForm"
+              >
+              </el-input>
+            </el-form-item>
+            <el-form-item prop="code" class="margin-left_0">
+              <div class="el-row" span="24">
+                <div class="el-col el-col-16">
+                  <el-input
+                      type="text"
+                      maxlength="4"
+                      placeholder="请输入验证码"
+                      prefix-icon="el-icon-position"
+                      v-model="ruleForm.code"
+                      clearable
+                      autocomplete="off"
+                      @keyup.enter.native="submitForm"
+                  ></el-input>
+                </div>
+                <div class="el-col el-col-8">
+                  <div class="login-code">
+                    <img @click="getCode" class="login-code-img" style="margin-top: 0" :src="captcha" title="点击获取新的验证码">
+                  </div>
+                </div>
+              </div>
+            </el-form-item>
+            <el-form-item>
+              <el-button type="primary" class="login-submit" @click="submitForm" :loading="btnLoading">
+                <span>登 录</span>
+              </el-button>
+            </el-form-item>
+          </el-form>
+          <div class="login-menu"></div>
+        </div>
+      </div>
+    </div>
+    <div class="vue-particles">
+      <vue-particles color="#dedede" shapeType="star" linesColor="#dedede" hoverMode="grab" clickMode="push" style="height: 100%"></vue-particles>
+    </div>
   </div>
 </template>
-<script>
 
+<script>
+import Storage from '@/utils/storage';
+import { formatDate, formatAxis } from '@/utils/formatTime';
 export default {
-  components: {
-  },
   data() {
     return {
-      loginForm: {
+      quotationsList: [
+        {
+          name: '颜渊',
+          comeFrom: '论语',
+          content:
+              '自己不喜欢的,就不要强加给别人。饥寒是自己不喜欢的,不要把它强加给别人;耻辱是自己不喜欢的,也不要把它强加给别人。将心比心,推己及人,从自己的利与害想到对别人的利与害,多替别人着想,这是终生应该奉行的原则。',
+        },
+        {
+          name: '荀子',
+          comeFrom: '劝学',
+          content:
+              '木料经过木工用墨线(木工用具)划直线加工以后,就变直了;金属物品在磨刀石上磨砺后,就能锋利。人经过学习磨练,自我反省,就会变得聪慧明智,不犯错误,也越来越坚强。',
+        },
+        {
+          name: '里仁',
+          comeFrom: '论语',
+          content:
+              '见到贤人,就应该想着向他学习;看见不贤的人,便应该自己反省,对不如自己的人喜欢讥笑、轻视,因而沾沾自喜;对比自己强的人喜欢贬低,甚至嫉妒、畏惧退缩,害怕与他们交往:这都是不正确的态度。',
+        },
+        {
+          name: '述而',
+          comeFrom: '论语',
+          content:
+              '君子心地平坦宽广,小人却经常局促忧愁。君子襟怀坦白,安贫乐业,与人为善,知足常乐,所以能坦荡荡。小人欲念太多,患得患失,忧心忡忡,怨天尤人,局促不安,所以常心怀戚戚。',
+        },
+        {
+          name: '老子',
+          comeFrom: '第六十四章',
+          content:
+              '千里遥远的路程是从脚下第一步开始的。任何事情的成功都是从头开始,从小到大逐渐积累的。万事开头难,没有个开头就不会有结果。任何事情都要从一点一滴的小事开始做起。',
+        },
+        {
+          name: '朱熹',
+          comeFrom: '训学斋规',
+          content:
+              '读书有三到,谓心到,眼到,口到。心不在此,则眼看不仔细,心眼既不专一,却只漫浪诵读,决不能记,久也不能久也。三到之中,心到最急,心既到矣,眼口岂不到乎?',
+        },
+      ],
+      quotations: {},
+      btnLoading: false,
+      ruleForm: {
         username: '',
         password: '',
-        code:''
+        code: '',
+        uuid: ''
       },
-      loginRules: {
-        username: [{ required: true, trigger: 'blur', message: '请输入用户名' }],
-        password: [{ required: true, trigger: 'blur', message: '请输入密码' }],
-        code: [{ required: true, trigger: 'blur', message: '请输入验证码' }]
+      time: {
+        txt: '',
+        fun: null,
       },
-      passwordType: 'password',
-      capsTooltip: false,
-      loading: false,
-      showDialog: false,
-      redirect: undefined,
-      otherQuery: {},
       captcha: ''
-    }
+    };
   },
-  created(){
-    this.getCode()
+  computed: {
+    // 获取当前时间
+    currentTime() {
+      return formatAxis(new Date());
+    },
+    // 获取布局配置信息
+    getThemeConfig() {
+      return {
+        globalViceTitle: '权限管理系统',
+        globalViceDes: '用以辅助对用户权限管理的系统',
+        globalTitle: '系统登录'
+      };
+    },
+  },
+  created() {
+    this.initTime();
   },
   mounted() {
-   
+    this.initRandomQuotations();
+    this.getCode()
+    const username = Storage.getStr('username')
+    const password = Storage.getStr('password')
+    if (username) {
+      this.ruleForm.username = username
+    }
+    if (password) {
+      this.ruleForm.password = password
+    }
   },
   methods: {
+    // 随机语录
+    initRandomQuotations() {
+      this.quotations = this.quotationsList[Math.floor(Math.random() * this.quotationsList.length)];
+    },
+    // 初始化左上角时间显示
+    initTime() {
+      this.time.txt = formatDate(new Date(), 'YYYY-mm-dd HH:MM:SS WWW QQQQ');
+      this.time.fun = setInterval(() => {
+        this.time.txt = formatDate(new Date(), 'YYYY-mm-dd HH:MM:SS WWW QQQQ');
+      }, 1000);
+    },
     getCode() {
       this.$api.getVerifyCode().then(response => {
-        this.loginForm.uuid = response.data.uuid
+        this.ruleForm.uuid = response.data.uuid
         this.captcha = response.data.captcha
       })
     },
-    checkCapslock(e) {
-      const { key } = e
-      this.capsTooltip = key && key.length === 1 && (key >= 'A' && key <= 'Z')
-    },
-    showPwd() {
-      if (this.passwordType === 'password') {
-        this.passwordType = ''
-      } else {
-        this.passwordType = 'password'
-      }
-      this.$nextTick(() => {
-        this.$refs.password.focus()
-      })
-    },
-    handleLogin() {
-      this.$refs.loginForm.validate(valid => {
-        if (valid) {
-          //  this.$router.push({
-          //     path: '/admin/admin'
-          //   })
-          // this.loading = true
-          this.$api.adminLogin(this.loginForm).then(response => {
-            console.log(response)
-            this.loading = true
-            this.$message.success('登录成功')
+    // 登录按钮点击
+    submitForm() {
+      this.btnLoading = true;
+      this.$api.adminLogin(this.ruleForm).then(response => {
+        Storage.setStr('username', this.ruleForm.username)
+        Storage.setStr('password', this.ruleForm.password)
+        this.btnLoading = false
+           this.$message.success('登录成功')
             this.$router.push({
               path: '/admin'
             })
-          }).catch(error => {
-            this.getCode()
-            this.loading = false
-          })
-        } else {
-          console.log('error submit!!')
-          return false
-        }
+      }).catch(error => {
+        this.getCode()
+        this.btnLoading = false
       })
     },
-  }
-}
+  },
+  destroyed() {
+    clearInterval(this.time.fun);
+  },
+};
 </script>
 
 <style lang="scss">
-/* 修复input 背景不协调 和光标变色 */
-/* Detail see https://github.com/PanJiaChen/vue-element-admin/pull/927 */
-
-$bg:#283443;
-$light_gray:#fff;
-$cursor: #fff;
-
-@supports (-webkit-mask: none) and (not (cater-color: $cursor)) {
-  .login-container .el-input input {
-    color: $cursor;
-  }
-}
-
-/* reset element-ui css */
-.login-container {
-  .el-input {
-    display: inline-block;
-    height: 47px;
-    width: 85%;
-
-    input {
-      background: transparent;
-      border: 0px;
-      -webkit-appearance: none;
-      border-radius: 0px;
-      padding: 12px 5px 12px 15px;
-      color: $light_gray;
-      height: 47px;
-      caret-color: $cursor;
-
-      &:-webkit-autofill {
-        box-shadow: 0 0 0px 1000px $bg inset !important;
-        -webkit-text-fill-color: $cursor !important;
-      }
-    }
-  }
-
-  .el-form-item {
-    border: 1px solid rgba(255, 255, 255, 0.1);
-    background: rgba(0, 0, 0, 0.1);
-    border-radius: 5px;
-    color: #454545;
-  }
-}
-</style>
-
-<style lang="scss" scoped>
-$bg:#2d3a4b;
-$dark_gray:#889aa4;
-$light_gray:#eee;
-
-.login-container {
-  min-height: 100%;
+.login {
+  height: 100%;
   width: 100%;
-  background-color: $bg;
   overflow: hidden;
-
-  .login-form {
-    position: relative;
-    width: 520px;
-    max-width: 100%;
-    padding: 160px 35px 0;
-    margin: 0 auto;
-    overflow: hidden;
-  }
-   
-
-  .tips {
-    font-size: 14px;
-    color: #fff;
-    margin-bottom: 10px;
-
-    span {
-      &:first-of-type {
-        margin-right: 16px;
-      }
-    }
-  }
-
-  .svg-container {
-    padding: 6px 5px 6px 15px;
-    color: $dark_gray;
-    vertical-align: middle;
-    width: 30px;
-    display: inline-block;
+  display: flex;
+  position: relative;
+  .vue-particles {
+    position: absolute;
+    top: 0;
+    left: 0;
+    width: 100%;
+    height: 100%;
+    background: radial-gradient(ellipse at top left, rgba(105, 155, 200, 1) 0%, rgba(181, 197, 216, 1) 57%);
   }
-
-  .title-container {
+  .login-weaper {
+    margin: auto;
+    height: 500px;
+    display: flex;
+    box-sizing: border-box;
     position: relative;
-
-    .title {
-      font-size: 26px;
-      color: $light_gray;
-      margin: 0px auto 40px auto;
-      text-align: center;
-      font-weight: bold;
+    z-index: 1;
+    border: none;
+    box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08);
+    .login-left {
+      width: 491px;
+      padding: 20px;
+      font-size: 16px;
+      color: #fff;
+      position: relative;
+      background-color: rgba(64, 158, 255, 0.8);
+      display: flex;
+      flex-direction: column;
+      border-top-left-radius: 4px;
+      border-bottom-left-radius: 4px;
+      .login-time {
+        width: 100%;
+        color: #fff;
+        opacity: 0.9;
+        font-size: 14px;
+        overflow: hidden;
+      }
+      .login-left-box {
+        flex: 1;
+        overflow: hidden;
+        position: relative;
+        z-index: 1;
+        display: flex;
+        align-items: center;
+        padding: 80px 45px;
+        .logo {
+          font-size: 22px;
+          margin-bottom: 15px;
+        }
+        .title {
+          color: #fff;
+          font-weight: 300;
+          letter-spacing: 2px;
+          font-size: 16px;
+        }
+        .msg {
+          color: #fff;
+          font-size: 13px;
+          margin-top: 35px;
+          .msg-author {
+            opacity: 0.6;
+            span:last-of-type {
+              margin-left: 15px;
+            }
+          }
+          .msg-txt {
+            margin-top: 15px;
+            line-height: 22px;
+          }
+        }
+      }
     }
-  }
-
-  .show-pwd {
-    position: absolute;
-    right: 10px;
-    top: 7px;
-    font-size: 16px;
-    color: $dark_gray;
-    cursor: pointer;
-    user-select: none;
-  }
-
-  .thirdparty-button {
-    position: absolute;
-    right: 0;
-    bottom: 6px;
-  }
-
-  @media only screen and (max-width: 470px) {
-    .thirdparty-button {
-      display: none;
+    .login-right {
+      width: 491px;
+      padding: 20px;
+      position: relative;
+      align-items: center;
+      display: flex;
+      background-color: rgba(255, 255, 255, 1);
+      border-top-right-radius: 4px;
+      border-bottom-right-radius: 4px;
+      .login-main {
+        margin: 0 auto;
+        width: 70%;
+        .login-title {
+          color: #333;
+          margin-bottom: 40px;
+          font-weight: 500;
+          font-size: 22px;
+          text-align: center;
+          letter-spacing: 4px;
+        }
+        .login-form {
+          margin: 10px 0;
+          i {
+            color: #333;
+          }
+          .el-form-item {
+            margin-bottom: 20px !important;
+            .login-code {
+              display: flex;
+              align-items: center;
+              justify-content: space-around;
+              margin: 0 0 0 10px;
+              user-select: none;
+              .login-code-img {
+                margin-top: 2px;
+                width: 100px;
+                height: 38px;
+                border: 1px solid #dcdfe6;
+                color: #333;
+                font-size: 14px;
+                font-weight: 700;
+                letter-spacing: 5px;
+                line-height: 38px;
+                text-indent: 5px;
+                text-align: center;
+                cursor: pointer;
+                transition: all ease 0.2s;
+                border-radius: 4px;
+                &:hover {
+                  border-color: #c0c4cc;
+                  transition: all ease 0.2s;
+                }
+              }
+            }
+            .login-submit {
+              width: 100%;
+              height: 45px;
+              letter-spacing: 2px;
+              font-weight: 300;
+            }
+          }
+        }
+        .login-menu {
+          margin-top: 30px;
+          width: 100%;
+          text-align: left;
+          a {
+            color: #999;
+            font-size: 12px;
+            margin: 0 8px;
+            text-decoration: none;
+            &:hover {
+              color: #1e9fff;
+              text-decoration: underline;
+            }
+          }
+        }
+      }
     }
   }
 }

+ 140 - 30
src/views/user/index.vue

@@ -35,6 +35,7 @@
           <el-dropdown split-button type="primary" size="small" @click="handleEdit(scope.row)">
             编辑
             <el-dropdown-menu slot="dropdown" class="text-align_center">
+              <el-dropdown-item @click.native="handleDetails(scope.row)" divided>人员详情</el-dropdown-item>
               <el-dropdown-item @click.native="handleReset(scope.row)">重置密码</el-dropdown-item>
               <el-dropdown-item class="color-red" @click.native="handleDelete(scope.row)" divided>删除</el-dropdown-item>
             </el-dropdown-menu>
@@ -109,13 +110,13 @@
         </el-row>
 
 
-        <el-row :gutter="24">
+        <!-- <el-row :gutter="24">
           <el-col :span="24">
              <el-form-item label="职位[部门]" prop="nail">
              <template>
              <el-col :span="8" style="padding-left:0">
                  <el-form-item label-width="0" prop="position">
-              <!-- <treeselect
+              <treeselect
                   v-model="positionAndDepartment.department"
                   :options="departmentList"
                   :disable-branch-nodes="true"
@@ -123,7 +124,7 @@
                   placeholder="请选择部门"
                   :normalizer="normalizer"
                :multiple="false"
-              /> -->
+              />
                 <el-tooltip
                   class="item"
                   effect="dark"
@@ -138,32 +139,22 @@
               :show-all-levels="false"
               :props="{ checkStrictly: true,value:'id',label:'name' }"
               clearable
-        @change="handleChange"
-        placeholder="请选择部门">
+              @change="handleChange"
+              placeholder="请选择部门">
               </el-cascader>
               </el-tooltip>
-            </el-form-item>
-                   <el-form-item label-width="0" label-height="82" label-line-height="82px" prop="position">
-              <el-select v-model="positionAndDepartment.position" 
-            filterable
-            placeholder="请选择职位"
-            >
-            <el-option
-             v-for="item in positionList"
-                :key="item.name"
-                :label="item.position"
-                :value="item.id">
-              
-            </el-option>
-            
-          </el-select>
-            </el-form-item>
+              </el-form-item>
+                <el-form-item label-width="0" label-height="82" label-line-height="82px" prop="position">
+                  <el-select v-model="positionAndDepartment.position" filterable placeholder="请选择职位">
+                  <el-option v-for="item in positionList" :key="item.name" :label="item.position" :value="item.id"></el-option>
+                </el-select>
+              </el-form-item>
              </el-col>
                <el-col :span="2" style="height:82px;line-height:82px">
                     <el-button  type="primary" size="mini" @click="showInputLabel" circle icon="el-icon-plus"></el-button>
                 </el-col> 
                 <el-col :span="14" style="padding-right:0">
-                  <!-- <el-input type="textarea" :rows="3" v-model="ruleForm.position" readonly="true" placeholder="请输入职位[部门]"></el-input> -->
+                  <el-input type="textarea" :rows="3" v-model="ruleForm.position" readonly="true" placeholder="请输入职位[部门]"></el-input>
                 <template>
                   <div style="width:100%;height:75px;border:1px solid #C0C0C0;border-radius:4px;overflow:auto">
                     <el-tag
@@ -180,7 +171,9 @@
              </template>
             </el-form-item>
           </el-col>
-        <!-- <el-col :span="4">
+
+
+        <el-col :span="4">
            <el-tag  effect="dark" type="primary" size="small" closable :disable-transitions="false" @close="handleCloseLabel()">11</el-tag>
         </el-col>
         <el-col :span="18">
@@ -224,8 +217,69 @@
          
                 <el-col :span="2">
                     <el-button  type="primary" size="mini" @click="showInputLabel" circle icon="el-icon-plus"></el-button>
-                </el-col> -->        
+                </el-col>        
+
+
+        </el-row> -->
+
+
+
+        <el-row :gutter="24">
+          <el-col :span="24">
+             <el-form-item label="职位[部门]" prop="nail">
+             <template>
+             <el-col :span="8" style="padding-left:0">
+                 <el-form-item label-width="0" prop="position">
+                <el-tooltip
+                  class="item"
+                  effect="dark"
+                  :disabled="!labelVal"
+                  :content="labelVal"
+                  placement="top-start"
+                >
+            <el-cascader
+            ref="deptIdCascader"
+              v-model="positionAndDepartment.department"
+              :options="departmentList"
+              :show-all-levels="false"
+              :props="{ checkStrictly: true,value:'id',label:'name' }"
+              clearable
+              @change="handleChange"
+              placeholder="请选择部门">
+              </el-cascader>
+              </el-tooltip>
+              </el-form-item>
+              </el-col>
+
+              <el-col :span="8" style="padding-left:0">
+                <el-form-item label-width="0" label-height="82" label-line-height="82px" prop="position">
+                  <el-select v-model="positionAndDepartment.position" filterable placeholder="请选择职位">
+                  <el-option v-for="item in positionList" :key="item.name" :label="item.position" :value="item.id"></el-option>
+                </el-select>
+              </el-form-item>
+             </el-col>
+               <el-col :span="2">
+                    <el-button  type="primary" size="mini" @click="showInputLabel" circle icon="el-icon-plus"></el-button>
+                </el-col> 
+                <el-col :span="24" style="padding-left:0;margin: 10px 0 0 0;">
+                <template>
+                  <div style="width:100%;height:75px;border:1px solid #C0C0C0;border-radius:4px;overflow:auto">
+                    <el-tag
+                      v-for="(tag,index) in ruleForm.positions" :key="index"
+                      closable
+                      :disable-transitions="false"
+                      @close="handleClose(index)">
+                      <span>{{tag.positionName}}[{{tag.departmentName}}]</span>
+                    </el-tag>
+                  </div>
+                </template>
+                </el-col>
+             </template>
+            </el-form-item>
+          </el-col>      
         </el-row>
+
+
           <el-row :gutter="24">
              <el-col :span="12">
              <el-form-item label="所属用户组" prop="group">
@@ -289,14 +343,27 @@
               <el-input v-model="ruleForm.username" placeholder="请输入账号"></el-input>
             </el-form-item>
           </el-col>
-          <el-col :span="12">
+          <!-- <el-col :span="12">
             <el-form-item label="密码" prop="password">
               <el-input v-model="ruleForm.password" placeholder="请输入密码"></el-input>
             </el-form-item>
+          </el-col> -->
+          <el-col :span="12">
+            <el-form-item label="是否启用" prop="state">
+              <el-switch
+              :active-value="1" 
+              :inactive-value="0"
+              v-model="ruleForm.state"
+              active-color="#13ce66"
+              inactive-color="#ff4949">
+              </el-switch>
+              <!-- <el-input v-model="ruleForm.state" placeholder="请输入状态" type="textarea"></el-input> -->
+            </el-form-item>
           </el-col>
+          
         </el-row>
     
-        <el-form-item label="是否启用" prop="state">
+        <!-- <el-form-item label="是否启用" prop="state">
         <el-switch
           :active-value="1" 
           :inactive-value="0"
@@ -304,8 +371,8 @@
           active-color="#13ce66"
           inactive-color="#ff4949">
         </el-switch>
-          <!-- <el-input v-model="ruleForm.state" placeholder="请输入状态" type="textarea"></el-input> -->
-        </el-form-item>
+        <el-input v-model="ruleForm.state" placeholder="请输入状态" type="textarea"></el-input>
+        </el-form-item> -->
           
         <el-form-item label="备注" prop="remark">
           <el-input v-model="ruleForm.remark" placeholder="请输入备注" type="textarea" maxlength="100" show-word-limit></el-input>
@@ -316,6 +383,43 @@
         <el-button type="primary" @click="submit" :loading="btnLoading">确 定</el-button>
       </div>
     </el-dialog>
+
+    <el-dialog :title="title" :visible.sync="showvisible" width="700px" class="my-dialog-name" contentStyle="width:400px;" :before-close="close" v-if="ruleForm.apply!=null">
+        <el-form label-position="left"  class="demo-table-expand" label-width="80px">
+          <el-form-item label="账号 :">
+            <span>{{ruleForm.apply.username}}</span>
+          </el-form-item>
+          <el-form-item label="姓名 :">
+            <span>{{ruleForm.apply.remark}}</span>
+          </el-form-item>
+          <el-form-item label="性别 :">
+            <span>{{ruleForm.apply.gender === 1 ? '男' : '女'}}</span>
+          </el-form-item>
+          <el-form-item label="邮箱 :">
+            <span>{{ruleForm.apply.email}}</span>
+          </el-form-item>
+          <el-form-item label="联系方式 :">
+            <span>{{ruleForm.apply.mobile}}</span>
+          </el-form-item>
+          <el-form-item label="QQ号 :">
+            <span>{{ruleForm.apply.qqNumber}}</span>
+          </el-form-item>
+          <el-form-item label="微信号 :">
+            <span>{{ruleForm.apply.mobile}}</span>
+          </el-form-item>
+          <el-form-item label="钉钉号 :">
+            <span>{{ruleForm.apply.nail}}</span>
+          </el-form-item>
+          <el-form-item label="是否启用 :">
+            <span>{{ruleForm.apply.state === 1 ? '已启用' : '未启用'}}</span>
+          </el-form-item>
+          <el-form-item label="备注 :">
+            <span>{{ruleForm.apply.remark}}</span>
+          </el-form-item>
+         
+        </el-form>
+
+    </el-dialog>
   </div>
 </template>
 
@@ -328,6 +432,7 @@ export default {
   },
   data() {
     return {
+      showvisible: false,
       visible: false,
       loading: false,
       btnLoading: false,
@@ -368,8 +473,6 @@ export default {
    positionAndDepartment:{},
       // departmentList: [],
       ruleForm: {
-        nails:[],
-        nail:''
       },
       rules: {
         name: [{ required: true, message: '请输入姓名', trigger: 'blur' },],
@@ -486,8 +589,15 @@ computed: {
       this.visible = true
       this.ruleForm = { ...row }
     },
+    handleDetails(row) {
+      console.log(row)
+      this.title = '人员详情'
+      this.showvisible = true
+      this.ruleForm.apply = row
+    },
     close() {
       this.visible = false
+      this.showvisible = false
     },
     getDepartment() {
       this.$api.getDepartmentList().then(response => {