作者 朱兆平

用户列表完成

1 <template> 1 <template>
2 <div id="app"> 2 <div id="app">
3 - <transition name="fade"  
4 - mode="out-in"> 3 + <transition name="fade" mode="out-in">
5 <router-view></router-view> 4 <router-view></router-view>
6 </transition> 5 </transition>
7 </div> 6 </div>
1 import axios from 'axios'; 1 import axios from 'axios';
2 2
3 -let base = '';  
4 -  
5 -export const requestLogin = params => { return axios.post(`${base}/login`, params).then(res => res.data); }; 3 +let base = 'http://127.0.0.1:7003';
  4 +axios.defaults.baseURL = 'http://127.0.0.1:7003';
  5 +
  6 +export const requestLogin = params => {
  7 + return axios({
  8 + method: 'POST',
  9 + url: '/login',
  10 + data: params,
  11 + transformRequest: [function (data) {
  12 + // Do whatever you want to transform the data
  13 + let ret = ''
  14 + for (let it in data) {
  15 + ret += encodeURIComponent(it) + '=' + encodeURIComponent(data[it]) + '&'
  16 + }
  17 + console.log(ret)
  18 + return ret
  19 + }],
  20 + headers: {
  21 + 'Content-Type': 'application/x-www-form-urlencoded'
  22 + }
  23 + })
  24 + // return axios.post(`${base}/login`, params).then(res => res.data);
  25 +};
