作者 小范

Merge remote-tracking branch 'origin/master' into master_dev

1 import http from './http.js' 1 import http from './http.js'
2 import jsutil from "@/common/js/util"; 2 import jsutil from "@/common/js/util";
3 let baseUrl = '/cloud-user-center/user' 3 let baseUrl = '/cloud-user-center/user'
  4 +const serviceName = '/cloud-user-center'
4 // let baseUrl = '/cloud-kako-user-center/user' 5 // let baseUrl = '/cloud-kako-user-center/user'
5 // let baseCode = '/cloud-kako-user-center/randCode' 6 // let baseCode = '/cloud-kako-user-center/randCode'
6 export const getUserList = params => { return http.get(`${baseUrl}/list`, params); }; 7 export const getUserList = params => { return http.get(`${baseUrl}/list`, params); };
7 8
8 -export const getRandCode = params => { return http.get(`${baseCode}`, params); }; 9 +export const getRandCode = params => { return http.get(`/cloud-user-center/anonymous/randCode`, params); };
9 10
10 export const getUserListPage = params => { return http.get(`/user/list`,params) }; 11 export const getUserListPage = params => { return http.get(`/user/list`,params) };
11 12
12 -export const removeUser = params => { return http.del(`${baseUrl}/del`,params)}; 13 +export const removeUser = params => { return http.post(`${baseUrl}/del`,params)};
13 14
14 -export const batchRemoveUser = params => { return http.del(`${baseUrl}/batchremove`, { params: params }); }; 15 +export const batchRemoveUser = params => { return http.post(`${baseUrl}/batchremove`, { params: params }); };
15 16
16 -export const editPass = params => { return http.put(`${baseUrl}/password`,params)}; 17 +export const editPass = params => { return http.post(`${baseUrl}/password`,params)};
17 18
18 -export const editUser = params => { return http.put(`${baseUrl}/edit`,params)}; 19 +export const editUser = params => { return http.post(`${baseUrl}/edit`,params)};
19 20
20 export const addUser = params => { return http.post(`${baseUrl}/add`,params)}; 21 export const addUser = params => { return http.post(`${baseUrl}/add`,params)};
21 22
22 -export const setUserRole = params => { return http.put(`${baseUrl}/roleset`,params)}; 23 +export const heartBeat = params => { return http.post(`${serviceName}/heartbeat`,params)};
  24 +
  25 +export const userLock = params => { return http.post(`${baseUrl}/lock`,params)};
  26 +
  27 +export const setUserRole = params => { return http.post(`${baseUrl}/roleset`,params)};
  28 +
  29 +export const resetToken = params => { return http.post(`${baseUrl}/resetToken`,params)};
  30 +
23 31
24 -export const resetToken = params => { return http.put(`${baseUrl}/resetToken`,params)};  
25 32
26 export const loginedUserInfo = () => { 33 export const loginedUserInfo = () => {
27 let session_user_info = sessionStorage.getItem('user'); 34 let session_user_info = sessionStorage.getItem('user');
@@ -19,6 +19,11 @@ var axois_init = { @@ -19,6 +19,11 @@ var axois_init = {
19 return res; 19 return res;
20 }, 20 },
21 error => { 21 error => {
  22 + // 抓取报错信息
  23 + let errmsg = '';
  24 + if (error.response.data.message){
  25 + errmsg += error.response.data.message
  26 + }
22 // 用户登录的时候会拿到一个基础信息,比如用户名,token,过期时间戳 27 // 用户登录的时候会拿到一个基础信息,比如用户名,token,过期时间戳
23 // 直接丢sessionStorage 28 // 直接丢sessionStorage
24 if (!sessionStorage.getItem("token")) { 29 if (!sessionStorage.getItem("token")) {
@@ -33,7 +38,7 @@ var axois_init = { @@ -33,7 +38,7 @@ var axois_init = {
33 if (error.response.status === 401) { 38 if (error.response.status === 401) {
34 message({ 39 message({
35 // 饿了么的消息弹窗组件 40 // 饿了么的消息弹窗组件
36 - message: '授权超时,或访问未授权,请重新登录', 41 + message: errmsg + '授权超时,或访问未授权,请重新登录;',
37 type: "error" 42 type: "error"
38 }); 43 });
39 } 44 }
@@ -80,7 +85,7 @@ var axois_init = { @@ -80,7 +85,7 @@ var axois_init = {
80 } 85 }
81 // 返回 response 里的错误信息 86 // 返回 response 里的错误信息
82 87
83 - return Promise.reject(errorInfo); 88 + return Promise.reject(errorInfo + errmsg);
84 } 89 }
85 ); 90 );
86 }, 91 },
@@ -62,7 +62,7 @@ @@ -62,7 +62,7 @@
62 62
63 <script> 63 <script>
64 import rt from '../routes' 64 import rt from '../routes'
65 - import { editPass,resetToken,loginedUserInfo} from '../api/user'; 65 + import { editPass,resetToken,loginedUserInfo,heartBeat} from '../api/user';
66 import ElFormItem from "element-ui/packages/form/src/form-item"; 66 import ElFormItem from "element-ui/packages/form/src/form-item";
67 import TabMenu from "@/components/TabMenu" 67 import TabMenu from "@/components/TabMenu"
68 import NavMenu from "@/components/NavMenu" 68 import NavMenu from "@/components/NavMenu"
@@ -283,6 +283,16 @@ @@ -283,6 +283,16 @@
283 } 283 }
284 }) 284 })
285 }, 285 },
  286 + heartBeatAPI:function () {
  287 + heartBeat().then(response => {
  288 +
  289 + }).catch(e=>{
  290 + this.$notify.error({
  291 + title: '心跳',
  292 + message: '心跳失败'
  293 + });
  294 + });
  295 + }
