Compare commits

...

2 Commits

Author SHA1 Message Date
renguanyu111 71cd86a7f2 绩效后台20220426 4 years ago
renguanyu111 81056c5fe5 后台(0411) 4 years ago
  1. 2
      .env.development
  2. 48
      src/--layout/components/AppMain.vue
  3. 152
      src/--layout/components/Navbar.vue
  4. 26
      src/--layout/components/Sidebar/FixiOSBug.js
  5. 41
      src/--layout/components/Sidebar/Item.vue
  6. 49
      src/--layout/components/Sidebar/Link.vue
  7. 82
      src/--layout/components/Sidebar/Logo.vue
  8. 95
      src/--layout/components/Sidebar/SidebarItem copy.vue
  9. 95
      src/--layout/components/Sidebar/SidebarItem.vue
  10. 95
      src/--layout/components/Sidebar/index.vue
  11. 42
      src/--layout/components/Sidebar/subMenu copy.vue
  12. 43
      src/--layout/components/Sidebar/subMenu.vue
  13. 3
      src/--layout/components/index.js
  14. 103
      src/--layout/index.vue
  15. 45
      src/--layout/mixin/ResizeHandler copy.js
  16. 45
      src/--layout/mixin/ResizeHandler.js
  17. 19
      src/App.vue
  18. 208
      src/api/duty/duty.js
  19. 88
      src/api/user.js
  20. 1
      src/layout/components/Navbar.vue
  21. 23
      src/router/index.js
  22. 4
      src/utils/request.js
  23. 1204
      src/views/assessmentProgram/departmentalAssessment copy.vue
  24. 606
      src/views/assessmentProgram/departmentalAssessment.vue
  25. 1109
      src/views/assessmentProgram/qualitativeIndicators.vue
  26. 50
      src/views/basicInfo/project.vue
  27. 312
      src/views/basicInfo/target.vue
  28. 49
      src/views/ce/index.vue
  29. 7
      src/views/frontPage/index.vue
  30. 2
      src/views/login/index.vue
  31. 378
      src/views/login/wxLogin.vue
  32. 378
      src/views/menuSettings/index.vue
  33. 10
      src/workspace.code-workspace
  34. 5
      workspace.code-workspace

2
.env.development

@ -2,4 +2,4 @@
ENV = 'development'
# base api
VUE_APP_BASE_API = 'http://gin.vueadmin.net/api'
VUE_APP_BASE_API = 'http://vue.admin.net/api'

48
src/--layout/components/AppMain.vue

@ -0,0 +1,48 @@
<template>
<section class="app-main">
<transition name="fade-transform" mode="out-in">
<router-view :key="key" />
</transition>
<!-- <router-view /> -->
<!-- <router-view :key="key" /> -->
</section>
</template>
<script>
export default {
name: 'AppMain',
computed: {
key() {
console.log("AppMain")
console.log("AppMain")
console.log(this.$route.path)
console.log(this.$route.fullPath)
return this.$route.fullPath
}
}
}
</script>
<style scoped>
.app-main {
/*50 = navbar */
min-height: calc(100vh - 50px);
width: 100%;
position: relative;
overflow: hidden;
padding: 10px;
}
.fixed-header+.app-main {
padding-top: 50px;
}
</style>
<style lang="scss">
// fix css style bug in open el-dialog
.el-popup-parent--hidden {
.fixed-header {
padding-right: 15px;
}
}
</style>

152
src/--layout/components/Navbar.vue

@ -0,0 +1,152 @@
<template>
<div class="navbar">
<hamburger :is-active="sidebar.opened" class="hamburger-container" @toggleClick="toggleSideBar" />
<breadcrumb class="breadcrumb-container" />
<div class="right-menu">
<el-dropdown class="avatar-container" trigger="click">
<div class="avatar-wrapper">
<!-- <img :src="avatar+'?imageView2/1/w/80/h/80'" class="user-avatar"> -->
<div>
{{userInfo.groupName}}{{userInfo.roleName}}
</div>
<i class="el-icon-caret-bottom" />
</div>
<el-dropdown-menu slot="dropdown" class="user-dropdown">
<router-link to="/">
<el-dropdown-item>
个人信息
</el-dropdown-item>
</router-link>
<!-- <a target="_blank" href="https://github.com/PanJiaChen/vue-admin-template/">
<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 divided @click.native="logout">
<span style="display:block;">退 </span>
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</div>
</div>
</template>
<script>
import { mapGetters } from 'vuex'
import Breadcrumb from '@/components/Breadcrumb'
import Hamburger from '@/components/Hamburger'
export default {
data () {
return {
userInfo:{}
}
},
components: {
Breadcrumb,
Hamburger
},
computed: {
...mapGetters([
'sidebar',
'avatar'
])
},
created () {
if (JSON.parse(sessionStorage.getItem('userinfo'))==null) {
this.$router.push('/login')
}
this.userInfo=JSON.parse(sessionStorage.getItem('userinfo'));
},
methods: {
toggleSideBar() {
this.$store.dispatch('app/toggleSideBar')
},
logout() {
this.$store.commit('user/loginOut')
}
}
}
</script>
<style lang="scss" scoped>
.navbar {
height: 50px;
overflow: hidden;
position: relative;
background: #fff;
box-shadow: 0 1px 4px rgba(0,21,41,.08);
.hamburger-container {
line-height: 46px;
height: 100%;
float: left;
cursor: pointer;
transition: background .3s;
-webkit-tap-highlight-color:transparent;
&:hover {
background: rgba(0, 0, 0, .025)
}
}
.breadcrumb-container {
float: left;
}
.right-menu {
float: right;
height: 100%;
line-height: 50px;
&:focus {
outline: none;
}
.right-menu-item {
display: inline-block;
padding: 0 8px;
height: 100%;
font-size: 18px;
color: #5a5e66;
vertical-align: text-bottom;
&.hover-effect {
cursor: pointer;
transition: background .3s;
&:hover {
background: rgba(0, 0, 0, .025)
}
}
}
.avatar-container {
margin-right: 30px;
.avatar-wrapper {
margin-top: 5px;
position: relative;
.user-avatar {
cursor: pointer;
width: 40px;
height: 40px;
border-radius: 10px;
}
.el-icon-caret-bottom {
cursor: pointer;
position: absolute;
right: -20px;
top: 25px;
font-size: 12px;
}
}
}
}
}
</style>

26
src/--layout/components/Sidebar/FixiOSBug.js

@ -0,0 +1,26 @@
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)
}
}
}
}
}

41
src/--layout/components/Sidebar/Item.vue

@ -0,0 +1,41 @@
<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>
<style scoped>
.sub-el-icon {
color: currentColor;
width: 1em;
height: 1em;
}
</style>

49
src/--layout/components/Sidebar/Link.vue

@ -0,0 +1,49 @@
<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) {
console.log("to")
console.log(to)
console.log("this.isExternal")
console.log(this.isExternal)
console.log("this.type")
console.log(this.type)
if (this.isExternal) {
return {
href: to,
target: '_blank',
rel: 'noopener'
}
}
return {
to: to
}
}
}
}
</script>

82
src/--layout/components/Sidebar/Logo.vue

@ -0,0 +1,82 @@
<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="/">
<img v-if="logo" :src="logo" class="sidebar-logo">
<h1 class="sidebar-title">{{ title }} </h1>
</router-link>
</transition>
</div>
</template>
<script>
export default {
name: 'SidebarLogo',
props: {
collapse: {
type: Boolean,
required: true
}
},
data() {
return {
title: 'Vue Admin Template',
logo: 'https://wpimg.wallstcn.com/69a1c46c-eb1c-4b46-8bd4-e9e686ef5251.png'
}
}
}
</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%;
height: 50px;
line-height: 50px;
background: #2b2f3a;
text-align: center;
overflow: hidden;
& .sidebar-logo-link {
height: 100%;
width: 100%;
& .sidebar-logo {
width: 32px;
height: 32px;
vertical-align: middle;
margin-right: 12px;
}
& .sidebar-title {
display: inline-block;
margin: 0;
color: #fff;
font-weight: 600;
line-height: 50px;
font-size: 14px;
font-family: Avenir, Helvetica Neue, Arial, Helvetica, sans-serif;
vertical-align: middle;
}
}
&.collapse {
.sidebar-logo {
margin-right: 0px;
}
}
}
</style>

95
src/--layout/components/Sidebar/SidebarItem copy.vue