6 26
7 export const getUserList = params => { return axios.get(`${base}/user/list`, { params: params }); }; 27 export const getUserList = params => { return axios.get(`${base}/user/list`, { params: params }); };
8 28
9 -export const getUserListPage = params => { return axios.get(`${base}/user/listpage`, { params: params }); }; 29 +export const getUserListPage = params => { return axios.get(`${base}/user/list`, { params: params }); };
10 30
11 export const removeUser = params => { return axios.get(`${base}/user/remove`, { params: params }); }; 31 export const removeUser = params => { return axios.get(`${base}/user/remove`, { params: params }); };
12 32
@@ -8,7 +8,7 @@ export default { @@ -8,7 +8,7 @@ export default {
8 * mock bootstrap 8 * mock bootstrap
9 */ 9 */
10 bootstrap() { 10 bootstrap() {
11 - let mock = new MockAdapter(axios); 11 + let mock = new MockAdapter();
12 12
13 // mock success request 13 // mock success request
14 mock.onGet('/success').reply(200, { 14 mock.onGet('/success').reply(200, {
@@ -31,7 +31,7 @@ let routes = [ @@ -31,7 +31,7 @@ let routes = [
31 iconCls: 'el-icon-message',//图标样式class 31 iconCls: 'el-icon-message',//图标样式class
32 children: [ 32 children: [
33 { path: '/main', component: Main, name: '主页', hidden: false }, 33 { path: '/main', component: Main, name: '主页', hidden: false },
34 - { path: '/table', component: Table, name: 'Table' }, 34 + { path: '/table', component: Table, name: '用户管理' },
35 { path: '/form', component: Form, name: 'Form' }, 35 { path: '/form', component: Form, name: 'Form' },
36 { path: '/user', component: user, name: '列表' }, 36 { path: '/user', component: user, name: '列表' },
37 ] 37 ]
@@ -129,8 +129,8 @@ @@ -129,8 +129,8 @@
129 var user = sessionStorage.getItem('user'); 129 var user = sessionStorage.getItem('user');
130 if (user) { 130 if (user) {
131 user = JSON.parse(user); 131 user = JSON.parse(user);
132 - this.sysUserName = user.name || '';  
133 - this.sysUserAvatar = user.avatar || ''; 132 + this.sysUserName = user.username || '';
  133 + this.sysUserAvatar = user.userface || '/static/images/faceDefault.jpg';
134 } 134 }
135 135
136 } 136 }
1 <template> 1 <template>
2 - <el-form :model="ruleForm2" :rules="rules2" ref="ruleForm2" label-position="left" label-width="0px" class="demo-ruleForm login-container"> 2 + <div>
  3 + <el-form :model="ruleForm2" :rules="rules2" ref="ruleForm2" label-position="left" label-width="0px" class="demo-ruleForm login-container" id="loginForm">
3 <h3 class="title">系统登录</h3> 4 <h3 class="title">系统登录</h3>
4 <el-form-item prop="account"> 5 <el-form-item prop="account">
5 <el-input type="text" v-model="ruleForm2.account" auto-complete="off" placeholder="账号"></el-input> 6 <el-input type="text" v-model="ruleForm2.account" auto-complete="off" placeholder="账号"></el-input>
@@ -9,10 +10,25 @@ @@ -9,10 +10,25 @@
9 </el-form-item> 10 </el-form-item>
10 <el-checkbox v-model="checked" checked class="remember">记住密码</el-checkbox> 11 <el-checkbox v-model="checked" checked class="remember">记住密码</el-checkbox>
11 <el-form-item style="width:100%;"> 12 <el-form-item style="width:100%;">
12 - <el-button type="primary" style="width:100%;" @click.native.prevent="handleSubmit2" :loading="logining">登录</el-button> 13 + <el-button type="primary" style="width:100%;" @click.native.prevent="handleSubmit2" :loading="logining" :plain="true">登录</el-button>
13 <!--<el-button @click.native.prevent="handleReset2">重置</el-button>--> 14 <!--<el-button @click.native.prevent="handleReset2">重置</el-button>-->
14 </el-form-item> 15 </el-form-item>
15 </el-form> 16 </el-form>
  17 + <div class="homepage-hero-module">
  18 + <div class="video-container">
  19 + <div :style="fixStyle" class="filter"></div>
  20 + <video :style="fixStyle" autoplay loop class="fillWidth" v-on:canplay="canplay">
  21 + <source src="/static/login/New-jumbo.mp4" type="video/mp4"/>
  22 + 浏览器不支持 video 标签,建议升级浏览器。
  23 + <!--<source src="/static/login/New-jumbo.webm" type="video/webm"/>-->
  24 + <!--浏览器不支持 video 标签,建议升级浏览器。-->
  25 + </video>
  26 + <div class="poster hidden" v-if="!vedioCanPlay">
  27 + <img :style="fixStyle" src="https://s2.best-wallpaper.net/wallpaper/2560x1600/1511/Airplane-passenger-airliner-flight-sea-lights-airport-evening_2560x1600.jpg" alt="">
  28 + </div>
  29 + </div>
  30 + </div>
  31 + </div>
16 </template> 32 </template>
17 33
18 <script> 34 <script>
@@ -21,6 +37,8 @@ @@ -21,6 +37,8 @@
21 export default { 37 export default {
22 data() { 38 data() {
23 return { 39 return {
  40 + vedioCanPlay: true,
  41 + fixStyle: '',
24 logining: false, 42 logining: false,
25 ruleForm2: { 43 ruleForm2: {
26 account: 'admin', 44 account: 'admin',
@@ -40,30 +58,45 @@ @@ -40,30 +58,45 @@
40 }; 58 };
41 }, 59 },
42 methods: { 60 methods: {
  61 + canplay() {
  62 + this.vedioCanPlay = true
  63 + },
43 handleReset2() { 64 handleReset2() {
44 this.$refs.ruleForm2.resetFields(); 65 this.$refs.ruleForm2.resetFields();
45 }, 66 },
46 - handleSubmit2(ev) { 67 + handleSubmit2: function (ev) {
47 var _this = this; 68 var _this = this;
48 this.$refs.ruleForm2.validate((valid) => { 69 this.$refs.ruleForm2.validate((valid) => {
49 if (valid) { 70 if (valid) {
50 //_this.$router.replace('/table'); 71 //_this.$router.replace('/table');
51 this.logining = true; 72 this.logining = true;
52 //NProgress.start(); 73 //NProgress.start();
53 - var loginParams = { username: this.ruleForm2.account, password: this.ruleForm2.checkPass };  
54 - requestLogin(loginParams).then(data => { 74 + var loginParams = {username: this.ruleForm2.account, password: this.ruleForm2.checkPass};
  75 + requestLogin(loginParams).then(res => {
55 this.logining = false; 76 this.logining = false;
56 //NProgress.done(); 77 //NProgress.done();
57 - let { msg, code, user } = data;  
58 - if (code !== 200) { 78 + let status = res.status;
  79 + let user = res.data.principal;
  80 + let loginSuccess = res.data.authenticated;
  81 +
  82 + if (status !== 200) {
  83 + let msg = "登录错误";
59 this.$message({ 84 this.$message({
60 message: msg, 85 message: msg,
61 - type: 'error' 86 + type: "error"
62 }); 87 });
63 - } else { 88 + } else if (loginSuccess) {
64 sessionStorage.setItem('user', JSON.stringify(user)); 89 sessionStorage.setItem('user', JSON.stringify(user));
65 - this.$router.push({ path: '/table' }); 90 + this.$router.push({path: '/table'});
66 } 91 }
  92 + }).catch(error => {
  93 + let msg = error.message;
  94 + this.$message({
  95 + message: msg,
  96 + type: "error"
  97 + });
  98 + this.logining = false;
  99 + console.log(_this);
67 }); 100 });
68 } else { 101 } else {
69 console.log('error submit!!'); 102 console.log('error submit!!');
@@ -71,12 +104,67 @@ @@ -71,12 +104,67 @@
71 } 104 }
72 }); 105 });
73 } 106 }
  107 + },
  108 + mounted:function () {
  109 + window.onresize = () => {
  110 + const windowWidth = document.body.clientWidth
  111 + const windowHeight = document.body.clientHeight
  112 + const windowAspectRatio = windowHeight / windowWidth
  113 + let videoWidth
  114 + let videoHeight
  115 + if (windowAspectRatio < 0.5625) {
  116 + videoWidth = windowWidth
  117 + videoHeight = videoWidth * 0.5625
  118 + this.fixStyle = {
  119 + height: windowWidth * 0.5625 + 'px',
  120 + width: windowWidth + 'px',
  121 + 'margin-bottom': (windowHeight - videoHeight) / 2 + 'px',
  122 + 'margin-left': 'initial'
  123 + }
  124 + } else {
  125 + videoHeight = windowHeight
  126 + videoWidth = videoHeight / 0.5625
  127 + this.fixStyle = {
  128 + height: windowHeight + 'px',
  129 + width: windowHeight / 0.5625 + 'px',
  130 + 'margin-left': (windowWidth - videoWidth) / 2 + 'px',
  131 + 'margin-bottom': 'initial'
  132 + }
  133 + }
  134 + }
  135 + window.onresize()
74 } 136 }
75 } 137 }
76 138
77 </script> 139 </script>
78 140
79 <style lang="scss" scoped> 141 <style lang="scss" scoped>
  142 + #loginForm{
  143 + filter:alpha(Opacity=90);
  144 + -moz-opacity:0.9;
  145 + opacity: 0.9;
  146 + }
  147 + .homepage-hero-module,
  148 + .video-container {
  149 + height: 100vh;
  150 + /*overflow: hidden;*/
  151 + position: absolute;
  152 + top:0px;
  153 + left: 0;
  154 + z-index: -1;
  155 + }
  156 +
  157 + .video-container .poster img,
  158 + .video-container video {
  159 + z-index: 0;
  160 + position: absolute;
  161 + }
  162 +
  163 + .video-container .filter {
  164 + z-index: 1;
  165 + position: absolute;
  166 + background: rgba(0, 0, 0, 0.4);
  167 + }
80 .login-container { 168 .login-container {
81 /*box-shadow: 0 0px 8px 0 rgba(0, 0, 0, 0.06), 0 1px 0px 0 rgba(0, 0, 0, 0.02);*/ 169 /*box-shadow: 0 0px 8px 0 rgba(0, 0, 0, 0.06), 0 1px 0px 0 rgba(0, 0, 0, 0.02);*/
82 -webkit-border-radius: 5px; 170 -webkit-border-radius: 5px;
@@ -4,7 +4,10 @@ @@ -4,7 +4,10 @@
4 <el-col :span="24" class="toolbar" style="padding-bottom: 0px;"> 4 <el-col :span="24" class="toolbar" style="padding-bottom: 0px;">
5 <el-form :inline="true" :model="filters"> 5 <el-form :inline="true" :model="filters">
6 <el-form-item> 6 <el-form-item>
7 - <el-input v-model="filters.name" placeholder="姓名"></el-input> 7 + <el-input v-model="filters.ext1" placeholder="姓名"></el-input>
  8 + </el-form-item>
  9 + <el-form-item>
  10 + <el-input v-model="filters.username" placeholder="账号"></el-input>
8 </el-form-item> 11 </el-form-item>
9 <el-form-item> 12 <el-form-item>
10 <el-button type="primary" v-on:click="getUsers">查询</el-button> 13 <el-button type="primary" v-on:click="getUsers">查询</el-button>
@@ -21,18 +24,24 @@ @@ -21,18 +24,24 @@
21 </el-table-column> 24 </el-table-column>
22 <el-table-column type="index" width="60"> 25 <el-table-column type="index" width="60">
23 </el-table-column> 26 </el-table-column>
24 - <el-table-column prop="name" label="姓名" width="120" sortable> 27 + <el-table-column prop="userId" label="ID" width="100" sortable>
  28 + </el-table-column>
  29 + <el-table-column prop="username" label="账号" width="120" sortable>
  30 + </el-table-column>
  31 + <el-table-column prop="ext1" label="姓名" width="120" sortable>
25 </el-table-column> 32 </el-table-column>
26 <el-table-column prop="sex" label="性别" width="100" :formatter="formatSex" sortable> 33 <el-table-column prop="sex" label="性别" width="100" :formatter="formatSex" sortable>
27 </el-table-column> 34 </el-table-column>
28 - <el-table-column prop="age" label="年龄" width="100" sortable> 35 + <el-table-column prop="mobilephone" label="电话" width="125" sortable>
29 </el-table-column> 36 </el-table-column>
30 - <el-table-column prop="birth" label="生日" width="120" sortable> 37 + <el-table-column prop="creattime" label="创建时间" width="170" sortable>
31 </el-table-column> 38 </el-table-column>
32 - <el-table-column prop="addr" label="地址" min-width="180" sortable> 39 + <el-table-column prop="updatetime" label="更新时间" width="170" sortable>
  40 + </el-table-column>
  41 + <el-table-column prop="address" label="地址" min-width="180" sortable>
33 </el-table-column> 42 </el-table-column>
34 <el-table-column label="操作" width="150"> 43 <el-table-column label="操作" width="150">
35 - <template scope="scope"> 44 + <template slot-scope="scope">
36 <el-button size="small" @click="handleEdit(scope.$index, scope.row)">编辑</el-button> 45 <el-button size="small" @click="handleEdit(scope.$index, scope.row)">编辑</el-button>
37 <el-button type="danger" size="small" @click="handleDel(scope.$index, scope.row)">删除</el-button> 46 <el-button type="danger" size="small" @click="handleDel(scope.$index, scope.row)">删除</el-button>
38 </template> 47 </template>
@@ -42,30 +51,36 @@ @@ -42,30 +51,36 @@
42 <!--工具条--> 51 <!--工具条-->
43 <el-col :span="24" class="toolbar"> 52 <el-col :span="24" class="toolbar">
44 <el-button type="danger" @click="batchRemove" :disabled="this.sels.length===0">批量删除</el-button> 53 <el-button type="danger" @click="batchRemove" :disabled="this.sels.length===0">批量删除</el-button>
45 - <el-pagination layout="prev, pager, next" @current-change="handleCurrentChange" :page-size="20" :total="total" style="float:right;"> 54 + <el-pagination layout="prev, pager, next" @current-change="handleCurrentChange" :page-size="5" :total="total" style="float:right;">
46 </el-pagination> 55 </el-pagination>
47 </el-col> 56 </el-col>
48 57
49 <!--编辑界面--> 58 <!--编辑界面-->
50 <el-dialog title="编辑" v-model="editFormVisible" :close-on-click-modal="false"> 59 <el-dialog title="编辑" v-model="editFormVisible" :close-on-click-modal="false">
51 <el-form :model="editForm" label-width="80px" :rules="editFormRules" ref="editForm"> 60 <el-form :model="editForm" label-width="80px" :rules="editFormRules" ref="editForm">
52 - <el-form-item label="姓名" prop="name">  
53 - <el-input v-model="editForm.name" auto-complete="off"></el-input> 61 + <el-form-item label="ID">
  62 + <span>{{editForm.userId}}</span>
  63 + </el-form-item>
  64 + <el-form-item label="姓名" prop="username">
  65 + <el-input v-model="editForm.username" auto-complete="off"></el-input>
  66 + </el-form-item>
  67 + <el-form-item label="密码" prop="password">
  68 + <el-input v-model="editForm.password" auto-complete="off" type="password"></el-input>
54 </el-form-item> 69 </el-form-item>
55 <el-form-item label="性别"> 70 <el-form-item label="性别">
56 <el-radio-group v-model="editForm.sex"> 71 <el-radio-group v-model="editForm.sex">
57 - <el-radio class="radio" :label="1">男</el-radio>  
58 - <el-radio class="radio" :label="0">女</el-radio> 72 + <el-radio class="radio" label="1" >男</el-radio>
  73 + <el-radio class="radio" label="0" >女</el-radio>
59 </el-radio-group> 74 </el-radio-group>
60 </el-form-item> 75 </el-form-item>
61 <el-form-item label="年龄"> 76 <el-form-item label="年龄">
62 <el-input-number v-model="editForm.age" :min="0" :max="200"></el-input-number> 77 <el-input-number v-model="editForm.age" :min="0" :max="200"></el-input-number>
63 </el-form-item> 78 </el-form-item>
64 <el-form-item label="生日"> 79 <el-form-item label="生日">
65 - <el-date-picker type="date" placeholder="选择日期" v-model="editForm.birth"></el-date-picker> 80 + <el-date-picker type="date" placeholder="选择日期" v-model="editForm.creattime"></el-date-picker>
66 </el-form-item> 81 </el-form-item>
67 <el-form-item label="地址"> 82 <el-form-item label="地址">
68 - <el-input type="textarea" v-model="editForm.addr"></el-input> 83 + <el-input type="textarea" v-model="editForm.address"></el-input>
69 </el-form-item> 84 </el-form-item>
70 </el-form> 85 </el-form>
71 <div slot="footer" class="dialog-footer"> 86 <div slot="footer" class="dialog-footer">
@@ -117,11 +132,11 @@ @@ -117,11 +132,11 @@
117 }, 132 },
118 users: [], 133 users: [],
119 total: 0, 134 total: 0,
120 - page: 1, 135 + pageNum: 1,
121 listLoading: false, 136 listLoading: false,
122 sels: [],//列表选中列 137 sels: [],//列表选中列
123 -  
124 - editFormVisible: false,//编辑界面是否显示 138 + //编辑界面是否显示
  139 + editFormVisible: false,
125 editLoading: false, 140 editLoading: false,
126 editFormRules: { 141 editFormRules: {
127 name: [ 142 name: [
@@ -130,12 +145,13 @@ @@ -130,12 +145,13 @@
130 }, 145 },
131 //编辑界面数据 146 //编辑界面数据
132 editForm: { 147 editForm: {
133 - id: 0,  
134 - name: '',  
135 - sex: -1, 148 + userId: 1,
  149 + username: '',
  150 + password: '',
  151 + sex: 1,
136 age: 0, 152 age: 0,
137 - birth: '',  
138 - addr: '' 153 + creattime: '',
  154 + address: ''
139 }, 155 },
140 156
141 addFormVisible: false,//新增界面是否显示 157 addFormVisible: false,//新增界面是否显示
@@ -162,20 +178,20 @@ @@ -162,20 +178,20 @@
162 return row.sex == 1 ? '男' : row.sex == 0 ? '女' : '未知'; 178 return row.sex == 1 ? '男' : row.sex == 0 ? '女' : '未知';
163 }, 179 },
164 handleCurrentChange(val) { 180 handleCurrentChange(val) {
165 - this.page = val; 181 + this.pageNum = val;
166 this.getUsers(); 182 this.getUsers();
167 }, 183 },
168 //获取用户列表 184 //获取用户列表
169 getUsers() { 185 getUsers() {
170 let para = { 186 let para = {
171 - page: this.page, 187 + pageNum: this.pageNum,
172 name: this.filters.name 188 name: this.filters.name
173 }; 189 };
174 this.listLoading = true; 190 this.listLoading = true;
175 //NProgress.start(); 191 //NProgress.start();
176 getUserListPage(para).then((res) => { 192 getUserListPage(para).then((res) => {
177 this.total = res.data.total; 193 this.total = res.data.total;
178 - this.users = res.data.users; 194 + this.users = res.data.list;
179 this.listLoading = false; 195 this.listLoading = false;
180 //NProgress.done(); 196 //NProgress.done();
181 }); 197 });
@@ -201,7 +217,11 @@ @@ -201,7 +217,11 @@
201 217
202 }); 218 });
203 }, 219 },
204 - //显示编辑界面 220 + /**
  221 + * 显示编辑界面
  222 + * @param index
  223 + * @param row 为这行的数据对象
  224 + */
205 handleEdit: function (index, row) { 225 handleEdit: function (index, row) {
206 this.editFormVisible = true; 226 this.editFormVisible = true;
207 this.editForm = Object.assign({}, row); 227 this.editForm = Object.assign({}, row);
不能预览此文件类型
不能预览此文件类型
不能预览此文件类型