1
0
mirror of https://github.com/PanJiaChen/vue-element-admin.git synced 2025-08-10 20:39:48 +08:00

新增隐患排查治理和系统同全局样式修改

This commit is contained in:
dengfuchuan 2021-04-03 09:40:03 +08:00
parent 194d718c19
commit c37041c1c7
93 changed files with 3592 additions and 4891 deletions

View File

@ -18,7 +18,8 @@ export function getInfo(token) {
export function logout() {
return request({
url: '/vue-element-admin/user/logout',
method: 'post'
})
url: '/commonAction.do',
method: 'post',
data: 'funid=login&pagetype=login&eventcode=logout&user_id=administrator&dataType=json'
}).then(response => response.data)
}

View File

@ -33,12 +33,12 @@ export default {
methods: {
getBreadcrumb() {
// only show routes with meta.title
let matched = this.$route.matched.filter(item => item.meta && item.meta.title)
const first = matched[0]
const matched = this.$route.matched.filter(item => item.meta && item.meta.title)
// const first = matched[0]
if (!this.isDashboard(first)) {
matched = [{ path: '/', meta: { title: '安全生产' }}].concat(matched)
}
// if (!this.isDashboard(first)) {
// matched = [{ path: '/', meta: { title: '' }}].concat(matched)
// }
this.levelList = matched.filter(item => item.meta && item.meta.title && item.meta.breadcrumb !== false)
},

View File

@ -17,8 +17,8 @@ export default {
},
data() {
return {
data: []
data: [],
loading: false
}
},
created() {
@ -26,9 +26,11 @@ export default {
},
methods: {
getButtons() {
this.loading = true
api.getButtons(this.funid).then(data => {
if (data.success) {
this.data = data.data.buttons
this.loading = false
} else {
this.$message.error(data.message)
}

View File

@ -125,10 +125,10 @@ export default {
}
.handle-button {
width: 48px;
height: 48px;
width: 38px;
height: 38px;
position: absolute;
left: -48px;
left: -38px;
text-align: center;
font-size: 24px;
border-radius: 6px 0 0 6px !important;
@ -136,10 +136,10 @@ export default {
pointer-events: auto;
cursor: pointer;
color: #fff;
line-height: 48px;
line-height: 38px;
i {
font-size: 24px;
line-height: 48px;
line-height: 38px;
}
}
</style>

View File

@ -58,6 +58,12 @@
import api from './api'
export default {
name: 'SelDept',
props: {
selective: {
type: String,
default: null
}
},
data() {
return {
loading: false,
@ -116,7 +122,8 @@ export default {
},
treeList: [],
whereSql: false,
whereValue: ''
whereValue: '',
Dpets: ''
}
},
created() {
@ -318,8 +325,12 @@ export default {
this.pager.pageNo = page
this.getList()
},
handleSelectionChange(val) {
this.$emit('updateDepts', val)
handleSelectionChange(row) {
if (this.selective) {
this.$emit('updateDepts', row)
} else {
this.Dpets = row
}
},
closeDialog() {
this.dialogFormVisible = false

View File

@ -24,20 +24,8 @@
<i class="el-icon-caret-bottom" />
</div>
<el-dropdown-menu slot="dropdown">
<router-link to="/profile/index">
<el-dropdown-item>Profile</el-dropdown-item>
</router-link>
<router-link to="/">
<el-dropdown-item>Dashboard</el-dropdown-item>
</router-link>
<a target="_blank" href="https://github.com/PanJiaChen/vue-element-admin/">
<el-dropdown-item>Github</el-dropdown-item>
</a>
<a target="_blank" href="https://panjiachen.github.io/vue-element-admin-site/#/">
<el-dropdown-item>Docs</el-dropdown-item>
</a>
<el-dropdown-item divided @click.native="logout">
<span style="display:block;">Log Out</span>
<el-dropdown-item @click.native="logout">
<span style="display:block;">退出登录</span>
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
@ -53,6 +41,7 @@ import ErrorLog from '@/components/ErrorLog'
import Screenfull from '@/components/Screenfull'
// import SizeSelect from '@/components/SizeSelect'
import Search from '@/components/HeaderSearch'
import { logout } from '@/api/user'
export default {
components: {
@ -75,8 +64,15 @@ export default {
this.$store.dispatch('app/toggleSideBar')
},
async logout() {
await this.$store.dispatch('user/logout')
this.$router.push(`/login?redirect=${this.$route.fullPath}`)
logout().then(data => {
if (data.success) {
this.$store.dispatch('user/logout')
this.$router.push(`/login?redirect=${this.$route.fullPath}`)
this.$message.success('已退出登录!')
} else {
this.$message.error(data.message)
}
})
}
}
}

View File

@ -1,25 +1,25 @@
<template>
<div class="drawer-container">
<div>
<h3 class="drawer-title">Page style setting</h3>
<h3 class="drawer-title">页面风格设置</h3>
<div class="drawer-item">
<span>Theme Color</span>
<span>主题颜色</span>
<theme-picker style="float: right;height: 26px;margin: -3px 8px 0 0;" @change="themeChange" />
</div>
<div class="drawer-item">
<span>Open Tags-View</span>
<span>打开页面标签</span>
<el-switch v-model="tagsView" class="drawer-switch" />
</div>
<div class="drawer-item">
<!-- <div class="drawer-item">
<span>Fixed Header</span>
<el-switch v-model="fixedHeader" class="drawer-switch" />
</div>
</div> -->
<div class="drawer-item">
<span>Sidebar Logo</span>
<span>侧边栏的 LOGO</span>
<el-switch v-model="sidebarLogo" class="drawer-switch" />
</div>

View File

@ -7,10 +7,6 @@ Vue.use(Router)
import Layout from '@/layout'
/* Router Modules */
import componentsRouter from './modules/components'
import chartsRouter from './modules/charts'
import tableRouter from './modules/table'
import nestedRouter from './modules/nested'
/**
* Note: sub-menu only appear when route children.length >= 1
@ -136,17 +132,59 @@ export const constantRoutes = [
name: '隐患排查',
meta: { title: '隐患排查', icon: 'form', noCache: true }
},
{
path: 'hidden_check/create',
component: () => import('@/views/hidden_check/components/create/index'),
name: 'create',
hidden: true,
meta: { title: '隐患排查新增', icon: 'list', noCache: true }
},
{
path: 'hidden_check/audit/:id',
component: () => import('@/views/hidden_check/components/edit_form/index'),
name: 'audit',
hidden: true,
meta: { title: '隐患排查编辑', icon: 'list', noCache: true }
},
{
path: 'hidden_reform',
component: () => import('@/views/hidden_reform/index'),
name: '隐患整改',
meta: { title: '隐患整改', icon: 'el-icon-s-management', noCache: true }
},
{
path: 'hidden_reform/create',
component: () => import('@/views/hidden_reform/components/create/index'),
name: 'create',
hidden: true,
meta: { title: '隐患整改新增', icon: 'list', noCache: true }
},
{
path: 'hidden_reform/audit/:id',
component: () => import('@/views/hidden_reform/components/edit_form/index'),
name: 'audit',
hidden: true,
meta: { title: '隐患整改编辑', icon: 'list', noCache: true }
},
{
path: 'hidden_review',
component: () => import('@/views/hidden_review/index'),
name: '隐患验收',
meta: { title: '隐患验收', icon: 'el-icon-s-opportunity', noCache: true }
},
{
path: 'hidden_review/create',
component: () => import('@/views/hidden_review/components/create/index'),
name: 'create',
hidden: true,
meta: { title: '隐患验收新增', icon: 'list', noCache: true }
},
{
path: 'hidden_review/audit/:id',
component: () => import('@/views/hidden_review/components/edit_form/index'),
name: 'audit',
hidden: true,
meta: { title: '隐患验收编辑', icon: 'list', noCache: true }
}
]
},
@ -172,7 +210,7 @@ export const constantRoutes = [
path: 'index',
component: () => import('@/views/sys_user/index'),
name: '用户管理',
meta: { title: '用户管理', icon: 'guide', noCache: true }
meta: { title: '用户管理', icon: 'el-icon-user-solid', noCache: true }
}
]
}
@ -183,260 +221,6 @@ export const constantRoutes = [
* the routes that need to be dynamically loaded based on user roles
*/
export const asyncRoutes = [
{
path: '/permission',
component: Layout,
redirect: '/permission/page',
alwaysShow: true, // will always show the root menu
name: 'Permission',
meta: {
title: 'Permission',
icon: 'lock',
roles: ['admin', 'editor'] // you can set roles in root nav
},
children: [
{
path: 'page',
component: () => import('@/views/permission/page'),
name: 'PagePermission',
meta: {
title: 'Page Permission',
roles: ['admin'] // or you can only set roles in sub nav
}
},
{
path: 'directive',
component: () => import('@/views/permission/directive'),
name: 'DirectivePermission',
meta: {
title: 'Directive Permission'
// if do not set roles, means: this page does not require permission
}
},
{
path: 'role',
component: () => import('@/views/permission/role'),
name: 'RolePermission',
meta: {
title: 'Role Permission',
roles: ['admin']
}
}
]
},
{
path: '/icon',
component: Layout,
children: [
{
path: 'index',
component: () => import('@/views/icons/index'),
name: 'Icons',
meta: { title: 'Icons', icon: 'icon', noCache: true }
}
]
},
/** when your routing map is too long, you can split it into small modules **/
componentsRouter,
chartsRouter,
nestedRouter,
tableRouter,
{
path: '/example',
component: Layout,
redirect: '/example/list',
name: 'Example',
meta: {
title: 'Example',
icon: 'el-icon-s-help'
},
children: [
{
path: 'create',
component: () => import('@/views/example/create'),
name: 'CreateArticle',
meta: { title: 'Create Article', icon: 'edit' }
},
{
path: 'edit/:id(\\d+)',
component: () => import('@/views/example/edit'),
name: 'EditArticle',
meta: { title: 'Edit Article', noCache: true, activeMenu: '/example/list' },
hidden: true
},
{
path: 'list',
component: () => import('@/views/example/list'),
name: 'ArticleList',
meta: { title: 'Article List', icon: 'v' }
}
]
},
{
path: '/tab',
component: Layout,
children: [
{
path: 'index',
component: () => import('@/views/tab/index'),
name: 'Tab',
meta: { title: 'Tab', icon: 'tab' }
}
]
},
{
path: '/error',
component: Layout,
redirect: 'noRedirect',
name: 'ErrorPages',
meta: {
title: 'Error Pages',
icon: '404'
},
children: [
{
path: '401',
component: () => import('@/views/error-page/401'),
name: 'Page401',
meta: { title: '401', noCache: true }
},
{
path: '404',
component: () => import('@/views/error-page/404'),
name: 'Page404',
meta: { title: '404', noCache: true }
}
]
},
{
path: '/error-log',
component: Layout,
children: [
{
path: 'log',
component: () => import('@/views/error-log/index'),
name: 'ErrorLog',
meta: { title: 'Error Log', icon: 'bug' }
}
]
},
{
path: '/excel',
component: Layout,
redirect: '/excel/export-excel',
name: 'Excel',
meta: {
title: 'Excel',
icon: 'excel'
},
children: [
{
path: 'export-excel',
component: () => import('@/views/excel/export-excel'),
name: 'ExportExcel',
meta: { title: 'Export Excel' }
},
{
path: 'export-selected-excel',
component: () => import('@/views/excel/select-excel'),
name: 'SelectExcel',
meta: { title: 'Export Selected' }
},
{
path: 'export-merge-header',
component: () => import('@/views/excel/merge-header'),
name: 'MergeHeader',
meta: { title: 'Merge Header' }
},
{
path: 'upload-excel',
component: () => import('@/views/excel/upload-excel'),
name: 'UploadExcel',
meta: { title: 'Upload Excel' }
}
]
},
{
path: '/zip',
component: Layout,
redirect: '/zip/download',
alwaysShow: true,
name: 'Zip',
meta: { title: 'Zip', icon: 'zip' },
children: [
{
path: 'download',
component: () => import('@/views/zip/index'),
name: 'ExportZip',
meta: { title: 'Export Zip' }
}
]
},
{
path: '/pdf',
component: Layout,
redirect: '/pdf/index',
children: [
{
path: 'index',
component: () => import('@/views/pdf/index'),
name: 'PDF',
meta: { title: 'PDF', icon: 'pdf' }
}
]
},
{
path: '/pdf/download',
component: () => import('@/views/pdf/download'),
hidden: true
},
{
path: '/theme',
component: Layout,
children: [
{
path: 'index',
component: () => import('@/views/theme/index'),
name: 'Theme',
meta: { title: 'Theme', icon: 'theme' }
}
]
},
{
path: '/clipboard',
component: Layout,
children: [
{
path: 'index',
component: () => import('@/views/clipboard/index'),
name: 'ClipboardDemo',
meta: { title: 'Clipboard', icon: 'clipboard' }
}
]
},
{
path: 'external-link',
component: Layout,
children: [
{
path: 'https://github.com/PanJiaChen/vue-element-admin',
meta: { title: 'External Link', icon: 'link' }
}
]
},
// 404 page must be placed at the end !!!
{ path: '*', redirect: '/404', hidden: true }
]

View File

@ -69,7 +69,7 @@
// dropdown
.el-dropdown-menu {
a {
display: block
display: block;
}
}
@ -82,3 +82,56 @@
.el-range-separator {
box-sizing: content-box;
}
// table 样式
.el-table__row {
font-size: 12px;
}
.el-table__header {
font-size: 12px;
color: #000;
}
.el-table th,
.el-table td {
color: #000;
padding: 0px;
}
// 解决表头和表体对不齐
.el-table th.gutter {
display: table-cell !important;
}
// .el-checkbox__input.is-checked .el-checkbox__inner {
// background-color: #42b983;
// border-color: #42b983;
// }
// .el-checkbox__input.is-checked .el-checkbox__inner {
// background-color: #42b983;
// border-color: #42b983;
// }
// .el-checkbox__input.is-indeterminate .el-checkbox__inner {
// background-color: #42b983;
// border-color: #42b983;
// }
// .el-checkbox__input.is-focus .el-checkbox__inner {
// border-color: #42b983;
// }
// button样式
.el-button--primary {
text-align: center;
line-height: 25px;
padding: 0px 10px;
}
//设置图标按钮宽度
.el-button--text {
width: 20px;
}
// 自定义button
.button {
color: #000;
background-color: #fff;
}

View File

@ -1,16 +1,17 @@
@import './variables.scss';
@import './mixin.scss';
@import './transition.scss';
@import './element-ui.scss';
@import './sidebar.scss';
@import './btn.scss';
@import "./variables.scss";
@import "./mixin.scss";
@import "./transition.scss";
@import "./element-ui.scss";
@import "./sidebar.scss";
@import "./btn.scss";
body {
height: 100%;
-moz-osx-font-smoothing: grayscale;
-webkit-font-smoothing: antialiased;
text-rendering: optimizeLegibility;
font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Arial, sans-serif;
font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB,
Microsoft YaHei, Arial, sans-serif;
}
label {
@ -104,7 +105,8 @@ aside {
display: block;
line-height: 32px;
font-size: 16px;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen,
Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;
color: #2c3e50;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
@ -134,7 +136,7 @@ aside {
}
.text-center {
text-align: center
text-align: center;
}
.sub-navbar {
@ -145,7 +147,13 @@ aside {
text-align: right;
padding-right: 20px;
transition: 600ms ease position;
background: linear-gradient(90deg, rgba(32, 182, 249, 1) 0%, rgba(32, 182, 249, 1) 0%, rgba(33, 120, 241, 1) 100%, rgba(33, 120, 241, 1) 100%);
background: linear-gradient(
90deg,
rgba(32, 182, 249, 1) 0%,
rgba(32, 182, 249, 1) 0%,
rgba(33, 120, 241, 1) 100%,
rgba(33, 120, 241, 1) 100%
);
.subtitle {
font-size: 20px;

View File

@ -51,6 +51,49 @@ export function parseTime(time, cFormat) {
return time_str
}
export function parseDay(time, cFormat) {
if (arguments.length === 0 || !time) {
return null
}
const format = cFormat || '{y}-{m}-{d}'
let date
if (typeof time === 'object') {
date = time
} else {
if ((typeof time === 'string')) {
if ((/^[0-9]+$/.test(time))) {
// support "1548221490638"
time = parseInt(time)
} else {
// support safari
// https://stackoverflow.com/questions/4310953/invalid-date-in-safari
time = time.replace(new RegExp(/-/gm), '/')
}
}
if ((typeof time === 'number') && (time.toString().length === 10)) {
time = time * 1000
}
date = new Date(time)
}
const formatObj = {
y: date.getFullYear(),
m: date.getMonth() + 2,
d: date.getDate(),
h: date.getHours(),
i: date.getMinutes(),
s: date.getSeconds(),
a: date.getDay()
}
const time_str = format.replace(/{([ymdhisa])+}/g, (result, key) => {
const value = formatObj[key]
// Note: getDay() returns 0 on Sunday
if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value ] }
return value.toString().padStart(2, '0')
})
return time_str
}
/**
* @param {number} time
* @param {string} option

View File

@ -1,23 +0,0 @@
<template>
<div class="chart-container">
<chart height="100%" width="100%" />
</div>
</template>
<script>
import Chart from '@/components/Charts/Keyboard'
export default {
name: 'KeyboardChart',
components: { Chart }
}
</script>
<style scoped>
.chart-container{
position: relative;
width: 100%;
height: calc(100vh - 84px);
}
</style>

View File

@ -1,23 +0,0 @@
<template>
<div class="chart-container">
<chart height="100%" width="100%" />
</div>
</template>
<script>
import Chart from '@/components/Charts/LineMarker'
export default {
name: 'LineChart',
components: { Chart }
}
</script>
<style scoped>
.chart-container{
position: relative;
width: 100%;
height: calc(100vh - 84px);
}
</style>

View File

@ -1,23 +0,0 @@
<template>
<div class="chart-container">
<chart height="100%" width="100%" />
</div>
</template>
<script>
import Chart from '@/components/Charts/MixChart'
export default {
name: 'MixChart',
components: { Chart }
}
</script>
<style scoped>
.chart-container{
position: relative;
width: 100%;
height: calc(100vh - 84px);
}
</style>

View File

@ -1,49 +0,0 @@
<template>
<div class="app-container">
<el-tabs v-model="activeName">
<el-tab-pane label="use clipboard directly" name="directly">
<el-input v-model="inputData" placeholder="Please input" style="width:400px;max-width:100%;" />
<el-button type="primary" icon="el-icon-document" @click="handleCopy(inputData,$event)">
copy
</el-button>
</el-tab-pane>
<el-tab-pane label="use clipboard by v-directive" name="v-directive">
<el-input v-model="inputData" placeholder="Please input" style="width:400px;max-width:100%;" />
<el-button v-clipboard:copy="inputData" v-clipboard:success="clipboardSuccess" type="primary" icon="el-icon-document">
copy
</el-button>
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
import clip from '@/utils/clipboard' // use clipboard directly
import clipboard from '@/directive/clipboard/index.js' // use clipboard by v-directive
export default {
name: 'ClipboardDemo',
directives: {
clipboard
},
data() {
return {
activeName: 'directly',
inputData: 'https://github.com/PanJiaChen/vue-element-admin'
}
},
methods: {
handleCopy(text, event) {
clip(text, event)
},
clipboardSuccess() {
this.$message({
message: 'Copy successfully',
type: 'success',
duration: 1500
})
}
}
}
</script>

View File

@ -1,61 +0,0 @@
<template>
<div class="components-container">
<aside>This is based on
<a class="link-type" href="//github.com/dai-siki/vue-image-crop-upload"> vue-image-crop-upload</a>.
Since I was using only the vue@1 version, and it is not compatible with mockjs at the moment, I modified it myself, and if you are going to use it, it is better to use official version.
</aside>
<pan-thumb :image="image" />
<el-button type="primary" icon="el-icon-upload" style="position: absolute;bottom: 15px;margin-left: 40px;" @click="imagecropperShow=true">
Change Avatar
</el-button>
<image-cropper
v-show="imagecropperShow"
:key="imagecropperKey"
:width="300"
:height="300"
url="https://httpbin.org/post"
lang-type="en"
@close="close"
@crop-upload-success="cropSuccess"
/>
</div>
</template>
<script>
import ImageCropper from '@/components/ImageCropper'
import PanThumb from '@/components/PanThumb'
export default {
name: 'AvatarUploadDemo',
components: { ImageCropper, PanThumb },
data() {
return {
imagecropperShow: false,
imagecropperKey: 0,
image: 'https://wpimg.wallstcn.com/577965b9-bb9e-4e02-9f0c-095b41417191'
}
},
methods: {
cropSuccess(resData) {
this.imagecropperShow = false
this.imagecropperKey = this.imagecropperKey + 1
this.image = resData.files.avatar
},
close() {
this.imagecropperShow = false
}
}
}
</script>
<style scoped>
.avatar{
width: 200px;
height: 200px;
border-radius: 50%;
}
</style>

View File

@ -1,154 +0,0 @@
<template>
<div class="components-container">
<aside>
When the page is scrolled to the specified position, the Back to Top button appears in the lower right corner
</aside>
<aside>
You can customize the style of the button, show / hide, height of appearance, height of the return. If you need a text prompt, you can use element-ui el-tooltip elements externally
</aside>
<div class="placeholder-container">
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
</div>
<!-- you can add element-ui's tooltip -->
<el-tooltip placement="top" content="tooltip">
<back-to-top :custom-style="myBackToTopStyle" :visibility-height="300" :back-position="50" transition-name="fade" />
</el-tooltip>
</div>
</template>
<script>
import BackToTop from '@/components/BackToTop'
export default {
name: 'BackToTopDemo',
components: { BackToTop },
data() {
return {
// customizable button style, show/hide critical point, return position
myBackToTopStyle: {
right: '50px',
bottom: '50px',
width: '40px',
height: '40px',
'border-radius': '4px',
'line-height': '45px', // Please keep consistent with height to center vertically
background: '#e7eaf1'// The background color of the button
}
}
}
}
</script>
<style scoped>
.placeholder-container div {
margin: 10px;
}
</style>

View File

@ -1,218 +0,0 @@
<template>
<div class="components-container">
<aside>
<a href="https://github.com/PanJiaChen/vue-countTo" target="_blank">countTo-component</a>
</aside>
<count-to
ref="example"
:start-val="_startVal"
:end-val="_endVal"
:duration="_duration"
:decimals="_decimals"
:separator="_separator"
:prefix="_prefix"
:suffix="_suffix"
:autoplay="false"
class="example"
/>
<div style="margin-left: 25%;margin-top: 40px;">
<label class="label" for="startValInput">startVal:
<input v-model.number="setStartVal" type="number" name="startValInput">
</label>
<label class="label" for="endValInput">endVal:
<input v-model.number="setEndVal" type="number" name="endVaInput">
</label>
<label class="label" for="durationInput">duration:
<input v-model.number="setDuration" type="number" name="durationInput">
</label>
<div class="startBtn example-btn" @click="start">
Start
</div>
<div class="pause-resume-btn example-btn" @click="pauseResume">
pause/resume
</div>
<br>
<label class="label" for="decimalsInput">decimals:
<input v-model.number="setDecimals" type="number" name="decimalsInput">
</label>
<label class="label" for="separatorInput">separator:
<input v-model="setSeparator" name="separatorInput">
</label>
<label class="label" for="prefixInput">prefix:
<input v-model="setPrefix" name="prefixInput">
</label>
<label class="label" for="suffixInput">suffix:
<input v-model="setSuffix" name="suffixInput">
</label>
</div>
<aside>&lt;count-to :start-val=&#x27;{{ _startVal }}&#x27; :end-val=&#x27;{{ _endVal }}&#x27; :duration=&#x27;{{ _duration }}&#x27;
:decimals=&#x27;{{ _decimals }}&#x27; :separator=&#x27;{{ _separator }}&#x27; :prefix=&#x27;{{ _prefix }}&#x27; :suffix=&#x27;{{ _suffix }}&#x27;
:autoplay=false&gt;</aside>
</div>
</template>
<script>
import countTo from 'vue-count-to'
export default {
name: 'CountToDemo',
components: { countTo },
data() {
return {
setStartVal: 0,
setEndVal: 2017,
setDuration: 4000,
setDecimals: 0,
setSeparator: ',',
setSuffix: ' rmb',
setPrefix: '¥ '
}
},
computed: {
_startVal() {
if (this.setStartVal) {
return this.setStartVal
} else {
return 0
}
},
_endVal() {
if (this.setEndVal) {
return this.setEndVal
} else {
return 0
}
},
_duration() {
if (this.setDuration) {
return this.setDuration
} else {
return 100
}
},
_decimals() {
if (this.setDecimals) {
if (this.setDecimals < 0 || this.setDecimals > 20) {
alert('digits argument must be between 0 and 20')
return 0
}
return this.setDecimals
} else {
return 0
}
},
_separator() {
return this.setSeparator
},
_suffix() {
return this.setSuffix
},
_prefix() {
return this.setPrefix
}
},
methods: {
start() {
this.$refs.example.start()
},
pauseResume() {
this.$refs.example.pauseResume()
}
}
}
</script>
<style scoped>
.example-btn {
display: inline-block;
margin-bottom: 0;
font-weight: 500;
text-align: center;
-ms-touch-action: manipulation;
touch-action: manipulation;
cursor: pointer;
background-image: none;
border: 1px solid transparent;
white-space: nowrap;
line-height: 1.5;
padding: 4px 15px;
font-size: 12px;
border-radius: 4px;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
-webkit-transition: all .3s cubic-bezier(.645, .045, .355, 1);
transition: all .3s cubic-bezier(.645, .045, .355, 1);
position: relative;
color: rgba(0, 0, 0, .65);
background-color: #fff;
border-color: #d9d9d9;
}
.example-btn:hover {
color: #4AB7BD;
background-color: #fff;
border-color: #4AB7BD;
}
.example {
font-size: 50px;
color: #F6416C;
display: block;
margin: 10px 0;
text-align: center;
font-size: 80px;
font-weight: 500;
}
.label {
color: #2f4f4f;
font-size: 16px;
display: inline-block;
margin: 15px 30px 15px 0;
}
input {
position: relative;
display: inline-block;
padding: 4px 7px;
width: 70px;
height: 28px;
cursor: text;
font-size: 12px;
line-height: 1.5;
color: rgba(0, 0, 0, .65);
background-color: #fff;
background-image: none;
border: 1px solid #d9d9d9;
border-radius: 4px;
-webkit-transition: all .3s;
transition: all .3s;
}
.startBtn {
margin-left: 20px;
font-size: 20px;
color: #30B08F;
background-color: #fff;
}
.startBtn:hover {
background-color: #30B08F;
color: #fff;
border-color: #30B08F;
}
.pause-resume-btn {
font-size: 20px;
color: #E65D6E;
background-color: #fff;
}
.pause-resume-btn:hover {
background-color: #E65D6E;
color: #fff;
border-color: #E65D6E;
}
</style>

View File

@ -1,39 +0,0 @@
<template>
<div class="components-container">
<aside>drag-list base on
<a href="https://github.com/SortableJS/Vue.Draggable" target="_blank">Vue.Draggable</a>
</aside>
<div class="editor-container">
<dnd-list :list1="list1" :list2="list2" list1-title="List" list2-title="Article pool" />
</div>
</div>
</template>
<script>
import DndList from '@/components/DndList'
import { fetchList } from '@/api/article'
export default {
name: 'DndListDemo',
components: { DndList },
data() {
return {
list1: [],
list2: []
}
},
created() {
this.getData()
},
methods: {
getData() {
this.listLoading = true
fetchList().then(response => {
this.list1 = response.data.items.splice(0, 5)
this.list2 = response.data.items
})
}
}
}
</script>

View File

@ -1,61 +0,0 @@
<template>
<div class="components-container">
<el-button type="primary" @click="dialogTableVisible = true">
open a Drag Dialog
</el-button>
<el-dialog v-el-drag-dialog :visible.sync="dialogTableVisible" title="Shipping address" @dragDialog="handleDrag">
<el-select ref="select" v-model="value" placeholder="请选择">
<el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
<el-table :data="gridData">
<el-table-column property="date" label="Date" width="150" />
<el-table-column property="name" label="Name" width="200" />
<el-table-column property="address" label="Address" />
</el-table>
</el-dialog>
</div>
</template>
<script>
import elDragDialog from '@/directive/el-drag-dialog' // base on element-ui
export default {
name: 'DragDialogDemo',
directives: { elDragDialog },
data() {
return {
dialogTableVisible: false,
options: [
{ value: '选项1', label: '黄金糕' },
{ value: '选项2', label: '双皮奶' },
{ value: '选项3', label: '蚵仔煎' },
{ value: '选项4', label: '龙须面' }
],
value: '',
gridData: [{
date: '2016-05-02',
name: 'John Smith',
address: 'No.1518, Jinshajiang Road, Putuo District'
}, {
date: '2016-05-04',
name: 'John Smith',
address: 'No.1518, Jinshajiang Road, Putuo District'
}, {
date: '2016-05-01',
name: 'John Smith',
address: 'No.1518, Jinshajiang Road, Putuo District'
}, {
date: '2016-05-03',
name: 'John Smith',
address: 'No.1518, Jinshajiang Road, Putuo District'
}]
}
},
methods: {
// v-el-drag-dialog onDrag callback function
handleDrag() {
this.$refs.select.blur()
}
}
}
</script>

View File

@ -1,66 +0,0 @@
<template>
<div class="components-container board">
<Kanban :key="1" :list="list1" :group="group" class="kanban todo" header-text="Todo" />
<Kanban :key="2" :list="list2" :group="group" class="kanban working" header-text="Working" />
<Kanban :key="3" :list="list3" :group="group" class="kanban done" header-text="Done" />
</div>
</template>
<script>
import Kanban from '@/components/Kanban'
export default {
name: 'DragKanbanDemo',
components: {
Kanban
},
data() {
return {
group: 'mission',
list1: [
{ name: 'Mission', id: 1 },
{ name: 'Mission', id: 2 },
{ name: 'Mission', id: 3 },
{ name: 'Mission', id: 4 }
],
list2: [
{ name: 'Mission', id: 5 },
{ name: 'Mission', id: 6 },
{ name: 'Mission', id: 7 }
],
list3: [
{ name: 'Mission', id: 8 },
{ name: 'Mission', id: 9 },
{ name: 'Mission', id: 10 }
]
}
}
}
</script>
<style lang="scss">
.board {
width: 1000px;
margin-left: 20px;
display: flex;
justify-content: space-around;
flex-direction: row;
align-items: flex-start;
}
.kanban {
&.todo {
.board-column-header {
background: #4A9FF9;
}
}
&.working {
.board-column-header {
background: #f9944a;
}
}
&.done {
.board-column-header {
background: #2ac06d;
}
}
}
</style>

View File

@ -1,43 +0,0 @@
<template>
<div class="components-container">
<el-drag-select v-model="value" style="width:500px;" multiple placeholder="请选择">
<el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" />
</el-drag-select>
<div style="margin-top:30px;">
<el-tag v-for="item of value" :key="item" style="margin-right:15px;">
{{ item }}
</el-tag>
</div>
</div>
</template>
<script>
import ElDragSelect from '@/components/DragSelect' // base on element-ui
export default {
name: 'DragSelectDemo',
components: { ElDragSelect },
data() {
return {
value: ['Apple', 'Banana', 'Orange'],
options: [{
value: 'Apple',
label: 'Apple'
}, {
value: 'Banana',
label: 'Banana'
}, {
value: 'Orange',
label: 'Orange'
}, {
value: 'Pear',
label: 'Pear'
}, {
value: 'Strawberry',
label: 'Strawberry'
}]
}
}
}
</script>

View File

@ -1,31 +0,0 @@
<template>
<div class="components-container">
<aside>
Based on <a class="link-type" href="https://github.com/rowanwins/vue-dropzone"> dropzone </a>.
Because my business has special needs, and has to upload images to qiniu, so instead of a third party, I chose encapsulate it by myself. It is very simple, you can see the detail code in @/components/Dropzone.
</aside>
<div class="editor-container">
<dropzone id="myVueDropzone" url="https://httpbin.org/post" @dropzone-removedFile="dropzoneR" @dropzone-success="dropzoneS" />
</div>
</div>
</template>
<script>
import Dropzone from '@/components/Dropzone'
export default {
name: 'DropzoneDemo',
components: { Dropzone },
methods: {
dropzoneS(file) {
console.log(file)
this.$message({ message: 'Upload success', type: 'success' })
},
dropzoneR(file) {
console.log(file)
this.$message({ message: 'Delete success', type: 'success' })
}
}
}
</script>

View File

@ -1,36 +0,0 @@
<template>
<div class="components-container">
<aside>Json-Editor is base on <a href="https://github.com/codemirror/CodeMirror" target="_blank">CodeMirrorr</a>. Lint
base on <a
href="https://github.com/codemirror/CodeMirror/blob/master/addon/lint/json-lint.js"
target="_blank"
>json-lint</a>.</aside>
<div class="editor-container">
<json-editor ref="jsonEditor" v-model="value" />
</div>
</div>
</template>
<script>
import JsonEditor from '@/components/JsonEditor'
const jsonData = '[{"items":[{"market_type":"forexdata","symbol":"XAUUSD"},{"market_type":"forexdata","symbol":"UKOIL"},{"market_type":"forexdata","symbol":"CORN"}],"name":""},{"items":[{"market_type":"forexdata","symbol":"XAUUSD"},{"market_type":"forexdata","symbol":"XAGUSD"},{"market_type":"forexdata","symbol":"AUTD"},{"market_type":"forexdata","symbol":"AGTD"}],"name":"贵金属"},{"items":[{"market_type":"forexdata","symbol":"CORN"},{"market_type":"forexdata","symbol":"WHEAT"},{"market_type":"forexdata","symbol":"SOYBEAN"},{"market_type":"forexdata","symbol":"SUGAR"}],"name":"农产品"},{"items":[{"market_type":"forexdata","symbol":"UKOIL"},{"market_type":"forexdata","symbol":"USOIL"},{"market_type":"forexdata","symbol":"NGAS"}],"name":"能源化工"}]'
export default {
name: 'JsonEditorDemo',
components: { JsonEditor },
data() {
return {
value: JSON.parse(jsonData)
}
}
}
</script>
<style scoped>
.editor-container{
position: relative;
height: 100%;
}
</style>

View File

@ -1,101 +0,0 @@
<template>
<div class="components-container">
<aside>Markdown is based on
<a href="https://github.com/nhnent/tui.editor" target="_blank">tui.editor</a> simply wrapped with Vue.
<a
target="_blank"
href="https://panjiachen.github.io/vue-element-admin-site/feature/component/markdown-editor.html"
>
Documentation </a>
</aside>
<div class="editor-container">
<el-tag class="tag-title">
Basic:
</el-tag>
<markdown-editor v-model="content1" height="300px" />
</div>
<div class="editor-container">
<el-tag class="tag-title">
Markdown Mode:
</el-tag>
<markdown-editor ref="markdownEditor" v-model="content2" :options="{hideModeSwitch:true,previewStyle:'tab'}" height="200px" />
</div>
<div class="editor-container">
<el-tag class="tag-title">
Customize Toolbar:
</el-tag>
<markdown-editor v-model="content3" :options="{ toolbarItems: ['heading','bold','italic']}" />
</div>
<div class="editor-container">
<el-tag class="tag-title">
I18n:
</el-tag>
<el-alert
:closable="false"
title="You can change the language of the admin system to see the effect"
type="success"
/>
<markdown-editor ref="markdownEditor" v-model="content4" :language="language" height="300px" />
</div>
<el-button style="margin-top:80px;" type="primary" icon="el-icon-document" @click="getHtml">
Get HTML
</el-button>
<div v-html="html" />
</div>
</template>
<script>
import MarkdownEditor from '@/components/MarkdownEditor'
const content = `
**This is test**
* vue
* element
* webpack
`
export default {
name: 'MarkdownDemo',
components: { MarkdownEditor },
data() {
return {
content1: content,
content2: content,
content3: content,
content4: content,
html: '',
languageTypeList: {
'en': 'en_US',
'zh': 'zh_CN',
'es': 'es_ES'
}
}
},
computed: {
language() {
return this.languageTypeList['en']
}
},
methods: {
getHtml() {
this.html = this.$refs.markdownEditor.getHtml()
console.log(this.html)
}
}
}
</script>
<style scoped>
.editor-container{
margin-bottom: 30px;
}
.tag-title{
margin-bottom: 5px;
}
</style>

View File

@ -1,169 +0,0 @@
<template>
<div class="mixin-components-container">
<el-row>
<el-card class="box-card">
<div slot="header" class="clearfix">
<span>Buttons</span>
</div>
<div style="margin-bottom:50px;">
<el-col :span="4" class="text-center">
<router-link class="pan-btn blue-btn" to="/documentation/index">
Documentation
</router-link>
</el-col>
<el-col :span="4" class="text-center">
<router-link class="pan-btn light-blue-btn" to="/icon/index">
Icons
</router-link>
</el-col>
<el-col :span="4" class="text-center">
<router-link class="pan-btn pink-btn" to="/excel/export-excel">
Excel
</router-link>
</el-col>
<el-col :span="4" class="text-center">
<router-link class="pan-btn green-btn" to="/table/complex-table">
Table
</router-link>
</el-col>
<el-col :span="4" class="text-center">
<router-link class="pan-btn tiffany-btn" to="/example/create">
Form
</router-link>
</el-col>
<el-col :span="4" class="text-center">
<router-link class="pan-btn yellow-btn" to="/theme/index">
Theme
</router-link>
</el-col>
</div>
</el-card>
</el-row>
<el-row :gutter="20" style="margin-top:50px;">
<el-col :span="6">
<el-card class="box-card">
<div slot="header" class="clearfix">
<span>Material Design 的input</span>
</div>
<div style="height:100px;">
<el-form :model="demo" :rules="demoRules">
<el-form-item prop="title">
<md-input v-model="demo.title" icon="el-icon-search" name="title" placeholder="输入标题">
标题
</md-input>
</el-form-item>
</el-form>
</div>
</el-card>
</el-col>
<el-col :span="6">
<el-card class="box-card">
<div slot="header" class="clearfix">
<span>图片hover效果</span>
</div>
<div class="component-item">
<pan-thumb width="100px" height="100px" image="https://wpimg.wallstcn.com/577965b9-bb9e-4e02-9f0c-095b41417191">
vue-element-admin
</pan-thumb>
</div>
</el-card>
</el-col>
<el-col :span="6">
<el-card class="box-card">
<div slot="header" class="clearfix">
<span>水波纹 waves v-directive</span>
</div>
<div class="component-item">
<el-button v-waves type="primary">
水波纹效果
</el-button>
</div>
</el-card>
</el-col>
<el-col :span="6">
<el-card class="box-card">
<div slot="header" class="clearfix">
<span>hover text</span>
</div>
<div class="component-item">
<mallki class-name="mallki-text" text="vue-element-admin" />
</div>
</el-card>
</el-col>
</el-row>
<el-row :gutter="20" style="margin-top:50px;">
<el-col :span="8">
<el-card class="box-card">
<div slot="header" class="clearfix">
<span>Share</span>
</div>
<div class="component-item" style="height:420px;">
<dropdown-menu :items="articleList" style="margin:0 auto;" title="系列文章" />
</div>
</el-card>
</el-col>
</el-row>
</div>
</template>
<script>
import PanThumb from '@/components/PanThumb'
import MdInput from '@/components/MDinput'
import Mallki from '@/components/TextHoverEffect/Mallki'
import DropdownMenu from '@/components/Share/DropdownMenu'
import waves from '@/directive/waves/index.js' //
export default {
name: 'ComponentMixinDemo',
components: {
PanThumb,
MdInput,
Mallki,
DropdownMenu
},
directives: {
waves
},
data() {
const validate = (rule, value, callback) => {
if (value.length !== 6) {
callback(new Error('请输入六个字符'))
} else {
callback()
}
}
return {
demo: {
title: ''
},
demoRules: {
title: [{ required: true, trigger: 'change', validator: validate }]
},
articleList: [
{ title: '基础篇', href: 'https://juejin.im/post/59097cd7a22b9d0065fb61d2' },
{ title: '登录权限篇', href: 'https://juejin.im/post/591aa14f570c35006961acac' },
{ title: '实战篇', href: 'https://juejin.im/post/593121aa0ce4630057f70d35' },
{ title: 'vue-admin-template 篇', href: 'https://juejin.im/post/595b4d776fb9a06bbe7dba56' },
{ title: 'v4.0 篇', href: 'https://juejin.im/post/5c92ff94f265da6128275a85' },
{ title: '优雅的使用 icon', href: 'https://juejin.im/post/59bb864b5188257e7a427c09' }
]
}
}
}
</script>
<style scoped>
.mixin-components-container {
background-color: #f0f2f5;
padding: 30px;
min-height: calc(100vh - 84px);
}
.component-item{
min-height: 100px;
}
</style>

View File

@ -1,67 +0,0 @@
<template>
<div class="components-container">
<aside><strong>SplitPane</strong> If you've used
<a href="https://codepen.io/" target="_blank"> codepen</a>,
<a href="https://jsfiddle.net/" target="_blank"> jsfiddle </a>will not be unfamiliar.
<a href="https://github.com/PanJiaChen/vue-split-pane" target="_blank"> Github repository</a>
</aside>
<split-pane split="vertical" @resize="resize">
<template slot="paneL">
<div class="left-container" />
</template>
<template slot="paneR">
<split-pane split="horizontal">
<template slot="paneL">
<div class="top-container" />
</template>
<template slot="paneR">
<div class="bottom-container" />
</template>
</split-pane>
</template>
</split-pane>
</div>
</template>
<script>
import splitPane from 'vue-splitpane'
export default {
name: 'SplitpaneDemo',
components: { splitPane },
methods: {
resize() {
console.log('resize')
}
}
}
</script>
<style scoped>
.components-container {
position: relative;
height: 100vh;
}
.left-container {
background-color: #F38181;
height: 100%;
}
.right-container {
background-color: #FCE38A;
height: 200px;
}
.top-container {
background-color: #FCE38A;
width: 100%;
height: 100%;
}
.bottom-container {
width: 100%;
background-color: #95E1D3;
height: 100%;
}
</style>

View File

@ -1,135 +0,0 @@
<template>
<div>
<sticky :z-index="10" class-name="sub-navbar">
<el-dropdown trigger="click">
<el-button plain>
Platform<i class="el-icon-caret-bottom el-icon--right" />
</el-button>
<el-dropdown-menu slot="dropdown" class="no-border">
<el-checkbox-group v-model="platforms" style="padding: 5px 15px;">
<el-checkbox v-for="item in platformsOptions" :key="item.key" :label="item.key">
{{ item.name }}
</el-checkbox>
</el-checkbox-group>
</el-dropdown-menu>
</el-dropdown>
<el-dropdown trigger="click">
<el-button plain>
Link<i class="el-icon-caret-bottom el-icon--right" />
</el-button>
<el-dropdown-menu slot="dropdown" class="no-padding no-border" style="width:300px">
<el-input v-model="url" placeholder="Please enter the content">
<template slot="prepend">
Url
</template>
</el-input>
</el-dropdown-menu>
</el-dropdown>
<div class="time-container">
<el-date-picker v-model="time" type="datetime" format="yyyy-MM-dd HH:mm:ss" placeholder="Release time" />
</div>
<el-button style="margin-left: 10px;" type="success">
publish
</el-button>
</sticky>
<div class="components-container">
<aside>
Sticky header, When the page is scrolled to the preset position will be sticky on the top.
</aside>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<sticky :sticky-top="200">
<el-button type="primary"> placeholder</el-button>
</sticky>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
<div>placeholder</div>
</div>
</div>
</template>
<script>
import Sticky from '@/components/Sticky'
export default {
name: 'StickyDemo',
components: { Sticky },
data() {
return {
time: '',
url: '',
platforms: ['a-platform'],
platformsOptions: [
{ key: 'a-platform', name: 'platformA' },
{ key: 'b-platform', name: 'platformB' },
{ key: 'c-platform', name: 'platformC' }
],
pickerOptions: {
disabledDate(time) {
return time.getTime() > Date.now()
}
}
}
}
}
</script>
<style scoped>
.components-container div {
margin: 10px;
}
.time-container {
display: inline-block;
}
</style>

View File

@ -1,36 +0,0 @@
<template>
<div class="components-container">
<aside>
Rich text is a core feature of the management backend, but at the same time it is a place with lots of pits. In the process of selecting rich texts, I also took a lot of detours. The common rich texts on the market have been basically used, and I finally chose Tinymce. See the more detailed rich text comparison and introduction.
<a target="_blank" class="link-type" href="https://panjiachen.github.io/vue-element-admin-site/feature/component/rich-editor.html">Documentation</a>
</aside>
<div>
<tinymce v-model="content" :height="300" />
</div>
<div class="editor-content" v-html="content" />
</div>
</template>
<script>
import Tinymce from '@/components/Tinymce'
export default {
name: 'TinymceDemo',
components: { Tinymce },
data() {
return {
content:
`<h1 style="text-align: center;">Welcome to the TinyMCE demo!</h1><p style="text-align: center; font-size: 15px;"><img title="TinyMCE Logo" src="//www.tinymce.com/images/glyph-tinymce@2x.png" alt="TinyMCE Logo" width="110" height="97" /><ul>
<li>Our <a href="//www.tinymce.com/docs/">documentation</a> is a great resource for learning how to configure TinyMCE.</li><li>Have a specific question? Visit the <a href="https://community.tinymce.com/forum/">Community Forum</a>.</li><li>We also offer enterprise grade support as part of <a href="https://tinymce.com/pricing">TinyMCE premium subscriptions</a>.</li>
</ul>`
}
}
}
</script>
<style scoped>
.editor-content{
margin-top: 20px;
}
</style>

View File

@ -1,6 +1,5 @@
<template>
<div class="dashboard-editor-container">
<github-corner class="github-corner" />
<panel-group @handleSetLineChartData="handleSetLineChartData" />
@ -41,7 +40,6 @@
</template>
<script>
import GithubCorner from '@/components/GithubCorner'
import PanelGroup from './components/PanelGroup'
import LineChart from './components/LineChart'
import RaddarChart from './components/RaddarChart'
@ -72,7 +70,6 @@ const lineChartData = {
export default {
name: 'DashboardAdmin',
components: {
GithubCorner,
PanelGroup,
LineChart,
RaddarChart,

View File

@ -1,15 +1,7 @@
<template>
<div class="dashboard-editor-container">
<div class=" clearfix">
<pan-thumb :image="avatar" style="float: left">
Your roles:
<span v-for="item in roles" :key="item" class="pan-info-roles">{{ item }}</span>
</pan-thumb>
<github-corner style="position: absolute; top: 0px; border: 0; right: 0;" />
<div class="info-container">
<span class="display_name">{{ name }}</span>
<span style="font-size:20px;padding-top:20px;display:inline-block;">Editor's Dashboard</span>
</div>
</div>
<div>
<img :src="emptyGif" class="emptyGif">
@ -19,12 +11,9 @@
<script>
import { mapGetters } from 'vuex'
import PanThumb from '@/components/PanThumb'
import GithubCorner from '@/components/GithubCorner'
export default {
name: 'DashboardEditor',
components: { PanThumb, GithubCorner },
data() {
return {
emptyGif: 'https://wpimg.wallstcn.com/0e03b7da-db9e-4819-ba10-9016ddfdaed3'

View File

@ -24,7 +24,7 @@ export default {
},
created() {
if (!this.roles.includes('admin')) {
this.currentRole = 'editorDashboard'
this.currentRole = 'adminDashboard'
}
}
}

View File

@ -1,289 +0,0 @@
<template>
<div class="createPost-container">
<el-form ref="postForm" :model="postForm" :rules="rules" class="form-container">
<sticky :z-index="10" :class-name="'sub-navbar '+postForm.status">
<CommentDropdown v-model="postForm.comment_disabled" />
<PlatformDropdown v-model="postForm.platforms" />
<SourceUrlDropdown v-model="postForm.source_uri" />
<el-button v-loading="loading" style="margin-left: 10px;" type="success" @click="submitForm">
Publish
</el-button>
<el-button v-loading="loading" type="warning" @click="draftForm">
Draft
</el-button>
</sticky>
<div class="createPost-main-container">
<el-row>
<Warning />
<el-col :span="24">
<el-form-item style="margin-bottom: 40px;" prop="title">
<MDinput v-model="postForm.title" :maxlength="100" name="name" required>
Title
</MDinput>
</el-form-item>
<div class="postInfo-container">
<el-row>
<el-col :span="8">
<el-form-item label-width="60px" label="Author:" class="postInfo-container-item">
<el-select v-model="postForm.author" :remote-method="getRemoteUserList" filterable default-first-option remote placeholder="Search user">
<el-option v-for="(item,index) in userListOptions" :key="item+index" :label="item" :value="item" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="10">
<el-form-item label-width="120px" label="Publish Time:" class="postInfo-container-item">
<el-date-picker v-model="displayTime" type="datetime" format="yyyy-MM-dd HH:mm:ss" placeholder="Select date and time" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label-width="90px" label="Importance:" class="postInfo-container-item">
<el-rate
v-model="postForm.importance"
:max="3"
:colors="['#99A9BF', '#F7BA2A', '#FF9900']"
:low-threshold="1"
:high-threshold="3"
style="display:inline-block"
/>
</el-form-item>
</el-col>
</el-row>
</div>
</el-col>
</el-row>
<el-form-item style="margin-bottom: 40px;" label-width="70px" label="Summary:">
<el-input v-model="postForm.content_short" :rows="1" type="textarea" class="article-textarea" autosize placeholder="Please enter the content" />
<span v-show="contentShortLength" class="word-counter">{{ contentShortLength }}words</span>
</el-form-item>
<el-form-item prop="content" style="margin-bottom: 30px;">
<Tinymce ref="editor" v-model="postForm.content" :height="400" />
</el-form-item>
<el-form-item prop="image_uri" style="margin-bottom: 30px;">
<Upload v-model="postForm.image_uri" />
</el-form-item>
</div>
</el-form>
</div>
</template>
<script>
import Tinymce from '@/components/Tinymce'
import Upload from '@/components/Upload/SingleImage3'
import MDinput from '@/components/MDinput'
import Sticky from '@/components/Sticky' // header
import { validURL } from '@/utils/validate'
import { fetchArticle } from '@/api/article'
import { searchUser } from '@/api/remote-search'
import Warning from './Warning'
import { CommentDropdown, PlatformDropdown, SourceUrlDropdown } from './Dropdown'
const defaultForm = {
status: 'draft',
title: '', //
content: '', //
content_short: '', //
source_uri: '', //
image_uri: '', //
display_time: undefined, //
id: undefined,
platforms: ['a-platform'],
comment_disabled: false,
importance: 0
}
export default {
name: 'ArticleDetail',
components: { Tinymce, MDinput, Upload, Sticky, Warning, CommentDropdown, PlatformDropdown, SourceUrlDropdown },
props: {
isEdit: {
type: Boolean,
default: false
}
},
data() {
const validateRequire = (rule, value, callback) => {
if (value === '') {
this.$message({
message: rule.field + '为必传项',
type: 'error'
})
callback(new Error(rule.field + '为必传项'))
} else {
callback()
}
}
const validateSourceUri = (rule, value, callback) => {
if (value) {
if (validURL(value)) {
callback()
} else {
this.$message({
message: '外链url填写不正确',
type: 'error'
})
callback(new Error('外链url填写不正确'))
}
} else {
callback()
}
}
return {
postForm: Object.assign({}, defaultForm),
loading: false,
userListOptions: [],
rules: {
image_uri: [{ validator: validateRequire }],
title: [{ validator: validateRequire }],
content: [{ validator: validateRequire }],
source_uri: [{ validator: validateSourceUri, trigger: 'blur' }]
},
tempRoute: {}
}
},
computed: {
contentShortLength() {
return this.postForm.content_short.length
},
displayTime: {
// set and get is useful when the data
// returned by the back end api is different from the front end
// back end return => "2013-06-25 06:59:25"
// front end need timestamp => 1372114765000
get() {
return (+new Date(this.postForm.display_time))
},
set(val) {
this.postForm.display_time = new Date(val)
}
}
},
created() {
if (this.isEdit) {
const id = this.$route.params && this.$route.params.id
this.fetchData(id)
}
// Why need to make a copy of this.$route here?
// Because if you enter this page and quickly switch tag, may be in the execution of the setTagsViewTitle function, this.$route is no longer pointing to the current page
// https://github.com/PanJiaChen/vue-element-admin/issues/1221
this.tempRoute = Object.assign({}, this.$route)
},
methods: {
fetchData(id) {
fetchArticle(id).then(response => {
this.postForm = response.data
// just for test
this.postForm.title += ` Article Id:${this.postForm.id}`
this.postForm.content_short += ` Article Id:${this.postForm.id}`
// set tagsview title
this.setTagsViewTitle()
// set page title
this.setPageTitle()
}).catch(err => {
console.log(err)
})
},
setTagsViewTitle() {
const title = 'Edit Article'
const route = Object.assign({}, this.tempRoute, { title: `${title}-${this.postForm.id}` })
this.$store.dispatch('tagsView/updateVisitedView', route)
},
setPageTitle() {
const title = 'Edit Article'
document.title = `${title} - ${this.postForm.id}`
},
submitForm() {
console.log(this.postForm)
this.$refs.postForm.validate(valid => {
if (valid) {
this.loading = true
this.$notify({
title: '成功',
message: '发布文章成功',
type: 'success',
duration: 2000
})
this.postForm.status = 'published'
this.loading = false
} else {
console.log('error submit!!')
return false
}
})
},
draftForm() {
if (this.postForm.content.length === 0 || this.postForm.title.length === 0) {
this.$message({
message: '请填写必要的标题和内容',
type: 'warning'
})
return
}
this.$message({
message: '保存成功',
type: 'success',
showClose: true,
duration: 1000
})
this.postForm.status = 'draft'
},
getRemoteUserList(query) {
searchUser(query).then(response => {
if (!response.data.items) return
this.userListOptions = response.data.items.map(v => v.name)
})
}
}
}
</script>
<style lang="scss" scoped>
@import "~@/styles/mixin.scss";
.createPost-container {
position: relative;
.createPost-main-container {
padding: 40px 45px 20px 50px;
.postInfo-container {
position: relative;
@include clearfix;
margin-bottom: 10px;
.postInfo-container-item {
float: left;
}
}
}
.word-counter {
width: 40px;
position: absolute;
right: 10px;
top: 0px;
}
}
.article-textarea ::v-deep {
textarea {
padding-right: 40px;
resize: none;
border: none;
border-radius: 0px;
border-bottom: 1px solid #bfcbd9;
}
}
</style>

View File

@ -1,41 +0,0 @@
<template>
<el-dropdown :show-timeout="100" trigger="click">
<el-button plain>
{{ !comment_disabled?'Comment: opened':'Comment: closed' }}
<i class="el-icon-caret-bottom el-icon--right" />
</el-button>
<el-dropdown-menu slot="dropdown" class="no-padding">
<el-dropdown-item>
<el-radio-group v-model="comment_disabled" style="padding: 10px;">
<el-radio :label="true">
Close comment
</el-radio>
<el-radio :label="false">
Open comment
</el-radio>
</el-radio-group>
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
<script>
export default {
props: {
value: {
type: Boolean,
default: false
}
},
computed: {
comment_disabled: {
get() {
return this.value
},
set(val) {
this.$emit('input', val)
}
}
}
}
</script>

View File

@ -1,46 +0,0 @@
<template>
<el-dropdown :hide-on-click="false" :show-timeout="100" trigger="click">
<el-button plain>
Platfroms({{ platforms.length }})
<i class="el-icon-caret-bottom el-icon--right" />
</el-button>
<el-dropdown-menu slot="dropdown" class="no-border">
<el-checkbox-group v-model="platforms" style="padding: 5px 15px;">
<el-checkbox v-for="item in platformsOptions" :key="item.key" :label="item.key">
{{ item.name }}
</el-checkbox>
</el-checkbox-group>
</el-dropdown-menu>
</el-dropdown>
</template>
<script>
export default {
props: {
value: {
required: true,
default: () => [],
type: Array
}
},
data() {
return {
platformsOptions: [
{ key: 'a-platform', name: 'a-platform' },
{ key: 'b-platform', name: 'b-platform' },
{ key: 'c-platform', name: 'c-platform' }
]
}
},
computed: {
platforms: {
get() {
return this.value
},
set(val) {
this.$emit('input', val)
}
}
}
}
</script>

View File

@ -1,38 +0,0 @@
<template>
<el-dropdown :show-timeout="100" trigger="click">
<el-button plain>
Link
<i class="el-icon-caret-bottom el-icon--right" />
</el-button>
<el-dropdown-menu slot="dropdown" class="no-padding no-border" style="width:400px">
<el-form-item label-width="0px" style="margin-bottom: 0px" prop="source_uri">
<el-input v-model="source_uri" placeholder="Please enter the content">
<template slot="prepend">
URL
</template>
</el-input>
</el-form-item>
</el-dropdown-menu>
</el-dropdown>
</template>
<script>
export default {
props: {
value: {
type: String,
default: ''
}
},
computed: {
source_uri: {
get() {
return this.value
},
set(val) {
this.$emit('input', val)
}
}
}
}
</script>

View File

@ -1,3 +0,0 @@
export { default as CommentDropdown } from './Comment'
export { default as PlatformDropdown } from './Platform'
export { default as SourceUrlDropdown } from './SourceUrl'

View File

@ -1,13 +0,0 @@
<template>
<aside>
Creating and editing pages cannot be cached by keep-alive because keep-alive include does not currently support
caching based on routes, so it is currently cached based on component name. If you want to achieve a similar caching
effect, you can use a browser caching scheme such as localStorage. Or do not use keep-alive include to cache all
pages directly. See details
<a
href="https://panjiachen.github.io/vue-element-admin-site/guide/essentials/tags-view.html"
target="_blank"
>Document</a>
</aside>
</template>

View File

@ -1,13 +0,0 @@
<template>
<article-detail :is-edit="false" />
</template>
<script>
import ArticleDetail from './components/ArticleDetail'
export default {
name: 'CreateArticle',
components: { ArticleDetail }
}
</script>

View File

@ -1,13 +0,0 @@
<template>
<article-detail :is-edit="true" />
</template>
<script>
import ArticleDetail from './components/ArticleDetail'
export default {
name: 'EditForm',
components: { ArticleDetail }
}
</script>

View File

@ -1,112 +0,0 @@
<template>
<div class="app-container">
<el-table v-loading="listLoading" :data="list" border fit highlight-current-row style="width: 100%">
<el-table-column align="center" label="ID" width="80">
<template slot-scope="scope">
<span>{{ scope.row.id }}</span>
</template>
</el-table-column>
<el-table-column width="180px" align="center" label="Date">
<template slot-scope="scope">
<span>{{ scope.row.timestamp | parseTime('{y}-{m}-{d} {h}:{i}') }}</span>
</template>
</el-table-column>
<el-table-column width="120px" align="center" label="Author">
<template slot-scope="scope">
<span>{{ scope.row.author }}</span>
</template>
</el-table-column>
<el-table-column width="100px" label="Importance">
<template slot-scope="scope">
<svg-icon v-for="n in +scope.row.importance" :key="n" icon-class="star" class="meta-item__icon" />
</template>
</el-table-column>
<el-table-column class-name="status-col" label="Status" width="110">
<template slot-scope="{row}">
<el-tag :type="row.status | statusFilter">
{{ row.status }}
</el-tag>
</template>
</el-table-column>
<el-table-column min-width="300px" label="Title">
<template slot-scope="{row}">
<router-link :to="'/example/edit/'+row.id" class="link-type">
<span>{{ row.title }}</span>
</router-link>
</template>
</el-table-column>
<el-table-column align="center" label="Actions" width="120">
<template slot-scope="scope">
<router-link :to="'/example/edit/'+scope.row.id">
<el-button type="primary" size="small" icon="el-icon-edit">
Edit
</el-button>
</router-link>
</template>
</el-table-column>
</el-table>
<pagination v-show="total>0" :total="total" :page.sync="listQuery.page" :limit.sync="listQuery.limit" @pagination="getList" />
</div>
</template>
<script>
import { fetchList } from '@/api/article'
import Pagination from '@/components/Pagination' // Secondary package based on el-pagination
export default {
name: 'ArticleList',
components: { Pagination },
filters: {
statusFilter(status) {
const statusMap = {
published: 'success',
draft: 'info',
deleted: 'danger'
}
return statusMap[status]
}
},
data() {
return {
list: null,
total: 0,
listLoading: true,
listQuery: {
page: 1,
limit: 20
}
}
},
created() {
this.getList()
},
methods: {
getList() {
this.listLoading = true
fetchList(this.listQuery).then(response => {
this.list = response.data.items
this.total = response.data.total
this.listLoading = false
})
}
}
}
</script>
<style scoped>
.edit-input {
padding-right: 100px;
}
.cancel-btn {
position: absolute;
right: 15px;
top: 10px;
}
</style>

View File

@ -1,34 +0,0 @@
<template>
<div style="display:inline-block;">
<label class="radio-label">Cell Auto-Width: </label>
<el-radio-group v-model="autoWidth">
<el-radio :label="true" border>
True
</el-radio>
<el-radio :label="false" border>
False
</el-radio>
</el-radio-group>
</div>
</template>
<script>
export default {
props: {
value: {
type: Boolean,
default: true
}
},
computed: {
autoWidth: {
get() {
return this.value
},
set(val) {
this.$emit('input', val)
}
}
}
}
</script>

View File

@ -1,39 +0,0 @@
<template>
<div style="display:inline-block;">
<label class="radio-label">Book Type: </label>
<el-select v-model="bookType" style="width:120px;">
<el-option
v-for="item in options"
:key="item"
:label="item"
:value="item"
/>
</el-select>
</div>
</template>
<script>
export default {
props: {
value: {
type: String,
default: 'xlsx'
}
},
data() {
return {
options: ['xlsx', 'csv', 'txt']
}
},
computed: {
bookType: {
get() {
return this.value
},
set(val) {
this.$emit('input', val)
}
}
}
}
</script>

View File

@ -1,27 +0,0 @@
<template>
<div style="display:inline-block;">
<label class="radio-label" style="padding-left:0;">Filename: </label>
<el-input v-model="filename" placeholder="Please enter the file name (default excel-list)" style="width:345px;" prefix-icon="el-icon-document" />
</div>
</template>
<script>
export default {
props: {
value: {
type: String,
default: ''
}
},
computed: {
filename: {
get() {
return this.value
},
set(val) {
this.$emit('input', val)
}
}
}
}
</script>

View File

@ -1,116 +0,0 @@
<template>
<div class="app-container">
<div>
<FilenameOption v-model="filename" />
<AutoWidthOption v-model="autoWidth" />
<BookTypeOption v-model="bookType" />
<el-button :loading="downloadLoading" style="margin:0 0 20px 20px;" type="primary" icon="el-icon-document" @click="handleDownload">
Export Excel
</el-button>
<a href="https://panjiachen.github.io/vue-element-admin-site/feature/component/excel.html" target="_blank" style="margin-left:15px;">
<el-tag type="info">Documentation</el-tag>
</a>
</div>
<el-table v-loading="listLoading" :data="list" element-loading-text="Loading..." border fit highlight-current-row>
<el-table-column align="center" label="Id" width="95">
<template slot-scope="scope">
{{ scope.$index }}
</template>
</el-table-column>
<el-table-column label="Title">
<template slot-scope="scope">
{{ scope.row.title }}
</template>
</el-table-column>
<el-table-column label="Author" width="110" align="center">
<template slot-scope="scope">
<el-tag>{{ scope.row.author }}</el-tag>
</template>
</el-table-column>
<el-table-column label="Readings" width="115" align="center">
<template slot-scope="scope">
{{ scope.row.pageviews }}
</template>
</el-table-column>
<el-table-column align="center" label="Date" width="220">
<template slot-scope="scope">
<i class="el-icon-time" />
<span>{{ scope.row.timestamp | parseTime('{y}-{m}-{d} {h}:{i}') }}</span>
</template>
</el-table-column>
</el-table>
</div>
</template>
<script>
import { fetchList } from '@/api/article'
import { parseTime } from '@/utils'
// options components
import FilenameOption from './components/FilenameOption'
import AutoWidthOption from './components/AutoWidthOption'
import BookTypeOption from './components/BookTypeOption'
export default {
name: 'ExportExcel',
components: { FilenameOption, AutoWidthOption, BookTypeOption },
data() {
return {
list: null,
listLoading: true,
downloadLoading: false,
filename: '',
autoWidth: true,
bookType: 'xlsx'
}
},
created() {
this.fetchData()
},
methods: {
fetchData() {
this.listLoading = true
fetchList().then(response => {
this.list = response.data.items
this.listLoading = false
})
},
handleDownload() {
this.downloadLoading = true
import('@/vendor/Export2Excel').then(excel => {
const tHeader = ['Id', 'Title', 'Author', 'Readings', 'Date']
const filterVal = ['id', 'title', 'author', 'pageviews', 'display_time']
const list = this.list
const data = this.formatJson(filterVal, list)
excel.export_json_to_excel({
header: tHeader,
data,
filename: this.filename,
autoWidth: this.autoWidth,
bookType: this.bookType
})
this.downloadLoading = false
})
},
formatJson(filterVal, jsonData) {
return jsonData.map(v => filterVal.map(j => {
if (j === 'timestamp') {
return parseTime(v[j])
} else {
return v[j]
}
}))
}
}
}
</script>
<style>
.radio-label {
font-size: 14px;
color: #606266;
line-height: 40px;
padding: 0 12px 0 30px;
}
</style>

View File

@ -1,101 +0,0 @@
<template>
<div class="app-container">
<el-button :loading="downloadLoading" style="margin-bottom:20px" type="primary" icon="el-icon-document" @click="handleDownload">Export</el-button>
<el-table
ref="multipleTable"
v-loading="listLoading"
:data="list"
element-loading-text="Loading"
border
fit
highlight-current-row
>
<el-table-column align="center" label="Id" width="95">
<template slot-scope="scope">
{{ scope.$index }}
</template>
</el-table-column>
<el-table-column label="Main Information" align="center">
<el-table-column label="Title">
<template slot-scope="scope">
{{ scope.row.title }}
</template>
</el-table-column>
<el-table-column label="Author" width="110" align="center">
<template slot-scope="scope">
<el-tag>{{ scope.row.author }}</el-tag>
</template>
</el-table-column>
<el-table-column label="Readings" width="115" align="center">
<template slot-scope="scope">
{{ scope.row.pageviews }}
</template>
</el-table-column>
</el-table-column>
<el-table-column align="center" label="Date" width="220">
<template slot-scope="scope">
<i class="el-icon-time" />
<span>{{ scope.row.timestamp | parseTime('{y}-{m}-{d} {h}:{i}') }}</span>
</template>
</el-table-column>
</el-table>
</div>
</template>
<script>
import { fetchList } from '@/api/article'
import { parseTime } from '@/utils'
export default {
name: 'MergeHeader',
data() {
return {
list: null,
listLoading: true,
downloadLoading: false
}
},
created() {
this.fetchData()
},
methods: {
fetchData() {
this.listLoading = true
fetchList(this.listQuery).then(response => {
this.list = response.data.items
this.listLoading = false
})
},
handleDownload() {
this.downloadLoading = true
import('@/vendor/Export2Excel').then(excel => {
const multiHeader = [['Id', 'Main Information', '', '', 'Date']]
const header = ['', 'Title', 'Author', 'Readings', '']
const filterVal = ['id', 'title', 'author', 'pageviews', 'display_time']
const list = this.list
const data = this.formatJson(filterVal, list)
const merges = ['A1:A2', 'B1:D1', 'E1:E2']
excel.export_json_to_excel({
multiHeader,
header,
merges,
data
})
this.downloadLoading = false
})
},
formatJson(filterVal, jsonData) {
return jsonData.map(v => filterVal.map(j => {
if (j === 'timestamp') {
return parseTime(v[j])
} else {
return v[j]
}
}))
}
}
}
</script>

View File

@ -1,107 +0,0 @@
<template>
<div class="app-container">
<el-input v-model="filename" placeholder="Please enter the file name (default excel-list)" style="width:350px;" prefix-icon="el-icon-document" />
<el-button :loading="downloadLoading" style="margin-bottom:20px" type="primary" icon="el-icon-document" @click="handleDownload">
Export Selected Items
</el-button>
<a href="https://panjiachen.github.io/vue-element-admin-site/feature/component/excel.html" target="_blank" style="margin-left:15px;">
<el-tag type="info">Documentation</el-tag>
</a>
<el-table
ref="multipleTable"
v-loading="listLoading"
:data="list"
element-loading-text="拼命加载中"
border
fit
highlight-current-row
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" align="center" />
<el-table-column align="center" label="Id" width="95">
<template slot-scope="scope">
{{ scope.$index }}
</template>
</el-table-column>
<el-table-column label="Title">
<template slot-scope="scope">
{{ scope.row.title }}
</template>
</el-table-column>
<el-table-column label="Author" width="110" align="center">
<template slot-scope="scope">
<el-tag>{{ scope.row.author }}</el-tag>
</template>
</el-table-column>
<el-table-column label="Readings" width="115" align="center">
<template slot-scope="scope">
{{ scope.row.pageviews }}
</template>
</el-table-column>
<el-table-column align="center" label="PDate" width="220">
<template slot-scope="scope">
<i class="el-icon-time" />
<span>{{ scope.row.display_time }}</span>
</template>
</el-table-column>
</el-table>
</div>
</template>
<script>
import { fetchList } from '@/api/article'
export default {
name: 'SelectExcel',
data() {
return {
list: null,
listLoading: true,
multipleSelection: [],
downloadLoading: false,
filename: ''
}
},
created() {
this.fetchData()
},
methods: {
fetchData() {
this.listLoading = true
fetchList(this.listQuery).then(response => {
this.list = response.data.items
this.listLoading = false
})
},
handleSelectionChange(val) {
this.multipleSelection = val
},
handleDownload() {
if (this.multipleSelection.length) {
this.downloadLoading = true
import('@/vendor/Export2Excel').then(excel => {
const tHeader = ['Id', 'Title', 'Author', 'Readings', 'Date']
const filterVal = ['id', 'title', 'author', 'pageviews', 'display_time']
const list = this.multipleSelection
const data = this.formatJson(filterVal, list)
excel.export_json_to_excel({
header: tHeader,
data,
filename: this.filename
})
this.$refs.multipleTable.clearSelection()
this.downloadLoading = false
})
} else {
this.$message({
message: 'Please select at least one item',
type: 'warning'
})
}
},
formatJson(filterVal, jsonData) {
return jsonData.map(v => filterVal.map(j => v[j]))
}
}
}
</script>

View File

@ -1,42 +0,0 @@
<template>
<div class="app-container">
<upload-excel-component :on-success="handleSuccess" :before-upload="beforeUpload" />
<el-table :data="tableData" border highlight-current-row style="width: 100%;margin-top:20px;">
<el-table-column v-for="item of tableHeader" :key="item" :prop="item" :label="item" />
</el-table>
</div>
</template>
<script>
import UploadExcelComponent from '@/components/UploadExcel/index.vue'
export default {
name: 'UploadExcel',
components: { UploadExcelComponent },
data() {
return {
tableData: [],
tableHeader: []
}
},
methods: {
beforeUpload(file) {
const isLt1M = file.size / 1024 / 1024 < 1
if (isLt1M) {
return true
}
this.$message({
message: 'Please do not upload files larger than 1m in size.',
type: 'warning'
})
return false
},
handleSuccess({ results, header }) {
this.tableData = results
this.tableHeader = header
}
}
}
</script>

View File

@ -1,36 +0,0 @@
import request from '@/utils/request'
export default {
getDept(pageSize, pageNo) {
return request({
url: `/commonAction.do?eventcode=query_data&funid=queryevent&pagetype=editgrid&query_funid=sys_dept&user_id=administrator`,
method: 'post',
data: `start=${pageNo}&limit=${pageSize}&where_sql=&where_value=&where_type=&is_query=1&query_type=0`
}).then(response => response.data)
},
Crerte(data) {
return request({
url: `/commonAction.do`,
method: 'post',
data: `${data}`
}).then(response => response.data)
},
auditSave(data) {
return request({
url: `/commonAction.do`,
method: 'post',
data: `${data}`
}).then(response => response.data)
},
Delete(ids) {
let keys = ''
ids.forEach(d => {
keys += 'keyid=' + d + '&'
})
return request({
url: `/commonAction.do`,
method: 'post',
data: `funid=sys_dept&${keys}pagetype=editgrid&eventcode=delete_eg&user_id=administrator&dataType=json`
}).then(response => response.data)
}
}

View File

@ -1,92 +0,0 @@
<template>
<div>
<el-card>
<el-form ref="auditForm" :model="form" :rules="rules">
<el-form-item label="所属部门" :label-width="formLabelWidth">
<el-select v-model="id" placeholder="请选择" disabled>
<el-option
v-for="item in data"
:key="item.sys_dept__dept_id"
:label="item.sys_dept__dept_name"
:value="item.sys_dept__dept_id"
/>
</el-select>
</el-form-item>
<el-form-item label="部门编码" :label-width="formLabelWidth" prop="sys_dept__dept_code">
<el-input v-model="form.sys_dept__dept_code" @change="change" />
</el-form-item>
<el-form-item label="部门名称" :label-width="formLabelWidth" prop="sys_dept__dept_name">
<el-input v-model="form.sys_dept__dept_name" @change="change" />
</el-form-item>
<el-form-item label="备注" :label-width="formLabelWidth" prop="sys_dept__memo">
<el-input v-model="form.sys_dept__memo" @change="change" />
</el-form-item>
<el-form-item label="是否注销" :label-width="formLabelWidth">
<el-select v-model="form.sys_dept__is_novalid" placeholder="请选择" @change="change">
<el-option
v-for="item in novalid"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
</el-form>
</el-card>
</div>
</template>
<script>
export default {
props: {
id: {
type: String,
default: ''
},
data: {
type: Array,
default: () => []
},
auditForm: {
type: Object,
default: () => {}
}
},
data() {
return {
novalid: [
{
value: '0',
label: '否'
}, {
value: '1',
label: '是'
}
],
rules: {
sys_dept__dept_code: [
{ required: true, message: '请输入部门编码', trigger: 'blur' }
],
sys_dept__dept_name: [
{ required: true, message: '请输入部门名称', trigger: 'blur' }
]
},
formLabelWidth: '120px',
form: {}
}
},
created() {
this.form = JSON.parse(JSON.stringify(this.auditForm))
},
methods: {
change() {
this.$emit('change', this.form)
}
}
}
</script>
<style>
</style>

View File

@ -1,299 +0,0 @@
<template>
<div class="app-container">
<buttons funid="sys_dept" @editCreate="editCreate" @editDelete="editDelete" @editSave="editSave" @upload="upload" />
<el-card>
<el-table
ref="deptTable"
v-loading="loading"
:data="data"
style="width: 100%"
@selection-change="handleSelectionChange"
@cell-dblclick="cellDblclick"
>
<template v-for="(d,i) in tableHeader">
<el-table-column v-if="d.type && d.type === 'selection'" :key="i" :type="d.type" :fixed="d.fixed" />
<el-table-column
v-else
:key="i"
:prop="d.prop"
:label="d.label"
>
<template slot-scope="scope">
<div v-if="d.label==='是否注销'">
{{
scope.row.sys_dept__is_novalid == 0 ? '否' : '是'
}}
</div>
<div v-else-if="d.label === '操作'">
<el-button icon="el-icon-view" type="text" title="编辑" @click="edit(scope.row)" />
<el-button v-if="scope.row.status !== 'NULLIFY'" icon="el-icon-delete" style="color:#F56C6C" type="text" title="删除" @click="Delete(scope.row)" />
</div>
<div v-else>{{ scope.row[d.prop] }}</div>
</template>
</el-table-column>
</template>
</el-table>
<el-pagination
:current-page="pager.pageNo"
:page-sizes="[10, 30, 50, 100, 500]"
:page-size="pager.pageSize"
:total="pager.total"
layout="total, sizes, prev, pager, next, jumper"
@size-change="sizeChange"
@current-change="pageChange"
/>
</el-card>
<el-dialog v-if="dialogFormVisible" title="新增部门" :visible.sync="dialogFormVisible" @close="closeDialog">
<el-form ref="form" :model="form" :rules="rules">
<el-form-item label="所属部门" :label-width="formLabelWidth">
<el-select v-model="dept_id" placeholder="请选择">
<el-option
v-for="item in data"
:key="item.sys_dept__dept_id"
:label="item.sys_dept__dept_name"
:value="item.sys_dept__dept_id"
/>
</el-select>
</el-form-item>
<el-form-item label="部门编码" :label-width="formLabelWidth" prop="dept_code">
<el-input v-model="form.dept_code" />
</el-form-item>
<el-form-item label="部门名称" :label-width="formLabelWidth" prop="dept_name">
<el-input v-model="form.dept_name" />
</el-form-item>
<el-form-item label="备注" :label-width="formLabelWidth" prop="memo">
<el-input v-model="form.memo" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="dialogFormVisible = false"> </el-button>
<el-button type="primary" @click="create"> </el-button>
</div>
</el-dialog>
<el-dialog v-if="dialogEditVisible" title="部门" :visible.sync="dialogEditVisible" @close="closeDialog">
<AdutiDept :id="parent_id" ref="auditForm" :audit-form="auditForm" :data="data" @change="auditFormChange" />
<div slot="footer" class="dialog-footer">
<el-button @click="dialogEditVisible = false"> </el-button>
<el-button type="primary" @click="save"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import api from './api'
import buttons from '@/components/Buttons'
import AdutiDept from './components/auditDept'
export default {
name: 'Guide',
components: {
buttons,
AdutiDept
},
data() {
return {
loading: false,
data: [],
ids: [],
pager: {
pageNo: 0,
pageSize: 10,
total: 0
},
tableHeader: [
{
prop: 'selection',
type: 'selection',
fixed: 'left'
}, {
prop: 'sys_dept__dept_code',
label: '组织编码'
}, {
prop: 'sys_dept__dept_name',
label: '组织名称'
}, {
prop: 'sys_dept__memo',
label: '备注'
}, {
prop: 'sys_dept__is_novalid',
label: '是否注销'
},
{
prop: 'opration',
label: '操作',
width: '70px',
fixed: 'right',
minWidth: '70px',
show: true
}],
value: '',
dept_id: '',
id: '',
parent_id: '',
form: {
dept_name: '',
dept_code: '',
memo: ''
},
rules: {
dept_code: [
{ required: true, message: '请输入部门编码', trigger: 'blur' }
],
dept_name: [
{ required: true, message: '请输入部门名称', trigger: 'blur' }
]
},
dialogFormVisible: false,
dialogEditVisible: false,
formLabelWidth: '120px',
auditForm: {},
saveFrom: {}
}
},
created() {
this.getList()
},
mounted() {
},
methods: {
getList() {
this.loading = true
let pageNo = this.pager.pageNo * this.pager.pageSize - this.pager.pageSize
if (pageNo < 0) {
pageNo = 0
}
api.getDept(
this.pager.pageSize,
pageNo
).then(data => {
if (data.success) {
this.data = data.data.root
this.pager.total = data.data.total
setTimeout(() => {
this.loading = false
}, 200)
} else {
this.$message.error(data.message)
}
})
},
editCreate() {
if (this.ids === null) {
this.$message.warning('请选择一个组织再添加下属组织')
} else if (this.ids.length !== 1) {
this.$message.warning('请选择一个组织再添加下属组织')
} else {
this.dialogFormVisible = true
this.dept_id = this.ids[0]
}
},
create() {
this.$refs['form'].validate((valid) => {
if (valid) {
const data = `funid= sys_dept&parentId= ${this.dept_id}&levelCol= sys_dept.dept_level&keyid= &pagetype= editgrid&eventcode= save_eg&sys_dept__dept_code= ${this.form.dept_code}&sys_dept__dept_name= ${this.form.dept_name}&sys_dept__memo= ${this.form.memo}&sys_dept__is_novalid= 0&sys_dept__dept_id= &sys_dept__dept_level= &user_id= administrator&dataType= json`
api.Crerte(data).then(data => {
if (data.success) {
this.getList()
this.dialogFormVisible = false
this.$refs['form'].resetFields()
this.form.dept_name = ''
this.form.dept_code = ''
this.$message.success('新增成功!')
} else {
this.$message.error(data.message)
}
})
}
})
},
Delete(row) {
this.ids = []
this.ids.push(row.sys_dept__dept_id)
this.editDelete()
},
editDelete() {
if (this.ids && this.ids.length > 0) {
this.$confirm('确认删除部门?').then(() => {
api.Delete(this.ids).then(data => {
if (data.success) {
this.getList()
this.$message.success('删除成功!')
} else {
this.$message.error(data.message)
}
})
}).catch(() => {})
} else {
this.$message.warning('请选择数据进行删除')
}
},
editSave() {
console.log('editSave')
},
upload() {
console.log('upload')
},
edit(row) {
this.id = row.sys_dept__dept_id
this.parent_id = this.id.substring(0, this.id.length - 4)
console.log(this.parent_id, this.id)
this.auditForm = row
this.dialogEditVisible = true
},
auditFormChange(form) {
this.saveFrom = form
},
save() {
console.log(this.saveFrom, 'this.saveFrom')
console.log(this.auditForm, 'this.auditForm')
if (Object.keys(this.saveFrom).length === 0) {
this.saveFrom = this.auditForm
}
this.$refs.auditForm.$refs.auditForm.validate(valid => {
if (valid) {
const _form = `funid=sys_dept&parentId=&levelCol=sys_dept.dept_level&keyid=${this.id}&pagetype=editgrid&eventcode=save_eg&sys_dept__dept_code=${this.saveFrom.sys_dept__dept_code}&sys_dept__dept_name=${this.saveFrom.sys_dept__dept_name}&sys_dept__memo=${this.saveFrom.sys_dept__memo}&sys_dept__is_novalid=${this.saveFrom.sys_dept__is_novalid}&sys_dept__dept_id=${this.id}&sys_dept__dept_level=3&user_id=administrator&dataType=json`
api.auditSave(_form).then(data => {
if (data.success) {
this.getList()
this.$message.success('保存成功!')
this.dialogEditVisible = false
} else {
this.$message.error(data.message)
}
})
}
})
},
cellDblclick(row) {
console.log(row, 'row')
this.id = row.sys_dept__dept_id
this.auditForm = row
this.saveFrom = []
this.dialogEditVisible = true
},
sizeChange(size) {
this.pager.pageSize = size
this.getList()
},
pageChange(page) {
this.pager.pageNo = page
this.getList()
},
handleSelectionChange(val) {
this.ids = val.map(d => d.sys_dept__dept_id)
},
closeDialog() {
this.dialogFormVisible = false
this.$refs['form'].resetFields()
this.form.dept_name = ''
this.form.dept_code = ''
}
}
}
</script>
<style lang="scss" scoped>
.el-card {
margin-top: 10px;
}
</style>

View File

@ -1,53 +0,0 @@
const steps = [
{
element: '#hamburger-container',
popover: {
title: 'Hamburger',
description: 'Open && Close sidebar',
position: 'bottom'
}
},
{
element: '#breadcrumb-container',
popover: {
title: 'Breadcrumb',
description: 'Indicate the current page location',
position: 'bottom'
}
},
{
element: '#header-search',
popover: {
title: 'Page Search',
description: 'Page search, quick navigation',
position: 'left'
}
},
{
element: '#screenfull',
popover: {
title: 'Screenfull',
description: 'Set the page into fullscreen',
position: 'left'
}
},
{
element: '#size-select',
popover: {
title: 'Switch Size',
description: 'Switch the system size',
position: 'left'
}
},
{
element: '#tags-view-container',
popover: {
title: 'Tags view',
description: 'The history of the page you visited',
position: 'bottom'
},
padding: 0
}
]
export default steps

View File

@ -0,0 +1,63 @@
import request from '@/utils/request'
export default {
getDate(pageSize, pageNo, isWhereSql, whereValue) {
let whereSql = ''
let whereType = ''
if (isWhereSql) {
whereSql = `dept_id like ?`
whereType = 'string'
}
return request({
url: `commonAction.do?eventcode=query_data&funid=queryevent&pagetype=grid&query_funid=hidden_check&user_id=administrator`,
method: 'post',
data: `start=${pageNo}&limit=${pageSize}&where_sql=${whereSql}&where_value=${whereValue}&where_type=${whereType}&is_query=1&query_type=0`
}).then(response => response.data)
},
getDeptTree() {
return request({
url: `/commonAction.do?eventcode=query_data&funid=queryevent&pagetype=editgrid&query_funid=sys_dept&user_id=administrator`,
method: 'post',
data: `start=0&limit=10000&where_sql=&where_value=&where_type=&is_query=1&query_type=0`
}).then(response => response.data)
},
Crerte(data) {
return request({
url: `/commonAction.do`,
method: 'post',
data: `funid=hidden_check&keyid=${data.hidden_danger__hidden_danger_id}&hidden_danger__hidden_code=${data.hidden_danger__hidden_code}&hidden_danger__hidden_state=${data.hidden_danger__hidden_state}&hidden_danger__check_man=${data.hidden_danger__check_man}&hidden_danger__check_dept=${data.hidden_danger__check_dept}&hidden_danger__check_date=${data.hidden_danger__check_date}&hidden_danger__check_location=${data.hidden_danger__check_location}&hidden_danger__check_content=${data.hidden_danger__check_content}&hidden_danger__check_problem=${data.hidden_danger__check_problem}&hidden_danger__org_id=${data.hidden_danger__org_id}&hidden_danger__insp_det_id=${data.hidden_danger__insp_det_id}&hidden_danger__dept_id=${data.hidden_danger__dept_id}&hidden_danger__hidden_danger_id=${data.hidden_danger__hidden_danger_id}&hidden_danger__reform_man=${data.hidden_danger__reform_man}&hidden_danger__reform_dept=${data.hidden_danger__reform_dept}&hidden_danger__reform_limit=${data.hidden_danger__reform_limit}&hidden_danger__check_photo=${data.hidden_danger__check_photo}&hidden_danger__more_flag=${data.hidden_danger__more_flag}&hidden_danger__check_man_id=${data.hidden_danger__check_man_id}&hidden_danger__check_dept_id=${data.hidden_danger__check_dept_id}&hidden_danger__reform_dept_id=${data.hidden_danger__reform_dept_id}&hidden_danger__reform_man_id=${data.hidden_danger__reform_man_id}&hidden_danger__safe_insp_id=${data.hidden_danger__safe_insp_id}&pagetype=form&eventcode=create&fkValue=&user_id=administrator&dataType=json`
}).then(response => response.data)
},
Save(data) {
return request({
url: `/commonAction.do`,
method: 'post',
data: `funid=hidden_check&keyid=${data.hidden_danger__hidden_danger_id}&hidden_danger__hidden_code=${data.hidden_danger__hidden_code}&hidden_danger__hidden_state=${data.hidden_danger__hidden_state}&hidden_danger__check_man=${data.hidden_danger__check_man}&hidden_danger__check_dept=${data.hidden_danger__check_dept}&hidden_danger__check_date=${data.hidden_danger__check_date}&hidden_danger__check_location=${data.hidden_danger__check_location}&hidden_danger__check_content=${data.hidden_danger__check_content}&hidden_danger__check_problem=${data.hidden_danger__check_problem}&hidden_danger__org_id=${data.hidden_danger__org_id}&hidden_danger__insp_det_id=${data.hidden_danger__insp_det_id}&hidden_danger__dept_id=${data.hidden_danger__dept_id}&hidden_danger__hidden_danger_id=${data.hidden_danger__hidden_danger_id}&hidden_danger__reform_man=${data.hidden_danger__reform_man}&hidden_danger__reform_dept=${data.hidden_danger__reform_dept}&hidden_danger__reform_limit=${data.hidden_danger__reform_limit}&hidden_danger__check_photo=${data.hidden_danger__check_photo}&hidden_danger__more_flag=${data.hidden_danger__more_flag}&hidden_danger__check_man_id=${data.hidden_danger__check_man_id}&hidden_danger__check_dept_id=${data.hidden_danger__check_dept_id}&hidden_danger__reform_dept_id=${data.hidden_danger__reform_dept_id}&hidden_danger__reform_man_id=${data.hidden_danger__reform_man_id}&hidden_danger__safe_insp_id=${data.hidden_danger__safe_insp_id}&pagetype=form&eventcode=save&dirtyfields=hidden_danger.check_man;hidden_danger.reform_man;hidden_danger.reform_dept;hidden_danger.check_dept;hidden_danger.check_date;hidden_danger.check_location;hidden_danger.check_content;hidden_danger.check_problem;hidden_danger.dept_id;hidden_danger.reform_dept_id;hidden_danger.reform_limit;hidden_danger.check_dept_id;hidden_danger.check_man_id;hidden_danger.reform_man_id&fkValue=&user_id=administrator&dataType=json`
}).then(response => response.data)
},
auditSave(data) {
return request({
url: `/commonAction.do`,
method: 'post',
data: `${data}`
}).then(response => response.data)
},
Delete(ids) {
let keys = ''
ids.forEach(d => {
keys += 'keyid=' + d + '&'
})
return request({
url: `/commonAction.do`,
method: 'post',
data: `funid=hidden_check&${keys}pagetype=editgrid&eventcode=delete&user_id=administrator&dataType=json`
}).then(response => response.data)
},
getFormDate(id) {
return request({
url: `/commonAction.do?eventcode=query_data&funid=queryevent&pagetype=grid&query_funid=hidden_check&user_id=administrator`,
method: 'post',
data: `start=0&limit=10&where_sql=hidden_danger.hidden_danger_id = ?&where_value=${id}&where_type=string&is_query=1&query_type=0`
}).then(response => response.data)
}
}

View File

@ -0,0 +1,344 @@
<template>
<div>
<el-card>
<buttons funid="hidden_check" style="margin-bottom:20px" @save="save" />
<el-form ref="form" :model="form" label-width="80px" :rules="rules">
<el-row>
<el-col :span="7">
<el-form-item label="隐患编号">
<el-input v-model="form.hidden_danger__hidden_code" />
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="巡检状态">
<el-select v-model="form.hidden_danger__hidden_state" placeholder="请选择" :disabled="!disabled">
<el-option
v-for="item in hiddenState"
:key="item.funall_control__value_data"
:label="item.funall_control__display_data"
:value="item.funall_control__value_data"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="检查人">
<el-input v-model="form.hidden_danger__check_man" placeholder="请选择检查人" class="input-with-select" clearable>
<el-button slot="append" icon="el-icon-search" @click="checkManVisible = !checkManVisible" />
</el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="7">
<el-form-item label="检查部门">
<el-input v-model="form.hidden_danger__check_dept" placeholder="请选择检查部门" class="input-with-select" clearable>
<el-button slot="append" icon="el-icon-search" @click="checkDeptVisible = !checkDeptVisible" />
</el-input>
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="检查时间">
<el-date-picker
v-model="form.hidden_danger__check_date"
type="date"
placeholder="选择日期"
style="width: 100%;"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
/>
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="检查地点">
<el-input v-model="form.hidden_danger__check_location" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="7">
<el-form-item label="检查内容">
<el-input v-model="form.hidden_danger__check_content" type="textarea" />
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="隐患描述" prop="hidden_danger__check_problem">
<el-input v-model="form.hidden_danger__check_problem" type="textarea" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="7">
<el-form-item label="整改人">
<el-input v-model="form.hidden_danger__reform_man" placeholder="请选择整改人" class="input-with-select" clearable>
<el-button slot="append" icon="el-icon-search" @click="reformManVisible = !reformManVisible" />
</el-input>
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="整改部门">
<el-input v-model="form.hidden_danger__reform_dept" placeholder="请选择检查部门" class="input-with-select" clearable>
<el-button slot="append" icon="el-icon-search" @click="reformDeptVisible = !reformDeptVisible" />
</el-input>
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="整改期限">
<el-date-picker
v-model="form.hidden_danger__reform_limit"
type="date"
placeholder="选择日期"
style="width: 100%;"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
/>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<el-dialog
v-if="checkManVisible"
title="选择人员"
:visible.sync="checkManVisible"
width="60%"
>
<SelUser ref="CheckMan" @updateUser="getCheckMan" />
<span>
<el-button @click="checkManVisible = false"> </el-button>
<el-button type="primary" @click="selCheckMan"> </el-button>
</span>
</el-dialog>
<el-dialog
v-if="reformManVisible"
title="选择人员"
:visible.sync="reformManVisible"
width="60%"
>
<SelUser ref="ReformMan" @updateUser="getReformMan" />
<span>
<el-button @click="reformManVisible = false"> </el-button>
<el-button type="primary" @click="selReformMan"> </el-button>
</span>
</el-dialog>
<el-dialog
v-if="checkDeptVisible"
class="selDept"
title="选择部门"
:visible.sync="checkDeptVisible"
width="60%"
:modal="false"
>
<SelDept ref="CheckDept" @updateDept="getCheckDept" />
<span>
<el-button @click="checkDeptVisible = false"> </el-button>
<el-button type="primary" @click="selCheckDept"> </el-button>
</span>
</el-dialog>
<el-dialog
v-if="reformDeptVisible"
class="selDept"
title="选择部门"
:visible.sync="reformDeptVisible"
width="60%"
:modal="false"
>
<SelDept ref="ReformDept" @updateDept="getReformDept" />
<span>
<el-button @click="reformDeptVisible = false"> </el-button>
<el-button type="primary" @click="selReformDept"> </el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import api from '../../api'
import publicApi from '@/api/public'
import buttons from '@/components/formBtn'
import SelUser from '@/components/selUser'
import SelDept from '@/components/selDept'
export default {
name: 'AuditForm',
components: {
buttons,
SelUser,
SelDept
},
// props: {
// id: { type: String, default: () => '' }
// },
data() {
return {
loading: false,
form: {
hidden_danger__hidden_code: '',
hidden_danger__hidden_state: '1',
hidden_danger__check_man: '',
hidden_danger__check_dept: '',
hidden_danger__check_date: '',
hidden_danger__check_location: '',
hidden_danger__check_content: '',
hidden_danger__check_problem: '',
hidden_danger__reform_man: '',
hidden_danger__reform_dept: '',
hidden_danger__reform_limit: '',
hidden_danger__check_photo: '',
hidden_danger__more_flag: '',
hidden_danger__safe_insp_id: '',
hidden_danger__reform_man_id: '',
hidden_danger__reform_dept_id: '',
hidden_danger__org_id: '',
hidden_danger__insp_det_id: '',
hidden_danger__hidden_danger_id: '',
hidden_danger__dept_id: '',
hidden_danger__check_man_id: '',
hidden_danger__check_dept_id: ''
},
rules: {
hidden_danger__check_problem: [
{ required: true, message: '请输入隐患描述', trigger: 'blur' }
]
},
inspName: [],
disabled: false,
options: [],
checkManVisible: false,
reformManVisible: false,
checkDeptVisible: false,
reformDeptVisible: false,
inspNameVisible: false,
id: '',
hiddenState: []
}
},
created() {
this.getHiddenState()
},
methods: {
getList() {
this.loading = true
api.getFormDate().then(data => {
if (data.success) {
this.form = data.data.root[0]
setTimeout(() => {
this.loading = false
}, 200)
} else {
this.$message.error(data.message)
}
})
},
async getHiddenState() {
await publicApi.getTypeSel('hiddenstate').then(data => {
if (data.success) {
this.hiddenState = data.data.root
} else {
this.$message.error(data.message)
}
})
},
onSubmit() {},
getCheckMan(data) {
this.form.hidden_danger__check_man = data.sys_user__user_name
this.form.hidden_danger__check_man_id = data.sys_user__user_id
this.form.hidden_danger__check_dept = data.sys_dept__dept_name
this.form.hidden_danger__check_dept_id = data.sys_user__dept_id
this.checkManVisible = false
},
selCheckMan() {
this.getCheckMans(this.$refs.CheckMan.Users)
this.checkManVisible = false
},
getCheckMans(data) {
this.form.hidden_danger__check_man = data.map(d => { return d.sys_user__user_name }).join(';')
this.form.hidden_danger__check_man_id = data.map(d => { return d.sys_user__user_id }).join(';')
this.form.hidden_danger__check_dept = data.map(d => { return d.sys_dept__dept_name }).join(';')
this.form.hidden_danger__check_dept_id = data.map(d => { return d.sys_user__dept_id }).join(';')
this.checkManVisible = false
},
getReformMan(data) {
this.form.hidden_danger__reform_man = data.sys_user__user_name
this.form.hidden_danger__reform_man_id = data.sys_user__user_id
this.form.hidden_danger__reform_dept = data.sys_dept__dept_name
this.form.hidden_danger__reform_dept_id = data.sys_user__dept_id
this.reformManVisible = false
},
selReformMan() {
this.getReformMans(this.$refs.ReformMan.Users)
this.reformManVisible = false
},
getReformMans(data) {
this.form.hidden_danger__reform_man = data.map(d => { return d.sys_user__user_name }).join(';')
this.form.hidden_danger__reform_man_id = data.map(d => { return d.sys_user__user_id }).join(';')
this.form.hidden_danger__reform_dept = data.map(d => { return d.sys_dept__dept_name }).join(';')
this.form.hidden_danger__reform_dept_id = data.map(d => { return d.sys_user__dept_id }).join(';')
this.reformManVisible = false
},
getCheckDept(data) {
this.form.hidden_danger__check_dept = data.sys_dept__dept_name
this.form.hidden_danger__check_dept_id = data.sys_dept__dept_id
this.checkDeptVisible = false
},
selCheckDept() {
this.CheckDepts(this.$refs.CheckDept.Dpets)
},
CheckDepts(data) {
this.form.hidden_danger__check_dept = data.map(d => { return d.sys_dept__dept_name }).join(';')
this.form.hidden_danger__check_dept_id = data.map(d => { return d.sys_dept__dept_id }).join(';')
this.checkDeptVisible = false
},
getReformDept(data) {
this.form.hidden_danger__reform_dept = data.sys_dept__dept_name
this.form.hidden_danger__reform_dept_id = data.sys_dept__dept_id
this.reformDeptVisible = false
},
selReformDept() {
this.ReformDepts(this.$refs.ReformDept.Dpets)
},
ReformDepts(data) {
this.form.hidden_danger__reform_dept = data.map(d => { return d.sys_dept__dept_name }).join(';')
this.form.hidden_danger__reform_dept_id = data.map(d => { return d.sys_dept__dept_id }).join(';')
this.reformDeptVisible = false
},
save() {
this.$refs['form'].validate((valid) => {
if (valid) {
api.Crerte(this.form).then(data => {
if (data.success) {
this.$message.success('保存成功!')
const param = `/hidden_danger/hidden_check/audit/${data.data.keyid}`
this.$router.push(param)
} else {
this.$message.error(data.message)
}
})
}
})
},
back() {
// this.$router__back(-1)
}
}
}
</script>
<style lang="scss" scoped>
::v-deep .el-dialog__body {
padding: 10px 20px !important;
}
::v-deep .el-form-item__label {
text-align: right;
/* vertical-align: middle; */
float: left;
font-size: 14px;
color: #606266;
line-height: 40px;
padding: 0 6px 0 0;
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
.el-col{
margin-left: 2%;
}
</style>

View File

@ -0,0 +1,344 @@
<template>
<div>
<el-card>
<buttons funid="hidden_check" style="margin-bottom:20px" @save="save" />
<el-form ref="form" :model="form" label-width="80px" :rules="rules">
<el-row>
<el-col :span="7">
<el-form-item label="隐患编号">
<el-input v-model="form.hidden_danger__hidden_code" :disabled="!disabled" />
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="巡检状态">
<el-select v-model="form.hidden_danger__hidden_state" placeholder="请选择" :disabled="!disabled">
<el-option
v-for="item in hiddenState"
:key="item.funall_control__value_data"
:label="item.funall_control__display_data"
:value="item.funall_control__value_data"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="检查人">
<el-input v-model="form.hidden_danger__check_man" placeholder="请选择检查人" class="input-with-select" clearable>
<el-button slot="append" icon="el-icon-search" @click="checkManVisible = !checkManVisible" />
</el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="7">
<el-form-item label="检查部门">
<el-input v-model="form.hidden_danger__check_dept" placeholder="请选择检查部门" class="input-with-select" clearable>
<el-button slot="append" icon="el-icon-search" @click="checkDeptVisible = !checkDeptVisible" />
</el-input>
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="检查时间">
<el-date-picker
v-model="form.hidden_danger__check_date"
type="date"
placeholder="选择日期"
style="width: 100%;"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
/>
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="检查地点">
<el-input v-model="form.hidden_danger__check_location" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="7">
<el-form-item label="检查内容">
<el-input v-model="form.hidden_danger__check_content" type="textarea" />
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="隐患描述" prop="hidden_danger__check_problem">
<el-input v-model="form.hidden_danger__check_problem" type="textarea" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="7">
<el-form-item label="整改人">
<el-input v-model="form.hidden_danger__reform_man" placeholder="请选择整改人" class="input-with-select" clearable>
<el-button slot="append" icon="el-icon-search" @click="reformManVisible = !reformManVisible" />
</el-input>
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="整改部门">
<el-input v-model="form.hidden_danger__reform_dept" placeholder="请选择检查部门" class="input-with-select" clearable>
<el-button slot="append" icon="el-icon-search" @click="reformDeptVisible = !reformDeptVisible" />
</el-input>
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="整改期限">
<el-date-picker
v-model="form.hidden_danger__reform_limit"
type="date"
placeholder="选择日期"
style="width: 100%;"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
/>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<el-dialog
v-if="checkManVisible"
title="选择人员"
:visible.sync="checkManVisible"
width="60%"
>
<SelUser ref="CheckMan" @updateUser="getCheckMan" />
<span>
<el-button @click="checkManVisible = false"> </el-button>
<el-button type="primary" @click="selCheckMan"> </el-button>
</span>
</el-dialog>
<el-dialog
v-if="reformManVisible"
title="选择人员"
:visible.sync="reformManVisible"
width="60%"
>
<SelUser ref="ReformMan" @updateUser="getReformMan" />
<span>
<el-button @click="reformManVisible = false"> </el-button>
<el-button type="primary" @click="selReformMan"> </el-button>
</span>
</el-dialog>
<el-dialog
v-if="checkDeptVisible"
class="selDept"
title="选择部门"
:visible.sync="checkDeptVisible"
width="60%"
:modal="false"
>
<SelDept ref="CheckDept" @updateDept="getCheckDept" />
<span>
<el-button @click="checkDeptVisible = false"> </el-button>
<el-button type="primary" @click="selCheckDept"> </el-button>
</span>
</el-dialog>
<el-dialog
v-if="reformDeptVisible"
class="selDept"
title="选择部门"
:visible.sync="reformDeptVisible"
width="60%"
:modal="false"
>
<SelDept ref="ReformDept" @updateDept="getReformDept" />
<span>
<el-button @click="reformDeptVisible = false"> </el-button>
<el-button type="primary" @click="selReformDept"> </el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import api from '../../api'
import publicApi from '@/api/public'
import buttons from '@/components/formBtn'
import SelUser from '@/components/selUser'
import SelDept from '@/components/selDept'
export default {
name: 'AuditForm',
components: {
buttons,
SelUser,
SelDept
},
// props: {
// id: { type: String, default: () => '' }
// },
data() {
return {
loading: false,
id: this.$route.params.id,
form: {
hidden_danger__hidden_code: '',
hidden_danger__hidden_state: '1',
hidden_danger__check_man: '',
hidden_danger__check_dept: '',
hidden_danger__check_date: '',
hidden_danger__check_location: '',
hidden_danger__check_content: '',
hidden_danger__check_problem: '',
hidden_danger__reform_man: '',
hidden_danger__reform_dept: '',
hidden_danger__reform_limit: '',
hidden_danger__check_photo: '',
hidden_danger__more_flag: '',
hidden_danger__safe_insp_id: '',
hidden_danger__reform_man_id: '',
hidden_danger__reform_dept_id: '',
hidden_danger__org_id: '',
hidden_danger__insp_det_id: '',
hidden_danger__hidden_danger_id: '',
hidden_danger__dept_id: '',
hidden_danger__check_man_id: '',
hidden_danger__check_dept_id: ''
},
rules: {
hidden_danger__check_problem: [
{ required: true, message: '请输入隐患描述', trigger: 'blur' }
]
},
inspName: [],
disabled: false,
options: [],
checkManVisible: false,
reformManVisible: false,
checkDeptVisible: false,
reformDeptVisible: false,
hiddenState: []
}
},
created() {
this.getList()
this.getHiddenState()
},
methods: {
getList() {
this.loading = true
api.getFormDate(this.id).then(data => {
if (data.success) {
this.form = data.data.root[0]
setTimeout(() => {
this.loading = false
}, 200)
} else {
this.$message.error(data.message)
}
})
},
async getHiddenState() {
await publicApi.getTypeSel('hiddenstate').then(data => {
if (data.success) {
this.hiddenState = data.data.root
} else {
this.$message.error(data.message)
}
})
},
onSubmit() {},
getCheckMan(data) {
this.form.hidden_danger__check_man = data.sys_user__user_name
this.form.hidden_danger__check_man_id = data.sys_user__user_id
this.form.hidden_danger__check_dept = data.sys_dept__dept_name
this.form.hidden_danger__check_dept_id = data.sys_user__dept_id
this.checkManVisible = false
},
selCheckMan() {
this.getCheckMans(this.$refs.CheckMan.Users)
this.checkManVisible = false
},
getCheckMans(data) {
this.form.hidden_danger__check_man = data.map(d => { return d.sys_user__user_name }).join(';')
this.form.hidden_danger__check_man_id = data.map(d => { return d.sys_user__user_id }).join(';')
this.form.hidden_danger__check_dept = data.map(d => { return d.sys_dept__dept_name }).join(';')
this.form.hidden_danger__check_dept_id = data.map(d => { return d.sys_user__dept_id }).join(';')
this.checkManVisible = false
},
getReformMan(data) {
this.form.hidden_danger__reform_man = data.sys_user__user_name
this.form.hidden_danger__reform_man_id = data.sys_user__user_id
this.form.hidden_danger__reform_dept = data.sys_dept__dept_name
this.form.hidden_danger__reform_dept_id = data.sys_user__dept_id
this.reformManVisible = false
},
selReformMan() {
this.getReformMans(this.$refs.ReformMan.Users)
this.reformManVisible = false
},
getReformMans(data) {
this.form.hidden_danger__reform_man = data.map(d => { return d.sys_user__user_name }).join(';')
this.form.hidden_danger__reform_man_id = data.map(d => { return d.sys_user__user_id }).join(';')
this.form.hidden_danger__reform_dept = data.map(d => { return d.sys_dept__dept_name }).join(';')
this.form.hidden_danger__reform_dept_id = data.map(d => { return d.sys_user__dept_id }).join(';')
this.reformManVisible = false
},
getCheckDept(data) {
this.form.hidden_danger__check_dept = data.sys_dept__dept_name
this.form.hidden_danger__check_dept_id = data.sys_dept__dept_id
this.checkDeptVisible = false
},
selCheckDept() {
this.CheckDepts(this.$refs.CheckDept.Dpets)
},
CheckDepts(data) {
this.form.hidden_danger__check_dept = data.map(d => { return d.sys_dept__dept_name }).join(';')
this.form.hidden_danger__check_dept_id = data.map(d => { return d.sys_dept__dept_id }).join(';')
this.checkDeptVisible = false
},
getReformDept(data) {
this.form.hidden_danger__reform_dept = data.sys_dept__dept_name
this.form.hidden_danger__reform_dept_id = data.sys_dept__dept_id
this.reformDeptVisible = false
},
selReformDept() {
this.ReformDepts(this.$refs.ReformDept.Dpets)
},
ReformDepts(data) {
this.form.hidden_danger__reform_dept = data.map(d => { return d.sys_dept__dept_name }).join(';')
this.form.hidden_danger__reform_dept_id = data.map(d => { return d.sys_dept__dept_id }).join(';')
this.reformDeptVisible = false
},
save() {
this.$refs['form'].validate((valid) => {
if (valid) {
api.Save(this.form).then(data => {
if (data.success) {
this.$message.success('保存成功!')
// const param = `/insp/edit_form/audit/${data.data.keyid}`
// this.$router__push(param)
} else {
this.$message.error(data.message)
}
})
}
})
},
back() {
// this.$router__back(-1)
}
}
}
</script>
<style lang="scss" scoped>
::v-deep .el-dialog__body {
padding: 10px 20px !important;
}
::v-deep .el-form-item__label {
text-align: right;
/* vertical-align: middle; */
float: left;
font-size: 14px;
color: #606266;
line-height: 40px;
padding: 0 6px 0 0;
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
.el-col{
margin-left: 2%;
}
</style>

View File

@ -0,0 +1,257 @@
<template>
<div>
<buttons funid="hidden_check" style="margin:10px 10px" @Create="editCreate" @Del="editDelete" @editSave="editSave" @upload="upload" />
<el-card>
<el-table
ref="deptTable"
v-loading="loading"
:data="data"
style="width: 100%"
@selection-change="handleSelectionChange"
@cell-dblclick="cellDblclick"
>
<template v-for="(d,i) in tableHeader">
<el-table-column v-if="d.type && d.type === 'selection'" :key="i" :type="d.type" :fixed="d.fixed" />
<el-table-column
v-else
:key="i"
:prop="d.prop"
:label="d.label"
>
<template slot-scope="scope">
<div v-if="d.label==='隐患状态'">
{{
scope.row.hidden_danger__hidden_state == 1 ? '排查中' : scope.row.hidden_danger__hidden_state == 2 ? '待整改' :scope.row.hidden_danger__hidden_state == 3 ? '整改中' :scope.row.hidden_danger__hidden_state == 4 ? '待验收' : '已验收'
}}
</div>
<div v-else-if="d.label === '操作'">
<el-button icon="el-icon-view" type="text" title="编辑" @click="edit(scope.row)" />
<el-button v-if="scope.row.status !== 'NULLIFY'" icon="el-icon-delete" style="color:#F56C6C" type="text" title="删除" @click="Delete(scope.row)" />
</div>
<div v-else>{{ scope.row[d.prop] }}</div>
</template>
</el-table-column>
</template>
</el-table>
<el-pagination
:current-page="pager.pageNo"
:page-sizes="[10, 30, 50, 100, 500]"
:page-size="pager.pageSize"
:total="pager.total"
layout="total, sizes, prev, pager, next, jumper"
@size-change="sizeChange"
@current-change="pageChange"
/>
</el-card>
</div>
</template>
<script>
import api from './api'
import buttons from '@/components/Buttons'
export default {
name: 'SafeIdsp',
components: {
buttons
},
data() {
return {
loading: false,
data: [],
deptTree: [],
ids: [],
levels: [],
pager: {
pageNo: 0,
pageSize: 10,
total: 0
},
tableHeader: [
{
prop: 'selection',
type: 'selection',
fixed: 'left'
}, {
prop: 'hidden_danger__hidden_state',
label: '隐患状态'
}, {
prop: 'hidden_danger__hidden_code',
label: '隐患编号'
},
{
prop: 'hidden_danger__check_man',
label: '检查人'
}, {
prop: 'hidden_danger__check_dept',
label: '检查部门'
},
{
prop: 'hidden_danger__check_date',
label: '检查时间'
}, {
prop: 'hidden_danger__check_location',
label: '隐患描述'
}, {
prop: 'hidden_danger__check_content',
label: '隐患描述'
}, {
prop: 'opration',
label: '操作',
width: '70px',
fixed: 'right',
minWidth: '70px',
show: true
}],
value: '',
dept_id: '',
level: '',
id: '',
parent_id: '',
form: {
dept_name: '',
dept_code: '',
memo: ''
},
rules: {
dept_code: [
{ required: true, message: '请输入部门编码', trigger: 'blur' }
],
dept_name: [
{ required: true, message: '请输入部门名称', trigger: 'blur' }
]
},
formLabelWidth: '120px',
auditForm: {},
saveFrom: {},
treeData: [],
defaultProps: {
children: 'children',
label: 'sys_dept__dept_name'
},
treeList: [],
whereSql: false,
whereValue: ''
}
},
created() {
this.getList()
},
mounted() {
},
methods: {
getList() {
this.loading = true
let pageNo = this.pager.pageNo * this.pager.pageSize - this.pager.pageSize
if (pageNo < 0) {
pageNo = 0
}
api.getDate(
this.pager.pageSize,
pageNo,
this.whereSql,
this.whereValue
).then(data => {
if (data.success) {
this.data = data.data.root
this.pager.total = data.data.total
setTimeout(() => {
this.loading = false
}, 200)
} else {
this.$message.error(data.message)
}
})
},
editCreate() {
const param = `/hidden_danger/hidden_check/create`
this.$router.push(param)
},
Delete(row) {
this.ids = []
this.ids.push(row.hidden_danger__hidden_danger_id)
this.editDelete()
},
editDelete() {
if (this.ids && this.ids.length > 0) {
this.$confirm('确认删除?').then(() => {
api.Delete(this.ids).then(data => {
if (data.success) {
this.getList()
this.$message.success('删除成功!')
} else {
this.$message.error(data.message)
}
})
}).catch(() => {})
} else {
this.$message.warning('请选择数据进行删除')
}
},
editSave() {
console.log('editSave')
},
upload() {
console.log('upload')
},
edit(row) {
const param = `/hidden_danger/hidden_check/audit/${row.hidden_danger__hidden_danger_id}`
this.$router.push(param)
},
auditFormChange(form) {
this.saveFrom = form
},
save() {
if (Object.keys(this.saveFrom).length === 0) {
this.saveFrom = this.auditForm
}
this.$refs.auditForm.$refs.auditForm.validate(valid => {
if (valid) {
const _form = `funid=sys_dept&parentId=&levelCol=sys_dept.dept_level&keyid=${this.id}&pagetype=editgrid&eventcode=save_eg&sys_dept__dept_code=${this.saveFrom.sys_dept__dept_code}&sys_dept__dept_name=${this.saveFrom.sys_dept__dept_name}&sys_dept__memo=${this.saveFrom.sys_dept__memo}&sys_dept__is_novalid=${this.saveFrom.sys_dept__is_novalid}&sys_dept__dept_id=${this.id}&sys_dept__dept_level=${this.saveFrom.sys_dept__dept_level}&user_id=administrator&dataType=json`
api.auditSave(_form).then(data => {
if (data.success) {
this.whereSql = false
this.whereValue = ''
this.getList()
this.$message.success('保存成功!')
} else {
this.$message.error(data.message)
}
})
}
})
},
cellDblclick(row) {
const param = `/hidden_danger/hidden_check/audit/${row.hidden_danger__hidden_danger_id}`
this.$router.push(param)
},
sizeChange(size) {
this.pager.pageSize = size
this.getList()
},
pageChange(page) {
this.pager.pageNo = page
this.getList()
},
handleSelectionChange(val) {
this.ids = val.map(d => d.hidden_danger__hidden_danger_id)
},
closeDialog() {
this.$refs['form'].resetFields()
this.form.dept_name = ''
this.form.dept_code = ''
},
handleNodeClick(data) {
console.log(data)
this.whereValue = encodeURI(`${data.sys_dept__dept_id}\%`)
this.whereSql = true
this.getList()
}
}
}
</script>
<style lang="scss" scoped>
.el-card {
margin-top: 10px;
}
</style>

View File

@ -0,0 +1,63 @@
import request from '@/utils/request'
export default {
getDate(pageSize, pageNo, isWhereSql, whereValue) {
let whereSql = ''
let whereType = ''
if (isWhereSql) {
whereSql = `dept_id like ?`
whereType = 'string'
}
return request({
url: `commonAction.do?eventcode=query_data&funid=queryevent&pagetype=grid&query_funid=hidden_reform&user_id=administrator`,
method: 'post',
data: `start=${pageNo}&limit=${pageSize}&where_sql=${whereSql}&where_value=${whereValue}&where_type=${whereType}&is_query=1&query_type=0`
}).then(response => response.data)
},
getDeptTree() {
return request({
url: `/commonAction.do?eventcode=query_data&funid=queryevent&pagetype=editgrid&query_funid=sys_dept&user_id=administrator`,
method: 'post',
data: `start=0&limit=10000&where_sql=&where_value=&where_type=&is_query=1&query_type=0`
}).then(response => response.data)
},
Crerte(data) {
return request({
url: `/commonAction.do`,
method: 'post',
data: `funid=hidden_reform&keyid=${data.hidden_danger__hidden_danger_id}&hidden_danger__hidden_code=${data.hidden_danger__hidden_code}&hidden_danger__hidden_state=${data.hidden_danger__hidden_state}&hidden_danger__check_man=${data.hidden_danger__check_man}&hidden_danger__check_dept=${data.hidden_danger__check_dept}&hidden_danger__check_date=${data.hidden_danger__check_date}&hidden_danger__check_location=${data.hidden_danger__check_location}&hidden_danger__check_content=${data.hidden_danger__check_content}&hidden_danger__check_problem=${data.hidden_danger__check_problem}&hidden_danger__org_id=${data.hidden_danger__org_id}&hidden_danger__insp_det_id=${data.hidden_danger__insp_det_id}&hidden_danger__dept_id=${data.hidden_danger__dept_id}&hidden_danger__hidden_danger_id=${data.hidden_danger__hidden_danger_id}&hidden_danger__reform_man=${data.hidden_danger__reform_man}&hidden_danger__reform_dept=${data.hidden_danger__reform_dept}&hidden_danger__reform_limit=${data.hidden_danger__reform_limit}&hidden_danger__check_photo=${data.hidden_danger__check_photo}&hidden_danger__more_flag=${data.hidden_danger__more_flag}&hidden_danger__check_man_id=${data.hidden_danger__check_man_id}&hidden_danger__check_dept_id=${data.hidden_danger__check_dept_id}&hidden_danger__reform_dept_id=${data.hidden_danger__reform_dept_id}&hidden_danger__reform_man_id=${data.hidden_danger__reform_man_id}&hidden_danger__safe_insp_id=${data.hidden_danger__safe_insp_id}&pagetype=form&eventcode=create&fkValue=&user_id=administrator&dataType=json`
}).then(response => response.data)
},
Save(data) {
return request({
url: `/commonAction.do`,
method: 'post',
data: `funid=hidden_reform&keyid=${data.hidden_danger__hidden_danger_id}&hidden_danger__hidden_danger_id=${data.hidden_danger__hidden_danger_id}&hidden_danger__reform_date=${data.hidden_danger__reform_date}&hidden_danger__reform_money=${data.hidden_danger__reform_money}&hidden_danger__reform_desc=${data.hidden_danger__reform_desc}&pagetype=form&eventcode=save&dirtyfields=hidden_danger.reform_date;hidden_danger.reform_money;hidden_danger.reform_desc&fkValue=&user_id=administrator&dataType=json`
}).then(response => response.data)
},
auditSave(data) {
return request({
url: `/commonAction.do`,
method: 'post',
data: `${data}`
}).then(response => response.data)
},
Delete(ids) {
let keys = ''
ids.forEach(d => {
keys += 'keyid=' + d + '&'
})
return request({
url: `/commonAction.do`,
method: 'post',
data: `funid=hidden_reform&${keys}pagetype=editgrid&eventcode=delete&user_id=administrator&dataType=json`
}).then(response => response.data)
},
getFormDate(id) {
return request({
url: `/commonAction.do?eventcode=query_data&funid=queryevent&pagetype=grid&query_funid=hidden_reform&user_id=administrator`,
method: 'post',
data: `start=0&limit=10&where_sql=hidden_danger.hidden_danger_id = ?&where_value=${id}&where_type=string&is_query=1&query_type=0`
}).then(response => response.data)
}
}

View File

@ -0,0 +1,344 @@
<template>
<div>
<el-card>
<buttons funid="hidden_check" style="margin-bottom:20px" @save="save" />
<el-form ref="form" :model="form" label-width="80px" :rules="rules">
<el-row>
<el-col :span="7">
<el-form-item label="隐患编号">
<el-input v-model="form.hidden_danger__hidden_code" />
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="巡检状态">
<el-select v-model="form.hidden_danger__hidden_state" placeholder="请选择" :disabled="!disabled">
<el-option
v-for="item in hiddenState"
:key="item.funall_control__value_data"
:label="item.funall_control__display_data"
:value="item.funall_control__value_data"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="检查人">
<el-input v-model="form.hidden_danger__check_man" placeholder="请选择检查人" class="input-with-select" clearable>
<el-button slot="append" icon="el-icon-search" @click="checkManVisible = !checkManVisible" />
</el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="7">
<el-form-item label="检查部门">
<el-input v-model="form.hidden_danger__check_dept" placeholder="请选择检查部门" class="input-with-select" clearable>
<el-button slot="append" icon="el-icon-search" @click="checkDeptVisible = !checkDeptVisible" />
</el-input>
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="检查时间">
<el-date-picker
v-model="form.hidden_danger__check_date"
type="date"
placeholder="选择日期"
style="width: 100%;"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
/>
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="检查地点">
<el-input v-model="form.hidden_danger__check_location" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="7">
<el-form-item label="检查内容">
<el-input v-model="form.hidden_danger__check_content" type="textarea" />
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="隐患描述" prop="hidden_danger__check_problem">
<el-input v-model="form.hidden_danger__check_problem" type="textarea" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="7">
<el-form-item label="整改人">
<el-input v-model="form.hidden_danger__reform_man" placeholder="请选择整改人" class="input-with-select" clearable>
<el-button slot="append" icon="el-icon-search" @click="reformManVisible = !reformManVisible" />
</el-input>
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="整改部门">
<el-input v-model="form.hidden_danger__reform_dept" placeholder="请选择检查部门" class="input-with-select" clearable>
<el-button slot="append" icon="el-icon-search" @click="reformDeptVisible = !reformDeptVisible" />
</el-input>
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="整改期限">
<el-date-picker
v-model="form.hidden_danger__reform_limit"
type="date"
placeholder="选择日期"
style="width: 100%;"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
/>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<el-dialog
v-if="checkManVisible"
title="选择人员"
:visible.sync="checkManVisible"
width="60%"
>
<SelUser ref="CheckMan" @updateUser="getCheckMan" />
<span>
<el-button @click="checkManVisible = false"> </el-button>
<el-button type="primary" @click="selCheckMan"> </el-button>
</span>
</el-dialog>
<el-dialog
v-if="reformManVisible"
title="选择人员"
:visible.sync="reformManVisible"
width="60%"
>
<SelUser ref="ReformMan" @updateUser="getReformMan" />
<span>
<el-button @click="reformManVisible = false"> </el-button>
<el-button type="primary" @click="selReformMan"> </el-button>
</span>
</el-dialog>
<el-dialog
v-if="checkDeptVisible"
class="selDept"
title="选择部门"
:visible.sync="checkDeptVisible"
width="60%"
:modal="false"
>
<SelDept ref="CheckDept" @updateDept="getCheckDept" />
<span>
<el-button @click="checkDeptVisible = false"> </el-button>
<el-button type="primary" @click="selCheckDept"> </el-button>
</span>
</el-dialog>
<el-dialog
v-if="reformDeptVisible"
class="selDept"
title="选择部门"
:visible.sync="reformDeptVisible"
width="60%"
:modal="false"
>
<SelDept ref="ReformDept" @updateDept="getReformDept" />
<span>
<el-button @click="reformDeptVisible = false"> </el-button>
<el-button type="primary" @click="selReformDept"> </el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import api from '../../api'
import publicApi from '@/api/public'
import buttons from '@/components/formBtn'
import SelUser from '@/components/selUser'
import SelDept from '@/components/selDept'
export default {
name: 'AuditForm',
components: {
buttons,
SelUser,
SelDept
},
// props: {
// id: { type: String, default: () => '' }
// },
data() {
return {
loading: false,
form: {
hidden_danger__hidden_code: '',
hidden_danger__hidden_state: '1',
hidden_danger__check_man: '',
hidden_danger__check_dept: '',
hidden_danger__check_date: '',
hidden_danger__check_location: '',
hidden_danger__check_content: '',
hidden_danger__check_problem: '',
hidden_danger__reform_man: '',
hidden_danger__reform_dept: '',
hidden_danger__reform_limit: '',
hidden_danger__check_photo: '',
hidden_danger__more_flag: '',
hidden_danger__safe_insp_id: '',
hidden_danger__reform_man_id: '',
hidden_danger__reform_dept_id: '',
hidden_danger__org_id: '',
hidden_danger__insp_det_id: '',
hidden_danger__hidden_danger_id: '',
hidden_danger__dept_id: '',
hidden_danger__check_man_id: '',
hidden_danger__check_dept_id: ''
},
rules: {
hidden_danger__check_problem: [
{ required: true, message: '请输入隐患描述', trigger: 'blur' }
]
},
inspName: [],
disabled: false,
options: [],
checkManVisible: false,
reformManVisible: false,
checkDeptVisible: false,
reformDeptVisible: false,
inspNameVisible: false,
id: '',
hiddenState: []
}
},
created() {
this.getHiddenState()
},
methods: {
getList() {
this.loading = true
api.getFormDate().then(data => {
if (data.success) {
this.form = data.data.root[0]
setTimeout(() => {
this.loading = false
}, 200)
} else {
this.$message.error(data.message)
}
})
},
async getHiddenState() {
await publicApi.getTypeSel('hiddenstate').then(data => {
if (data.success) {
this.hiddenState = data.data.root
} else {
this.$message.error(data.message)
}
})
},
onSubmit() {},
getCheckMan(data) {
this.form.hidden_danger__check_man = data.sys_user__user_name
this.form.hidden_danger__check_man_id = data.sys_user__user_id
this.form.hidden_danger__check_dept = data.sys_dept__dept_name
this.form.hidden_danger__check_dept_id = data.sys_user__dept_id
this.checkManVisible = false
},
selCheckMan() {
this.getCheckMans(this.$refs.CheckMan.Users)
this.checkManVisible = false
},
getCheckMans(data) {
this.form.hidden_danger__check_man = data.map(d => { return d.sys_user__user_name }).join(';')
this.form.hidden_danger__check_man_id = data.map(d => { return d.sys_user__user_id }).join(';')
this.form.hidden_danger__check_dept = data.map(d => { return d.sys_dept__dept_name }).join(';')
this.form.hidden_danger__check_dept_id = data.map(d => { return d.sys_user__dept_id }).join(';')
this.checkManVisible = false
},
getReformMan(data) {
this.form.hidden_danger__reform_man = data.sys_user__user_name
this.form.hidden_danger__reform_man_id = data.sys_user__user_id
this.form.hidden_danger__reform_dept = data.sys_dept__dept_name
this.form.hidden_danger__reform_dept_id = data.sys_user__dept_id
this.reformManVisible = false
},
selReformMan() {
this.getReformMans(this.$refs.ReformMan.Users)
this.reformManVisible = false
},
getReformMans(data) {
this.form.hidden_danger__reform_man = data.map(d => { return d.sys_user__user_name }).join(';')
this.form.hidden_danger__reform_man_id = data.map(d => { return d.sys_user__user_id }).join(';')
this.form.hidden_danger__reform_dept = data.map(d => { return d.sys_dept__dept_name }).join(';')
this.form.hidden_danger__reform_dept_id = data.map(d => { return d.sys_user__dept_id }).join(';')
this.reformManVisible = false
},
getCheckDept(data) {
this.form.hidden_danger__check_dept = data.sys_dept__dept_name
this.form.hidden_danger__check_dept_id = data.sys_dept__dept_id
this.checkDeptVisible = false
},
selCheckDept() {
this.CheckDepts(this.$refs.CheckDept.Dpets)
},
CheckDepts(data) {
this.form.hidden_danger__check_dept = data.map(d => { return d.sys_dept__dept_name }).join(';')
this.form.hidden_danger__check_dept_id = data.map(d => { return d.sys_dept__dept_id }).join(';')
this.checkDeptVisible = false
},
getReformDept(data) {
this.form.hidden_danger__reform_dept = data.sys_dept__dept_name
this.form.hidden_danger__reform_dept_id = data.sys_dept__dept_id
this.reformDeptVisible = false
},
selReformDept() {
this.ReformDepts(this.$refs.ReformDept.Dpets)
},
ReformDepts(data) {
this.form.hidden_danger__reform_dept = data.map(d => { return d.sys_dept__dept_name }).join(';')
this.form.hidden_danger__reform_dept_id = data.map(d => { return d.sys_dept__dept_id }).join(';')
this.reformDeptVisible = false
},
save() {
this.$refs['form'].validate((valid) => {
if (valid) {
api.Crerte(this.form).then(data => {
if (data.success) {
this.$message.success('保存成功!')
const param = `/hidden_danger/hidden_check/audit/${data.data.keyid}`
this.$router.push(param)
} else {
this.$message.error(data.message)
}
})
}
})
},
back() {
// this.$router__back(-1)
}
}
}
</script>
<style lang="scss" scoped>
::v-deep .el-dialog__body {
padding: 10px 20px !important;
}
::v-deep .el-form-item__label {
text-align: right;
/* vertical-align: middle; */
float: left;
font-size: 14px;
color: #606266;
line-height: 40px;
padding: 0 6px 0 0;
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
.el-col{
margin-left: 2%;
}
</style>

View File

@ -0,0 +1,374 @@
<template>
<div>
<el-card>
<buttons funid="hidden_check" style="margin-bottom:20px" @save="save" />
<el-form ref="form" :model="form" label-width="80px" :rules="rules">
<el-row>
<el-col :span="7">
<el-form-item label="隐患编号">
<el-input v-model="form.hidden_danger__hidden_code" :disabled="!disabled" />
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="巡检状态">
<el-select v-model="form.hidden_danger__hidden_state" placeholder="请选择" :disabled="!disabled">
<el-option
v-for="item in hiddenState"
:key="item.funall_control__value_data"
:label="item.funall_control__display_data"
:value="item.funall_control__value_data"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="检查人">
<el-input v-model="form.hidden_danger__check_man" placeholder="请选择检查人" class="input-with-select" clearable :disabled="!disabled">
<el-button slot="append" icon="el-icon-search" @click="checkManVisible = !checkManVisible" />
</el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="7">
<el-form-item label="检查部门">
<el-input v-model="form.hidden_danger__check_dept" placeholder="请选择检查部门" class="input-with-select" clearable :disabled="!disabled">
<el-button slot="append" icon="el-icon-search" @click="checkDeptVisible = !checkDeptVisible" />
</el-input>
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="检查时间">
<el-date-picker
v-model="form.hidden_danger__check_date"
type="date"
placeholder="选择日期"
style="width: 100%;"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
:disabled="!disabled"
/>
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="检查地点">
<el-input v-model="form.hidden_danger__check_location" :disabled="!disabled" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="7">
<el-form-item label="检查内容">
<el-input v-model="form.hidden_danger__check_content" type="textarea" :disabled="!disabled" />
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="隐患描述" prop="hidden_danger__check_problem">
<el-input v-model="form.hidden_danger__check_problem" type="textarea" :disabled="!disabled" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="7">
<el-form-item label="整改人">
<el-input v-model="form.hidden_danger__reform_man" placeholder="请选择整改人" class="input-with-select" clearable :disabled="!disabled">
<el-button slot="append" icon="el-icon-search" @click="reformManVisible = !reformManVisible" />
</el-input>
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="整改部门">
<el-input v-model="form.hidden_danger__reform_dept" placeholder="请选择检查部门" class="input-with-select" clearable :disabled="!disabled">
<el-button slot="append" icon="el-icon-search" @click="reformDeptVisible = !reformDeptVisible" />
</el-input>
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="整改期限">
<el-date-picker
v-model="form.hidden_danger__reform_limit"
type="date"
placeholder="选择日期"
style="width: 100%;"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
:disabled="!disabled"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="7">
<el-form-item label="整改时间" prop="hidden_danger__reform_date">
<el-date-picker
v-model="form.hidden_danger__reform_date"
type="date"
placeholder="选择日期"
style="width: 100%;"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
/>
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="投入费用">
<el-input v-model="form.hidden_danger__reform_money" placeholder="请输入安全投入费用" class="input-with-select" clearable />
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="整改情况">
<el-input v-model="form.hidden_danger__reform_desc" placeholder="请输入整改情况" class="input-with-select" type="textarea" clearable />
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<el-dialog
v-if="checkManVisible"
title="选择人员"
:visible.sync="checkManVisible"
width="60%"
>
<SelUser ref="CheckMan" @updateUser="getCheckMan" />
<span>
<el-button @click="checkManVisible = false"> </el-button>
<el-button type="primary" @click="selCheckMan"> </el-button>
</span>
</el-dialog>
<el-dialog
v-if="reformManVisible"
title="选择人员"
:visible.sync="reformManVisible"
width="60%"
>
<SelUser ref="ReformMan" @updateUser="getReformMan" />
<span>
<el-button @click="reformManVisible = false"> </el-button>
<el-button type="primary" @click="selReformMan"> </el-button>
</span>
</el-dialog>
<el-dialog
v-if="checkDeptVisible"
class="selDept"
title="选择部门"
:visible.sync="checkDeptVisible"
width="60%"
:modal="false"
>
<SelDept ref="CheckDept" @updateDept="getCheckDept" />
<span>
<el-button @click="checkDeptVisible = false"> </el-button>
<el-button type="primary" @click="selCheckDept"> </el-button>
</span>
</el-dialog>
<el-dialog
v-if="reformDeptVisible"
class="selDept"
title="选择部门"
:visible.sync="reformDeptVisible"
width="60%"
:modal="false"
>
<SelDept ref="ReformDept" @updateDept="getReformDept" />
<span>
<el-button @click="reformDeptVisible = false"> </el-button>
<el-button type="primary" @click="selReformDept"> </el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import api from '../../api'
import publicApi from '@/api/public'
import buttons from '@/components/formBtn'
import SelUser from '@/components/selUser'
import SelDept from '@/components/selDept'
export default {
name: 'AuditForm',
components: {
buttons,
SelUser,
SelDept
},
// props: {
// id: { type: String, default: () => '' }
// },
data() {
return {
loading: false,
id: this.$route.params.id,
form: {
hidden_danger__hidden_code: '',
hidden_danger__hidden_state: '',
hidden_danger__check_man: '',
hidden_danger__check_dept: '',
hidden_danger__check_date: '',
hidden_danger__check_location: '',
hidden_danger__check_content: '',
hidden_danger__check_problem: '',
hidden_danger__reform_man: '',
hidden_danger__reform_dept: '',
hidden_danger__reform_limit: '',
hidden_danger__check_photo: '',
hidden_danger__more_flag: '',
hidden_danger__reform_date: '',
hidden_danger__reform_money: '',
hidden_danger__reform_desc: '',
hidden_danger__reform_photo: '',
hidden_danger__safe_insp_id: '',
hidden_danger__reform_man_id: '',
hidden_danger__org_id: '',
hidden_danger__reform_dept_id: '',
hidden_danger__insp_det_id: '',
hidden_danger__hidden_danger_id: '',
hidden_danger__dept_id: '',
hidden_danger__check_man_id: '',
hidden_danger__check_dept_id: ''
},
rules: {
hidden_danger__reform_date: [
{ required: true, message: '请选择整改时间', trigger: 'blur' }
]
},
inspName: [],
disabled: false,
options: [],
checkManVisible: false,
reformManVisible: false,
checkDeptVisible: false,
reformDeptVisible: false,
hiddenState: []
}
},
created() {
this.getList()
this.getHiddenState()
},
methods: {
getList() {
this.loading = true
api.getFormDate(this.id).then(data => {
if (data.success) {
this.form = data.data.root[0]
setTimeout(() => {
this.loading = false
}, 200)
} else {
this.$message.error(data.message)
}
})
},
async getHiddenState() {
await publicApi.getTypeSel('hiddenstate').then(data => {
if (data.success) {
this.hiddenState = data.data.root
} else {
this.$message.error(data.message)
}
})
},
onSubmit() {},
getCheckMan(data) {
this.form.hidden_danger__check_man = data.sys_user__user_name
this.form.hidden_danger__check_man_id = data.sys_user__user_id
this.form.hidden_danger__check_dept = data.sys_dept__dept_name
this.form.hidden_danger__check_dept_id = data.sys_user__dept_id
this.checkManVisible = false
},
selCheckMan() {
this.getCheckMans(this.$refs.CheckMan.Users)
this.checkManVisible = false
},
getCheckMans(data) {
this.form.hidden_danger__check_man = data.map(d => { return d.sys_user__user_name }).join(';')
this.form.hidden_danger__check_man_id = data.map(d => { return d.sys_user__user_id }).join(';')
this.form.hidden_danger__check_dept = data.map(d => { return d.sys_dept__dept_name }).join(';')
this.form.hidden_danger__check_dept_id = data.map(d => { return d.sys_user__dept_id }).join(';')
this.checkManVisible = false
},
getReformMan(data) {
this.form.hidden_danger__reform_man = data.sys_user__user_name
this.form.hidden_danger__reform_man_id = data.sys_user__user_id
this.form.hidden_danger__reform_dept = data.sys_dept__dept_name
this.form.hidden_danger__reform_dept_id = data.sys_user__dept_id
this.reformManVisible = false
},
selReformMan() {
this.getReformMans(this.$refs.ReformMan.Users)
this.reformManVisible = false
},
getReformMans(data) {
this.form.hidden_danger__reform_man = data.map(d => { return d.sys_user__user_name }).join(';')
this.form.hidden_danger__reform_man_id = data.map(d => { return d.sys_user__user_id }).join(';')
this.form.hidden_danger__reform_dept = data.map(d => { return d.sys_dept__dept_name }).join(';')
this.form.hidden_danger__reform_dept_id = data.map(d => { return d.sys_user__dept_id }).join(';')
this.reformManVisible = false
},
getCheckDept(data) {
this.form.hidden_danger__check_dept = data.sys_dept__dept_name
this.form.hidden_danger__check_dept_id = data.sys_dept__dept_id
this.checkDeptVisible = false
},
selCheckDept() {
this.CheckDepts(this.$refs.CheckDept.Dpets)
},
CheckDepts(data) {
this.form.hidden_danger__check_dept = data.map(d => { return d.sys_dept__dept_name }).join(';')
this.form.hidden_danger__check_dept_id = data.map(d => { return d.sys_dept__dept_id }).join(';')
this.checkDeptVisible = false
},
getReformDept(data) {
this.form.hidden_danger__reform_dept = data.sys_dept__dept_name
this.form.hidden_danger__reform_dept_id = data.sys_dept__dept_id
this.reformDeptVisible = false
},
selReformDept() {
this.ReformDepts(this.$refs.ReformDept.Dpets)
},
ReformDepts(data) {
this.form.hidden_danger__reform_dept = data.map(d => { return d.sys_dept__dept_name }).join(';')
this.form.hidden_danger__reform_dept_id = data.map(d => { return d.sys_dept__dept_id }).join(';')
this.reformDeptVisible = false
},
save() {
this.$refs['form'].validate((valid) => {
if (valid) {
api.Save(this.form).then(data => {
if (data.success) {
this.$message.success('保存成功!')
// const param = `/insp/edit_form/audit/${data.data.keyid}`
// this.$router__push(param)
} else {
this.$message.error(data.message)
}
})
}
})
},
back() {
// this.$router__back(-1)
}
}
}
</script>
<style lang="scss" scoped>
::v-deep .el-dialog__body {
padding: 10px 20px !important;
}
::v-deep .el-form-item__label {
text-align: right;
/* vertical-align: middle; */
float: left;
font-size: 14px;
color: #606266;
line-height: 40px;
padding: 0 6px 0 0;
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
.el-col{
margin-left: 2%;
}
</style>

View File

@ -0,0 +1,266 @@
<template>
<div>
<buttons funid="hidden_reform" style="margin:10px 10px" @Create="editCreate" @Del="editDelete" @editSave="editSave" @upload="upload" />
<el-card>
<el-table
ref="deptTable"
v-loading="loading"
:data="data"
style="width: 100%"
@selection-change="handleSelectionChange"
@cell-dblclick="cellDblclick"
>
<template v-for="(d,i) in tableHeader">
<el-table-column v-if="d.type && d.type === 'selection'" :key="i" :type="d.type" :fixed="d.fixed" />
<el-table-column
v-else
:key="i"
:prop="d.prop"
:label="d.label"
>
<template slot-scope="scope">
<div v-if="d.label==='隐患状态'">
{{
scope.row.hidden_danger__hidden_state == 1 ? '排查中' : scope.row.hidden_danger__hidden_state == 2 ? '待整改' :scope.row.hidden_danger__hidden_state == 3 ? '整改中' :scope.row.hidden_danger__hidden_state == 4 ? '待验收' : '已验收'
}}
</div>
<div v-else-if="d.label === '操作'">
<el-button icon="el-icon-view" type="text" title="编辑" @click="edit(scope.row)" />
<el-button v-if="scope.row.status !== 'NULLIFY'" icon="el-icon-delete" style="color:#F56C6C" type="text" title="删除" @click="Delete(scope.row)" />
</div>
<div v-else>{{ scope.row[d.prop] }}</div>
</template>
</el-table-column>
</template>
</el-table>
<el-pagination
:current-page="pager.pageNo"
:page-sizes="[10, 30, 50, 100, 500]"
:page-size="pager.pageSize"
:total="pager.total"
layout="total, sizes, prev, pager, next, jumper"
@size-change="sizeChange"
@current-change="pageChange"
/>
</el-card>
</div>
</template>
<script>
import api from './api'
import buttons from '@/components/Buttons'
export default {
name: 'SafeIdsp',
components: {
buttons
},
data() {
return {
loading: false,
data: [],
deptTree: [],
ids: [],
levels: [],
pager: {
pageNo: 0,
pageSize: 10,
total: 0
},
tableHeader: [
{
prop: 'selection',
type: 'selection',
fixed: 'left'
}, {
prop: 'hidden_danger__hidden_code',
label: '隐患编号'
}, {
prop: 'hidden_danger__hidden_state',
label: '隐患状态'
}, {
prop: 'hidden_danger__check_man',
label: '检查人'
}, {
prop: 'hidden_danger__check_dept',
label: '检查部门'
},
{
prop: 'hidden_danger__check_date',
label: '检查时间'
}, {
prop: 'hidden_danger__check_location',
label: '隐患描述'
}, {
prop: 'hidden_danger__check_content',
label: '隐患描述'
}, {
prop: 'hidden_danger__reform_dept',
label: '整改人'
}, {
prop: 'hidden_danger__reform_man',
label: '整改部门'
}, {
prop: 'hidden_danger__reform_limit',
label: '整改期限'
}, {
prop: 'opration',
label: '操作',
width: '70px',
fixed: 'right',
minWidth: '70px',
show: true
}],
value: '',
dept_id: '',
level: '',
id: '',
parent_id: '',
form: {
dept_name: '',
dept_code: '',
memo: ''
},
rules: {
dept_code: [
{ required: true, message: '请输入部门编码', trigger: 'blur' }
],
dept_name: [
{ required: true, message: '请输入部门名称', trigger: 'blur' }
]
},
formLabelWidth: '120px',
auditForm: {},
saveFrom: {},
treeData: [],
defaultProps: {
children: 'children',
label: 'sys_dept__dept_name'
},
treeList: [],
whereSql: false,
whereValue: ''
}
},
created() {
this.getList()
},
mounted() {
},
methods: {
getList() {
this.loading = true
let pageNo = this.pager.pageNo * this.pager.pageSize - this.pager.pageSize
if (pageNo < 0) {
pageNo = 0
}
api.getDate(
this.pager.pageSize,
pageNo,
this.whereSql,
this.whereValue
).then(data => {
if (data.success) {
this.data = data.data.root
this.pager.total = data.data.total
setTimeout(() => {
this.loading = false
}, 200)
} else {
this.$message.error(data.message)
}
})
},
editCreate() {
const param = `/hidden_danger/hidden_reform/create`
this.$router.push(param)
},
Delete(row) {
this.ids = []
this.ids.push(row.hidden_danger__hidden_danger_id)
this.editDelete()
},
editDelete() {
if (this.ids && this.ids.length > 0) {
this.$confirm('确认删除?').then(() => {
api.Delete(this.ids).then(data => {
if (data.success) {
this.getList()
this.$message.success('删除成功!')
} else {
this.$message.error(data.message)
}
})
}).catch(() => {})
} else {
this.$message.warning('请选择数据进行删除')
}
},
editSave() {
console.log('editSave')
},
upload() {
console.log('upload')
},
edit(row) {
const param = `/hidden_danger/hidden_reform/audit/${row.hidden_danger__hidden_danger_id}`
this.$router.push(param)
},
auditFormChange(form) {
this.saveFrom = form
},
save() {
if (Object.keys(this.saveFrom).length === 0) {
this.saveFrom = this.auditForm
}
this.$refs.auditForm.$refs.auditForm.validate(valid => {
if (valid) {
const _form = `funid=sys_dept&parentId=&levelCol=sys_dept.dept_level&keyid=${this.id}&pagetype=editgrid&eventcode=save_eg&sys_dept__dept_code=${this.saveFrom.sys_dept__dept_code}&sys_dept__dept_name=${this.saveFrom.sys_dept__dept_name}&sys_dept__memo=${this.saveFrom.sys_dept__memo}&sys_dept__is_novalid=${this.saveFrom.sys_dept__is_novalid}&sys_dept__dept_id=${this.id}&sys_dept__dept_level=${this.saveFrom.sys_dept__dept_level}&user_id=administrator&dataType=json`
api.auditSave(_form).then(data => {
if (data.success) {
this.whereSql = false
this.whereValue = ''
this.getList()
this.$message.success('保存成功!')
} else {
this.$message.error(data.message)
}
})
}
})
},
cellDblclick(row) {
const param = `/hidden_danger/hidden_reform/audit/${row.hidden_danger__hidden_danger_id}`
this.$router.push(param)
},
sizeChange(size) {
this.pager.pageSize = size
this.getList()
},
pageChange(page) {
this.pager.pageNo = page
this.getList()
},
handleSelectionChange(val) {
this.ids = val.map(d => d.hidden_danger__hidden_danger_id)
},
closeDialog() {
this.$refs['form'].resetFields()
this.form.dept_name = ''
this.form.dept_code = ''
},
handleNodeClick(data) {
console.log(data)
this.whereValue = encodeURI(`${data.sys_dept__dept_id}\%`)
this.whereSql = true
this.getList()
}
}
}
</script>
<style lang="scss" scoped>
.el-card {
margin-top: 10px;
}
</style>

View File

@ -0,0 +1,63 @@
import request from '@/utils/request'
export default {
getDate(pageSize, pageNo, isWhereSql, whereValue) {
let whereSql = ''
let whereType = ''
if (isWhereSql) {
whereSql = `dept_id like ?`
whereType = 'string'
}
return request({
url: `commonAction.do?eventcode=query_data&funid=queryevent&pagetype=grid&query_funid=hidden_review&user_id=administrator`,
method: 'post',
data: `start=${pageNo}&limit=${pageSize}&where_sql=${whereSql}&where_value=${whereValue}&where_type=${whereType}&is_query=1&query_type=0`
}).then(response => response.data)
},
getDeptTree() {
return request({
url: `/commonAction.do?eventcode=query_data&funid=queryevent&pagetype=editgrid&query_funid=sys_dept&user_id=administrator`,
method: 'post',
data: `start=0&limit=10000&where_sql=&where_value=&where_type=&is_query=1&query_type=0`
}).then(response => response.data)
},
Crerte(data) {
return request({
url: `/commonAction.do`,
method: 'post',
data: `funid=hidden_review&keyid=${data.hidden_danger__hidden_danger_id}&hidden_danger__hidden_code=${data.hidden_danger__hidden_code}&hidden_danger__hidden_state=${data.hidden_danger__hidden_state}&hidden_danger__check_man=${data.hidden_danger__check_man}&hidden_danger__check_dept=${data.hidden_danger__check_dept}&hidden_danger__check_date=${data.hidden_danger__check_date}&hidden_danger__check_location=${data.hidden_danger__check_location}&hidden_danger__check_content=${data.hidden_danger__check_content}&hidden_danger__check_problem=${data.hidden_danger__check_problem}&hidden_danger__org_id=${data.hidden_danger__org_id}&hidden_danger__insp_det_id=${data.hidden_danger__insp_det_id}&hidden_danger__dept_id=${data.hidden_danger__dept_id}&hidden_danger__hidden_danger_id=${data.hidden_danger__hidden_danger_id}&hidden_danger__reform_man=${data.hidden_danger__reform_man}&hidden_danger__reform_dept=${data.hidden_danger__reform_dept}&hidden_danger__reform_limit=${data.hidden_danger__reform_limit}&hidden_danger__check_photo=${data.hidden_danger__check_photo}&hidden_danger__more_flag=${data.hidden_danger__more_flag}&hidden_danger__check_man_id=${data.hidden_danger__check_man_id}&hidden_danger__check_dept_id=${data.hidden_danger__check_dept_id}&hidden_danger__reform_dept_id=${data.hidden_danger__reform_dept_id}&hidden_danger__reform_man_id=${data.hidden_danger__reform_man_id}&hidden_danger__safe_insp_id=${data.hidden_danger__safe_insp_id}&pagetype=form&eventcode=create&fkValue=&user_id=administrator&dataType=json`
}).then(response => response.data)
},
Save(data) {
return request({
url: `/commonAction.do`,
method: 'post',
data: `funid=hidden_review&keyid=${data.hidden_danger__hidden_danger_id}&hidden_danger__hidden_danger_id=${data.hidden_danger__hidden_danger_id}&hidden_danger__review_date=${data.hidden_danger__review_date}&hidden_danger__review_man=${data.hidden_danger__review_man}&hidden_danger__review_man_id=${data.hidden_danger__review_man_id}&hidden_danger__review_desc=${data.hidden_danger__review_desc}&pagetype=form&eventcode=save&dirtyfields=hidden_danger.review_date;hidden_danger.review_man;hidden_danger.review_man_id;hidden_danger.review_desc&fkValue=&user_id=administrator&dataType=json`
}).then(response => response.data)
},
auditSave(data) {
return request({
url: `/commonAction.do`,
method: 'post',
data: `${data}`
}).then(response => response.data)
},
Delete(ids) {
let keys = ''
ids.forEach(d => {
keys += 'keyid=' + d + '&'
})
return request({
url: `/commonAction.do`,
method: 'post',
data: `funid=hidden_review&${keys}pagetype=editgrid&eventcode=delete&user_id=administrator&dataType=json`
}).then(response => response.data)
},
getFormDate(id) {
return request({
url: `/commonAction.do?eventcode=query_data&funid=queryevent&pagetype=grid&query_funid=hidden_review&user_id=administrator`,
method: 'post',
data: `start=0&limit=10&where_sql=hidden_danger.hidden_danger_id = ?&where_value=${id}&where_type=string&is_query=1&query_type=0`
}).then(response => response.data)
}
}

View File

@ -0,0 +1,344 @@
<template>
<div>
<el-card>
<buttons funid="hidden_check" style="margin-bottom:20px" @save="save" />
<el-form ref="form" :model="form" label-width="80px" :rules="rules">
<el-row>
<el-col :span="7">
<el-form-item label="隐患编号">
<el-input v-model="form.hidden_danger__hidden_code" />
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="巡检状态">
<el-select v-model="form.hidden_danger__hidden_state" placeholder="请选择" :disabled="!disabled">
<el-option
v-for="item in hiddenState"
:key="item.funall_control__value_data"
:label="item.funall_control__display_data"
:value="item.funall_control__value_data"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="检查人">
<el-input v-model="form.hidden_danger__check_man" placeholder="请选择检查人" class="input-with-select" clearable>
<el-button slot="append" icon="el-icon-search" @click="checkManVisible = !checkManVisible" />
</el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="7">
<el-form-item label="检查部门">
<el-input v-model="form.hidden_danger__check_dept" placeholder="请选择检查部门" class="input-with-select" clearable>
<el-button slot="append" icon="el-icon-search" @click="checkDeptVisible = !checkDeptVisible" />
</el-input>
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="检查时间">
<el-date-picker
v-model="form.hidden_danger__check_date"
type="date"
placeholder="选择日期"
style="width: 100%;"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
/>
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="检查地点">
<el-input v-model="form.hidden_danger__check_location" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="7">
<el-form-item label="检查内容">
<el-input v-model="form.hidden_danger__check_content" type="textarea" />
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="隐患描述" prop="hidden_danger__check_problem">
<el-input v-model="form.hidden_danger__check_problem" type="textarea" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="7">
<el-form-item label="整改人">
<el-input v-model="form.hidden_danger__reform_man" placeholder="请选择整改人" class="input-with-select" clearable>
<el-button slot="append" icon="el-icon-search" @click="reformManVisible = !reformManVisible" />
</el-input>
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="整改部门">
<el-input v-model="form.hidden_danger__reform_dept" placeholder="请选择检查部门" class="input-with-select" clearable>
<el-button slot="append" icon="el-icon-search" @click="reformDeptVisible = !reformDeptVisible" />
</el-input>
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="整改期限">
<el-date-picker
v-model="form.hidden_danger__reform_limit"
type="date"
placeholder="选择日期"
style="width: 100%;"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
/>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<el-dialog
v-if="checkManVisible"
title="选择人员"
:visible.sync="checkManVisible"
width="60%"
>
<SelUser ref="CheckMan" @updateUser="getCheckMan" />
<span>
<el-button @click="checkManVisible = false"> </el-button>
<el-button type="primary" @click="selCheckMan"> </el-button>
</span>
</el-dialog>
<el-dialog
v-if="reformManVisible"
title="选择人员"
:visible.sync="reformManVisible"
width="60%"
>
<SelUser ref="ReformMan" @updateUser="getReformMan" />
<span>
<el-button @click="reformManVisible = false"> </el-button>
<el-button type="primary" @click="selReformMan"> </el-button>
</span>
</el-dialog>
<el-dialog
v-if="checkDeptVisible"
class="selDept"
title="选择部门"
:visible.sync="checkDeptVisible"
width="60%"
:modal="false"
>
<SelDept ref="CheckDept" @updateDept="getCheckDept" />
<span>
<el-button @click="checkDeptVisible = false"> </el-button>
<el-button type="primary" @click="selCheckDept"> </el-button>
</span>
</el-dialog>
<el-dialog
v-if="reformDeptVisible"
class="selDept"
title="选择部门"
:visible.sync="reformDeptVisible"
width="60%"
:modal="false"
>
<SelDept ref="ReformDept" @updateDept="getReformDept" />
<span>
<el-button @click="reformDeptVisible = false"> </el-button>
<el-button type="primary" @click="selReformDept"> </el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import api from '../../api'
import publicApi from '@/api/public'
import buttons from '@/components/formBtn'
import SelUser from '@/components/selUser'
import SelDept from '@/components/selDept'
export default {
name: 'AuditForm',
components: {
buttons,
SelUser,
SelDept
},
// props: {
// id: { type: String, default: () => '' }
// },
data() {
return {
loading: false,
form: {
hidden_danger__hidden_code: '',
hidden_danger__hidden_state: '1',
hidden_danger__check_man: '',
hidden_danger__check_dept: '',
hidden_danger__check_date: '',
hidden_danger__check_location: '',
hidden_danger__check_content: '',
hidden_danger__check_problem: '',
hidden_danger__reform_man: '',
hidden_danger__reform_dept: '',
hidden_danger__reform_limit: '',
hidden_danger__check_photo: '',
hidden_danger__more_flag: '',
hidden_danger__safe_insp_id: '',
hidden_danger__reform_man_id: '',
hidden_danger__reform_dept_id: '',
hidden_danger__org_id: '',
hidden_danger__insp_det_id: '',
hidden_danger__hidden_danger_id: '',
hidden_danger__dept_id: '',
hidden_danger__check_man_id: '',
hidden_danger__check_dept_id: ''
},
rules: {
hidden_danger__check_problem: [
{ required: true, message: '请输入隐患描述', trigger: 'blur' }
]
},
inspName: [],
disabled: false,
options: [],
checkManVisible: false,
reformManVisible: false,
checkDeptVisible: false,
reformDeptVisible: false,
inspNameVisible: false,
id: '',
hiddenState: []
}
},
created() {
this.getHiddenState()
},
methods: {
getList() {
this.loading = true
api.getFormDate().then(data => {
if (data.success) {
this.form = data.data.root[0]
setTimeout(() => {
this.loading = false
}, 200)
} else {
this.$message.error(data.message)
}
})
},
async getHiddenState() {
await publicApi.getTypeSel('hiddenstate').then(data => {
if (data.success) {
this.hiddenState = data.data.root
} else {
this.$message.error(data.message)
}
})
},
onSubmit() {},
getCheckMan(data) {
this.form.hidden_danger__check_man = data.sys_user__user_name
this.form.hidden_danger__check_man_id = data.sys_user__user_id
this.form.hidden_danger__check_dept = data.sys_dept__dept_name
this.form.hidden_danger__check_dept_id = data.sys_user__dept_id
this.checkManVisible = false
},
selCheckMan() {
this.getCheckMans(this.$refs.CheckMan.Users)
this.checkManVisible = false
},
getCheckMans(data) {
this.form.hidden_danger__check_man = data.map(d => { return d.sys_user__user_name }).join(';')
this.form.hidden_danger__check_man_id = data.map(d => { return d.sys_user__user_id }).join(';')
this.form.hidden_danger__check_dept = data.map(d => { return d.sys_dept__dept_name }).join(';')
this.form.hidden_danger__check_dept_id = data.map(d => { return d.sys_user__dept_id }).join(';')
this.checkManVisible = false
},
getReformMan(data) {
this.form.hidden_danger__reform_man = data.sys_user__user_name
this.form.hidden_danger__reform_man_id = data.sys_user__user_id
this.form.hidden_danger__reform_dept = data.sys_dept__dept_name
this.form.hidden_danger__reform_dept_id = data.sys_user__dept_id
this.reformManVisible = false
},
selReformMan() {
this.getReformMans(this.$refs.ReformMan.Users)
this.reformManVisible = false
},
getReformMans(data) {
this.form.hidden_danger__reform_man = data.map(d => { return d.sys_user__user_name }).join(';')
this.form.hidden_danger__reform_man_id = data.map(d => { return d.sys_user__user_id }).join(';')
this.form.hidden_danger__reform_dept = data.map(d => { return d.sys_dept__dept_name }).join(';')
this.form.hidden_danger__reform_dept_id = data.map(d => { return d.sys_user__dept_id }).join(';')
this.reformManVisible = false
},
getCheckDept(data) {
this.form.hidden_danger__check_dept = data.sys_dept__dept_name
this.form.hidden_danger__check_dept_id = data.sys_dept__dept_id
this.checkDeptVisible = false
},
selCheckDept() {
this.CheckDepts(this.$refs.CheckDept.Dpets)
},
CheckDepts(data) {
this.form.hidden_danger__check_dept = data.map(d => { return d.sys_dept__dept_name }).join(';')
this.form.hidden_danger__check_dept_id = data.map(d => { return d.sys_dept__dept_id }).join(';')
this.checkDeptVisible = false
},
getReformDept(data) {
this.form.hidden_danger__reform_dept = data.sys_dept__dept_name
this.form.hidden_danger__reform_dept_id = data.sys_dept__dept_id
this.reformDeptVisible = false
},
selReformDept() {
this.ReformDepts(this.$refs.ReformDept.Dpets)
},
ReformDepts(data) {
this.form.hidden_danger__reform_dept = data.map(d => { return d.sys_dept__dept_name }).join(';')
this.form.hidden_danger__reform_dept_id = data.map(d => { return d.sys_dept__dept_id }).join(';')
this.reformDeptVisible = false
},
save() {
this.$refs['form'].validate((valid) => {
if (valid) {
api.Crerte(this.form).then(data => {
if (data.success) {
this.$message.success('保存成功!')
const param = `/hidden_danger/hidden_check/audit/${data.data.keyid}`
this.$router.push(param)
} else {
this.$message.error(data.message)
}
})
}
})
},
back() {
// this.$router__back(-1)
}
}
}
</script>
<style lang="scss" scoped>
::v-deep .el-dialog__body {
padding: 10px 20px !important;
}
::v-deep .el-form-item__label {
text-align: right;
/* vertical-align: middle; */
float: left;
font-size: 14px;
color: #606266;
line-height: 40px;
padding: 0 6px 0 0;
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
.el-col{
margin-left: 2%;
}
</style>

View File

@ -0,0 +1,428 @@
<template>
<div>
<el-card>
<buttons funid="hidden_check" style="margin-bottom:20px" @save="save" />
<el-form ref="form" :model="form" label-width="80px" :rules="rules">
<el-row>
<el-col :span="7">
<el-form-item label="隐患编号">
<el-input v-model="form.hidden_danger__hidden_code" :disabled="!disabled" />
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="巡检状态">
<el-select v-model="form.hidden_danger__hidden_state" placeholder="请选择" :disabled="!disabled">
<el-option
v-for="item in hiddenState"
:key="item.funall_control__value_data"
:label="item.funall_control__display_data"
:value="item.funall_control__value_data"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="检查人">
<el-input v-model="form.hidden_danger__check_man" placeholder="请选择检查人" class="input-with-select" clearable :disabled="!disabled">
<el-button slot="append" icon="el-icon-search" @click="checkManVisible = !checkManVisible" />
</el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="7">
<el-form-item label="检查部门">
<el-input v-model="form.hidden_danger__check_dept" placeholder="请选择检查部门" class="input-with-select" clearable :disabled="!disabled">
<el-button slot="append" icon="el-icon-search" @click="checkDeptVisible = !checkDeptVisible" />
</el-input>
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="检查时间">
<el-date-picker
v-model="form.hidden_danger__check_date"
type="date"
placeholder="选择日期"
style="width: 100%;"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
:disabled="!disabled"
/>
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="检查地点">
<el-input v-model="form.hidden_danger__check_location" :disabled="!disabled" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="7">
<el-form-item label="检查内容">
<el-input v-model="form.hidden_danger__check_content" type="textarea" :disabled="!disabled" />
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="隐患描述" prop="hidden_danger__check_problem">
<el-input v-model="form.hidden_danger__check_problem" type="textarea" :disabled="!disabled" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="7">
<el-form-item label="整改人">
<el-input v-model="form.hidden_danger__reform_man" placeholder="请选择整改人" class="input-with-select" clearable :disabled="!disabled">
<el-button slot="append" icon="el-icon-search" @click="reformManVisible = !reformManVisible" />
</el-input>
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="整改部门">
<el-input v-model="form.hidden_danger__reform_dept" placeholder="请选择检查部门" class="input-with-select" clearable :disabled="!disabled">
<el-button slot="append" icon="el-icon-search" @click="reformDeptVisible = !reformDeptVisible" />
</el-input>
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="整改期限">
<el-date-picker
v-model="form.hidden_danger__reform_limit"
type="date"
placeholder="选择日期"
style="width: 100%;"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
:disabled="!disabled"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="7">
<el-form-item label="整改时间" prop="hidden_danger__reform_date">
<el-date-picker
v-model="form.hidden_danger__reform_date"
type="date"
placeholder="选择日期"
style="width: 100%;"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
:disabled="!disabled"
/>
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="投入费用">
<el-input v-model="form.hidden_danger__reform_money" placeholder="请输入安全投入费用" class="input-with-select" clearable :disabled="!disabled" />
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="整改情况">
<el-input v-model="form.hidden_danger__reform_desc" placeholder="请输入整改情况" class="input-with-select" type="textarea" clearable :disabled="!disabled" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="7">
<el-form-item label="验收时间" prop="hidden_danger__review_date">
<el-date-picker
v-model="form.hidden_danger__review_date"
type="date"
placeholder="选择日期"
style="width: 100%;"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
/>
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="验收人">
<el-input v-model="form.hidden_danger__review_man" placeholder="请选择验收人" class="input-with-select" clearable>
<el-button slot="append" icon="el-icon-search" @click="reviewManVisible = !reviewManVisible" />
</el-input>
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="验收情况">
<el-input v-model="form.hidden_danger__review_desc" placeholder="请输入整改情况" class="input-with-select" type="textarea" clearable />
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<el-dialog
v-if="checkManVisible"
title="选择人员"
:visible.sync="checkManVisible"
width="60%"
>
<SelUser ref="CheckMan" @updateUser="getCheckMan" />
<span>
<el-button @click="checkManVisible = false"> </el-button>
<el-button type="primary" @click="selCheckMan"> </el-button>
</span>
</el-dialog>
<el-dialog
v-if="reformManVisible"
title="选择人员"
:visible.sync="reformManVisible"
width="60%"
>
<SelUser ref="ReformMan" @updateUser="getReformMan" />
<span>
<el-button @click="reformManVisible = false"> </el-button>
<el-button type="primary" @click="selReformMan"> </el-button>
</span>
</el-dialog>
<el-dialog
v-if="reviewManVisible"
title="选择人员"
:visible.sync="reviewManVisible"
width="60%"
>
<SelUser ref="eviewMan" @updateUser="getReviewMan" />
<span>
<el-button @click="reviewManVisible = false"> </el-button>
<el-button type="primary" @click="selReviewMan"> </el-button>
</span>
</el-dialog>
<el-dialog
v-if="checkDeptVisible"
class="selDept"
title="选择部门"
:visible.sync="checkDeptVisible"
width="60%"
:modal="false"
>
<SelDept ref="CheckDept" @updateDept="getCheckDept" />
<span>
<el-button @click="checkDeptVisible = false"> </el-button>
<el-button type="primary" @click="selCheckDept"> </el-button>
</span>
</el-dialog>
<el-dialog
v-if="reformDeptVisible"
class="selDept"
title="选择部门"
:visible.sync="reformDeptVisible"
width="60%"
:modal="false"
>
<SelDept ref="ReformDept" @updateDept="getReformDept" />
<span>
<el-button @click="reformDeptVisible = false"> </el-button>
<el-button type="primary" @click="selReformDept"> </el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import api from '../../api'
import publicApi from '@/api/public'
import buttons from '@/components/formBtn'
import SelUser from '@/components/selUser'
import SelDept from '@/components/selDept'
export default {
name: 'AuditForm',
components: {
buttons,
SelUser,
SelDept
},
// props: {
// id: { type: String, default: () => '' }
// },
data() {
return {
loading: false,
id: this.$route.params.id,
form: {
hidden_danger__hidden_code: '',
hidden_danger__hidden_state: '',
hidden_danger__check_man: '',
hidden_danger__check_dept: '',
hidden_danger__check_date: '',
hidden_danger__check_location: '',
hidden_danger__check_content: '',
hidden_danger__check_problem: '',
hidden_danger__reform_man: '',
hidden_danger__reform_dept: '',
hidden_danger__reform_limit: '',
hidden_danger__check_photo: '',
hidden_danger__more_flag: '',
hidden_danger__reform_date: '',
hidden_danger__reform_money: '',
hidden_danger__reform_desc: '',
hidden_danger__reform_photo: '',
hidden_danger__safe_insp_id: '',
hidden_danger__reform_man_id: '',
hidden_danger__org_id: '',
hidden_danger__reform_dept_id: '',
hidden_danger__insp_det_id: '',
hidden_danger__hidden_danger_id: '',
hidden_danger__dept_id: '',
hidden_danger__check_man_id: '',
hidden_danger__check_dept_id: ''
},
rules: {
hidden_danger__reform_date: [
{ required: true, message: '请选择整改时间', trigger: 'blur' }
]
},
inspName: [],
disabled: false,
options: [],
checkManVisible: false,
reformManVisible: false,
checkDeptVisible: false,
reformDeptVisible: false,
reviewManVisible: false,
hiddenState: []
}
},
created() {
this.getList()
this.getHiddenState()
},
methods: {
getList() {
this.loading = true
api.getFormDate(this.id).then(data => {
if (data.success) {
this.form = data.data.root[0]
setTimeout(() => {
this.loading = false
}, 200)
} else {
this.$message.error(data.message)
}
})
},
async getHiddenState() {
await publicApi.getTypeSel('hiddenstate').then(data => {
if (data.success) {
this.hiddenState = data.data.root
} else {
this.$message.error(data.message)
}
})
},
onSubmit() {},
getCheckMan(data) {
this.form.hidden_danger__check_man = data.sys_user__user_name
this.form.hidden_danger__check_man_id = data.sys_user__user_id
this.form.hidden_danger__check_dept = data.sys_dept__dept_name
this.form.hidden_danger__check_dept_id = data.sys_user__dept_id
this.checkManVisible = false
},
selCheckMan() {
this.getCheckMans(this.$refs.CheckMan.Users)
this.checkManVisible = false
},
getCheckMans(data) {
this.form.hidden_danger__check_man = data.map(d => { return d.sys_user__user_name }).join(';')
this.form.hidden_danger__check_man_id = data.map(d => { return d.sys_user__user_id }).join(';')
this.form.hidden_danger__check_dept = data.map(d => { return d.sys_dept__dept_name }).join(';')
this.form.hidden_danger__check_dept_id = data.map(d => { return d.sys_user__dept_id }).join(';')
this.checkManVisible = false
},
getReformMan(data) {
this.form.hidden_danger__reform_man = data.sys_user__user_name
this.form.hidden_danger__reform_man_id = data.sys_user__user_id
this.form.hidden_danger__reform_dept = data.sys_dept__dept_name
this.form.hidden_danger__reform_dept_id = data.sys_user__dept_id
this.reformManVisible = false
},
selReformMan() {
this.getReformMans(this.$refs.ReformMan.Users)
this.reformManVisible = false
},
getReformMans(data) {
this.form.hidden_danger__reform_man = data.map(d => { return d.sys_user__user_name }).join(';')
this.form.hidden_danger__reform_man_id = data.map(d => { return d.sys_user__user_id }).join(';')
this.form.hidden_danger__reform_dept = data.map(d => { return d.sys_dept__dept_name }).join(';')
this.form.hidden_danger__reform_dept_id = data.map(d => { return d.sys_user__dept_id }).join(';')
this.reformManVisible = false
},
getReviewMan(data) {
this.form.hidden_danger__review_man = data.sys_user__user_name
this.form.hidden_danger__review_man_id = data.sys_user__user_id
this.reviewManVisible = false
},
selReviewMan() {
this.getReformMans(this.$refs.ReviewMan.Users)
this.reviewManVisible = false
},
getReviewMans(data) {
this.form.hidden_danger__review_man = data.map(d => { return d.sys_user__user_name }).join(';')
this.form.hidden_danger__review_man_id = data.map(d => { return d.sys_user__user_id }).join(';')
this.reviewManVisible = false
},
getCheckDept(data) {
this.form.hidden_danger__check_dept = data.sys_dept__dept_name
this.form.hidden_danger__check_dept_id = data.sys_dept__dept_id
this.checkDeptVisible = false
},
selCheckDept() {
this.CheckDepts(this.$refs.CheckDept.Dpets)
},
CheckDepts(data) {
this.form.hidden_danger__check_dept = data.map(d => { return d.sys_dept__dept_name }).join(';')
this.form.hidden_danger__check_dept_id = data.map(d => { return d.sys_dept__dept_id }).join(';')
this.checkDeptVisible = false
},
getReformDept(data) {
this.form.hidden_danger__reform_dept = data.sys_dept__dept_name
this.form.hidden_danger__reform_dept_id = data.sys_dept__dept_id
this.reformDeptVisible = false
},
selReformDept() {
this.ReformDepts(this.$refs.ReformDept.Dpets)
},
ReformDepts(data) {
this.form.hidden_danger__reform_dept = data.map(d => { return d.sys_dept__dept_name }).join(';')
this.form.hidden_danger__reform_dept_id = data.map(d => { return d.sys_dept__dept_id }).join(';')
this.reformDeptVisible = false
},
save() {
this.$refs['form'].validate((valid) => {
if (valid) {
api.Save(this.form).then(data => {
if (data.success) {
this.$message.success('保存成功!')
// const param = `/insp/edit_form/audit/${data.data.keyid}`
// this.$router__push(param)
} else {
this.$message.error(data.message)
}
})
}
})
},
back() {
// this.$router__back(-1)
}
}
}
</script>
<style lang="scss" scoped>
::v-deep .el-dialog__body {
padding: 10px 20px !important;
}
::v-deep .el-form-item__label {
text-align: right;
/* vertical-align: middle; */
float: left;
font-size: 14px;
color: #606266;
line-height: 40px;
padding: 0 6px 0 0;
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
.el-col{
margin-left: 2%;
}
</style>

View File

@ -0,0 +1,266 @@
<template>
<div>
<buttons funid="hidden_review" style="margin:10px 10px" @Create="editCreate" @Del="editDelete" @editSave="editSave" @upload="upload" />
<el-card>
<el-table
ref="deptTable"
v-loading="loading"
:data="data"
style="width: 100%"
@selection-change="handleSelectionChange"
@cell-dblclick="cellDblclick"
>
<template v-for="(d,i) in tableHeader">
<el-table-column v-if="d.type && d.type === 'selection'" :key="i" :type="d.type" :fixed="d.fixed" />
<el-table-column
v-else
:key="i"
:prop="d.prop"
:label="d.label"
>
<template slot-scope="scope">
<div v-if="d.label==='隐患状态'">
{{
scope.row.hidden_danger__hidden_state == 1 ? '排查中' : scope.row.hidden_danger__hidden_state == 2 ? '待整改' :scope.row.hidden_danger__hidden_state == 3 ? '整改中' :scope.row.hidden_danger__hidden_state == 4 ? '待验收' : '已验收'
}}
</div>
<div v-else-if="d.label === '操作'">
<el-button icon="el-icon-view" type="text" title="编辑" @click="edit(scope.row)" />
<el-button v-if="scope.row.status !== 'NULLIFY'" icon="el-icon-delete" style="color:#F56C6C" type="text" title="删除" @click="Delete(scope.row)" />
</div>
<div v-else>{{ scope.row[d.prop] }}</div>
</template>
</el-table-column>
</template>
</el-table>
<el-pagination
:current-page="pager.pageNo"
:page-sizes="[10, 30, 50, 100, 500]"
:page-size="pager.pageSize"
:total="pager.total"
layout="total, sizes, prev, pager, next, jumper"
@size-change="sizeChange"
@current-change="pageChange"
/>
</el-card>
</div>
</template>
<script>
import api from './api'
import buttons from '@/components/Buttons'
export default {
name: 'SafeIdsp',
components: {
buttons
},
data() {
return {
loading: false,
data: [],
deptTree: [],
ids: [],
levels: [],
pager: {
pageNo: 0,
pageSize: 10,
total: 0
},
tableHeader: [
{
prop: 'selection',
type: 'selection',
fixed: 'left'
}, {
prop: 'hidden_danger__hidden_code',
label: '隐患编号'
}, {
prop: 'hidden_danger__hidden_state',
label: '隐患状态'
}, {
prop: 'hidden_danger__check_man',
label: '检查人'
}, {
prop: 'hidden_danger__check_dept',
label: '检查部门'
},
{
prop: 'hidden_danger__check_date',
label: '检查时间'
}, {
prop: 'hidden_danger__check_location',
label: '隐患描述'
}, {
prop: 'hidden_danger__check_content',
label: '隐患描述'
}, {
prop: 'hidden_danger__reform_dept',
label: '整改人'
}, {
prop: 'hidden_danger__reform_man',
label: '整改部门'
}, {
prop: 'hidden_danger__reform_limit',
label: '整改期限'
}, {
prop: 'opration',
label: '操作',
width: '70px',
fixed: 'right',
minWidth: '70px',
show: true
}],
value: '',
dept_id: '',
level: '',
id: '',
parent_id: '',
form: {
dept_name: '',
dept_code: '',
memo: ''
},
rules: {
dept_code: [
{ required: true, message: '请输入部门编码', trigger: 'blur' }
],
dept_name: [
{ required: true, message: '请输入部门名称', trigger: 'blur' }
]
},
formLabelWidth: '120px',
auditForm: {},
saveFrom: {},
treeData: [],
defaultProps: {
children: 'children',
label: 'sys_dept__dept_name'
},
treeList: [],
whereSql: false,
whereValue: ''
}
},
created() {
this.getList()
},
mounted() {
},
methods: {
getList() {
this.loading = true
let pageNo = this.pager.pageNo * this.pager.pageSize - this.pager.pageSize
if (pageNo < 0) {
pageNo = 0
}
api.getDate(
this.pager.pageSize,
pageNo,
this.whereSql,
this.whereValue
).then(data => {
if (data.success) {
this.data = data.data.root
this.pager.total = data.data.total
setTimeout(() => {
this.loading = false
}, 200)
} else {
this.$message.error(data.message)
}
})
},
editCreate() {
const param = `/hidden_danger/hidden_review/create`
this.$router.push(param)
},
Delete(row) {
this.ids = []
this.ids.push(row.hidden_danger__hidden_danger_id)
this.editDelete()
},
editDelete() {
if (this.ids && this.ids.length > 0) {
this.$confirm('确认删除?').then(() => {
api.Delete(this.ids).then(data => {
if (data.success) {
this.getList()
this.$message.success('删除成功!')
} else {
this.$message.error(data.message)
}
})
}).catch(() => {})
} else {
this.$message.warning('请选择数据进行删除')
}
},
editSave() {
console.log('editSave')
},
upload() {
console.log('upload')
},
edit(row) {
const param = `/hidden_danger/hidden_review/audit/${row.hidden_danger__hidden_danger_id}`
this.$router.push(param)
},
auditFormChange(form) {
this.saveFrom = form
},
save() {
if (Object.keys(this.saveFrom).length === 0) {
this.saveFrom = this.auditForm
}
this.$refs.auditForm.$refs.auditForm.validate(valid => {
if (valid) {
const _form = `funid=sys_dept&parentId=&levelCol=sys_dept.dept_level&keyid=${this.id}&pagetype=editgrid&eventcode=save_eg&sys_dept__dept_code=${this.saveFrom.sys_dept__dept_code}&sys_dept__dept_name=${this.saveFrom.sys_dept__dept_name}&sys_dept__memo=${this.saveFrom.sys_dept__memo}&sys_dept__is_novalid=${this.saveFrom.sys_dept__is_novalid}&sys_dept__dept_id=${this.id}&sys_dept__dept_level=${this.saveFrom.sys_dept__dept_level}&user_id=administrator&dataType=json`
api.auditSave(_form).then(data => {
if (data.success) {
this.whereSql = false
this.whereValue = ''
this.getList()
this.$message.success('保存成功!')
} else {
this.$message.error(data.message)
}
})
}
})
},
cellDblclick(row) {
const param = `/hidden_danger/hidden_review/audit/${row.hidden_danger__hidden_danger_id}`
this.$router.push(param)
},
sizeChange(size) {
this.pager.pageSize = size
this.getList()
},
pageChange(page) {
this.pager.pageNo = page
this.getList()
},
handleSelectionChange(val) {
this.ids = val.map(d => d.hidden_danger__hidden_danger_id)
},
closeDialog() {
this.$refs['form'].resetFields()
this.form.dept_name = ''
this.form.dept_code = ''
},
handleNodeClick(data) {
console.log(data)
this.whereValue = encodeURI(`${data.sys_dept__dept_id}\%`)
this.whereSql = true
this.getList()
}
}
}
</script>
<style lang="scss" scoped>
.el-card {
margin-top: 10px;
}
</style>

View File

@ -1,3 +0,0 @@
const elementIcons = ['platform-eleme', 'eleme', 'delete-solid', 'delete', 's-tools', 'setting', 'user-solid', 'user', 'phone', 'phone-outline', 'more', 'more-outline', 'star-on', 'star-off', 's-goods', 'goods', 'warning', 'warning-outline', 'question', 'info', 'remove', 'circle-plus', 'success', 'error', 'zoom-in', 'zoom-out', 'remove-outline', 'circle-plus-outline', 'circle-check', 'circle-close', 's-help', 'help', 'minus', 'plus', 'check', 'close', 'picture', 'picture-outline', 'picture-outline-round', 'upload', 'upload2', 'download', 'camera-solid', 'camera', 'video-camera-solid', 'video-camera', 'message-solid', 'bell', 's-cooperation', 's-order', 's-platform', 's-fold', 's-unfold', 's-operation', 's-promotion', 's-home', 's-release', 's-ticket', 's-management', 's-open', 's-shop', 's-marketing', 's-flag', 's-comment', 's-finance', 's-claim', 's-custom', 's-opportunity', 's-data', 's-check', 's-grid', 'menu', 'share', 'd-caret', 'caret-left', 'caret-right', 'caret-bottom', 'caret-top', 'bottom-left', 'bottom-right', 'back', 'right', 'bottom', 'top', 'top-left', 'top-right', 'arrow-left', 'arrow-right', 'arrow-down', 'arrow-up', 'd-arrow-left', 'd-arrow-right', 'video-pause', 'video-play', 'refresh', 'refresh-right', 'refresh-left', 'finished', 'sort', 'sort-up', 'sort-down', 'rank', 'loading', 'view', 'c-scale-to-original', 'date', 'edit', 'edit-outline', 'folder', 'folder-opened', 'folder-add', 'folder-remove', 'folder-delete', 'folder-checked', 'tickets', 'document-remove', 'document-delete', 'document-copy', 'document-checked', 'document', 'document-add', 'printer', 'paperclip', 'takeaway-box', 'search', 'monitor', 'attract', 'mobile', 'scissors', 'umbrella', 'headset', 'brush', 'mouse', 'coordinate', 'magic-stick', 'reading', 'data-line', 'data-board', 'pie-chart', 'data-analysis', 'collection-tag', 'film', 'suitcase', 'suitcase-1', 'receiving', 'collection', 'files', 'notebook-1', 'notebook-2', 'toilet-paper', 'office-building', 'school', 'table-lamp', 'house', 'no-smoking', 'smoking', 'shopping-cart-full', 'shopping-cart-1', 'shopping-cart-2', 'shopping-bag-1', 'shopping-bag-2', 'sold-out', 'sell', 'present', 'box', 'bank-card', 'money', 'coin', 'wallet', 'discount', 'price-tag', 'news', 'guide', 'male', 'female', 'thumb', 'cpu', 'link', 'connection', 'open', 'turn-off', 'set-up', 'chat-round', 'chat-line-round', 'chat-square', 'chat-dot-round', 'chat-dot-square', 'chat-line-square', 'message', 'postcard', 'position', 'turn-off-microphone', 'microphone', 'close-notification', 'bangzhu', 'time', 'odometer', 'crop', 'aim', 'switch-button', 'full-screen', 'copy-document', 'mic', 'stopwatch', 'medal-1', 'medal', 'trophy', 'trophy-1', 'first-aid-kit', 'discover', 'place', 'location', 'location-outline', 'location-information', 'add-location', 'delete-location', 'map-location', 'alarm-clock', 'timer', 'watch-1', 'watch', 'lock', 'unlock', 'key', 'service', 'mobile-phone', 'bicycle', 'truck', 'ship', 'basketball', 'football', 'soccer', 'baseball', 'wind-power', 'light-rain', 'lightning', 'heavy-rain', 'sunrise', 'sunrise-1', 'sunset', 'sunny', 'cloudy', 'partly-cloudy', 'cloudy-and-sunny', 'moon', 'moon-night', 'dish', 'dish-1', 'food', 'chicken', 'fork-spoon', 'knife-fork', 'burger', 'tableware', 'sugar', 'dessert', 'ice-cream', 'hot-water', 'water-cup', 'coffee-cup', 'cold-drink', 'goblet', 'goblet-full', 'goblet-square', 'goblet-square-full', 'refrigerator', 'grape', 'watermelon', 'cherry', 'apple', 'pear', 'orange', 'coffee', 'ice-tea', 'ice-drink', 'milk-tea', 'potato-strips', 'lollipop', 'ice-cream-square', 'ice-cream-round']
export default elementIcons

View File

@ -1,101 +0,0 @@
<template>
<div class="icons-container">
<aside>
<a href="https://panjiachen.github.io/vue-element-admin-site/guide/advanced/icon.html" target="_blank">Add and use
</a>
</aside>
<el-tabs type="border-card">
<el-tab-pane label="Icons">
<div class="grid">
<div v-for="item of svgIcons" :key="item" @click="handleClipboard(generateIconCode(item),$event)">
<el-tooltip placement="top">
<div slot="content">
{{ generateIconCode(item) }}
</div>
<div class="icon-item">
<svg-icon :icon-class="item" class-name="disabled" />
<span>{{ item }}</span>
</div>
</el-tooltip>
</div>
</div>
</el-tab-pane>
<el-tab-pane label="Element-UI Icons">
<div class="grid">
<div v-for="item of elementIcons" :key="item" @click="handleClipboard(generateElementIconCode(item),$event)">
<el-tooltip placement="top">
<div slot="content">
{{ generateElementIconCode(item) }}
</div>
<div class="icon-item">
<i :class="'el-icon-' + item" />
<span>{{ item }}</span>
</div>
</el-tooltip>
</div>
</div>
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
import clipboard from '@/utils/clipboard'
import svgIcons from './svg-icons'
import elementIcons from './element-icons'
export default {
name: 'Icons',
data() {
return {
svgIcons,
elementIcons
}
},
methods: {
generateIconCode(symbol) {
return `<svg-icon icon-class="${symbol}" />`
},
generateElementIconCode(symbol) {
return `<i class="el-icon-${symbol}" />`
},
handleClipboard(text, event) {
clipboard(text, event)
}
}
}
</script>
<style lang="scss" scoped>
.icons-container {
margin: 10px 20px 0;
overflow: hidden;
.grid {
position: relative;
display: grid;
grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
}
.icon-item {
margin: 20px;
height: 85px;
text-align: center;
width: 100px;
float: left;
font-size: 30px;
color: #24292e;
cursor: pointer;
}
span {
display: block;
font-size: 16px;
margin-top: 10px;
}
.disabled {
pointer-events: none;
}
}
</style>

View File

@ -1,10 +0,0 @@
const req = require.context('../../icons/svg', false, /\.svg$/)
const requireAll = requireContext => requireContext.keys()
const re = /\.\/(.*)\.svg/
const svgIcons = requireAll(req).map(i => {
return i.match(re)[1]
})
export default svgIcons

View File

@ -1,7 +0,0 @@
<template>
<div style="padding:30px;">
<el-alert :closable="false" title="menu 1">
<router-view />
</el-alert>
</div>
</template>

View File

@ -1,7 +0,0 @@
<template>
<div style="padding:30px;">
<el-alert :closable="false" title="menu 1-1" type="success">
<router-view />
</el-alert>
</div>
</template>

View File

@ -1,7 +0,0 @@
<template>
<div style="padding:30px;">
<el-alert :closable="false" title="menu 1-2" type="success">
<router-view />
</el-alert>
</div>
</template>

View File

@ -1,5 +0,0 @@
<template functional>
<div style="padding:30px;">
<el-alert :closable="false" title="menu 1-2-1" type="warning" />
</div>
</template>

View File

@ -1,5 +0,0 @@
<template functional>
<div style="padding:30px;">
<el-alert :closable="false" title="menu 1-2-2" type="warning" />
</div>
</template>

View File

@ -1,5 +0,0 @@
<template functional>
<div style="padding:30px;">
<el-alert :closable="false" title="menu 1-3" type="success" />
</div>
</template>

View File

@ -1,5 +0,0 @@
<template>
<div style="padding:30px;">
<el-alert :closable="false" title="menu 2" />
</div>
</template>

View File

@ -1,58 +0,0 @@
const title = 'Plans for the Next Iteration of Vue.js'
const content = `<p>Last week at<a href="https://vuejs.london/summary" rel="nofollow">Vue.js London</a>I gave a brief sneak peek of whats coming in the next major version of Vue. This post provides an in-depth overview of the plan.</p>
<p><img class=" wscnph" src="https://wpimg.wallstcn.com/b8a1d7be-0b73-41b8-be8c-7c01c93cab66.png" data-wscntype="image" data-wscnh="742" data-wscnw="692" /></p>
<h3>Why a new majorversion?</h3>
<p>Vue 2.0 was released<a href="https://medium.com/the-vue-point/vue-2-0-is-here-ef1f26acf4b8" rel="nofollow">exactly two years ago</a>(how time flies!). During this period, the core has remained backwards compatible with five minor releases. Weve accumulated a number of ideas that would bring improvements, but they were held off because they would result in breaking changes. At the same time, the JavaScript ecosystem and the language itself has been evolving rapidly. There are greatly improved tools that could enhance our workflow, and many new language features that could unlock simpler, more complete, and more efficient solutions to the problems Vue is trying to solve. Whats more exciting is that we are seeing ES2015 support becoming a baseline for all major evergreen browsers. Vue 3.0 aims to leverage these new language features to make Vue core smaller, faster, and more powerful.</p>
<p>Vue 3.0 is currently in prototyping phase, and we have already implemented a runtime close to feature-parity with 2.x.<strong>Many of the items listed below are either already implemented, or confirmed to be feasible. Ones that are not yet implemented or still in exploration phase are marked with a *.</strong></p>
<h3>The Details</h3>
<h4>High-Level APIChanges</h4>
<blockquote>TL;DR: Everything except render function API and scoped-slots syntax will either remain the same or can be made 2.x compatible via a compatibility build.</blockquote>
<p>Since its a new major, there is going to be some breaking changes. However, we take backwards compatibility seriously, so we want to start communicating these changes as soon as possible. Heres the currently planned public API changes:</p>
<ul><li>Template syntax will remain 99% the same. There may be small tweaks in scoped slots syntax, but other than that we have no plans to change anything else for templates.</li><li>3.0 will support class-based components natively, with the aim to provide an API that is pleasant to use in native ES2015 without requiring any transpilation or stage-x features. Most current options will have a reasonable mapping in the class-based API. Stage-x features such as class fields and decorators can still be used optionally to enhance the authoring experience. In addition, the API is designed with TypeScript type inference in mind. The 3.x codebase will itself be written in TypeScript, and providing improved TypeScript support. (That said, usage of TypeScript in an application is still entirely optional.)</li><li>The 2.x object-based component format will still be supported by internally transforming the object to a corresponding class.</li><li>Mixins will still be supported.*</li><li>Top level APIs will likely receive an overhaul to avoid globally mutating the Vue runtime when installing plugins. Instead, plugins will be applied and scoped to a component tree. This will make it easier to test components that rely on specific plugins, and also make it possible to mount multiple Vue applications on the same page with different plugins, but using the same Vue runtime.*</li><li>Functional components can finally be plain functions however, async components will now need to be explicitly created via a helper function.</li><li>The part that will receive the most changes is the Virtual DOM format used in render functions. We are currently collecting feedback from major library authors and will be sharing more details as we are more confident of the changes, but as long as you dont heavily rely on hand-written (non-JSX) render functions in your app, upgrading should be a reasonably straightforward process.</li></ul>
<h4>Source Code Architecture</h4>
<blockquote>TL;DR: better decoupled internal modules, TypeScript, and a codebase that is easier to contribute to.</blockquote>
<p>We are re-writing 3.0 from the ground up for a cleaner and more maintainable architecture, in particular trying to make it easier to contribute to. We are breaking some internal functionalities into individual packages in order to isolate the scope of complexity. For example, the observer module will become its own package, with its own public API and tests. Note this does not affect framework-level API you will not have to manually import individual bits from multiple packages in order to use Vue. Instead, the final Vue package is assembled using these internal packages.</p>
<p>The codebase is also now written in TypeScript. Although this will make proficiency in TypeScript a pre-requisite for contributing to the new codebase, we believe the type information and IDE support will actually make it easier for a new contributor to make meaningful contributions.</p>
<p>Decoupling the observer and scheduler into separate packages also allows us to easily experiment with alternative implementations of these parts. For example, we can implement an IE11 compatible observer implementation with the same API, or an alternative scheduler that leverages<code>requestIdleCallback</code>to yield to the browser during long updates.*</p>
<p><img class=" wscnph" src="https://wpimg.wallstcn.com/4d0b5fb2-d7f9-48fd-8f1b-03362b534dd9.png" data-wscntype="image" data-wscnh="716" data-wscnw="460" /></p>
<h4>Observation Mechanism</h4>
<blockquote>TL;DR: more complete, precise, efficient and debuggable reactivity tracking &amp; API for creating observables.</blockquote>
<p>3.0 will ship with a Proxy-based observer implementation that provides reactivity tracking with full language coverage. This eliminates a number of limitations of Vue 2s current implementation based on<code>Object.defineProperty</code>:</p>
<p>The new observer also features the following:</p>
<p>Easily understand why a component is re-rendering</p>
<p><img class=" wscnph" src="https://wpimg.wallstcn.com/a0c9d811-1ef9-4628-8976-f7c1aaa66da0.png" data-wscntype="image" data-wscnh="540" data-wscnw="789" /></p>
<h4>Other Runtime Improvements</h4>
<blockquote>TL;DR: smaller, faster, tree-shakable features, fragments &amp; portals, custom renderer API.</blockquote>
<h4>Compiler Improvements*</h4>
<blockquote>TL;DR: tree-shaking friendly output, more AOT optimizations, parser with better error info and source map support.</blockquote>
<h4>IE11 Support*</h4>
<blockquote>TL;DR: it will be supported, but in a separate build with the same reactivity limitations of Vue 2.x.</blockquote>
<p>The new codebase currently targets evergreen browsers only and assumes baseline native ES2015 support. But alas, we know a lot of our users still need to support IE11 for the foreseeable future. Most of the ES2015 features used can be transpiled / polyfilled for IE11, with the exception for Proxies. Our plan is to implement an alternative observer with the same API, but using the good old ES5<code>Object.defineProperty</code>API. A separate build of Vue 3.x will be distributed using this observer implementation. However, this build will be subject to the same change detection caveats of Vue 2.x and thus not fully compatible with the modern build of 3.x. We are aware that this imposes some inconvenience for library authors as they will need to be aware of compatibility for two different builds, but we will make sure to provide clear guidelines on this when we reach that stage.</p>
<h3>How Do We GetThere</h3>
<p>First of all, although we are announcing it today, we do not have a definitive timeline yet. What we do know at the moment is the steps we will be taking to get there:</p>
<h4>1. Internal Feedback for the Runtime Prototype</h4>
<p>This is the phase we are in right now. Currently, we already have a working runtime prototype that includes the new observer, Virtual DOM and component implementation. We have invited a group of authors of influential community projects to provide feedback for the internal changes, and would like to make sure they are comfortable with the changes before moving forward. We want to ensure that important libraries in the ecosystem will be ready at the same time when we release 3.0, so that users relying on those projects can upgrade easily.</p>
<h4>2. Public Feedback viaRFCs</h4>
<p>Once we gain a certain level of confidence in the new design, for each breaking change we will be opening a dedicated RFC issue which includes:</p>
<p>We will anticipate public feedback from the wider community to help us consolidate these ideas.</p>
<h4>3. Introduce Compatible Features in 2.x &amp;2.x-next</h4>
<p>We are not forgetting about 2.x! In fact, we plan to use 2.x to progressively accustom users to the new changes. We will be gradually introducing confirmed API changes into 2.x via opt-in adaptors, and 2.x-next will allow users to try out the new Proxy-based observer.</p>
<p>The last minor release in 2.x will become LTS and continue to receive bug and security fixes for 18 months when 3.0 is released.</p>
<h4>4. AlphaPhase</h4>
<p>Next, we will finish up the compiler and server-side rendering parts of 3.0 and start making alpha releases. These will mostly be for stability testing purposes in small greenfield apps.</p>
<h4>5. BetaPhase</h4>
<p>During beta phase, our main goal is updating support libraries and tools like Vue Router, Vuex, Vue CLI, Vue DevTools and make sure they work smoothly with the new core. We will also be working with major library authors from the community to help them get ready for 3.0.</p>
<h4>6. RCPhase</h4>
<p>Once we consider the API and codebase stable, we will enter RC phase with API freeze. During this phase we will also work on a compat build: a build of 3.0 that includes compatibility layers for 2.x API. This build will also ship with a flag you can turn on to emit deprecation warnings for 2.x API usage in your app. The compat build can be used as a guide to upgrade your app to 3.0.</p>
<h4>7. IE11build</h4>
<p>The last task before the final release will be the IE11 compatibility build as mentioned above.</p>
<h4>8. FinalRelease</h4>
<p>In all honesty, we dont know when this will happen yet, but likely in 2019. Again, we care more about shipping something that is solid and stable rather than hitting specific dates. There is a lot of work to be done, but we are excited for whats coming next!</p>`
const data = {
title,
content
}
export default data

View File

@ -1,201 +0,0 @@
<template>
<div v-loading.fullscreen.lock="fullscreenLoading" class="main-article" element-loading-text="Efforts to generate PDF">
<div class="article__heading">
<div class="article__heading__title">
{{ article.title }}
</div>
</div>
<div style="color: #ccc;">
This article is from Evan You on <a target="_blank" href="https://medium.com/the-vue-point/plans-for-the-next-iteration-of-vue-js-777ffea6fabf">medium</a>
</div>
<div ref="content" class="node-article-content" v-html="article.content" />
</div>
</template>
<script>
export default {
data() {
return {
article: '',
fullscreenLoading: true
}
},
mounted() {
this.fetchData()
},
methods: {
fetchData() {
import('./content.js').then(data => {
const { title } = data.default
document.title = title
this.article = data.default
setTimeout(() => {
this.fullscreenLoading = false
this.$nextTick(() => {
window.print()
})
}, 3000)
})
}
}
}
</script>
<style lang="scss">
@mixin clearfix {
&:before {
display: table;
content: '';
clear: both;
}
&:after {
display: table;
content: '';
clear: both;
}
}
.main-article {
padding: 20px;
margin: 0 auto;
display: block;
width: 740px;
background: #fff;
}
.article__heading {
position: relative;
padding: 0 0 20px;
overflow: hidden;
}
.article__heading__title {
display: block;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
line-clamp: 2;
word-wrap: break-word;
overflow-wrap: break-word;
font-size: 32px;
line-height: 48px;
font-weight: 600;
color: #333;
overflow: hidden;
}
.node-article-content {
margin: 20px 0 0;
@include clearfix;
font-size: 16px;
color: #333;
letter-spacing: 0.5px;
line-height: 28px;
margin-bottom: 30px;
font-family: medium-content-serif-font, Georgia, Cambria, "Times New Roman", Times, serif;
&> :last-child {
margin-bottom: 0;
}
b,
strong {
font-weight: inherit;
font-weight: bolder;
}
img {
max-width: 100%;
display: block;
margin: 0 auto;
}
p {
font-weight: 400;
font-style: normal;
font-size: 21px;
line-height: 1.58;
letter-spacing: -.003em;
}
ul {
margin-bottom: 30px;
}
li {
--x-height-multiplier: 0.375;
--baseline-multiplier: 0.17;
letter-spacing: .01rem;
font-weight: 400;
font-style: normal;
font-size: 21px;
line-height: 1.58;
letter-spacing: -.003em;
margin-left: 30px;
margin-bottom: 14px;
}
a {
text-decoration: none;
background-repeat: repeat-x;
background-image: linear-gradient(to right, rgba(0, 0, 0, .84) 100%, rgba(0, 0, 0, 0) 0);
background-size: 1px 1px;
background-position: 0 calc(1em + 1px);
padding: 0 6px;
}
code {
background: rgba(0, 0, 0, .05);
padding: 3px 4px;
margin: 0 2px;
font-size: 16px;
display: inline-block;
}
img {
border: 0;
}
/* 解决 IE6-7 图片缩放锯齿问题 */
img {
-ms-interpolation-mode: bicubic;
}
blockquote {
--x-height-multiplier: 0.375;
--baseline-multiplier: 0.17;
font-family: medium-content-serif-font, Georgia, Cambria, "Times New Roman", Times, serif;
letter-spacing: .01rem;
font-weight: 400;
font-style: italic;
font-size: 21px;
line-height: 1.58;
letter-spacing: -.003em;
border-left: 3px solid rgba(0, 0, 0, .84);
padding-left: 20px;
margin-left: -23px;
padding-bottom: 2px;
}
a {
text-decoration: none;
}
h2,
h3,
h4 {
font-size: 34px;
line-height: 1.15;
letter-spacing: -.015em;
margin: 53px 0 0;
}
h4 {
font-size: 26px;
}
}
</style>

View File

@ -1,13 +0,0 @@
<template>
<div class="app-container">
<aside style="margin-top:15px;">
Here we use window.print() to implement the feature of downloading PDF.
</aside>
<router-link target="_blank" to="/pdf/download">
<el-button type="primary">
Click to download PDF
</el-button>
</router-link>
</div>
</template>

View File

@ -1,41 +0,0 @@
<template>
<el-upload :data="dataObj" :multiple="true" :before-upload="beforeUpload" action="https://upload.qbox.me" drag>
<i class="el-icon-upload" />
<div class="el-upload__text">
将文件拖到此处<em>点击上传</em>
</div>
</el-upload>
</template>
<script>
import { getToken } from '@/api/qiniu'
// token Access Key,Secret Key,buckettoken
// sdk https://developer.qiniu.com/sdk#official-sdk
export default {
data() {
return {
dataObj: { token: '', key: '' },
image_uri: [],
fileList: []
}
},
methods: {
beforeUpload() {
const _self = this
return new Promise((resolve, reject) => {
getToken().then(response => {
const key = response.data.qiniu_key
const token = response.data.qiniu_token
_self._data.dataObj.token = token
_self._data.dataObj.key = key
resolve(true)
}).catch(err => {
console.log(err)
reject(false)
})
})
}
}
}
</script>

View File

@ -2,7 +2,7 @@
<div>
<el-card>
<buttons funid="safe_insp" style="margin-bottom:20px" @save="save" />
<el-form ref="form" :model="form" label-width="80px">
<el-form ref="form" :model="form" label-width="80px" :rules="rules">
<el-row>
<el-col :span="7">
<el-form-item label="巡检单编号">
@ -22,7 +22,7 @@
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="巡检名称">
<el-form-item ref="safe_insp__insp_name" label="巡检名称" prop="safe_insp__insp_name">
<el-input v-model="form.safe_insp__insp_name" placeholder="请选择巡检名称" class="input-with-select" clearable>
<el-button slot="append" icon="el-icon-search" @click="inspNameVisible = !inspNameVisible" />
</el-input>
@ -31,7 +31,7 @@
</el-row>
<el-row>
<el-col :span="7">
<el-form-item label="巡检日期">
<el-form-item label="巡检日期" prop="safe_insp__insp_date">
<el-date-picker
v-model="form.safe_insp__insp_date"
type="date"
@ -43,7 +43,7 @@
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="巡检人员">
<el-form-item ref="safe_insp__insp_man" label="巡检人员" prop="safe_insp__insp_man">
<el-input v-model="form.safe_insp__insp_man" placeholder="请选择巡检人员" class="input-with-select" clearable>
<el-button slot="append" icon="el-icon-search" @click="selUserVisible = !selUserVisible" />
</el-input>
@ -57,8 +57,15 @@
</el-row>
<el-row>
<el-col :span="7">
<el-form-item label="巡检频率">
<el-input v-model="form.safe_insp__insp_times" />
<el-form-item ref="safe_insp__insp_times" label="巡检频率" prop="safe_insp__insp_times">
<el-select v-model="form.safe_insp__insp_times" placeholder="请选择">
<el-option
v-for="item in insptimes"
:key="item.funall_control__value_data"
:label="item.funall_control__display_data"
:value="item.funall_control__value_data"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
@ -147,16 +154,52 @@ export default {
safe_insp__dept_id: '',
safe_insp__insp_man_id: ''
},
rules: {
safe_insp__insp_name: [
{ required: true, message: '请选择巡检名称', trigger: 'blur' }
],
safe_insp__insp_man: [
{ required: true, message: '请选择巡检人员', trigger: 'blur' }
],
safe_insp__insp_date: [
{ required: true, message: '请选择巡检日期', trigger: 'blur' }
],
safe_insp__insp_times: [
{ required: true, message: '请选择巡检频率', trigger: 'blur' }
]
},
inspName: [],
disabled: false,
options: [],
insptimes: [],
selUserVisible: false,
inspNameVisible: false,
id: ''
}
},
watch: {
'form.safe_insp__insp_name': {
handler(val, oldVal) {
this.$refs['safe_insp__insp_name'].clearValidate()
},
deep: true
},
'form.safe_insp__insp_man': {
handler(val, oldVal) {
this.$refs['safe_insp__insp_man'].clearValidate()
},
deep: true
},
'form.safe_insp__insp_times': {
handler(val, oldVal) {
this.$refs['safe_insp__insp_times'].clearValidate()
},
deep: true
}
},
created() {
this.getTypeSel()
this.getInsptimes()
},
methods: {
getList() {
@ -173,7 +216,7 @@ export default {
})
},
async getTypeSel() {
await publicApi.getTypeSel('insptimes').then(data => {
await publicApi.getTypeSel('inspstate').then(data => {
if (data.success) {
this.options = data.data.root
} else {
@ -181,6 +224,15 @@ export default {
}
})
},
async getInsptimes() {
await publicApi.getTypeSel('insptimes').then(data => {
if (data.success) {
this.insptimes = data.data.root
} else {
this.$message.error(data.message)
}
})
},
onSubmit() {},
updateUser(data) {
this.form.safe_insp__insp_man = data.sys_user__user_name
@ -202,13 +254,17 @@ export default {
this.inspNameVisible = false
},
save() {
api.Crerte(this.form).then(data => {
if (data.success) {
this.$message.success('保存成功!')
const param = `/insp/edit_form/audit/${data.data.keyid}`
this.$router.push(param)
} else {
this.$message.error(data.message)
this.$refs.form.validate(valid => {
if (valid) {
api.Crerte(this.form).then(data => {
if (data.success) {
this.$message.success('保存成功!')
const param = `/insp/edit_form/audit/${data.data.keyid}`
this.$router.push(param)
} else {
this.$message.error(data.message)
}
})
}
})
},

View File

@ -2,7 +2,7 @@
<div>
<el-card>
<buttons funid="safe_insp" style="margin-bottom:20px" @save="save" />
<el-form ref="form" :model="form" label-width="80px">
<el-form ref="form" :model="form" label-width="80px" :rules="rules">
<el-row>
<el-col :span="7">
<el-form-item label="巡检单编号">
@ -22,14 +22,16 @@
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="巡检名称">
<el-input v-model="form.safe_insp__insp_name" />
<el-form-item ref="safe_insp__insp_name" label="巡检名称" prop="safe_insp__insp_name">
<el-input v-model="form.safe_insp__insp_name" placeholder="请选择巡检名称" class="input-with-select" clearable>
<el-button slot="append" icon="el-icon-search" @click="inspNameVisible = !inspNameVisible" />
</el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="7">
<el-form-item label="巡检日期">
<el-form-item label="巡检日期" prop="safe_insp__insp_date">
<el-date-picker
v-model="form.safe_insp__insp_date"
type="date"
@ -41,8 +43,8 @@
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="巡检人员">
<el-input v-model="form.safe_insp__insp_man" placeholder="请输入内容" class="input-with-select" clearable>
<el-form-item ref="safe_insp__insp_man" label="巡检人员" prop="safe_insp__insp_man">
<el-input v-model="form.safe_insp__insp_man" placeholder="请选择巡检人员" class="input-with-select" clearable>
<el-button slot="append" icon="el-icon-search" @click="selUserVisible = !selUserVisible" />
</el-input>
</el-form-item>
@ -55,8 +57,15 @@
</el-row>
<el-row>
<el-col :span="7">
<el-form-item label="巡检频率">
<el-input v-model="form.safe_insp__insp_times" />
<el-form-item ref="safe_insp__insp_times" label="巡检频率" prop="safe_insp__insp_times">
<el-select v-model="form.safe_insp__insp_times" placeholder="请选择">
<el-option
v-for="item in insptimes"
:key="item.funall_control__value_data"
:label="item.funall_control__display_data"
:value="item.funall_control__value_data"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
@ -92,6 +101,18 @@
<el-button type="primary" @click="selUserVisible = false"> </el-button>
</span>
</el-dialog>
<el-dialog
v-if="inspNameVisible"
title="选择巡检名称"
:visible.sync="inspNameVisible"
width="60%"
>
<InspName @updateInspName="updateInspName" />
<span>
<el-button @click="inspNameVisible = false"> </el-button>
<el-button type="primary" @click="inspNameVisible = false"> </el-button>
</span>
</el-dialog>
</div>
</template>
@ -101,12 +122,15 @@ import publicApi from '@/api/public'
import buttons from '@/components/formBtn'
import InspDet from '../insp_det'
import SelUser from '@/components/selUser'
import InspName from '../inspName'
import { parseDay } from '@/utils'
export default {
name: 'EditForm',
components: {
buttons,
SelUser,
InspDet
InspDet,
InspName
},
// props: {
// id: { type: String, default: () => '' }
@ -114,11 +138,60 @@ export default {
data() {
return {
loading: false,
form: {},
parseDay,
form: {
safe_insp__insp_code: '',
safe_insp__insp_name: '',
safe_insp__insp_state: '',
safe_insp__insp_date: '',
safe_insp__insp_man: '',
safe_insp__insp_times: '',
safe_insp__insp_memo: '',
safe_insp__insp_ed: '',
safe_insp__insp_ing: '',
safe_insp__insp_non: '',
safe_insp__safe_insp_id: ''
},
rules: {
safe_insp__insp_name: [
{ required: true, message: '请选择巡检名称', trigger: 'blur' }
],
safe_insp__insp_man: [
{ required: true, message: '请选择巡检人员', trigger: 'blur' }
],
safe_insp__insp_date: [
{ required: true, message: '请选择巡检日期', trigger: 'blur' }
],
safe_insp__insp_times: [
{ required: true, message: '请选择巡检频率', trigger: 'blur' }
]
},
id: this.$route.params.id,
disabled: false,
options: [],
selUserVisible: false
insptimes: [],
selUserVisible: false,
inspNameVisible: false
}
},
watch: {
'form.safe_insp__insp_name': {
handler(val, oldVal) {
this.$refs['safe_insp__insp_name'].clearValidate()
},
deep: true
},
'form.safe_insp__insp_man': {
handler(val, oldVal) {
this.$refs['safe_insp__insp_man'].clearValidate()
},
deep: true
},
'form.safe_insp__insp_times': {
handler(val, oldVal) {
this.$refs['safe_insp__insp_times'].clearValidate()
},
deep: true
}
},
created() {
@ -132,6 +205,7 @@ export default {
api.getFormDate(this.id).then(data => {
if (data.success) {
this.form = data.data.root[0]
this.form.safe_insp__insp_date = parseDay(data.data.root[0].safe_insp__insp_date)
setTimeout(() => {
this.loading = false
}, 200)
@ -149,6 +223,15 @@ export default {
}
})
},
async getInsptimes() {
await publicApi.getTypeSel('insptimes').then(data => {
if (data.success) {
this.insptimes = data.data.root
} else {
this.$message.error(data.message)
}
})
},
onSubmit() {},
updateUser(data) {
this.form.safe_insp__insp_man = data.sys_user__user_name
@ -168,6 +251,11 @@ export default {
}
})
},
updateInspName(data) {
this.form.safe_insp__insp_name = data.insp_name__insp_name
this.form.safe_insp__insp_name_id = data.insp_name__insp_name_id
this.inspNameVisible = false
},
back() {
// this.$router.back(-1)
}

View File

@ -3,20 +3,26 @@
<buttons funid="insp_det" style="margin:10px 10px" @editCreate="editCreate" @editDelete="editDelete" @editSave="editSave" @upload="upload" />
<el-card>
<el-table
ref="deptTable"
ref="table"
v-loading="loading"
:data="data"
style="width: 100%"
border
stripe
@selection-change="handleSelectionChange"
@cell-dblclick="cellDblclick"
>
<template v-for="(d,i) in tableHeader">
<el-table-column v-if="d.type && d.type === 'selection'" :key="i" :type="d.type" :fixed="d.fixed" />
<el-table-column
v-else
v-else-if="d.show !== false"
:key="i"
:prop="d.prop"
:label="d.label"
:width="d.width"
:min-width="d.minWidth"
:class-name="d.className"
:fixed="d.fixed"
>
<template slot-scope="scope">
<div v-if="d.label==='巡检状态'">
@ -24,8 +30,13 @@
scope.row.ssafe_insp__insp_state == 1 ? '巡检中' : '已巡检'
}}
</div>
<div v-else-if="d.label==='巡检日期'">
{{
parseDay(scope.row.safe_insp__insp_date)
}}
</div>
<div v-else-if="d.label === '操作'">
<el-button icon="el-icon-view" type="text" title="编辑" @click="edit(scope.row)" />
<el-button icon="el-icon-view" type="text" size="mini" title="编辑" @click="edit(scope.row)" />
<el-button v-if="scope.row.status !== 'NULLIFY'" icon="el-icon-delete" style="color:#F56C6C" type="text" title="删除" @click="Delete(scope.row)" />
</div>
<div v-else>{{ scope.row[d.prop] }}</div>
@ -44,38 +55,12 @@
/>
</el-card>
<el-dialog v-if="dialogFormVisible" title="新增部门" :visible.sync="dialogFormVisible" @close="closeDialog">
<el-form ref="form" :model="form" :rules="rules">
<el-form-item label="所属部门" :label-width="formLabelWidth">
<el-select v-model="dept_id" placeholder="请选择">
<el-option
v-for="item in data"
:key="item.sys_dept__dept_id"
:label="item.sys_dept__dept_name"
:value="item.sys_dept__dept_id"
/>
</el-select>
</el-form-item>
<el-form-item label="部门编码" :label-width="formLabelWidth" prop="dept_code">
<el-input v-model="form.dept_code" />
</el-form-item>
<el-form-item label="部门名称" :label-width="formLabelWidth" prop="dept_name">
<el-input v-model="form.dept_name" />
</el-form-item>
<el-form-item label="备注" :label-width="formLabelWidth" prop="memo">
<el-input v-model="form.memo" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="dialogFormVisible = false"> </el-button>
<el-button type="primary" @click="create"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import api from './api'
import { parseDay } from '@/utils'
import buttons from '@/components/Buttons'
export default {
name: 'SafeIdsp',
@ -89,6 +74,7 @@ export default {
deptTree: [],
ids: [],
levels: [],
parseDay,
pager: {
pageNo: 0,
pageSize: 10,
@ -98,51 +84,73 @@ export default {
{
prop: 'selection',
type: 'selection',
fixed: 'left'
fixed: 'left',
width: '100px',
show: true
}, {
prop: 'safe_insp__insp_code',
label: '巡检编号'
label: '巡检编号',
width: '200px',
show: true
}, {
prop: 'safe_insp__insp_name',
label: '巡检名称'
label: '巡检名称',
width: '250px',
show: true
},
{
prop: 'safe_insp__insp_state',
label: '巡检状态'
label: '巡检状态',
width: '100px',
show: true
}, {
prop: 'safe_insp__insp_date',
label: '巡检日期'
label: '巡检日期',
width: '100px',
show: true
},
{
prop: 'safe_insp__insp_man',
label: '巡检人员'
label: '巡检人员',
width: '100px',
show: true
},
{
prop: 'safe_insp__insp_times',
label: '巡检频率'
label: '巡检频率',
width: '100px',
show: true
},
{
prop: 'safe_insp__insp_memo',
label: '备注'
label: '备注',
width: '100px',
show: true
},
{
prop: 'safe_insp__insp_ed',
label: '已巡检数量'
label: '已巡检数量',
width: '100px',
show: true
},
{
prop: 'safe_insp__insp_ing',
label: '待巡检数量'
label: '待巡检数量',
width: '100px',
show: true
},
{
prop: 'safe_insp__insp_non',
label: '不符合数量'
label: '不符合数量',
width: '100px',
show: true
},
{
prop: 'opration',
label: '操作',
width: '70px',
width: '120px',
fixed: 'right',
minWidth: '70px',
minWidth: '120px',
show: true
}],
value: '',

View File

@ -98,10 +98,9 @@
width="60%"
:modal="false"
>
<SelDept ref="seLDept" @updateDept="updateDept" @updateDepts="updateDepts" />
<SelDept ref="seLDept" selective="single" @updateDept="updateDept" @updateDepts="updateDepts" />
<span>
<el-button @click="selDeptVisible = false"> </el-button>
<el-button type="primary" @click="selDeptVisible = false"> </el-button>
</span>
</el-dialog>
</div>
@ -199,6 +198,7 @@ export default {
this.form.sys_dept__dept_name = data.map(d => { return d.sys_dept__dept_name }).join(';')
this.form.sys_user__dept_id = data.map(d => { return d.sys_dept__dept_id }).join(';')
this.change()
this.selDeptVisible = false
}
}
}

View File

@ -1,103 +0,0 @@
<template>
<el-table :data="list" border fit highlight-current-row style="width: 100%">
<el-table-column
v-loading="loading"
align="center"
label="ID"
width="65"
element-loading-text="请给我点时间!"
>
<template slot-scope="scope">
<span>{{ scope.row.id }}</span>
</template>
</el-table-column>
<el-table-column width="180px" align="center" label="Date">
<template slot-scope="scope">
<span>{{ scope.row.timestamp | parseTime('{y}-{m}-{d} {h}:{i}') }}</span>
</template>
</el-table-column>
<el-table-column min-width="300px" label="Title">
<template slot-scope="{row}">
<span>{{ row.title }}</span>
<el-tag>{{ row.type }}</el-tag>
</template>
</el-table-column>
<el-table-column width="110px" align="center" label="Author">
<template slot-scope="scope">
<span>{{ scope.row.author }}</span>
</template>
</el-table-column>
<el-table-column width="120px" label="Importance">
<template slot-scope="scope">
<svg-icon v-for="n in +scope.row.importance" :key="n" icon-class="star" />
</template>
</el-table-column>
<el-table-column align="center" label="Readings" width="95">
<template slot-scope="scope">
<span>{{ scope.row.pageviews }}</span>
</template>
</el-table-column>
<el-table-column class-name="status-col" label="Status" width="110">
<template slot-scope="{row}">
<el-tag :type="row.status | statusFilter">
{{ row.status }}
</el-tag>
</template>
</el-table-column>
</el-table>
</template>
<script>
import { fetchList } from '@/api/article'
export default {
filters: {
statusFilter(status) {
const statusMap = {
published: 'success',
draft: 'info',
deleted: 'danger'
}
return statusMap[status]
}
},
props: {
type: {
type: String,
default: 'CN'
}
},
data() {
return {
list: null,
listQuery: {
page: 1,
limit: 5,
type: this.type,
sort: '+id'
},
loading: false
}
},
created() {
this.getList()
},
methods: {
getList() {
this.loading = true
this.$emit('create') // for test
fetchList(this.listQuery).then(response => {
this.list = response.data.items
this.loading = false
})
}
}
}
</script>

View File

@ -1,57 +0,0 @@
<template>
<div class="tab-container">
<el-tag>mounted times {{ createdTimes }}</el-tag>
<el-alert :closable="false" style="width:200px;display:inline-block;vertical-align: middle;margin-left:30px;" title="Tab with keep-alive" type="success" />
<el-tabs v-model="activeName" style="margin-top:15px;" type="border-card">
<el-tab-pane v-for="item in tabMapOptions" :key="item.key" :label="item.label" :name="item.key">
<keep-alive>
<tab-pane v-if="activeName==item.key" :type="item.key" @create="showCreatedTimes" />
</keep-alive>
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
import TabPane from './components/TabPane'
export default {
name: 'Tab',
components: { TabPane },
data() {
return {
tabMapOptions: [
{ label: 'China', key: 'CN' },
{ label: 'USA', key: 'US' },
{ label: 'Japan', key: 'JP' },
{ label: 'Eurozone', key: 'EU' }
],
activeName: 'CN',
createdTimes: 0
}
},
watch: {
activeName(val) {
this.$router.push(`${this.$route.path}?tab=${val}`)
}
},
created() {
// init the default selected tab
const tab = this.$route.query.tab
if (tab) {
this.activeName = tab
}
},
methods: {
showCreatedTimes() {
this.createdTimes = this.createdTimes + 1
}
}
}
</script>
<style scoped>
.tab-container {
margin: 30px;
}
</style>

View File

@ -1,379 +0,0 @@
<template>
<div class="app-container">
<div class="filter-container">
<el-input v-model="listQuery.title" placeholder="Title" style="width: 200px;" class="filter-item" @keyup.enter.native="handleFilter" />
<el-select v-model="listQuery.importance" placeholder="Imp" clearable style="width: 90px" class="filter-item">
<el-option v-for="item in importanceOptions" :key="item" :label="item" :value="item" />
</el-select>
<el-select v-model="listQuery.type" placeholder="Type" clearable class="filter-item" style="width: 130px">
<el-option v-for="item in calendarTypeOptions" :key="item.key" :label="item.display_name+'('+item.key+')'" :value="item.key" />
</el-select>
<el-select v-model="listQuery.sort" style="width: 140px" class="filter-item" @change="handleFilter">
<el-option v-for="item in sortOptions" :key="item.key" :label="item.label" :value="item.key" />
</el-select>
<el-button v-waves class="filter-item" type="primary" icon="el-icon-search" @click="handleFilter">
Search
</el-button>
<el-button class="filter-item" style="margin-left: 10px;" type="primary" icon="el-icon-edit" @click="handleCreate">
Add
</el-button>
<el-button v-waves :loading="downloadLoading" class="filter-item" type="primary" icon="el-icon-download" @click="handleDownload">
Export
</el-button>
<el-checkbox v-model="showReviewer" class="filter-item" style="margin-left:15px;" @change="tableKey=tableKey+1">
reviewer
</el-checkbox>
</div>
<el-table
:key="tableKey"
v-loading="listLoading"
:data="list"
border
fit
highlight-current-row
style="width: 100%;"
@sort-change="sortChange"
>
<el-table-column label="ID" prop="id" sortable="custom" align="center" width="80" :class-name="getSortClass('id')">
<template slot-scope="{row}">
<span>{{ row.id }}</span>
</template>
</el-table-column>
<el-table-column label="Date" width="150px" align="center">
<template slot-scope="{row}">
<span>{{ row.timestamp | parseTime('{y}-{m}-{d} {h}:{i}') }}</span>
</template>
</el-table-column>
<el-table-column label="Title" min-width="150px">
<template slot-scope="{row}">
<span class="link-type" @click="handleUpdate(row)">{{ row.title }}</span>
<el-tag>{{ row.type | typeFilter }}</el-tag>
</template>
</el-table-column>
<el-table-column label="Author" width="110px" align="center">
<template slot-scope="{row}">
<span>{{ row.author }}</span>
</template>
</el-table-column>
<el-table-column v-if="showReviewer" label="Reviewer" width="110px" align="center">
<template slot-scope="{row}">
<span style="color:red;">{{ row.reviewer }}</span>
</template>
</el-table-column>
<el-table-column label="Imp" width="80px">
<template slot-scope="{row}">
<svg-icon v-for="n in + row.importance" :key="n" icon-class="star" class="meta-item__icon" />
</template>
</el-table-column>
<el-table-column label="Readings" align="center" width="95">
<template slot-scope="{row}">
<span v-if="row.pageviews" class="link-type" @click="handleFetchPv(row.pageviews)">{{ row.pageviews }}</span>
<span v-else>0</span>
</template>
</el-table-column>
<el-table-column label="Status" class-name="status-col" width="100">
<template slot-scope="{row}">
<el-tag :type="row.status | statusFilter">
{{ row.status }}
</el-tag>
</template>
</el-table-column>
<el-table-column label="Actions" align="center" width="230" class-name="small-padding fixed-width">
<template slot-scope="{row,$index}">
<el-button type="primary" size="mini" @click="handleUpdate(row)">
Edit
</el-button>
<el-button v-if="row.status!='published'" size="mini" type="success" @click="handleModifyStatus(row,'published')">
Publish
</el-button>
<el-button v-if="row.status!='draft'" size="mini" @click="handleModifyStatus(row,'draft')">
Draft
</el-button>
<el-button v-if="row.status!='deleted'" size="mini" type="danger" @click="handleDelete(row,$index)">
Delete
</el-button>
</template>
</el-table-column>
</el-table>
<pagination v-show="total>0" :total="total" :page.sync="listQuery.page" :limit.sync="listQuery.limit" @pagination="getList" />
<el-dialog :title="textMap[dialogStatus]" :visible.sync="dialogFormVisible">
<el-form ref="dataForm" :rules="rules" :model="temp" label-position="left" label-width="70px" style="width: 400px; margin-left:50px;">
<el-form-item label="Type" prop="type">
<el-select v-model="temp.type" class="filter-item" placeholder="Please select">
<el-option v-for="item in calendarTypeOptions" :key="item.key" :label="item.display_name" :value="item.key" />
</el-select>
</el-form-item>
<el-form-item label="Date" prop="timestamp">
<el-date-picker v-model="temp.timestamp" type="datetime" placeholder="Please pick a date" />
</el-form-item>
<el-form-item label="Title" prop="title">
<el-input v-model="temp.title" />
</el-form-item>
<el-form-item label="Status">
<el-select v-model="temp.status" class="filter-item" placeholder="Please select">
<el-option v-for="item in statusOptions" :key="item" :label="item" :value="item" />
</el-select>
</el-form-item>
<el-form-item label="Imp">
<el-rate v-model="temp.importance" :colors="['#99A9BF', '#F7BA2A', '#FF9900']" :max="3" style="margin-top:8px;" />
</el-form-item>
<el-form-item label="Remark">
<el-input v-model="temp.remark" :autosize="{ minRows: 2, maxRows: 4}" type="textarea" placeholder="Please input" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="dialogFormVisible = false">
Cancel
</el-button>
<el-button type="primary" @click="dialogStatus==='create'?createData():updateData()">
Confirm
</el-button>
</div>
</el-dialog>
<el-dialog :visible.sync="dialogPvVisible" title="Reading statistics">
<el-table :data="pvData" border fit highlight-current-row style="width: 100%">
<el-table-column prop="key" label="Channel" />
<el-table-column prop="pv" label="Pv" />
</el-table>
<span slot="footer" class="dialog-footer">
<el-button type="primary" @click="dialogPvVisible = false">Confirm</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import { fetchList, fetchPv, createArticle, updateArticle } from '@/api/article'
import waves from '@/directive/waves' // waves directive
import { parseTime } from '@/utils'
import Pagination from '@/components/Pagination' // secondary package based on el-pagination
const calendarTypeOptions = [
{ key: 'CN', display_name: 'China' },
{ key: 'US', display_name: 'USA' },
{ key: 'JP', display_name: 'Japan' },
{ key: 'EU', display_name: 'Eurozone' }
]
// arr to obj, such as { CN : "China", US : "USA" }
const calendarTypeKeyValue = calendarTypeOptions.reduce((acc, cur) => {
acc[cur.key] = cur.display_name
return acc
}, {})
export default {
name: 'ComplexTable',
components: { Pagination },
directives: { waves },
filters: {
statusFilter(status) {
const statusMap = {
published: 'success',
draft: 'info',
deleted: 'danger'
}
return statusMap[status]
},
typeFilter(type) {
return calendarTypeKeyValue[type]
}
},
data() {
return {
tableKey: 0,
list: null,
total: 0,
listLoading: true,
listQuery: {
page: 1,
limit: 20,
importance: undefined,
title: undefined,
type: undefined,
sort: '+id'
},
importanceOptions: [1, 2, 3],
calendarTypeOptions,
sortOptions: [{ label: 'ID Ascending', key: '+id' }, { label: 'ID Descending', key: '-id' }],
statusOptions: ['published', 'draft', 'deleted'],
showReviewer: false,
temp: {
id: undefined,
importance: 1,
remark: '',
timestamp: new Date(),
title: '',
type: '',
status: 'published'
},
dialogFormVisible: false,
dialogStatus: '',
textMap: {
update: 'Edit',
create: 'Create'
},
dialogPvVisible: false,
pvData: [],
rules: {
type: [{ required: true, message: 'type is required', trigger: 'change' }],
timestamp: [{ type: 'date', required: true, message: 'timestamp is required', trigger: 'change' }],
title: [{ required: true, message: 'title is required', trigger: 'blur' }]
},
downloadLoading: false
}
},
created() {
this.getList()
},
methods: {
getList() {
this.listLoading = true
fetchList(this.listQuery).then(response => {
this.list = response.data.items
this.total = response.data.total
// Just to simulate the time of the request
setTimeout(() => {
this.listLoading = false
}, 1.5 * 1000)
})
},
handleFilter() {
this.listQuery.page = 1
this.getList()
},
handleModifyStatus(row, status) {
this.$message({
message: '操作Success',
type: 'success'
})
row.status = status
},
sortChange(data) {
const { prop, order } = data
if (prop === 'id') {
this.sortByID(order)
}
},
sortByID(order) {
if (order === 'ascending') {
this.listQuery.sort = '+id'
} else {
this.listQuery.sort = '-id'
}
this.handleFilter()
},
resetTemp() {
this.temp = {
id: undefined,
importance: 1,
remark: '',
timestamp: new Date(),
title: '',
status: 'published',
type: ''
}
},
handleCreate() {
this.resetTemp()
this.dialogStatus = 'create'
this.dialogFormVisible = true
this.$nextTick(() => {
this.$refs['dataForm'].clearValidate()
})
},
createData() {
this.$refs['dataForm'].validate((valid) => {
if (valid) {
this.temp.id = parseInt(Math.random() * 100) + 1024 // mock a id
this.temp.author = 'vue-element-admin'
createArticle(this.temp).then(() => {
this.list.unshift(this.temp)
this.dialogFormVisible = false
this.$notify({
title: 'Success',
message: 'Created Successfully',
type: 'success',
duration: 2000
})
})
}
})
},
handleUpdate(row) {
this.temp = Object.assign({}, row) // copy obj
this.temp.timestamp = new Date(this.temp.timestamp)
this.dialogStatus = 'update'
this.dialogFormVisible = true
this.$nextTick(() => {
this.$refs['dataForm'].clearValidate()
})
},
updateData() {
this.$refs['dataForm'].validate((valid) => {
if (valid) {
const tempData = Object.assign({}, this.temp)
tempData.timestamp = +new Date(tempData.timestamp) // change Thu Nov 30 2017 16:41:05 GMT+0800 (CST) to 1512031311464
updateArticle(tempData).then(() => {
const index = this.list.findIndex(v => v.id === this.temp.id)
this.list.splice(index, 1, this.temp)
this.dialogFormVisible = false
this.$notify({
title: 'Success',
message: 'Update Successfully',
type: 'success',
duration: 2000
})
})
}
})
},
handleDelete(row, index) {
this.$notify({
title: 'Success',
message: 'Delete Successfully',
type: 'success',
duration: 2000
})
this.list.splice(index, 1)
},
handleFetchPv(pv) {
fetchPv(pv).then(response => {
this.pvData = response.data.pvData
this.dialogPvVisible = true
})
},
handleDownload() {
this.downloadLoading = true
import('@/vendor/Export2Excel').then(excel => {
const tHeader = ['timestamp', 'title', 'type', 'importance', 'status']
const filterVal = ['timestamp', 'title', 'type', 'importance', 'status']
const data = this.formatJson(filterVal)
excel.export_json_to_excel({
header: tHeader,
data,
filename: 'table-list'
})
this.downloadLoading = false
})
},
formatJson(filterVal) {
return this.list.map(v => filterVal.map(j => {
if (j === 'timestamp') {
return parseTime(v[j])
} else {
return v[j]
}
}))
},
getSortClass: function(key) {
const sort = this.listQuery.sort
return sort === `+${key}` ? 'ascending' : 'descending'
}
}
}
</script>

View File

@ -1,153 +0,0 @@
<template>
<div class="app-container">
<!-- Note that row-key is necessary to get a correct row order. -->
<el-table ref="dragTable" v-loading="listLoading" :data="list" row-key="id" border fit highlight-current-row style="width: 100%">
<el-table-column align="center" label="ID" width="65">
<template slot-scope="{row}">
<span>{{ row.id }}</span>
</template>
</el-table-column>
<el-table-column width="180px" align="center" label="Date">
<template slot-scope="{row}">
<span>{{ row.timestamp | parseTime('{y}-{m}-{d} {h}:{i}') }}</span>
</template>
</el-table-column>
<el-table-column min-width="300px" label="Title">
<template slot-scope="{row}">
<span>{{ row.title }}</span>
</template>
</el-table-column>
<el-table-column width="110px" align="center" label="Author">
<template slot-scope="{row}">
<span>{{ row.author }}</span>
</template>
</el-table-column>
<el-table-column width="100px" label="Importance">
<template slot-scope="{row}">
<svg-icon v-for="n in + row.importance" :key="n" icon-class="star" class="icon-star" />
</template>
</el-table-column>
<el-table-column align="center" label="Readings" width="95">
<template slot-scope="{row}">
<span>{{ row.pageviews }}</span>
</template>
</el-table-column>
<el-table-column class-name="status-col" label="Status" width="110">
<template slot-scope="{row}">
<el-tag :type="row.status | statusFilter">
{{ row.status }}
</el-tag>
</template>
</el-table-column>
<el-table-column align="center" label="Drag" width="80">
<template slot-scope="{}">
<svg-icon class="drag-handler" icon-class="drag" />
</template>
</el-table-column>
</el-table>
<div class="show-d">
<el-tag>The default order :</el-tag> {{ oldList }}
</div>
<div class="show-d">
<el-tag>The after dragging order :</el-tag> {{ newList }}
</div>
</div>
</template>
<script>
import { fetchList } from '@/api/article'
import Sortable from 'sortablejs'
export default {
name: 'DragTable',
filters: {
statusFilter(status) {
const statusMap = {
published: 'success',
draft: 'info',
deleted: 'danger'
}
return statusMap[status]
}
},
data() {
return {
list: null,
total: null,
listLoading: true,
listQuery: {
page: 1,
limit: 10
},
sortable: null,
oldList: [],
newList: []
}
},
created() {
this.getList()
},
methods: {
async getList() {
this.listLoading = true
const { data } = await fetchList(this.listQuery)
this.list = data.items
this.total = data.total
this.listLoading = false
this.oldList = this.list.map(v => v.id)
this.newList = this.oldList.slice()
this.$nextTick(() => {
this.setSort()
})
},
setSort() {
const el = this.$refs.dragTable.$el.querySelectorAll('.el-table__body-wrapper > table > tbody')[0]
this.sortable = Sortable.create(el, {
ghostClass: 'sortable-ghost', // Class name for the drop placeholder,
setData: function(dataTransfer) {
// to avoid Firefox bug
// Detail see : https://github.com/RubaXa/Sortable/issues/1012
dataTransfer.setData('Text', '')
},
onEnd: evt => {
const targetRow = this.list.splice(evt.oldIndex, 1)[0]
this.list.splice(evt.newIndex, 0, targetRow)
// for show the changes, you can delete in you code
const tempIndex = this.newList.splice(evt.oldIndex, 1)[0]
this.newList.splice(evt.newIndex, 0, tempIndex)
}
})
}
}
}
</script>
<style>
.sortable-ghost{
opacity: .8;
color: #fff!important;
background: #42b983!important;
}
</style>
<style scoped>
.icon-star{
margin-right:2px;
}
.drag-handler{
width: 20px;
height: 20px;
cursor: pointer;
}
.show-d{
margin-top: 15px;
}
</style>

View File

@ -1,62 +0,0 @@
<template>
<div class="app-container">
<div class="filter-container">
<el-checkbox-group v-model="checkboxVal">
<el-checkbox label="apple">
apple
</el-checkbox>
<el-checkbox label="banana">
banana
</el-checkbox>
<el-checkbox label="orange">
orange
</el-checkbox>
</el-checkbox-group>
</div>
<el-table :key="key" :data="tableData" border fit highlight-current-row style="width: 100%">
<el-table-column prop="name" label="fruitName" width="180" />
<el-table-column v-for="fruit in formThead" :key="fruit" :label="fruit">
<template slot-scope="scope">
{{ scope.row[fruit] }}
</template>
</el-table-column>
</el-table>
</div>
</template>
<script>
const defaultFormThead = ['apple', 'banana']
export default {
data() {
return {
tableData: [
{
name: 'fruit-1',
apple: 'apple-10',
banana: 'banana-10',
orange: 'orange-10'
},
{
name: 'fruit-2',
apple: 'apple-20',
banana: 'banana-20',
orange: 'orange-20'
}
],
key: 1, // table key
formTheadOptions: ['apple', 'banana', 'orange'],
checkboxVal: defaultFormThead, // checkboxVal
formThead: defaultFormThead // Default header
}
},
watch: {
checkboxVal(valArr) {
this.formThead = this.formTheadOptions.filter(i => valArr.indexOf(i) >= 0)
this.key = this.key + 1// table In order to ensure the table will be re-rendered each time
}
}
}
</script>

View File

@ -1,50 +0,0 @@
<template>
<div class="app-container">
<div class="filter-container">
<el-checkbox-group v-model="formThead">
<el-checkbox label="apple">
apple
</el-checkbox>
<el-checkbox label="banana">
banana
</el-checkbox>
<el-checkbox label="orange">
orange
</el-checkbox>
</el-checkbox-group>
</div>
<el-table :data="tableData" border fit highlight-current-row style="width: 100%">
<el-table-column prop="name" label="fruitName" width="180" />
<el-table-column v-for="fruit in formThead" :key="fruit" :label="fruit">
<template slot-scope="scope">
{{ scope.row[fruit] }}
</template>
</el-table-column>
</el-table>
</div>
</template>
<script>
export default {
data() {
return {
tableData: [
{
name: 'fruit-1',
apple: 'apple-10',
banana: 'banana-10',
orange: 'orange-10'
},
{
name: 'fruit-2',
apple: 'apple-20',
banana: 'banana-20',
orange: 'orange-20'
}
],
formThead: ['apple', 'banana']
}
}
}
</script>

View File

@ -1,24 +0,0 @@
<template>
<div class="app-container">
<div style="margin:0 0 5px 20px">
Fixed header, sorted by header order,
</div>
<fixed-thead />
<div style="margin:30px 0 5px 20px">
Not fixed header, sorted by click order
</div>
<unfixed-thead />
</div>
</template>
<script>
import FixedThead from './components/FixedThead'
import UnfixedThead from './components/UnfixedThead'
export default {
name: 'DynamicTable',
components: { FixedThead, UnfixedThead }
}
</script>

View File

@ -1,149 +0,0 @@
<template>
<div class="app-container">
<el-table v-loading="listLoading" :data="list" border fit highlight-current-row style="width: 100%">
<el-table-column align="center" label="ID" width="80">
<template slot-scope="{row}">
<span>{{ row.id }}</span>
</template>
</el-table-column>
<el-table-column width="180px" align="center" label="Date">
<template slot-scope="{row}">
<span>{{ row.timestamp | parseTime('{y}-{m}-{d} {h}:{i}') }}</span>
</template>
</el-table-column>
<el-table-column width="120px" align="center" label="Author">
<template slot-scope="{row}">
<span>{{ row.author }}</span>
</template>
</el-table-column>
<el-table-column width="100px" label="Importance">
<template slot-scope="{row}">
<svg-icon v-for="n in + row.importance" :key="n" icon-class="star" class="meta-item__icon" />
</template>
</el-table-column>
<el-table-column class-name="status-col" label="Status" width="110">
<template slot-scope="{row}">
<el-tag :type="row.status | statusFilter">
{{ row.status }}
</el-tag>
</template>
</el-table-column>
<el-table-column min-width="300px" label="Title">
<template slot-scope="{row}">
<template v-if="row.edit">
<el-input v-model="row.title" class="edit-input" size="small" />
<el-button
class="cancel-btn"
size="small"
icon="el-icon-refresh"
type="warning"
@click="cancelEdit(row)"
>
cancel
</el-button>
</template>
<span v-else>{{ row.title }}</span>
</template>
</el-table-column>
<el-table-column align="center" label="Actions" width="120">
<template slot-scope="{row}">
<el-button
v-if="row.edit"
type="success"
size="small"
icon="el-icon-circle-check-outline"
@click="confirmEdit(row)"
>
Ok
</el-button>
<el-button
v-else
type="primary"
size="small"
icon="el-icon-edit"
@click="row.edit=!row.edit"
>
Edit
</el-button>
</template>
</el-table-column>
</el-table>
</div>
</template>
<script>
import { fetchList } from '@/api/article'
export default {
name: 'InlineEditTable',
filters: {
statusFilter(status) {
const statusMap = {
published: 'success',
draft: 'info',
deleted: 'danger'
}
return statusMap[status]
}
},
data() {
return {
list: null,
listLoading: true,
listQuery: {
page: 1,
limit: 10
}
}
},
created() {
this.getList()
},
methods: {
async getList() {
this.listLoading = true
const { data } = await fetchList(this.listQuery)
const items = data.items
this.list = items.map(v => {
this.$set(v, 'edit', false) // https://vuejs.org/v2/guide/reactivity.html
v.originalTitle = v.title // will be used when user click the cancel botton
return v
})
this.listLoading = false
},
cancelEdit(row) {
row.title = row.originalTitle
row.edit = false
this.$message({
message: 'The title has been restored to the original value',
type: 'warning'
})
},
confirmEdit(row) {
row.edit = false
row.originalTitle = row.title
this.$message({
message: 'The title has been edited',
type: 'success'
})
}
}
}
</script>
<style scoped>
.edit-input {
padding-right: 100px;
}
.cancel-btn {
position: absolute;
right: 15px;
top: 10px;
}
</style>

View File

@ -1,120 +0,0 @@
<template>
<div class="app-container">
<el-card class="box-card">
<div slot="header">
<a class="link-type link-title" target="_blank" href="https://panjiachen.github.io/vue-element-admin-site/guide/advanced/theme.html">
Theme documentation
</a>
</div>
<div class="box-item">
<span class="field-label">Change Theme : </span>
<el-switch v-model="theme" />
<aside style="margin-top:15px;">
Tips: It is different from the theme-pick on the navbar is two different skinning methods, each with different application scenarios. Refer to the documentation for details.
</aside>
</div>
</el-card>
<div class="block">
<el-button type="primary">
Primary
</el-button>
<el-button type="success">
Success
</el-button>
<el-button type="info">
Info
</el-button>
<el-button type="warning">
Warning
</el-button>
<el-button type="danger">
Danger
</el-button>
</div>
<div class="block">
<el-button type="primary" icon="el-icon-edit" />
<el-button type="primary" icon="el-icon-share" />
<el-button type="primary" icon="el-icon-delete" />
<el-button type="primary" icon="el-icon-search">
Search
</el-button>
<el-button type="primary">
Upload
<i class="el-icon-upload el-icon-right" />
</el-button>
</div>
<div class="block">
<el-tag v-for="tag in tags" :key="tag.type" :type="tag.type" class="tag-item">
{{ tag.name }}
</el-tag>
</div>
<div class="block">
<el-radio-group v-model="radio">
<el-radio :label="3">
Option A
</el-radio>
<el-radio :label="6">
Option B
</el-radio>
<el-radio :label="9">
Option C
</el-radio>
</el-radio-group>
</div>
<div class="block">
<el-slider v-model="slideValue" />
</div>
</div>
</template>
<script>
import { toggleClass } from '@/utils'
import '@/assets/custom-theme/index.css' // the theme changed version element-ui css
export default {
name: 'Theme',
data() {
return {
theme: false,
tags: [
{ name: 'Tag One', type: '' },
{ name: 'Tag Two', type: 'info' },
{ name: 'Tag Three', type: 'success' },
{ name: 'Tag Four', type: 'warning' },
{ name: 'Tag Five', type: 'danger' }
],
slideValue: 50,
radio: 3
}
},
watch: {
theme() {
toggleClass(document.body, 'custom-theme')
}
}
}
</script>
<style scoped>
.field-label{
vertical-align: middle;
}
.box-card {
width: 400px;
max-width: 100%;
margin: 20px auto;
}
.block {
padding: 30px 24px;
}
.tag-item {
margin-right: 15px;
}
</style>

View File

@ -1,77 +0,0 @@
<template>
<div class="app-container">
<el-input v-model="filename" placeholder="Please enter the file name (default file)" style="width:300px;" prefix-icon="el-icon-document" />
<el-button :loading="downloadLoading" style="margin-bottom:20px;" type="primary" icon="el-icon-document" @click="handleDownload">
Export Zip
</el-button>
<el-table v-loading="listLoading" :data="list" element-loading-text="拼命加载中" border fit highlight-current-row>
<el-table-column align="center" label="ID" width="95">
<template slot-scope="scope">
{{ scope.$index }}
</template>
</el-table-column>
<el-table-column label="Title">
<template slot-scope="scope">
{{ scope.row.title }}
</template>
</el-table-column>
<el-table-column label="Author" width="95" align="center">
<template slot-scope="scope">
<el-tag>{{ scope.row.author }}</el-tag>
</template>
</el-table-column>
<el-table-column label="Readings" width="115" align="center">
<template slot-scope="scope">
{{ scope.row.pageviews }}
</template>
</el-table-column>
<el-table-column align="center" label="Date" width="220">
<template slot-scope="scope">
<i class="el-icon-time" />
<span>{{ scope.row.display_time }}</span>
</template>
</el-table-column>
</el-table>
</div>
</template>
<script>
import { fetchList } from '@/api/article'
export default {
name: 'ExportZip',
data() {
return {
list: null,
listLoading: true,
downloadLoading: false,
filename: ''
}
},
created() {
this.fetchData()
},
methods: {
async fetchData() {
this.listLoading = true
const { data } = await fetchList()
this.list = data.items
this.listLoading = false
},
handleDownload() {
this.downloadLoading = true
import('@/vendor/Export2Zip').then(zip => {
const tHeader = ['Id', 'Title', 'Author', 'Readings', 'Date']
const filterVal = ['id', 'title', 'author', 'pageviews', 'display_time']
const list = this.list
const data = this.formatJson(filterVal, list)
zip.export_txt_to_zip(tHeader, data, this.filename, this.filename)
this.downloadLoading = false
})
},
formatJson(filterVal, jsonData) {
return jsonData.map(v => filterVal.map(j => v[j]))
}
}
}
</script>

View File

@ -18,13 +18,13 @@ const port = process.env.port || process.env.npm_config_port || 9527 // dev port
// All configuration item explanations can be find in https://cli.vuejs.org/config/
module.exports = {
/**
* You will need to set publicPath if you plan to deploy your site under a sub path,
* for example GitHub Pages. If you plan to deploy your site to https://foo.github.io/bar/,
* then publicPath should be set to "/bar/".
* In most cases please use '/' !!!
* You will need to set publicPath if you plan to deploy your site under a sub path,
* for example GitHub Pages. If you plan to deploy your site to https://foo.github.io/bar/,
* then publicPath should be set to "/bar/".
* In most cases please use '/' !!!
* Detail: https://cli.vuejs.org/config/#publicpath
*/
publicPath: '/',
publicPath: '/bwhse',
outputDir: 'dist',
assetsDir: 'static',
lintOnSave: process.env.NODE_ENV === 'development',