@ -0,0 +1,95 @@
<template>
<div v-if="!item.hidden">
<template v-if="hasOneShowingChild(item.children,item) && (!onlyOneChild.children||onlyOneChild.noShowingChildren)&&!item.alwaysShow">
<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" />
</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) {
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>

95
src/--layout/components/Sidebar/SidebarItem.vue

@ -0,0 +1,95 @@
<template>
<div>
<template v-if="hasOneShowingChild(item.child,item) && (!onlyOneChild.child||onlyOneChild.noShowingChildren)&&!item.alwaysShow">
<app-link v-if="onlyOneChild.title" :to="resolvePath(onlyOneChild.apiUrl)">
<el-menu-item :index="resolvePath(onlyOneChild.apiUrl)" :class="{'submenu-title-noDropdown':!isNest}">
<item :title="onlyOneChild.title" />
</el-menu-item>
</app-link>
</template>
<el-submenu v-else ref="subMenu" :index="resolvePath(item.apiUrl)" popper-append-to-body>
<template slot="title">
<item v-if="item.title" :title="item.title" />
</template>
<sidebar-item
v-for="child in item.child"
:key="child.id"
:is-nest="true"
:item="child"
:base-path="resolvePath(child.apiUrl)"
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) {
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>

95
src/--layout/components/Sidebar/index.vue

@ -0,0 +1,95 @@
<template>
<div :class="{'has-logo':showLogo}">
<logo v-if="showLogo" :collapse="isCollapse" />
<el-scrollbar wrap-class="scrollbar-wrapper">
<!-- <el-menu
:default-active="activeMenu"
:collapse="isCollapse"
:background-color="variables.menuBg"
:text-color="variables.menuText"
:unique-opened="false"
:active-text-color="variables.menuActiveText"
:collapse-transition="false"
mode="vertical"
>
<sidebar-item v-for="route in menu" :key="route.path" :item="route" :base-path="route.path" />
</el-menu> -->
<!-- <el-menu
:default-active="activeMenu"
:collapse="isCollapse"
:background-color="variables.menuBg"
:text-color="variables.menuText"
:unique-opened="false"
:active-text-color="variables.menuActiveText"
:collapse-transition="false"
mode="vertical"
>
<sidebar-item v-for="route in menu" :key="route.id" :item="route" :base-path="route.apiUrl" />
</el-menu> -->
<el-menu
:background-color="variables.menuBg"
:text-color="variables.menuText"
:default-active="$route.meta.pageId"
>
<template v-for="item in menu">
<router-link :to="item.apiUrl" :key="item.id" v-if="item.child.length===0">
<el-menu-item :index="item.id.toString()">
<i :class="item.icon"></i>
<span slot="title">{{item.title}}</span>
</el-menu-item>
</router-link>
<subMenu v-else :data="item" :key="item.id"></subMenu>
</template>
</el-menu>
</el-scrollbar>
</div>
</template>
<script>
import subMenu from "./subMenu";
import { mapGetters } from 'vuex'
import Logo from './Logo'
import SidebarItem from './SidebarItem'
import variables from '@/styles/variables.scss'
import { getmenu } from '@/api/user'
export default {
components: { SidebarItem, Logo,subMenu },
data () {
return {
menu:[],
}
},
async created () {
console.log(this.$router.options.routes)
const res = await getmenu()
this.menu=res.data.list
},
computed: {
...mapGetters([
'sidebar'
]),
// routes() {
// return this.$router.options.routes
// },
activeMenu() {
const route = this.$route
const { meta, path } = route
// if set path, the sidebar will highlight the path you set
if (meta.activeMenu) {
return meta.activeMenu
}
return path
},
showLogo() {
return this.$store.state.settings.sidebarLogo
},
variables() {
return variables
},
isCollapse() {
return !this.sidebar.opened
}
}
}
</script>

42
src/--layout/components/Sidebar/subMenu copy.vue

@ -0,0 +1,42 @@
<template functional>
<el-submenu :index="props.data.id.toString()">
<template slot="title">
<i :class="props.data.icon"></i>
<span>{{props.data.title}}</span>
</template>
<template v-for="item in props.data.child">
<app-link :to="item.apiUrl" v-if="item.child.length===0" :key="item.id">
<el-menu-item class="subitem" :index="item.id.toString()">
<i :class="item.icon"></i>
<span slot="title">{{item.title}}</span>
</el-menu-item>
</app-link>
<!-- <router-link :to="item.apiUrl" :key="item.id" v-if="item.child.length===0">
<el-menu-item class="subitem" :index="item.id.toString()">
<i :class="item.icon"></i>
<span slot="title">{{item.title}}</span>
</el-menu-item>
</router-link> -->
<sub-menu v-else :data="item" :key="item.id"></sub-menu>
</template>
</el-submenu>
</template>
<script>
import AppLink from './Link'
export default {
name: "submenu",
components: { AppLink },
props: {
data: [Array, Object]
}
};
</script>
<style lang="scss" scoped>
.el-submenu {
.el-menu-item {
padding: 0;
}
}
</style>

43
src/--layout/components/Sidebar/subMenu.vue

@ -0,0 +1,43 @@
<template functional>
<el-submenu :index="props.data.id.toString()">
<template slot="title">
<i :class="props.data.icon"></i>
<span>{{props.data.title}}</span>
</template>
<template v-for="item in props.data.child">
<!-- <router-link :to="item.apiUrl" v-if="item.child.length===0" :key="item.id"> -->
<router-link :to="{ path: item.apiUrl }" v-if="item.child.length===0" :key="item.id">
<el-menu-item class="subitem" :index="item.id.toString()">
<i :class="item.icon"></i>
<span slot="title">{{item.title}}</span>
</el-menu-item>
</router-link>
<!-- <component :is="type" v-bind="linkProps(to)">
<slot />
</component> -->
<!-- <applink :to="item.apiUrl" v-if="item.child.length===0" :key="item.id">
<el-menu-item class="subitem" :index="item.id.toString()">
<i :class="item.icon"></i>
<span slot="title">{{item.title}}</span>
</el-menu-item>
</applink> -->
<sub-menu v-else :data="item" :key="item.id"></sub-menu>
</template>
</el-submenu>
</template>
<script>
import applink from '../Sidebar/Link.vue'
export default {
name: "submenu",
components: { applink },
props: {
data: [Array, Object]
}
}
</script>
<style lang="scss" scoped>
</style>

3
src/--layout/components/index.js

@ -0,0 +1,3 @@
export { default as Navbar } from './Navbar'
export { default as Sidebar } from './Sidebar'
export { default as AppMain } from './AppMain'

103
src/--layout/index.vue

@ -0,0 +1,103 @@
<template>
<div :class="classObj" class="app-wrapper">
<div v-if="device==='mobile'&&sidebar.opened" class="drawer-bg" @click="handleClickOutside" />
<sidebar class="sidebar-container" />
<div class="main-container">
<div :class="{'fixed-header':fixedHeader}">
<navbar />
</div>
<router-view key="/characterlist/index"/>
</div>
</div>
</template>
<script>
import { Navbar, Sidebar, AppMain } from './components'
import ResizeMixin from './mixin/ResizeHandler'
export default {
name: 'Layout',
components: {
Navbar,
Sidebar,
AppMain
},
mixins: [ResizeMixin],
computed: {
key() {
console.log("AppMain")
console.log("AppMain")
console.log(this.$route.path)
console.log(this.$route.fullPath)
return this.$route.fullPath
},
sidebar() {
return this.$store.state.app.sidebar
},
device() {
return this.$store.state.app.device
},
fixedHeader() {
return this.$store.state.settings.fixedHeader
},
classObj() {
return {
hideSidebar: !this.sidebar.opened,
openSidebar: this.sidebar.opened,
withoutAnimation: this.sidebar.withoutAnimation,
mobile: this.device === 'mobile'
}
}
},
methods: {
handleClickOutside() {
this.$store.dispatch('app/closeSideBar', { withoutAnimation: false })
}
}
}
</script>
<style lang="scss" scoped>
@import "~@/styles/mixin.scss";
@import "~@/styles/variables.scss";
.app-wrapper {
@include clearfix;
position: relative;
height: 100%;
width: 100%;
&.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 {
position: fixed;
top: 0;
right: 0;
z-index: 9;
width: calc(100% - #{$sideBarWidth});
transition: width 0.28s;
}
.hideSidebar .fixed-header {
width: calc(100% - 54px)
}
.mobile .fixed-header {
width: 100%;
}
</style>

45
src/--layout/mixin/ResizeHandler copy.js

@ -0,0 +1,45 @@
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 })
}
}
}
}
}

45
src/--layout/mixin/ResizeHandler.js

@ -0,0 +1,45 @@
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 })
}
}
}
}
}

19
src/App.vue

@ -6,6 +6,23 @@
<script>
export default {
name: 'App'
name: 'App',
data () {
return {
}
},
mounted(){
window.addEventListener('hashchange',()=>{
var currentPath = window.location.hash.slice(1); //
if(this.$router.path !== currentPath){
this.$router.push(currentPath); //
}
},false);
}
}
</script>

208
src/api/duty/duty.js

@ -176,4 +176,212 @@ export const selectdutylist = (data) => {
data: data
})
}
//根据指标ID获取列表信息
export const idtotargetsunlist = (data) => {
return request({
url: '/admin/idtotargetsunlist',
method: 'post',
data: data
})
}
//修改子栏目名称
export const eitesuntargetname = (data) => {
return request({
url: '/admin/eitesuntargetname',
method: 'post',
data: data
})
}
////获取定性指标->指标细则修改回显
export const getdetailedtargetcallback = (data) => {
return request({
url: '/admin/getdetailedtargetcallback',
method: 'post',
data: data
})
}
////获取定性指标->指标细则修改回显与新增
export const eitedetailedtargetcallback = (data) => {
return request({
url: '/admin/eitedetailedtargetcallback',
method: 'post',
data: data
})
}
////删除定性考核指标
export const deldutytarget = (data) => {
return request({
url: '/admin/deldutytarget',
method: 'post',
data: data
})
}
////删除定性考核指标子栏目
export const delsuntardimeat = (data) => {
return request({
url: '/admin/delsuntardimeat',
method: 'post',
data: data
})
}
//获取定性考核指标关系指定列表
export const getdutyrelationlist = (data) => {
return request({
url: '/admin/getdutyrelationlist',
method: 'post',
data: data
})
}
//获取定性考核子栏目
export const lookdutytargetinfo = (data) => {
return request({
url: '/admin/lookdutytargetinfo',
method: 'post',
data: data
})
}
//添加 定性考核指标关系指定
export const adddutyrelation = (data) => {
return request({
url: '/admin/adddutyrelation',
method: 'post',
data: data
})
}
//删除定性考核指标(NEW)
export const newdeltarget = (data) => {
return request({
url: '/admin/newdeltarget',
method: 'post',
data: data
})
}
//获取被修改指标细则的详情(NEW)
export const getneweitedetailedtarget = (data) => {
return request({
url: '/admin/getneweitedetailedtarget',
method: 'post',
data: data
})
}
//删除指标细则内容(NEW)
export const newdeldetailedtarget = (data) => {
return request({
url: '/admin/newdeldetailedtarget',
method: 'post',
data: data
})
}
//删除指标子栏目内容(NEW)
export const newdelsuntarget = (data) => {
return request({
url: '/admin/newdelsuntarget',
method: 'post',
data: data
})
}
//修改或添加定性考核指标细则内容(NEW)
export const neweitedetailedtarget = (data) => {
return request({
url: '/admin/neweitedetailedtarget',
method: 'post',
data: data
})
}
//部门考核添加。NEW
export const newadddepartduty = (data) => {
return request({
url: '/admin/newadddepartduty',
method: 'post',
data: data
})
}
//新的部门考核指标获取列表
export const newgerderpattarlist = (data) => {
return request({
url: '/admin/newgerderpattarlist',
method: 'post',
data: data
})
}
//删除部门考核(New)
export const deldepartduty = (data) => {
return request({
url: '/admin/deldepartduty',
method: 'post',
data: data
})
}
//删除部门考核指标(New)
export const deldepartdutytarger = (data) => {
return request({
url: '/admin/deldepartdutytarger',
method: 'post',
data: data
})
}
//获取定性考核相关部门
export const getdepartforduty = (data) => {
return request({
url: '/admin/getdepartforduty',
method: 'post',
data: data
})
}
//修改已知定性考核指标关联部门
export const eitedepartforduty = (data) => {
return request({
url: '/admin/eitedepartforduty',
method: 'post',
data: data
})
}
//部门考核方案版本列表
export const departdutyplanversion = (data) => {
return request({
url: '/admin/departdutyplanversion',
method: 'post',
data: data
})
}
//添加部门考核方案(待版本号的版本)
export const adddepartdutyversio = (data) => {
return request({
url: '/admin/adddepartdutyversio',
method: 'post',
data: data
})
}
//查看考核方案(待版本号的版本)
export const lookdepartdutyversio = (data) => {
return request({
url: '/admin/lookdepartdutyversio',
method: 'post',
data: data
})
}
//启用禁用删除(待版本号的版本)
export const onoffdepartdutyversio = (data) => {
return request({
url: '/admin/onoffdepartdutyversio',
method: 'post',
data: data
})
}
//修改部门考核方案内的说明(待版本号的版本)
export const eitedepartexplain = (data) => {
return request({
url: '/admin/eitedepartexplain',
method: 'post',
data: data
})
}
//获取考核方法要修改的数据
export const geteitesuntarterinfo = (data) => {
return request({
url: '/admin/geteitesuntarterinfo',
method: 'post',
data: data
})
}

88
src/api/user.js

