From 5c5eccdb11df86dbd0200ffa316cddb7a671d839 Mon Sep 17 00:00:00 2001
From: 李林 <z1292839451@163.com>
Date: 星期六, 23 十二月 2023 23:11:26 +0800
Subject: [PATCH] 框架引入

---
 src/components/tool/value-table.vue    |  422 +++++++++++++++++++++
 src/components/view/role-manage.vue    |  129 ++++++
 src/main.js                            |    3 
 src/App.vue                            |   38 +
 src/components/view/person-manage.vue  |  128 +++++-
 src/components/view/data-reporting.vue |  271 +++++++++++++
 src/view/index.vue                     |  144 +++++-
 src/assets/api/controller.js           |   18 
 8 files changed, 1,085 insertions(+), 68 deletions(-)

diff --git a/src/App.vue b/src/App.vue
index d1dc40c..2b8184b 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -26,7 +26,7 @@
 </script>
 <style>
 /* @import url("../static/img/alifont/iconfont.css"); */
-@import url("//at.alicdn.com/t/c/font_4179845_pixkgb97c4p.css");
+@import url("//at.alicdn.com/t/c/font_4379269_qfsjed5hzge.css");
 
 * {
   margin: 0;
@@ -128,26 +128,30 @@
 /* 鍏ㄥ眬琛ㄦ牸鏍峰紡 */
 .el-table th.el-table__cell,
 .has-gutter .el-table__cell {
-  background-color: #f0f1f5 !important;
+  background-color: #F0F1F5 !important;
   color: #333;
 }
 .has-gutter .el-table__cell .cell {
-  font-size: 16px;
+  font-size: 14px !important;
   font-weight: 500;
 }
 .cell {
-  color: rgb(51, 51, 51);
-  padding-left: 17px !important;
-  font-size: 14px;
+  color: #333;
+  padding: 0 17px !important;
+  font-size: 12px;
 }
 .cell span {
-  font-size: 14px;
+  font-size: 12px;
   font-weight: 400;
 }
+.el-table .el-table__cell{
+	padding: 0px 0;
+}
 .el-table th.el-table__cell > .cell {
-  font-size: 16px;
+  font-size: 14px;
   font-weight: 400;
-  color: rgb(51, 51, 51);
+  color: #333;
+	padding: 6px 17px !important;
 }
 /* 鍏ㄥ眬鍒嗛〉鍣ㄦ牱寮� */
 .el-pager .number {
@@ -159,9 +163,12 @@
   font-weight: 500;
 }
 .el-pager .number.active {
-  background-color: #004ea2;
+  background-color: #3A7BFA;
   color: #fff;
   border: 0;
+}
+.el-pager li.active+li{
+	border-left: 10px !important;
 }
 /* 鍏ㄥ眬妯℃�佹鏍峰紡 */
 .el-dialog__header,.el-message-box__header {
@@ -177,7 +184,7 @@
   display: inline-block;
   width: 4px;
   height: 30.24px;
-  background: rgb(0, 95, 201);
+  background: #3A7BFA;
   border-radius: 10px;
   margin-left: 32px;
   margin-right: 8.5px;
@@ -188,7 +195,7 @@
   display: inline-block;
   width: 4px;
   height: 30.24px;
-  background: rgb(0, 95, 201);
+  background: #3A7BFA;
   border-radius: 10px;
   margin-left: 20px;
   margin-right: 8.5px;
@@ -208,8 +215,8 @@
 
 .el-dialog__footer .el-button {
   height: 36px;
-  border: 1px solid rgba(190, 190, 190, 0.44);
-  box-shadow: 0px 2px 4px rgba(220, 220, 220, 0.41);
+  /* border: 1px solid rgba(190, 190, 190, 0.44); */
+  /* box-shadow: 0px 2px 4px rgba(220, 220, 220, 0.41); */
   padding: 0 14px;
 }
 
@@ -236,6 +243,9 @@
   color: #666 !important;
   background-color: rgba(0, 0, 0, 0.05) !important;
 }
+.el-divider{
+	margin: 5px 0;
+}
 /* 鍏ㄥ眬杈撳叆妗嗘牱寮� */
 /* 鍏ㄥ眬鎸夐挳鏍峰紡 */
 </style>
diff --git a/src/assets/api/controller.js b/src/assets/api/controller.js
index 7c468f6..73c0d20 100644
--- a/src/assets/api/controller.js
+++ b/src/assets/api/controller.js
@@ -1,10 +1,26 @@
 export default function(Vue) {
 	//娣诲姞鍏ㄥ眬API
 	Vue.prototype.$api = {
-		login
+		login,
+		user,
+		dataReporting
 	}
 }
 
 const login = {
 	enter: "/user/enter", //鐧诲綍
+}
+
+const user = {
+	selectUserList: "/user/selectUserList", //鑾峰彇鐢ㄦ埛鍒楄〃
+	selectRoleList: "/role/selectRoleList", //鑾峰彇瑙掕壊鍒楄〃
+	updateUser: "/user/updateUser", //淇敼鐢ㄦ埛淇℃伅
+	addUser: "/user/addUser", //娣诲姞鐢ㄦ埛淇℃伅
+	selectRoleLists: "/role/selectRoleLists", //鑾峰彇瑙掕壊鍒楄〃
+	delRole: "/role/delRole", //娣诲姞鐢ㄦ埛淇℃伅
+}
+
+const dataReporting = {
+	selectDataReportingList: "/dataReporting/selectDataReportingList", //鑾峰彇鏁版嵁涓婃姤鍒楄〃
+	upDataReporting: "/dataReporting/upDataReporting", //淇敼鏁版嵁涓婃姤
 }
\ No newline at end of file
diff --git a/src/components/tool/value-table.vue b/src/components/tool/value-table.vue
new file mode 100644
index 0000000..2d1868f
--- /dev/null
+++ b/src/components/tool/value-table.vue
@@ -0,0 +1,422 @@
+<style scoped>
+	.value-table {
+		width: 100%;
+		height: 100%;
+		overflow-y: auto;
+	}
+
+	.table {
+		width: 100%;
+		height: calc(100% - 42px);
+	}
+
+	.page {
+		width: 100%;
+		height: 30px;
+		text-align: right;
+		margin-top: 10px;
+	}
+</style>
+
+<template>
+	<div class="value-table">
+		<div class="table">
+			<el-table ref="eltable" :data="tableData" style="width: 100%;" height="100%" tooltip-effect="dark" border
+				@selection-change="selectChange" @select="select" v-loading="loading" @sort-change="sortChange"
+				@row-click="rowClick">
+				<el-table-column type="selection" width="50" v-if="data.showSelect">
+				</el-table-column>
+				<el-table-column align="center" type="index" label="搴忓彿" width="70" v-if="data.isIndex">
+				</el-table-column>
+				<el-table-column :prop="a.label" :label="a.value" sortable="custom" v-for="(a, ai) in tableHead" :key="ai"
+					show-overflow-tooltip min-width="145">
+					<template slot-scope="scope">
+						<div v-if="showType(a.label, data.tagField) != null">
+							<el-tag v-for="(b, bi) in data.tagField[a.label].select" :key="bi" v-if="b.value == scope.row[a.label]"
+								:type="b.type" size="medium">{{b.label}}</el-tag>
+						</div>
+						<span v-else>{{scope.row[a.label]}}</span>
+					</template>
+				</el-table-column>
+				<el-table-column fixed="right" align="center" label="鎿嶄綔" :width="50 + data.do.length * 30"
+					v-if="data.do.length > 0">
+					<template slot-scope="scope">
+						<el-button v-for="(a, ai) in data.do" :key="ai" :type="a.type"
+							@click="main(scope.row, a)">{{a.font}}</el-button>
+					</template>
+				</el-table-column>
+			</el-table>
+		</div>
+		<div class="page">
+			<el-pagination @size-change="sizeChange" @current-change="currentChange" :current-page="page.current"
+				:page-sizes="[10, 20, 30, 50, 100]" :page-size="page.size" layout="total, sizes, prev, pager, next, jumper"
+				:total="total">
+			</el-pagination>
+		</div>
+		<el-dialog title="缂栬緫" :visible.sync="upDia" width="500px">
+			<div class="body" v-if="upDia">
+				<el-row v-for="(a, ai) in upHead" :key="ai" style="line-height: 50px;">
+					<el-col :span="5" style="text-align: right;">{{a.value}}锛�</el-col>
+					<el-col :span="17" :offset="1">
+						<el-input v-model="upData[a.label]" size="small" clearable
+							v-if="showType(a.label, data.tagField) == null"></el-input>
+						<el-select v-model="upData[a.label]" size="small" v-if="showType(a.label, data.tagField) != null"
+							style="width: 100%;">
+							<el-option v-for="(b, bi) in data.tagField[a.label].select" :key="bi" :value="b.value"
+								:label="b.label"></el-option>
+						</el-select>
+					</el-col>
+				</el-row>
+			</div>
+			<span slot="footer" class="dialog-footer">
+				<el-button @click="upDia = false">鍙� 娑�</el-button>
+				<el-button type="primary" @click="saveUpData" :loading="upLoad">纭� 瀹�</el-button>
+			</span>
+		</el-dialog>
+		<el-dialog title="鏂板" :visible.sync="addDia" width="500px">
+			<div class="body" v-if="addDia">
+				<el-row v-for="(a, ai) in upHead" :key="ai" style="line-height: 50px;">
+					<el-col :span="5" style="text-align: right;">{{a.value}}锛�</el-col>
+					<el-col :span="17" :offset="1">
+						<el-input v-model="upData[a.label]" size="small" clearable :placeholder="`璇疯緭鍏�${a.value}`"
+							v-if="showType(a.label, data.tagField) == null"></el-input>
+						<el-select v-model="upData[a.label]" size="small" v-if="showType(a.label, data.tagField) != null"
+							style="width: 100%;" :placeholder="`璇烽�夋嫨${a.value}`">
+							<el-option v-for="(b, bi) in data.tagField[a.label].select" :key="bi" :value="b.value"
+								:label="b.label"></el-option>
+						</el-select>
+					</el-col>
+				</el-row>
+			</div>
+			<span slot="footer" class="dialog-footer">
+				<el-button @click="addDia = false">鍙� 娑�</el-button>
+				<el-button type="primary" @click="saveAddData" :loading="addLoad">纭� 瀹�</el-button>
+			</span>
+		</el-dialog>
+	</div>
+</template>
+
+<script>
+	import {
+		Page
+	} from 'iview';
+	export default {
+		props: {
+			url: {
+				type: String,
+				default: () => null
+			},
+			upUrl: {
+				type: String,
+				default: () => null
+			},
+			delUrl: {
+				type: String,
+				default: () => null
+			},
+			componentData: {
+				type: Object,
+				default: () => {
+					return {
+						entity: {
+							orderBy: {
+								field: 'id',
+								order: 'asc'
+							}
+						},
+						isIndex: true,
+						showSelect: true,
+						select: true,
+						do: [{
+							id: 'update',
+							font: '缂栬緫',
+							type: 'text',
+							method: 'doDiy'
+						}, {
+							id: 'delete',
+							font: '鍒犻櫎',
+							type: 'text',
+							method: 'doDiy'
+						}],
+						doDiy: true,
+						tagField: [{
+							label: 'state',
+							select: [{
+								value: '1',
+								type: 'success',
+								label: '鍚敤'
+							}, {
+								value: '0',
+								type: 'danger',
+								label: '鍋滅敤'
+							}]
+						}]
+					}
+				}
+			}
+		},
+		data() {
+			return {
+				data: {
+					entity: {
+						orderBy: {
+							field: 'id',
+							order: 'asc'
+						}
+					},
+					isIndex: true,
+					showSelect: true,
+					select: true,
+					do: [{
+						font: '鍒犻櫎',
+						type: 'text'
+					}],
+					type: []
+				},
+				tableHead: [],
+				tableData: [],
+				multipleSelection: [],
+				user: {},
+				page: {
+					current: 1,
+					size: 20,
+				},
+				total: 0,
+				loading: false,
+				upDia: false,
+				upData: {},
+				upHead: [],
+				upLoad: false,
+				addDia: false,
+				addUrl: null,
+				addLoad: false,
+				dataCopy: {}
+			}
+		},
+		watch: {
+			tableData: {
+				deep: true,
+				handler: function() {
+					this.$nextTick(() => {
+						this.$refs.eltable.doLayout()
+					})
+				}
+			}
+		},
+		mounted() {
+			this.data = this.componentData
+			this.dataCopy = this.HaveJson(this.componentData)
+			this.selectList()
+		},
+		methods: {
+			selectChange(val) {
+				if (this.data.select) {
+					this.multipleSelection = val;
+				} else {
+					this.multipleSelection = val[val.length - 1];
+				}
+			},
+			select(val, row) {
+				if (!this.data.select) {
+					this.$refs['eltable'].clearSelection()
+					this.$refs['eltable'].toggleRowSelection(row, true)
+				}
+			},
+			rowClick(row, column, event) {
+				if (this.data.select) {
+					this.$refs['eltable'].toggleRowSelection(row)
+				} else {
+					this.$refs['eltable'].clearSelection()
+					this.$refs['eltable'].toggleRowSelection(row, true)
+				}
+			},
+			sizeChange(val) {
+				this.page.size = val
+				this.selectList()
+			},
+			currentChange(val) {
+				this.page.current = val
+				this.selectList()
+			},
+			selectList() {
+				this.loading = true
+				this.$axios.post(this.url, {
+					page: this.page,
+					entity: this.data.entity
+				}, {
+					headers: {
+						'Content-Type': 'application/json'
+					}
+				}).then(res => {
+					if (res.code === 201) {
+						this.loading = false
+						return
+					}
+					this.total = res.data.body.total
+					this.tableHead = res.data.head
+					this.tableData = res.data.body.records
+					this.loading = false
+				}).catch(e => {
+					this.loading = false
+					this.$message.error('璇峰埛鏂伴〉闈㈠啀灏濊瘯')
+				})
+			},
+			sortChange(ob) {
+				this.data.entity.orderBy = {}
+				this.data.entity.orderBy.field = ob.prop
+				if (ob.order == 'ascending') {
+					this.data.entity.orderBy.order = 'asc'
+				} else if (ob.order == 'descending') {
+					this.data.entity.orderBy.order = 'desc'
+				} else {
+					if (this.componentData.entity.orderBy != undefined) {
+						this.data.entity.orderBy = this.HaveJson(this.dataCopy.entity.orderBy)
+					}
+				}
+				this.selectList()
+			},
+			showType(val, ob) {
+				var str = ob[val]
+				return str == undefined ? null : ob[val].select
+			},
+			main(row, val) {
+				if (val.method == undefined) return
+				else if (val.method == 'doDiy') {
+					if (val.id == 'update') {
+						this.upDia = true,
+							this.upData = this.HaveJson(row)
+						this.upHead = this.HaveJson(this.tableHead)
+						this.upHead = this.upHead.filter(a => a.label != 'createTime' && a.label != 'updateTime')
+						delete this.upData.orderBy
+						delete this.upData.createTime
+						delete this.upData.updateTime
+						delete this.upData.createUser
+						delete this.upData.updateUser
+						val.field.forEach(a => {
+							if (this.upData[a] == undefined) {
+								this.upHead.push({
+									value: a.split('=')[0],
+									label: a.split('=')[1]
+								})
+							} else {
+								delete this.upData[a]
+								for (var i = 0; i < this.upHead.length; i++) {
+									if (this.upHead[i].label == a) {
+										this.upHead.splice(i, 1);
+										i--
+										break
+									}
+								}
+							}
+						})
+					} else if (val.id == 'delete') {
+						if (this.delUrl == null) {
+							this.$message.error('璇风粰鍒犻櫎璇锋眰鍦板潃')
+							return
+						}
+						this.$confirm('鏄惁鍒犻櫎褰撳墠鏁版嵁?', "璀﹀憡", {
+							confirmButtonText: "纭畾",
+							cancelButtonText: "鍙栨秷",
+							type: "warning"
+						}).then(() => {
+							this.$axios.post(this.delUrl, {
+								id: row.id
+							}).then(res => {
+								if (res.code === 201) {
+									return
+								}
+								this.$message.success('鍒犻櫎鎴愬姛')
+								this.selectList()
+							}).catch(e => {
+								this.$message.error('鍒犻櫎澶辫触')
+							})
+						}).catch(() => {})
+					}
+				} else {
+					delete row.orderBy
+					this.$emit(val.method, row)
+				}
+			},
+			saveUpData() {
+				if (this.upUrl == null) {
+					this.$message.error('璇风粰淇敼璇锋眰鍦板潃')
+					return
+				}
+				this.upLoad = true
+				this.$axios.post(this.upUrl, this.upData, {
+					headers: {
+						'Content-Type': 'application/json'
+					}
+				}).then(res => {
+					if (res.code === 201) {
+						this.upLoad = false
+						return
+					}
+					this.$message.success('淇敼鎴愬姛')
+					this.upDia = false
+					this.selectList()
+					this.upLoad = false
+				}).catch(e => {
+					this.$message.error('淇敼澶辫触')
+					this.upDia = false
+					this.upLoad = false
+				})
+			},
+			openAddDia(addUrl) {
+				this.addDia = true
+				this.addUrl = addUrl
+				this.upData = {}
+				this.tableHead.forEach((k, v) => {
+					if (k.label != 'orderBy' && k.label != 'createTime' && k.label != 'updateTime' && k.label !=
+						'createUser' && k.label != 'updateUser')
+						this.upData[k.label] = null
+				})
+				this.upData = this.HaveJson(this.upData)
+				this.upHead = this.HaveJson(this.tableHead)
+				this.upHead = this.upHead.filter(a => a.label != 'createTime' && a.label != 'updateTime')
+				var val = this.data.do.filter(a => a.id == 'update')[0]
+				val.field.forEach(a => {
+					if (JSON.stringify(this.upData[a]) == undefined) {
+						this.upHead.push({
+							value: a.split('=')[0],
+							label: a.split('=')[1]
+						})
+					} else {
+						delete this.upData[a]
+						for (var i = 0; i < this.upHead.length; i++) {
+							if (this.upHead[i].label == a) {
+								this.upHead.splice(i, 1);
+								i--
+								break
+							}
+						}
+					}
+				})
+			},
+			saveAddData() {
+				if (this.addUrl == null) {
+					this.$message.error('璇风粰娣诲姞璇锋眰鍦板潃')
+					return
+				}
+				this.addLoad = true
+				this.$axios.post(this.addUrl, this.upData, {
+					headers: {
+						'Content-Type': 'application/json'
+					}
+				}).then(res => {
+					if (res.code === 201) {
+						this.addLoad = false
+						return
+					}
+					this.$message.success('娣诲姞鎴愬姛')
+					this.addDia = false
+					this.selectList()
+					this.addLoad = false
+				}).catch(e => {
+					this.addDia = false
+					this.addLoad = false
+				})
+			}
+		}
+	}
+</script>
\ No newline at end of file
diff --git a/src/components/view/data-reporting.vue b/src/components/view/data-reporting.vue
new file mode 100644
index 0000000..5708237
--- /dev/null
+++ b/src/components/view/data-reporting.vue
@@ -0,0 +1,271 @@
+<style scoped>
+	.title {
+		height: 60px;
+		line-height: 60px;
+	}
+
+	.search {
+		background-color: #fff;
+		height: 80px;
+		display: flex;
+		align-items: center;
+	}
+
+	.search_thing {
+		width: 350px;
+		display: flex;
+		align-items: center;
+	}
+
+	.search_label {
+		width: 110px;
+		font-size: 14px;
+		text-align: right;
+	}
+
+	.search_input {
+		width: calc(100% - 110px);
+	}
+
+	.table {
+		margin-top: 10px;
+		background-color: #fff;
+		width: calc(100% - 40px);
+		height: calc(100% - 60px - 80px - 10px - 40px);
+		padding: 20px;
+	}
+</style>
+<style>
+	.data_reporting .data_reporting_dia .el-dialog__body{
+		padding: 15px 0;
+	}
+</style>
+
+<template>
+	<div class="data_reporting">
+		<div>
+			<el-row class="title">
+				<el-col :span="12" style="padding-left: 20px;">鏁版嵁涓婃姤</el-col>
+				<el-col :span="12" style="text-align: right;padding-right: 8px;">
+					<el-button size="small" @click="">
+						<i class="el-icon-download" style="color: #3A7BFA;"></i>
+						<span style="color: #3A7BFA;">瀵煎嚭</span>
+					</el-button>
+				</el-col>
+			</el-row>
+		</div>
+		<div class="search">
+			<div class="search_thing">
+				<div class="search_label">绯荤粺鏃ユ湡锛�</div>
+				<div class="search_input">
+					<el-date-picker size="small" v-model="componentData.entity.updateTime" type="date" placeholder="閫夋嫨鏃ユ湡" value-format="yyyy-MM-dd HH:mm:ss" clearable></el-date-picker>
+				</div>
+			</div>
+			<div class="search_thing">
+				<div class="search_label">鐧昏浜猴細</div>
+				<div class="search_input">
+					<el-input size="small" v-model="componentData.entity.registrant" clearable placeholder="鐧昏浜�" @keyup.enter.native="refreshTable()"></el-input>
+				</div>
+			</div>
+			<div class="search_thing">
+				<div class="search_label">椤圭洰锛�</div>
+				<div class="search_input">
+					<el-select size="small" style="width: 100%;" placeholder="璇烽�夋嫨" v-model="componentData.entity.product">
+						<el-option :value="null" label="鍏ㄩ儴"></el-option>
+					</el-select>
+				</div>
+			</div>
+			<div class="search_thing" style="padding-left: 30px;">
+				<el-button size="small" @click="refresh()">閲� 缃�</el-button>
+				<el-button size="small" type="primary" @click="refreshTable()">鏌� 璇�</el-button>
+			</div>
+		</div>
+		<div class="table">
+			<ValueTable ref="ValueTable" :url="$api.dataReporting.selectDataReportingList" :componentData="componentData"
+				:key="upIndex" @upRole="upRole" />
+		</div>
+		<el-dialog title="涓婃姤淇敼" :visible.sync="upDia" width="700px" class="data_reporting_dia">
+			<div class="body" v-if="upDia">
+				<el-row style="line-height: 50px;">
+					<el-col :span="4" style="text-align: right;padding-right: 8px;">绯荤粺鏃ユ湡</el-col>
+					<el-col :span="7">
+						<el-input v-model="upData.updateTime" size="small" disabled></el-input>
+					</el-col>
+					<el-col :span="4" style="text-align: right;padding-right: 8px;">鐧昏浜�</el-col>
+					<el-col :span="7">
+						<el-input v-model="upData.registrant" size="small" disabled></el-input>
+					</el-col>
+				</el-row>
+				<el-row style="line-height: 50px;">
+					<el-col :span="4" style="text-align: right;padding-right: 8px;">閮ㄩ棬</el-col>
+					<el-col :span="7">
+						<el-input v-model="upData.department" size="small" disabled></el-input>
+					</el-col>
+					<el-col :span="4" style="text-align: right;padding-right: 8px;">璐︽埛鍚�</el-col>
+					<el-col :span="7">
+						<el-input v-model="upData.name" size="small" disabled></el-input>
+					</el-col>
+				</el-row>
+				<el-row style="line-height: 50px;">
+					<el-col :span="4" style="text-align: right;padding-right: 8px;">娓犻亾</el-col>
+					<el-col :span="7">
+						<el-input v-model="upData.channel" size="small" disabled></el-input>
+					</el-col>
+					<el-col :span="4" style="text-align: right;padding-right: 8px;">椤圭洰</el-col>
+					<el-col :span="7">
+						<el-input v-model="upData.product" size="small" disabled></el-input>
+					</el-col>
+				</el-row>
+				<el-row style="line-height: 50px;">
+					<el-col :span="4" style="text-align: right;padding-right: 8px;">灞曠幇閲�</el-col>
+					<el-col :span="7">
+						<el-input v-model="upData.show" size="small" disabled></el-input>
+					</el-col>
+					<el-col :span="4" style="text-align: right;padding-right: 8px;">鐐瑰嚮閲�</el-col>
+					<el-col :span="7">
+						<el-input v-model="upData.click" size="small" disabled></el-input>
+					</el-col>
+				</el-row>
+				<el-row style="line-height: 50px;">
+					<el-col :span="4" style="text-align: right;padding-right: 8px;">璐︽埛娑堣垂</el-col>
+					<el-col :span="7">
+						<el-input v-model="upData.accountConsumption" size="small" disabled></el-input>
+					</el-col>
+					<el-col :span="4" style="text-align: right;padding-right: 8px;">瀹㈡埛杩旂偣娑堣垂</el-col>
+					<el-col :span="7">
+						<el-input v-model="upData.rebateConsumption" size="small" disabled></el-input>
+					</el-col>
+				</el-row>
+				<el-row style="line-height: 50px;">
+					<el-col :span="4" style="text-align: right;padding-right: 8px;">娑堣垂</el-col>
+					<el-col :span="7">
+						<el-input v-model="upData.consumption" size="small" disabled></el-input>
+					</el-col>
+					<el-col :span="4" style="text-align: right;padding-right: 8px;">鎶樺悗娑堣垂</el-col>
+					<el-col :span="7">
+						<el-input v-model="upData.discountedConsumption" size="small" disabled></el-input>
+					</el-col>
+				</el-row>
+				<el-row style="line-height: 50px;">
+					<el-col :span="4" style="text-align: right;padding-right: 8px;">杩涚矇</el-col>
+					<el-col :span="7">
+						<el-input v-model="upData.fansAdd" size="small" disabled></el-input>
+					</el-col>
+					<el-col :span="4" style="text-align: right;padding-right: 8px;">瀹為檯鎴愭湰</el-col>
+					<el-col :span="7">
+						<el-input v-model="upData.actualCost" size="small" disabled></el-input>
+					</el-col>
+				</el-row>
+				<el-row style="line-height: 50px;">
+					<el-col :span="4" style="text-align: right;padding-right: 8px;">鍒╂鼎</el-col>
+					<el-col :span="7">
+						<el-input v-model="upData.profit" size="small" disabled></el-input>
+					</el-col>
+					<el-col :span="4" style="text-align: right;padding-right: 8px;">浠g悊杩旂偣</el-col>
+					<el-col :span="7">
+						<el-input v-model="upData.agentRebate" size="small" disabled></el-input>
+					</el-col>
+				</el-row>
+				<el-row style="line-height: 50px;">
+					<el-col :span="4" style="text-align: right;padding-right: 8px;">鍐呴儴鎴愭湰</el-col>
+					<el-col :span="7">
+						<el-input v-model="upData.internalCosts" size="small"></el-input>
+					</el-col>
+					<el-col :span="4" style="text-align: right;padding-right: 8px;">瀹㈡埛鎴愭湰</el-col>
+					<el-col :span="7">
+						<el-input v-model="upData.customerCosts" size="small"></el-input>
+					</el-col>
+				</el-row>
+				<el-row style="line-height: 50px;">
+					<el-col :span="4" style="text-align: right;padding-right: 8px;">瀹㈡埛杩旂偣</el-col>
+					<el-col :span="7">
+						<el-input v-model="upData.customerRebate" size="small"></el-input>
+					</el-col>
+					<el-col :span="4" style="text-align: right;padding-right: 8px;">澶囩敤瀛楁</el-col>
+					<el-col :span="7">
+						<el-input v-model="upData.remark" size="small"></el-input>
+					</el-col>
+				</el-row>
+			</div>
+			<span slot="footer" class="dialog-footer" style="margin-right: 18px;">
+				<el-button type="primary" @click="saveUpData" :loading="upLoad">纭� 瀹�</el-button>
+				<el-button @click="upDia = false">鍙� 娑�</el-button>
+			</span>
+		</el-dialog>
+	</div>
+</template>
+
+<script>
+	import ValueTable from '../tool/value-table.vue'
+	export default {
+		components: {
+			ValueTable
+		},
+		data() {
+			return {
+				componentData: {
+					entity: {
+						updateTime: null,
+						registrant: null,
+						product: null,
+						orderBy: {
+							field: 'id',
+							order: 'desc'
+						}
+					},
+					isIndex: true,
+					showSelect: true,
+					select: true,
+					do: [{
+						font: '缂栬緫',
+						type: 'text',
+						method: 'upRole'
+					}],
+					tagField: {}
+				},
+				entityCopy: {},
+				upIndex: 0,
+				addDia: false,
+				upDia: false,
+				upLoad: false,
+				upData: {}
+			}
+		},
+		mounted() {
+			this.entityCopy = this.HaveJson(this.componentData.entity)
+		},
+		methods: {
+			refreshTable() {
+				this.$refs['ValueTable'].selectList()
+			},
+			refresh() {
+				this.componentData.entity = this.HaveJson(this.entityCopy)
+				this.upIndex++
+			},
+			upRole(row) {
+				this.upData = this.HaveJson(row)
+				this.upDia = true
+			},
+			saveUpData(){
+				this.upLoad = true
+				delete this.upData.createTime
+				delete this.upData.updateTime
+				delete this.upData.createUser
+				delete this.upData.updateUser
+				this.$axios.post(this.$api.dataReporting.upDataReporting, this.upData, {
+					headers: {
+						'Content-Type': 'application/json'
+					}
+				}).then(res=>{
+					this.upLoad = false
+					if(res.code == 201){
+						return
+					}
+					this.$message.success('淇敼鎴愬姛')
+					this.upDia = false
+					this.refreshTable()
+				})
+			}
+		}
+	}
+</script>
\ No newline at end of file
diff --git a/src/components/view/person-manage.vue b/src/components/view/person-manage.vue
index 289d313..89674b0 100644
--- a/src/components/view/person-manage.vue
+++ b/src/components/view/person-manage.vue
@@ -3,28 +3,36 @@
 		height: 60px;
 		line-height: 60px;
 	}
