*/ | */ | ||||
export function getRolePermission(id) { | export function getRolePermission(id) { | ||||
return request({ | return request({ | ||||
url: `/role/getPermissionList/${id}`, | |||||
url: `/role/getMenuList/${id}`, | |||||
method: 'GET' | method: 'GET' | ||||
}) | }) | ||||
} | } |
} | } | ||||
// 处理数据结构 | // 处理数据结构 | ||||
const resultInfo = res[listField] ? res[listField] : res | const resultInfo = res[listField] ? res[listField] : res | ||||
dataSourceRef.value = dataType === 'tree' ? dealTree(resultInfo) : resultInfo | |||||
dataSourceRef.value = dataType === 'tree' ? dealTree(resultInfo.data) : resultInfo | |||||
setPagination({ | setPagination({ | ||||
[pageField]: currentPage, | [pageField]: currentPage, | ||||
[totalField]: Math.ceil(resultTotal / pageSize) | [totalField]: Math.ceil(resultTotal / pageSize) |
return { | return { | ||||
...props.options, | ...props.options, | ||||
width: props.options.width || 600, | width: props.options.width || 600, | ||||
preset: props.options.preset || 'card', | |||||
preset: props.options.preset || 'dialog', | |||||
showIcon: !!props.options.showIcon | showIcon: !!props.options.showIcon | ||||
} | } | ||||
}) | }) | ||||
// styL = +sty.left.replace(/\px/g, '') | // styL = +sty.left.replace(/\px/g, '') | ||||
// styT = +sty.top.replace(/\px/g, '') | // styT = +sty.top.replace(/\px/g, '') | ||||
// } | // } | ||||
// document.onmousemove = function(e) { | // document.onmousemove = function(e) { | ||||
// // 计算移动的距离 | // // 计算移动的距离 | ||||
// const l = e.clientX - disX | // const l = e.clientX - disX |
{ | { | ||||
path: '/system', | path: '/system', | ||||
component: Layout, | component: Layout, | ||||
redirect: '/system/menu', | |||||
redirect: '/system/user', | |||||
name: 'System', | name: 'System', | ||||
title: '系统管理', | title: '系统管理', | ||||
meta: { | meta: { | ||||
title: '系统管理' | title: '系统管理' | ||||
}, | }, | ||||
children: [ | children: [ | ||||
{ | |||||
path: 'user', | |||||
component: () => import('@/views/system/user/index.vue'), | |||||
name: 'SystemUser', | |||||
title: '用户管理', | |||||
meta: { | |||||
title: '用户管理' | |||||
} | |||||
}, | |||||
{ | |||||
path: 'role', | |||||
component: () => import('@/views/system/role/index.vue'), | |||||
name: 'SystemRole', | |||||
title: '角色管理', | |||||
meta: { | |||||
title: '角色管理' | |||||
} | |||||
}, | |||||
{ | |||||
path: 'dept', | |||||
component: () => import('@/views/system/dept/index.vue'), | |||||
name: 'SystemDept', | |||||
title: '部门管理', | |||||
meta: { | |||||
title: '部门管理' | |||||
} | |||||
}, | |||||
{ | { | ||||
path: 'menu', | path: 'menu', | ||||
component: () => import('@/views/system/menu/index.vue'), | component: () => import('@/views/system/menu/index.vue'), |
try { | try { | ||||
const res = await getMenu() | const res = await getMenu() | ||||
if (res.code === 0) { | if (res.code === 0) { | ||||
// const result = dataArrayToRoutes(res.data) | |||||
// this.accessRoutes = result | |||||
// return Promise.resolve(result) | |||||
this.accessRoutes = router | |||||
return Promise.resolve(router) | |||||
const result = dataArrayToRoutes(res.data) | |||||
this.accessRoutes = result | |||||
return Promise.resolve(result) | |||||
// this.accessRoutes = router | |||||
// return Promise.resolve(router) | |||||
} else { | } else { | ||||
return Promise.reject(res.message) | return Promise.reject(res.message) | ||||
} | } |
{ label: '日常巡检', value: 0 }, | { label: '日常巡检', value: 0 }, | ||||
{ label: '应急巡检', value: 1 } | { label: '应急巡检', value: 1 } | ||||
] | ] | ||||
export const QUESTION_TYPE = [ | |||||
{ label: '林场问题图斑', value: 1 }, | |||||
{ label: '病虫树', value: 2 }, | |||||
{ label: '人员活动', value: 3 }, | |||||
{ label: '火灾隐患', value: 4 } | |||||
] |
<template> | |||||
<div> | |||||
问题分布 | |||||
</div> | |||||
</template> | |||||
<script> | |||||
export default { | |||||
name: 'QuestionDistribution', | |||||
setup() { | |||||
} | |||||
} | |||||
</script> | |||||
<style scoped lang='scss'> | |||||
</style> |
<template> | |||||
<div> | |||||
问题列表 | |||||
</div> | |||||
</template> | |||||
<script> | |||||
export default { | |||||
name: 'QuestionList', | |||||
setup() { | |||||
} | |||||
} | |||||
</script> | |||||
<style scoped lang='scss'> | |||||
</style> |
<template> | |||||
<div> | |||||
全部报告 | |||||
</div> | |||||
</template> | |||||
<script> | |||||
export default { | |||||
name: 'AllReport', | |||||
setup() { | |||||
} | |||||
} | |||||
</script> | |||||
<style scoped lang='scss'> | |||||
</style> |
<template> | <template> | ||||
<n-drawer v-bind="getDrawerOptions" @update:show="handleDrawerColse"> | <n-drawer v-bind="getDrawerOptions" @update:show="handleDrawerColse"> | ||||
<n-drawer-content closable title="问题核实"> | |||||
问题核实 | |||||
<n-drawer-content closable title="疑似问题核实"> | |||||
<QuestionPage /> | |||||
</n-drawer-content> | </n-drawer-content> | ||||
</n-drawer> | </n-drawer> | ||||
</template> | </template> | ||||
<script> | <script> | ||||
import { h, defineComponent, computed, reactive, toRefs } from 'vue' | |||||
import QuestionPage from '@/views/task-manage/question/index.vue' | |||||
import { defineComponent, computed, reactive, toRefs } from 'vue' | |||||
export default defineComponent({ | export default defineComponent({ | ||||
name: 'LiveDrawer', | name: 'LiveDrawer', | ||||
components: { QuestionPage }, | |||||
props: { | props: { | ||||
/* 可见 */ | /* 可见 */ | ||||
visible: { | visible: { | ||||
'update:visible': null | 'update:visible': null | ||||
}, | }, | ||||
setup(props, { emit }) { | setup(props, { emit }) { | ||||
const data = reactive({ | |||||
}) | |||||
const data = reactive({}) | |||||
/* 获取抽屉的信息 */ | /* 获取抽屉的信息 */ | ||||
const getDrawerOptions = computed(() => { | const getDrawerOptions = computed(() => { |
<template> | <template> | ||||
<div> | <div> | ||||
<n-card> | <n-card> | ||||
<headSearch :info="search" /> | |||||
<data-table | |||||
<HeadSearch :info="search" /> | |||||
<DataTable | |||||
ref="tableRef" | ref="tableRef" | ||||
:columns="columns" | :columns="columns" | ||||
:data="data" | :data="data" | ||||
确认要删除选中数据吗? | 确认要删除选中数据吗? | ||||
</n-popconfirm> --> | </n-popconfirm> --> | ||||
</template> | </template> | ||||
</data-table> | |||||
</DataTable> | |||||
</n-card> | </n-card> | ||||
</div> | </div> | ||||
</template> | </template> | ||||
<script> | <script> | ||||
import headSearch from '@/components/Search/index.vue' | |||||
import table from './tools/table.js' | import table from './tools/table.js' | ||||
import search from './tools/search.js' | import search from './tools/search.js' | ||||
import dataTable from '@/components/DataTable/index.vue' | |||||
import HeadSearch from '@/components/Search/index.vue' | |||||
import DataTable from '@/components/DataTable/index.vue' | |||||
import TaskModal from './components/TaskModal.vue' | import TaskModal from './components/TaskModal.vue' | ||||
import LiveDrawer from './components/LiveDrawer.vue' | import LiveDrawer from './components/LiveDrawer.vue' | ||||
import DemandDrawer from './components/DemandDrawer.vue' | import DemandDrawer from './components/DemandDrawer.vue' | ||||
export default { | export default { | ||||
name: 'TaskAll', | name: 'TaskAll', | ||||
components: { headSearch, dataTable, TaskModal, LiveDrawer, DemandDrawer, VerifyDrawer }, | |||||
components: { HeadSearch, DataTable, TaskModal, LiveDrawer, DemandDrawer, VerifyDrawer }, | |||||
setup() { | setup() { | ||||
const data = reactive({ | const data = reactive({ | ||||
search, | |||||
...toRefs(table), | ...toRefs(table), | ||||
data: [{}], | |||||
search | |||||
data: [{}] | |||||
}) | }) | ||||
/** | /** |
<template> | |||||
<Modal | |||||
:options="getModalOptions" | |||||
:on-positive-click="handleConfirm" | |||||
:on-negative-click="handleIgnore" | |||||
:on-close="handleClose" | |||||
> | |||||
<template #Context> | |||||
<div class="carousel__flex"> | |||||
<n-icon size="26" color="#8A8A8A"> | |||||
<LeftOutlined @click="handleCarousel('prev')" /> | |||||
</n-icon> | |||||
<div class="carousel__container"> | |||||
<label>问题描述</label> | |||||
<n-carousel ref="carouselRef" :show-dots="false"> | |||||
<img | |||||
v-for="item in getCarouselInfo" | |||||
:key="item.id" | |||||
class="carousel-img" | |||||
:src="item.image" | |||||
> | |||||
</n-carousel> | |||||
</div> | |||||
<n-icon size="26" color="#8A8A8A"> | |||||
<RightOutlined @click="handleCarousel('next')" /> | |||||
</n-icon> | |||||
</div> | |||||
<div class="modal-form"> | |||||
<label>问题类型</label> | |||||
<n-select | |||||
v-model:value="selectType" | |||||
:options="QUESTION_TYPE" | |||||
/> | |||||
</div> | |||||
</template> | |||||
</Modal> | |||||
</template> | |||||
<script> | |||||
import { QUESTION_TYPE } from '@/utils/dictionary.js' | |||||
import { LeftOutlined, RightOutlined } from '@vicons/antd' | |||||
import Modal from '@/components/Modal/index.vue' | |||||
import { defineComponent, computed, ref, reactive, toRefs } from 'vue' | |||||
export default defineComponent({ | |||||
name: 'UserModal', | |||||
components: { Modal, LeftOutlined, RightOutlined }, | |||||
props: { | |||||
visible: { | |||||
type: Boolean, | |||||
default: false | |||||
}, | |||||
data: { | |||||
type: Array, | |||||
default: () => null | |||||
} | |||||
}, | |||||
emits: { | |||||
'update:visible': null, | |||||
'update-data': null, | |||||
'done': null | |||||
}, | |||||
setup(props, { emit }) { | |||||
const formRef = ref() | |||||
const data = reactive({ | |||||
selectRow: props.data[0], | |||||
selectType: props.data[0].type, | |||||
QUESTION_TYPE | |||||
}) | |||||
/* 获取弹窗的属性 */ | |||||
const getModalOptions = computed(() => { | |||||
return { | |||||
show: props.visible, | |||||
title: '问题确认', | |||||
width: 700, | |||||
negativeText: '忽略', | |||||
positiveText: '确认' | |||||
} | |||||
}) | |||||
const getCarouselInfo = computed(() => { | |||||
return props.data | |||||
}) | |||||
const carouselRef = ref(null) | |||||
function handleCarousel(type) { | |||||
const currentIndex = carouselRef.value.getCurrentIndex() | |||||
switch (type) { | |||||
case 'prev': | |||||
if (currentIndex !== 0) { | |||||
carouselRef.value.prev() | |||||
data.selectRow = props.data[currentIndex - 1] | |||||
data.selectType = props.data[currentIndex - 1].type | |||||
} | |||||
break | |||||
case 'next': | |||||
if (currentIndex !== props.data.length - 1) { | |||||
carouselRef.value.next() | |||||
data.selectRow = props.data[currentIndex + 1] | |||||
data.selectType = props.data[currentIndex + 1].type | |||||
} | |||||
break | |||||
} | |||||
} | |||||
/** | |||||
* @description: 保存 | |||||
* @return {*} | |||||
*/ | |||||
const handleConfirm = () => { | |||||
emit('update-data') | |||||
} | |||||
const handleIgnore = () => { | |||||
} | |||||
/* 关闭弹窗 */ | |||||
const handleClose = () => { | |||||
emit('update:visible', false) | |||||
} | |||||
return { | |||||
...toRefs(data), | |||||
formRef, | |||||
getModalOptions, | |||||
getCarouselInfo, | |||||
carouselRef, | |||||
handleCarousel, | |||||
handleConfirm, | |||||
handleIgnore, | |||||
handleClose | |||||
} | |||||
} | |||||
}) | |||||
</script> | |||||
<style scoped lang='scss'> | |||||
.carousel__flex{ | |||||
display: flex; | |||||
align-items: center; | |||||
justify-content: space-between; | |||||
.carousel__container{ | |||||
width: calc(100% - 100px); | |||||
display: flex; | |||||
margin-right: 40px; | |||||
label{ | |||||
width: 70px; | |||||
flex-shrink: 0; | |||||
} | |||||
} | |||||
.n-icon{ | |||||
cursor: pointer; | |||||
} | |||||
.carousel-img{ | |||||
width: 100%; | |||||
height: 280px; | |||||
object-fit: cover | |||||
} | |||||
} | |||||
.modal-form{ | |||||
width: calc(100% - 60px); | |||||
display: flex; | |||||
align-items: center; | |||||
margin: 20px auto 0; | |||||
label{ | |||||
width: 70px; | |||||
flex-shrink: 0; | |||||
} | |||||
.n-select{ | |||||
width: 300px; | |||||
} | |||||
} | |||||
</style> |
<template> | |||||
<HeadSearch :info="search" /> | |||||
<DataTable | |||||
ref="tableRef" | |||||
:columns="columns" | |||||
:row-key="(row) => row.id" | |||||
:data="data" | |||||
size="large" | |||||
scroll-x="1200" | |||||
@fetch-success="getTableData" | |||||
@update:checked-row-keys="handleRowsCheck" | |||||
> | |||||
<template #tableTitle> | |||||
<n-button @click="handleIgnoreBatch">忽略</n-button> | |||||
<n-button type="primary" @click="handleConfirmBatch"> | |||||
确认 | |||||
</n-button> | |||||
</template> | |||||
</DataTable> | |||||
<ConfirmModal v-if="confirmModal" v-model:visible="confirmModal" :data="pageData" @update-data="tableReload" /> | |||||
</template> | |||||
<script> | |||||
import table from './tools/table.js' | |||||
import search from './tools/search.js' | |||||
import HeadSearch from '@/components/Search/index.vue' | |||||
import DataTable from '@/components/DataTable/index.vue' | |||||
import ConfirmModal from './components/ConfirmModal.vue' | |||||
import { h, computed, ref, reactive, toRefs } from 'vue' | |||||
export default { | |||||
name: 'QuestionPage', | |||||
components: { HeadSearch, DataTable, ConfirmModal }, | |||||
setup() { | |||||
const data = reactive({ | |||||
search, | |||||
...toRefs(table), | |||||
data: [ | |||||
{ id: 1, image: 'https://naive-ui.oss-cn-beijing.aliyuncs.com/carousel-img/carousel1.jpeg', type: 1 }, | |||||
{ id: 2, image: 'https://naive-ui.oss-cn-beijing.aliyuncs.com/carousel-img/carousel2.jpeg', type: 2 } | |||||
], | |||||
pageData: [] | |||||
}) | |||||
/** | |||||
* @description: | |||||
* @return {*} | |||||
*/ | |||||
function getTableData(list) { | |||||
data.pageData = list | |||||
} | |||||
/** | |||||
* @description: 选中行的rowkey | |||||
* @param {*} rowKeys | |||||
* @return {*} | |||||
*/ | |||||
function handleRowsCheck(rowKeys) { | |||||
console.log(rowKeys) | |||||
} | |||||
function handleIgnoreBatch() { | |||||
} | |||||
function handleConfirmBatch() { | |||||
} | |||||
const tableRef = ref() | |||||
/* 刷新表格数据 */ | |||||
function tableReload(res) { | |||||
const _params = { | |||||
...res | |||||
} | |||||
tableRef.value.reFetch(_params) | |||||
} | |||||
return { | |||||
...toRefs(data), | |||||
tableRef, | |||||
getTableData, | |||||
handleRowsCheck, | |||||
handleIgnoreBatch, | |||||
handleConfirmBatch, | |||||
tableReload | |||||
} | |||||
} | |||||
} | |||||
</script> | |||||
<style scoped lang='scss'> | |||||
</style> |
import { reactive } from 'vue' | |||||
import { QUESTION_TYPE } from '@/utils/dictionary.js' | |||||
const data = reactive([ | |||||
{ | |||||
label: '任务状态', | |||||
key: 'status', | |||||
type: 'select', | |||||
value: 'all', | |||||
props: { | |||||
placeholder: '请选择任务状态', | |||||
options: [ | |||||
{ label: '全部', value: 'all' }, | |||||
...QUESTION_TYPE | |||||
] | |||||
} | |||||
} | |||||
]) | |||||
export default data | |||||
// import TableTags from '@/components/DataTable/tools/Tags.vue' | |||||
import TableImage from '@/components/DataTable/tools/Image.vue' | |||||
import TableAction from '@/components/DataTable/tools/Action.vue' | |||||
import { h, reactive } from 'vue' | |||||
/* 问题忽略 */ | |||||
function handleRowIgnore(row) { | |||||
data.rowData = row | |||||
console.log('问题忽略') | |||||
} | |||||
/* 问题确认 */ | |||||
function handleRowConfirm(row) { | |||||
data.rowData = row | |||||
console.log('问题确认') | |||||
} | |||||
function handleImgPreview() { | |||||
data.confirmModal = true | |||||
} | |||||
const data = reactive({ | |||||
rowData: {}, | |||||
confirmModal: false, | |||||
columns: [ | |||||
{ | |||||
type: 'selection' | |||||
}, | |||||
{ | |||||
title: '序号', | |||||
key: 'name', | |||||
align: 'center' | |||||
}, | |||||
{ | |||||
title: '问题类型', | |||||
key: 'name', | |||||
align: 'center' | |||||
}, | |||||
{ | |||||
title: '问题图片', | |||||
key: 'image', | |||||
align: 'center', | |||||
render(row) { | |||||
return h(TableImage, { | |||||
images: { | |||||
width: 36, | |||||
height: 36, | |||||
src: row.image, | |||||
previewDisabled: true, | |||||
onClick: handleImgPreview.bind(null, row) | |||||
} | |||||
}) | |||||
} | |||||
}, | |||||
{ | |||||
title: '经纬度', | |||||
key: 'name', | |||||
align: 'center' | |||||
}, | |||||
{ | |||||
title: '位置', | |||||
key: 'name', | |||||
align: 'center' | |||||
}, | |||||
{ | |||||
title: '备注', | |||||
key: 'name', | |||||
align: 'center' | |||||
}, | |||||
{ | |||||
title: '状态', | |||||
key: 'name', | |||||
align: 'center' | |||||
}, | |||||
{ | |||||
title: '操作', | |||||
align: 'center', | |||||
width: 150, | |||||
fixed: 'right', | |||||
render(row) { | |||||
return h(TableAction, { | |||||
actions: [ | |||||
{ | |||||
label: '忽略', | |||||
type: 'popconfirm', | |||||
tip: '是否忽略该数据?', | |||||
props: { | |||||
onClick: handleRowIgnore.bind(null, row) | |||||
}, | |||||
ButtonProps: { | |||||
text: true, | |||||
type: 'primary' | |||||
}, | |||||
auth: 'basic_list' | |||||
}, | |||||
{ | |||||
label: '确认', | |||||
type: 'popconfirm', | |||||
tip: '是否确认该数据?', | |||||
props: { | |||||
onClick: handleRowConfirm.bind(null, row) | |||||
}, | |||||
ButtonProps: { | |||||
text: true, | |||||
type: 'primary' | |||||
}, | |||||
auth: 'basic_list' | |||||
} | |||||
], | |||||
align: 'center' | |||||
}) | |||||
} | |||||
} | |||||
] | |||||
}) | |||||
export default data |