286 }, 296 },
287 297
288 computed: { 298 computed: {
@@ -304,6 +314,11 @@ @@ -304,6 +314,11 @@
304 setInterval(() => { 314 setInterval(() => {
305 this.checkUpdate(); 315 this.checkUpdate();
306 }, 30000); 316 }, 30000);
  317 + setInterval(() => {
  318 + if (this.sysUserName){
  319 + this.heartBeatAPI();
  320 + }
  321 + }, 90000);
307 this.$nextTick(function(){ 322 this.$nextTick(function(){
308 this.initUserInfo(); 323 this.initUserInfo();
309 // this.rowDrop(); //行拖拽效果 324 // this.rowDrop(); //行拖拽效果
@@ -8,9 +8,16 @@ @@ -8,9 +8,16 @@
8 <el-form-item prop="checkPass"> 8 <el-form-item prop="checkPass">
9 <el-input type="password" v-model="ruleForm2.checkPass" placeholder="密码" @keydown.enter.native="keyDown" show-password></el-input> 9 <el-input type="password" v-model="ruleForm2.checkPass" placeholder="密码" @keydown.enter.native="keyDown" show-password></el-input>
10 </el-form-item> 10 </el-form-item>
11 -<!-- <el-form-item prop="checkPass">-->  
12 -<!-- <el-input type="password" v-model="ruleForm2.checkPass" placeholder="密码" @keyup.enter.native="handleSubmit2"></el-input>-->  
13 -<!-- </el-form-item>--> 11 + <el-form-item prop="verify">
  12 + <el-input type="text" v-model="ruleForm2.verify" placeholder="请在2分钟内输入下方图片中的答案" @keyup.enter.native="handleSubmit2"></el-input>
  13 + </el-form-item>
  14 + <el-form-item>
  15 + <img
  16 + style="width: 125px; height: 60px"
  17 + :src="verifyImg"
  18 + @click="getVerifyCode"
  19 + >
  20 + </el-form-item>
14 <el-checkbox v-model="checked" checked class="remeberme">记住密码</el-checkbox> 21 <el-checkbox v-model="checked" checked class="remeberme">记住密码</el-checkbox>
15 <el-form-item style="width:100%;"> 22 <el-form-item style="width:100%;">
16 <el-button type="primary" style="width:100%;" @click.native.prevent="handleSubmit2" :loading="logining" :plain="true">登录</el-button> 23 <el-button type="primary" style="width:100%;" @click.native.prevent="handleSubmit2" :loading="logining" :plain="true">登录</el-button>
@@ -43,15 +50,18 @@ @@ -43,15 +50,18 @@
43 export default { 50 export default {
44 data() { 51 data() {
45 return { 52 return {
46 - vedioCanPlay: true,  
47 - fixStyle: '',  
48 - logining: false,  
49 - ruleForm2: { 53 + verifyImg: "",
  54 + vedioCanPlay: true,
  55 + fixStyle: '',
  56 + logining: false,
  57 + ruleForm2: {
50 account: '', 58 account: '',
51 // checkPass: 'zzairport@kako2020' 59 // checkPass: 'zzairport@kako2020'
52 - checkPass: ''  
53 - },  
54 - rules2: { 60 + checkPass: '',
  61 + verify: '',
  62 + verifyToken: ''
  63 + },
  64 + rules2: {
55 account: [ 65 account: [
56 { required: true, message: '请输入账号', trigger: 'blur' }, 66 { required: true, message: '请输入账号', trigger: 'blur' },
57 //{ validator: validaePass } 67 //{ validator: validaePass }
@@ -59,10 +69,13 @@ @@ -59,10 +69,13 @@
59 checkPass: [ 69 checkPass: [
60 { required: true, message: '请输入密码', trigger: 'blur' }, 70 { required: true, message: '请输入密码', trigger: 'blur' },
61 //{ validator: validaePass2 } 71 //{ validator: validaePass2 }
  72 + ],
  73 + checkVerify: [
  74 + { required: false, message: '请输入验证码', trigger: 'blur' }
62 ] 75 ]
63 - },  
64 - checked: true,  
65 - userMenus: [] 76 + },
  77 + checked: true,
  78 + userMenus: []
66 }; 79 };
67 }, 80 },
68 methods: { 81 methods: {
@@ -105,18 +118,20 @@ @@ -105,18 +118,20 @@
105 // 本地存储用户目录 ,防刷新目录丢失用 118 // 本地存储用户目录 ,防刷新目录丢失用
106 sessionStorage.setItem('menu', JSON.stringify(_this.$router.options.routes)); 119 sessionStorage.setItem('menu', JSON.stringify(_this.$router.options.routes));
107 }, 120 },
108 - randCode: function(){  
109 - getRandCode().then((res) =>{  
110 -  
111 - }).catch({  
112 -  
113 - });  
114 - },  
115 keyDown(e) { 121 keyDown(e) {
116 if(e.keyCode===13) { //用户点击了ctrl+enter触发 122 if(e.keyCode===13) { //用户点击了ctrl+enter触发
117 this.handleSubmit2() 123 this.handleSubmit2()
118 } 124 }
119 }, 125 },
  126 + getVerifyCode: function(){
  127 + getRandCode().then((res) =>{
  128 + let status = res.status;
  129 + this.ruleForm2.verifyToken = res.data.jwtToken;
  130 + this.verifyImg = res.data.data.verifyImg;
  131 + }).catch({
  132 +
  133 + });
  134 + },
120 handleSubmit2: function (ev) { 135 handleSubmit2: function (ev) {
121 var _this = this; 136 var _this = this;
122 this.$refs.ruleForm2.validate((valid) => { 137 this.$refs.ruleForm2.validate((valid) => {
@@ -124,7 +139,12 @@ @@ -124,7 +139,12 @@
124 //_this.$router.replace('/table'); 139 //_this.$router.replace('/table');
125 this.logining = true; 140 this.logining = true;
126 //NProgress.start(); 141 //NProgress.start();
127 - var loginParams = {username: this.ruleForm2.account, password: this.ruleForm2.checkPass}; 142 + var loginParams = {
  143 + username: this.ruleForm2.account,
  144 + password: this.ruleForm2.checkPass,
  145 + verify: this.ruleForm2.verify,
  146 + verifyToken:this.ruleForm2.verifyToken
  147 + };
128 http.login(loginParams).then(res => { 148 http.login(loginParams).then(res => {
129 this.logining = false; 149 this.logining = false;
130 //NProgress.done(); 150 //NProgress.done();
@@ -133,11 +153,12 @@ @@ -133,11 +153,12 @@
133 let token = authentication.token; 153 let token = authentication.token;
134 let loginUserMenus = res.data.loginUserMenus; 154 let loginUserMenus = res.data.loginUserMenus;
135 if (status !== 200) { 155 if (status !== 200) {
136 - let msg = "登录错误";  
137 - this.$message({  
138 - message: msg,  
139 - type: "error"  
140 - }); 156 + this.getVerifyCode();
  157 + let msg = "登录错误";
  158 + this.$message({
  159 + message: msg,
  160 + type: "error"
  161 + });
141 } else if (token) { 162 } else if (token) {
142 sessionStorage.setItem('user', JSON.stringify(authentication)); 163 sessionStorage.setItem('user', JSON.stringify(authentication));
143 sessionStorage.setItem('token','Bearer '+ token); 164 sessionStorage.setItem('token','Bearer '+ token);
@@ -147,20 +168,17 @@ @@ -147,20 +168,17 @@
147 //处理用户menu 168 //处理用户menu
148 _this.userMenus = loginUserMenus.list; 169 _this.userMenus = loginUserMenus.list;
149 let sysMenus = _this.$router.options.routes; 170 let sysMenus = _this.$router.options.routes;
150 -  
151 -  
152 _this.handleMenuList(_this.$router.options.routes,_this.userMenus); 171 _this.handleMenuList(_this.$router.options.routes,_this.userMenus);
153 -  
154 - // console.log("user:");  
155 - // console.log(_this.$router.options.routes);  
156 _this.$router.push({path: '/main'}); 172 _this.$router.push({path: '/main'});
157 } 173 }
158 }).catch(error => { 174 }).catch(error => {
159 - this.$message({  
160 - message: error.toString()+"-登录验证失败",  
161 - type: "error"  
162 - });  
163 - this.logining = false; 175 + this.$message({
  176 + message: error.toString()+"-登录验证失败;",
  177 + type: "error"
  178 + });
  179 + this.getVerifyCode();
  180 + }).finally(()=>{
  181 + this.logining = false;
164 }); 182 });
165 } else { 183 } else {
166 return false; 184 return false;
@@ -168,7 +186,7 @@ @@ -168,7 +186,7 @@
168 }); 186 });
169 } 187 }
170 }, 188 },
171 - mounted:function () { 189 + mounted:function () {
172 this.$store.commit('set_user_menu', []); 190 this.$store.commit('set_user_menu', []);
173 this.$store.commit('set_user_info', { 191 this.$store.commit('set_user_info', {
174 userId: 0, 192 userId: 0,
@@ -213,8 +231,10 @@ @@ -213,8 +231,10 @@
213 _this.handleSubmit2(); 231 _this.handleSubmit2();
214 } 232 }
215 }; 233 };
216 - // this.randCode();  
217 - } 234 + },
  235 + created(){
  236 + this.getVerifyCode()
  237 + },
218 } 238 }
219 239
220 </script> 240 </script>
@@ -38,19 +38,35 @@ @@ -38,19 +38,35 @@
38 </el-table-column> 38 </el-table-column>
39 <el-table-column prop="realname" label="姓名" width="120" sortable> 39 <el-table-column prop="realname" label="姓名" width="120" sortable>
40 </el-table-column> 40 </el-table-column>
41 - <el-table-column prop="sex" label="性别" width="100" :formatter="formatSex" sortable>  
42 - </el-table-column>  
43 - <el-table-column prop="mobilephone" label="电话" width="150">  
44 - </el-table-column>  
45 - <el-table-column prop="creattime" label="创建时间" width="220" sortable>  
46 - </el-table-column>  
47 - <el-table-column prop="updatetime" label="更新时间" width="220" sortable>  
48 - </el-table-column> 41 +<!-- <el-table-column prop="sex" label="性别" width="100" :formatter="formatSex" sortable>-->
  42 +<!-- </el-table-column>-->
  43 +<!-- <el-table-column prop="mobilephone" label="电话" width="150">-->
  44 +<!-- </el-table-column>-->
49 <!-- <el-table-column prop="address" label="地址" min-width="180">--> 45 <!-- <el-table-column prop="address" label="地址" min-width="180">-->
50 <!-- </el-table-column>--> 46 <!-- </el-table-column>-->
51 <!-- <el-table-column prop="email" label="Email" min-width="180">--> 47 <!-- <el-table-column prop="email" label="Email" min-width="180">-->
52 <!-- </el-table-column>--> 48 <!-- </el-table-column>-->
53 <el-table-column prop="state" label="启用" width="100" :formatter="formatState" sortable> 49 <el-table-column prop="state" label="启用" width="100" :formatter="formatState" sortable>
  50 + <template slot-scope="scope">
  51 + <el-tag type="success" v-if="scope.row.state">启用</el-tag>
  52 + <el-tag type="danger" v-else>禁用</el-tag>
  53 +
  54 + <el-button type="text" @click="lockUser(scope.$index, scope.row, false)" v-if="scope.row.state">禁用</el-button>
  55 + <el-button type="text" @click="lockUser(scope.$index, scope.row, true)" v-else>启用</el-button>
  56 + </template>
  57 + </el-table-column>
  58 + <el-table-column prop="userStatus" label="状态" width="100">
  59 + <template slot-scope="scope">
  60 + <el-tag type="danger" v-if="scope.row.userStatus ===0">锁定</el-tag>
  61 + <el-tag type="success" v-else-if="scope.row.userStatus ===1">在线</el-tag>
  62 + <el-tag type="info" v-else-if="scope.row.userStatus ===2">离线</el-tag>
  63 + <el-tag type="warning" v-else-if="scope.row.userStatus ===3">过期</el-tag>
  64 + <el-tag type="warning" v-else>未知</el-tag>
  65 + </template>
  66 + </el-table-column>
  67 + <el-table-column prop="creattime" label="创建时间" width="220" sortable>
  68 + </el-table-column>
  69 + <el-table-column prop="updatetime" label="更新时间" width="220" sortable>
54 </el-table-column> 70 </el-table-column>
55 <el-table-column label="操作" align="center" width="250" fixed="right"> 71 <el-table-column label="操作" align="center" width="250" fixed="right">
56 <template slot-scope="scope"> 72 <template slot-scope="scope">
@@ -215,7 +231,7 @@ @@ -215,7 +231,7 @@
215 <script> 231 <script>
216 import util from '../../common/js/util' 232 import util from '../../common/js/util'
217 import NProgress from 'nprogress' 233 import NProgress from 'nprogress'
218 - import { getUserList, removeUser, batchRemoveUser, editUser, addUser, setUserRole } from '../../api/user'; 234 + import { getUserList, removeUser, batchRemoveUser, editUser, addUser, setUserRole,userLock } from '../../api/user';
219 import { getList} from '../../api/role_api'; 235 import { getList} from '../../api/role_api';
220 import { getList as getRoleList} from '../../api/role_api'; 236 import { getList as getRoleList} from '../../api/role_api';
221 import moment from 'moment' 237 import moment from 'moment'
@@ -327,7 +343,29 @@ @@ -327,7 +343,29 @@
327 }); 343 });
328 344
329 }, 345 },
330 - 346 + // 禁用与启用用户
  347 + lockUser: function(index, row, stateCode){
  348 + this.listLoading = true;
  349 + let para = {
  350 + userId: row.userId,
  351 + username:row.username,
  352 + state: stateCode
  353 + };
  354 + userLock(para).then((res) => {
  355 + this.$message({
  356 + message: '操作成功',
  357 + type: 'success'
  358 + });
  359 + this.getUsers();
  360 + }).catch((e) => {
  361 + this.$message({
  362 + message: '操作失败',
  363 + type: 'error'
  364 + });
  365 + }).finally(()=>{
  366 + this.listLoading = false;
  367 + });
  368 + },