-	
-	.search{
+
+	.search {
 		background-color: #fff;
 		height: 80px;
 		display: flex;
 		align-items: center;
 	}
-	
-	.search_thing{
+
+	.search_thing {
 		width: 350px;
 		display: flex;
 		align-items: center;
 	}
-	
-	.search_label{
+
+	.search_label {
 		width: 110px;
 		font-size: 14px;
 		text-align: right;
 	}
-	
-	.search_input{
+
+	.search_input {
 		width: calc(100% - 110px);
+	}
+
+	.table {
+		margin-top: 10px;
+		background-color: #fff;
+		width: calc(100% - 40px);
+		height: calc(100% - 60px - 80px - 10px - 40px);
+		padding: 20px;
 	}
 </style>
 
@@ -34,20 +42,21 @@
 			<el-row class="title">
 				<el-col :span="12" style="padding-left: 20px;">浜哄憳绠$悊</el-col>
 				<el-col :span="12" style="text-align: right;">
-					<el-button size="medium" type="primary">鏂板浜哄憳</el-button>
+					<el-button size="medium" type="primary" @click="opeaAdd">鏂板浜哄憳</el-button>
 				</el-col>
 			</el-row>
 		</div>
 		<div class="search">
 			<div class="search_thing">
 				<div class="search_label">瀹㈡埛鍚嶇О锛�</div>
-				<div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="search.customer"></el-input></div>
+				<div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable
+						v-model="componentData.entity.name" @keyup.enter.native="refreshTable()"></el-input></div>
 			</div>
 			<div class="search_thing">
 				<div class="search_label">璐﹀彿鐘舵�侊細</div>
 				<div class="search_input">
-					<el-select size="small" v-model="search.state" style="width: 100%;">
-						<el-option label="鍏ㄩ儴" :value="2"></el-option>
+					<el-select size="small" v-model="componentData.entity.state" style="width: 100%;">
+						<el-option label="鍏ㄩ儴" :value="null"></el-option>
 						<el-option label="鍚敤" :value="1"></el-option>
 						<el-option label="鍋滅敤" :value="0"></el-option>
 					</el-select>
@@ -55,25 +64,100 @@
 			</div>
 			<div class="search_thing">
 				<div class="search_label">鍏徃鍚嶇О锛�</div>
-				<div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="search.company"></el-input></div>
+				<div class="search_input">
+					<el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="componentData.entity.company" @keyup.enter.native="refreshTable()"></el-input>
+				</div>
 			</div>
 			<div class="search_thing" style="padding-left: 30px;">
-				<el-button size="small">閲� 缃�</el-button>
-				<el-button size="small" type="primary">鏌� 璇�</el-button>
+				<el-button size="small" @click="refresh()">閲� 缃�</el-button>
+				<el-button size="small" type="primary" @click="refreshTable()">鏌� 璇�</el-button>
 			</div>
+		</div>
+		<div class="table">
+			<ValueTable ref="ValueTable" :url="$api.user.selectUserList" :upUrl="$api.user.updateUser" :componentData="componentData" :key="upIndex" @upUser="upUser"/>
 		</div>
 	</div>
 </template>
 
 <script>
-	export default{
+	import ValueTable from '../tool/value-table.vue'
+	export default {
+		components: {
+			ValueTable
+		},
 		data() {
-			return{
-				search: {
-					customer: null,
-					state: 2,
-					company: null
-				}
+			return {
+				componentData: {
+					entity: {
+						name: null,
+						state: null,
+						company: null,
+						orderBy:{
+							field: 'id',
+							order: 'asc'
+						}
+					},
+					isIndex: false,
+					showSelect: true,
+					select: true,
+					do: [{
+						id: 'update',
+						font: '缂栬緫',
+						type: 'text',
+						method: 'doDiy',
+						field:['createUserName','updateUserName','roleName','瑙掕壊=roleId','瀵嗙爜=password']
+					}],
+					tagField: {
+						state: {
+							select: [{
+								value: 1,
+								type: 'success',
+								label: '鍚敤'
+							},{
+								value: 0,
+								type: 'danger',
+								label: '鍋滅敤'
+							}]
+						},
+						roleId: {
+							select: []
+						}
+					}
+				},
+				entityCopy: {},
+				upIndex: 0,
+				addDia: false
+			}
+		},
+		mounted() {
+			this.selectRole()
+			this.entityCopy = this.HaveJson(this.componentData.entity)
+		},
+		methods: {
+			refreshTable() {
+				this.$refs['ValueTable'].selectList()
+			},
+			refresh() {
+				this.componentData.entity = this.HaveJson(this.entityCopy)
+				this.upIndex++
+			},
+			upUser(row){
+				console.log(row);
+			},
+			selectRole(){
+				this.$axios.get(this.$api.user.selectRoleList).then(res=>{
+					var str = []
+					res.data.forEach(a=>{
+						str.push({
+							label: a.name,
+							value: a.id
+						})
+					})
+					this.componentData.tagField.roleId.select = str
+				})
+			},
+			opeaAdd(){
+				this.$refs.ValueTable.openAddDia(this.$api.user.addUser);
 			}
 		}
 	}
diff --git a/src/components/view/role-manage.vue b/src/components/view/role-manage.vue
new file mode 100644
index 0000000..03dd0f3
--- /dev/null
+++ b/src/components/view/role-manage.vue
@@ -0,0 +1,129 @@
+<style scoped>
+	.title {
+		height: 60px;
+		line-height: 60px;
+	}
+
+	.search {
+		background-color: #fff;
+		height: 80px;
+		display: flex;
+		align-items: center;
+	}
+
+	.search_thing {
+		width: 350px;
+		display: flex;
+		align-items: center;
+	}
+
+	.search_label {
+		width: 110px;
+		font-size: 14px;
+		text-align: right;
+	}
+
+	.search_input {
+		width: calc(100% - 110px);
+	}
+
+	.table {
+		margin-top: 10px;
+		background-color: #fff;
+		width: calc(100% - 40px);
+		height: calc(100% - 60px - 80px - 10px - 40px);
+		padding: 20px;
+	}
+</style>
+
+<template>
+	<div class="role_manage">
+		<div>
+			<el-row class="title">
+				<el-col :span="12" style="padding-left: 20px;">瑙掕壊绠$悊</el-col>
+				<el-col :span="12" style="text-align: right;">
+					<el-button size="medium" type="primary" @click="opeaAdd">鏂板瑙掕壊</el-button>
+				</el-col>
+			</el-row>
+		</div>
+		<div class="search">
+			<div class="search_thing">
+				<div class="search_label">瑙掕壊鍚嶇О锛�</div>
+				<div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable
+						v-model="componentData.entity.name" @keyup.enter.native="refreshTable()"></el-input></div>
+			</div>
+			<div class="search_thing" style="padding-left: 30px;">
+				<el-button size="small" @click="refresh()">閲� 缃�</el-button>
+				<el-button size="small" type="primary" @click="refreshTable()">鏌� 璇�</el-button>
+			</div>
+		</div>
+		<div class="table">
+			<ValueTable ref="ValueTable" :url="$api.user.selectRoleLists" :delUrl="$api.user.delRole" :componentData="componentData" :key="upIndex"
+				@upRole="upRole" @selectRole="selectRole"/>
+		</div>
+	</div>
+</template>
+
+<script>
+	import ValueTable from '../tool/value-table.vue'
+	export default {
+		components: {
+			ValueTable
+		},
+		data() {
+			return {
+				componentData: {
+					entity: {
+						name: null,
+						orderBy: {
+							field: 'id',
+							order: 'asc'
+						}
+					},
+					isIndex: true,
+					showSelect: true,
+					select: true,
+					do: [{
+						font: '缂栬緫',
+						type: 'text',
+						method: 'upRole',
+					},{
+						id: 'delete',
+						font: '鍒犻櫎',
+						type: 'text',
+						method: 'doDiy',
+					},{
+						font: '鏌ョ湅',
+						type: 'text',
+						method: 'selectRole',
+					}],
+					tagField: {}
+				},
+				entityCopy: {},
+				upIndex: 0,
+				addDia: false
+			}
+		},
+		mounted() {
+			this.entityCopy = this.HaveJson(this.componentData.entity)
+		},
+		methods: {
+			refreshTable() {
+				this.$refs['ValueTable'].selectList()
+			},
+			refresh() {
+				this.componentData.entity = this.HaveJson(this.entityCopy)
+				this.upIndex++
+			},
+			upRole(row) {
+				console.log(row);
+			},
+			selectRole(row){
+				console.log(row);
+			},
+			opeaAdd() {
+
+			}
+		}
+	}
+</script>
\ No newline at end of file
diff --git a/src/main.js b/src/main.js
index a66b6be..e495279 100644
--- a/src/main.js
+++ b/src/main.js
@@ -56,6 +56,9 @@
 })
 
 axios.interceptors.response.use(res => {
+	if(res.data.code === 201){
+		Message.error(res.data.message)
+	}
 	return res.data
 }, async function(err) {
 	if (JSON.stringify(err).indexOf('timeout of') > -1) {
diff --git a/src/view/index.vue b/src/view/index.vue
index 4ba58ec..342b566 100644
--- a/src/view/index.vue
+++ b/src/view/index.vue
@@ -62,6 +62,16 @@
 		padding: 20px 0;
 		transition: .3s;
 		overflow-y: auto;
+		user-select: none;
+	}
+
+	.left::-webkit-scrollbar {
+		width: 0px;
+	}
+
+	.left::-webkit-scrollbar-thumb {
+		background-color: transparent;
+		border-radius: 3px;
 	}
 
 	.left .box {
@@ -87,8 +97,8 @@
 	}
 
 	.left .box i {
-		font-size: 32px;
-		margin-bottom: 8px;
+		font-size: 28px;
+		margin-bottom: 4px;
 	}
 
 	.left .box div {
@@ -177,6 +187,10 @@
 		user-select: none;
 		flex-shrink: 0;
 	}
+	
+	.tab:hover{
+		color: #3A7BFA;
+	}
 
 	.tab i {
 		font-size: 12px;
@@ -204,10 +218,36 @@
 		width: 100%;
 		height: 100%;
 	}
+
+	.right_key_menu {
+		width: 120px;
+		position: absolute;
+		top: 0;
+		left: 0;
+		display: none;
+		z-index: 999;
+	}
+
+	.right_key_menu li {
+		list-style-type: none;
+		padding: 5px 0;
+		padding-left: 10px;
+		font-size: 0.9rem;
+		transition: .5s;
+		cursor: pointer;
+	}
+	
+	.right_key_menu li i{
+		margin-right: 20px;
+	}
+
+	.right_key_menu li:hover {
+		background-color: #dedede;
+	}
 </style>
 <style></style>
 <template>
-	<div class="all">
+	<div class="all" @click="closeRightKey">
 		<div class="title">
 			<div class="logo">
 				<!-- <img src="../../static/img/logo 1.png" /> -->
@@ -244,7 +284,7 @@
 				<i :class="`${leftOpen?'el-icon-s-unfold':'el-icon-s-fold'}`" @click="leftOpen = !leftOpen"></i>
 				<div class="tabs">
 					<div :class="`tab ${tabActive == a.k ? 'active_tab' : ''}`" v-for="(a, ai) in tabs" :key="ai"
-						@click="upTabActive(a.k)">
+						@click="upTabActive(a.k)" @contextmenu.prevent="rightKeyMenu(ai, $event)">
 						{{ a.v }}
 						<i class="el-icon-close" @click="removeTab(ai)" v-if="tabActive!=0"></i>
 					</div>
@@ -252,10 +292,22 @@
 				<i class="el-icon-delete" @click="allDel" title="鍒犻櫎鎵�鏈夋爣绛鹃〉"></i>
 			</div>
 			<div class="component_view">
-				<component class="com_index" v-for="(com, index) in tabs" :is="com.u" :key="upIndex + '|' + index"
-					v-show="com.k == tabActive">
+				<component class="com_index" v-for="(com, index) in tabs" :is="com.u" :key="index"
+					v-show="com.k == tabActive" :ref="`com-${com.k}`">
 				</component>
 			</div>
+		</div>
+		<!-- 鍙抽敭鑿滃崟 -->
+		<div class="right_key_menu">
+			<el-col :span="24">
+				<el-card :body-style="{padding: '6px 0'}">
+					<ul>
+						<li style="color: red;" @click="removeTab(activeIndex)"><i class="el-icon-close"></i>鍏抽棴</li>
+						<el-divider></el-divider>
+						<li @click="refreshTable"><i class="el-icon-refresh"></i>鍒锋柊</li>
+					</ul>
+				</el-card>
+			</el-col>
 		</div>
 	</div>
 </template>
@@ -280,89 +332,93 @@
 				menu: [{
 						k: 0,
 						v: "棣栭〉",
-						i: "font icon-shouye",
+						i: "font icon-a-Group1124",
 						self: true,
 						c: [{
 							k: 0,
 							v: "棣栭〉",
-							i: "font icon-shouye",
+							i: "font icon-a-Group1124",
 							u: "index-index"
 						}]
 					},
 					{
 						k: 2,
 						v: "鏁版嵁涓婃姤",
-						i: "font icon-shouye",
+						i: "font icon-a-Group1124",
 						self: true,
 						c: [{
 							k: 2,
 							v: "鏁版嵁涓婃姤",
-							i: "font icon-shouye",
-							u: "index-index"
+							i: "font icon-a-Group1124",
+							u: "data-reporting"
 						}]
 					},
 					{
 						k: 3,
 						v: "鏁版嵁缁熻",
-						i: "font icon-shouye",
-						self: true,
+						i: "font icon-a-Group1124",
 						c: [{
-							k: 3,
-							v: "鏁版嵁缁熻",
-							i: "font icon-shouye",
+							k: 9,
+							v: "椤圭洰鏁版嵁缁熻",
+							i: "font icon-a-Group1124",
+							u: "index-index"
+						},{
+							k: 10,
+							v: "鍛樺伐鏁版嵁缁熻",
+							i: "font icon-a-Group1124",
 							u: "index-index"
 						}]
 					},
 					{
 						k: 5,
 						v: "杩涚矇涓婃姤",
-						i: "font icon-shouye",
+						i: "font icon-a-Group1124",
 						self: true,
 						c: [{
 							k: 5,
 							v: "杩涚矇涓婃姤",
-							i: "font icon-shouye",
+							i: "font icon-a-Group1124",
 							u: "index-index"
 						}]
 					},
 					{
 						k: 6,
 						v: "璐㈠姟涓婃姤",
-						i: "font icon-shouye",
+						i: "font icon-a-Group1124",
 						self: true,
 						c: [{
 							k: 6,
 							v: "璐㈠姟涓婃姤",
-							i: "font icon-shouye",
+							i: "font icon-a-Group1124",
 							u: "index-index"
 						}]
 					},
 					{
 						k: 7,
 						v: "瑙掕壊绠$悊",
-						i: "font icon-shouye",
+						i: "font icon-a-Group1124",
 						self: true,
 						c: [{
 							k: 7,
 							v: "瑙掕壊绠$悊",
-							i: "font icon-shouye",
-							u: "index-index"
+							i: "font icon-a-Group1124",
+							u: "role-manage"
 						}]
 					},
 					{
 						k: 4,
 						v: "鏁版嵁瀛楀吀",
-						i: "font icon-shouye",
+						i: "font icon-a-Group1124",
 						c: [{
 								k: 4,
 								v: "瀹㈡埛绠$悊",
-								i: "font icon-shouye",
+								i: "font icon-a-Group1124",
 								u: ""
 							},
 							{
 								k: 5,
 								v: "鐥呯绠$悊",
-								i: "font icon-shouye",
+								i: "font icon-a-Group1124",
 								u: ""
 							}
 						]
@@ -370,12 +426,12 @@
 					{
 						k: 8,
 						v: "浜哄憳绠$悊",
-						i: "font icon-shouye",
+						i: "font icon-a-Group1124",
 						self: true,
 						c: [{
 							k: 8,
 							v: "浜哄憳绠$悊",
-							i: "font icon-shouye",
+							i: "font icon-a-Group1124",
 							u: "person-manage"
 						}]
 					}
@@ -386,10 +442,11 @@
 				tabs: [{
 					k: 0,
 					v: "棣栭〉",
-					i: "font icon-shouye",
+					i: "font icon-a-Group1124",
 					u: "index-index"
 				}],
-				upIndex: 0
+				upIndex: 0,
+				activeIndex: 0
 			};
 		},
 		created() {},
@@ -425,7 +482,7 @@
 				this.tabs = [{
 					k: 0,
 					v: " 棣栭〉",
-					i: "font icon-shouye",
+					i: "font icon-a-Group1124",
 					u: "index-index"
 				}]
 			},
@@ -445,6 +502,31 @@
 				sessionStorage.clear();
 				localStorage.removeItem("autoenter");
 				this.$router.push("/enter");
+			},
+			// 鍏抽棴鍙抽敭鑿滃崟
+			closeRightKey() {
+				$('.right_key_menu').css({
+					'display': 'none'
+				})
+			},
+			// 鍙抽敭鑿滃崟
+			rightKeyMenu(id, e) {
+				if (id == 0) return
+				this.activeIndex = id
+				var x = e.clientX + 'px'
+				var y = e.clientY + 'px'
+				$('.right_key_menu').css({
+					'top': y,
+					'left': x,
+					'display': 'block'
+				})
+			},
+			// 鍒锋柊琛ㄦ牸鍐呭
+			refreshTable(){
+				var thing = this.tabs.splice(this.activeIndex, 1)
+				setTimeout(()=>{
+					this.tabs.splice(this.activeIndex, 0, thing[0])
+				}, 0)
 			}
 		}
 	};

--
Gitblit v1.9.3