新加功能:生产计划、资源管理、进度跟踪、资源调度、工程日志、施工报告、实名制、安全教育、施工机械、运输车辆管理

main
junhong 2 weeks ago
parent 250497377b
commit f2899f62a7
  1. 6
      folder-alias.json
  2. 2
      package.json
  3. 4
      web/.env.development
  4. 4
      web/.env.production
  5. 4
      web/.env.staging
  6. 2
      web/README.md
  7. 32
      web/folder-alias.json
  8. 2
      web/index.html
  9. 2
      web/package.json
  10. BIN
      web/src/assets/font/方正魏碑简体.TTF
  11. BIN
      web/src/assets/images/loginbj.png
  12. BIN
      web/src/assets/images/loginpass.png
  13. BIN
      web/src/assets/images/loginuser.png
  14. BIN
      web/src/assets/images/profile.jpg
  15. 9
      web/src/assets/styles/index.scss
  16. 2
      web/src/assets/styles/variables.module.scss
  17. 66
      web/src/components-zbry/BaseControl/BaseControl.vue
  18. 3
      web/src/components-zbry/BaseTablePage/BaseTablePage.vue
  19. 47
      web/src/components/HeaderSearch/index.vue
  20. 15
      web/src/layout/components/Navbar.vue
  21. 2
      web/src/layout/components/Sidebar/Logo.vue
  22. 2
      web/src/layout/components/Topbar/Logo.vue
  23. 2
      web/src/layout/components/Topbar/index.vue
  24. 26
      web/src/router/index.js
  25. 54
      web/src/router/routes.js
  26. 4
      web/src/store/modules/user.js
  27. 66
      web/src/views/constructionScheduling/construction-report/api.js
  28. 115
      web/src/views/constructionScheduling/construction-report/index.vue
  29. 235
      web/src/views/constructionScheduling/construction-report/options.js
  30. 66
      web/src/views/constructionScheduling/engineering-log/api.js
  31. 75
      web/src/views/constructionScheduling/engineering-log/index.vue
  32. 223
      web/src/views/constructionScheduling/engineering-log/options.js
  33. 56
      web/src/views/constructionScheduling/production-plan/api.js
  34. 72
      web/src/views/constructionScheduling/production-plan/index.vue
  35. 251
      web/src/views/constructionScheduling/production-plan/options.js
  36. 66
      web/src/views/constructionScheduling/progress-tracking/api.js
  37. 112
      web/src/views/constructionScheduling/progress-tracking/index.vue
  38. 54
      web/src/views/constructionScheduling/progress-tracking/options.js
  39. 98
      web/src/views/constructionScheduling/resource-management/api.js
  40. 128
      web/src/views/constructionScheduling/resource-management/index.vue
  41. 286
      web/src/views/constructionScheduling/resource-management/options.js
  42. 66
      web/src/views/constructionScheduling/resource-scheduling/api.js
  43. 110
      web/src/views/constructionScheduling/resource-scheduling/index.vue
  44. 94
      web/src/views/constructionScheduling/resource-scheduling/options.js
  45. 246
      web/src/views/login.vue
  46. 2
      web/src/views/register.vue
  47. 51
      web/src/views/sitePersonnel/realName/api.js
  48. 66
      web/src/views/sitePersonnel/realName/index.vue
  49. 155
      web/src/views/sitePersonnel/realName/options.js
  50. 66
      web/src/views/sitePersonnel/safety-education/api.js
  51. 65
      web/src/views/sitePersonnel/safety-education/index.vue
  52. 69
      web/src/views/sitePersonnel/safety-education/options.js
  53. 4
      web/src/views/system/role/options.js
  54. 4
      web/src/views/system/user/profile/userAvatar.vue
  55. 66
      web/src/views/vehicleMachinery/car-manage/api.js
  56. 89
      web/src/views/vehicleMachinery/car-manage/index.vue
  57. 43
      web/src/views/vehicleMachinery/car-manage/options.js
  58. 66
      web/src/views/vehicleMachinery/construction-achinery/api.js
  59. 89
      web/src/views/vehicleMachinery/construction-achinery/index.vue
  60. 63
      web/src/views/vehicleMachinery/construction-achinery/options.js
  61. 415
      web/stats.html
  62. 4
      web/vite.config.js

@ -7,5 +7,11 @@
},
"server/form": {
"description": "流程表单配置"
},
"web/src/views/sitePersonnel": {
"description": "现场人员管理"
},
"web/src/views/sitePersonnel/realName": {
"description": "实名制与信息管理"
}
}