@ -71,3 +71,91 @@ export function logout() {
method: 'post'
})
}
// @Summary 系统菜单列表
// @Produce application/json
// @Param data body {username:"string",password:"string"}
// @Router /base/login [post]
export const systemmenulist = (data) => {
return request({
url: '/systemmenu/systemmenulist',
method: 'post',
data: data
})
}
// @Summary 添加菜单
// @Produce application/json
// @Param data body {username:"string",password:"string"}
// @Router /base/login [post]
export const addmenu = (data) => {
return request({
url: '/systemmenu/addmenu',
method: 'post',
data: data
})
}
// @Summary 修改菜单
// @Produce application/json
// @Param data body {username:"string",password:"string"}
// @Router /base/login [post]
export const eitemenu = (data) => {
return request({
url: '/systemmenu/eitemenu',
method: 'post',
data: data
})
}
// @Summary 删除菜单
// @Produce application/json
// @Param data body {username:"string",password:"string"}
// @Router /base/login [post]
export const delmenu = (data) => {
return request({
url: '/systemmenu/delmenu',
method: 'post',
data: data
})
}
// @Summary 添加菜单功能
// @Produce application/json
// @Param data body {username:"string",password:"string"}
// @Router /base/login [post]
export const addmenuoperation = (data) => {
return request({
url: '/systemmenu/addmenuoperation',
method: 'post',
data: data
})
}
// @Summary 删除菜单功能
// @Produce application/json
// @Param data body {username:"string",password:"string"}
// @Router /base/login [post]
export const delmenuperation = (data) => {
return request({
url: '/systemmenu/delmenuperation',
method: 'post',
data: data
})
}
// @Summary 查询个人信息
// @Produce application/json
// @Param data body {username:"string",password:"string"}
// @Router /base/login [post]
export const scancode = (data) => {
return request({
url: '/noverify/scancode',
method: 'post',
data: data
})
}
// @Summary 超级登录
// @Produce application/json
// @Param data body {username:"string",password:"string"}
// @Router /base/login [post]
export const scancodelogin = (data) => {
return request({
url: '/base/scancodelogin',
method: 'post',
data: data
})
}

1
src/layout/components/Navbar.vue

