@@ -77,7 +77,7 @@ export function deleteRole(data) { | |||
*/ | |||
export function getRolePermission(id) { | |||
return request({ | |||
url: `/role/getPermissionList/${id}`, | |||
url: `/role/getMenuList/${id}`, | |||
method: 'GET' | |||
}) | |||
} |
@@ -45,7 +45,7 @@ export function useDataSource(propsRef, { getPaginationInfo, setPagination, setL | |||
} | |||
// 处理数据结构 | |||
const resultInfo = res[listField] ? res[listField] : res | |||
dataSourceRef.value = dataType === 'tree' ? dealTree(resultInfo) : resultInfo | |||
dataSourceRef.value = dataType === 'tree' ? dealTree(resultInfo.data) : resultInfo | |||
setPagination({ | |||
[pageField]: currentPage, | |||
[totalField]: Math.ceil(resultTotal / pageSize) |
@@ -34,7 +34,7 @@ export default defineComponent({ | |||
return { | |||
...props.options, | |||
width: props.options.width || 600, | |||
preset: props.options.preset || 'card', | |||
preset: props.options.preset || 'dialog', | |||
showIcon: !!props.options.showIcon | |||
} | |||
}) | |||
@@ -66,7 +66,6 @@ export default defineComponent({ | |||
// styL = +sty.left.replace(/\px/g, '') | |||
// styT = +sty.top.replace(/\px/g, '') | |||
// } | |||
// document.onmousemove = function(e) { | |||
// // 计算移动的距离 | |||
// const l = e.clientX - disX |
@@ -24,13 +24,40 @@ export default [ | |||
{ | |||
path: '/system', | |||
component: Layout, | |||
redirect: '/system/menu', | |||
redirect: '/system/user', | |||
name: 'System', | |||
title: '系统管理', | |||
meta: { | |||
title: '系统管理' | |||
}, | |||
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', | |||
component: () => import('@/views/system/menu/index.vue'), |
@@ -114,11 +114,11 @@ export const usePermissionStore = defineStore('permission', { | |||
try { | |||
const res = await getMenu() | |||
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 { | |||
return Promise.reject(res.message) | |||
} |
@@ -13,3 +13,10 @@ export const TASK_TYPE = [ | |||
{ label: '日常巡检', value: 0 }, | |||
{ label: '应急巡检', value: 1 } | |||
] | |||
export const QUESTION_TYPE = [ | |||
{ label: '林场问题图斑', value: 1 }, | |||
{ label: '病虫树', value: 2 }, | |||
{ label: '人员活动', value: 3 }, | |||
{ label: '火灾隐患', value: 4 } | |||
] |
@@ -0,0 +1,17 @@ | |||
<template> | |||
<div> | |||
问题分布 | |||
</div> | |||
</template> | |||
<script> | |||
export default { | |||
name: 'QuestionDistribution', | |||
setup() { | |||
} | |||
} | |||
</script> | |||
<style scoped lang='scss'> | |||
</style> |
@@ -0,0 +1,17 @@ | |||
<template> | |||
<div> | |||
问题列表 | |||
</div> | |||
</template> | |||
<script> | |||
export default { | |||
name: 'QuestionList', | |||
setup() { | |||
} | |||
} | |||
</script> | |||
<style scoped lang='scss'> | |||
</style> |
@@ -0,0 +1,17 @@ | |||
<template> | |||
<div> | |||
全部报告 | |||
</div> | |||
</template> | |||
<script> | |||
export default { | |||
name: 'AllReport', | |||
setup() { | |||
} | |||
} | |||
</script> | |||
<style scoped lang='scss'> | |||
</style> |
@@ -1,16 +1,18 @@ | |||
<template> | |||
<n-drawer v-bind="getDrawerOptions" @update:show="handleDrawerColse"> | |||
<n-drawer-content closable title="问题核实"> | |||
问题核实 | |||
<n-drawer-content closable title="疑似问题核实"> | |||
<QuestionPage /> | |||
</n-drawer-content> | |||
</n-drawer> | |||
</template> | |||
<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({ | |||
name: 'LiveDrawer', | |||
components: { QuestionPage }, | |||
props: { | |||
/* 可见 */ | |||
visible: { | |||
@@ -27,9 +29,7 @@ export default defineComponent({ | |||
'update:visible': null | |||
}, | |||
setup(props, { emit }) { | |||
const data = reactive({ | |||
}) | |||
const data = reactive({}) | |||
/* 获取抽屉的信息 */ | |||
const getDrawerOptions = computed(() => { |
@@ -1,8 +1,8 @@ | |||
<template> | |||
<div> | |||
<n-card> | |||
<headSearch :info="search" /> | |||
<data-table | |||
<HeadSearch :info="search" /> | |||
<DataTable | |||
ref="tableRef" | |||
:columns="columns" | |||
:data="data" | |||
@@ -23,7 +23,7 @@ | |||
确认要删除选中数据吗? | |||
</n-popconfirm> --> | |||
</template> | |||
</data-table> | |||
</DataTable> | |||
</n-card> | |||
</div> | |||
@@ -39,10 +39,10 @@ | |||
</template> | |||
<script> | |||
import headSearch from '@/components/Search/index.vue' | |||
import table from './tools/table.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 LiveDrawer from './components/LiveDrawer.vue' | |||
import DemandDrawer from './components/DemandDrawer.vue' | |||
@@ -51,12 +51,12 @@ import { h, unref, ref, toRefs, reactive } from 'vue' | |||
export default { | |||
name: 'TaskAll', | |||
components: { headSearch, dataTable, TaskModal, LiveDrawer, DemandDrawer, VerifyDrawer }, | |||
components: { HeadSearch, DataTable, TaskModal, LiveDrawer, DemandDrawer, VerifyDrawer }, | |||
setup() { | |||
const data = reactive({ | |||
search, | |||
...toRefs(table), | |||
data: [{}], | |||
search | |||
data: [{}] | |||
}) | |||
/** |
@@ -0,0 +1,175 @@ | |||
<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> |
@@ -0,0 +1,94 @@ | |||
<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> |
@@ -0,0 +1,21 @@ | |||
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 | |||
@@ -0,0 +1,119 @@ | |||
// 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 |