meta.roles

This commit is contained in:
jiangrui 2021-07-28 12:36:40 +08:00
parent 08fd22dc73
commit d5fff4b1f8
13 changed files with 418 additions and 47 deletions

View File

@ -101,3 +101,16 @@ export function listForData(data) {
data
})
}
/**
* LeaderTv
* @param {*} data
* @returns
*/
export function leaderTVData(data) {
return request({
url: '/api/convenience/v2/services/app/statisticalData/leaderForTV',
method: 'post',
data
})
}

View File

@ -63,3 +63,16 @@ export function deleteResident(id) {
params: id
});
}
/**
* 居民信息删除
* @param {*} id
* @returns
*/
export function passwordUpdate(data) {
return request({
url: "/api/convenience/residentInformation/passwordUpdate",
method: "post",
data
});
}

View File

@ -12,3 +12,16 @@ export function statisticalData(data) {
data
})
}
/**
* 乡镇统计
* @param {*} data
* @returns
*/
export function townRanking(data) {
return request({
url: '/api/convenience/v2/services/app/statisticalData/townRanking',
method: 'get',
data
})
}

View File

@ -24,11 +24,11 @@ export default {
created() {
this.getList();
this.regionNames = this._regionNames;
console.log(233);
console.log(this.regionNames);
// console.log(233);
// console.log(this.regionNames);
},
mounted(){
console.log(244);
// console.log(244);
},
methods: {
getList() {

View File

@ -19,48 +19,80 @@
</template> -->
<!-- <div class="avatar-wrapper"> -->
<img :src="avatar" class="user-avatar">
<span>{{ name }}</span>
<el-button icon="el-icon-switch-button" type="text" style="margin-left:26px;margin-right:20px" @click.native="logout">退出登录</el-button>
<!-- <img :src="avatar" class="user-avatar" /> -->
<!-- <span>{{ name }}</span> -->
<!-- <el-button icon="el-icon-switch-button" type="text" style="margin-left:26px;margin-right:20px" @click.native="logout">退出登录</el-button> -->
<!-- <div><i ></i>退出登录</div> -->
<!-- <i class="el-icon-caret-bottom" /> -->
<!-- </div> -->
<!-- <el-dropdown class="avatar-container right-menu-item hover-effect" trigger="click">
<el-dropdown
class="avatar-container right-menu-item hover-effect"
trigger="click"
>
<div class="avatar-wrapper">
<img :src="avatar" class="user-avatar">
<img :src="avatar" class="user-avatar" />
<span>{{ name }}</span>
<i class="el-icon-caret-bottom" />
</div>
<el-dropdown-menu slot="dropdown">
<router-link to="/profile/index">
<el-dropdown-item>Profile</el-dropdown-item>
</router-link>
<router-link to="/">
<el-dropdown-item>Dashboard</el-dropdown-item>
</router-link>
<a target="_blank" href="https://github.com/PanJiaChen/vue-element-admin/">
<el-dropdown-item>Github</el-dropdown-item>
</a>
<a target="_blank" href="https://panjiachen.github.io/vue-element-admin-site/#/">
<el-dropdown-item>Docs</el-dropdown-item>
</a>
<el-dropdown-item @click.native="handleUpdate"
>修改密码</el-dropdown-item
>
<el-dropdown-item divided @click.native="logout">
<span style="display:block;">Log Out</span>
<span style="display:block;">退出登录</span>
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown> -->
</el-dropdown>
</div>
<el-dialog
title="修改密码"
:visible.sync="dialogPsw"
width="30%"
:close-on-click-modal="false"
:close-on-press-escape="false"
>
<el-form
ref="form"
:model="form"
status-icon
:rules="rules"
label-width="100px"
class="demo-ruleForm"
>
<el-form-item label="旧密码" prop="oldPassword">
<el-input
v-model="form.oldPassword"
type="password"
autocomplete="off"
/>
</el-form-item>
<el-form-item label="新密码" prop="newPassword">
<el-input
v-model="form.newPassword"
type="password"
autocomplete="off"
/>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogPsw = false"> </el-button>
<el-button type="primary" @click="modify"> </el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import { mapGetters } from 'vuex'
import Breadcrumb from '@/components/Breadcrumb'
import Hamburger from '@/components/Hamburger'
import ErrorLog from '@/components/ErrorLog'
import Screenfull from '@/components/Screenfull'
import SizeSelect from '@/components/SizeSelect'
import Search from '@/components/HeaderSearch'
import { mapGetters } from "vuex";
import Breadcrumb from "@/components/Breadcrumb";
import Hamburger from "@/components/Hamburger";
import ErrorLog from "@/components/ErrorLog";
import Screenfull from "@/components/Screenfull";
import SizeSelect from "@/components/SizeSelect";
import Search from "@/components/HeaderSearch";
import { passwordUpdate } from "@/api/residentInformation";
export default {
components: {
@ -71,19 +103,62 @@ export default {
SizeSelect,
Search
},
data() {
return {
dialogPsw: false,
form: {
oldPassword: "",
newPassword: ""
},
rules: {
oldPassword: [
{ required: true, trigger: "blur", message: "旧密码不能为空" }
],
newPassword: [
{ required: true, trigger: "blur", message: "新密码不能为空" }
]
}
};
},
computed: {
...mapGetters(['sidebar', 'avatar', 'device', 'name'])
...mapGetters(["sidebar", "avatar", "device", "name"])
},
methods: {
toggleSideBar() {
this.$store.dispatch('app/toggleSideBar')
this.$store.dispatch("app/toggleSideBar");
},
handleUpdate() {
this.dialogPsw = true;
// console.log(sessionStorage.getItem('staffId'));
this.$nextTick(() => {
this.$refs.form.clearValidate();
});
this.form = {
oldPassword: "",
newPassword: ""
};
},
modify() {
// console.log(this.form);
this.$refs.form.validate(valid => {
if (valid) {
passwordUpdate(this.form).then(res => {
// console.log(res);
if (res.c === 200) {
this.dialogPsw = false;
this.$notify.success("修改密码成功,请重新登录");
this.logout();
}
});
}
});
},
async logout() {
await this.$store.dispatch('user/logout')
this.$router.push(`/login?redirect=${this.$route.fullPath}`)
await this.$store.dispatch("user/logout");
this.$router.push(`/login?redirect=${this.$route.fullPath}`);
}
}
}
};
</script>
<style lang="scss" scoped>
@ -158,6 +233,8 @@ export default {
.avatar-wrapper {
margin-top: 5px;
position: relative;
display: flex;
align-items: center;
.user-avatar {
cursor: pointer;
@ -170,7 +247,7 @@ export default {
cursor: pointer;
position: absolute;
right: -20px;
top: 25px;
top: 18px;
font-size: 12px;
}
}

View File

@ -65,6 +65,9 @@ export default {
.icon_menu_jmInfo {
background: url("./img/icon_jmInfo.png") no-repeat;
}
.icon_menu_townRanking {
background: url("./img/icon_twonRanking.png") no-repeat;
}
.sub-el-icon {
color: currentColor;
width: 1em;

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@ -217,7 +217,31 @@ export const constantRoutes = [
hidden: true
}
]
},
{
path: "/townRanking",
component: Layout,
name: "TownRanking",
redirect: "/townRanking/index",
meta: {
title: "乡镇办件统计",
icon: "townRanking"
},
hidden: false,
children: [
{
path: "list",
component: () => import("@/views/townRanking/index"),
name: "TownRanking",
meta: {
title: "乡镇办件统计",
icon: "townRanking",
affix: true,
parentTitle: "乡镇办件统计"
}
}
]
},
// {
// path: "/staff",
// component: Layout,

View File

@ -8,7 +8,7 @@ import { errorCodeMap } from "@/utils/index";
const service = axios.create({
baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
// withCredentials: true, // send cookies when cross-domain requests
timeout: 5000 // request timeout
timeout: 10000 // request timeout
});
// request interceptor

View File

@ -17,6 +17,7 @@
>
<span v-has="'WORKORDER_ADMIN'">
当前区域<el-cascader
ref="regionRef"
class="filter-item"
v-model="regionSearchVal"
style="width:240px"
@ -26,6 +27,15 @@
@change="handleRegionChange"
/>
</span>
<span v-has="'WORKORDER_ADMIN'">
<el-button
type="primary"
style="border-radius:21px;margin-left:10px;margin-right:10px"
@click="handleExport"
>
导出当前区域办结数据
</el-button>
</span>
<span style="float:right"
>更新时间{{ new Date() | parseTime("{y}-{m}-{d} {h}:00:00") }}</span
></el-col
@ -119,7 +129,7 @@
<div style="flex:1">
<p>
受理人{{
item.residentInformation && item.firstResponsiblePerson.name
item.firstResponsiblePerson && item.firstResponsiblePerson.name
}}
</p>
</div>
@ -152,6 +162,23 @@
> -->
</span>
</el-dialog>
<el-dialog title="选择导出时间段" :visible.sync="dialogExport" width="20%">
<el-date-picker
v-model="dates"
type="daterange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
value-format="timestamp"
@change="handleDateChange"
>
</el-date-picker>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogExport = false"> </el-button>
<el-button type="primary" @click="exportExcel" :loading="exportLoading"> </el-button>
</span>
</el-dialog>
<!-- handleExport -->
</div>
</template>
@ -162,7 +189,8 @@ import { parseTime } from "@/utils";
import { getRegions } from "@/api/region";
import { statisticalData } from "@/api/statisticalData";
import { mapGetters } from "vuex";
import { listForData } from "@/api/convenience";
import { listForData, leaderTVData } from "@/api/convenience";
import { isArray } from "@/utils/validate";
export default {
data() {
@ -172,6 +200,12 @@ export default {
residentInformationId: undefined,
eventTypeId: undefined
},
excelListQuery: {
isAll: true,
regionIds: undefined,
start: undefined,
end: undefined
},
statisticalData: undefined,
checkStrictly: false,
regionSearchVal: undefined,
@ -182,7 +216,11 @@ export default {
convenienceList: [],
timers: undefined,
timersInterval: undefined,
listLoading: false
listLoading: false,
dialogExport: false,
dates: undefined,
// originRegion: undefined,
exportLoading:false
};
},
components: {
@ -244,6 +282,7 @@ export default {
this.getRegions();
this.regionSearchVal = this.regionIds;
this.listQuery.regionIds = this.regionIds;
this.excelListQuery.regionIds = this.regionIds;
},
methods: {
// handleSetLineChartData(type) {
@ -349,6 +388,7 @@ export default {
handleRegionChange(val) {
// console.log(val);
this.listQuery.regionIds = val.join(",");
this.excelListQuery.regionIds = val.join(",");
this.getStatisticalData();
},
showDetail(key) {
@ -504,6 +544,108 @@ export default {
});
this.dialogTitle = key;
this.dialogDetail = true;
},
handleExport() {
this.dialogExport = true;
},
exportExcel() {
const that = this;
import("@/vendor/Export2Excel").then(excel => {
const tHeader = ["姓名", "办结数量", "未办结数量"];
const filterVal = ["name", "num", "notFinishNum"];
this.exportLoading = true
leaderTVData(that.excelListQuery).then(res => {
setTimeout(() => {
this.exportLoading = false
}, 3000);
const data = that.formatJson(filterVal, res.d.leaderboard);
// console.log(data);
const selectRegionLabel = that.$refs['regionRef'].getCheckedNodes()[0].pathLabels.join(',')
excel.export_json_to_excel({
header: tHeader,
data: data,
// filename: `${that.regions[0].label}-${new Date(
// this.excelListQuery.start
// )}-${new Date(this.excelListQuery.end)}-`
filename: `${selectRegionLabel +
"-" +
(that.dates
? new Date(that.excelListQuery.start*1000).toLocaleDateString() +
"-" +
new Date(that.excelListQuery.end*1000).toLocaleDateString()
: "") +
"办事数量统计"}`
});
});
});
},
formatJson(filterVal, jsonData) {
return jsonData.map(v =>
filterVal.map(j => {
let value;
if (j === "status") {
value = this.$options.filters["statusFilter"](v[j]);
} else {
value = v[j];
}
// if (!value && value !== 0) value = "N/A";
return value;
})
);
},
// dateFormatTime(date) {
// if (date != null) {
// this.listQuery.start = Date.parse(date[0]) / 1000;
// this.listQuery.end = Date.parse(date[1]) / 1000;
// } else {
// this.listQuery.start = undefined;
// this.listQuery.end = undefined;
// }
// },
handleDateChange(val) {
// console.log(val);
if (val != null) {
this.excelListQuery.start = this.dates[0]/1000;
this.excelListQuery.end = this.dates[1]/1000;
} else {
this.excelListQuery.start = undefined;
this.excelListQuery.end = undefined;
}
},
getRegionsText() {
let tempLen;
if (Array.isArray(this.regionSearchVal)) {
tempLen = this.regionSearchVal.length;
} else {
tempLen = this.regionSearchVal.split(",").length;
}
// const tempLen = this.regionSearchVal.split(",").length;
// console.log(tempLen);
// this.regionSearchVal = [];
// this.staffQuery.regionIds = this.regionIds;
// switch (tempLen) {
// case 1:
// console.log(1);
// console.log(this.regions[tempLen-1].label);
// // this.regionSearchVal.push(this.regionIds, false);
// // console.log(this.regionSearchVal);
// break;
// case 2:
// console.log(2);
// console.log(this.regions[tempLen-1].label);
// // this.regionSearchVal.push(this.regionIds, false);
// // console.log(this.regionSearchVal);
// break;
// case 3:
// console.log(3);
// // this.regionSearchVal.push(this.regionIds);
// break;
// default:
// // this.regionSearchVal = [];
// break;
// }
}
}
};

View File

@ -54,7 +54,22 @@
/>
</el-form-item>
<el-form-item prop="captcha">
<el-form-item prop="username">
<span class="svg-container">
<svg-icon icon-class="lock" />
</span>
<el-input
ref="password"
v-model="loginForm.captcha"
placeholder="请输入密码"
name="captcha"
type="password"
tabindex="2"
autocomplete="on"
/>
</el-form-item>
<!-- <el-form-item prop="captcha">
<span class="svg-container">
<svg-icon icon-class="email" />
</span>
@ -66,8 +81,8 @@
tabindex="2"
@keyup.enter.native="handleLogin"
/>
<!-- style="width:290px" -->
<!-- <el-button @click="handleSms">获取验证码</el-button> -->
style="width:290px"
<el-button @click="handleSms">获取验证码</el-button>
<button
class="btn_getCode"
type="button"
@ -76,7 +91,7 @@
>
{{ codeText }}
</button>
</el-form-item>
</el-form-item> -->
<el-button
:loading="loading"
@ -126,12 +141,12 @@ export default {
// password: '111111'
// },
loginForm: {
username: "", //18882564006
captcha: "",
username: process.env.NODE_ENV==='development'?"18882564006":'', //18882564006
captcha: process.env.NODE_ENV==='development'?"111111":'',
// username: "18882564006", //18882564006
// captcha: "111111",
appVersion: "1.0.0",
system: "IOS",
system: "PC",
device: navigator.userAgent,
extra: ""
},
@ -167,6 +182,7 @@ export default {
}
},
created() {
// console.log(process.env.NODE_ENV);
// window.addEventListener('storage', this.afterQRScan)
const { appVersion, system, device, extra } = this.loginForm;
const payload = {

View File

@ -224,6 +224,18 @@
<el-input v-model="residentInfo.sort" />
</el-form-item>
<el-form-item label="所属">
<el-select v-model="residentInfo.organizationAttribution" clearable placeholder="所属">
<el-option
v-for="item in organizationAttributionList"
:key="item"
:label="item"
:value="item"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="行政区域" prop="regionIds">
<el-cascader
v-model="residentInfo.regionIds"
@ -341,6 +353,7 @@ export default {
dialogStatus: "",
list: [],
regions: [],
organizationAttributionList: ["卫生院", "派出所"],
rules: {
name: [
{ required: true, message: "居民姓名不能为空", trigger: "blur" }

View File

@ -0,0 +1,57 @@
<template>
<div class="app-container" style="padding-top:15px">
<el-table :data="list" style="width: 100%" border v-loading="listLoading">
<el-table-column label="排名" type="index" width="50" align="center">
<template slot-scope="scope">
<span :style="scope.$index===0?'color:red':scope.$index===1?'color:red':scope.$index===2?'color:red':''">{{ scope.$index + 1 }}</span>
</template>
</el-table-column>
<el-table-column prop="name" label="乡镇名称">
<template slot-scope="scope">
{{ scope.row.townName }}
</template>
</el-table-column>
<el-table-column prop="name" label="总办件量">
<template slot-scope="scope">
{{ scope.row.allNum }}
</template>
</el-table-column>
<el-table-column prop="name" label="已办结量">
<template slot-scope="scope">
{{ scope.row.finishNum }}
</template>
</el-table-column>
<el-table-column prop="name" label="未办结量">
<template slot-scope="scope">
{{ scope.row.notFinishNum }}
</template>
</el-table-column>
</el-table>
</div>
</template>
<script>
import { townRanking } from "@/api/statisticalData";
export default {
data() {
return {
list: [],
listLoading: false
};
},
created() {
this.getDataList();
},
methods: {
getDataList() {
this.listLoading = true;
townRanking().then(res => {
this.list = res.d;
this.listLoading = false;
});
}
}
};
</script>
<style></style>