修改前端

This commit is contained in:
2019-06-19 11:37:21 +08:00
parent 7a3105c414
commit f5d0dc8f87
9 changed files with 200 additions and 77 deletions
+6
View File
@@ -0,0 +1,6 @@
module.exports = {
extends: 'eslint:recommended',
rules: {
'no-console': 'off',
},
};
Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 7.6 KiB

+72 -13
View File
@@ -1,34 +1,93 @@
<template> <template>
<div id="app"> <div id="app">
<!-- <img alt="logo" src="https://fairy8-1258530674.picsh.myqcloud.com/img/20190611100737.png" width="400px"> --> <!-- <img alt="logo" src="https://fairy8-1258530674.picsh.myqcloud.com/img/20190611100737.png" width="400px"> -->
<span style="color:#0081FF;font-size:22px"><b>Bills Assistant</b></span> <!-- <el-row :gutter="10"> -->
<!-- <HR align=center width=300 color=#987cb9 SIZE=1> --> <div
<!-- <hr style="border:1 dashed #987cb9" width="50%" color=#ACACAC size=1/> --> style="width:800px;text-align:center;align-self: center;margin: auto;top: 0;left: 0;right: 0;bottom: 0;"
<br/> >
<!-- <router-link to="/login">登录页</router-link> --> <!-- <div> -->
<p/> <el-row>
<router-view/> <!-- <el-col :span="4"><div class="grid-content bg-purple">b</div></el-col> -->
<el-col :span="16" :offset="4">
<div class="grid-content bg-purple" style="color:#0081FF;font-size:22px">Bill Assistant</div>
</el-col>
<el-col :span="4" style="text-align:right;">
<el-button v-if="showLogout()" type="text" @click="logout()">登出</el-button>
</el-col>
<!-- <el-col :span="16">
<div>
<span style="color:#0081FF;font-size:22px">Bills Assistant</span>
</div>
</el-col>
<el-col :span="4">
<el-button type="text">logout</el-button>
</el-col>-->
</el-row>
<!-- <HR align=center width=300 color=#987cb9 SIZE=1> -->
<!-- <hr style="border:1 dashed #987cb9" width="50%" color=#ACACAC size=1/> -->
<!-- <br/> -->
<!-- <router-link to="/login">登录页</router-link> -->
<p/>
<router-view v-if="isRouterAlive"/>
</div>
<!-- <HelloWorld msg="Welcome to Your Vue.js App"/> --> <!-- <HelloWorld msg="Welcome to Your Vue.js App"/> -->
<p/> <p/>
<img
<img alt="footer" src="https://fairy8-1258530674.picsh.myqcloud.com/img/20190611100310.png" width="150px"> alt="footer"
src="https://fairy8-1258530674.picsh.myqcloud.com/img/20190611100310.png"
width="150px"
>
</div> </div>
</template> </template>
<script> <script>
// import HelloWorld from './components/HelloWorld.vue' // import HelloWorld from './components/HelloWorld.vue'
export default { export default {
name: 'app', name: "app",
provide () {
return {
reload: this.reload
}
},
data(){
return {
isRouterAlive: true,
}
},
methods: {
logout() {
console.log("logout!");
window.localStorage.removeItem("token");
// console.log("window.localStorage:" + window.localStorage);
this.reload();
},
reload () {
this.isRouterAlive = false
this.$nextTick(function () {
this.isRouterAlive = true
})
},
showLogout () {
console.info("showLogout");
if (localStorage.token) {
console.info("showLogout:true");
return true;
}
else {
console.info("showLogout:false");
return false;
}
}
}
/*components: { /*components: {
HelloWorld HelloWorld
}*/ }*/
} };
</script> </script>
<style> <style>
#app { #app {
font-family: 'Avenir', Helvetica, Arial, sans-serif; font-family: "Avenir", Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased; -webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale; -moz-osx-font-smoothing: grayscale;
text-align: center; text-align: center;
+1 -1
View File
@@ -8,4 +8,4 @@ const HttpRequest = axios.create({
// 请求超时时间 // 请求超时时间
timeout: 10000 timeout: 10000
}) })
export default HttpRequest export default HttpRequest
+2 -1
View File
@@ -4,6 +4,7 @@ export default {
*/ */
baseUrl: { baseUrl: {
dev: 'http://localhost:30000', dev: 'http://localhost:30000',
pro: 'https://bill.fairy8.cn/api' pro: 'https://fairy8.cn:30443'
// pro: 'https://bill.fairy8.cn/api'
} }
}; };
+47 -2
View File
@@ -1,7 +1,6 @@
import Vue from 'vue' import Vue from 'vue'
import App from './App.vue' import App from './App.vue'
import router from '@/router/index.js' import router from '@/router/index.js'
import ElementUI from 'element-ui' import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css' import 'element-ui/lib/theme-chalk/index.css'
import HttpRequest from '@/axios/api.request' import HttpRequest from '@/axios/api.request'
@@ -14,6 +13,48 @@ Vue.use(ElementUI)
Vue.prototype.$moment = moment; Vue.prototype.$moment = moment;
/**
* Loading实现
* */
let loading //定义loading变量
function startLoading() { //使用Element loading-start 方法
loading = ElementUI.Loading.service({
lock: true,
text: '加载中……',
background: 'rgba(0, 0, 0, 0.7)'
})
}
function endLoading() { //使用Element loading-close 方法
loading.close()
}
let needLoadingRequestCount = 0
export function showFullScreenLoading() {
if (needLoadingRequestCount === 0) {
startLoading()
}
needLoadingRequestCount++
}
export function tryHideFullScreenLoading() {
if (needLoadingRequestCount <= 0) return
needLoadingRequestCount--
if (needLoadingRequestCount === 0) {
endLoading()
}
}
/**
* Axios 拦截器
*/
HttpRequest.interceptors.request.use( HttpRequest.interceptors.request.use(
config => { config => {
// 判断token是否存在 // 判断token是否存在
@@ -22,6 +63,7 @@ HttpRequest.interceptors.request.use(
config.headers.Authorization = localStorage.token config.headers.Authorization = localStorage.token
} }
// config.headers.Authorization = "Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhbGF3biIsImNyZWF0ZWQiOjE1NTg2ODY4MTk0NjcsImlhdCI6MTU1ODY4NjgxOSwiZXhwIjoxNTU5MjkxNjE5fQ.N9ZSMrStIaUyngSpvmup_akXQaueLSIX5-h4Q_fixdM" //将token设置成请求头 // config.headers.Authorization = "Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhbGF3biIsImNyZWF0ZWQiOjE1NTg2ODY4MTk0NjcsImlhdCI6MTU1ODY4NjgxOSwiZXhwIjoxNTU5MjkxNjE5fQ.N9ZSMrStIaUyngSpvmup_akXQaueLSIX5-h4Q_fixdM" //将token设置成请求头
// showFullScreenLoading()
return config return config
}, function(err) { }, function(err) {
return Promise.reject(err) return Promise.reject(err)
@@ -32,9 +74,11 @@ HttpRequest.interceptors.request.use(
// http response 拦截器 // http response 拦截器
HttpRequest.interceptors.response.use( HttpRequest.interceptors.response.use(
response => { response => {
// tryHideFullScreenLoading()
return response; return response;
}, },
error => { error => {
// tryHideFullScreenLoading()
if (error.response) { if (error.response) {
switch (error.response.status) { switch (error.response.status) {
case 401: case 401:
@@ -49,7 +93,8 @@ HttpRequest.interceptors.response.use(
} }
} }
return Promise.reject(error.response.data) // 返回接口返回的错误信息 return Promise.reject(error.response.data) // 返回接口返回的错误信息
}); }
);
+2 -2
View File
@@ -509,8 +509,8 @@ export default {
_this.$message.error('未知错误'); _this.$message.error('未知错误');
} else { } else {
// Something happened in setting up the request that triggered an Error // Something happened in setting up the request that triggered an Error
console.log("Error", error.message); console.log("Error", error);
_this.$message.error(error.response.message); _this.$message.error(error.error);
} }
console.log(error.config); console.log(error.config);
}); });
+10 -7
View File
@@ -2,16 +2,16 @@
<div class="main"> <div class="main">
<div class="group"> <div class="group">
<el-table <el-table
v-loading="isGirdLoading"
:data="book" :data="book"
height="600px" height="600px"
style="width: 100%" style="width: 100%"
@cell-mouse-enter="handleMouseEnter" @cell-mouse-enter="handleMouseEnter">
>
<!-- highlight-current-row --> <!-- highlight-current-row -->
<!-- @current-change="handleCurrentChange" --> <!-- @current-change="handleCurrentChange" -->
<el-table-column prop="applyDate" label="申请日期" width="150" :formatter="dateFormat"></el-table-column> <el-table-column prop="applyDate" label="申请日期" width="150" :formatter="dateFormat"></el-table-column>
<el-table-column prop="totalAmount" label="总金额" width="100"></el-table-column> <el-table-column prop="totalAmount" label="总金额" width="100"></el-table-column>
<el-table-column prop="fee" label="税费" width="100"></el-table-column> <el-table-column prop="fee" label="税金(8%)" width="100"></el-table-column>
<el-table-column prop="post.contact" label="快递地址" width="100"> <el-table-column prop="post.contact" label="快递地址" width="100">
<template slot-scope="scope"> <template slot-scope="scope">
<el-popover trigger="hover" placement="right"> <el-popover trigger="hover" placement="right">
@@ -102,6 +102,7 @@ export default {
name: "Gird", name: "Gird",
data() { data() {
return { return {
isGirdLoading:true,
isAddShow: false, isAddShow: false,
isEditShow: false, isEditShow: false,
isDetailShow: false, isDetailShow: false,
@@ -194,10 +195,12 @@ export default {
this.$router.push({ path: "Bill" }); this.$router.push({ path: "Bill" });
}, },
refresh() { refresh() {
fetchBooks().then(res => { fetchBooks().then(res => {
// console.info("res.data:" + res.data); // console.info("res.data:" + res.data);
this.book = res.data; this.isGirdLoading = true;
}); this.book = res.data;
this.isGirdLoading = false;
});
}, },
handleCurrentChange(val) { handleCurrentChange(val) {
this.focusRow = val; this.focusRow = val;
+60 -51
View File
@@ -1,27 +1,34 @@
<template> <template>
<div class="login"> <div class="login">
<div class="group"> <div class="group">
<el-form ref="ruleForm" :model="ruleForm" :rules="rules" label-width="80px"> <el-form v-loading="disabled" ref="ruleForm" :model="ruleForm" :rules="rules" label-width="80px">
<el-form-item label="用户名" prop="username"> <el-form-item label="用户名" prop="username">
<el-input v-model="ruleForm.username" clearable placeholder="请输入用户名"></el-input> <el-input v-model="ruleForm.username" clearable placeholder="请输入用户名"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="密码" prop="password"> <el-form-item label="密码" prop="password">
<el-input v-model="ruleForm.password" @keyup.enter.native="onSubmit('ruleForm')" show-password placeholder="请输入密码"></el-input> <el-input
v-model="ruleForm.password"
@keyup.enter.native="onSubmit('ruleForm')"
show-password
placeholder="请输入密码"
></el-input>
</el-form-item> </el-form-item>
<!-- <el-row :gutter="20"> --> <!-- <el-row :gutter="20"> -->
<el-row> <el-row>
<el-col :span="18"> <el-col :span="18">
<el-form-item> <el-form-item>
<el-button type="primary" @click="onSubmit('ruleForm')" :disabled="disabled">登录</el-button> <el-button type="primary" @click="onSubmit('ruleForm')" :disabled="disabled">登录</el-button>
<el-button @click="reset('ruleForm')">重置</el-button> <el-button @click="reset('ruleForm')">重置</el-button>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item label-width="50px"> <el-form-item label-width="50px">
<span align="right"><el-link type="primary" :underline="false" href="/#/Register">注册</el-link></span> <span align="right">
</el-form-item> <el-link type="primary" :underline="false" href="/#/Register">注册</el-link>
</el-col> </span>
</el-form-item>
</el-col>
</el-row> </el-row>
</el-form> </el-form>
</div> </div>
@@ -29,25 +36,25 @@
</template> </template>
<script> <script>
import { login } from '../api/user.js'; import { login } from "../api/user.js";
import { encrypt,decrypt } from "../utils/encoder.js"; import { encrypt, decrypt } from "../utils/encoder.js";
export default { export default {
name: 'Login', name: "Login",
data() { data() {
return { return {
disabled: false, disabled: false,
ruleForm: { ruleForm: {
username: '', username: "",
password: '' password: ""
}, },
rules: { rules: {
username: [ username: [
{ required: true, message: '请输入户名', trigger: 'blur' }, { required: true, message: "请输入户名", trigger: "blur" },
{ min: 3, max: 15, message: '长度在 3 到 30 个字符', trigger: 'blur' } { min: 3, max: 15, message: "长度在 3 到 30 个字符", trigger: "blur" }
], ],
password: [ password: [
{ required: true, message: '请输入密码', trigger: 'change' }, { required: true, message: "请输入密码", trigger: "change" },
{ min: 3, max: 15, message: '长度在 3 到 30 个字符', trigger: 'blur' } { min: 3, max: 15, message: "长度在 3 到 30 个字符", trigger: "blur" }
] ]
} }
}; };
@@ -57,21 +64,21 @@ export default {
this.$refs[formName].validate(valid => { this.$refs[formName].validate(valid => {
var _this = this; var _this = this;
if (valid) { if (valid) {
this.disabled = true; this.disabled = true;
/** 加密处理 */ /** 加密处理 */
var encoderStr = encrypt(this.ruleForm.password); var encoderStr = encrypt(this.ruleForm.password);
console.log('密文:' + encoderStr); console.log("密文:" + encoderStr);
console.log('解密:' + decrypt(encoderStr)); console.log("解密:" + decrypt(encoderStr));
this.ruleForm.password = encoderStr; this.ruleForm.password = encoderStr;
/** 访问登录服务 */ /** 访问登录服务 */
login(this.ruleForm) login(this.ruleForm)
.then(res => { .then(res => {
var token = 'Bearer ' + res.data.token; var token = "Bearer " + res.data.token;
console.log('token:' + token); console.log("token:" + token);
window.localStorage.setItem('token', token); window.localStorage.setItem("token", token);
this.$message({ message: '登录成功', type: 'success' }); this.$message({ message: "登录成功", type: "success" });
this.$router.push({ path: 'Gird' }) this.$router.push({ path: "Gird" });
}) })
.catch(function(error) { .catch(function(error) {
// _this.$message({ message: error.response.statusText, type: 'error' }); // _this.$message({ message: error.response.statusText, type: 'error' });
@@ -81,7 +88,10 @@ export default {
if (error.response) { if (error.response) {
// The request was made and the server responded with a status code // The request was made and the server responded with a status code
// that falls out of the range of 2xx // that falls out of the range of 2xx
_this.$message({ message: error.response.data.message, type: 'error' }); _this.$message({
message: error.response.data.message,
type: "error"
});
console.log(error.response.data); console.log(error.response.data);
console.log(error.response.status); console.log(error.response.status);
console.log(error.response.headers); console.log(error.response.headers);
@@ -91,35 +101,34 @@ export default {
// http.ClientRequest in node.js // http.ClientRequest in node.js
// _this.$message.error(error.request); // _this.$message.error(error.request);
console.log(error.request); console.log(error.request);
_this.$message.error('未知错误'); _this.$message.error("未知错误");
} else { } else {
// Something happened in setting up the request that triggered an Error // Something happened in setting up the request that triggered an Error
// console.log('Error', error.message); // console.log('Error', error.message);
console.log('Error', error.status); console.log("Error", error.status);
if(error.status == 401 ){ if (error.status == 401) {
_this.$message.error('用户名或密码有误'); _this.$message.error("用户名或密码有误");
_this.reset('ruleForm'); _this.reset("ruleForm");
// _this.ruleForm.password = ''; // _this.ruleForm.password = '';
} } else {
else { // _this.ruleForm.password = '';
// _this.ruleForm.password = ''; _this.$message.error(error.status + ':' + error.message);
_this.$message.error(error.status.toString() + error.message); _this.reset("ruleForm");
_this.reset('ruleForm');
} }
} }
console.log(error.config); console.log(error.config);
// _this.$message.error(error.response.statusText); // _this.$message.error(error.response.statusText);
}); });
} else { } else {
console.log('error submit!!'); console.log("error submit!!");
return false; return false;
} }
}); });
}, },
reset(formName) { reset(formName) {
console.log('reset') console.log("reset");
this.$refs[formName].resetFields(); this.$refs[formName].resetFields();
this.$refs[formName].focus(); // this.$refs[formName].focus();
this.disabled = false; this.disabled = false;
} }
} }