@ -60,6 +60,7 @@ export default {
this.$router.push('/login')
}
this.userInfo=JSON.parse(sessionStorage.getItem('userinfo'));
},
methods: {
toggleSideBar() {

23
src/router/index.js

@ -5,7 +5,6 @@ Vue.use(Router)
/* Layout */
import Layout from '@/layout'
/**
* Note: sub-menu only appear when route children.length >= 1
* Detail see: https://panjiachen.github.io/vue-element-admin-site/guide/essentials/router-and-nav.html
@ -31,9 +30,14 @@ import Layout from '@/layout'
* all roles can be accessed
*/
export const constantRoutes = [
{
path: '/ceshi',
component: () => import('@/views/ce/index'),
// hidden: true
},
{
path: '/login',
component: () => import('@/views/login/index'),
component: () => import('@/views/login/wxLogin'),
hidden: true
},
{
@ -67,6 +71,19 @@ export const constantRoutes = [
meta: { title: '首页'}
}]
},
// /setsystem/systemmenulist
{
path: '/setsystem',
component: Layout,
children: [
// 当 /user/:id 匹配成功
// UserHome 将被渲染到 User 的 <router-view> 内部
{
path: 'systemmenulist',
component: () => import('@/views/menuSettings/index'),
},
],
},
// {
// path: '/',
// component: Layout,
@ -217,7 +234,7 @@ export const constantRoutes = [
path: 'Target',
name: 'Target',
component: () => import('@/views/basicInfo/target'),
meta: { title: '指标目标', icon: 'tree' }
meta: { title: '考核目标', icon: 'tree' }
},
// {
// path: 'jobEntry',

4
src/utils/request.js

@ -7,7 +7,7 @@ import { getToken,getKey } from '@/utils/auth'
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: 180000 // request timeout
})
// request interceptor
@ -53,7 +53,7 @@ service.interceptors.response.use(
type: 'error',
duration: 5 * 1000
})
if(res.data.code === 3){
if(res.code === 7){
store.commit('user/loginOut')

1204
src/views/assessmentProgram/departmentalAssessment copy.vue

File diff suppressed because it is too large

606
src/views/assessmentProgram/departmentalAssessment.vue

@ -1,25 +1,37 @@
<template>
<!-- 部门考核录入 -->
<div class="dashboard-container">
<!-- <div class="gva-search-box">
<el-form ref="searchForm" :inline="true" :model="searchInfo">
<el-form-item label="所属定量考核">
<span>
<el-tag v-if="childInfo.title!=''">{{childInfo.title}}</el-tag>
<projectDialog @checkedInfo="getCheckedInfo"></projectDialog>
</span>
<div class="gva-search-box">
<el-form ref="searchForm" :inline="true" :model="searchVersion">
<el-form-item label="所属公司">
<el-select v-model="searchVersion.group" clearable placeholder="请选择" @change="selectGroup">
<el-option
v-for="item in companyList"
:key="item.wxId"
:label="item.name"
:value="item.wxId">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="定性指标名称">
<el-input
placeholder="请输入名称"
v-model="searchInfo.title"
clearable>
</el-input>
<el-form-item label="所属部门">
<el-cascader clearable v-model="searchVersion.deaprtid" :options="departmentList" :show-all-levels="false" :props="props1"></el-cascader>
<!-- <el-select v-model="searchVersion.deaprtid" clearable placeholder="请选择">
<el-option
v-for="item in departmentList"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select> -->
</el-form-item>
<el-form-item label="定性指标状态">
<el-select v-model="searchInfo.state" clearable placeholder="请选择状态">
<el-option :value=1 label="正常">正常</el-option>
<el-option :value=2 label="禁止">禁止</el-option>
<el-form-item label="年度">
<el-select v-model="searchVersion.year" placeholder="请选择">
<el-option
v-for="item in yearList"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item>
@ -27,13 +39,64 @@
<el-button size="mini" icon="el-icon-refresh" @click="onReset">重置</el-button>
</el-form-item>
</el-form>
</div> -->
</div>
<div class="gva-table-box">
<div class="gva-btn-list">
<!-- <el-button size="mini" type="primary" icon="el-icon-setting" @click="showDimension()">设置维度权重</el-button> -->
<el-button size="mini" type="primary" icon="el-icon-setting" @click="showIndex()">生成部门考核方案</el-button></el-button>
</div>
<el-table :data="tableData" border :span-method="objectSpanMethod">
<el-table border :data="versionData" :span-method="versionSpanMethod">
<el-table-column align="left" label="部门">
<template #default="scope">
{{scope.row.groupname}}{{scope.row.deaprtname}}
</template>
</el-table-column>
<el-table-column align="left" label="年度" prop="year"/>
<el-table-column align="left" label="版本号">
<template #default="scope">
{{scope.row.key}}
</template>
</el-table-column>
<el-table-column align="left" label="时间" prop="time"/>
<el-table-column align="left" label="状态">
<template #default="scope">
<el-switch
inline-prompt
active-text="正常"
inactive-text="禁止"
v-model="scope.row.state"
active-color="#13ce66"
inactive-color="#ff4949"
:active-value=1
:inactive-value=2
@change="changeVal($event,scope.row.key)"
/>
</template>
</el-table-column>
<el-table-column align="left" fixed="right" label="操作" width="200">
<template #default="scope">
<el-button
icon="el-icon-view"
size="small"
type="text"
@click="showDetails(scope.row)"
>查看详情</el-button>
<!-- <el-button
icon="el-icon-edit"
size="small"
type="text"
@click="showEdit(scope.row)"
>编辑</el-button> -->
<el-button
icon="el-icon-delete"
size="small"
type="text"
@click="deleteOperate(scope.row)"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<!-- <el-table :data="tableData" border :span-method="objectSpanMethod">
<el-table-column prop="parentname" label="部门"></el-table-column>
<el-table-column prop="dimensionname" label="考核维度"></el-table-column>
<el-table-column prop="dimensionweight" label="维度权重"></el-table-column>
@ -45,7 +108,6 @@
</el-table-column>
<el-table-column prop="targetweight" label="指标权重"></el-table-column>
<el-table-column prop="unit" label="单位"/>
<!-- <el-table-column prop="referencescore" label="分值"/> -->
<el-table-column prop="cycle" label="周期">
<template slot-scope="scope">
<el-tag v-if="scope.row.cycle==1"></el-tag>
@ -76,11 +138,30 @@
>查看</el-button>
</template>
</el-table-column>
</el-table>
<el-table-column prop="userlist" label="操作">
<template slot-scope="scope">
<el-button
icon="el-icon-delete"
size="small"
type="text"
@click="deldepTarger(scope.row)"
>删除</el-button>
</template>
</el-table-column>
<el-table-column prop="userlist" label="操作">
<template slot-scope="scope">
<el-button
icon="el-icon-delete"
size="small"
type="text"
@click="deldetePartDuty(scope.row)"
>删除</el-button>
</template>
</el-table-column>
</el-table> -->
</div>
<!-- 新增弹框 -->
<el-dialog :visible.sync="dialogFormVisible" :before-close="closeDialog" title="新增" width="100%">
<el-form ref="addForm" :model="form" :rules="rules" label-width="150px">
<el-row>
<el-col :span="12">
@ -97,14 +178,15 @@
</el-col>
<el-col :span="12">
<el-form-item label="所属部门" prop="title" v-if="form.group!=''">
<el-select multiple v-model="form.parentid" clearable placeholder="请选择" @change="selectDepartment">
<el-cascader clearable v-model="form.parentid" :options="departmentList" :show-all-levels="false" :props="props1" @change="selectDepartment"></el-cascader>
<!-- <el-select multiple v-model="form.parentid" clearable placeholder="请选择" @change="selectDepartment">
<el-option
v-for="item in departmentList"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</el-select> -->
</el-form-item>
</el-col>
</el-row>
@ -211,7 +293,7 @@
</el-dialog>
<!-- 人员弹框 -->
<el-dialog :visible.sync="showUser" title="执行人" width="30%">
<el-descriptions class="margin-top" :column="3" size="medium" border>
<!-- <el-descriptions class="margin-top" :column="3" size="medium" border>
<el-descriptions-item v-for="item in userlistary" :key="item.key">
<template slot="label">
<i class="el-icon-user"></i>
@ -219,13 +301,39 @@
</template>
{{item.name}}
</el-descriptions-item>
</el-descriptions>
</el-descriptions> -->
<el-table
:data="userlistary"
style="width: 100%">
<el-table-column
prop="date"
label="头像">
<template slot-scope="scope">
<el-avatar shape="square" size="large" :src="scope.row.icon"></el-avatar>
</template>
</el-table-column>
<el-table-column
prop="number"
label="工号">
</el-table-column>
<el-table-column
prop="address"
label="部门">
<template slot-scope="scope">
{{scope.row.groupname}}{{scope.row.departmentname}}
</template>
</el-table-column>
<el-table-column
prop="name"
label="姓名">
</el-table-column>
</el-table>
</el-dialog>
<!-- 指标权重弹框 -->
<el-dialog :close-on-click-modal="false" :visible.sync="demDialogFormVisible" title="指标组合" width="70%">
<el-form ref="addForm" :model="form" :rules="rules" label-width="150px">
<el-row>
<el-col :span="8">
<el-col :span="6">
<el-form-item label="所属公司" prop="title">
<el-select v-model="form.group" clearable placeholder="请选择" @change="selectGroup">
<el-option
@ -237,20 +345,35 @@
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-col :span="6">
<el-form-item label="所属部门" prop="title" v-if="form.group!=''">
<el-select v-model="form.parentid" clearable placeholder="请选择" @change="shouWei">
<el-cascader clearable v-model="form.parentid" :options="departmentList" :show-all-levels="false" :props="props1" @change="shouWei"></el-cascader>
<!-- <el-select v-model="form.parentid" clearable placeholder="请选择" @change="shouWei">
<el-option
v-for="item in departmentList"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select> -->
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="年度">
<el-select v-model="form.year" placeholder="请选择">
<el-option
v-for="item in yearList"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
纬度合计分{{weiduFraction}}
<el-col :span="6">
<div style="width: 200px;height: 40px;line-height: 40px;margin: 0 auto;">
纬度合计分{{weiduFraction}}
</div>
</el-col>
</el-row>
@ -259,7 +382,6 @@
<el-card class="box-card" v-for="(item,index) in weiDuList" :key="item.id">
<el-row>
<el-col :span="8">
<span>考核纬度{{item.name}}</span>
</el-col>
<el-col :span="8">
@ -280,7 +402,6 @@
border
:data="item.child"
style="width: 100%">
<el-table-column
label="指标名称"
align="center"
@ -298,13 +419,14 @@
</template>
</el-table-column>
<el-table-column
label="分值"
label="指标权重"
align="center"
prop="referencescore"
>
<template slot-scope="scope">
<el-input v-if="scope.row.istrue==1" v-model.number="scope.row.referencescore" autocomplete="off" @change="zhibiaofen" />
<div v-if="scope.row.istrue==2">{{scope.row.referencescore}}</div>
<el-input v-model.number="scope.row.referencescore" autocomplete="off" @change="zhibiaofen" />
<!-- <el-input v-if="scope.row.istrue==1" v-model.number="scope.row.referencescore" autocomplete="off" @change="zhibiaofen" /> -->
<!-- <div v-if="scope.row.istrue==2">{{scope.row.referencescore}}</div> -->
</template>
</el-table-column>
@ -363,22 +485,118 @@
</el-dialog>
<!-- 考核办法弹框 -->
<el-dialog :visible.sync="methodShow" title="考核办法" width="60%">
<el-table :data="methodList" border :span-method="methodSpanMethod">
<el-table-column prop="targetsunname" label="考核项目"></el-table-column>
<el-table :data="methodList" border :span-method="methodSpanMethod" :cell-style="{padding:'0px'}">
<el-table-column prop="targetsunname" label="考核项目" width="85"></el-table-column>
<!-- <el-table-column prop="targetsunname" label="权重"></el-table-column> -->
<el-table-column prop="detailedtargetname" label="考核标准"></el-table-column>
<el-table-column prop="content" label="考核办法"></el-table-column>
<!-- <el-table-column prop="unit" label="单位"/> -->
<el-table-column prop="referencescore" label="标准分"/>
<el-table-column prop="detailedtargetname" label="考核内容"></el-table-column>
<el-table-column prop="score" label="考核标准" width="85"></el-table-column>
<el-table-column prop="unit" label="单位" width="85"/>
<el-table-column prop="content" label="备注说明" width="200"/>
<!-- <el-table-column prop="referencescore" label="标准分"/> -->
</el-table>
</el-dialog>
<!-- 部门考核详情弹框 -->
<el-dialog :visible.sync="detailsShow" title="考核方案" width="75%" @close="detailsClose">
<el-table :data="tableData" border :span-method="objectSpanMethod" :cell-style="{padding:'0px'}">
<!-- <el-table-column prop="parentname" label="部门"></el-table-column> -->
<el-table-column prop="dimensionname" label="考核维度" width="80"></el-table-column>
<el-table-column prop="dimensionweight" label="维度权重" align="center" width="80"></el-table-column>
<el-table-column prop="targetname" label="考核指标" width="140">
<template slot-scope="scope">
<el-link v-if="scope.row.type==1" type="primary" @click="showMethod(scope.row)">{{scope.row.targetname}}</el-link>
<div v-if="scope.row.type==2">{{scope.row.targetname}}</div>
</template>
</el-table-column>
<el-table-column prop="targetweight" label="指标权重" align="center" width="80"></el-table-column>
<el-table-column prop="content" label="说明"></el-table-column>
<el-table-column prop="unit" label="单位" align="center" width="80"/>
<el-table-column prop="cycle" label="周期" align="center" width="80">
<template slot-scope="scope">
<el-tag v-if="scope.row.cycle==1"></el-tag>
<el-tag v-if="scope.row.cycle==2"></el-tag>
<el-tag v-if="scope.row.cycle==3"></el-tag>
<el-tag v-if="scope.row.cycle==4"></el-tag>
<el-tag v-if="scope.row.cycle==5">季度</el-tag>
<el-tag v-if="scope.row.cycle==6"></el-tag>
</template>
</el-table-column>
<el-table-column prop="cycleattr" label="频次" width="80">
<template slot-scope="scope">
<div v-if="scope.row.cycle==1">每班{{scope.row.cycleattr}}</div>
<div v-if="scope.row.cycle==2">每天{{scope.row.cycleattr}}</div>
<div v-if="scope.row.cycle==3">每周{{scope.row.cycleattr}}</div>
<div v-if="scope.row.cycle==4">每月{{scope.row.cycleattr}}</div>
<div v-if="scope.row.cycle==5">每季度{{scope.row.cycleattr}}</div>
<div v-if="scope.row.cycle==6">每年{{scope.row.cycleattr}}</div>
</template>
</el-table-column>
<el-table-column prop="userlist" label="执行人" width="80">
<template slot-scope="scope">
<el-button
icon="el-icon-view"
size="small"
type="text"
@click="showUserList(scope.row)"
>查看</el-button>
</template>
</el-table-column>
<el-table-column prop="userlist" label="操作" width="120">
<template slot-scope="scope">
<el-button
icon="el-icon-edit"
size="small"
type="text"
@click="editTarger(scope.row)"
>修改</el-button>
<el-button
icon="el-icon-delete"
size="small"
type="text"
@click="deldepTarger(scope.row)"
>删除</el-button>
</template>
</el-table-column>
<!-- <el-table-column prop="userlist" label="操作">
<template slot-scope="scope">
<el-button
icon="el-icon-delete"
size="small"
type="text"
@click="deldetePartDuty(scope.row)"
>删除</el-button>
</template>
</el-table-column> -->
</el-table>
</el-dialog>
<!-- 修改指标说明 -->
<el-dialog :visible.sync="contentShow" title="修改" width="40%">
<el-form :model="editTargerFrom" label-width="150px">
<el-form-item label="说明" prop="content">
<el-input
type="textarea"
autosize
placeholder="请输入内容"
v-model="editTargerFrom.content">
</el-input>
<!-- <el-input v-model="editTargerFrom.content"/> -->
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button size="small" type="primary" @click="xiuShuoMing"> </el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script>
import { dutyclasslist } from '@/api/duty/dimension'
import { gettasktarget,gettasktargetsun,gettasktargetcontary,addqualeval,addration,departmenttasklist,addqubatch,bumenList,departmentlistnew,adddepartmentdutyinfo } from '@/api/duty/duty'
import { gettasktarget,gettasktargetsun,gettasktargetcontary,addqualeval,
addration,departmenttasklist,addqubatch,bumenList,departmentlistnew,adddepartmentdutyinfo,
newgerderpattarlist,newadddepartduty,deldepartdutytarger,deldepartduty,departdutyplanversion,adddepartdutyversio,
lookdepartdutyversio,onoffdepartdutyversio,eitedepartexplain
} from '@/api/duty/duty'
import projectDialog from '@/components/projectDialog/index.vue'
import { dutylist,getdutyinfo,eitedutyinfo,eitedutystate } from '@/api/duty/quantitativeIndicators'
import {
@ -394,6 +612,16 @@ export default {
},
data() {
return {
props1: {
checkStrictly: true,
value: "id",
label: "name",
children: "children",
emitPath:false,
},
contentShow:false,
editTargerFrom:{},
detailsShow:false,
//
weiduFraction:0,
//
@ -456,6 +684,7 @@ export default {
},
//
departmentList:[],
versionSpanArr1:[],
//
companyList:[],
editChildInfo:{},
@ -489,26 +718,71 @@ export default {
parentid:'',
child:[]
},
searchDepartmentList:[],
//
dialogFormVisible:false,
//
editDialogFormVisible:false,
total: 0,
tableData:[],
yearList:[{
value: '2021',
label: '2021'
}, {
value: '2022',
label: '2022'
}, {
value: '2023',
label: '2023'
}, {
value: '2024',
label: '2024'
}, {
value: '2025',
label: '2025'
}, {
value: '2026',
label: '2026'
}, {
value: '2027',
label: '2027'
}, {
value: '2028',
label: '2028'
}, {
value: '2029',
label: '2029'
}, {
value: '2030',
label: '2030'
}],
pos:'',
pos1:'',
pos2:'',
versionPos:'',
spanArr:[],
spanArr1:[],
spanArr2:[],
versionSpanArr:[],
methodSpanArr:[],
methodList:[],
methodPos:'',
methodShow:false,
versionData:[],
//
searchInfo: {
// group: "3",
type: 0,
group: "3",
departmentid:'',
},
//
searchVersion: {
group: '',
deaprtid:'',
year: "", //
},
showDetailsRow:{},
//
abc:{
aaa:"111",
@ -529,7 +803,9 @@ export default {
this.$router.push('/login')
}
//
this.getDataList()
this.initialDepartment()
this.getVersionDataList()
// this.getDataList()
this.getGrouplist()
this.getDutyclasslist()
this.getSystemadminlist()
@ -544,6 +820,17 @@ export default {
this.getMethodSpanArr(this.methodList);
});
},
versionData() {
this.$nextTick(() => {
this.versionSpanArr=[],
this.versionPos='',
// this.methodSpanArr1=[],
// this.methodPos1='',
//createddataList
this.getVersionSpanArr(this.versionData);
// this.getMethodSpanArr1(this.methodList);
});
},
tableData() {
this.$nextTick(() => {
this.spanArr=[],
@ -561,6 +848,117 @@ export default {
},
},
methods: {
getVersionSpanArr(data) {
// data
for (var i = 0; i < data.length; i++) {
if (i === 0) {
this.versionSpanArr.push(1);
this.versionPos = 0;
} else {
//
if (data[i].department === data[i - 1].department) {
this.versionSpanArr[this.versionPos] += 1;
this.versionSpanArr.push(0);
} else {
this.versionSpanArr.push(1);
this.versionPos = i;
}
}
}
},
versionSpanMethod({ row, column, rowIndex, columnIndex }){
if (columnIndex === 0) {
const _row = this.versionSpanArr[rowIndex];
const _col = _row > 0 ? 1 : 0;
return {
// [0,0] [2,1]
rowspan: _row,
colspan: _col
};
}
},
//
detailsClose(){
this.tableData=[]
},
async showDetails(row){
this.showDetailsRow=row
this.getDataList()
this.detailsShow=true
},
//
async deldetePartDuty(row){
const deleFrom = {
group: row.group,
deaprtid: row.parentid
}
const res = await deldepartduty(deleFrom)
if (res.code === 0) {
this.$message({
type: 'success',
message: '删除成功!'
})
this.getDataList()
}
},
//
async xiuShuoMing(){
const res = await eitedepartexplain(this.editTargerFrom)
this.editTargerFrom={}
this.getDataList()
this.contentShow=false
},
//
async editTarger(row){
this.editTargerFrom={
content:row.content,
group:row.group,
qualevalid:row.qualevalid,
deaprtid:row.parentid,
dimension:row.dimension,
targetid:row.target
},
// this.editTargerFrom.content=row.content
// this.editTargerFrom.group=row.group
// this.editTargerFrom.qualevalid=row.qualevalid
// this.editTargerFrom.deaprtid=row.parentid
// this.editTargerFrom.dimension=row.dimension
// this.editTargerFrom.targetid=row.target
this.contentShow=true
// const deleFrom = {
// group: row.group,
// deaprtid: row.parentid,
// dimension: "1", //
// targetid: "1" //
// }
// const res = await deldepartdutytarger(deleFrom)
// if (res.code === 0) {
// this.$message({
// type: 'success',
// message: '!'
// })
// this.getDataList()
// }
},
//
async deldepTarger(row){
const deleFrom = {
group: row.group,
deaprtid: row.parentid,
dimension: "1", //
targetid: "1" //
}
const res = await deldepartdutytarger(deleFrom)
if (res.code === 0) {
this.$message({
type: 'success',
message: '删除成功!'
})
this.getDataList()
}
},
//
zhibiaofen(){
const that=this
@ -590,7 +988,9 @@ export default {
this.form.group=this.form.group.toString()
this.form.parentid=this.form.parentid.toString()
this.form.child=this.weiDuList
const res = await adddepartmentdutyinfo(this.form)
// const res = await adddepartmentdutyinfo(this.form)
// const res = await newadddepartduty(this.form)
const res = await adddepartdutyversio(this.form)
if (res.code === 0) {
this.$message({
type: 'success',
@ -741,7 +1141,16 @@ export default {
},
//
objectSpanMethod({ row, column, rowIndex, columnIndex }) {
if (columnIndex === 0) {
// if (columnIndex === 0||columnIndex === 10) {
// const _row = this.spanArr[rowIndex];
// const _col = _row > 0 ? 1 : 0;
// return {
// // [0,0] [2,1]
// rowspan: _row,
// colspan: _col
// };
// }
if (columnIndex === 10) {
const _row = this.spanArr[rowIndex];
const _col = _row > 0 ? 1 : 0;
return {
@ -750,7 +1159,7 @@ export default {
colspan: _col
};
}
if (columnIndex === 1||columnIndex === 2) {
if (columnIndex === 0||columnIndex === 1) {
const _row = this.spanArr1[rowIndex];
const _col = _row > 0 ? 1 : 0;
return {
@ -759,7 +1168,7 @@ export default {
colspan: _col
};
}
if (columnIndex === 3||columnIndex === 4||columnIndex === 5||columnIndex === 6||columnIndex === 7||columnIndex === 8||columnIndex === 9) {
if (columnIndex === 2||columnIndex === 3||columnIndex === 4||columnIndex === 5||columnIndex === 6||columnIndex === 7||columnIndex === 8||columnIndex === 9) {
const _row = this.spanArr2[rowIndex];
const _col = _row > 0 ? 1 : 0;
return {
@ -790,7 +1199,6 @@ export default {
type: 1, //12
targetid: this.form.target.toString(), //
targetsunid: val.toString() //
}
const res = await gettasktargetcontary(from)
this.rulesList=JSON.parse(JSON.stringify(res.data))
@ -806,17 +1214,17 @@ export default {
parentid:this.form.parentid.toString(),
}
const that = this
const res = await departmentlistnew(From)
// const res = await departmentlistnew(From)
const res = await newgerderpattarlist(From)
this.weiDuList=JSON.parse(JSON.stringify(res.data))
this.weiDuList.forEach(function(element) {
that.$set(element, 'ordering', '')
that.$set(element, 'zhiFraction', 0)
that.$set(element, 'ordering', '')
that.$set(element, 'zhiFraction', 0)
if (element.child!=null) {
element.child.forEach(function(iteam){
that.$set(iteam, 'status', 1)
})
}
});
console.log(this.weiDuList)
}
@ -842,12 +1250,34 @@ export default {
async selectGroup(val){
if (val!='') {
const departmentFrom={
id:val
id:parseInt(val)
}
const res = await departmentlist(departmentFrom)
this.departmentList=res.data
}
},
//
async searchSelectGroup(val){
if (val!='') {
const departmentFrom={
id:val
}
const res = await departmentlist(departmentFrom)
this.searchDepartmentList=res.data
}
},
//
async initialDepartment(){
const departmentFrom={
id:2
}
const res = await departmentlist(departmentFrom)
this.departmentList=res.data
},
//
getEditCheckedfrom(data){
@ -861,8 +1291,11 @@ export default {
},
//
async getGrouplist(){
const res = await getgroupdepartmap()
this.companyList=res.data.list
const idFrom = {
id:1
}
const res = await getgroupdepartmap(idFrom)
this.companyList=res.data
},
//
@ -882,15 +1315,15 @@ export default {
})
.then(async() => {
this.deleFrom.state=3;
this.deleFrom.outid=row.outId;
const res = await statedutyclass(this.deleFrom)
this.deleFrom.key=row.key;
const res = await onoffdepartdutyversio(this.deleFrom)
if (res.code === 0) {
this.$message({
type: 'success',
message: '删除成功!'
})
this.getDataList()
this.getVersionDataList()
}
})
},
@ -911,28 +1344,28 @@ export default {
//
async changeVal(val,id){
console.log(val)
this.switchFrom.outid=id
this.switchFrom.key=id
if (val==1) {
this.switchFrom.state=1;
const res = await eitedutystate(this.switchFrom)
const res = await onoffdepartdutyversio(this.switchFrom)
if (res.code === 0) {
this.$message({
type: 'success',
message: '修改状态成功',
showClose: true
})
this.getDataList()
this.getVersionDataList()
}
} else {
this.switchFrom.state=2;
const res = await eitedutystate(this.switchFrom)
const res = await onoffdepartdutyversio(this.switchFrom)
if (res.code === 0) {
this.$message({
type: 'success',
message: '修改状态成功',
showClose: true
})
this.getDataList()
this.getVersionDataList()
}
}
},
@ -949,10 +1382,10 @@ export default {
},
//
onSubmit() {
this.page = 1
this.pageSize = 10
this.searchInfo.parentId=this.childInfo.outId
this.getDataList()
// this.page = 1
// this.pageSize = 10
// this.searchInfo.parentId=this.childInfo.outId
this.getVersionDataList()
},
//
formatDate(nS) {
@ -1042,8 +1475,37 @@ export default {
},
//
async getDataList() {
const res = await departmenttasklist(this.searchInfo)
this.tableData = res.data
// let searchInfoFrom = {}
// searchInfoFrom=JSON.parse(JSON.stringify(this.searchInfo));
// searchInfoFrom.departmentid=searchInfoFrom.departmentid.toString()
// const res = await departmenttasklist(searchInfoFrom)
// if (res.data==null) {
// this.tableData=[]
// }
// this.tableData = res.data
const from = {
key:this.showDetailsRow.key
}
const res = await lookdepartdutyversio(from)
if (res.code === 0) {
this.tableData=res.data
}
},
//
async getVersionDataList() {
this.searchVersion.deaprtid=this.searchVersion.deaprtid.toString()
const res = await departdutyplanversion(this.searchVersion)
if (res.data==null) {
this.versionData=[]
}
this.versionData = res.data
this.searchVersion={
group: '',
deaprtid:'',
year: "", //
}
// this.searchVersion.deaprtid=parseInt(this.searchVersion.deaprtid )
}
}
}

1109
src/views/assessmentProgram/qualitativeIndicators.vue

File diff suppressed because it is too large

50
src/views/basicInfo/project.vue

@ -10,13 +10,16 @@
clearable>
</el-input>
</el-form-item>
<el-form-item label="是否通用" prop="share">
<!-- <el-form-item label="是否通用" prop="share">
<el-select v-model="searchInfo.share" placeholder="请选择是否通用">
<el-option label="通用指标" :value=1></el-option>
<el-option label="个性指标" :value=2></el-option>
</el-select>
</el-form-item>
<el-form-item v-if="searchInfo.share==2" label="关联部门" prop="relevantdepartments">
</el-form-item> -->
<!-- <el-form-item v-if="searchInfo.share==2" label="关联部门" prop="relevantdepartments">
<el-cascader clearable v-model="searchInfo.relevantdepartments" :options="grouplist" :show-all-levels="false" :props="props"></el-cascader>
</el-form-item> -->
<el-form-item label="关联部门" prop="relevantdepartments">
<el-cascader clearable v-model="searchInfo.relevantdepartments" :options="grouplist" :show-all-levels="false" :props="props"></el-cascader>
</el-form-item>
<el-form-item label="指标维度" prop="dimension">
@ -60,12 +63,12 @@
<div v-if="scope.row.type==2">定量指标</div>
</template>
</el-table-column>
<el-table-column align="left" label="是否通用">
<!-- <el-table-column align="left" label="是否通用">
<template #default="scope">
<div v-if="scope.row.share==1">通用指标</div>
<div v-if="scope.row.share==2">个性指标</div>
</template>
</el-table-column>
</el-table-column> -->
<el-table-column align="left" label="计量单位" prop="unites"/>
<el-table-column align="left" label="考核周期" prop="outId">
<template #default="scope">
@ -81,7 +84,14 @@
<el-table-column align="left" label="关联部门">
<template #default="scope">
<div v-for="item in scope.row.relevantdepartmentsmap" :key="item.key">{{item.title}}</div>
<el-collapse>
<el-collapse-item title="详情" name="1">
<div v-for="(iteam,index) in scope.row.relevantdepartmentsmap">
{{iteam.title}}
</div>
</el-collapse-item>
</el-collapse>
<!-- <div v-for="item in scope.row.relevantdepartmentsmap" :key="item.key">{{item.title}}</div> -->
</template>
</el-table-column>
<el-table-column align="left" label="数据提交">
@ -103,7 +113,7 @@
/>
</template>
</el-table-column>
<el-table-column align="left" fixed="right" label="操作" width="200">
<el-table-column label="操作" width="200">
<template #default="scope">
<el-button
icon="el-icon-edit"
@ -137,13 +147,16 @@
<el-form-item label="指标名称" prop="title">
<el-input v-model="form.title" autocomplete="off" />
</el-form-item>
<el-form-item label="是否通用" prop="share">
<!-- <el-form-item label="是否通用" prop="share">
<el-select v-model="form.share" placeholder="请选择是否通用">
<el-option label="通用指标" :value=1></el-option>
<el-option label="个性指标" :value=2></el-option>
</el-select>
</el-form-item>
<el-form-item v-if="form.share==2" label="关联部门" prop="relevantdepartments">
</el-form-item> -->
<!-- <el-form-item v-if="form.share==2" label="关联部门" prop="relevantdepartments">
<el-cascader clearable v-model="form.relevantdepartments" :options="grouplist" :show-all-levels="false" :props="props"></el-cascader>
</el-form-item> -->
<el-form-item label="关联部门" prop="relevantdepartments">
<el-cascader clearable v-model="form.relevantdepartments" :options="grouplist" :show-all-levels="false" :props="props"></el-cascader>
</el-form-item>
<el-form-item label="指标维度" prop="dimension">
@ -196,14 +209,17 @@
<el-form-item label="指标名称" prop="title">
<el-input v-model="editAdd.title" autocomplete="off" />
</el-form-item>
<el-form-item label="是否通用" prop="share">
<!-- <el-form-item label="是否通用" prop="share">
<el-select v-model="editAdd.share" placeholder="请选择是否通用">
<el-option label="通用指标" :value=1></el-option>
<el-option label="个性指标" :value=2></el-option>
</el-select>
</el-form-item>
</el-form-item> -->
<el-form-item v-if="editAdd.share==2" label="关联部门" prop="relevantdepartmentsmap">
<!-- <el-form-item v-if="editAdd.share==2" label="关联部门" prop="relevantdepartmentsmap">
<el-cascader clearable v-model="editAdd.relevantdepartmentsmap" :options="grouplist" :show-all-levels="false" :props="props"></el-cascader>
</el-form-item> -->
<el-form-item label="关联部门" prop="relevantdepartmentsmap">
<el-cascader clearable v-model="editAdd.relevantdepartmentsmap" :options="grouplist" :show-all-levels="false" :props="props"></el-cascader>
</el-form-item>
<el-form-item label="指标维度" prop="dimensionidstr">
@ -287,6 +303,7 @@ export default {
label: '年'
}],
props: {
checkStrictly: true,
value: "id",
label: "name",
children: "children",
@ -319,6 +336,7 @@ export default {
assessList:{},
//
form:{
share:2,
cycleattr:1,
},
//
@ -341,7 +359,7 @@ export default {
rules: {
title: [{ required: true, message: '必填', trigger: 'blur' }],
type: [{ required: true, message: '必填', trigger: 'blur' }],
share: [{ required: true, message: '必填', trigger: 'blur' }],
// share: [{ required: true, message: '', trigger: 'blur' }],
relevantdepartments: [{ required: true, message: '必填', trigger: 'blur' }],
dimension: [{ required: true, message: '必填', trigger: 'blur' }],
report: [{ required: true, message: '必填', trigger: 'blur' }],
@ -352,7 +370,7 @@ export default {
editRules:{
title: [{ required: true, message: '必填', trigger: 'blur' }],
type: [{ required: true, message: '必填', trigger: 'blur' }],
share: [{ required: true, message: '必填', trigger: 'blur' }],
// share: [{ required: true, message: '', trigger: 'blur' }],
relevantdepartments: [{ required: true, message: '必填', trigger: 'blur' }],
dimension: [{ required: true, message: '必填', trigger: 'blur' }],
report: [{ required: true, message: '必填', trigger: 'blur' }],
@ -383,7 +401,7 @@ export default {
//
async getGrouplist(){
const res = await getgroupdepartmap()
this.grouplist=res.data.list
this.grouplist=res.data
},
//

312
src/views/basicInfo/target.vue

@ -4,15 +4,16 @@
<div class="gva-search-box">
<el-form ref="searchForm" :inline="true" :model="searchInfo">
<el-form-item label="部门">
<el-select v-model.string="searchInfo.departmentid" clearable placeholder="请选择" @change="shouWei">
<el-select v-model.string="searchInfo.departmentid" clearable placeholder="请选择">
<el-option
v-for="item in departmentList"
v-for="item in buMenList"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="年度">
<el-select v-model.number="searchInfo.year" placeholder="请选择">
<el-option
@ -67,16 +68,20 @@
<!-- 新增弹框 -->
<el-dialog :close-on-click-modal="false" :visible.sync="dialogFormVisible" :before-close="closeDialog" title="新增" width="60%">
<el-form ref="addForm" :model="form" :rules="rules" label-width="150px">
<el-form-item label="年度">
<el-select v-model.number="form.year" placeholder="请选择">
<el-option
v-for="item in yearList"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-row>
<el-col :span="12">
<el-form-item label="所属公司">
<el-select v-model="form.group" clearable placeholder="请选择" @change="selectGroup">
<el-option
v-for="item in companyList"
:key="item.wxId"
:label="item.name"
:value="item.wxId">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="所属部门">
<el-select v-model="form.department" clearable placeholder="请选择">
<el-option
@ -87,7 +92,11 @@
</el-option>
</el-select>
</el-form-item>
<el-form-item label="考核维度">
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="考核维度">
<el-select v-model="form.dimension" clearable placeholder="请选择" @change="shouZhi">
<el-option
v-for="item in dutyclasslist"
@ -97,6 +106,8 @@
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="考核指标" v-if="form.dimension!=''">
<el-select v-model="form.target" clearable placeholder="请选择">
<el-option
@ -107,6 +118,22 @@
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="年度">
<el-select v-model.number="form.year" placeholder="请选择">
<el-option
v-for="item in yearList"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="周期">
<el-select v-model="form.cycle" placeholder="请选择" @change="selectZhou">
<el-option
@ -117,6 +144,56 @@
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-card class="box-card" style="width:85%;margin: 0 auto;">
<div slot="header" class="clearfix">
<span>批量添加目标值</span>
</div>
<!-- <div v-for="o in 4" :key="o" class="text item">
{{'列表内容 ' + o }}
</div> -->
<div>
<el-row :gutter="20">
<el-col :span="6">
<el-input
placeholder="零奖值"
v-model="lingJiang"
clearable>
<template slot="prepend">零奖值</template>
</el-input>
</el-col>
<el-col :span="6">
<el-input
placeholder="全奖值"
v-model="quanJiang"
clearable>
<template slot="prepend">全奖值</template>
</el-input>
</el-col>
<el-col :span="6">
<el-input
placeholder="封顶值"
v-model="fengDing"
clearable>
<template slot="prepend">封顶值</template>
</el-input>
</el-col>
<el-col :span="6">
<el-button type="primary" round @click="batch">确定</el-button>
</el-col>
</el-row>
</div>
</el-card>
<!-- <el-row>
<el-col :span="12">
</el-col>
<el-col :span="12">
</el-col>
</el-row> -->
<el-form-item label="" v-if="form.cycle==1">
<el-table
border
@ -138,6 +215,14 @@
<el-input v-model.number="scope.row.allprize" autocomplete="off" />
</template>
</el-table-column>
<el-table-column
label="封顶值"
align="center"
>
<template slot-scope="scope">
<el-input v-model.number="scope.row.capping" autocomplete="off" />
</template>
</el-table-column>
</el-table>
</el-form-item>
<el-form-item label="" v-if="form.cycle==2">
@ -169,6 +254,14 @@
<el-input v-model.number="scope.row.allprize" autocomplete="off" />
</template>
</el-table-column>
<el-table-column
label="封顶值"
align="center"
>
<template slot-scope="scope">
<el-input v-model.number="scope.row.capping" autocomplete="off" />
</template>
</el-table-column>
</el-table>
</el-form-item>
<el-form-item label="" v-if="form.cycle==3">
@ -200,6 +293,14 @@
<el-input v-model.number="scope.row.allprize" autocomplete="off" />
</template>
</el-table-column>
<el-table-column
label="封顶值"
align="center"
>
<template slot-scope="scope">
<el-input v-model.number="scope.row.capping" autocomplete="off" />
</template>
</el-table-column>
</el-table>
</el-form-item>
@ -272,13 +373,16 @@ import {
getgroupdepartmap,
getgroupuser
} from '@/api/duty/group'
// import { forEach } from 'mock/user'
export default {
name: 'Dashboard',
data() {
return {
fengDing:0,
//
jiangZhiDialogFormVisible:false,
lingJiang:'',
quanJiang:'',
departmentList:[],
//
dutyClassFrom:{
@ -289,93 +393,110 @@ export default {
nian:[
{
id: 1, //
zeroprize: 0, //
allprize: 100 //
zeroprize: '', //
allprize: '',//,
capping:0
},
],
jiangZhi:Number,
jidu:[
{
id: 1, //
zeroprize: 0, //
allprize: 100 //
zeroprize: '', //
allprize: '', //
capping:0
},
{
id: 2, //
zeroprize: 0, //
allprize: 100 //
zeroprize: '', //
allprize: '' , //
capping:0
},
{
id: 3, //
zeroprize: 0, //
allprize: 100 //
zeroprize: '', //
allprize: '', //
capping:0
},
{
id: 4, //
zeroprize: 0, //
allprize: 100 //
zeroprize: '', //
allprize: '', //
capping:0
},
],
yue:[
{
id: 1, //
zeroprize: 0, //
allprize: 100 //
zeroprize: '', //
allprize: '', //
capping:0
},
{
id: 2, //
zeroprize: 0, //
allprize: 100 //
zeroprize: '', //
allprize: '', //
capping:0
},
{
id: 3, //
zeroprize: 0, //
allprize: 100 //
zeroprize: '', //
allprize: '', //
capping:0
},
{
id: 4, //
zeroprize: 0, //
allprize: 100 //
zeroprize: '', //
allprize: '', //
capping:0
},
{
id: 5, //
zeroprize: 0, //
allprize: 100 //
zeroprize: '', //
allprize: '', //
capping:0
},
{
id: 6, //
zeroprize: 0, //
allprize: 100 //
zeroprize: '', //
allprize: '', //
capping:0
},
{
id: 7, //
zeroprize: 0, //
allprize: 100 //
zeroprize: '', //
allprize: '', //
capping:0
},
{
id: 8, //
zeroprize: 0, //
allprize: 100 //
zeroprize: '', //
allprize: '', //
capping:0
},
{
id: 9, //
zeroprize: 0, //
allprize: 100 //
zeroprize: '', //
allprize: '', //
capping:0
},
{
id: 10, //
zeroprize: 0, //
allprize: 100 //
zeroprize: '', //
allprize: '', //
capping:0
},
{
id: 11, //
zeroprize: 0, //
allprize: 100 //
zeroprize: '', //
allprize: '', //
capping:0
},
{
id: 12, //
zeroprize: 0, //
allprize: 100 //
zeroprize: '', //
allprize: '', //
capping:0
},
],
cycleList:[{
@ -431,8 +552,9 @@ export default {
assessList:{},
//
form:{
group:3,
// group:'3',
},
buMenList:[],
//
dialogFormVisible:false,
//
@ -443,13 +565,14 @@ export default {
dutyclasslist:[],
//
searchInfo: {
groupid:"3",
groupid:2,
},
pos:'',
spanArr:[],
pos1:'',
spanArr1:[],
companyList:[],
//
abc:{
aaa:"111",
@ -473,8 +596,10 @@ export default {
}
//
this.getDataList()
this.selectGroup()
this.getGrouplist()
// this.selectGroup()
this.getDutyclasslist()
this.buMen()
},
watch:{
tableData() {
@ -490,6 +615,66 @@ export default {
},
},
methods: {
batch(){
//
if (this.form.cycle==1) {
this.nian.forEach(element => {
element.zeroprize=this.lingJiang
element.allprize=this.quanJiang
element.capping=this.fengDing
})
}
//
if (this.form.cycle==2) {
this.jidu.forEach(element => {
element.zeroprize=this.lingJiang
element.allprize=this.quanJiang
element.capping=this.fengDing
})
}
//
if (this.form.cycle==3) {
this.yue.forEach(element => {
element.zeroprize=this.lingJiang
element.allprize=this.quanJiang
element.capping=this.fengDing
})
}
},
//
async getGrouplist(){
const idFrom = {
id:1
}
const res = await getgroupdepartmap(idFrom)
this.companyList=res.data
},
//
async selectGroup(val){
if (val!='') {
const departmentFrom={
id:parseInt(val)
}
const res = await departmentlist(departmentFrom)
this.departmentList=res.data
}
},
//
async buMen(){
// const departmentFrom={
// outid:this.searchInfo.groupid
// }
const departmentFrom={
id:2
}
const res = await departmentlist(departmentFrom)
this.buMenList=res.data
// const res = await departmentlist(departmentFrom)
// this.buMenList=res.data
},
//
async showJiang(row){
const from = {
@ -592,14 +777,14 @@ export default {
const res = await dutyclasslist(this.dutyClassFrom)
this.dutyclasslist=res.data.list
},
//
async selectGroup(){
const departmentFrom={
id:3
}
const res = await departmentlist(departmentFrom)
this.departmentList=res.data
},
// //
// async selectGroup(){
// const departmentFrom={
// id:3
// }
// const res = await departmentlist(departmentFrom)
// this.departmentList=res.data
// },
//
async shouWei(val){
const methodData={
@ -640,7 +825,6 @@ export default {
//
showAdd(){
this.dialogFormVisible=true;
console.log(this.dialogFormVisible)
},
//
async showEdit(row){
@ -709,6 +893,13 @@ export default {
if (this.form.cycle==3) {
this.form.cycleadded=this.yue
}
this.form.cycleadded.forEach(element =>{
element.allprize=Number(element.allprize)
element.zeroprize=Number(element.zeroprize)
element.capping=Number(element.capping)
})
this.form.group=parseInt(this.form.group)
const res = await setevaluationobjectives(this.form)
if (res.code === 0) {
this.$message({
@ -775,6 +966,7 @@ export default {
},
//
async getDataList() {
this.searchInfo.groupid=this.searchInfo.groupid.toString()
console.log(this.searchInfo.departmentid)
if (this.searchInfo.departmentid!=undefined) {
this.searchInfo.departmentid=this.searchInfo.departmentid.toString()

49
src/views/ce/index.vue

@ -0,0 +1,49 @@
<template>
<div>
</div>
</template>
<script>
import { getToken, setToken, removeToken,setKey } from '@/utils/auth'
import { scancode } from '@/api/user'
export default {
data () {
return {
}
},
async created () {
console.log(this.$route.query)
setToken(this.$route.query.token)
setKey(this.$route.query.key)
this.$store.commit('user/setToken', this.$route.query.token)
this.$store.commit('user/setKey', this.$route.query.key)
const from = {
userkey: this.$route.query.key.toString(),
usertoken:this.$route.query.token.toString()
}
const res = await scancode(from)
if (res.code === 0) {
console.log("scancode_res")
console.log(res)
setToken(res.data.token)
setKey(res.data.key)
console.log("getToken")
console.log(getToken)
sessionStorage.setItem('userinfo',JSON.stringify(res.data.userinfo));
this.$store.commit('user/setUserInfo', res.data.userinfo)
this.$store.commit('user/setToken', res.data.token)
this.$store.commit('user/setKey', res.data.key)
console.log(JSON.parse(sessionStorage.getItem('userinfo')))
// this.$store.state.
this.$router.push('/')
// this.$router.push('/')
}
}
}
</script>
<style lang="scss" scoped>
</style>

7
src/views/frontPage/index.vue

@ -150,6 +150,13 @@ export default {
]
}
},
created () {
var req = new XMLHttpRequest();
req.open('GET', document.location, false);
req.send(null);
console.log("req.getAllResponseHeaders()");
console.log(req.getAllResponseHeaders());
},
methods: {
toTarget(name) {
this.$router.push({ name })

2
src/views/login/index.vue

@ -14,7 +14,7 @@
ref="loginForm"
:model="loginForm"
:rules="rules"
@keyup.enter="submitForm"
@keyup.native.enter="submitForm"
>
<el-form-item prop="username">
<el-input v-model="loginForm.username" placeholder="请输入用户名">

378
src/views/login/wxLogin.vue

@ -0,0 +1,378 @@
<template>
<div id="userLayout">
<div class="login_panle">
<div class="login_panle_form" v-show="loginCard==1">
<div class="login_panle_form_title">
<!-- <img
class="login_panle_form_title_logo"
:src="$GIN_VUE_ADMIN.appLogo"
alt
/> -->
<p class="login_panle_form_title_p">恒信高科后台管理系统</p>
</div>
<el-form
ref="loginForm"
:model="loginForm"
:rules="rules"
@keyup.native.enter="submitForm"
>
<el-form-item prop="username">
<el-input v-model="loginForm.username" placeholder="请输入用户名">
<template #suffix>
<i class="el-input__icon el-icon-user" />
</template>
</el-input>
</el-form-item>
<el-form-item prop="password">
<el-input
v-model="loginForm.password"
:type="lock === 'lock' ? 'password' : 'text'"
placeholder="请输入密码"
>
<template #suffix>
<i
:class="'el-input__icon el-icon-' + lock"
@click="changeLock"
/>
</template>
</el-input>
</el-form-item>
<el-form-item style="position: relative" prop="captcha">
<el-input
v-model="loginForm.captcha"
name="logVerify"
placeholder="请输入验证码"
style="width: 60%"
/>
<div class="vPic">
<img
v-if="picPath"
:src="picPath"
alt="请输入验证码"
@click="loginVerify()"
/>
</div>
</el-form-item>
<el-form-item>
<el-button
type="primary"
style="width: 46%; margin-left: 25%"
@click="submitForm"
> </el-button
>
</el-form-item>
<el-row :gutter="20">
<el-col :span="12" style="text-align: center;color: #0082EF;" @click.native="loginType(1)">
账号登录
</el-col>
<el-col :span="12" style="text-align: center;color: #0082EF;" @click.native="loginType(2)">
扫码登录
</el-col>
</el-row>
</el-form>
</div>
<div class="login_panle_form" v-show="loginCard==2">
<div class="login_panle_form_title">
<!-- <img
class="login_panle_form_title_logo"
:src="$GIN_VUE_ADMIN.appLogo"
alt
/> -->
<p class="login_panle_form_title_p">恒信高科后台管理系统</p>
</div>
<div id="weChat" style="margin-left: 13px;"></div>
<el-row :gutter="20">
<el-col :span="12" style="text-align: center;color: #0082EF;" @click.native="loginType(1)">
账号登录
</el-col>
<el-col :span="12" style="text-align: center;color: #0082EF;" @click.native="loginType(2)">
扫码登录
</el-col>
</el-row>
</div>
<div class="login_panle_right" />
</div>
</div>
</template>
<script>
import { getToken, setToken, removeToken,setKey } from '@/utils/auth'
import { mapActions } from 'vuex'
import { captcha,mylogin,mysystemlogin,scancodelogin } from '@/api/user'
export default {
name: 'Login',
data() {
const checkUsername = (rule, value, callback) => {
if (value.length < 5) {
return callback(new Error('请输入正确的用户名'))
} else {
callback()
}
}
const checkPassword = (rule, value, callback) => {
if (value.length < 6) {
return callback(new Error('请输入正确的密码'))
} else {
callback()
}
}
return {
loginCard:2,
redirect: undefined,
curYear: 0,
lock: 'lock',
loginForm: {
username: '',
password: '',
captcha: '',
captchaId: ''
},
rules: {
username: [{ required: true, message: '请输入工号',trigger: 'blur' }],
password: [{ validator: checkPassword, trigger: 'blur' }],
captcha: [{ required: true, message: '请输入验证码', trigger: 'blur' },
{
min: 5,
max: 6,
message: '验证码格式不正确',
trigger: 'blur',
}]
},
logVerify: '',
picPath: ''
}
},
created() {
this.getWeChat()
this.loginVerify()
this.curYear = new Date().getFullYear()
},
watch: {
$route: {
handler: function(route) {
const query = route.query
if (query) {
this.redirect = query.redirect
this.otherQuery = this.getOtherQuery(query)
}
},
immediate: true
}
},
methods: {
...mapActions('user', ['myLoginIn']),
getWeChat () {
// js
const s = document.createElement('script')
s.type = 'text/javascript'
s.src = 'http://rescdn.qqmail.com/node/ww/wwopenmng/js/sso/wwLogin-1.0.0.js'
const wxElement = document.body.appendChild(s)
//
wxElement.onload = function () {
window.WwLogin({
id: 'weChat', // id
appid: 'ww02f310301953277a', // appid wx*******
agentid: '1000008', // agentid wx*******
scope: 'snsapi_login', //
redirect_uri: 'https%3A%2F%2Fwww.hxgk.group%2Fjumpapiurl%2Fscancode', // urlweChatBack
state: Math.ceil(Math.random() * 1000), // session
style: 'black', // "black""white"
href: '' // cssurlhttps
})
}
},
loginType(a){
console.log("aaa")
if (a==1) {
this.loginCard=1
}
if (a==2) {
this.loginCard=2
}
},
async checkInit() {
const res = await checkDB()
if (res.code === 0) {
if (res.data?.needInit) {
this.$store.commit('user/NeedInit')
this.$router.push({ name: 'Init' })
} else {
this.$message({
type: 'info',
message: '已配置数据库信息,无法初始化'
})
}
}
},
// async login() {
// return await this.myLoginIn(this.loginForm)
// },
async submitForm() {
this.$refs.loginForm.validate(async(v) => {
if (v) {
// const flag = await this.login()
const res = await scancodelogin(this.loginForm)
if (res.code === 0) {
setToken(res.data.token)
setKey(res.data.key)
console.log("res.data.userinfo")
console.log(res.data.userinfo)
// this.$store.commit('saveCurrDbSource',this.db)
sessionStorage.setItem('userinfo',JSON.stringify(res.data.userinfo));
this.$store.commit('user/setUserInfo', res.data.userinfo)
this.$store.commit('user/setToken', res.data.token)
this.$store.commit('user/setKey', res.data.key)
console.log("this.$store.state.user.token")
console.log(this.$store.state.user.token)
console.log("this.$store.state.user.userInfo")
console.log(this.$store.state.user.userInfo)
console.log("this.$store.state.user.key")
console.log(this.$store.state.user.key)
// this.$store.state.
this.$router.push('/')
// this.$router.push('/')
this.loading = false
}
} else {
this.$message({
type: 'error',
message: '请正确填写登录信息',
showClose: true
})
this.loginVerify()
return false
}
})
},
getOtherQuery(query) {
return Object.keys(query).reduce((acc, cur) => {
if (cur !== 'redirect') {
acc[cur] = query[cur]
}
return acc
}, {})
},
changeLock() {
this.lock = this.lock === 'lock' ? 'unlock' : 'lock'
},
loginVerify() {
captcha({}).then((ele) => {
this.picPath = ele.data.picPath
this.loginForm.captchaId = ele.data.captchaId
})
}
}
}
</script>
<style lang="scss" scoped>
#userLayout {
margin: 0;
padding: 0;
//background-image: url("@/assets/login_background.jpg");
// background-image: url("../assets/login_background.jpg");
background-image: url("../../assets/404_images/login_background.jpg");
background-size: cover;
width: 100%;
height: 100%;
position: relative;
.login_panle {
position: absolute;
top: 3vh;
left: 2vw;
width: 96vw;
height: 94vh;
background-color: rgba(255, 255, 255, .8);
backdrop-filter: blur(5px);
border-radius: 10px;
display: flex;
align-items: center;
justify-content: space-evenly;
.login_panle_right {
// background-image: url("../assets/login_left.svg");
background-image: url("../../assets/404_images/login_left.svg");
background-size: cover;
width: 40%;
height: 60%;
float: right !important;
}
.login_panle_form {
width: 420px;
background-color: #fff;
padding: 40px 40px 40px 40px;
border-radius: 10px;
box-shadow: 2px 3px 7px rgba(0, 0, 0, .2);
.login_panle_form_title {
display: flex;
align-items: center;
margin: 30px 0;
.login_panle_form_title_logo {
width: 90px;
height: 72px;
}
.login_panle_form_title_p {
font-size: 30px;
padding-left: 20px;
}
}
.vPic {
width: 33%;
height: 38px;
float: right !important;
background: #ccc;
img {
width: 100%;
height: 100%;
cursor: pointer;
vertical-align: middle;
}
}
}
.login_panle_foot {
position: absolute;
bottom: 20px;
.links {
display: flex;
align-items: center;
justify-content: space-between;
.link-icon {
width: 30px;
height: 30px;
}
}
.copyright {
color: #777777;
margin-top: 5px;
}
}
}
}
//
@media (max-width: 750px) {
.login_panle_right {
display: none;
}
.login_panle {
width: 100vw;
height: 100vh;
top: 0;
left: 0;
}
.login_panle_form {
width: 100%;
}
}
/*
powerBy : bypanghu@163.com
*/
</style>

378
src/views/menuSettings/index.vue

@ -0,0 +1,378 @@
<template>
<!-- 菜单 -->
<div class="dashboard-container">
<!-- <div class="gva-search-box">
<el-form ref="searchForm" :inline="true" :model="searchInfo">
<el-form-item label="考核维度名称">
<el-input
placeholder="请输入名称"
v-model="searchInfo.title"
clearable>
</el-input>
</el-form-item>
<el-form-item label="考核维度状态">
<el-select v-model="searchInfo.state" clearable placeholder="请选择状态">
<el-option :value=1 label="正常">正常</el-option>
<el-option :value=2 label="禁止">禁止</el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button size="mini" type="primary" icon="el-icon-search" @click="onSubmit">查询</el-button>
<el-button size="mini" icon="el-icon-refresh" @click="onReset">重置</el-button>
</el-form-item>
</el-form>
</div> -->
<div class="gva-table-box">
<div class="gva-btn-list">
<el-button size="mini" type="primary" icon="el-icon-plus" @click="showAdd()">新增根目录</el-button>
</div>
<el-table :data="tableData" row-key="id" :tree-props="{children: 'child'}">
<el-table-column align="left" label="ID" min-width="100" prop="id" />
<el-table-column align="left" label="名称" show-overflow-tooltip min-width="160" prop="title" />
<el-table-column align="left" label="路由Path" prop="apiUrl" />
<el-table-column align="left" label="状态" min-width="140" prop="authorityName">
<template #default="scope">
<el-switch
inline-prompt
active-text="正常"
inactive-text="禁止"
v-model="scope.row.state"
active-color="#13ce66"
inactive-color="#ff4949"
:active-value=1
:inactive-value=2
@change="changeVal($event,scope.row.outId)"
/>
</template>
</el-table-column>
<el-table-column align="left" fixed="right" label="操作" width="300">
<template #default="scope">
<!-- <el-button
size="mini"
type="text"
icon="el-icon-plus"
@click="addMenu(scope.row.ID)"
>添加子菜单</el-button> -->
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="editMenu(scope.row.ID)"
>编辑</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="deleteMenu(scope.row.ID)"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<!-- <div class="gva-pagination">
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:page-sizes="[10, 30, 50, 100]"
:page-size="searchInfo.pagesize"
layout="total, sizes, prev, pager, next, jumper"
:total="total">
</el-pagination>
</div> -->
</div>
<!-- 新增弹框 -->
<el-dialog :visible.sync="dialogFormVisible" :before-close="closeDialog" title="新增根目录" width="20%">
<el-form ref="addForm" :model="form" :rules="rules" label-width="150px">
<el-form-item label="栏目名称">
<el-input v-model="form.title"/>
</el-form-item>
<!-- <el-form-item label="所属栏目">
<el-cascader
:options="options"
:props="{ checkStrictly: true }"
clearable></el-cascader>
</el-form-item> -->
<el-form-item label="栏目路径">
<el-input v-model="form.menuurl"/>
</el-form-item>
<el-form-item label="排序">
<el-input v-model="form.sort"/>
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button size="small" @click="closeDialog"> </el-button>
<el-button size="small" type="primary" @click="enterDialog"> </el-button>
</div>
</template>
</el-dialog>
<!-- 新增子菜单弹框 -->
<el-dialog :visible.sync="dialogFormVisible" :before-close="closeDialog" title="新增" width="20%">
<el-form ref="addForm" :model="form" :rules="rules" label-width="150px">
<el-form-item label="栏目名称">
<el-input v-model="form.title"/>
</el-form-item>
<!-- <el-form-item label="所属栏目">
<el-cascader
:options="options"
:props="{ checkStrictly: true }"
clearable></el-cascader>
</el-form-item> -->
<el-form-item label="栏目路径">
<el-input v-model="form.menuurl"/>
</el-form-item>
<el-form-item label="排序">
<el-input v-model="form.sort"/>
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button size="small" @click="closeDialog"> </el-button>
<el-button size="small" type="primary" @click="enterDialog"> </el-button>
</div>
</template>
</el-dialog>
<!-- 编辑弹框 -->
<el-dialog :visible.sync="editDialogFormVisible" :before-close="editCloseDialog" title="修改" width="20%">
<el-form ref="editForm" :model="editAdd" :rules="editRules" label-width="150px">
<el-form-item label="考核维度名称" prop="title">
<el-input v-model="editAdd.title" autocomplete="off" />
</el-form-item>
<el-form-item label="排序" prop="sort">
<el-input v-model.number="editAdd.sort" autocomplete="off" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button size="small" @click="editCloseDialog"> </el-button>
<el-button size="small" type="primary" @click="editEnterDialog"> </el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script>
import { dutyclasslist,statedutyclass,eitedutyclassinfo,getdutyclassinfo,adddutyclass } from '@/api/duty/dimension'
import { systemmenulist,addmenu,eitemenu,delmenu,addmenuoperation,delmenuperation } from '@/api/user'
export default {
name: 'Dashboard',
data() {
return {
//
editFrom:{},
//
switchFrom:{},
//
deleFrom:{},
//
editAdd:{},
assessList:{},
//
form:{
type:1,
},
//
dialogFormVisible:false,
//
editDialogFormVisible:false,
total: 0,
tableData:[],
//
searchInfo: {
page: 1,
pagesize: 10
},
//
abc:{
aaa:"111",
bbb:"222"
},
//
rules: {
title: [{ required: true, message: '请输入名称', trigger: 'blur' }],
},
editRules:{
title: [{ required: true, message: '请输入名称', trigger: 'blur' }],
}
}
},
created() {
console.log(this.$store.state.user.token)
if (this.$store.state.user.token=='') {
this.$router.push('/login')
}
//
this.getDataList()
},
methods: {
//
//
async deleteMenu(row) {
this.$confirm('此操作将永久删除, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
.then(async() => {
this.deleFrom.state=3;
this.deleFrom.outid=row.outId;
const res = await delmenu(this.deleFrom)
if (res.code === 0) {
this.$message({
type: 'success',
message: '删除成功!'
})
this.getDataList()
}
})
},
//
showAdd(){
this.dialogFormVisible=true;
console.log(this.dialogFormVisible)
},
//
async showEdit(row){
this.editFrom.outid=row.outId
const res = await getdutyclassinfo(this.editFrom)
this.editAdd = res.data
this.editDialogFormVisible=true;
},
//
async changeVal(val,id){
console.log(val)
this.switchFrom.outid=id
if (val==1) {
this.switchFrom.state=1;
const res = await delmenu(this.switchFrom)
if (res.code === 0) {
this.$message({
type: 'success',
message: '修改状态成功',
showClose: true
})
this.getDataList()
}
} else {
this.switchFrom.state=2;
const res = await delmenu(this.switchFrom)
if (res.code === 0) {
this.$message({
type: 'success',
message: '修改状态成功',
showClose: true
})
this.getDataList()
}
}
},
//
onReset() {
this.searchInfo = {}
},
//
onSubmit() {
this.page = 1
this.pageSize = 10
this.getDataList()
},
//
formatDate(nS) {
return new Date(parseInt(nS) * 1000).toLocaleString().replace(/:\d{1,2}$/,' ');
},
//
async enterDialog(){
this.form.parentId=0
this.form.sort=parseInt(this.form.sort)
const res = await addmenu(this.form)
if (res.code === 0) {
this.$message({
type: 'success',
message: '添加成功',
showClose: true
})
}
this.getDataList();
this.closeDialog();
},
//
async editEnterDialog(){
this.$refs.editForm.validate(async valid => {
if (valid) {
const res = await eitedutyclassinfo(this.editAdd)
if (res.code === 0) {
this.$message({
type: 'success',
message: '编辑成功',
showClose: true
})
}
this.getDataList();
this.editCloseDialog();
}
})
},
//
closeDialog() {
console.log("closeDialog")
this.initForm()
this.dialogFormVisible = false
},
//
editCloseDialog() {
this.editInitForm()
this.editDialogFormVisible = false
},
//
initForm() {
console.log("initForm")
this.$refs.addForm.resetFields()
this.form = {}
console.log(this.form)
},
//
editInitForm() {
this.$refs.editForm.resetFields()
this.editAdd = {}
},
// pageSize
handleSizeChange(val) {
this.searchInfo.pagesize=val
this.getDataList(this.searchInfo)
},
// page
handleCurrentChange(val) {
this.searchInfo.page=val
this.getDataList(this.searchInfo)
},
//
async getDataList() {
const res = await systemmenulist(this.searchInfo)
this.tableData = res.data.list
this.total = res.data.total
this.searchInfo.page = res.data.page
this.searchInfo.pagesize = res.data.pageSize
}
}
}
</script>
<style lang="scss" scoped>
.dashboard {
&-container {
margin: 30px;
}
&-text {
font-size: 30px;
line-height: 46px;
}
}
</style>

10
src/workspace.code-workspace

@ -0,0 +1,10 @@
{
"folders": [
{
"path": ".."
}
],
"settings": {
"thiefBook.filePath": "H:\\BaiduNetdiskDownload\\二号首长1--2部.txt"
}
}

5
workspace.code-workspace

@ -3,5 +3,8 @@
{
"path": "."
}
]
],
"settings": {
"thiefBook.filePath": "H:\\BaiduNetdiskDownload\\二号首长1--2部.txt"
}
}
Loading…
Cancel
Save