d34b3850 by renchao@pashanhoo.com

feat:合并dev分支

1 parent f1e91b9e
Showing 59 changed files with 275 additions and 2876 deletions
###
# @Description:
# @Autor: renchao
# @LastEditTime: 2023-05-12 13:23:31
###
# just a flag
ENV = 'development'
NODE_ENV=development
......@@ -5,4 +10,4 @@ NODE_ENV=development
VUE_APP_BASE_API = '/api'
# 开发环境
VUE_APP_API_BASE_URL = 'http://192.168.2.38:8027'
VUE_APP_API_BASE_URL = 'http://192.168.2.89:8027'
......
<!--
* @Description:
* @Autor: renchao
* @LastEditTime: 2023-04-06 11:03:47
* @LastEditTime: 2023-05-11 17:24:44
-->
## Git 贡献提交规范
- `feat` 增加新功能
......@@ -21,8 +21,6 @@
## config说明
{
"TITLE": "汉中市数据上报系统",
"THEME": "sb",
"LOGIN": "", { 登录页配置 }
"CODE": "BDCJGPT", {"BDCSBPT":上报: "BDCJGPT":监管}
"SERVERAPI": "/bdcsjsb",
"AREARMAP": "610702", // {"610702","632701"}
......
{
"TITLE": "汉中市监管系统",
"THEME": "jg",
"LOGIN": "jg",
"CODE": "BDCJGPT",
"AREARMAP": "610702",
"XZQ": "汉中市",
"SERVERAPI": "/bdcsjsb",
"calcHeight": 200,
"echartTextColor": "#FFFFFF",
......
{
"TITLE": "汉中市数据上报系统",
"THEME": "sb",
"LOGIN": "sb",
"CODE": "BDCSBPT",
"AREARMAP": "610702",
"SERVERAPI": "/bdcsjsb",
"calcHeight": 160,
"echartTextColor": "#4A4A4A",
"MANAGEMENTAPI": "http://192.168.2.38:8090/management",
"IPCONFIG": "http://192.168.2.38:8027"
}
\ No newline at end of file
{
"TITLE": "玉树州监管系统",
"THEME": "jg",
"LOGIN": "jg",
"CODE": "BDCJGPT",
"AREARMAP": "632701",
"XZQ": "玉树州",
"SERVERAPI": "/bdcsjsb",
"calcHeight": 200,
"echartTextColor": "#FFFFFF",
......
{
"TITLE": "玉树州数据上报系统",
"THEME": "sb",
"LOGIN": "sb",
"CODE": "BDCSBPT",
"AREARMAP": "632701",
"SERVERAPI": "/bdcsjsb",
"calcHeight": 160,
"echartTextColor": "#4A4A4A",
"MANAGEMENTAPI": "http://192.168.2.38:8090/management",
"IPCONFIG": "http://192.168.2.38:8027"
}
\ No newline at end of file
{
"TITLE": "汉中市数据上报系统",
"THEME": "sb",
"LOGIN": "sb",
"CODE": "BDCSBPT",
"TITLE": "汉中市监管系统",
"CODE": "BDCJGPT",
"AREARMAP": "610702",
"XZQ": "汉中市",
"SERVERAPI": "/bdcsjsb",
"calcHeight": 160,
"echartTextColor": "#4A4A4A",
"MANAGEMENTAPI": "http://192.168.2.38:8090/management",
"IPCONFIG": "http://192.168.2.38:8027"
"calcHeight": 200,
"echartTextColor": "#FFFFFF",
"MANAGEMENTAPI": "http://192.168.2.38:8090/management"
}
\ No newline at end of file
......
<!--
* @Description: 引入配置文件
* @Autor: renchao
* @LastEditTime: 2023-05-06 10:24:57
* @LastEditTime: 2023-05-08 15:02:53
-->
<!DOCTYPE html>
<html>
......
/*
* @Description:
* @Autor: renchao
* @LastEditTime: 2023-05-06 16:25:08
*/
import request from '@/utils/request'
let SERVER = window.config ? window.config : JSON.parse(localStorage.getItem('ApiUrl'))
/* 引入配置 */
const urlHeader = SERVER.SERVERAPI + '/rest/sjsb/DataReport/storage'
/**
* @description: xml导入
* @param {*} data
* @author: renchao
*/
export function storage (data) {
return request({
url: urlHeader,
headers: {
'Content-Type': 'multipart/form-data'
},
method: 'post',
data
})
}
\ No newline at end of file
/*
* @Description:
* @Autor: renchao
* @LastEditTime: 2023-03-23 17:19:52
* @LastEditTime: 2023-05-08 15:03:10
*/
import request from "@/utils/request";
let SERVER = window.config ? window.config : JSON.parse(localStorage.getItem('ApiUrl'))
......
/*
* @Description: 干部查询
* @Autor:
* @LastEditTime:
*/
/* 引入axios请求文件 */
import request from '@/utils/request'
/* 引入配置 */
let SERVER = window.config ? window.config : JSON.parse(localStorage.getItem('ApiUrl'))
const urlHeader = SERVER.SERVERAPI + '/rest/searchRecord'
/**
* @description: 获取列表
* @param {*}
* @author:
*/
export function getSearchRecordList (data) {
return request({
url: urlHeader + '/getList',
method: 'post',
data
})
}
/**
* @description: 新增
* @param {*} data
* @author:
*/
export function saveSearchRecord (data) {
return request({
url: urlHeader + '/search',
method: 'post',
data
})
}
.obligee-item {
display: flex;
height: 100%;
margin-bottom: 15px;
margin-right: 5px;
&-name {
display: flex;
align-items: center;
justify-content: center;
width: 20px;
padding: 10px 20px;
line-height: 28px;
border: 1px solid #ccc;
border-radius: 3px;
margin-left: 10px;
}
&-list {
width: 100%;
flex: 1;
display: flex;
justify-content: center;
flex-direction: column;
}
}
\ No newline at end of file
......
......@@ -116,22 +116,22 @@
</div>
</template>
<script>
import djfDjSz from "@/api/djfDjSz";
import ruleMixin from "@/mixins/ruleMixin.js";
// 缮证信息
export default {
import djfDjSz from "@/api/djfDjSz";
import ruleMixin from "@/mixins/ruleMixin.js";
// 缮证信息
export default {
mixins: [ruleMixin],
props: {
bsmSjsb: {
type: String,
default: "",
default: ""
},
bsmYwsjb: {
type: String,
default: "",
default: ""
},
},
data() {
data () {
return {
certificateInfo: {
ruleForm: [
......@@ -144,14 +144,14 @@ export default {
SZRY: "",
SZSJ: "",
BZ: "",
QXDM: "",
},
],
},
};
QXDM: ""
}
]
}
}
},
methods: {
async featchData() {
async featchData () {
try {
let { result: res } = await djfDjSz.getDjfDjSzById(this.bsmSjsb);
this.certificateInfo.ruleForm = res;
......@@ -160,7 +160,7 @@ export default {
this.$refs.msg.messageShow();
}
},
handleUpdateForm() {
handleUpdateForm () {
return new Promise(async (resolve) => {
try {
let res = await djfDjSz.updateDjfDjSz(this.certificateInfo.ruleForm);
......@@ -169,39 +169,14 @@ export default {
} catch (error) {
this.$refs.msg.messageShow();
}
});
},
},
};
</script>
<style scoped lang="scss">
@import "./css/itemForm.scss";
.obligee-item {
display: flex;
height: 100%;
margin-bottom: 15px;
margin-right: 5px;
&-name {
display: flex;
align-items: center;
justify-content: center;
width: 20px;
padding: 10px 20px;
line-height: 28px;
border: 1px solid #ccc;
border-radius: 3px;
})
}
&-list {
width: 100%;
flex: 1;
display: flex;
justify-content: center;
flex-direction: column;
}
}
}
</script>
<style scoped lang="scss">
@import "./css/itemForm.scss";
</style>
......
<template>
<div class="houseFloor itemForm">
<el-form :model="ruleForm" :rules="rules" ref="formList" label-width="121px" :key="key">
<div v-for="(item, index) in ruleForm" :key="index" class="obligee-item">
<p class="obligee-item-name">层信息{{ index + 1 }}</p>
<div class="obligee-item-list">
<el-row>
<el-col :span="8">
<el-form-item prop="YSDM">
......@@ -8,7 +11,7 @@
要素代码: <br />
<p class="label-detail">(YSDM)</p>
</span>
<el-input :disabled="$store.state.business.Edit" v-model="ruleForm.ysdm"></el-input>
<el-input :disabled="$store.state.business.Edit" v-model="ruleForm[index].ysdm"></el-input>
</el-form-item>
</el-col>
......@@ -18,7 +21,7 @@
层号: <br />
<p class="label-detail">(CH)</p>
</span>
<el-input :disabled="$store.state.business.Edit" v-model="ruleForm.ch"></el-input>
<el-input :disabled="$store.state.business.Edit" v-model="ruleForm[index].ch"></el-input>
</el-form-item>
</el-col>
......@@ -28,7 +31,7 @@
自然幢号: <br />
<p class="label-detail">(ZRZH)</p>
</span>
<el-input :disabled="$store.state.business.Edit" v-model="ruleForm.zrzh"></el-input>
<el-input :disabled="$store.state.business.Edit" v-model="ruleForm[index].zrzh"></el-input>
</el-form-item>
</el-col>
</el-row>
......@@ -40,7 +43,7 @@
实际层: <br />
<p class="label-detail">(SJC)</p>
</span>
<el-input :disabled="$store.state.business.Edit" v-model="ruleForm.sjc"></el-input>
<el-input :disabled="$store.state.business.Edit" v-model="ruleForm[index].sjc"></el-input>
</el-form-item>
</el-col>
......@@ -50,7 +53,7 @@
名义层: <br />
<p class="label-detail">(MYC)</p>
</span>
<el-input :disabled="$store.state.business.Edit" v-model="ruleForm.myc"></el-input>
<el-input :disabled="$store.state.business.Edit" v-model="ruleForm[index].myc"></el-input>
</el-form-item>
</el-col>
......@@ -62,7 +65,7 @@
</span>
<el-input-number controls-position="right" :disabled="$store.state.business.Edit"
v-only-number="{ max: 999999999999999, min: 0, precision: 3 }" title="" type="number"
v-model.number="ruleForm.cjzmj"></el-input-number>
v-model.number="ruleForm[index].cjzmj"></el-input-number>
</el-form-item>
</el-col>
</el-row>
......@@ -76,7 +79,7 @@
</span>
<el-input-number controls-position="right" :disabled="$store.state.business.Edit"
v-only-number="{ max: 999999999999999, min: 0, precision: 3 }" title="" type="number"
v-model.number="ruleForm.ctnjzmj"></el-input-number>
v-model.number="ruleForm[index].ctnjzmj"></el-input-number>
</el-form-item>
</el-col>
......@@ -88,7 +91,7 @@
</span>
<el-input-number controls-position="right" :disabled="$store.state.business.Edit"
v-only-number="{ max: 999999999999999, min: 0, precision: 3 }" title="" type="number"
v-model.number="ruleForm.cytmj"></el-input-number>
v-model.number="ruleForm[index].cytmj"></el-input-number>
</el-form-item>
</el-col>
......@@ -100,7 +103,7 @@
</span>
<el-input-number controls-position="right" :disabled="$store.state.business.Edit"
v-only-number="{ max: 999999999999999, min: 0, precision: 3 }" title="" type="number"
v-model.number="ruleForm.cgyjzmj"></el-input-number>
v-model.number="ruleForm[index].cgyjzmj"></el-input-number>
</el-form-item>
</el-col>
</el-row>
......@@ -114,7 +117,7 @@
</span>
<el-input-number controls-position="right" :disabled="$store.state.business.Edit"
v-only-number="{ max: 999999999999999, min: 0, precision: 3 }" title="" type="number"
v-model.number="ruleForm.cftjzmj"></el-input-number>
v-model.number="ruleForm[index].cftjzmj"></el-input-number>
</el-form-item>
</el-col>
......@@ -126,7 +129,7 @@
</span>
<el-input-number controls-position="right" :disabled="$store.state.business.Edit"
v-only-number="{ max: 999999999999999, min: 0, precision: 3 }" title="" type="number"
v-model.number="ruleForm.cbqmj"></el-input-number>
v-model.number="ruleForm[index].cbqmj"></el-input-number>
</el-form-item>
</el-col>
......@@ -137,7 +140,7 @@
<p class="label-detail">(CG)</p>
</span>
<el-input-number controls-position="right" :disabled="$store.state.business.Edit"
v-only-number="{ max: 999999999999999, min: 0, precision: 3 }" title="" type="number" v-model.number="ruleForm.cg">
v-only-number="{ max: 999999999999999, min: 0, precision: 3 }" title="" type="number" v-model.number="ruleForm[index].cg">
</el-input-number>
</el-form-item>
</el-col>
......@@ -152,7 +155,7 @@
</span>
<el-input-number controls-position="right" :disabled="$store.state.business.Edit"
v-only-number="{ max: 999999999999999, min: 0, precision: 3 }" title="" type="number"
v-model.number="ruleForm.sptymj"></el-input-number>
v-model.number="ruleForm[index].sptymj"></el-input-number>
</el-form-item>
</el-col>
......@@ -162,33 +165,36 @@
区县代码: <br />
<p class="label-detail">(QXDM)</p>
</span>
<el-input :disabled="$store.state.business.Edit" v-model="ruleForm.qxdm"></el-input>
<el-input :disabled="$store.state.business.Edit" v-model="ruleForm[index].qxdm"></el-input>
</el-form-item>
</el-col>
</el-row>
</div>
</div>
</el-form>
<message-tips ref="msg" />
</div>
</template>
<script>
// 层信息
import kttFwC from "@/api/kttFwC";
import ruleMixin from "@/mixins/ruleMixin.js";
export default {
// 层信息
import kttFwC from "@/api/kttFwC";
import ruleMixin from "@/mixins/ruleMixin.js";
export default {
mixins: [ruleMixin],
props: {
bsmSjsb: {
type: String,
default: "",
default: ""
},
bsmYwsjb: {
type: String,
default: "",
default: ""
},
},
data() {
data () {
return {
ruleForm: {
ruleForm: [{
YSDM: "",
CH: "",
ZRZH: "",
......@@ -202,36 +208,36 @@ export default {
CBQMJ: "",
CG: "",
SPTYMJ: "",
QXDM: "",
},
};
QXDM: ""
}]
}
},
methods: {
async featchData() {
async featchData () {
try {
let { result: res } = await kttFwC.getKttFwCById(this.bsmSjsb);
this.ruleForm = res;
//this.featchRule()
} catch (error) {
this.$refs.msg.messageShow();
this.$refs.msg.messageShow()
}
},
handleUpdateForm() {
handleUpdateForm () {
return new Promise(async (resolve, reject) => {
try {
let res = await kttFwC.updateKttFwC(this.ruleForm);
// this.$refs['formList'].resetFields();
resolve(res.code);
} catch (error) {
this.$refs.msg.messageShow();
this.$refs.msg.messageShow()
}
});
},
},
};
})
}
}
};
</script>
<style scoped lang="scss">
@import "./css/itemForm.scss";
@import "./css/itemForm.scss";
</style>
......
......@@ -315,10 +315,10 @@
</div>
</template>
<script>
// 自然幢
import kttFwZrz from "@/api/kttFwZrz";
import ruleMixin from "@/mixins/ruleMixin.js";
export default {
// 自然幢
import kttFwZrz from "@/api/kttFwZrz";
import ruleMixin from "@/mixins/ruleMixin.js";
export default {
mixins: [ruleMixin],
props: {
bsmSjsb: {
......@@ -387,12 +387,12 @@ export default {
});
},
},
};
};
</script>
<style scoped lang="scss">
@import "./css/itemForm.scss";
@import "./css/itemForm.scss";
.naturalBuilding {
.naturalBuilding {
.naturalBuilding-item {
display: flex;
height: 100%;
......@@ -409,6 +409,7 @@ export default {
border: 1px solid #ccc;
margin-right: 15px;
border-radius: 3px;
margin-left: 10px;
}
.naturalBuilding-list {
......@@ -420,7 +421,7 @@ export default {
.bsm {
white-space: nowrap;
}
}
}
</style>
......
......@@ -139,32 +139,6 @@ export default {
</script>
<style scoped lang="scss">
@import "./css/itemForm.scss";
.obligee-item {
display: flex;
height: 100%;
margin-bottom: 15px;
margin-right: 5px;
&-name {
display: flex;
align-items: center;
justify-content: center;
width: 20px;
padding: 10px 20px;
line-height: 28px;
border: 1px solid #ccc;
border-radius: 3px;
}
&-list {
width: 100%;
flex: 1;
display: flex;
justify-content: center;
flex-direction: column;
}
}
</style>
......
......@@ -447,32 +447,6 @@
</script>
<style scoped lang="scss">
@import "./css/itemForm.scss";
.obligee-item {
display: flex;
height: 100%;
margin-bottom: 15px;
margin-right: 5px;
&-name {
display: flex;
align-items: center;
justify-content: center;
width: 20px;
padding: 10px 20px;
line-height: 28px;
border: 1px solid #ccc;
border-radius: 3px;
}
&-list {
width: 100%;
flex: 1;
display: flex;
justify-content: center;
flex-direction: column;
}
}
</style>
......
......@@ -129,8 +129,8 @@
</template>
<script>
import axios from "axios";
import Vue from 'vue'
import axios from "axios";
const urlHeader = Vue.prototype.BASE_API.SERVERAPI + '/rest/sjsb/DataReport/'
import { mapGetters } from "vuex";
import JsonEditor from "@/components/JsonEditor.vue";
......
<!--
* @Description: log
* @Autor: renchao
* @LastEditTime: 2023-03-23 16:29:12
* @LastEditTime: 2023-05-12 09:27:35
-->
<template>
<el-menu router :default-active="activeMenu" mode="horizontal">
<!-- 权限菜单 -->
<sidebar-item v-for="route in permission_routes.slice(4, 7)" :key="route.path" :item="route"
<sidebar-item v-for="route in permission_routes.slice(3, 6)" :key="route.path" :item="route"
:base-path="route.path" />
<!-- 菜单全部展示 -->
<!-- <sidebar-item v-for="route in asyncRoutes" :key="route.path" :item="route" :base-path="route.path" /> -->
......
......@@ -2,14 +2,14 @@
* @Author: xiaomiao 1158771342@qq.com
* @Date: 2023-01-10 09:03:06
* @LastEditors: Please set LastEditors
* @LastEditTime: 2023-03-23 16:29:24
* @LastEditTime: 2023-05-12 09:27:42
* @FilePath: \监管系统\js-web-jianguan\src\layout\components\Sidebar\sidebarRight.vue
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
-->
<template>
<el-menu router :default-active="activeMenu" mode="horizontal">
<!-- 权限菜单 -->
<sidebar-item v-for="route in permission_routes.slice(7, 10)" :key="route.path" :item="route"
<sidebar-item v-for="route in permission_routes.slice(6, 9)" :key="route.path" :item="route"
:base-path="route.path" />
<!-- 菜单全部展示 -->
<!-- <sidebar-item v-for="route in asyncRoutes" :key="route.path" :item="route" :base-path="route.path" /> -->
......
<!--
* @Description:
* @Autor: renchao
* @LastEditTime: 2023-03-28 10:12:27
-->
<template>
<transition name="fade-transform" mode="out-in">
<router-view />
</transition>
</template>
<script>
export default {
name: 'AppMain',
computed: {
key () {
return this.$route.path
}
}
}
</script>
<!--面包屑 -->
<template>
<el-breadcrumb class="app-breadcrumb" separator="/">
<transition-group name="breadcrumb">
<el-breadcrumb-item v-for="(item, index) in levelList" :key="item.path">
<span class="no-redirect">当前位置></span>
<!-- <svg-icon v-if="item.meta.icon" :icon-class="item.meta.icon" class="breadcrumbIcon" /> -->
<span v-if="item.redirect === 'noRedirect' || index == levelList.length - 1" class="no-redirect">{{
item.meta.title
}}</span>
<a v-else @click.prevent="handleLink(item)">{{ item.meta.title }}</a>
</el-breadcrumb-item>
</transition-group>
</el-breadcrumb>
</template>
<script>
import pathToRegexp from 'path-to-regexp'
export default {
data () {
return {
levelList: null
}
},
watch: {
$route (route) {
// if you go to the redirect page, do not update the breadcrumbs
if (route.path.startsWith('/redirect/')) {
return
}
this.getBreadcrumb()
}
},
created () {
this.getBreadcrumb()
},
methods: {
getBreadcrumb () {
// only show routes with meta.title
let matched = this.$route.matched.filter(item => item.meta && item.meta.title)
const first = matched[0]
if (!this.isDashboard(first)) {
matched = matched
}
this.levelList = matched.filter(item => item.meta && item.meta.title && item.meta.breadcrumb !== false)
},
isDashboard (route) {
const name = route && route.name
if (!name) {
return false
}
return name.trim().toLocaleLowerCase() === 'Dashboard'.toLocaleLowerCase()
},
pathCompile (path) {
const { params } = this.$route
var toPath = pathToRegexp.compile(path)
return toPath(params)
},
handleLink (item) {
const { redirect, path } = item
if (redirect) {
this.$router.push(redirect)
return
}
this.$router.push(this.pathCompile(path))
}
}
}
</script>
<style lang="scss" scoped>
.app-breadcrumb.el-breadcrumb {
display: inline-block;
font-size: 14px;
line-height: 50px;
margin-left: 8px;
.no-redirect {
color: #ffffff;
cursor: text;
font-size: 16px;
}
.breadcrumbIcon {
color: #ffffff;
margin-right: 5px;
width: 16px;
height: 16px;
}
}
</style>
<template>
<div class="navbar-con">
<div class="navbar">
<div class="logo">
<img :src="require('@/image/bdclogo.png')" alt="" />
<h4>{{ BASE_API.TITLE }}</h4>
</div>
<div class="right-menu">
<div class="user">
{{ userName }}
<span @click="onCancel">
<i class="el-icon-switch-button"></i>
</span>
</div>
</div>
</div>
</div>
</template>
<script>
import { mapGetters } from 'vuex'
import Breadcrumb from './Breadcrumb'
import { logout } from "@/api/login.js";
export default {
components: {
Breadcrumb
},
computed: {
...mapGetters(["userInfo"]),
userName () {
return this.userInfo ? this.userInfo.name : ""
}
},
methods: {
handleDataView () {
const { href } = this.$router.resolve('/dataView');
window.open(href, '_blank');
},
themeChange (val) {
this.$store.dispatch('app/updateTheme', val)
},
onCancel () {
logout()
.then((res) => {
sessionStorage.removeItem("token");
this.$store.dispatch("user/resetState");
this.$store.dispatch("permission/resetRoutes");
this.$router.replace({
path: "/sb"
})
})
.catch((error) => {
// console.dir(error);
})
}
}
}
</script>
<style lang="scss" scoped>
@import "~@/styles/_handle.scss";
.navbar-con {
position: relative;
.logo {
color: #fff;
font-size: 26px;
font-weight: 700;
display: flex;
margin-left: 15px;
img {
width: 47px;
height: 47px;
}
h4 {
margin-left: 20px;
height: 50px;
line-height: 50px;
}
}
}
.navbar {
height: $headerHeight;
overflow: hidden;
position: relative;
@include background("navbg");
display: flex;
align-items: center;
padding-right: 20px;
justify-content: space-between;
.header-logo {
width: 300px;
}
.right-menu-item {
&.hover-effect {
cursor: pointer;
transition: background 0.3s;
display: flex;
align-items: center;
}
}
}
</style>
export default {
computed: {
device() {
return this.$store.state.app.device
}
},
mounted() {
// In order to fix the click on menu on the ios device will trigger the mouseleave bug
// https://github.com/PanJiaChen/vue-element-admin/issues/1135
this.fixBugIniOS()
},
methods: {
fixBugIniOS() {
const $subMenu = this.$refs.subMenu
if ($subMenu) {
const handleMouseleave = $subMenu.handleMouseleave
$subMenu.handleMouseleave = (e) => {
if (this.device === 'mobile') {
return
}
handleMouseleave(e)
}
}
}
}
}
<!--
* @Description:
* @Autor: renchao
* @LastEditTime: 2023-03-22 11:19:04
-->
<script>
export default {
name: 'MenuItem',
functional: true,
props: {
icon: {
type: String,
default: ''
},
title: {
type: String,
default: ''
}
},
render (h, context) {
const { icon, title } = context.props
const vnodes = []
if (icon) {
if (icon.includes('el-icon')) {
vnodes.push(<i class={[icon, 'sub-el-icon']} />)
} else {
vnodes.push(<svg-icon icon-class={icon} />)
}
}
if (title) {
vnodes.push(<span slot='title'>{(title)}</span>)
}
return vnodes
}
}
</script>
<template>
<component :is="type" v-bind="linkProps(to)">
<slot />
</component>
</template>
<script>
import { isExternal } from '@/utils/validate'
export default {
props: {
to: {
type: String,
required: true
}
},
computed: {
isExternal() {
return isExternal(this.to)
},
type() {
if (this.isExternal) {
return 'a'
}
return 'router-link'
}
},
methods: {
linkProps(to) {
if (this.isExternal) {
return {
href: to,
target: '_blank',
rel: 'noopener'
}
}
return {
to: to
}
}
}
}
</script>
<template>
<div class="sidebar-logo-container" :class="{ 'collapse': collapse }">
<transition name="sidebarLogoFade">
<router-link v-if="collapse" key="collapse" class="sidebar-logo-link" to="/">
<img v-if="logo" :src="logo" class="sidebar-logo">
<h1 v-else class="sidebar-title">
{{ title }}
</h1>
</router-link>
<router-link v-else key="expand" class="sidebar-logo-link" to="/">
<h1 class="sidebar-title">
{{ title }}
</h1>
</router-link>
</transition>
</div>
</template>
<script>
import defaultSettings from '@/settings'
const { title } = defaultSettings
export default {
name: 'SidebarLogo',
props: {
collapse: {
type: Boolean,
required: true
}
},
data () {
return {
title: title,
}
}
}
</script>
<style lang="scss" scoped>
.sidebarLogoFade-enter-active {
transition: opacity 1.5s;
}
.sidebarLogoFade-enter,
.sidebarLogoFade-leave-to {
opacity: 0;
}
.sidebar-logo-container {
position: relative;
width: 100%;
text-align: center;
overflow: hidden;
height: 100px;
& .sidebar-logo-link {
height: 100%;
width: 100%;
& .sidebar-logo {
width: 41px;
height: 39px;
vertical-align: middle;
// margin-left: 47px;
// margin-right: 48px;
margin-top: 22px;
}
& .sidebar-title {
margin: 0;
margin-top: 10px;
margin-bottom: 20px;
color: #fff;
font-weight: 600;
line-height: 25px;
font-size: 16px;
font-family: Avenir, Helvetica Neue, Arial, Helvetica, sans-serif;
vertical-align: middle;
}
}
&.collapse {
.sidebar-logo {
margin-right: 0px;
width: 32.8px;
height: 31.2px;
}
}
}
</style>
<!--
* @Description:
* @Autor: renchao
* @LastEditTime: 2023-03-30 10:39:40
-->
<template>
<div v-if="!item.hidden">
<template
v-if="hasOneShowingChild(item.children, item) && (!onlyOneChild.children || onlyOneChild.noShowingChildren)">
<app-link v-if="onlyOneChild.meta" :to="resolvePath(onlyOneChild.path)">
<el-menu-item :index="resolvePath(onlyOneChild.path)" :class="{ 'submenu-title-noDropdown': !isNest }">
<item :icon="onlyOneChild.meta.icon || (item.meta && item.meta.icon)" :title="onlyOneChild.meta.title"
class="menu-icon" />
</el-menu-item>
</app-link>
</template>
<el-submenu v-else ref="subMenu" :index="resolvePath(item.path)" popper-append-to-body>
<template slot="title">
<item v-if="item.meta" :icon="item.meta && item.meta.icon" :title="item.meta.title" />
</template>
<sidebar-item v-for="child in item.children" :key="child.path" :is-nest="true" :item="child"
:base-path="resolvePath(child.path)" class="nest-menu" />
</el-submenu>
</div>
</template>
<script>
import path from 'path'
import { isExternal } from '@/utils/validate'
import Item from './Item'
import AppLink from './Link'
import FixiOSBug from './FixiOSBug'
export default {
name: 'SidebarItem',
components: { Item, AppLink },
mixins: [FixiOSBug],
props: {
// route object
item: {
type: Object,
required: true
},
isNest: {
type: Boolean,
default: false
},
basePath: {
type: String,
default: ''
}
},
data () {
// To fix https://github.com/PanJiaChen/vue-admin-template/issues/237
// TODO: refactor with render function
this.onlyOneChild = null
return {}
},
methods: {
hasOneShowingChild (children = [], parent) {
const showingChildren = children.filter(item => {
if (item.hidden) {
return false
} else {
// Temp set(will be used if only has one showing child)
this.onlyOneChild = item
return true
}
})
// When there is only one child router, the child router is displayed by default
if (showingChildren.length >= 1 && (showingChildren[0].path == 'ywjr' || showingChildren[0].path == "sbbwcx" || showingChildren[0].path == "dbrzcx")) {
return true
}
// Show parent if there are no child router to display
if (showingChildren.length === 0) {
this.onlyOneChild = { ...parent, path: '', noShowingChildren: true }
return true
}
return false
},
resolvePath (routePath) {
if (isExternal(routePath)) {
return routePath
}
if (isExternal(this.basePath)) {
return this.basePath
}
return path.resolve(this.basePath, routePath)
}
}
}
</script>
<!--
* @Description:
* @Autor: renchao
* @LastEditTime: 2023-03-27 14:09:57
-->
<template>
<div>
<el-scrollbar wrap-class="scrollbar-wrapper">
<el-menu router :default-active="activeMenu" :background-color="variables.menuBg" :text-color="variables.menuText"
:unique-opened="true" :active-text-color="variables.menuActiveText" :collapse-transition="false" mode="vertical">
<!-- 权限菜单 -->
<sidebar-item v-for="route in permission_routes.slice(5)" :key="route.path" :item="route"
:base-path="route.path" />
<!-- 菜单全部展示 -->
<!-- <sidebar-item v-for="route in asyncRoutes" :key="route.path" :item="route" :base-path="route.path" /> -->
</el-menu>
</el-scrollbar>
</div>
</template>
<script>
import { mapGetters } from 'vuex'
import Logo from './Logo'
import defaultSettings from '@/settings'
import SidebarItem from './SidebarItem'
import variables from '@/styles/variables.scss'
import { asyncRoutes } from '@/router'
export default {
components: { SidebarItem, Logo },
data () {
return {
title: defaultSettings.title
}
},
computed: {
...mapGetters(['permission_routes', 'sidebar']),
activeMenu () {
const route = this.$route
const { meta, path } = route
if (meta.activeMenu) {
return meta.activeMenu
}
return path
},
variables () {
return variables
},
asyncRoutes () {
return asyncRoutes
}
}
}
</script>
<template>
<el-scrollbar ref="scrollContainer" :vertical="false" class="scroll-container" @wheel.native.prevent="handleScroll">
<slot />
</el-scrollbar>
</template>
<script>
const tagAndTagSpacing = 4 // tagAndTagSpacing
export default {
name: 'ScrollPane',
data () {
return {
left: 0
}
},
computed: {
scrollWrapper () {
return this.$refs.scrollContainer.$refs.wrap
}
},
mounted () {
this.scrollWrapper.addEventListener('scroll', this.emitScroll, true)
},
beforeDestroy () {
this.scrollWrapper.removeEventListener('scroll', this.emitScroll)
},
methods: {
handleScroll (e) {
const eventDelta = e.wheelDelta || -e.deltaY * 40
const $scrollWrapper = this.scrollWrapper
$scrollWrapper.scrollLeft = $scrollWrapper.scrollLeft + eventDelta / 4
},
emitScroll () {
this.$emit('scroll')
},
moveToTarget (currentTag) {
const $container = this.$refs.scrollContainer.$el
const $containerWidth = $container.offsetWidth
const $scrollWrapper = this.scrollWrapper
const tagList = this.$parent.$refs.tag
let firstTag = null
let lastTag = null
// find first tag and last tag
if (tagList.length > 0) {
firstTag = tagList[0]
lastTag = tagList[tagList.length - 1]
}
if (firstTag === currentTag) {
$scrollWrapper.scrollLeft = 0
} else if (lastTag === currentTag) {
$scrollWrapper.scrollLeft = $scrollWrapper.scrollWidth - $containerWidth
} else {
// find preTag and nextTag
const currentIndex = tagList.findIndex(item => item === currentTag)
const prevTag = tagList[currentIndex - 1]
const nextTag = tagList[currentIndex + 1]
// the tag's offsetLeft after of nextTag
const afterNextTagOffsetLeft = nextTag.$el.offsetLeft + nextTag.$el.offsetWidth + tagAndTagSpacing
// the tag's offsetLeft before of prevTag
const beforePrevTagOffsetLeft = prevTag.$el.offsetLeft - tagAndTagSpacing
if (afterNextTagOffsetLeft > $scrollWrapper.scrollLeft + $containerWidth) {
$scrollWrapper.scrollLeft = afterNextTagOffsetLeft - $containerWidth
} else if (beforePrevTagOffsetLeft < $scrollWrapper.scrollLeft) {
$scrollWrapper.scrollLeft = beforePrevTagOffsetLeft
}
}
}
}
}
</script>
<style lang="scss" scoped>
.scroll-container {
white-space: nowrap;
position: relative;
overflow: hidden;
width: 100%;
height: 100%;
}
/deep/ .el-scrollbar__view {
display: inline-block !important;
}
/deep/ .el-scrollbar__wrap {
overflow-x: hidden !important;
}
</style>
<template>
<div id="tags-view-container" class="tags-view-container">
<scroll-pane ref="scrollPane" class="tags-view-wrapper" @scroll="handleScroll">
<router-link v-for="tag in visitedViews" ref="tag" :key="tag.path" :class="isActive(tag) ? 'active' : ''"
:to="{ path: tag.path, query: tag.query, fullPath: tag.fullPath }" tag="span" class="tags-view-item"
@click.middle.native="!isAffix(tag) ? closeSelectedTag(tag) : ''"
@contextmenu.prevent.native="openMenu(tag, $event)">
{{ tag.title }}
<span v-if="!isAffix(tag)" class="el-icon-close" @click.prevent.stop="closeSelectedTag(tag)" />
</router-link>
</scroll-pane>
<ul v-show="visible" :style="{ left: left + 'px', top: top + 'px' }" class="contextmenu">
<li v-if="!isAffix(selectedTag)" @click="closeSelectedTag(selectedTag)">关闭</li>
<li @click="closeOthersTags">关闭其他</li>
<li @click="closeAllTags(selectedTag)">关闭全部</li>
</ul>
</div>
</template>
<script>
import ScrollPane from './ScrollPane'
import path from 'path'
export default {
components: { ScrollPane },
data () {
return {
visible: false,
top: 0,
left: 0,
selectedTag: {},
affixTags: []
}
},
computed: {
visitedViews () {
return this.$store.state.tagsView.visitedViews.slice(1)
},
routes () {
return this.$store.state.permission.routes
}
},
watch: {
$route () {
this.addTags()
this.moveToCurrentTag()
},
visible (value) {
if (value) {
document.body.addEventListener('click', this.closeMenu)
} else {
document.body.removeEventListener('click', this.closeMenu)
}
}
},
mounted () {
this.initTags()
this.addTags()
},
methods: {
isActive (route) {
return route.path === this.$route.path
},
isAffix (tag) {
return tag.meta && tag.meta.affix
},
filterAffixTags (routes, basePath = '/') {
let tags = []
routes.forEach(route => {
if (route.meta && route.meta.affix) {
const tagPath = path.resolve(basePath, route.path)
tags.push({
fullPath: tagPath,
path: tagPath,
name: route.name,
meta: { ...route.meta }
})
}
if (route.children) {
const tempTags = this.filterAffixTags(route.children, route.path)
if (tempTags.length >= 1) {
tags = [...tags, ...tempTags]
}
}
})
return tags
},
initTags () {
const affixTags = this.affixTags = this.filterAffixTags(this.routes)
for (const tag of affixTags) {
// Must have tag name
if (tag.name) {
this.$store.dispatch('tagsView/addVisitedView', tag)
}
}
},
addTags () {
const { name } = this.$route
if (name) {
this.$store.dispatch('tagsView/addView', this.$route)
}
return false
},
moveToCurrentTag () {
const tags = this.$refs.tag
this.$nextTick(() => {
for (const tag of tags) {
if (tag.to.path === this.$route.path) {
this.$refs.scrollPane.moveToTarget(tag)
// when query is different then update
if (tag.to.fullPath !== this.$route.fullPath) {
this.$store.dispatch('tagsView/updateVisitedView', this.$route)
}
break
}
}
})
},
refreshSelectedTag (view) {
this.$store.dispatch('tagsView/delCachedView', view).then(() => {
const { fullPath } = view
this.$nextTick(() => {
this.$router.replace({
path: '/redirect' + fullPath
})
})
})
},
closeSelectedTag (view) {
this.$store.dispatch('tagsView/delView', view).then(({ visitedViews }) => {
if (this.isActive(view)) {
this.toLastView(visitedViews, view)
}
})
},
closeOthersTags () {
this.$router.push(this.selectedTag)
this.$store.dispatch('tagsView/delOthersViews', this.selectedTag).then(() => {
this.moveToCurrentTag()
})
},
closeAllTags (view) {
this.$store.dispatch('tagsView/delAllViews').then(({ visitedViews }) => {
if (this.affixTags.some(tag => tag.path === view.path)) {
return
}
this.toLastView(visitedViews, view)
})
},
toLastView (visitedViews, view) {
const latestView = visitedViews.slice(-1)[0]
if (latestView) {
this.$router.push(latestView.fullPath)
} else {
// now the default is to redirect to the home page if there is no tags-view,
// you can adjust it according to your needs.
if (view.name === 'Dashboard') {
// to reload home page
this.$router.replace({ path: '/redirect' + view.fullPath })
} else {
this.$router.push('/')
}
}
},
openMenu (tag, e) {
const menuMinWidth = 105
const offsetLeft = this.$el.getBoundingClientRect().left - 210 // container margin left
const offsetWidth = this.$el.offsetWidth // container width
const maxLeft = offsetWidth - menuMinWidth // left boundary
const left = e.clientX - offsetLeft + 15 // 15: margin right
if (left > maxLeft) {
this.left = maxLeft
} else {
this.left = left
}
this.top = e.clientY
this.visible = true
this.selectedTag = tag
},
closeMenu () {
this.visible = false
},
handleScroll () {
this.closeMenu()
}
}
}
</script>
<style lang="scss" scoped>
@import "~@/styles/_handle.scss";
.tags-view-container {
height: 50px;
width: 100%;
background: #fff;
border-bottom: 1px solid #d8dce5;
box-sizing: border-box;
padding-top: 7px;
margin-bottom: 10px;
border-radius: 4px;
.tags-view-wrapper {
.tags-view-item {
display: inline-block;
position: relative;
cursor: pointer;
line-height: 26px;
color: #4A4A4A;
@include font_color("tagsText");
padding: 0 8px;
font-size: 12px;
margin-left: 5px;
margin-top: 4px;
border-radius: 4px;
@include borderColor("tagsBorderColor");
&:first-of-type {
margin-left: 15px;
}
&:last-of-type {
margin-right: 15px;
}
&.active {
@include background("tagsBg");
@include borderColor("tagsActiveText");
@include font_color("tagsActiveText");
&::before {
content: '';
@include background("tagsActiveText");
display: inline-block;
width: 8px;
height: 8px;
border-radius: 50%;
position: relative;
margin-right: 2px;
}
}
}
}
.contextmenu {
margin: 0;
background: #fff;
z-index: 3000;
position: absolute;
list-style-type: none;
padding: 5px 0;
border-radius: 4px;
font-size: 12px;
font-weight: 400;
color: #333;
box-shadow: 2px 2px 3px 0 rgba(0, 0, 0, .3);
li {
margin: 0;
padding: 7px 16px;
cursor: pointer;
&:hover {
background: #eee;
}
}
}
}
</style>
<style lang="scss">
//reset element css of el-icon-close
.tags-view-wrapper {
.tags-view-item {
.el-icon-close {
width: 16px;
height: 16px;
vertical-align: 2px;
border-radius: 50%;
text-align: center;
transition: all .3s cubic-bezier(.645, .045, .355, 1);
transform-origin: 100% 50%;
&:before {
transform: scale(.6);
display: inline-block;
vertical-align: -3px;
}
&:hover {
background-color: #b4bccc;
color: #fff;
}
}
}
}
</style>
export { default as AppMain } from './AppMain'
export { default as Navbar } from './Navbar'
export { default as Sidebar } from './Sidebar/index.vue'
export { default as TagsView } from './TagsView/index.vue'
<!--
* @Description:
* @Autor: renchao
* @LastEditTime: 2023-04-03 10:12:39
-->
<template>
<div class="app-wrapper">
<navbar />
<div class="main-container">
<sidebar class="sidebar-container" />
<div class="app-content">
<tags-view v-if="needTagsView" />
<app-main />
</div>
</div>
</div>
</template>
<script>
import { AppMain, Navbar, Sidebar, TagsView } from './components'
import ResizeMixin from './mixin/ResizeHandler'
import { mapState } from 'vuex'
export default {
name: 'Layout',
components: {
AppMain,
Navbar,
Sidebar,
TagsView
},
mixins: [ResizeMixin],
created () {
this.$store.dispatch("products/setData", "BDCSBPT");
},
computed: {
...mapState({
sidebar: state => state.app.sidebar,
needTagsView: state => state.settings.tagsView,
fixedHeader: state => state.settings.fixedHeader
})
}
}
</script>
<style lang="scss">
@import "~@/styles/mixin.scss";
@import "~@/styles/sbSidebar.scss";
.app-wrapper {
@include clearfix;
position: relative;
height: 100%;
width: 100%;
// background-color: $containerbg;
padding: 0;
&.mobile.openSidebar {
position: fixed;
top: 0;
}
}
.drawer-bg {
background: #000;
opacity: 0.3;
width: 100%;
top: 0;
height: 100%;
position: absolute;
z-index: 999;
}
.fixed-header {
width: 100%;
transition: width 0.28s;
}
.app-content {
overflow: hidden;
box-sizing: border-box;
flex: 1;
width: 100%;
background: #EAEBF0;
padding: 10px;
}
</style>
import store from '@/store'
const { body } = document
const WIDTH = 992 // refer to Bootstrap's responsive design
export default {
watch: {
$route(route) {
if (this.device === 'mobile' && this.sidebar.opened) {
store.dispatch('app/closeSideBar', { withoutAnimation: false })
}
}
},
beforeMount() {
window.addEventListener('resize', this.$_resizeHandler)
},
beforeDestroy() {
window.removeEventListener('resize', this.$_resizeHandler)
},
mounted() {
const isMobile = this.$_isMobile()
if (isMobile) {
store.dispatch('app/toggleDevice', 'mobile')
store.dispatch('app/closeSideBar', { withoutAnimation: true })
}
},
methods: {
// use $_ for mixins properties
// https://vuejs.org/v2/style-guide/index.html#Private-property-names-essential
$_isMobile() {
const rect = body.getBoundingClientRect()
return rect.width - 1 < WIDTH
},
$_resizeHandler() {
if (!document.hidden) {
const isMobile = this.$_isMobile()
store.dispatch('app/toggleDevice', isMobile ? 'mobile' : 'desktop')
if (isMobile) {
store.dispatch('app/closeSideBar', { withoutAnimation: true })
}
}
}
}
}
......@@ -2,7 +2,7 @@
* @Author: yangwei
* @Date: 2023-01-16 09:10:12
* @LastEditors: Please set LastEditors
* @LastEditTime: 2023-04-27 17:07:58
* @LastEditTime: 2023-05-08 15:03:06
* @FilePath: \bdcjg-web\src\main.js
* @Description:
*
......
/*
* @Description:
* @Autor: renchao
* @LastEditTime: 2023-04-12 11:15:57
* @LastEditTime: 2023-05-12 10:26:11
*/
import Vue from 'vue'
import router from "./router";
......@@ -20,7 +20,7 @@ router.beforeEach(async (to, from, next) => {
let hasAddDict = store.state.dict.addDict;
let hasUser = store.state.user.hasUser;
let hasAddRoute = store.state.permission.addRoutes;
if (to.path == "/sb" || to.path == "/jg" || to.path == "/sb1") {
if (to.path == "/login") {
localStorage.removeItem("token");
next();
} else {
......@@ -49,7 +49,7 @@ router.beforeEach(async (to, from, next) => {
{ path: "*", redirect: "/404", hidden: true },
]);
const routeTo = Cookies.get("routerTo");
if (routeTo && routeTo !== "/" && routeTo !== "/sb" && routeTo !== "/jg") {
if (routeTo && routeTo !== "/" && routeTo !== "/login") {
next({ ...to, replace: true });
} else {
next();
......@@ -57,7 +57,7 @@ router.beforeEach(async (to, from, next) => {
}
} else {
next(`/${Vue.prototype.BASE_API.LOGIN}`);
next('/login');
}
}
NProgress.done();
......@@ -66,4 +66,4 @@ router.afterEach((to) => {
// 解决刷新页面报404问题
Cookies.set("routerTo", to.fullPath);
NProgress.done();
});
})
......
......@@ -20,19 +20,14 @@ export const constantRoutes = [
},
//登录
{
path: "/jg",
name: "loginjg",
component: () => import("@/views/loginjg/index.vue"),
},
{
path: "/sb",
name: "loginsb",
component: () => import("@/views/loginsb/index.vue"),
path: "/login",
name: "login",
component: () => import("@/views/login/index.vue"),
},
{
path: '/',
redirect: to => {
return { path: `/${Vue.prototype.BASE_API.LOGIN}` }
return { path: '/login' }
},
},
// 监管首页
......@@ -55,22 +50,22 @@ export const constantRoutes = [
* the routes that need to be dynamically loaded based on user roles
*/
export const asyncRoutes = [
// 接收报文查询
// 区县接入
{
path: '/jsbwcx',
component: Layout,
children: [
{
path: 'index',
// {
// path: 'xxcx',
// component: () => import('@/views/gbxxcx/index'),
// name: 'xxcx',
// meta: { title: '信息查询', icon: 'xxcx' }
// },
{
path: 'qxjr',
component: () => import('@/views/jsbwcx/index'),
name: 'jsbwcx',
name: 'qxjr',
meta: { title: '区县接入', icon: 'zsgl' }
},
{
path: 'gbxxcx',
component: () => import('@/views/gbxxcx/index'),
name: 'gbxxcx',
meta: { title: '信息查询', icon: 'zsgl' }
}
]
},
......@@ -110,6 +105,24 @@ export const asyncRoutes = [
component: () => import('@/views/jktj/bsxljk/index'),
name: 'jktj',
meta: { title: '办事效率监控', icon: 'zhcx' }
},
{
path: 'dataReceiveQuality',
component: () => import('@/views/jktj/dataReceiveQuality/index'),
name: 'dataReceiveQuality',
meta: { title: '接入质量评价表', icon: 'dataReceiveQuality' }
},
{
path: 'nullTermRatio',
component: () => import('@/views/jktj/nullTermRatio/index'),
name: 'nullTermRatio',
meta: { title: '相关字段空置率统计', icon: 'nullTermRatio' }
},
{
path: 'registerBookQuality',
component: () => import('@/views/jktj/registerBookQuality/index'),
name: 'registerBookQuality',
meta: { title: '登簿质量评价表', icon: 'registerBookQuality' }
}
]
},
......@@ -260,7 +273,7 @@ export const asyncRoutes = [
meta: { title: '角色管理' }
}
]
},
}
]
const createRouter = () =>
......
......@@ -26,12 +26,7 @@ const mutations = {
const actions = {
// 添加全部菜单
generateRoutes ({ commit }, getMenuInfo) {
let Layout;
if (Vue.prototype.BASE_API.THEME == 'sb') {
Layout = r => require.ensure([], () => r(require(`@/layout1`)))
} else {
Layout = r => require.ensure([], () => r(require(`@/layout`)))
}
let Layout = r => require.ensure([], () => r(require(`@/layout`)))
function asyncRouter (routers) {
routers.forEach(item => {
if (!item.children) {
......
@import "~@/styles/_handle.scss";
// cover some element-ui styles
.el-breadcrumb__inner,
.el-breadcrumb__inner a {
font-weight: 400 !important;
color: #686666;
}
.el-table .cell {
line-height: 16px;
}
//input
.el-input__inner {
color: #FFFFFF !important;
padding: 0 7px !important;
}
// input 样式
// 全局css 加上以下代码,可以隐藏上下箭头
// 取消input的上下箭头
input::-webkit-inner-spin-button {
-webkit-appearance: none !important;
}
input::-webkit-outer-spin-button {
-webkit-appearance: none !important;
}
input[type="number"] {
-moz-appearance: textfield;
}
.el-upload {
input[type="file"] {
display: none !important;
}
}
.el-upload__input {
display: none;
}
.cell {
.el-tag {
margin-right: 0px;
}
}
.small-padding {
.cell {
padding-left: 5px;
padding-right: 5px;
}
}
.fixed-width {
.el-button--mini {
padding: 7px 10px;
min-width: 60px;
}
}
.status-col {
.cell {
padding: 0 10px;
text-align: center;
.el-tag {
margin-right: 0px;
}
}
}
.el-icon-date,
.el-icon-time {
display: none;
}
// to fixed https://github.com/ElemeFE/element/issues/2461
// refine element ui upload
.el-input.is-disabled .el-input__inner {
background-color: transparent !important;
}
.upload-container {
.el-upload {
width: 100%;
.el-upload-dragger {
width: 100%;
height: 200px;
}
}
}
// dropdown
.el-dropdown-menu {
a {
display: block
}
}
// fix date-picker ui bug in filter-item
.el-range-editor.el-input__inner {
display: inline-flex !important;
}
// to fix el-date-picker css style
.el-range-separator {
box-sizing: content-box;
}
.el-submenu__icon-arrow {
margin-top: -5px;
}
// element 样式补丁
.el-menu--horizontal {
border-bottom: none !important;
}
.el-radio-group {
.el-radio-button__inner {
height: 36px;
line-height: 36px;
padding: 0 20px;
font-size: 14px;
}
.el-radio-button:first-child {
border-radius: 4px 0 0 4px;
}
.el-radio-button:last-child {
border-radius: 0 4px 4px 0;
}
}
.el-tabs__item:focus.is-active.is-focus:not(:active) {
box-shadow: none !important;
}
// Divider 分割线 样式的修改
.el-divider--horizontal {
margin: 10px 0 !important;
}
.el-row {
margin-bottom: 0 !important;
}
// form
.el-form-item__content {
margin-left: 0 !important;
}
.el-icon-full-screen,
.el-icon-rank {
cursor: pointer;
}
// 表格样式
.el-table th {
height: 48px !important;
font-size: 14px;
color: #4A4A4A;
}
.el-pagination.is-background .btn-prev,
.el-pagination.is-background .btn-next,
.el-pagination.is-background .el-pager li {
@include borderColor("pagBorderColor");
background-color: #FFFFFF;
@include font_color("pagText");
}
.el-pagination.is-background .el-pager li:not(.disabled).active {
@include background("pagBg");
border-radius: 4px;
@include font_color("pagActiveText");
@include borderColor("pagActiveText");
}
.el-table__header th {
background-color: #F1F3F7 !important;
}
.el-table tr td {
font-size: 14px;
color: #7A7A7A;
}
.lb-table .el-table {
border-bottom: none;
border-radius: 4px 4px 0 0;
}
.el-upload-list__item.is-success:focus:not(:hover) .el-icon-close-tip {
display: none !important
}
.el-message-box__btns {
display: flex;
flex-direction: row-reverse;
}
.el-message-box__btns .el-button--primary {
margin-right: 10px;
}
.el-form-item__content {
flex: 1;
}
\ No newline at end of file
@import "~@/styles/_handle.scss";
.main-container {
width: 100%;
height: calc(100% - 74px);
transition: margin-left 0.28s;
display: flex;
}
.el-form-item__content {
margin-left: 0 !important;
}
.sidebar-container {
transition: width 0.28s;
width: $sideBarWidth !important;
font-size: 0px;
@include background_color("menuBg");
.horizontal-collapse-transition {
transition: 0s width ease-in-out, 0s padding-left ease-in-out,
0s padding-right ease-in-out;
}
.el-scrollbar {
height: 100%;
}
.scrollbar-wrapper {
overflow-x: hidden !important;
margin-right: 0 !important;
&::-webkit-scrollbar {
display: none;
}
}
a {
display: inline-block;
width: 100%;
overflow: hidden;
}
.svg-icon {
margin-right: 5px;
}
.sub-el-icon {
margin-right: 12px;
margin-left: -2px;
}
.el-menu {
background-color: transparent !important;
border: none;
@include font_color("menuText");
height: 100%;
width: 100% !important;
}
// menu hover
.el-menu--collapse .el-submenu__title,
.el-menu--collapse .submenu-title-noDropdown {
margin-left: 0px !important;
}
// 有子级
.el-submenu__title {
@include font_color("menuText");
background-color: transparent !important;
&:hover {
color: $subMenuActiveText !important;
@include font_color("submenuColor");
border-right: 5px solid #36CEB6;
@include background_color("submenuBg");
box-sizing: border-box;
.svg-icon,
i,
span {
@include font_color("submenuColor");
}
}
}
// 没有子级
.submenu-title-noDropdown {
@include font_color("menuText");
padding-left: 20px;
height: 56px;
background-color: transparent !important;
&:hover {
@include font_color("submenuColor");
@include background_color("submenuBg");
border-right: 5px solid #36CEB6;
box-sizing: border-box;
.svg-icon {
color: #1ea6f8 !important;
}
i {
color: #1ea6f8 !important;
}
}
}
.submenu-title-noDropdown.is-active,
.el-submenu__title.is-active {
@include background_color("submenuBg");
@include font_color("submenuColor");
border-right: 5px solid #36CEB6;
box-sizing: border-box;
.svg-icon {
color: #1ea6f8 !important;
}
i {
color: #1ea6f8 !important;
}
}
.submenu-title-noDropdown,
.el-submenu__title {
font-weight: 600;
font-size: $sideBarFontSize;
>i {
color: $subMenuActiveText !important;
transform: rotate(90deg);
-webkit-transform: rotate(90deg);
-moz-transform: rotate(90deg);
-ms-transform: rotate(90deg);
-o-transform: rotate(90deg);
margin-right: 10px;
}
.svg-icon {
font-size: 18px;
color: #6D7278 !important;
}
}
.el-submenu.is-opened>.el-submenu__title .el-submenu__icon-arrow {
transform: rotateZ(0deg) !important;
-webkit-transform: rotateZ(0deg) !important;
-moz-transform: rotateZ(0deg) !important;
-ms-transform: rotateZ(0deg) !important;
-o-transform: rotateZ(0deg) !important;
}
& .nest-menu .el-submenu>.el-submenu__title,
& .el-submenu .el-menu-item {
&.is-active {
@include background_color("menuActive");
@include font_color("menuActiveText");
}
&:hover {
@include background_color("menuActive");
@include font_color("menuActiveText");
color: $menuActiveText !important;
}
min-width: 130px !important;
background-color: transparent !important;
font-weight: 600;
@include font_color("menuText");
font-size: $sideBarFontSize;
}
}
.hideSidebar {
.sidebar-container {
width: 54px !important;
}
.submenu-title-noDropdown {
padding: 0 !important;
position: relative;
.el-tooltip {
padding: 0 !important;
.svg-icon {
margin-left: 16px;
}
.sub-el-icon {
margin-left: 19px;
}
}
}
.el-submenu {
overflow: hidden;
&>.el-submenu__title {
padding: 0 !important;
.svg-icon {
margin-left: 16px;
}
.sub-el-icon {
margin-left: 19px;
}
.el-submenu__icon-arrow {
display: none;
}
}
}
.el-menu--collapse {
.el-submenu {
&>.el-submenu__title {
&>span {
height: 0;
width: 0;
overflow: hidden;
visibility: hidden;
display: inline-block;
}
}
}
}
}
.el-menu--collapse .el-menu .el-submenu {
min-width: $sideBarWidth !important;
}
// mobile responsive
.mobile {
.main-container {
margin-left: 0px;
}
.sidebar-container {
transition: transform 0.28s;
width: $sideBarWidth !important;
}
&.hideSidebar {
.sidebar-container {
pointer-events: none;
transition-duration: 0.3s;
transform: translate3d(-$sideBarWidth, 0, 0);
}
}
}
.withoutAnimation {
.main-container,
.sidebar-container {
transition: none;
}
}
// when menu collapsed
.el-menu--vertical {
&>.el-menu {
.svg-icon {
margin-right: 16px;
}
.sub-el-icon {
margin-right: 12px;
margin-left: -2px;
}
}
.nest-menu .el-submenu>.el-submenu__title,
.el-menu-item {
width: calc(100% - 12px);
border-top-right-radius: 8px;
border-bottom-right-radius: 8px;
font-weight: 600 !important;
font-size: 15px !important;
@include background("menuActive");
@include font_color("menuText");
&:hover {
@include background("menuActive");
opacity: .9;
.svg-icon,
i,
span {
color: $menuText;
}
}
}
// the scroll bar appears when the subMenu is too long
>.el-menu--popup {
max-height: 100vh;
overflow-y: auto;
background-color: #32ACFE !important;
border-top-right-radius: 8px;
border-bottom-right-radius: 8px;
min-width: 140px;
padding: 12px 0;
&::-webkit-scrollbar-track-piece {
background: #d3dce6;
}
&::-webkit-scrollbar {
width: 6px;
}
&::-webkit-scrollbar-thumb {
background: #99a9bf;
border-radius: 20px;
}
}
}
.el-submenu.is-active .el-submenu__title {
@include background_color("submenuBg");
@include font_color("submenuColor");
border-right: 5px solid #36CEB6;
}
.el-submenu.is-active .el-submenu__title:hover {
@include font_color("submenuColor");
}
.el-submenu.is-active .el-submenu__title .svg-icon {
@include font_color("submenuColor");
}
.el-submenu__title {
display: flex;
align-items: center;
}
.sidebar-container .submenu-title-noDropdown>i,
.sidebar-container .el-submenu__title>i {
color: #6D7278 !important;
}
.el-submenu.is-active .el-submenu__title>i {
color: #FFFFFF !important;
}
.el-submenu__title span {
white-space: normal;
word-break: break-all;
line-height: 20px;
flex: 1;
padding-right: 20px;
}
.el-menu-item {
height: 42px;
display: flex;
align-items: center;
padding-right: 20px !important;
}
.el-menu-item span {
// white-space: nowrap !important;
word-break: break-all;
line-height: 20px;
flex: 1;
}
\ No newline at end of file
/*
* @Description:
* @Autor: renchao
* @LastEditTime: 2023-03-24 16:44:54
* @LastEditTime: 2023-05-11 17:23:08
*/
import Vue from 'vue'
export default function getTheme (theme = Vue.prototype.BASE_API.THEME) {
const resultMap = {
'jg': function () {
return import("@/styles/jgPublic.scss");
},
'sb': function () {
return import("@/styles/sbPublic.scss");
},
'default': function () {
throw new Error(`Unsupported theme: ${theme}`);
},
};
const result = resultMap[theme]();
if (result instanceof Promise) {
return result;
} else {
return resultMap.default();
}
export default function getTheme () {
import("@/styles/jgPublic.scss")
}
\ No newline at end of file
......
<template>
<!-- 接收报文查询 -->
<div class="reportLog from-clues">
<!-- 头部搜索 -->
<div class="from-clues-header">
<el-form ref="ruleForm" :model="form" label-width="100px">
<el-form-item v-if="BASE_API.THEME == 'jg'">
<Breadcrumb />
</el-form-item>
<el-row class="mb-5">
<el-col :span="6">
<el-form-item label="权利人名称" prop="qlrmc">
<el-input v-model.trim="form.qlrmc" clearable class="width100" placeholder="权利人名称"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="证件号" prop="zjh">
<el-input v-model.trim="form.zjh" clearable class="width100" placeholder="证件号"></el-input>
</el-form-item>
</el-col>
<!-- 按钮操作 -->
<el-col :span="6" class="btnColRight">
<el-form-item>
<btn nativeType="cx" @click="handleSearchResult">查询</btn>
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
<!-- 列表区域 -->
<div class="from-clues-content">
<lb-table ref="table" :page-size="pageData.size" :current-page.sync="pageData.current" :total="tableData.total"
@size-change="handleSizeChange" @p-current-change="handleCurrentChange" :column="tableData.columns"
:data="tableData.data">
</lb-table>
</div>
</div>
</template>
<script>
import Vue from 'vue'
// 接收报文查询
// 引入表格头部数据
import data from "../data";
// 引入table混入方法
import tableMixin from "@/mixins/tableMixin.js";
import { saveSearchRecord } from "@/api/searchRecord.js";
//引入日期处理方法
import { timeFormat } from "@/utils/operation";
export default {
name: "jsbwcx",
mixins: [tableMixin],
// 注册组件
components: {
},
data () {
return {
pickerOptionsStart: {
disabledDate: (time) => {
let endDateVal = this.form.receiveEndTime;
if (endDateVal) {
return (
time.getTime() >=
new Date(endDateVal).getTime()
);
}
},
},
pickerOptionsEnd: {
disabledDate: (time) => {
let beginDateVal = this.form.receiveStartTime;
if (beginDateVal) {
return (
time.getTime() <
new Date(beginDateVal).getTime()
);
}
},
},
// 表格数据
form: {
qlrmc: "", // 行政区
zjh: "", // 开始日期
},
// 校验规则
rules: {
pcode: [{ required: true, message: "请选择行政区", trigger: "change" }],
startTime: [
{ required: true, message: "请选择开始日期", trigger: "change" },
],
endTime: [
{ required: true, message: "请选择结束日期", trigger: "change" },
],
bdcdyh: [
{ required: true, message: "不动产单元号", trigger: "change" },
],
ywmc: [{ required: true, message: "业务名称", trigger: "change" }],
jcjg: [{ required: true, message: "检查结果", trigger: "change" }],
rkjg: [{ required: true, message: "入库结果", trigger: "change" }],
},
// 表格数据
tableData: {
// 表格头部
columns: [
{
label: "序号",
type: "index",
width: "50",
index: this.indexMethod,
},
{
prop: 'bdcdyh',
label: '不动产单元号',
width: 200
},
{
prop: "bdcqzh",
label: "不动产权证号",
width: 160,
},
{
prop: 'djsj',
label: '登记时间',
width: 200
},
{
prop: "fdzl",
label: "坐落",
width: 160,
},
{
prop: 'ghyt',
label: '用途',
width: 200
},
{
prop: "gyqk",
label: "共有情况",
width: 160,
},
{
prop: 'jzmj',
label: '建筑面积',
width: 100
},
{
prop: "qlrmc",
label: "权利人",
width: 100,
},
{
prop: "zjh",
label: "证件号",
width: 260,
},
],
// 表格列表数据
total: 0,
data: [],
},
// 分页
pageData: {
total: 0,
pageSize: 10,
current: 1
},
title: "",
};
},
methods: {
//截止日期变化
endTimeChange (val) {
this.form.receiveEndTime = timeFormat(new Date(val), true)
},
// 初始化数据
queryClickSearch () {
saveSearchRecord({ ...this.form, ...this.formData }).then(
(res) => {
if (res.code === 200) {
this.tableData.data = res.result
} else {
this.$message.warning(res.message)
}
}
)
},
// 重置
resetForm () {
this.$refs.ruleForm.resetFields();
this.form.currentPage = 1
},
featchData () {},
// 结果
handleResult (row) {
this.$popupDialog('响应结果', 'views/jsbwcx/components/result', row)
},
handleSearchResult() {
this.queryClickSearch()
},
// 详情
handleDetails (row) {},
}
}
</script>
<style scoped lang="scss">
.lastdom:nth-child(3) {
margin-bottom: 0px;
}
</style>
/*
* @Description:
* @Autor: renchao
* @LastEditTime: 2023-03-17 15:10:43
*/
import filter from '@/utils/filter.js'
class data extends filter {
constructor() {
super()
}
columns () {
return [
{
prop: 'name',
label: '查询人员',
},
{
prop: 'zjh',
label: '查询证件号',
},
{
prop: "zjmc",
label: "查询证件名称",
},
{
prop: "createtime",
label: "查询时间",
},
// {
// prop: "result",
// label: "查询结果",
// }
]
}
}
export default new data()
<template>
<!-- 接收报文查询 -->
<div class="reportLog from-clues">
<!-- 头部搜索 -->
<div class="from-clues-header">
<el-form ref="ruleForm" :model="form" label-width="100px">
<el-form-item v-if="BASE_API.THEME == 'jg'">
<Breadcrumb />
</el-form-item>
<el-row class="mb-5">
<el-col :span="6">
<el-form-item label="查询人员" prop="qxdm">
<el-input v-model.trim="form.name" clearable class="width100" placeholder="查询人员"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="查询日期" prop="startTime">
<el-date-picker type="date" class="width100" placeholder="开始日期" :picker-options="pickerOptionsStart"
clearable v-model="form.startTime" value-format="yyyy-MM-dd HH:mm:ss"></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="至" prop="endTime" label-width="35px">
<el-date-picker type="date" class="width100" placeholder="结束日期" :picker-options="pickerOptionsEnd" clearable
v-model="form.endTime" value-format="yyyy-MM-dd HH:mm:ss" @change="endTimeChange"></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="证件号" prop="zjh">
<el-input v-model.trim="form.zjh" clearable class="width100" placeholder="不动产单元号"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row class="mt-10">
<el-col :span="6">
<el-form-item label="查询证件名称" prop="zjmc">
<el-input v-model.trim="form.zjmc" clearable class="width100" placeholder="业务流水号"></el-input>
</el-form-item>
</el-col>
<!-- 按钮操作 -->
<el-col :span="6" class="btnColRight">
<el-form-item>
<btn nativeType="cz" @click="save">新增</btn>
<btn nativeType="cx" @click="handleSearch">查询</btn>
<!-- <btn nativeType="resetForm">重置</btn> -->
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
<!-- 列表区域 -->
<div class="from-clues-content">
<lb-table ref="table" :page-size="pageData.size" :current-page.sync="pageData.current" :total="tableData.total"
@size-change="handleSizeChange" @p-current-change="handleCurrentChange" :column="tableData.columns"
:data="tableData.data">
</lb-table>
</div>
<!-- 编辑 -->
<el-dialog :close-on-click-modal="false" top="0"
custom-class="dialogBox dataReporting editDialogBox sbdialog commonDialog mainCenter" :visible.sync="dialogVisible"
width="92%">
<search-result></search-result>
</el-dialog>
</div>
</template>
<script>
import Vue from 'vue'
// 接收报文查询
// 引入表格头部数据
import data from "./data";
// 引入table混入方法
import tableMixin from "@/mixins/tableMixin.js";
import { getSearchRecordList } from "@/api/searchRecord.js";
// 引入详情弹框
import SearchResult from "./components/result";
//引入日期处理方法
import { timeFormat } from "@/utils/operation";
export default {
name: "jsbwcx",
mixins: [tableMixin],
// 注册组件
components: {
SearchResult
},
data () {
return {
dialogVisible: false,
pickerOptionsStart: {
disabledDate: (time) => {
let endDateVal = this.form.receiveEndTime;
if (endDateVal) {
return (
time.getTime() >=
new Date(endDateVal).getTime()
);
}
},
},
pickerOptionsEnd: {
disabledDate: (time) => {
let beginDateVal = this.form.receiveStartTime;
if (beginDateVal) {
return (
time.getTime() <
new Date(beginDateVal).getTime()
);
}
},
},
// 表格数据
form: {
qxdm: "", // 行政区
receiveStartTime: "", // 开始日期
receiveEndTime: "", // 结束日期
bdcdyh: "", // 不动产单元号
ywh: "", // 业务号
qllx: "", // 权利类型
djlx: "", // 登记类型
jcjg: "", // 检查结果
rkjg: "", //入库结果
currentPage: 1
},
// 校验规则
rules: {
pcode: [{ required: true, message: "请选择行政区", trigger: "change" }],
startTime: [
{ required: true, message: "请选择开始日期", trigger: "change" },
],
endTime: [
{ required: true, message: "请选择结束日期", trigger: "change" },
],
bdcdyh: [
{ required: true, message: "不动产单元号", trigger: "change" },
],
ywmc: [{ required: true, message: "业务名称", trigger: "change" }],
jcjg: [{ required: true, message: "检查结果", trigger: "change" }],
rkjg: [{ required: true, message: "入库结果", trigger: "change" }],
},
// 表格数据
tableData: {
// 表格头部
columns: [
{
label: "序号",
type: "index",
width: "50",
index: this.indexMethod,
}
]
.concat(data.columns())
.concat([
{
label: "操作",
width: "90",
render: (h, scope) => {
return (
<div>
<el-button
type="text"
class='btnColor'
onClick={() => {
this.handleDetails(scope.row);
}}
>
详情
</el-button>
</div>
)
}
}
]),
// 表格列表数据
total: 0,
data: [],
},
// 分页
pageData: {
total: 0,
pageSize: 10,
current: 1
},
title: "",
};
},
methods: {
//截止日期变化
endTimeChange (val) {
this.form.receiveEndTime = timeFormat(new Date(val), true)
},
// 初始化数据
queryClick () {
getSearchRecordList({ ...this.form, ...this.formData }).then(
(res) => {
if (res.code === 200) {
let { total, records, current } = res.result;
this.tableData.total = total;
this.tableData.data = records ? records : [];
this.pageData.current = current
}
}
)
},
// 重置
resetForm () {
this.$refs.ruleForm.resetFields();
this.form.currentPage = 1
this.queryClick();
},
featchData () {
this.queryClick();
},
// 结果
handleResult (row) {
this.$popupDialog('响应结果', 'views/jsbwcx/components/result', row)
},
// 详情
handleDetails (row) {},
save() {
this.dialogVisible = true;
},
}
}
</script>
<style scoped lang="scss">
.lastdom:nth-child(3) {
margin-bottom: 0px;
}
</style>
......@@ -136,7 +136,7 @@
// 生成文件名
generateFileName () {
var reg = /(\d{4})\-(\d{2})\-(\d{2})/;
this.downTitle = `汉中市不动产登记增量数据接入质量评价表(${this.form.startTime.replace(reg, "$1年$2月$3日")}${this.form.endTime.replace(reg, "$1年$2月$3日")})`
this.downTitle = this.BASE_API.XZQ + `不动产登记增量数据接入质量评价表(${this.form.startTime.replace(reg, "$1年$2月$3日")}${this.form.endTime.replace(reg, "$1年$2月$3日")})`
},
headerStyle ({ row, rowIndex }) {
if (rowIndex == 4) {
......
<template>
<el-table :data="tableData" style="width: 100%">
<el-table-column prop="date" label="日期" width="150">
</el-table-column>
<el-table-column label="配送信息">
<el-table-column prop="name" label="姓名" width="120">
</el-table-column>
<el-table-column label="地址">
<el-table-column prop="province" label="省份" width="120">
</el-table-column>
<el-table-column prop="city" label="市区" width="120">
</el-table-column>
<el-table-column prop="address" label="地址" width="300">
</el-table-column>
<el-table-column prop="zip" label="邮编" width="120">
</el-table-column>
</el-table-column>
</el-table-column>
</el-table>
</template>
<script>
export default {
data () {
return {
tableData: [{
date: '2016-05-03',
name: '王小虎',
province: '上海',
city: '普陀区',
address: '上海市普陀区金沙江路 1518 弄',
zip: 200333
}, {
date: '2016-05-02',
name: '王小虎',
province: '上海',
city: '普陀区',
address: '上海市普陀区金沙江路 1518 弄',
zip: 200333
}, {
date: '2016-05-04',
name: '王小虎',
province: '上海',
city: '普陀区',
address: '上海市普陀区金沙江路 1518 弄',
zip: 200333
}, {
date: '2016-05-01',
name: '王小虎',
province: '上海',
city: '普陀区',
address: '上海市普陀区金沙江路 1518 弄',
zip: 200333
}, {
date: '2016-05-08',
name: '王小虎',
province: '上海',
city: '普陀区',
address: '上海市普陀区金沙江路 1518 弄',
zip: 200333
}, {
date: '2016-05-06',
name: '王小虎',
province: '上海',
city: '普陀区',
address: '上海市普陀区金沙江路 1518 弄',
zip: 200333
}, {
date: '2016-05-07',
name: '王小虎',
province: '上海',
city: '普陀区',
address: '上海市普陀区金沙江路 1518 弄',
zip: 200333
}]
}
}
}
</script>
\ No newline at end of file
......@@ -44,17 +44,17 @@
</template>
<script>
// 相关字段空置率统计
// 引入表格头部数据
import data from "./data";
// 引入table混入方法
import tableMixin from "@/mixins/tableMixin.js";
// 导出excel表格
import downLbTable from '@/components/DownLbTable'
// 获取时间
import { getCurrentDate, setExport2Excel } from "@/utils/tools";
import { nonNullSta } from "@/api/statistics.js";
export default {
// 相关字段空置率统计
// 引入表格头部数据
import data from "./data";
// 引入table混入方法
import tableMixin from "@/mixins/tableMixin.js";
// 导出excel表格
import downLbTable from '@/components/DownLbTable'
// 获取时间
import { getCurrentDate, setExport2Excel } from "@/utils/tools";
import { nonNullSta } from "@/api/statistics.js";
export default {
name: "jsbwcx",
components: {
downLbTable
......@@ -131,7 +131,7 @@ export default {
// 生成文件名
generateFileName () {
var reg = /(\d{4})\-(\d{2})\-(\d{2})/;
this.downTitle = `汉中市不动产登记增量数据相关字段空项率统计(${this.form.startTime.replace(reg, "$1年$2月$3日")}${this.form.endTime.replace(reg, "$1年$2月$3日")})`
this.downTitle = this.BASE_API.XZQ + `不动产登记增量数据相关字段空项率统计(${this.form.startTime.replace(reg, "$1年$2月$3日")}${this.form.endTime.replace(reg, "$1年$2月$3日")})`
},
handlesetExport2Excel (val) {
setExport2Excel(val)
......@@ -150,14 +150,14 @@ export default {
this.featchDataSelf()
}
}
}
}
</script>
<style scoped lang="scss">
// 引入表单整体样式
@import "../css/index.scss";
// 引入表单整体样式
@import "../css/index.scss";
/deep/.el-table thead.is-group th.el-table__cell {
/deep/.el-table thead.is-group th.el-table__cell {
height: 14px !important;
}
}
</style>
......
......@@ -2,7 +2,7 @@
* @Author: yangwei
* @Date: 2023-02-17 16:32:50
* @LastEditors: Please set LastEditors
* @LastEditTime: 2023-03-28 10:24:52
* @LastEditTime: 2023-05-11 10:11:15
* @FilePath: \bdcjg-web\src\views\statistics\registerBookQuality\index.vue
* @Description:
*
......@@ -54,18 +54,18 @@
</template>
<script>
// 登簿质量评价表
// 引入表格头部数据
import data from "./data";
// 引入table混入方法
import tableMixin from "@/mixins/tableMixin.js";
// 导出excel表格
import downLbTable from '@/components/DownLbTable'
// 获取时间
import { getCurrentDate, setExport2Excel } from "@/utils/tools";
import { registerBookQuality } from "@/api/statistics.js";
// 登簿质量评价表
// 引入表格头部数据
import data from "./data";
// 引入table混入方法
import tableMixin from "@/mixins/tableMixin.js";
// 导出excel表格
import downLbTable from '@/components/DownLbTable'
// 获取时间
import { getCurrentDate, setExport2Excel } from "@/utils/tools";
import { registerBookQuality } from "@/api/statistics.js";
export default {
export default {
name: "jsbwcx",
components: {
downLbTable
......@@ -155,7 +155,7 @@ export default {
// 生成文件名
generateFileName () {
var reg = /(\d{4})\-(\d{2})\-(\d{2})/;
this.downTitle = `汉中市不动产登记增量数据登簿质量评价表(${this.form.startTime.replace(reg, "$1年$2月$3日")}${this.form.endTime.replace(reg, "$1年$2月$3日")})`
this.downTitle = this.BASE_API.XZQ + `不动产登记增量数据登簿质量评价表(${this.form.startTime.replace(reg, "$1年$2月$3日")}${this.form.endTime.replace(reg, "$1年$2月$3日")})`
},
handlesetExport2Excel (val) {
setExport2Excel(val)
......@@ -188,14 +188,14 @@ export default {
this.featchDataSelf()
}
}
}
}
</script>
<style scoped lang="scss">
// 引入表单整体样式
@import "../css/index.scss";
// 引入表单整体样式
@import "../css/index.scss";
/deep/.el-table thead.is-group th.el-table__cell {
/deep/.el-table thead.is-group th.el-table__cell {
height: 14px !important;
}
}
</style>
......
/*
* @Description:
* @Autor: renchao
* @LastEditTime: 2023-03-17 15:10:43
* @LastEditTime: 2023-05-11 10:02:44
*/
import filter from '@/utils/filter.js'
class data extends filter {
......@@ -10,6 +10,20 @@ class data extends filter {
}
columns () {
return [
// {
// prop: 'sjlx',
// label: '数据类型',
// width: 90,
// render: (h, scope) => {
// return (
// <div>
// <span v-show={scope.row.sjlx == 1}>ftp上传</span>
// <span v-show={scope.row.sjlx == 2}>业务库抽取</span>
// <span v-show={scope.row.sjlx == 3}>存量数据</span>
// </div>
// )
// }
// },
{
prop: 'jcjg',
label: '检查结果',
......
......@@ -79,10 +79,14 @@
</el-col>
<!-- 按钮操作 -->
<el-col :span="6" class="btnColRight">
<el-form-item>
<el-form-item class="d-flex">
<btn nativeType="cz" @click="resetForm">重置</btn>
<btn nativeType="cx" @click="handleSearch">查询</btn>
<btn nativeType="cx">存量导入</btn>
<el-upload ref="upload" style="display:inline-block;margin-left: 10px" action="" :auto-upload="false"
:limit="1" accept=".xml" :show-file-list="false"
:file-list="fileList" :before-upload="uploadRecord" :on-change="fileChange">
<btn nativeType="cx">xml导入</btn>
</el-upload>
</el-form-item>
</el-col>
</el-row>
......@@ -101,7 +105,7 @@
</template>
<script>
import Vue from 'vue'
import { storage } from '@/api/file'
// 接收报文查询
// 引入表格头部数据
import data from "./data";
......@@ -121,7 +125,7 @@
},
data () {
return {
fileList: [],
pickerOptionsStart: {
disabledDate: (time) => {
let endDateVal = this.form.receiveEndTime;
......@@ -232,6 +236,36 @@
};
},
methods: {
uploadRecord (file) {
this.requested = true
this.files = file;
const extension = file.name.split('.')[1] === 'xml'
const isLt5M = file.size / 1024 / 1024 < 5
if (!extension) {
this.$message.warning('上传模板只能是 xml格式!')
this.requested = false
}
if (!isLt5M) {
this.$message.warning('上传模板大小不能超过 5MB!')
this.requested = false
}
return (extension) && isLt5M
},
fileChange (res) {
let fd = new FormData()
fd.append('files', res.raw)// 文件对象
storage(fd).then(res => {
if (res.code === 200) {
this.requested = false
this.$message({
message: '上传成功',
type: 'success',
})
} else {
this.$message.error(res.message)
}
})
},
//截止日期变化
endTimeChange (val) {
this.form.receiveEndTime = timeFormat(new Date(val), true)
......@@ -299,3 +333,4 @@
}
</style>
......
<template>
<div class="bg">
<div class="title">
<img src="../../image/bdclogo.png" alt="">
<h2>{{ BASE_API.TITLE }}</h2>
</div>
<div class="login-inner-bg login">
<div class="user_style">
<h3>用户登录</h3>
<el-form :model="user" :rules="rules" ref="user" id="loginform" class="demo-ruleForm">
<el-form-item prop="account">
<el-input class="username" v-model="user.account" placeholder="请输入用户名"></el-input>
</el-form-item>
<el-form-item prop="password">
<el-input type="password" class="password" @keyup.enter.native="login('user')" v-model="user.password"
placeholder="请输入密码" show-password></el-input>
</el-form-item>
<!-- <el-form-item prop="yz">
<div class="flex-container">
<div class="flex-input">
<el-input class="yz" @keyup.native="login('user')" v-model="user.yz" placeholder="请输入验证码"></el-input>
</div>
<div class="flex-line"></div>
<div class="flex-img"><canvas id="s-canvas" ref="s-canvas"></canvas></div>
<div class="flex-renovate">
<font id="renovate" @click="verification">换一批</font>
</div>
</div>
</el-form-item> -->
<el-form-item class="login-btn">
<el-button type="primary" style="width: 100%" @click="login('user')">登录</el-button>
</el-form-item>
</el-form>
</div>
</div>
</div>
</template>
<script>
import { getMenuInfo } from "@/api/user";
import { loginIn } from "@/api/login.js";
export default {
name: "sbLogin",
data () {
return {
user: {
account: "",
password: "",
yz: "",
checkStatus: false,
},
productName: "",
rules: {
account: [{ required: true, message: "请填写帐号", trigger: "blur" }],
password: [{ required: true, message: "请填写密码", trigger: "blur" }],
},
};
},
methods: {
verification () {
let str = '1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ', code = '', i = 0;
for (; i++ < 4;) code += str[Math.floor(Math.random() * (str.length - 0) + 0)];
setTimeout(() => {
let canvas = document.getElementById("s-canvas"), ctx = canvas.getContext("2d");
canvas.width = 80;
canvas.height = 28;
ctx.fillStyle = '#ffffff';
ctx.fillRect(0, 0, 80, 28);
for (i = 0; i < code.length; i++) { this.drawText(ctx, code[i], i); }
}, 0);
},
drawText (ctx, txt, i) {
ctx.fillStyle = this.randomColor(50, 160);
ctx.font = "18px SimHei";
let x = (i + 1) * (80 / (4 + 1)), y = this.randomNum(18, 28 - 5);
ctx.translate(x, y);
ctx.fillText(txt, 0, 0);
ctx.rotate((-0 * Math.PI) / 180);
ctx.translate(-x, -y);
},
randomColor (min, max) {
let r = this.randomNum(min, max);
let g = this.randomNum(min, max);
let b = this.randomNum(min, max);
return "rgb(" + r + "," + g + "," + b + ")";
},
randomNum (min, max) {
return Math.floor(Math.random() * (max - min) + min);
},
//记住用户名
checkUserName: function (flag) {
this.user.checkStatus = flag;
if (this.user.checkStatus) {
localStorage.setItem("accountId", this.user.account);
let name = localStorage.getItem("accountId");
if (name === "") {
return;
} else {
this.user.account = name;
}
} else {
this.user.account = localStorage.getItem("accountId");
}
},
login (user) {
var self = this
this.$refs[user].validate(async (valid) => {
if (valid) {
let res = await loginIn(self.user.account, self.user.password)
if (res.status == 1) {
let code = this.BASE_API.CODE;
localStorage.setItem("token", `Bearer ${res.content}`);
const { result: getMenuData } = (await getMenuInfo(code)) || [];
let path1 = JSON.parse(getMenuData[0].metadata)?.path + '/' + JSON.parse(getMenuData[0].children[0].metadata)?.path
//登录成功后需判断有无重定向,没有重定向则跳转首页
const accessRoutes = await this.$store.dispatch(
"permission/generateRoutes",
getMenuData
);
this.$router.addRoutes([
...accessRoutes,
{ path: "*", redirect: "/404", hidden: true },
]);
this.$router.replace(this.$route.query.redirect || path1);
} else {
this.$message.error(res.message);
}
}
})
}
}
}
</script>
<style scoped lang="scss">
.username,
.password,
.yz {
position: relative;
&:before {
content: "";
display: block;
width: 16px;
height: 16px;
position: absolute;
left: 10px;
top: 7px;
background-size: 100% 100%;
}
/deep/ .el-input__inner {
color: #000 !important;
text-indent: 24px;
}
}
.flex-container {
position: relative;
display: -webkit-flex;
display: flex;
}
.flex-input {
width: 100%;
}
.flex-line {
position: absolute;
width: 1px;
height: 64%;
margin: 5px;
right: 36%;
background-color: #CCCCCC;
}
.flex-img {
position: absolute;
margin: 2px;
right: 16%;
}
.flex-renovate {
position: absolute;
margin: 1px;
right: 3%;
}
#renovate {
color: #3F8FEA;
font-size: 16px;
font-weight: 700;
cursor: pointer;
}
.username::before {
background-image: url(../../image/userlogo.png);
}
.password::before {
background-image: url(../../image/passlogo.png);
}
.yz::before {
background-image: url(../../image/yzlogo.png);
}
.bg {
width: 100%;
height: 100%;
min-width: 1440px;
min-height: 560px;
background: url(../../image/loginBoxsb.png) no-repeat;
background-size: 100% 100%;
overflow: hidden;
position: relative;
}
.title {
width: 24%;
height: 6%;
top: 20%;
right: 38%;
position: absolute;
img {
width: 60px;
height: 60px;
top: 0%;
left: 2%;
position: absolute;
}
h2 {
top: 25%;
left: 22%;
position: absolute;
width: 383px;
height: 42px;
font-size: 28px;
font-weight: 600;
color: #ffffff;
text-shadow: 0px 4px 4px #002c95;
}
}
.login-inner-bg {
background: white;
width: 24.6%;
min-width: 360px;
top: 30%;
right: 38%;
position: absolute;
background-size: 100% 100%;
box-sizing: border-box;
padding: 56px;
}
.login {
.user_style {
h3 {
font-weight: normal;
text-align: center;
margin: -10px auto 28px;
font-weight: 400;
width: 125px;
height: 29px;
font-size: 20px;
font-family: Source Han Sans CN;
font-weight: 400;
color: #333333;
}
}
.btn {
width: 100%;
height: 6vh;
background-color: #00c2de;
border-radius: 5px;
font-size: 1.4vw;
color: #000;
}
.btn:hover {
cursor: pointer;
background-color: #2d8cf0;
}
}
.login #loginform {
.el-form-item {
margin-bottom: 24px !important;
}
.login-btn {
margin-top: 30px !important;
}
.el-button {
font-size: 18px;
border-radius: 0;
background: #4162d8 !important;
color: #ffffff !important;
cursor: pointer !important;
}
.el-input__inner {
width: 100% !important;
}
.el-checkbox__label {
color: #fff;
}
}
.inputUser .ivu-input {
padding: 6px 24px !important;
border: 1px solid #9f9f9f !important;
}
</style>