基於上一篇中的開發基本上實現了登陸註冊,經過token拿數據等一些登陸涉及到的功能開發,基本上後端的功能已所有完成,能夠看下上一篇實現全棧收銀系統(Node+Vue)(上)的分享。 今天咱們須要進行實現的功能包前端頁面的編寫和開發javascript
建立在node-app項目(即在node項目裏面) vue create client
前端
安裝命令 npm install concurrently
vue
將Vue項目執行運行的命令添加 "start": "npm run serve"
java
在node項目中配置成,咱們只須要執行 npm run dev
就能讓後臺跟前臺都運行起來node
在路由頁面中ios
{
path: '*',
name: '/404',
component: NotFound
},
複製代碼
請求攔截git
axios.interceptors.request.use(config => {
return config;
},error => {
return Promise.reject(error);
})
複製代碼
響應攔截github
axios.interceptors.response.use(response => {
return response;
}, error => {
Message.error(erroe.response.data);
return Promise.reject(error);
})
複製代碼
記得 export default axios
vuex
main.js中配置 Vue.prototype.$axios = axios;
npm
npm install jet-decode
jwt_decode(token)
const type = {
SET_AUTHENTICATION: "SET_AUTHENTICATION", //判斷是否定證經過 (自定義的type名稱)
SET_USER: 'SET_USER',
}
const mutations ={
[type.SET_AUTHENTICATION](state,isAuthentication) {
if(isAuthentication) state.isAuthentication = isAuthentication;
else state.isAuthentication = false;
},
[type.SET_USER](state,user) {
if(user) state.user = user;
else state.user = {};
},
}
const actions = { //異步操做
setAuthentication: ({commit},isAuthentication) => {
commit(type.SET_AUTHENTICATION,isAuthentication);
},
setUser:({commit},user) => {
commit(type.SET_USER,user);
},
}
複製代碼
登陸操做
// 解析token
const decode = jwt_decode(token);
// 存儲數據
this.$store.dispatch("setAuthentication", !this.isEmpty(decode));
this.$store.dispatch("setUser", decode);
複製代碼
獲取相應的頭像,名字,等級咱們能夠在登陸的時候經過解析tonken獲取到的信息賦值,因爲咱們登陸的時候將解析的tonken存入vuex中,故咱們能夠進行取值
token信息
<span>{{user.name}}</span>
computed: {
user() {
return this.$store.getters.user;
}
}
複製代碼
操做跟咱們token過時操做雷同,須要清除相應的token數據,將狀態更改成false ,故咱們能夠經過vuex中爲退出設置個方法調用便可
//vuex
const actions = {
//退出登陸清除狀態
clearCurrentState:({commit}) => {
commit(type.SET_AUTHENTICATION,false);
commit(type.SET_USER,null)
}
}
// HeadNav
logout() {
localStorage.removeItem('eleToken');
//設置vuex store
this.$store.dispatch('clearCurrentState');
//跳轉
this.$router.push('/login');
}
複製代碼
參考element中的table自定義列模板 ,此處的數據遍歷按照文檔中的走相應的更改字段便可
此處實現是雷同的,共用同個彈窗組件,其中涉及到父子組件之間的相互傳值。 新建出dialog自定義內容,此處技術點
// 由父組件的數據傳入進行接收
props: {
dialog: Object,
form: Object
},
// 提交表單之後將數據傳回去給父組件 (此處的提交寫法是表單額提交寫法)
onSubmit(form) {
this.$refs[form].validate(valid => {
if (valid) {
//表單數據驗證完成以後,提交數據;
const url =
this.dialog.option == "add" ? "add" : `edit/${this.form.id}`;
this.$axios.post(`/api/profile/${url}`, this.form).then(res => {
// 操做成功
this.dialog.show = true;
this.$emit("update");
});
}
});
}
複製代碼
添加的時候,咱們經過點擊父頁面改變自定義的數組數據,讓子組件顯示,經過提交數據傳回給父組件,update
刷新父組件當前列表從新請求,繼而關閉彈窗。
在此處中咱們對不一樣操做相應的data數據都要作處理,編輯的時候,咱們對from中的數據進行賦值操做,添加的時候清空數據
<!-- 彈框頁面 -->
<DialogFound :dialog='dialog' :form='form' @update="getProfile"></DialogFound>
data() {
//這些數據是自定義的數據,包括表單信息,控制子組件的數組數據
dialog: {
show: false,
title: "",
option: "edit"
},
form: {
type: "",
describe: "",
income: "",
expend: "",
cash: "",
remark: "",
id: ""
},
},
methods: {
//刷新數據
getProfile() {
// 獲取表格數據
this.$axios("/api/profile").then(res => {
// this.tableData = res.data;
this.allTableData = res.data;
this.filterTableData = res.data;
// 設置分頁數據
this.setPaginations();
});
},
}
複製代碼
element自帶了方法,咱們只須要獲取拿了進行使用就好了
onDeleteMoney(row, index) {
// 刪除
this.$axios.delete(`/api/profile/delete/${row._id}`).then(res => {
console.log(JSON.stringify(res));
this.$message("刪除成功");
this.getProfile();
});
},
複製代碼
模板參考element的分頁,根據分頁咱們須要自定義的數組數據進行收集賦值
paginations: {
page_index: 1, // 當前位於哪頁
total: 0, // 總數
page_size: 5, // 1頁顯示多少條
page_sizes: [5, 10, 15, 20], //每頁顯示多少條
layout: "total, sizes, prev, pager, next, jumper" // 翻頁屬性
},
複製代碼
咱們須要再第一次數據加載的時候獲取到所有的數組數據allTableData
,設置一個空數組,將儲存 過濾後的數組數據
setPaginations() {
// 總頁數
this.paginations.total = this.allTableData.length;
this.paginations.page_index = 1;
this.paginations.page_size = 5;
// 設置默認分頁數據
//此處便將總的數據進行遍歷,根據設置的初始值,將返回爲true的數據儲存在空數組中
this.tableData = this.allTableData.filter((item, index) => {
console.log(index < this.paginations.page_size);
return index < this.paginations.page_size;
//return index < page_size; 根據切換的頁數進行過濾
});
console.log( this.tableData )
},
複製代碼
實現切換頁數進行數據的改變
handleCurrentChange(page) {
// 當前頁
let sortnum = this.paginations.page_size * (page - 1);
let table = this.allTableData.filter((item, index) => {
return index >= sortnum;
});
// 設置默認分頁數據
this.tableData = table.filter((item, index) => {
return index < this.paginations.page_size;
});
//第二種的實現
// let tables = [];
// for(let i=index;i<nums;i++) {
// if(this.allTableData[i]) {
// tables.push(this.allTableData[i]);
// }
// this.tableData = tables
// }
},
複製代碼
時間的篩選中,咱們須要從新定義一個新的所有數據的數組,經過獲取兩個時間段的時間格式後進行比較賦值到計算分頁的數組當中,從新再執行分頁的初始化函數
onScreeoutMoney() {
// 篩選
if (!this.search_data.startTime || !this.search_data.endTime) {
this.$message({
type: "warning",
message: "請選擇時間區間"
});
this.getProfile();
return;
}
const stime = this.search_data.startTime.getTime(); //開始時間
const etime = this.search_data.endTime.getTime(); //結束時間
this.allTableData = this.filterTableData.filter(item => {
let date = new Date(item.date);
let time = date.getTime();
return time >= stime && time <= etime;
});
// 分頁數據
this.setPaginations();
}
},
複製代碼
最終實現了vue+node實現的後臺系統