@ -1,7 +1,7 @@
{
"name": "zilber-admin",
"version": "1.0.0",
"description": "致博后台管理系统",
"description": "智慧工地管理系统",
"author": "ChengYu",
"license": "MIT",
"scripts": {

@ -1,10 +1,10 @@
# 页面标题
VITE_APP_TITLE = 致博管理系统
VITE_APP_TITLE = 智慧工地管理系统
# 开发环境配置
VITE_APP_ENV = 'development'
# 致博管理系统/开发环境
# 智慧工地管理系统/开发环境
VITE_APP_BASE_API = '/dev-api'
# 开发环境-NODE-工作流接口
VITE_APP_BASE_PROCESS_API = 'http://127.0.0.1:3095/process'

@ -1,10 +1,10 @@
# 页面标题
VITE_APP_TITLE = 致博管理系统
VITE_APP_TITLE = 智慧工地管理系统
# 生产环境配置
VITE_APP_ENV = 'production'
# 致博管理系统/生产环境
# 智慧工地管理系统/生产环境
#VITE_APP_BASE_API = 'http://39.100.74.100:8080'
VITE_APP_BASE_API = 'http://127.0.0.1:3095/ry'
# 生产环境-NODE-工作流接口

@ -1,10 +1,10 @@
# 页面标题
VITE_APP_TITLE = 致博管理系统
VITE_APP_TITLE = 智慧工地管理系统
# 生产环境配置
VITE_APP_ENV = 'staging'
# 致博管理系统/生产环境
# 智慧工地管理系统/生产环境
VITE_APP_BASE_API = '/stage-api'
# 生产环境-NODE-工作流接口
VITE_APP_BASE_PROCESS_API = 'http://127.0.0.1:3095/process'

@ -1,4 +1,4 @@
## 说明
基于致博的致博后台管理系统模板
基于致博的智慧工地管理系统模板
## 使用文档
[文档地址](https://www.zilber.cn/doc/rp/)

@ -0,0 +1,32 @@
{
"src/views/constructionScheduling/construction-report": {
"description": "施工报告"
},
"src/views/constructionScheduling/engineering-log": {
"description": "工程日志"
},
"src/views/constructionScheduling/resource-scheduling": {
"description": "资源调度"
},
"src/views/constructionScheduling/production-plan": {
"description": "生产计划"
},
"src/views/constructionScheduling/progress-tracking": {
"description": "进度跟踪"
},
"src/views/sitePersonnel/safety-education": {
"description": "安全教育"
},
"src/views/sitePersonnel/realName": {
"description": "实名制与信息管理"
},
"src/views/vehicleMachinery/car-manage": {
"description": "运输车辆管理"
},
"src/views/vehicleMachinery/construction-achinery": {
"description": "施工机械管理"
},
"src/views/constructionScheduling/resource-management": {
"description": "资源管理"
}
}

@ -7,7 +7,7 @@
<meta name="renderer" content="webkit">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<link rel="icon" href="/favicon.ico">
<title>致博管理系统</title>
<title>智慧工地管理系统</title>
<!--[if lt IE 11]><script>window.location.href='/html/ie.html';</script><![endif]-->
<style>
html,

@ -1,7 +1,7 @@
{
"name": "zilber-admin",
"version": "1.0.0",
"description": "致博后台管理系统",
"description": "智慧工地管理系统",
"author": "ChengYu",
"license": "MIT",
"scripts": {

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 621 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 686 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 79 KiB

After

Width:  |  Height:  |  Size: 140 KiB

@ -6,6 +6,13 @@
@import './btn.scss';
@import './ruoyi.scss';
@font-face {
font-family: 'Alibaba-PuHuiTi-Heavy';
src: url('../font/方正魏碑简体.TTF') format('truetype');
font-weight: normal;
font-style: normal;
}
body {
height: 100%;
margin: 0;
@ -14,6 +21,7 @@ body {
text-rendering: optimizeLegibility;
font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Arial, sans-serif;
}
/* 整个滚动条 */
::-webkit-scrollbar {
width: .3125rem;
@ -26,6 +34,7 @@ body {
background: #A8A8A8;
border-radius: 0.75rem 0.75rem 0.75rem 0.75rem;
}
label {
font-weight: 700;
}

@ -42,7 +42,7 @@ $--color-warning: #E6A23C;
$--color-danger: #F56C6C;
$--color-info: #909399;
$base-sidebar-width: 200px;
$base-sidebar-width: 240px;
// the :export directive is the magic sauce for webpack
// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass

@ -64,6 +64,10 @@ export default {
type: Boolean,
default: false,
},
addBtnName: {
type: String,
default: '新增',
},
},
methods: {
handleAdd() {
@ -92,66 +96,28 @@ export default {
<el-row :gutter="10" class="mb8">
<slot name="beforeTop"></slot>
<el-col :span="1.5" v-if="showAdd">
<el-button
type="primary"
plain
icon="Plus"
@click="handleAdd"
v-hasPermi="[permission.add]"
>新增</el-button
>
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="[permission.add]">{{
addBtnName ? addBtnName : "新增"
}}</el-button>
</el-col>
<el-col :span="1.5" v-if="showEdit">
<el-button
type="success"
plain
icon="Edit"
:disabled="single"
@click="handleEdit"
v-hasPermi="[permission.edit]"
>修改</el-button
>
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleEdit"
v-hasPermi="[permission.edit]">修改</el-button>
</el-col>
<el-col :span="1.5" v-if="showDelete">
<el-button
type="danger"
plain
icon="Delete"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="[permission.delete]"
>删除</el-button
>
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete"
v-hasPermi="[permission.delete]">删除</el-button>
</el-col>
<el-col :span="1.5" v-if="showImport">
<el-button
type="info"
plain
icon="Upload"
@click="handleImport"
v-hasPermi="[permission.import]"
>导入</el-button
>
<el-button type="info" plain icon="Upload" @click="handleImport" v-hasPermi="[permission.import]">导入</el-button>
</el-col>
<el-col :span="1.5" v-if="showExport">
<el-button
type="warning"
plain
icon="Download"
@click="handleExport"
v-hasPermi="[permission.export]"
>导出</el-button
>
<el-button type="warning" plain icon="Download" @click="handleExport"
v-hasPermi="[permission.export]">导出</el-button>
</el-col>
<slot name="afterTop"></slot>
<RightToolbar
v-if="hideRightToolbar"
v-model:showSearch="showSearch"
@queryTable="queryTable"
:columns="columns"
:filterOptions="filterOptions"
:showFilter="showFilter"
></RightToolbar>
<RightToolbar v-if="hideRightToolbar" v-model:showSearch="showSearch" @queryTable="queryTable" :columns="columns"
:filterOptions="filterOptions" :showFilter="showFilter"></RightToolbar>
</el-row>
</template>

@ -173,6 +173,7 @@ const doClose = () => {
:showExport="props.tableOptions.showExportBtn"
:showImport="props.tableOptions.showImportBtn"
:permission="props.tableOptions.permission"
:addBtnName="props.tableOptions.addBtnName"
@add="
props.tableOptions.handleAdd
? props.tableOptions.handleAdd()
@ -221,7 +222,7 @@ const doClose = () => {
@selection-change="handleSelectionChange"
@doSelection="doSelection"
>
<el-table-column type="selection" width="50" align="center" />
<el-table-column v-if="!props.tableOptions.hideselection" type="selection" width="50" align="center" />
<slot name="column" :tableData="tableData"></slot>
<slot
name="control"

@ -1,20 +1,15 @@
<template>
<div :class="{ 'show': show }" class="header-search">
<svg-icon class-name="search-icon" icon-class="search" @click.stop="click" />
<el-select
ref="headerSearchSelectRef"
v-model="search"
:remote-method="querySearch"
filterable
default-first-option
remote
placeholder="Search"
class="header-search-select"
@change="change"
>
<el-option v-for="option in options" :key="option.item.path" :value="option.item" :label="option.item.title.join(' > ')" />
<div class="search-box">
<!-- @click.stop="click" -->
<svg-icon class-name="search-icon" icon-class="search" />
<el-select ref="headerSearchSelectRef" v-model="search" :remote-method="querySearch" filterable
default-first-option remote placeholder="Search" class="header-search-select" @change="change">
<el-option v-for="option in options" :key="option.item.path" :value="option.item"
:label="option.item.title.join(' > ')" />
</el-select>
</div>
</div>
</template>
<script setup>
@ -26,7 +21,7 @@ import usePermissionStore from '@/store/modules/permission'
const search = ref('');
const options = ref([]);
const searchPool = ref([]);
const show = ref(false);
const show = ref(true);
const fuse = ref(undefined);
const headerSearchSelectRef = ref(null);
const router = useRouter();
@ -55,9 +50,9 @@ function change(val) {
search.value = ''
options.value = []
nextTick(() => {
show.value = false
})
// nextTick(() => {
// show.value = false
// })
}
function initFuse(list) {
fuse.value = new Fuse(list, {
@ -140,12 +135,25 @@ watch(searchPool, (list) => {
</script>
<style lang='scss' scoped>
.search-box {
background: #fff;
width: 100%;
height: 50px;
padding: 0 20px;
border-radius: 8px;
// border-bottom: 1px solid #333;
}
:deep(.el-input__inner),
:deep(.el-select .el-input.is-focus .el-input__inner) {
box-shadow: none !important;
}
.header-search {
font-size: 0 !important;
.search-icon {
cursor: pointer;
font-size: 18px;
font-size: 16px;
vertical-align: middle;
}
@ -165,7 +173,8 @@ watch(searchPool, (list) => {
padding-left: 0;
padding-right: 0;
box-shadow: none !important;
border-bottom: 1px solid #d9d9d9;
// border-bottom: 1px solid #d9d9d9;
border: none;
vertical-align: middle;
}
}

@ -1,13 +1,14 @@
<template>
<div class="navbar">
<hamburger id="hamburger-container" :is-active="appStore.sidebar.opened" class="hamburger-container" @toggleClick="toggleSideBar" />
<hamburger id="hamburger-container" :is-active="appStore.sidebar.opened" class="hamburger-container"
@toggleClick="toggleSideBar" />
<breadcrumb id="breadcrumb-container" class="breadcrumb-container" v-if="!settingsStore.topNav" />
<top-nav id="topmenu-container" class="topmenu-container" v-if="settingsStore.topNav" />
<div class="right-menu">
<template v-if="appStore.device !== 'mobile'">
<!-- <header-search id="header-search" class="right-menu-item" /> -->
<screenfull id="screenfull" class="right-menu-item hover-effect" />
<header-search id="header-search" class="right-menu-item" />
<!-- <screenfull id="screenfull" class="right-menu-item hover-effect" /> -->
<!-- <el-tooltip content="布局大小" effect="dark" placement="bottom">
<size-select id="size-select" class="right-menu-item hover-effect" />
</el-tooltip> -->
@ -16,6 +17,7 @@
<el-dropdown @command="handleCommand" class="right-menu-item hover-effect" trigger="click">
<div class="avatar-wrapper">
<img :src="userStore.avatar" class="user-avatar" />
<span style="margin: 0 5px;font-size: 14px;">{{ userStore.userinfo.nickName }}</span>
<el-icon><caret-bottom /></el-icon>
</div>
<template #dropdown>
@ -44,7 +46,7 @@ import TopNav from '@/components/TopNav'
import Hamburger from '@/components/Hamburger'
import Screenfull from '@/components/Screenfull'
// import SizeSelect from '@/components/SizeSelect'
// import HeaderSearch from '@/components/HeaderSearch'
import HeaderSearch from '@/components/HeaderSearch'
// import RuoYiGit from '@/components/RuoYi/Git'
// import RuoYiDoc from '@/components/RuoYi/Doc'
import useAppStore from '@/store/modules/app'
@ -159,6 +161,8 @@ function setLayout() {
.avatar-wrapper {
margin-top: 5px;
position: relative;
display: flex;
align-items: center;
.user-avatar {
cursor: pointer;
@ -169,9 +173,6 @@ function setLayout() {
i {
cursor: pointer;
position: absolute;
right: -20px;
top: 25px;
font-size: 12px;
}
}

@ -25,7 +25,7 @@ defineProps({
}
})
const title = ref('致博管理系统');
const title = ref('智慧工地管理系统');
const settingsStore = useSettingsStore();
const sideTheme = computed(() => settingsStore.sideTheme);
</script>

@ -25,7 +25,7 @@ defineProps({
}
})
const title = ref('致博管理系统');
const title = ref('智慧工地管理系统');
const settingsStore = useSettingsStore();
const sideTheme = computed(() => settingsStore.sideTheme);
</script>

@ -1,7 +1,7 @@
<template>
<div class="header">
<img @click="jump(1)" style="width: 2.75rem;cursor: pointer;" src="../../../assets/logo/logo.png" alt="" />
<div @click="jump(1)" class="logotitle" style="cursor: pointer;">致博后台管理系统</div>
<div @click="jump(1)" class="logotitle" style="cursor: pointer;">智慧工地管理系统</div>
<div class="menu-box">
<el-scrollbar :class="sideTheme" wrap-class="scrollbar-wrapper">
<el-menu

@ -36,19 +36,19 @@ export const constantRoutes = [
component: () => import('@/views/error/401'),
hidden: true
},
{
path: '',
component: Layout,
redirect: '/index',
children: [
{
path: '/index',
component: () => import('@/views/index'),
name: 'Index',
meta: { title: '首页', icon: 'dashboard', affix: true }
}
]
},
// {
// path: '',
// component: Layout,
// redirect: '/index',
// children: [
// {
// path: '/index',
// component: () => import('@/views/index'),
// name: 'Index',
// meta: { title: '首页', icon: 'dashboard', affix: true }
// }
// ]
// },
{
path: '/user',
component: Layout,

@ -63,31 +63,31 @@ export default [
}
}]
},
{
name: "demo",
path: "/demo",
hidden: false,
component: "Layout",
meta: {
title: "示例",
icon: "online",
noCache: false,
link: null
},
children: [
{
name: "demoPage",
path: "demoPage",
hidden: false,
component: "demo/demoPage/demoPage",
meta: {
title: "示例页面",
// permission: '',
icon: "online",
noCache: false,
link: null
}
},
]
},
// {
// name: "demo",
// path: "/demo",
// hidden: false,
// component: "Layout",
// meta: {
// title: "示例",
// icon: "online",
// noCache: false,
// link: null
// },
// children: [
// {
// name: "demoPage",
// path: "demoPage",
// hidden: false,
// component: "demo/demoPage/demoPage",
// meta: {
// title: "示例页面",
// // permission: '',
// icon: "online",
// noCache: false,
// link: null
// }
// },
// ]
// },
]

@ -11,7 +11,8 @@ const useUserStore = defineStore(
userId: '',
avatar: '',
roles: [],
permissions: []
permissions: [],
userinfo: {}
}),
actions: {
// 登录
@ -47,6 +48,7 @@ const useUserStore = defineStore(
this.name = user.userName
this.userId = user.userId
this.avatar = avatar;
this.userinfo = user
resolve(res)
}).catch(error => {
reject(error)

@ -0,0 +1,66 @@
import axios from '@/utils/request'
// 查询分页数据:
export const iconstructionreportList = (arg) => {
return axios.request({
url: '/iconstructionreport/list',
method: 'get',
params: arg,
dataType: 'json',
})
}
// 查询详情数据:
export const iconstructionreportGetById = (arg) => {
return axios.request({
url: `/iconstructionreport/getById`,
method: 'get',
params: arg,
dataType: 'json',
})
}
// 添加数据:
export const iconstructionreportAdd = (arg) => {
return axios.request({
url: '/iconstructionreport/add',
method: 'post',
data: arg,
dataType: 'json',
})
}
// 修改数据:
export const iconstructionreportUpdate = (arg) => {
return axios.request({
url: '/iconstructionreport/update',
method: 'put',
data: arg,
dataType: 'json',
})
}
// 删除数据:
export const iconstructionreportDelete = (arg) => {
return axios.request({
url: '/iconstructionreport/delete',
method: 'delete',
params: {
id:arg.id[0]
},
dataType: 'json',
})
}
// 查询分页数据:
export const iproductionplanList = (arg) => {
return axios.request({
url: '/iproductionplan/list',
method: 'get',
params: arg,
dataType: 'json',
})
}

@ -0,0 +1,115 @@
<script setup>
import { reactive } from 'vue'
import { iconstructionreportList, iconstructionreportAdd, iconstructionreportUpdate, iconstructionreportDelete, iconstructionreportGetById, iproductionplanList } from './api'
import { baseModelOptions, baseFilterOptions } from './options'
const { proxy } = getCurrentInstance();
const state = reactive({
baseModelOptions: baseModelOptions(),
baseFilterOptions: baseFilterOptions(),
title: "施工报告管理",
baseModelName: '施工报告信息',
addBtnName: '新增施工报告',
editBtnName: '',
delBtnName: '',
primaryKey: 'id',
getTableFn: iconstructionreportList,
addFn: iconstructionreportAdd,
editFn: iconstructionreportUpdate,
deleteFn: iconstructionreportDelete,
detailFn: iconstructionreportGetById,
showEditBtn: false,
showDeleteBtn: false,
columnCount: 1,
// rowControl: {
// showEditBtn: false,
// showDelBtn: false
// },
permission: {//
add: 'constructionReport:page:list',
edit: 'constructionReport:page:list',
delete: 'constructionReport:page:list',
detail: 'constructionReport:page:list',
},
hideselection: true,
pageInfo: { total: 0, base: { limit: 8, current: 1 } },
beforeSubmit: function (params) {
let item = state.planList.find((item) => item.id == params.planId)
if (item) {
params.planName = item.planName
}
return params
},
planList: []
})
onMounted(() => {
getPlanList()
})
function getPlanList(params) {
iproductionplanList({ pageNo: 1, pageSize: 9999 }).then((res) => {
if (res.code == 200) {
state.planList = res.data.list
state.baseModelOptions = proxy.$util.setOptions({
attrName: 'options',//
data: state.baseModelOptions, //
key: "planId", //key
res: res, //
path: res.data.list,
relation: { key: 'value', name: 'label', resKey: 'id', resName: 'planName' },
everClear: true,
hasChildren: true,
});
state.baseFilterOptions = proxy.$util.setOptions({
attrName: 'options',//
data: state.baseFilterOptions, //
key: "planId", //key
res: res, //
path: res.data.list,
relation: { key: 'value', name: 'label', resKey: 'id', resName: 'planName' },
everClear: true,
hasChildren: true,
});
}
})
}
</script>
<template>
<div class="app-container">
<BaseTablePage :tableOptions="state">
<template v-slot:column>
<el-table-column type="index" align="center" label="序号" width="70" />
<!-- <el-table-column label="材料使用" align="center" prop="materialsUse" />
<el-table-column label="人力投入" align="center" prop="manpower" />
<el-table-column label="质量安全" align="center" prop="qs" />
<el-table-column label="机械设备运行" align="center" prop="equipmentOperation" /> -->
<el-table-column label="报告日期" align="center" prop="date" />
<el-table-column label="报告周期(日/周/月)" align="center" prop="cycle" />
<el-table-column label="项目名称" align="center" prop="planName" />
<el-table-column label="建议" align="center" prop="advises" />
<el-table-column label="总体施工进度" align="center" prop="totalProgress">
<template #default="scope">
<el-progress :stroke-width="6" :percentage="Number(scope.row.totalProgress)" />
</template>
</el-table-column>
<el-table-column label="创建人" align="center" prop="creator" />
<el-table-column label="创建时间" align="center" prop="createTime" />
</template>
<template #control="baseScope">
<el-table-column label="操作" align="center" width="200" fixed="right">
<template #default="scope">
<el-button v-hasPermi="['constructionReport:page:edit']" type="text" icon="EditPen"
@click="baseScope.handleEdit(scope.$index, scope.row)">
修改
</el-button>
<el-button v-hasPermi="['constructionReport:page:remove']" type="text" icon="Delete"
@click="baseScope.deleteTableData(scope.$index, scope.row)">删除</el-button>
</template>
</el-table-column>
</template>
</BaseTablePage>
</div>
</template>
<style scoped></style>

@ -0,0 +1,235 @@
export const baseModelOptions = () => {
return [
{
tag: "el-date-picker",
label: '报告日期:',
key: 'date',
value: '',
default: '',
rules: [
{ required: true, message: '请选择报告日期', trigger: 'blur' },
],
attribute: {//属性
valueFormat: "YYYY-MM-DD",
type: "date",
placeholder: '请选择报告日期',
},
},
{
tag: 'BaseSelect',
label: '报告周期:',
key: 'cycle',
value: '',
default: '',
rules: [
{ required: true, message: '请选择报告周期', trigger: 'blur' },
],
attribute: { //属性
placeholder: '请选择报告周期',
options: [{
value: "日",
label: "日"
}, {
value: "周",
label: "周"
}, {
value: "月",
label: "月"
}]
},
},
{
tag: 'BaseSelect',
label: '项目名称:',
key: 'planId',
value: '',
default: '',
rules: [
{ required: true, message: '请选择项目名称', trigger: 'blur' },
],
attribute: { //属性
placeholder: '请选择项目名称',
options: []
},
},
// {
// tag: 'el-input',
// label: '材料使用:',
// key: 'materialsUse',
// value: '',
// default: '',
// rules: [
// { required: true, message: '请选择材料使用', trigger: 'blur' },
// ],
// attribute: {//属性
// type: 'text',
// placeholder: '请输入材料使用',
// },
// },
// {
// tag: 'el-input',
// label: '人力投入:',
// key: 'manpower',
// value: '',
// default: '',
// rules: [
// { required: true, message: '请选择人力投入', trigger: 'blur' },
// ],
// attribute: {//属性
// type: 'text',
// placeholder: '请输入人力投入',
// },
// },
// {
// tag: 'el-input',
// label: '质量安全:',
// key: 'qs',
// value: '',
// default: '',
// rules: [
// { required: true, message: '请选择质量安全', trigger: 'blur' },
// ],
// attribute: {//属性
// type: 'text',
// placeholder: '请输入质量安全',
// },
// },
// {
// tag: 'el-input',
// label: '机械设备运行:',
// key: 'equipmentOperation',
// value: '',
// default: '',
// rules: [
// { required: true, message: '请选择机械设备运行', trigger: 'blur' },
// ],
// attribute: {//属性
// type: 'text',
// placeholder: '请输入机械设备运行',
// },
// },
{
tag: 'el-input',
label: '建议:',
key: 'advises',
value: '',
default: '',
// rules: [
// { required: true, message: '请输入报告周期', trigger: 'blur' },
// ],
attribute: {//属性
type: 'textarea',
placeholder: '请输入建议',
},
},
{
tag: 'el-input-number',
label: '总体进度:',
key: 'totalProgress',
value: 0,
default: 0,
rules: [
{ required: true, message: '请输入总体进度', trigger: 'blur' },
],
attribute: {//属性
min: 0,
max: 100,
placeholder: '请输入总体进度',
},
},
]
}
export const baseFilterOptions = () => {
return [
{
tag: 'BaseSelect',
label: '项目名称:',
key: 'planId',
value: '',
default: '',
rules: [
{ required: true, message: '请选择项目名称', trigger: 'blur' },
],
attribute: { //属性
placeholder: '请选择项目名称',
options: []
},
},
// {
// tag: 'el-input',
// label: '材料使用:',
// key: 'materialsUse',
// value: '',
// default: '',
// rules: [
// { required: true, message: '请选择材料使用', trigger: 'blur' },
// ],
// attribute: {//属性
// type: 'text',
// placeholder: '请输入材料使用',
// },
// },
// {
// tag: 'el-input',
// label: '人力投入:',
// key: 'manpower',
// value: '',
// default: '',
// rules: [
// { required: true, message: '请选择人力投入', trigger: 'blur' },
// ],
// attribute: {//属性
// type: 'text',
// placeholder: '请输入人力投入',
// },
// },
// {
// tag: 'el-input',
// label: '质量安全:',
// key: 'qs',
// value: '',
// default: '',
// rules: [
// { required: true, message: '请选择质量安全', trigger: 'blur' },
// ],
// attribute: {//属性
// type: 'text',
// placeholder: '请输入质量安全',
// },
// },
// {
// tag: 'el-input',
// label: '机械设备运行:',
// key: 'equipmentOperation',
// value: '',
// default: '',
// rules: [
// { required: true, message: '请选择机械设备运行', trigger: 'blur' },
// ],
// attribute: {//属性
// type: 'text',
// placeholder: '请输入机械设备运行',
// },
// },
{
tag: "el-date-picker",
label: '报告日期:',
key: 'date',
value: '',
default: '',
rules: [
{ required: true, message: '请选择报告日期', trigger: 'blur' },
],
attribute: {//属性
valueFormat: "YYYY-MM-DD",
type: "date",
placeholder: '请选择报告日期',
},
},
]
}

@ -0,0 +1,66 @@
import axios from '@/utils/request'
// 查询分页数据:
export const iengineerlogList = (arg) => {
return axios.request({
url: '/iengineerlog/list',
method: 'get',
params: arg,
dataType: 'json',
})
}
// 查询详情数据:
export const iengineerlogGetById = (arg) => {
return axios.request({
url: `/iengineerlog/getById`,
method: 'get',
params: arg,
dataType: 'json',
})
}
// 添加数据:
export const iengineerlogAdd = (arg) => {
return axios.request({
url: '/iengineerlog/add',
method: 'post',
data: arg,
dataType: 'json',
})
}
// 修改数据:
export const iengineerlogUpdate = (arg) => {
return axios.request({
url: '/iengineerlog/update',
method: 'put',
data: arg,
dataType: 'json',
})
}
// 删除数据:
export const iengineerlogDelete = (arg) => {
return axios.request({
url: '/iengineerlog/delete',
method: 'delete',
params: {
id:arg.id[0]
},
dataType: 'json',
})
}
// 查询分页数据:
export const iproductionplanList = (arg) => {
return axios.request({
url: '/iproductionplan/list',
method: 'get',
params: arg,
dataType: 'json',
})
}

@ -0,0 +1,75 @@
<script setup>
import { reactive } from 'vue'
import { iengineerlogList, iengineerlogAdd, iengineerlogUpdate, iengineerlogDelete, iengineerlogGetById, iproductionplanList } from './api'
import { baseModelOptions, baseFilterOptions } from './options'
const { proxy } = getCurrentInstance();
const state = reactive({
baseModelOptions: baseModelOptions(),
baseFilterOptions: baseFilterOptions(),
title: "工程日志管理",
baseModelName: '工程日志信息',
addBtnName: '新增工程日志',
editBtnName: '',
delBtnName: '',
primaryKey: 'id',
getTableFn: iengineerlogList,
addFn: iengineerlogAdd,
editFn: iengineerlogUpdate,
deleteFn: iengineerlogDelete,
detailFn: iengineerlogGetById,
showEditBtn: false,
showDeleteBtn: false,
columnCount: 1,
// rowControl: {
// showEditBtn: false,
// showDelBtn: false
// },
permission: {//
add: 'engineeringLog:page:list',
edit: 'engineeringLog:page:list',
delete: 'engineeringLog:page:list',
detail: 'engineeringLog:page:list',
},
hideselection: true,
pageInfo: { total: 0, base: { limit: 8, current: 1 } },
})
onMounted(() => {
})
</script>
<template>
<div class="app-container">
<BaseTablePage :tableOptions="state">
<template v-slot:column>
<el-table-column type="index" align="center" label="序号" width="70" />
<el-table-column label="日期" align="center" prop="date" />
<el-table-column label="天气" align="center" prop="weather" />
<el-table-column label="温度" align="center" prop="temperature" />
<el-table-column label="风力" align="center" prop="wind" />
<el-table-column label="现场负责人" align="center" prop="principalName" />
<el-table-column label="联系方式" align="center" prop="principalTel" />
<el-table-column label="施工情况" align="center" prop="constructionSituation" />
<el-table-column label="其他事项" align="center" prop="otherBusiness" />
<el-table-column label="创建人" align="center" prop="creator" />
<el-table-column label="创建时间" align="center" prop="createTime" />
</template>
<template #control="baseScope">
<el-table-column label="操作" align="center" width="200" fixed="right">
<template #default="scope">
<el-button v-hasPermi="['engineeringLog:page:edit']" type="text" icon="EditPen"
@click="baseScope.handleEdit(scope.$index, scope.row)">
修改
</el-button>
<el-button v-hasPermi="['engineeringLog:page:remove']" type="text" icon="Delete"
@click="baseScope.deleteTableData(scope.$index, scope.row)">删除</el-button>
</template>
</el-table-column>
</template>
</BaseTablePage>
</div>
</template>
<style scoped></style>

@ -0,0 +1,223 @@
export const baseModelOptions = () => {
function validatePhoneNumber(phoneNumber) {
const regex = /^1[3-9]\d{9}$/;
return regex.test(phoneNumber);
}
const validatePass2 = (rule, value, callback) => {
if (value === '') {
callback(new Error('请输入现场负责人联系方式'))
} else {
if (!validatePhoneNumber(value)) {
callback(new Error('手机号格式不正确'))
return
}
callback()
}
}
return [
{
tag: "el-date-picker",
label: '日期:',
key: 'date',
value: '',
default: '',
rules: [
{ required: true, message: '请选择日期', trigger: 'blur' },
],
attribute: {//属性
valueFormat: "YYYY-MM-DD",
type: "date",
placeholder: '请选择日期',
},
},
{
tag: 'el-input',
label: '天气:',
key: 'weather',
value: '',
default: '',
attribute: {//属性
type: 'text',
placeholder: '请输入天气',
},
},
{
tag: 'el-input',
label: '温度:',
key: 'temperature',
value: '',
default: '',
attribute: {//属性
type: 'text',
placeholder: '请输入温度',
},
},
{
tag: 'el-input',
label: '风力:',
key: 'wind',
value: '',
default: '',
attribute: {//属性
type: 'text',
placeholder: '请输入风力',
},
},
{
tag: 'el-input',
label: '现场负责人:',
key: 'principalName',
value: '',
default: '',
rules: [
{ required: true, message: '请输入现场负责人', trigger: 'blur' },
],
attribute: {//属性
type: 'text',
placeholder: '请输入现场负责人',
},
},
{
tag: 'el-input',
label: '联系方式:',
key: 'principalTel',
value: '',
default: '',
rules: [
{ required: true, validator: validatePass2, trigger: 'blur' },
],
attribute: {//属性
type: 'text',
placeholder: '请输入联系方式',
},
},
{
tag: 'el-input',
label: '施工情况:',
key: 'constructionSituation',
value: '',
default: '',
attribute: {//属性
type: 'text',
placeholder: '请输入施工情况',
},
},
{
tag: 'el-input',
label: '其他事项:',
key: 'otherBusiness',
value: '',
default: '',
attribute: {//属性
type: 'textarea',
placeholder: '请输入其他事项',
},
},
]
}
export const baseFilterOptions = () => {
return [
{
tag: 'el-input',
label: '现场负责人:',
key: 'principalName',
value: '',
default: '',
rules: [
{ required: true, message: '请选择现场负责人', trigger: 'blur' },
],
attribute: {//属性
type: 'text',
placeholder: '请输入现场负责人',
},
},
{
tag: 'el-input',
label: '联系方式:',
key: 'principalTel',
value: '',
default: '',
rules: [
{ required: true, message: '请输入联系方式', trigger: 'blur' },
],
attribute: {//属性
type: 'text',
placeholder: '请输入联系方式',
},
},
// {
// tag: "el-date-picker",
// label: '日期:',
// key: 'date',
// value: '',
// default: '',
// rules: [
// { required: true, message: '请选择日期', trigger: 'blur' },
// ],
// attribute: {//属性
// valueFormat: "YYYY-MM-DD",
// type: "date",
// placeholder: '请选择日期',
// },
// },
// {
// tag: 'el-input',
// label: '温度:',
// key: 'temperature',
// value: '',
// default: '',
// attribute: {//属性
// type: 'text',
// placeholder: '请输入温度',
// },
// },
// {
// tag: 'el-input',
// label: '天气:',
// key: 'weather',
// value: '',
// default: '',
// attribute: {//属性
// type: 'text',
// placeholder: '请输入天气',
// },
// },
// {
// tag: 'el-input',
// label: '风力:',
// key: 'wind',
// value: '',
// default: '',
// attribute: {//属性
// type: 'text',
// placeholder: '请输入风力',
// },
// },
// {
// tag: 'el-input',
// label: '施工情况:',
// key: 'constructionSituation',
// value: '',
// default: '',
// attribute: {//属性
// type: 'textarea',
// placeholder: '请输入施工情况',
// },
// },
// {
// tag: 'el-input',
// label: '其他事项:',
// key: 'otherBusiness',
// value: '',
// default: '',
// attribute: {//属性
// type: 'textarea',
// placeholder: '请输入其他事项',
// },
// },
]
}

@ -0,0 +1,56 @@
import axios from '@/utils/request'
// 查询分页数据:
export const iproductionplanList = (arg) => {
return axios.request({
url: '/iproductionplan/list',
method: 'get',
params: arg,
dataType: 'json',
})
}
// 查询详情数据:
export const iproductionplanGetById = (arg) => {
return axios.request({
url: `/iproductionplan/getById`,
method: 'get',
params: arg,
dataType: 'json',
})
}
// 添加数据:
export const iproductionplanAdd = (arg) => {
return axios.request({
url: '/iproductionplan/add',
method: 'post',
data: arg,
dataType: 'json',
})
}
// 修改数据:
export const iproductionplanUpdate = (arg) => {
return axios.request({
url: '/iproductionplan/update',
method: 'put',
data: arg,
dataType: 'json',
})
}
// 删除数据:
export const iproductionplanDelete = (arg) => {
return axios.request({
url: '/iproductionplan/delete',
method: 'delete',
params: {
id:arg.id[0]
},
dataType: 'json',
})
}

@ -0,0 +1,72 @@
<script setup>
import { reactive } from 'vue'
import { iproductionplanList, iproductionplanAdd, iproductionplanUpdate, iproductionplanDelete, iproductionplanGetById } from './api'
import { baseModelOptions, baseFilterOptions } from './options'
// const { proxy } = getCurrentInstance();
const state = reactive({
baseModelOptions: baseModelOptions(),
baseFilterOptions: baseFilterOptions(),
title: "生产计划管理",
baseModelName: '生产计划信息',
editBtnName: '',
delBtnName: '',
primaryKey: 'id',
getTableFn: iproductionplanList,
addFn: iproductionplanAdd,
editFn: iproductionplanUpdate,
deleteFn: iproductionplanDelete,
detailFn: iproductionplanGetById,
showEditBtn: false,
showDeleteBtn: false,
columnCount: 1,
addBtnName:"新增计划",
// rowControl: {
// showEditBtn: false,
// showDelBtn: false
// },
permission: {//
add: 'productionPlan:page:list',
edit: 'productionPlan:page:list',
delete: 'productionPlan:page:list',
detail: 'productionPlan:page:list',
},
hideselection: true,
pageInfo: { total: 0, base: { limit: 8, current: 1 } },
})
</script>
<template>
<div class="app-container">
<BaseTablePage :tableOptions="state">
<template v-slot:column>
<el-table-column label="计划名称" align="center" prop="planName" />
<el-table-column label="项目阶段" align="center" prop="projectStage" />
<el-table-column label="计划描述" align="center" prop="description" />
<el-table-column label="计划开始时间" align="center" prop="startTime" />
<el-table-column label="计划结束时间" align="center" prop="endTime" />
<el-table-column label="总工期(天)" align="center" prop="duration" />
<el-table-column label="关键节点时间" align="center" prop="keystageTime" />
<el-table-column label="计划负责人" align="center" prop="principal" />
<el-table-column label="创建人" align="center" prop="creator" />
<el-table-column label="创建时间" align="center" prop="createTime" />
</template>
<template #control="baseScope">
<el-table-column label="操作" align="center" width="200" fixed="right">
<template #default="scope">
<el-button v-hasPermi="['productionPlan:page:edit']" type="text" icon="EditPen"
@click="baseScope.handleEdit(scope.$index, scope.row)">
修改
</el-button>
<el-button v-hasPermi="['productionPlan:page:remove']" type="text" icon="Delete"
@click="baseScope.deleteTableData(scope.$index, scope.row)">删除</el-button>
</template>
</el-table-column>
</template>
</BaseTablePage>
</div>
</template>
<style scoped></style>

@ -0,0 +1,251 @@
export const baseModelOptions = () => {
return [
{
tag: 'el-input',
label: '计划名称:',
key: 'planName',
value: '',
default: '',
rules: [
{ required: true, message: '请输入计划名称', trigger: 'blur' },
],
attribute: {//属性
type: 'text',
placeholder: '请输入计划名称',
},
},
{
tag: 'el-input',
label: '项目阶段:',
key: 'projectStage',
value: '',
default: '',
rules: [
{ required: true, message: '请输入项目阶段', trigger: 'blur' },
],
attribute: {//属性
type: 'text',
placeholder: '请输入项目阶段',
},
},
{
tag: 'el-input',
label: '计划描述:',
key: 'description',
value: '',
default: '',
rules: [
{ required: true, message: '请输入计划描述', trigger: 'blur' },
],
attribute: {//属性
type: 'textarea',
placeholder: '请输入计划描述',
},
},
{
tag: "el-date-picker",
label: '计划开始时间:',
key: 'startTime',
value: '',
default: '',
rules: [
{ required: true, message: '请选择计划开始时间', trigger: 'blur' },
],
attribute: {//属性
valueFormat: "YYYY-MM-DD",
type: "date",
placeholder: '请选择计划开始时间',
},
},
{
tag: "el-date-picker",
label: '计划结束时间:',
key: 'endTime',
value: '',
default: '',
rules: [
{ required: true, message: '请选择计划结束时间', trigger: 'blur' },
],
attribute: {//属性
valueFormat: "YYYY-MM-DD",
type: "date",
placeholder: '请选择计划结束时间',
},
},
{
tag: 'el-input-number',
label: '总工期(天):',
key: 'duration',
value: 0,
default: 0,
rules: [
{ required: true, message: '请输入总工期(天)', trigger: 'blur' },
],
attribute: {//属性
min:0,
placeholder: '请输入总工期(天)',
},
},
{
tag: "el-date-picker",
label: '关键节点时间:',
key: 'keystageTime',
value: "",
default: "",
rules: [
{
required: true,
message: "请选择关键节点时间",
trigger: "blur",
},
],
attribute: {
//属性
placeholder: "请选择关键节点时间",
valueFormat: "YYYY-MM-DD",
type: "date",
},
},
{
tag: 'el-input',
label: '计划负责人:',
key: 'principal',
value: '',
default: '',
rules: [
{ required: true, message: '请输入计划负责人', trigger: 'blur' },
],
attribute: {//属性
type: 'text',
placeholder: '请输入计划负责人',
},
},
]
}
export const baseFilterOptions = () => {
return [
{
tag: 'el-input',
label: '计划名称:',
key: 'planName',
value: '',
default: '',
rules: [
{ required: true, message: '请输入计划名称', trigger: 'blur' },
],
attribute: {//属性
type: 'text',
placeholder: '请输入计划名称',
},
},
{
tag: 'el-input',
label: '项目阶段:',
key: 'projectStage',
value: '',
default: '',
rules: [
{ required: true, message: '请输入项目阶段', trigger: 'blur' },
],
attribute: {//属性
type: 'text',
placeholder: '请输入项目阶段',
},
},
// {
// tag: 'el-input',
// label: '总工期天数:',
// key: 'duration',
// value: '',
// default: '',
// rules: [
// { required: true, message: '请输入总工期天数', trigger: 'blur' },
// ],
// attribute: {//属性
// type: 'text',
// placeholder: '请输入总工期天数',
// },
// },
// {
// tag: "el-date-picker",
// label: '关键节点时间:',
// key: 'keystageTime',
// value: "",
// default: "",
// rules: [
// {
// required: true,
// message: "请选择关键节点时间",
// trigger: "blur",
// },
// ],
// attribute: {
// //属性
// placeholder: "请选择关键节点时间",
// valueFormat: "YYYY-MM-DD",
// type: "date",
// },
// },
{
tag: "el-date-picker",
label: '计划开始时间:',
key: 'startTime',
value: '',
default: '',
rules: [
{ required: true, message: '请选择计划开始时间', trigger: 'blur' },
],
attribute: {//属性
valueFormat: "YYYY-MM-DD",
type: "date",
placeholder: '请选择计划开始时间',
},
},
{
tag: "el-date-picker",
label: '计划结束时间:',
key: 'endTime',
value: '',
default: '',
rules: [
{ required: true, message: '请选择计划结束时间', trigger: 'blur' },
],
attribute: {//属性
valueFormat: "YYYY-MM-DD",
type: "date",
placeholder: '请选择计划结束时间',
},
},
{
tag: 'el-input',
label: '计划负责人:',
key: 'principal',
value: '',
default: '',
rules: [
{ required: true, message: '请输入计划负责人', trigger: 'blur' },
],
attribute: {//属性
type: 'text',
placeholder: '请输入计划负责人',
},
},
// {
// tag: 'el-input',
// label: '计划描述:',
// key: 'description',
// value: '',
// default: '',
// rules: [
// { required: true, message: '请输入计划描述', trigger: 'blur' },
// ],
// attribute: {//属性
// type: 'text',
// placeholder: '请输入计划描述',
// },
// },
]
}

@ -0,0 +1,66 @@
import axios from '@/utils/request'
// 查询分页数据:
export const iprogressList = (arg) => {
return axios.request({
url: '/iprogress/list',
method: 'get',
params: arg,
dataType: 'json',
})
}
// 查询详情数据:
export const iprogressGetById = (arg) => {
return axios.request({
url: `/iprogress/getById`,
method: 'get',
params: arg,
dataType: 'json',
})
}
// 添加数据:
export const iprogressAdd = (arg) => {
return axios.request({
url: '/iprogress/add',
method: 'post',
data: arg,
dataType: 'json',
})
}
// 修改数据:
export const iprogressUpdate = (arg) => {
return axios.request({
url: '/iprogress/update',
method: 'put',
data: arg,
dataType: 'json',
})
}
// 删除数据:
export const iprogressDelete = (arg) => {
return axios.request({
url: '/iprogress/delete',
method: 'delete',
params: {
id:arg.id[0]
},
dataType: 'json',
})
}
// 查询分页数据:
export const iproductionplanList = (arg) => {
return axios.request({
url: '/iproductionplan/list',
method: 'get',
params: arg,
dataType: 'json',
})
}

@ -0,0 +1,112 @@
<script setup>
import { reactive } from 'vue'
import { iprogressList, iprogressAdd, iprogressUpdate, iprogressDelete, iprogressGetById, iproductionplanList } from './api'
import { baseModelOptions, baseFilterOptions } from './options'
const { proxy } = getCurrentInstance();
const state = reactive({
baseModelOptions: baseModelOptions(),
baseFilterOptions: baseFilterOptions(),
title: "进度跟踪管理",
baseModelName: '进度跟踪信息',
addBtnName: '新增进度跟踪',
editBtnName: '',
delBtnName: '',
primaryKey: 'id',
getTableFn: iprogressList,
addFn: iprogressAdd,
editFn: iprogressUpdate,
deleteFn: iprogressDelete,
detailFn: iprogressGetById,
showEditBtn: false,
showDeleteBtn: false,
columnCount: 1,
// rowControl: {
// showEditBtn: false,
// showDelBtn: false
// },
permission: {//
add: 'progressTracking:page:list',
edit: 'progressTracking:page:list',
delete: 'progressTracking:page:list',
detail: 'progressTracking:page:list',
},
hideselection: true,
pageInfo: { total: 0, base: { limit: 8, current: 1 } },
beforeSubmit: function (params) {
let item = state.planList.find((item) => item.id == params.planId)
if (item) {
params.planName = item.planName
}
return params
},
planList: []
})
onMounted(() => {
getPlanList()
})
function getPlanList(params) {
iproductionplanList({ pageNo: 1, pageSize: 9999 }).then((res) => {
if (res.code == 200) {
state.planList = res.data.list
state.baseModelOptions = proxy.$util.setOptions({
attrName: 'options',//
data: state.baseModelOptions, //
key: "planId", //key
res: res, //
path: res.data.list,
relation: { key: 'value', name: 'label', resKey: 'id', resName: 'planName' },
everClear: true,
hasChildren: true,
});
state.baseFilterOptions = proxy.$util.setOptions({
attrName: 'options',//
data: state.baseFilterOptions, //
key: "planId", //key
res: res, //
path: res.data.list,
relation: { key: 'value', name: 'label', resKey: 'id', resName: 'planName' },
everClear: true,
hasChildren: true,
});
}
})
}
</script>
<template>
<div class="app-container">
<BaseTablePage :tableOptions="state">
<template v-slot:column>
<el-table-column label="项目名称" align="center" prop="planName" />
<el-table-column label="当日完成进度 " align="center" prop="dayProgress">
<template #default="scope">
<el-progress :stroke-width="6" :percentage="Number(scope.row.dayProgress)" />
</template>
</el-table-column>
<el-table-column label="累计完成进度" align="center" prop="accumulativeProgress">
<template #default="scope">
<el-progress :stroke-width="6" :percentage="Number(scope.row.accumulativeProgress)" />
</template>
</el-table-column>
<el-table-column label="创建人" align="center" prop="creator" />
<el-table-column label="创建时间" align="center" prop="createTime" />
</template>
<template #control="baseScope">
<el-table-column label="操作" align="center" width="200" fixed="right">
<template #default="scope">
<el-button v-hasPermi="['progressTracking:page:edit']" type="text" icon="EditPen"
@click="baseScope.handleEdit(scope.$index, scope.row)">
修改
</el-button>
<el-button v-hasPermi="['progressTracking:page:remove']" type="text" icon="Delete"
@click="baseScope.deleteTableData(scope.$index, scope.row)">删除</el-button>
</template>
</el-table-column>
</template>
</BaseTablePage>
</div>
</template>
<style scoped></style>

@ -0,0 +1,54 @@
export const baseModelOptions = () => {
return [
{
tag: 'BaseSelect',
label: '项目名称:',
key: 'planId',
value: '',
default: '',
rules: [
{ required: true, message: '请选择项目名称', trigger: 'blur' },
],
attribute: { //属性
placeholder: '请选择项目名称',
options: []
},
},
{
tag: 'el-input-number',
label: '当日完成进度:',
key: 'dayProgress',
value: 0,
default: 0,
rules: [
{ required: true, message: '请输入当日完成进度', trigger: 'blur' },
],
attribute: {//属性
min: 0,
max: 100,
placeholder: '请输入当日完成进度',
},
},
]
}
export const baseFilterOptions = () => {
return [
{
tag: 'BaseSelect',
label: '项目名称:',
key: 'planId',
value: '',
default: '',
rules: [
{ required: true, message: '请选择项目名称', trigger: 'blur' },
],
attribute: { //属性
placeholder: '请选择项目名称',
options: []
},
},
]
}

@ -0,0 +1,98 @@
import axios from '@/utils/request'
// 查询分页数据:
export const listOne = (arg) => {
return axios.request({
url: '/imanpower/list',
method: 'get',
params: arg,
dataType: 'json',
})
}
export const listTwo = (arg) => {
return axios.request({
url: '/imaterials/list',
method: 'get',
params: arg,
dataType: 'json',
})
}
// 查询详情数据:
export const byIdOne = (arg) => {
return axios.request({
url: `/imanpower/getById`,
method: 'get',
params: arg,
dataType: 'json',
})
}
export const byIdTwo = (arg) => {
return axios.request({
url: `/imaterials/getById`,
method: 'get',
params: arg,
dataType: 'json',
})
}
// 添加数据:
export const addOne = (arg) => {
return axios.request({
url: '/imanpower/add',
method: 'post',
data: arg,
dataType: 'json',
})
}
export const addTwo = (arg) => {
return axios.request({
url: '/imaterials/add',
method: 'post',
data: arg,
dataType: 'json',
})
}
// 修改数据:
export const editOne = (arg) => {
return axios.request({
url: '/imanpower/update',
method: 'put',
data: arg,
dataType: 'json',
})
}
export const editTwo = (arg) => {
return axios.request({
url: '/imaterials/update',
method: 'put',
data: arg,
dataType: 'json',
})
}
// 删除数据:
export const deleteOne = (arg) => {
return axios.request({
url: '/imanpower/delete',
method: 'delete',
params: {
id: arg.id[0]
},
dataType: 'json',
})
}
export const deleteTwo = (arg) => {
return axios.request({
url: '/imaterials/delete',
method: 'delete',
params: {
id: arg.id[0]
},
dataType: 'json',
})
}

@ -0,0 +1,128 @@
<script setup>
import { reactive } from 'vue'
import { listOne, addOne, editOne, deleteOne, byIdOne, listTwo, addTwo, editTwo, deleteTwo, byIdTwo } from './api'
import { baseModelOptions, baseFilterOptions, baseModelOptionstwo, baseFilterOptionstwo } from './options'
const { proxy } = getCurrentInstance();
const state = reactive({
tabindex: 0,
show: true,
baseModelOptions: baseModelOptions(),
baseFilterOptions: baseFilterOptions(),
title: "人力信息管理",
baseModelName: '人力信息',
addBtnName: '新增资源',
editBtnName: '',
delBtnName: '',
primaryKey: 'id',
getTableFn: listOne,
addFn: addOne,
editFn: editOne,
deleteFn: deleteOne,
detailFn: byIdOne,
showEditBtn: false,
showDeleteBtn: false,
columnCount: 1,
// rowControl: {
// showEditBtn: false,
// showDelBtn: false
// },
permission: {//
add: 'resource:page:list',
edit: 'resource:page:list',
delete: 'resource:page:list',
detail: 'resource:page:list',
},
hideselection: true,
pageInfo: { total: 0, base: { limit: 8, current: 1 } },
})
const table = ref()
function change(i) {
state.tabindex = i
state.show = false
state.getTableFn = i == 0 ? listOne : listTwo
state.addFn = i == 0 ? addOne : addTwo
state.editFn = i == 0 ? editOne : editTwo
state.deleteFn = i == 0 ? deleteOne : deleteTwo
state.detailFn = i == 0 ? byIdOne : byIdTwo
state.baseModelOptions = i == 0 ? baseModelOptions() : baseModelOptionstwo()
state.baseFilterOptions = i == 0 ? baseFilterOptions() : baseFilterOptionstwo()
state.title = i == 0 ? '人力信息管理' : '材料信息管理'
state.baseModelName = i == 0 ? '人力信息' : '材料信息'
setTimeout(() => {
state.show = true
}, 50)
}
</script>
<template>
<div class="app-container">
<div class="tabbox">
<div @click="change(0)" :class="state.tabindex == 0 ? 'active' : ''" class="topbat">人力信息</div>
<div @click="change(1)" :class="state.tabindex == 1 ? 'active' : ''" class="topbat">材料信息</div>
</div>
<BaseTablePage :tableOptions="state" ref="table" v-if="state.show">
<el-table-column label="序号" align="center" type="index" width="70" />
<template v-slot:column v-if="state.tabindex == 0">
<el-table-column label="人员姓名" align="center" prop="name" />
<el-table-column label="工种" align="center" prop="workType" />
<el-table-column label="数量(人)" align="center" prop="quantity" />
<el-table-column label="计划投入时间(天)" align="center" prop="planDevoteTime" />
<el-table-column label="实际投入时间(天)" align="center" prop="actualDevoteTime" />
<el-table-column label="预计离场时间" align="center" prop="leaveTime" />
</template>
<template v-slot:column v-else>
<el-table-column label="材料名称" align="center" prop="name" />
<el-table-column label="规格型号" align="center" prop="specification" />
<el-table-column label="单位" align="center" prop="unit" />
<el-table-column label="计划需求量" align="center" prop="planNeed" />
<el-table-column label="实际进厂量" align="center" prop="actualIn" />
<el-table-column label="剩余量" align="center" prop="surplus" />
<el-table-column label="供应商" align="center" prop="supplierName" />
<el-table-column label="采购时间" align="center" prop="purchaseTime" />
<el-table-column label="预计使用时间" align="center" prop="planUseTime" />
</template>
<template #control="baseScope">
<el-table-column label="操作" align="center" width="200" fixed="right">
<template #default="scope">
<el-button v-hasPermi="['resource:page:edit']" type="text" icon="EditPen"
@click="baseScope.handleEdit(scope.$index, scope.row)">
修改
</el-button>
<el-button v-hasPermi="['resource:page:remove']" type="text" icon="Delete"
@click="baseScope.deleteTableData(scope.$index, scope.row)">删除</el-button>
</template>
</el-table-column>
</template>
</BaseTablePage>
</div>
</template>
<style scoped>
.tabbox {
display: flex;
align-items: center;
margin-bottom: 15px;
}
.topbat {
border: 1px solid #ccc;
border-radius: 8px;
color: #333;
display: flex;
align-items: center;
justify-content: center;
width: 100px;
height: 45px;
margin-right: 20px;
cursor: pointer;
font-size: 16px;
}
.active {
border: 1px solid #1188fb;
background: #1188fb;
color: #fff;
}
</style>

@ -0,0 +1,286 @@
export const baseModelOptions = () => {
return [
{
tag: 'el-input',
label: '人员姓名:',
key: 'name',
value: '',
default: '',
rules: [
{ required: true, message: '请输入人员姓名', trigger: 'blur' },
],
attribute: {//属性
type: 'text',
placeholder: '请输入人员姓名',
},
},
{
tag: 'el-input',
label: '工种:',
key: 'workType',
value: '',
default: '',
rules: [
{ required: true, message: '请输入工种', trigger: 'blur' },
],
attribute: {//属性
type: 'text',
placeholder: '请输入工种',
},
},
{
tag: 'el-input-number',
label: '数量(人):',
key: 'quantity',
value: 0,
default: 0,
rules: [
{ required: true, message: '请输入数量', trigger: 'blur' },
],
attribute: {//属性
min: 0,
placeholder: '请输入数量',
},
},
{
tag: 'el-input-number',
label: '计划投入时间(天):',
key: 'planDevoteTime',
value: 0,
default: 0,
rules: [
{ required: true, message: '请输入计划投入时间', trigger: 'blur' },
],
attribute: {//属性
min: 0,
placeholder: '请输入计划投入时间',
},
},
{
tag: 'el-input-number',
label: '实际投入时间(天):',
key: 'actualDevoteTime',
value: 0,
default: 0,
rules: [
{ required: true, message: '请输入实际投入时间', trigger: 'blur' },
],
attribute: {//属性
min: 0,
placeholder: '请输入实际投入时间',
},
},
{
tag: "el-date-picker",
label: '预计离场时间:',
key: 'leaveTime',
value: '',
default: '',
rules: [
{ required: true, message: '请选择预计离场时间', trigger: 'blur' },
],
attribute: {//属性
valueFormat: "YYYY-MM-DD",
type: "date",
placeholder: '请选择预计离场时间',
},
},
]
}
export const baseFilterOptions = () => {
return [
{
tag: 'el-input',
label: '人员姓名:',
key: 'name',
value: '',
default: '',
rules: [
{ required: true, message: '请输入人员姓名', trigger: 'blur' },
],
attribute: {//属性
type: 'text',
placeholder: '请输入人员姓名',
},
},
{
tag: 'el-input',
label: '工种:',
key: 'workType',
value: '',
default: '',
rules: [
{ required: true, message: '请输入工种', trigger: 'blur' },
],
attribute: {//属性
type: 'text',
placeholder: '请输入工种',
},
},
]
}
export const baseModelOptionstwo = () => {
return [{
tag: 'el-input',
label: '材料名称:',
key: 'name',
value: '',
default: '',
rules: [
{ required: true, message: '请输入材料名称', trigger: 'blur' },
],
attribute: {//属性
type: 'text',
placeholder: '请输入材料名称',
},
},
{
tag: 'el-input',
label: '规格型号:',
key: 'specification',
value: '',
default: '',
rules: [
{ required: true, message: '请输入规格型号', trigger: 'blur' },
],
attribute: {//属性
type: 'text',
placeholder: '请输入规格型号',
},
},
{
tag: 'el-input',
label: '单位:',
key: 'unit',
value: '',
default: '',
rules: [
{ required: true, message: '请输入单位', trigger: 'blur' },
],
attribute: {//属性
type: 'text',
placeholder: '请输入单位',
},
},
{
tag: 'el-input-number',
label: '计划需求量:',
key: 'planNeed',
value: 0,
default: 0,
rules: [
{ required: true, message: '请输入计划需求量', trigger: 'blur' },
],
attribute: {//属性
min: 0,
placeholder: '请输入计划需求量',
},
},
{
tag: 'el-input-number',
label: '实际进厂量:',
key: 'actualIn',
value: 0,
default: 0,
rules: [
{ required: true, message: '请输入实际进厂量', trigger: 'blur' },
],
attribute: {//属性
min: 0,
placeholder: '请输入实际进厂量',
},
},
{
tag: 'el-input-number',
label: '剩余量:',
key: 'surplus',
value: 0,
default: 0,
rules: [
{ required: true, message: '请输入剩余量', trigger: 'blur' },
],
attribute: {//属性
min: 0,
placeholder: '请输入剩余量',
},
},
{
tag: 'el-input',
label: '供应商:',
key: 'supplierName',
value: '',
default: '',
// rules: [
// { required: true, message: '请输入供应商', trigger: 'blur' },
// ],
attribute: {//属性
type: 'text',
placeholder: '请输入供应商',
},
},
{
tag: "el-date-picker",
label: '采购时间:',
key: 'purchaseTime',
value: '',
default: '',
// rules: [
// { required: true, message: '请选择采购时间', trigger: 'blur' },
// ],
attribute: {//属性
valueFormat: "YYYY-MM-DD",
type: "date",
placeholder: '请选择采购时间',
},
}, {
tag: "el-date-picker",
label: '预计使用时间:',
key: 'planUseTime',
value: '',
default: '',
// rules: [
// { required: true, message: '请选择预计使用时间', trigger: 'blur' },
// ],
attribute: {//属性
valueFormat: "YYYY-MM-DD",
type: "date",
placeholder: '请选择预计使用时间',
},
},]
}
export const baseFilterOptionstwo = () => {
return [{
tag: 'el-input',
label: '材料名称:',
key: 'name',
value: '',
default: '',
rules: [
{ required: true, message: '请输入材料名称', trigger: 'blur' },
],
attribute: {//属性
type: 'text',
placeholder: '请输入材料名称',
},
},
{
tag: 'el-input',
label: '规格型号:',
key: 'specification',
value: '',
default: '',
rules: [
{ required: true, message: '请输入规格型号', trigger: 'blur' },
],
attribute: {//属性
type: 'text',
placeholder: '请输入规格型号',
},
},
]
}

@ -0,0 +1,66 @@
import axios from '@/utils/request'
// 查询分页数据:
export const iresourcescheduleList = (arg) => {
return axios.request({
url: '/iresourceschedule/list',
method: 'get',
params: arg,
dataType: 'json',
})
}
// 查询详情数据:
export const iresourcescheduleGetById = (arg) => {
return axios.request({
url: `/iresourceschedule/getById`,
method: 'get',
params: arg,
dataType: 'json',
})
}
// 添加数据:
export const iresourcescheduleAdd = (arg) => {
return axios.request({
url: '/iresourceschedule/add',
method: 'post',
data: arg,
dataType: 'json',
})
}
// 修改数据:
export const iresourcescheduleUpdate = (arg) => {
return axios.request({
url: '/iresourceschedule/update',
method: 'put',
data: arg,
dataType: 'json',
})
}
// 删除数据:
export const iresourcescheduleDelete = (arg) => {
return axios.request({
url: '/iresourceschedule/delete',
method: 'delete',
params: {
id:arg.id[0]
},
dataType: 'json',
})
}
// 查询分页数据:
export const iproductionplanList = (arg) => {
return axios.request({
url: '/iproductionplan/list',
method: 'get',
params: arg,
dataType: 'json',
})
}

@ -0,0 +1,110 @@
<script setup>
import { reactive } from 'vue'
import { iresourcescheduleList, iresourcescheduleAdd, iresourcescheduleUpdate, iresourcescheduleDelete, iresourcescheduleGetById, iproductionplanList } from './api'
import { baseModelOptions, baseFilterOptions } from './options'
const { proxy } = getCurrentInstance();
const state = reactive({
baseModelOptions: baseModelOptions(),
baseFilterOptions: baseFilterOptions(),
title: "资源调度管理",
baseModelName: '资源调度信息',
addBtnName: '新增资源调度',
editBtnName: '',
delBtnName: '',
primaryKey: 'id',
getTableFn: iresourcescheduleList,
addFn: iresourcescheduleAdd,
editFn: iresourcescheduleUpdate,
deleteFn: iresourcescheduleDelete,
detailFn: iresourcescheduleGetById,
showEditBtn: false,
showDeleteBtn: false,
columnCount: 1,
// rowControl: {
// showEditBtn: false,
// showDelBtn: false
// },
permission: {//
add: 'resourceScheduling:page:list',
edit: 'resourceScheduling:page:list',
delete: 'resourceScheduling:page:list',
detail: 'resourceScheduling:page:list',
},
hideselection: true,
pageInfo: { total: 0, base: { limit: 8, current: 1 } },
beforeSubmit: function (params) {
let item = state.planList.find((item) => item.id == params.planId)
if (item) {
params.planName = item.planName
}
return params
},
planList: []
})
onMounted(() => {
getPlanList()
})
function getPlanList(params) {
iproductionplanList({ pageNo: 1, pageSize: 9999 }).then((res) => {
if (res.code == 200) {
state.planList = res.data.list
state.baseModelOptions = proxy.$util.setOptions({
attrName: 'options',//
data: state.baseModelOptions, //
key: "planId", //key
res: res, //
path: res.data.list,
relation: { key: 'value', name: 'label', resKey: 'id', resName: 'planName' },
everClear: true,
hasChildren: true,
});
state.baseFilterOptions = proxy.$util.setOptions({
attrName: 'options',//
data: state.baseFilterOptions, //
key: "planId", //key
res: res, //
path: res.data.list,
relation: { key: 'value', name: 'label', resKey: 'id', resName: 'planName' },
everClear: true,
hasChildren: true,
});
}
})
}
</script>
<template>
<div class="app-container">
<BaseTablePage :tableOptions="state">
<template v-slot:column>
<el-table-column label="计划名称" align="center" prop="planName" />
<el-table-column label="当前进度" align="center" prop="currentProgress">
<template #default="scope">
<el-progress :stroke-width="6" :percentage="Number(scope.row.currentProgress)" />
</template>
</el-table-column>
<el-table-column label="计划开始时间" align="center" prop="startTime" />
<el-table-column label="计划结束时间" align="center" prop="endTime" />
<el-table-column label="调度建议" align="center" prop="advises" />
<el-table-column label="创建人" align="center" prop="creator" />
<el-table-column label="创建时间" align="center" prop="createTime" />
</template>
<template #control="baseScope">
<el-table-column label="操作" align="center" width="200" fixed="right">
<template #default="scope">
<el-button v-hasPermi="['resourceScheduling:page:edit']" type="text" icon="EditPen"
@click="baseScope.handleEdit(scope.$index, scope.row)">
修改
</el-button>
<el-button v-hasPermi="['resourceScheduling:page:remove']" type="text" icon="Delete"
@click="baseScope.deleteTableData(scope.$index, scope.row)">删除</el-button>
</template>
</el-table-column>
</template>
</BaseTablePage>
</div>
</template>
<style scoped></style>

@ -0,0 +1,94 @@
export const baseModelOptions = () => {
return [
{
tag: 'BaseSelect',
label: '计划名称:',
key: 'planId',
value: '',
default: '',
rules: [
{ required: true, message: '请选择计划名称', trigger: 'blur' },
],
attribute: { //属性
placeholder: '请选择计划名称',
options: []
},
},
{
tag: 'el-input-number',
label: '当前进度:',
key: 'currentProgress',
value: 0,
default: 0,
rules: [
{ required: true, message: '请输入当前进度', trigger: 'blur' },
],
attribute: {//属性
min: 0,
max: 100,
placeholder: '请输入当前进度',
},
},
{
tag: "el-date-picker",
label: '计划开始时间:',
key: 'startTime',
value: '',
default: '',
rules: [
{ required: true, message: '请选择计划开始时间', trigger: 'blur' },
],
attribute: {//属性
valueFormat: "YYYY-MM-DD",
type: "date",
placeholder: '请选择计划开始时间',
},
},
{
tag: "el-date-picker",
label: '计划结束时间:',
key: 'endTime',
value: '',
default: '',
rules: [
{ required: true, message: '请选择计划结束时间', trigger: 'blur' },
],
attribute: {//属性
valueFormat: "YYYY-MM-DD",
type: "date",
placeholder: '请选择计划结束时间',
},
},
{
tag: 'el-input',
label: '调度建议:',
key: 'advises',
value: '',
default: '',
attribute: {//属性
type: 'textarea',
placeholder: '请输入调度建议',
},
},
]
}
export const baseFilterOptions = () => {
return [
{
tag: 'BaseSelect',
label: '计划名称:',
key: 'planId',
value: '',
default: '',
rules: [
{ required: true, message: '请选择计划名称', trigger: 'blur' },
],
attribute: { //属性
placeholder: '请选择计划名称',
options: []
},
},
]
}

@ -1,28 +1,33 @@
<template>
<div class="login">
<div class="loginbj">
<div class="login-title">智慧工地管理系统</div>
</div>
<el-form ref="loginRef" :model="loginForm" :rules="loginRules" class="login-form">
<h3 class="title">致博后台管理系统</h3>
<div class="hydl">
<div></div>
<div style="margin: 0 10px;font-weight: bold;
font-size: 24px;
color: #333333;">用户登录</div>
<div></div>
</div>
<el-form-item prop="username">
<el-input
v-model="loginForm.username"
type="text"
size="large"
auto-complete="off"
placeholder="账号"
>
<template #prefix><svg-icon icon-class="user" class="el-input__icon input-icon" /></template>
<el-input v-model="loginForm.username" type="text" size="large" auto-complete="off" placeholder="请输入账号">
<template #prefix>
<img style="width: 24;height: 24px;margin: auto;" src="../assets/images/loginuser.png" alt="">
<!-- <svg-icon icon-class="user" class="el-input__icon input-icon"
style="color: #333;" /> -->
</template>
</el-input>
</el-form-item>
<el-form-item prop="password">
<el-input
v-model="loginForm.password"
type="password"
size="large"
auto-complete="off"
placeholder="密码"
@keyup.enter="handleLogin"
>
<template #prefix><svg-icon icon-class="password" class="el-input__icon input-icon" /></template>
<el-input show-password v-model="loginForm.password" type="password" size="large" auto-complete="off"
placeholder="请输入密码" @keyup.enter="handleLogin">
<template #prefix>
<img style="width: 24;height: 24px;margin: auto;" src="../assets/images/loginpass.png" alt="">
<!-- <svg-icon icon-class="password" class="el-input__icon input-icon"
style="color: #333;" /> -->
</template>
</el-input>
</el-form-item>
<!-- <el-form-item prop="code" v-if="captchaEnabled">
@ -40,27 +45,20 @@
<img :src="codeUrl" @click="getCode" class="login-code-img"/>
</div>
</el-form-item> -->
<el-checkbox v-model="loginForm.rememberMe" style="margin:0px 0px 25px 0px;">记住密码</el-checkbox>
<el-form-item style="width:100%;">
<el-button
:loading="loading"
size="large"
type="primary"
style="width:100%;"
@click.prevent="handleLogin"
>
<!-- <el-checkbox v-model="loginForm.rememberMe" style="margin:0px 0px 25px 0px;">记住密码</el-checkbox> -->
<!-- <div style="cursor: pointer;font-size: 16px;color: #333;" @click="forget">忘记密码</div> -->
<el-form-item style="width:100%;margin-top: 140px;">
<el-button :loading="loading" size="large" type="primary" style="width:100%;height:60px;"
@click.prevent="handleLogin">
<span v-if="!loading"> </span>
<span v-else> 中...</span>
</el-button>
<div style="float: right;" v-if="register">
<!-- <div style="float: right;" v-if="register">
<router-link class="link-type" :to="'/register'">立即注册</router-link>
</div>
</div> -->
</el-form-item>
</el-form>
<!-- 底部 -->
<div class="el-login-footer">
<span>Copyright © 2018-2022 ruoyi.vip All Rights Reserved.</span>
</div>
</div>
</template>
@ -70,8 +68,9 @@ import { getCodeImg } from "@/api/login";
import Cookies from "js-cookie";
import { encrypt, decrypt } from "@/utils/jsencrypt";
import useUserStore from '@/store/modules/user'
import md5 from 'js-md5'
onMounted(async () => {
proxy.$register();
// proxy.$register();
});
const userStore = useUserStore()
@ -83,12 +82,20 @@ const loginForm = ref({
password: "",
rememberMe: false,
code: "",
uuid: ""
uuid: "",
verification: false,
});
const validatePass = (rule, value, callback) => {
if (!loginForm.value.verification) {
callback(new Error('请向右滑动完成验证'))
} else {
callback()
}
}
const loginRules = {
username: [{ required: true, trigger: "blur", message: "请输入您的账号" }],
password: [{ required: true, trigger: "blur", message: "请输入您的密码" }],
verification: [{ validator: validatePass, trigger: 'blur' }],
// code: [{ required: true, trigger: "change", message: "" }]
};
@ -99,26 +106,33 @@ const captchaEnabled = ref(false);
//
const register = ref(false);
const redirect = ref(undefined);
const verify = ref()
function forget() {
proxy.$modal.msgError("请联系信息中心部门负责人帮您解决问题!");
return
}
function handleLogin() {
proxy.$refs.loginRef.validate(valid => {
if (valid) {
// console.log(md5(loginForm.value.password));
loading.value = true;
// cookie
if (loginForm.value.rememberMe) {
Cookies.set("username", loginForm.value.username, { expires: 30 });
Cookies.set("password", encrypt(loginForm.value.password), { expires: 30 });
Cookies.set("rememberMe", loginForm.value.rememberMe, { expires: 30 });
} else {
//
Cookies.remove("username");
Cookies.remove("password");
Cookies.remove("rememberMe");
}
// if (loginForm.value.rememberMe) {
// Cookies.set("username", loginForm.value.username, { expires: 30 });
// Cookies.set("password", encrypt(loginForm.value.password), { expires: 30 });
// Cookies.set("rememberMe", loginForm.value.rememberMe, { expires: 30 });
// } else {
// //
// Cookies.remove("username");
// Cookies.remove("password");
// Cookies.remove("rememberMe");
// }
// action
userStore.login(loginForm.value).then(() => {
router.push({ path: redirect.value || "/" });
}).catch(() => {
verify.value.Reset()
loading.value = false;
//
if (captchaEnabled.value) {
@ -128,7 +142,12 @@ function handleLogin() {
}
});
}
function onVerifySuccess(params) {
loginForm.value.verification = true
}
function onVerifyFailed() {
loginForm.value.verification = false
}
function getCode() {
getCodeImg().then(res => {
captchaEnabled.value = res.captchaEnabled === undefined ? true : res.captchaEnabled;
@ -146,60 +165,176 @@ function getCookie() {
loginForm.value = {
username: username === undefined ? loginForm.value.username : username,
password: password === undefined ? loginForm.value.password : decrypt(password),
rememberMe: rememberMe === undefined ? false : Boolean(rememberMe)
rememberMe: rememberMe === undefined ? false : Boolean(rememberMe),
};
}
// getCode();
getCookie();
// getCookie();
</script>
<style lang='scss' scoped>
.login {
:deep(.el-form-item) {
margin-bottom: 26px !important;
}
.login-title {
font-family: 'Alibaba-PuHuiTi-Heavy';
font-weight: 400;
font-size: 72px !important;
color: #102841;
opacity: 1;
z-index: 100;
width: 100%;
margin-top: -50px;
text-align: center;
}
.loginbj {
width: 66.5%;
height: 86.66%;
position: absolute;
background: url('../assets/images/loginbj.png');
background-size: 100% 100%;
bottom: 0;
left: 0;
z-index: 1;
}
:deep(.el-checkbox__label) {
color: #333 !important;
}
.topimg {
position: absolute;
left: 32px;
top: 0;
width: 409px;
height: 102px;
background: url('../assets/images/topimg.png');
background-size: 100% 100%;
}
.hydl>div:nth-child(1),
.hydl>div:nth-child(3) {
height: 1px;
width: 88px;
background: #333333;
}
.hydl {
display: flex;
align-items: center;
justify-content: center;
color: #333333;
font-size: 24px;
margin: 0 20px;
margin-top: 86px;
margin-bottom: 55px;
}
.tab {
width: 100%;
height: 55px;
background-color: #147F6F;
display: flex;
align-items: center;
justify-content: center;
position: absolute;
bottom: 25px;
}
.harfCSS {
height: 22.08px;
font-size: 16px;
font-family: Source Han Sans CN, Source Han Sans CN;
font-weight: 400;
color: #FFFFFF;
border-bottom: 1px solid #fff;
margin: 0 23.2px;
cursor: pointer;
}
.login {
display: flex;
justify-content: flex-end;
align-items: center;
position: relative;
height: 100%;
background-image: url("../assets/images/login-background.jpg");
background-size: cover;
background: #dae8f8;
}
.title {
margin: 0px auto 30px auto;
text-align: center;
color: #707070;
}
:deep(.el-input__inner) {
background: rgba(153, 153, 153, 0.15);
padding-left: 45px !important;
height: 60px;
line-height: 60px;
border-radius: 8px 8px 8px 8px;
box-shadow: none;
}
:deep(.el-input--large .el-input__icon) {
line-height: 60px !important;
}
:deep(.login-form .input-icon),
:deep(.login-form .el-input) {
height: 60px !important;
}
.login-form {
z-index: 111;
border-radius: 6px;
background: #ffffff;
width: 400px;
padding: 25px 25px 5px 25px;
background-color: #fff;
/* 设置半透明背景 */
// backdrop-filter: blur(3px);
/* 设置模糊值 */
margin-right: 207px;
// width: 520px;
width: 568px;
padding: 50px 30px 100px 30px;
border-radius: 0px 0px 0px 0px;
padding-top: 0;
.el-input {
height: 40px;
input {
height: 40px;
}
}
.input-icon {
height: 39px;
width: 14px;
margin-left: 0px;
}
}
.login-tip {
font-size: 13px;
text-align: center;
color: #bfbfbf;
}
.login-code {
width: 33%;
height: 40px;
float: right;
img {
cursor: pointer;
vertical-align: middle;
}
}
.el-login-footer {
height: 40px;
line-height: 40px;
@ -212,6 +347,7 @@ getCookie();
font-size: 12px;
letter-spacing: 1px;
}
.login-code-img {
height: 40px;
padding-left: 12px;

@ -1,7 +1,7 @@
<template>
<div class="register">
<el-form ref="registerRef" :model="registerForm" :rules="registerRules" class="register-form">
<h3 class="title">致博后台管理系统</h3>
<h3 class="title">智慧工地管理系统</h3>
<el-form-item prop="username">
<el-input
v-model="registerForm.username"

@ -0,0 +1,51 @@
import axios from '@/utils/request'
// 查询分页数据:
export const iuserList = (arg) => {
return axios.request({
url: '/iuser/list',
method: 'get',
params: arg,
dataType: 'json'
})
}
// 查询详情数据:
export const iuserGetById = (arg) => {
return axios.request({
url: `/iuser/getById`,
method: 'get',
params: arg,
dataType: 'json'
})
}
// 添加数据:
export const iuserAdd = (arg) => {
return axios.request({
url: '/iuser/add',
method: 'post',
data: arg,
dataType: 'json'
})
}
// 修改数据:
export const IuserUpdate = (arg) => {
return axios.request({
url: '/iuser/update',
method: 'put',
data: arg,
dataType: 'json'
})
}
// 删除数据:
export const iuserDelete = (arg) => {
return axios.request({
url: '/iuser/delete',
method: 'delete',
params: {
id: arg.id[0]
},
dataType: 'json'
})
}

@ -0,0 +1,66 @@
<script setup>
import { reactive } from 'vue'
import { iuserList, iuserAdd, IuserUpdate, iuserDelete, iuserGetById } from './api'
import { baseModelOptions, baseFilterOptions } from './options'
// const { proxy } = getCurrentInstance();
const state = reactive({
baseModelOptions: baseModelOptions(),
baseFilterOptions: baseFilterOptions(),
title: "实名管理",
baseModelName: '实名信息',
addBtnName: '新增人员',
editBtnName: '',
delBtnName: '',
primaryKey: 'id',
getTableFn: iuserList,
addFn: iuserAdd,
editFn: IuserUpdate,
deleteFn: iuserDelete,
detailFn: iuserGetById,
showEditBtn: false,
showDeleteBtn: false,
columnCount: 1,
hideselection:true,
// rowControl: {
// showEditBtn: false,
// showDelBtn: false
// },
permission: {//
add: 'realName:page:list',
edit: 'realName:page:list',
delete: 'realName:page:list',
detail: 'realName:page:list',
},
pageInfo: { total: 0, base: { limit: 8, current: 1 } },
})
</script>
<template>
<div class="app-container">
<BaseTablePage :tableOptions="state">
<template v-slot:column>
<el-table-column type="index" align="center" label="序号" width="70" />
<el-table-column label="姓名" align="center" prop="name" />
<el-table-column label="身份证" align="center" prop="idCard" />
<el-table-column label="工种" align="center" prop="workType" />
<el-table-column label="联系方式" align="center" prop="tel" />
<el-table-column label="录入时间" align="center" prop="createTime" />
</template>
<template #control="baseScope">
<el-table-column label="操作" align="center" width="300" fixed="right">
<template #default="scope">
<el-button plain type="text" icon="Edit" @click="baseScope.handleEdit(scope.$index, scope.row)"
v-hasPermi="['realName:page:edit']">修改</el-button>
<el-button type="text" @click="baseScope.deleteTableData(scope.$index, scope.row)"
v-hasPermi="['realName:page:remove']" icon="Delete">删除</el-button>
</template>
</el-table-column>
</template>
</BaseTablePage>
</div>
</template>
<style scoped></style>

@ -0,0 +1,155 @@
export const baseModelOptions = () => {
function validateIDCard(idCard) {
// 15 位身份证号码正则
const regex15 = /^[1-9]\d{5}\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}$/;
// 18 位身份证号码正则
const regex18 = /^[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[0-9Xx]$/;
return regex15.test(idCard) || regex18.test(idCard);
}
const validatePass = (rule, value, callback) => {
if (value === '') {
callback(new Error('请输入身份证'))
} else {
if (!validateIDCard(value)) {
callback(new Error('身份证格式不正确'))
return
}
callback()
}
}
function validatePhoneNumber(phoneNumber) {
const regex = /^1[3-9]\d{9}$/;
return regex.test(phoneNumber);
}
const validatePass2 = (rule, value, callback) => {
if (value === '') {
callback()
} else {
if (!validatePhoneNumber(value)) {
callback(new Error('手机号格式不正确'))
return
}
callback()
}
}
return [
{
tag: 'el-input',
label: '姓名:',
key: 'name',
value: '',
default: '',
rules: [
{ required: true, message: '请输入姓名', trigger: 'blur' },
],
attribute: {//属性
type: 'text',
placeholder: '请输入姓名',
},
},
{
tag: 'el-input',
label: '身份证:',
key: 'idCard',
value: '',
default: '',
rules: [
{ required: true, validator: validatePass, trigger: 'blur' },
],
attribute: {//属性
type: 'text',
placeholder: '请输入身份证',
},
},
{
tag: 'el-input',
label: '工种:',
key: 'workType',
value: '',
default: '',
// rules: [
// { required: true, message: '请输入工种', trigger: 'blur' },
// ],
attribute: {//属性
type: 'text',
placeholder: '请输入工种',
},
},
{
tag: 'el-input',
label: '联系方式:',
key: 'tel',
value: '',
default: '',
rules: [
{ required: false, validator: validatePass2, trigger: 'blur' },
],
attribute: {//属性
type: 'text',
placeholder: '请输入联系方式',
},
},
]
}
export const baseFilterOptions = () => {
return [
{
tag: 'el-input',
label: '姓名:',
key: 'name',
value: '',
default: '',
rules: [
{ required: true, message: '请输入姓名', trigger: 'blur' },
],
attribute: {//属性
type: 'text',
placeholder: '请输入姓名',
},
},
{
tag: 'el-input',
label: '身份证:',
key: 'idCard',
value: '',
default: '',
rules: [
{ required: true, message: '请输入身份证', trigger: 'blur' },
],
attribute: {//属性
type: 'text',
placeholder: '请输入身份证',
},
},
{
tag: 'el-input',
label: '工种:',
key: 'workType',
value: '',
default: '',
// rules: [
// { required: true, message: '请输入工种', trigger: 'blur' },
// ],
attribute: {//属性
type: 'text',
placeholder: '请输入工种',
},
},
{
tag: 'el-input',
label: '联系方式:',
key: 'tel',
value: '',
default: '',
attribute: {//属性
type: 'text',
placeholder: '请输入联系方式',
},
},
]
}

@ -0,0 +1,66 @@
import axios from '@/utils/request'
// 查询分页数据:
export const isafeList = (arg) => {
return axios.request({
url: '/isafe/list',
method: 'get',
params: arg,
dataType: 'json',
})
}
// 查询详情数据:
export const isafeGetById = (arg) => {
return axios.request({
url: `/isafe/getById`,
method: 'get',
params: arg,
dataType: 'json',
})
}
// 添加数据:
export const isafeAdd = (arg) => {
return axios.request({
url: '/isafe/add',
method: 'post',
data: arg,
dataType: 'json',
})
}
// 修改数据:
export const isafeUpdate = (arg) => {
return axios.request({
url: '/isafe/update',
method: 'put',
data: arg,
dataType: 'json',
})
}
// 删除数据:
export const isafeDelete = (arg) => {
return axios.request({
url: '/isafe/delete',
method: 'delete',
params: {
id:arg.id[0]
},
dataType: 'json',
})
}
// 查询分页数据:
export const iproductionplanList = (arg) => {
return axios.request({
url: '/iproductionplan/list',
method: 'get',
params: arg,
dataType: 'json',
})
}

@ -0,0 +1,65 @@
<script setup>
import { reactive } from 'vue'
import { isafeList, isafeAdd, isafeUpdate, isafeDelete, isafeGetById, iproductionplanList } from './api'
import { baseModelOptions, baseFilterOptions } from './options'
const { proxy } = getCurrentInstance();
const state = reactive({
baseModelOptions: baseModelOptions(),
baseFilterOptions: baseFilterOptions(),
title: "安全教育管理",
baseModelName: '安全教育信息',
addBtnName: '新增安全教育',
editBtnName: '',
delBtnName: '',
primaryKey: 'id',
getTableFn: isafeList,
addFn: isafeAdd,
editFn: isafeUpdate,
deleteFn: isafeDelete,
detailFn: isafeGetById,
showEditBtn: false,
showDeleteBtn: false,
columnCount: 1,
// rowControl: {
// showEditBtn: false,
// showDelBtn: false
// },
permission: {//
add: 'safetyEducation:page:list',
edit: 'safetyEducation:page:list',
delete: 'safetyEducation:page:list',
detail: 'safetyEducation:page:list',
},
hideselection: true,
pageInfo: { total: 0, base: { limit: 8, current: 1 } },
})
</script>
<template>
<div class="app-container">
<BaseTablePage :tableOptions="state">
<template v-slot:column>
<el-table-column label="姓名" align="center" prop="name" />
<el-table-column label="安全教育时间" align="center" prop="date" />
<el-table-column label="创建人" align="center" prop="creator" />
<el-table-column label="创建时间" align="center" prop="createTime" />
</template>
<template #control="baseScope">
<el-table-column label="操作" align="center" width="200" fixed="right">
<template #default="scope">
<el-button v-hasPermi="['safetyEducation:page:edit']" type="text" icon="EditPen"
@click="baseScope.handleEdit(scope.$index, scope.row)">
修改
</el-button>
<el-button v-hasPermi="['safetyEducation:page:remove']" type="text" icon="Delete"
@click="baseScope.deleteTableData(scope.$index, scope.row)">删除</el-button>
</template>
</el-table-column>
</template>
</BaseTablePage>
</div>
</template>
<style scoped></style>

@ -0,0 +1,69 @@
export const baseModelOptions = () => {
return [
{
tag: 'el-input',
label: '姓名:',
key: 'name',
value: '',
default: '',
rules: [
{ required: true, message: '请输入姓名', trigger: 'blur' },
],
attribute: {//属性
type: 'text',
placeholder: '请输入姓名',
},
},
{
tag: "el-date-picker",
label: '安全教育时间:',
key: 'date',
value: '',
default: '',
rules: [
{ required: true, message: '请选择安全教育时间', trigger: 'blur' },
],
attribute: {//属性
valueFormat: "YYYY-MM-DD",
type: "date",
placeholder: '请选择安全教育时间',
},
},
]
}
export const baseFilterOptions = () => {
return [
{
tag: 'el-input',
label: '姓名:',
key: 'name',
value: '',
default: '',
rules: [
{ required: true, message: '请输入姓名', trigger: 'blur' },
],
attribute: {//属性
type: 'text',
placeholder: '请输入姓名',
},
},
{
tag: "el-date-picker",
label: '安全教育时间:',
key: 'date',
value: '',
default: '',
rules: [
{ required: true, message: '请选择安全教育时间', trigger: 'blur' },
],
attribute: {//属性
valueFormat: "YYYY-MM-DD",
type: "date",
placeholder: '请选择安全教育时间',
},
},
]
}

@ -32,8 +32,8 @@ export const baseModelOptions = () => {
tag: 'el-input-number',
label: '角色顺序:',
key: 'roleSort',
value: '',
default: '',
value: 0,
default: 0,
attribute: {//属性
type: 'text',
placeholder: '请输入角色顺序',

@ -1,5 +1,7 @@
<template>
<div class="user-info-head" @click="editCropper()"><img :src="options.img" title="点击上传头像" class="img-circle img-lg" /></div>
<div class="user-info-head" @click="editCropper()">
<div style="position: absolute;top: 50px;width: 100%;text-align: center">点击上传头像</div>
<img :src="options.img" title="" class="img-circle img-lg" /></div>
<el-dialog :title="title" v-model="open" width="800px" append-to-body @opened="modalOpened" @close="closeDialog">
<el-row>
<el-col :xs="24" :md="12" :style="{height: '350px'}">

@ -0,0 +1,66 @@
import axios from '@/utils/request'
// 查询分页数据:
export const vehicleList = (arg) => {
return axios.request({
url: '/vehicle/list',
method: 'get',
params: arg,
dataType: 'json',
})
}
// 查询详情数据:
export const vehicleGetById = (arg) => {
return axios.request({
url: `/vehicle/getById`,
method: 'get',
params: arg,
dataType: 'json',
})
}
// 添加数据:
export const vehicleAdd = (arg) => {
return axios.request({
url: '/vehicle/add',
method: 'post',
data: arg,
dataType: 'json',
})
}
// 修改数据:
export const vehicleUpdate = (arg) => {
return axios.request({
url: '/vehicle/update',
method: 'put',
data: arg,
dataType: 'json',
})
}
// 删除数据:
export const vehicleDelete = (arg) => {
return axios.request({
url: '/vehicle/delete',
method: 'delete',
params: {
id:arg.id[0]
},
dataType: 'json',
})
}
// 查询分页数据:
export const iproductionplanList = (arg) => {
return axios.request({
url: '/iproductionplan/list',
method: 'get',
params: arg,
dataType: 'json',
})
}

@ -0,0 +1,89 @@
<script setup>
import { reactive } from 'vue'
import { vehicleList, vehicleAdd, vehicleUpdate, vehicleDelete, vehicleGetById, iproductionplanList } from './api'
import { baseModelOptions, baseFilterOptions } from './options'
const { proxy } = getCurrentInstance();
const state = reactive({
baseModelOptions: baseModelOptions(),
baseFilterOptions: baseFilterOptions(),
title: "运输车辆管理",
baseModelName: '运输车辆信息',
addBtnName: '添加运输车辆',
editBtnName: '',
delBtnName: '',
primaryKey: 'id',
getTableFn: vehicleList,
addFn: vehicleAdd,
editFn: vehicleUpdate,
deleteFn: vehicleDelete,
detailFn: vehicleGetById,
showEditBtn: false,
showDeleteBtn: false,
hideControl: true,
showAddBtn: false,
columnCount: 1,
rowControl: {
showEditBtn: false,
showDelBtn: false
},
permission: {//
add: 'constructionAchinery:page:list',
edit: 'constructionAchinery:page:list',
delete: 'constructionAchinery:page:list',
detail: 'constructionAchinery:page:list',
},
hideselection: true,
baseQuery: { scope: 'aotomobile' },
pageInfo: { total: 0, base: { limit: 8, current: 1 } },
})
</script>
<template>
<div class="app-container">
<BaseTablePage :tableOptions="state">
<template v-slot:column>
<el-table-column type="index" align="center" label="序号" width="70" />
<el-table-column label="设备名称" align="center" prop="deviceName" />
<el-table-column label="IMEI" align="center" prop="imei" />
<el-table-column label="设备型号" align="center" prop="mcType" />
<el-table-column label="设备类型" align="center" prop="mcType">
<template #default="scope">
{{ scope.row.equipType == 'WIRED' ? '有线' : scope.row.equipType == 'WIRELESS' ? '无线' : '-' }}
</template>
</el-table-column>
<el-table-column label="司机姓名" align="center" prop="driverName" />
<el-table-column label="司机电话" align="center" prop="driverPhone" />
<el-table-column label="车牌号" align="center" prop="vehicleNumber" />
<el-table-column label="车架号" align="center" prop="carFrame" />
<el-table-column label="激活时间" align="center" prop="activationTime" />
<el-table-column label="设备SIM卡号" align="center" prop="sim" />
<el-table-column label="平台到期时间" align="center" prop="expiration" />
<el-table-column label="客户到期时间" align="center" prop="expiration" />
<el-table-column label="是否启用" align="center" prop="createTime">
<template #default="scope">
{{ scope.row.enabledFlag == '0' ? '不启用' : scope.row.enabledFlag == '1' ? '启用' : '-' }}
</template>
</el-table-column>
<el-table-column label="备注" align="center" prop="reMark" />
</template>
<!-- <template #control="baseScope">
<el-table-column label="操作" align="center" width="200" fixed="right">
<template #default="scope">
<el-button v-hasPermi="['constructionAchinery:page:edit']" type="text" icon="EditPen"
@click="baseScope.handleEdit(scope.$index, scope.row)">
修改
</el-button>
<el-button v-hasPermi="['constructionAchinery:page:remove']" type="text" icon="Delete"
@click="baseScope.deleteTableData(scope.$index, scope.row)">删除</el-button>
</template>
</el-table-column>
</template> -->
</BaseTablePage>
</div>
</template>
<style scoped></style>

@ -0,0 +1,43 @@
export const baseModelOptions = () => {
return [
]
}
export const baseFilterOptions = () => {
return [
{
tag: 'el-input',
label: '设备名称:',
key: 'deviceName',
value: '',
default: '',
attribute: {//属性
type: 'text',
placeholder: '请输入设备名称',
},
},
{
tag: 'el-input',
label: 'IMEI:',
key: 'imei',
value: '',
default: '',
attribute: {//属性
type: 'text',
placeholder: '请输入IMEI',
},
},
{
tag: 'el-input',
label: '设备类型:',
key: 'mcType',
value: '',
default: '',
attribute: {//属性
type: 'text',
placeholder: '请输入设备类型',
},
},
]
}

@ -0,0 +1,66 @@
import axios from '@/utils/request'
// 查询分页数据:
export const vehicleList = (arg) => {
return axios.request({
url: '/vehicle/list',
method: 'get',
params: arg,
dataType: 'json',
})
}
// 查询详情数据:
export const vehicleGetById = (arg) => {
return axios.request({
url: `/vehicle/getById`,
method: 'get',
params: arg,
dataType: 'json',
})
}
// 添加数据:
export const vehicleAdd = (arg) => {
return axios.request({
url: '/vehicle/add',
method: 'post',
data: arg,
dataType: 'json',
})
}
// 修改数据:
export const vehicleUpdate = (arg) => {
return axios.request({
url: '/vehicle/update',
method: 'put',
data: arg,
dataType: 'json',
})
}
// 删除数据:
export const vehicleDelete = (arg) => {
return axios.request({
url: '/vehicle/delete',
method: 'delete',
params: {
id:arg.id[0]
},
dataType: 'json',
})
}
// 查询分页数据:
export const iproductionplanList = (arg) => {
return axios.request({
url: '/iproductionplan/list',
method: 'get',
params: arg,
dataType: 'json',
})
}

@ -0,0 +1,89 @@
<script setup>
import { reactive } from 'vue'
import { vehicleList, vehicleAdd, vehicleUpdate, vehicleDelete, vehicleGetById, iproductionplanList } from './api'
import { baseModelOptions, baseFilterOptions } from './options'
const { proxy } = getCurrentInstance();
const state = reactive({
baseModelOptions: baseModelOptions(),
baseFilterOptions: baseFilterOptions(),
title: "施工机械管理",
baseModelName: '施工机械信息',
addBtnName: '添加施工机械',
editBtnName: '',
delBtnName: '',
primaryKey: 'id',
getTableFn: vehicleList,
addFn: vehicleAdd,
editFn: vehicleUpdate,
deleteFn: vehicleDelete,
detailFn: vehicleGetById,
showAddBtn: false,
showEditBtn: false,
showDeleteBtn: false,
hideControl: true,
columnCount: 1,
rowControl: {
showEditBtn: false,
showDelBtn: false
},
permission: {//
add: 'constructionAchinery:page:list',
edit: 'constructionAchinery:page:list',
delete: 'constructionAchinery:page:list',
detail: 'constructionAchinery:page:list',
},
hideselection: true,
baseQuery: { scope: 'personal' },
pageInfo: { total: 0, base: { limit: 8, current: 1 } },
})
</script>
<template>
<div class="app-container">
<BaseTablePage :tableOptions="state">
<template v-slot:column>
<el-table-column type="index" align="center" label="序号" width="70" />
<el-table-column label="设备名称" align="center" prop="deviceName" />
<el-table-column label="IMEI" align="center" prop="imei" />
<el-table-column label="设备型号" align="center" prop="mcType" />
<el-table-column label="设备类型" align="center" prop="mcType">
<template #default="scope">
{{ scope.row.equipType == 'WIRED' ? '有线' : scope.row.equipType == 'WIRELESS' ? '无线' : '-' }}
</template>
</el-table-column>
<el-table-column label="司机姓名" align="center" prop="driverName" />
<el-table-column label="司机电话" align="center" prop="driverPhone" />
<el-table-column label="车牌号" align="center" prop="vehicleNumber" />
<el-table-column label="车架号" align="center" prop="carFrame" />
<el-table-column label="激活时间" align="center" prop="activationTime" />
<el-table-column label="设备SIM卡号" align="center" prop="sim" />
<el-table-column label="平台到期时间" align="center" prop="expiration" />
<el-table-column label="客户到期时间" align="center" prop="expiration" />
<el-table-column label="是否启用" align="center" prop="createTime">
<template #default="scope">
{{ scope.row.enabledFlag == '0' ? '不启用' : scope.row.enabledFlag == '1' ? '启用' : '-' }}
</template>
</el-table-column>
<el-table-column label="备注" align="center" prop="reMark" />
</template>
<!-- <template #control="baseScope">
<el-table-column label="操作" align="center" width="200" fixed="right">
<template #default="scope">
<el-button v-hasPermi="['constructionAchinery:page:edit']" type="text" icon="EditPen"
@click="baseScope.handleEdit(scope.$index, scope.row)">
修改
</el-button>
<el-button v-hasPermi="['constructionAchinery:page:remove']" type="text" icon="Delete"
@click="baseScope.deleteTableData(scope.$index, scope.row)">删除</el-button>
</template>
</el-table-column>
</template> -->
</BaseTablePage>
</div>
</template>
<style scoped></style>

@ -0,0 +1,63 @@
export const baseModelOptions = () => {
return [
]
}
export const baseFilterOptions = () => {
return [
{
tag: 'el-input',
label: '设备名称:',
key: 'deviceName',
value: '',
default: '',
attribute: {//属性
type: 'text',
placeholder: '请输入设备名称',
},
},
{
tag: 'el-input',
label: 'IMEI:',
key: 'imei',
value: '',
default: '',
attribute: {//属性
type: 'text',
placeholder: '请输入IMEI',
},
},
{
tag: 'el-input',
label: '设备型号:',
key: 'mcType',
value: '',
default: '',
attribute: {//属性
type: 'text',
placeholder: '请输入设备型号',
},
},
{
tag: 'BaseSelect',
label: '设备类型:',
key: 'equipType',
value: '',
default: '',
rules: [
{ required: true, message: '请选择设备类型', trigger: 'blur' },
],
attribute: { //属性
placeholder: '请选择设备类型',
options: [{
value: "WIRED",
label: "有线"
},{
value: "WIRELESS",
label: "无线"
}]
},
},
]
}

File diff suppressed because one or more lines are too long

@ -43,8 +43,8 @@ export default defineConfig(({ mode, command }) => {
},
proxy: {
'/dev-api': {
// target: 'http://192.168.2.39:8080',
target: 'http://39.100.74.100:8080',
target: 'http://192.168.2.39:8080',
// target: 'http://39.100.74.100:8080',
changeOrigin: true,
rewrite: (p) => p.replace(/^\/dev-api/, '')
}

Loading…
Cancel
Save