Browse Source

绩效后台20220426

main
renguanyu111 4 years ago
parent
commit
71cd86a7f2
  1. 48
      src/--layout/components/AppMain.vue
  2. 152
      src/--layout/components/Navbar.vue
  3. 26
      src/--layout/components/Sidebar/FixiOSBug.js
  4. 41
      src/--layout/components/Sidebar/Item.vue
  5. 49
      src/--layout/components/Sidebar/Link.vue
  6. 82
      src/--layout/components/Sidebar/Logo.vue
  7. 95
      src/--layout/components/Sidebar/SidebarItem copy.vue
  8. 95
      src/--layout/components/Sidebar/SidebarItem.vue
  9. 95
      src/--layout/components/Sidebar/index.vue
  10. 42
      src/--layout/components/Sidebar/subMenu copy.vue
  11. 43
      src/--layout/components/Sidebar/subMenu.vue
  12. 3
      src/--layout/components/index.js
  13. 103
      src/--layout/index.vue
  14. 45
      src/--layout/mixin/ResizeHandler copy.js
  15. 45
      src/--layout/mixin/ResizeHandler.js
  16. 19
      src/App.vue
  17. 88
      src/api/user.js
  18. 1
      src/layout/components/Navbar.vue
  19. 21
      src/router/index.js
  20. 50
      src/views/assessmentProgram/departmentalAssessment.vue
  21. 205
      src/views/assessmentProgram/qualitativeIndicators.vue
  22. 3
      src/views/basicInfo/project.vue
  23. 20
      src/views/basicInfo/target.vue
  24. 49
      src/views/ce/index.vue
  25. 7
      src/views/frontPage/index.vue
  26. 378
      src/views/login/wxLogin.vue
  27. 378
      src/views/menuSettings/index.vue

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>

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() {

21
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,

50
src/views/assessmentProgram/departmentalAssessment.vue

@ -14,15 +14,16 @@
</el-select>
</el-form-item>
<el-form-item label="所属部门">
<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-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="searchVersion.year" placeholder="请选择">
<el-option
@ -177,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>
@ -345,14 +347,15 @@
</el-col>
<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-select> -->
</el-form-item>
</el-col>
<el-col :span="6">
@ -609,6 +612,13 @@ export default {
},
data() {
return {
props1: {
checkStrictly: true,
value: "id",
label: "name",
children: "children",
emitPath:false,
},
contentShow:false,
editTargerFrom:{},
detailsShow:false,
@ -767,7 +777,7 @@ export default {
},
//
searchVersion: {
group: "3",
group: '',
deaprtid:'',
year: "", //
},
@ -1189,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))
@ -1263,7 +1272,7 @@ export default {
async initialDepartment(){
const departmentFrom={
id:3
id:2
}
const res = await departmentlist(departmentFrom)
this.departmentList=res.data
@ -1282,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
},
//
@ -1489,7 +1501,7 @@ export default {
}
this.versionData = res.data
this.searchVersion={
group: "3",
group: '',
deaprtid:'',
year: "", //
}

205
src/views/assessmentProgram/qualitativeIndicators.vue

@ -162,7 +162,7 @@
</el-table>
</div>
<!-- 新增弹框 -->
<el-dialog :close-on-click-modal="false" :visible.sync="dialogFormVisible" :before-close="closeDialog" title="新增" width="65%">
<el-dialog :close-on-click-modal="false" :visible.sync="dialogFormVisible" :before-close="closeDialog" title="新增" width="80%">
<el-form ref="addForm" :model="form" :rules="rules" label-width="150px">
<el-row>
<el-col :span="8">
@ -191,7 +191,7 @@
</el-col>
<el-col :span="8">
<el-form-item label="所属部门" prop="title" v-show="parentidShow">
<el-cascader clearable v-model="form.parentid" :options="grouplist" :show-all-levels="false" :props="props"></el-cascader>
<el-cascader clearable v-model="form.parentid" :options="departmentList" :show-all-levels="false" :props="props"></el-cascader>
<!-- <el-select multiple v-model="form.parentid" clearable placeholder="请选择">
<el-option
v-for="item in departmentList"
@ -204,7 +204,6 @@
</el-col>
</el-row>
<!-- <el-row>
<el-col :span="12">
<el-form-item label="考核维度">
<el-select v-model="form.dimension" clearable placeholder="请选择状态">
@ -284,7 +283,7 @@
<!-- <el-input v-model="scope.row.unit"></el-input> -->
</template>
</el-table-column>
<el-table-column
<el-table-column
label="操作类型"
align="center">
<template slot-scope="scope">
@ -295,7 +294,44 @@
</el-select>
</template>
</el-table-column>
<el-table-column
label="检查方式"
align="center">
<template slot-scope="scope">
<el-select multiple v-model="scope.row.censortype" clearable placeholder="请选择">
<el-option label="现场检查" :value=1></el-option>
<el-option label="资料审查" :value=2></el-option>
<el-option label="事件触发" :value=3></el-option>
</el-select>
</template>
</el-table-column>
<el-table-column
label="检查周期"
align="center">
<template slot-scope="scope">
<el-select v-model="scope.row.cycle" clearable placeholder="请选择">
<el-option label="月" :value=4></el-option>
<el-option label="季度" :value=5></el-option>
<el-option label="半年" :value=7></el-option>
<el-option label="年" :value=6></el-option>
</el-select>
</template>
</el-table-column>
<el-table-column
label="检查频次"
align="center">
<template slot-scope="scope">
<el-input v-model.number="scope.row.censorrate"></el-input>
</template>
</el-table-column>
<el-table-column
label="客观证据"
align="center">
<template slot-scope="scope">
<el-input v-model="scope.row.detailedtargetcontent"></el-input>
</template>
</el-table-column>
<el-table-column
label="备注说明"
align="center"
@ -306,7 +342,7 @@
type="textarea"
autosize
placeholder="请输入内容"
v-model="scope.row.content">
v-model="scope.row.detailedtargetcontent">
</el-input>
<!-- <el-input v-model="scope.row.content" autocomplete="off" /> -->
</template>
@ -498,7 +534,7 @@
</template>
</el-dialog>
<!-- 考核办法弹框 -->
<el-dialog :visible.sync="methodShow" title="考核办法" width="60%">
<el-dialog :visible.sync="methodShow" title="考核办法" width="75%">
<div class="gva-search-box">
<el-form :inline="true" :model="searchfu">
<el-form-item label="所属公司">
@ -512,15 +548,33 @@
</el-select>
</el-form-item>
<el-form-item label="所属部门">
<el-select v-model="searchfu.deaprtid" clearable placeholder="请选择">
<el-cascader clearable v-model="searchfu.deaprtid" :options="searchDepartmentList" :show-all-levels="false" :props="props1"></el-cascader>
<!-- <el-select v-model="searchfu.deaprtid" clearable placeholder="请选择">
<el-option
v-for="item in searchDepartmentList"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</el-select> -->
</el-form-item>
<el-form-item label="检查方式">
<el-select multiple v-model="searchfu.censortype" clearable placeholder="请选择">
<el-option label="现场检查" :value="1"></el-option>
<el-option label="资料审查" :value="2"></el-option>
<el-option label="事件触发" :value="3"></el-option>
</el-select>
</el-form-item>
<el-form-item label="检查周期">
<el-select v-model="searchfu.censorrate" clearable placeholder="请选择">
<el-option label="月" :value=4></el-option>
<el-option label="季度" :value=5></el-option>
<el-option label="半年" :value=7></el-option>
<el-option label="年" :value=6></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button size="mini" type="primary" icon="el-icon-search" @click="onSubmitsearchfu">查询</el-button>
</el-form-item>
@ -543,6 +597,33 @@
<el-table-column prop="detailedtargetname" label="考核内容"></el-table-column>
<el-table-column prop="scoreing" label="考核标准" width="80" align="center"></el-table-column>
<el-table-column prop="unit" label="单位" width="80" align="center"/>
<el-table-column prop="unit" label="检查方式" width="120" align="center">
<template #default="scope">
<div v-for="(iteam,index) in scope.row.censortype" :key="index">
<el-tag v-if="iteam==1">现场检查</el-tag>
<el-tag v-if="iteam==2">资料检查</el-tag>
<el-tag v-if="iteam==3">事件触发</el-tag>
</div>
</template>
</el-table-column>
<el-table-column prop="censorcont" label="客观证据" width="120" align="center"/>
<el-table-column label="检查周期" width="80" align="center">
<template #default="scope">
{{scope.row.cycleattrdettar}}/
<span v-if="scope.row.cycledettar==4">
</span>
<span v-if="scope.row.cycledettar==5">
季度
</span>
<span v-if="scope.row.cycledettar==7">
半年
</span>
<span v-if="scope.row.cycledettar==6">
</span>
</template>
</el-table-column>
<el-table-column prop="content" label="备注说明" width="120"/>
<el-table-column label="操作" width="120">
<template #default="scope">
@ -639,6 +720,33 @@
</el-option>
</el-select>
</el-form-item>
<el-form-item label="检查方式">
<el-select multiple v-model="xizeData.censortype" clearable placeholder="请选择">
<el-option label="现场检查" :value=1></el-option>
<el-option label="资料审查" :value=2></el-option>
<el-option label="事件触发" :value=3></el-option>
</el-select>
</el-form-item>
<el-form-item label="检查周期">
<el-select v-model="xizeData.cycle" clearable placeholder="请选择">
<el-option label="月" :value=4></el-option>
<el-option label="季度" :value=5></el-option>
<el-option label="半年" :value=7></el-option>
<el-option label="年" :value=6></el-option>
</el-select>
</el-form-item>
<el-form-item label="检查频次">
<el-input v-model.number="xizeData.censorrate"></el-input>
</el-form-item>
<el-form-item label="客观证据">
<el-input
type="textarea"
autosize
placeholder="请输入内容"
v-model="xizeData.censorcont">
</el-input>
</el-form-item>
<el-form-item label="备注说明" prop="detailedtargetcontent">
<el-input
type="textarea"
@ -647,6 +755,9 @@
v-model="xizeData.detailedtargetcontent">
</el-input>
</el-form-item>
<el-form-item label="部门">
<el-cascader clearable v-model="xizeData.departmentid" :options="grouplist" :show-all-levels="false" :props="props"></el-cascader>
</el-form-item>
<el-form-item label="执行人" prop="title">
<el-cascader clearable v-model="xizeData.operator" :options="grouplistBackup" :show-all-levels="false" :props="userProps"></el-cascader>
</el-form-item>
@ -821,9 +932,9 @@ export default {
showUser:false,
//
userProps: {
value: "id",
value: "key",
label: "name",
children: "groupUser",
children: "govlist",
emitPath:false,
multiple: true
},
@ -875,12 +986,20 @@ export default {
editChildInfo:{},
grouplist:[],
props: {
checkStrictly: true,
value: "id",
label: "name",
children: "children",
emitPath:false,
multiple: true
},
props1: {
checkStrictly: true,
value: "id",
label: "name",
children: "children",
emitPath:false,
},
addChildInfo:{
title:''
},
@ -956,7 +1075,7 @@ export default {
this.getDataList()
this.getGrouplist()
this.getbumenlist()
this.initialDepartment()
// this.initialDepartment()
//
// this.departmentlist()
this.getDutyclasslist()
@ -1027,6 +1146,7 @@ export default {
},
//
async xiuxize(){
this.xizeData.censortype=this.xizeData.censortype.map(String)
const resa = await neweitedetailedtarget(this.xizeData)
this.getzhilanmuList()
this.xizeData={}
@ -1137,6 +1257,8 @@ export default {
departid:this.searchfu.deaprtid.toString(),
dimension: this.rowZhiData.dimension, //
targetid: this.rowZhiData.target, //
censortype: this.rowZhiData.censortype, //123
censorcont: this.rowZhiData.censorcont //
}
const res = await lookdutytargetinfo(methodData)
if (res.code==0) {
@ -1331,7 +1453,7 @@ export default {
// colspan: _col
// };
// }
if (columnIndex === 0||columnIndex === 6) {
if (columnIndex === 0||columnIndex === 9) {
const _row = this.methodSpanArr[rowIndex];
const _col = _row > 0 ? 1 : 0;
return {
@ -1365,6 +1487,9 @@ export default {
content: "", //
//unit: this.targetsunList.unites, //
unit: '',
censorcont:'',
censortype:null,
censorrate:null,
referencescore: '', //
cycle: this.targetsunList.cycle, //123456
cycleattr: this.targetsunList.cycleattr, //
@ -1456,13 +1581,48 @@ export default {
//
async getSystemadminlist(){
const res = await getgroupuser()
this.grouplistBackup=res.data.list
this.grouplistBackup=res.data
this.grouplistBackup.forEach(item => {
if (item.govlist != null) {
// this.digui(item);
item.govlist.forEach(items => {
// forEach,itemthis.digui(item);
this.digui(items); //
//
console.log(items, '看我查看完整的数据哦')
// children
})
} else {
item.govlist=item.child
//
}
})
console.log(this.grouplistBackup)
},
//
digui (item) {
//
if (item.govlist != null) {
// valuelabel,
item.govlist.forEach(ff => {
// children
this.digui(ff)
})
} else {
// children西
// valuelabel,
// --------------------------线---------------------------------
item.govlist=item.child
}
//
},
//
async initialDepartment(){
const departmentFrom={
id:3
}
const res = await departmentlist(departmentFrom)
this.searchDepartmentList=res.data
@ -1476,14 +1636,17 @@ 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
},
//
async getbumenlist(){
const res = await getgroupdepartmap()
this.grouplist=res.data.list
this.grouplist=res.data
},
//
@ -1536,6 +1699,7 @@ export default {
}
const res = await getneweitedetailedtarget(from)
this.xizeData=res.data
this.xizeData.censortype=this.xizeData.censortype.map(Number)
this.xizeDig=true
},
//
@ -1551,6 +1715,9 @@ export default {
this.nameFrom={
id:row.targetsun,
name:row.targetsunname,
group:row.group,
dimension:row.dimension,
targetid:row.target,
departmentmap:row.departidmap,
operator:res.data
}
@ -1615,6 +1782,9 @@ export default {
async enterDialog(){
console.log("this.rulesCopyList")
console.log(this.rulesCopyList)
this.RulesList.forEach(element=>{
element.censortype=element.censortype.map(String)
})
this.$refs.addForm.validate(async valid => {
if (valid) {
this.form.evaluationlist=this.RulesList
@ -1622,6 +1792,7 @@ export default {
this.form.target=this.form.target.toString();
// this.form.targetsun=this.form.targetsun.toString();
this.form.parentid=this.form.parentid.map(String);
// this.form.parentid=this.form.evaluationlist.censortype.map(String);
// const res = await addqualeval(this.form)
const res = await adddutyrelation(this.form)
if (res.code === 0) {

3
src/views/basicInfo/project.vue

@ -303,6 +303,7 @@ export default {
label: '年'
}],
props: {
checkStrictly: true,
value: "id",
label: "name",
children: "children",
@ -400,7 +401,7 @@ export default {
//
async getGrouplist(){
const res = await getgroupdepartmap()
this.grouplist=res.data.list
this.grouplist=res.data
},
//

20
src/views/basicInfo/target.vue

@ -13,6 +13,7 @@
</el-option>
</el-select>
</el-form-item>
<el-form-item label="年度">
<el-select v-model.number="searchInfo.year" placeholder="请选择">
<el-option
@ -564,7 +565,7 @@ export default {
dutyclasslist:[],
//
searchInfo: {
groupid:"3",
groupid:2,
},
pos:'',
@ -642,15 +643,18 @@ 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
},
//
async selectGroup(val){
if (val!='') {
const departmentFrom={
outid:val
id:parseInt(val)
}
const res = await departmentlist(departmentFrom)
this.departmentList=res.data
@ -659,11 +663,16 @@ export default {
},
//
async buMen(){
// const departmentFrom={
// outid:this.searchInfo.groupid
// }
const departmentFrom={
outid:this.searchInfo.groupid
id:2
}
const res = await departmentlist(departmentFrom)
this.buMenList=res.data
// const res = await departmentlist(departmentFrom)
// this.buMenList=res.data
},
//
@ -957,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 })

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>
Loading…
Cancel
Save