331 // 获取公司列表 369 // 获取公司列表
332 getCompanyNmae(){ 370 getCompanyNmae(){
333 let para = { 371 let para = {
@@ -65,6 +65,16 @@ @@ -65,6 +65,16 @@
65 <el-row style="margin-top: -5px"> 65 <el-row style="margin-top: -5px">
66 <el-col :span="6"> 66 <el-col :span="6">
67 <el-form-item> 67 <el-form-item>
  68 + <el-input clearable
  69 + v-model="formTrn.billno"
  70 + placeholder="提运单号" style="width: 214px"
  71 + >
  72 + <template slot="prepend">提运单号</template>
  73 + </el-input>
  74 + </el-form-item>
  75 + </el-col>
  76 + <el-col :span="6">
  77 + <el-form-item>
68 <el-input 78 <el-input
69 v-model="formTrn.customscode" 79 v-model="formTrn.customscode"
70 placeholder="关区" style="width: 210px" 80 placeholder="关区" style="width: 210px"
@@ -83,7 +93,7 @@ @@ -83,7 +93,7 @@
83 </el-input> 93 </el-input>
84 </el-form-item> 94 </el-form-item>
85 </el-col> 95 </el-col>
86 - <el-col :span="12"> 96 + <el-col :span="6">
87 <el-form-item> 97 <el-form-item>
88 <el-input 98 <el-input
89 v-model="formTrn.unloadcode" 99 v-model="formTrn.unloadcode"
@@ -598,6 +608,7 @@ @@ -598,6 +608,7 @@
598 }] 608 }]
599 }, 609 },
600 formTrn: { 610 formTrn: {
  611 + billno: '',
601 customscode:'', 612 customscode:'',
602 username:'', 613 username:'',
603 trnmode:'', 614 trnmode:'',