统计分析

main
严飞永 1 month ago
parent 85777235b2
commit 8302af65f4

@ -5,7 +5,7 @@ VUE_APP_TITLE = 工业园区工业上楼项目系统
ENV = 'development'
# 工业园区工业上楼项目系统/开发环境
VUE_APP_BASE_API = ''
VUE_APP_BASE_API = '/dev-api'
# 路由懒加载
VUE_CLI_BABEL_TRANSPILE_MODULES = true

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 263 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 508 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 669 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

@ -37,7 +37,6 @@ $base-sub-menu-hover:#001528;
*/
$base-header-height: 60px; //
$base-sidebar-width: 200px;
$base-sidebar-background: #304156; //
// the :export directive is the magic sauce for webpack
// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass

@ -1,15 +1,28 @@
<template>
<div class="navbar" >
<div>这里放logo图</div>
<hamburger id="hamburger-container" :is-active="sidebar.opened" class="hamburger-container" @toggleClick="toggleSideBar" />
<breadcrumb id="breadcrumb-container" class="breadcrumb-container" v-if="!topNav"/>
<top-nav id="topmenu-container" class="topmenu-container" v-if="topNav"/>
<div class="navbar">
<div class="navbarleft">
<div class="logoimg">
<img src="../../assets/images/bluelogo@2x.png" alt="">
<span>工业园区工业上楼项目系统</span>
</div>
</div>
<div class="right-menu">
<el-badge :value="unreadMessages" :hidden="unreadMessages === 0" class="item">
<el-dropdown trigger="click" @command="handleCommand">
<span class="el-dropdown-link">
<i class="el-icon-bell"></i>
</span>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item v-for="(message, index) in messages" :key="index" :command="message">
{{ message }}
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</el-badge>
<el-dropdown class="avatar-container right-menu-item hover-effect" trigger="click">
<div class="avatar-wrapper">
<img :src="avatar" class="user-avatar">
<i class="el-icon-caret-bottom" />
<i class="el-icon-caret-bottom"/>
</div>
<el-dropdown-menu slot="dropdown">
<router-link to="/user/profile">
@ -49,6 +62,16 @@ export default {
RuoYiGit,
RuoYiDoc
},
data() {
return {
messages: [
'消息1',
'消息2',
'消息3',
'消息4'
]
}
},
computed: {
...mapGetters([
'sidebar',
@ -70,6 +93,9 @@ export default {
get() {
return this.$store.state.settings.topNav
}
},
unreadMessages() {
return this.messages.length
}
},
methods: {
@ -85,7 +111,10 @@ export default {
this.$store.dispatch('LogOut').then(() => {
location.href = '/index';
})
}).catch(() => {});
}).catch(() => { });
},
handleCommand(command) {
this.$message('点击了: ' + command)
}
}
}
@ -94,10 +123,37 @@ export default {
<style lang="scss" scoped>
.navbar {
display: flex;
justify-content: space-between;
height: 50px;
overflow: hidden;
position: relative;
background: #fff;
.logoimg{
display: flex;
align-items: center;
gap: .5rem;
}
.logoimg img{
width: 3.69rem;
height: 2rem;
margin-left:1.2rem ;
}
.logoimg span{
width: auto;
height: 2.06rem;
font-family: AlibabaPuHuiTi, AlibabaPuHuiTi;
font-weight: 500;
font-size: 1.5rem;
color: #292C33;
line-height: 2.06rem;
text-align: left;
font-style: normal;
text-transform: none;
}
.navbarleft{
display: flex;
align-items: center;
}
.hamburger-container {
line-height: 46px;
@ -105,7 +161,7 @@ export default {
float: left;
cursor: pointer;
transition: background .3s;
-webkit-tap-highlight-color:transparent;
-webkit-tap-highlight-color: transparent;
&:hover {
background: rgba(0, 0, 0, .025)
@ -129,6 +185,7 @@ export default {
.right-menu {
float: right;
height: 100%;
display: flex;
line-height: 50px;
&:focus {
@ -176,6 +233,18 @@ export default {
}
}
}
.item {
margin-right: 10px;
margin-top: .5rem;
.el-dropdown-link {
cursor: pointer;
color: black;
}
.el-dropdown-link i {
font-size: 2rem; /* 增大图标的大小 */
}
}
}
}
</style>
</style>

@ -0,0 +1,176 @@
<template>
<div class="navbar">
<div class="navbarleft">
<!-- <hamburger id="hamburger-container" :is-active="sidebar.opened" class="hamburger-container"
@toggleClick="toggleSideBar" /> -->
<breadcrumb id="breadcrumb-container" class="breadcrumb-container" v-if="!topNav" />
<top-nav id="topmenu-container" class="topmenu-container" v-if="topNav" />
</div>
</div>
</template>
<script>
import { mapGetters } from 'vuex'
import Breadcrumb from '@/components/Breadcrumb'
import TopNav from '@/components/TopNav'
// import Hamburger from '@/components/Hamburger'
import Screenfull from '@/components/Screenfull'
import SizeSelect from '@/components/SizeSelect'
import Search from '@/components/HeaderSearch'
import RuoYiGit from '@/components/RuoYi/Git'
import RuoYiDoc from '@/components/RuoYi/Doc'
export default {
components: {
Breadcrumb,
TopNav,
// Hamburger,
Screenfull,
SizeSelect,
Search,
RuoYiGit,
RuoYiDoc
},
computed: {
...mapGetters([
'sidebar',
'avatar',
'device'
]),
setting: {
get() {
return this.$store.state.settings.showSettings
},
set(val) {
this.$store.dispatch('settings/changeSetting', {
key: 'showSettings',
value: val
})
}
},
topNav: {
get() {
return this.$store.state.settings.topNav
}
}
},
methods: {
// toggleSideBar() {
// this.$store.dispatch('app/toggleSideBar')
// },
async logout() {
this.$confirm('确定注销并退出系统吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.$store.dispatch('LogOut').then(() => {
location.href = '/index';
})
}).catch(() => { });
}
}
}
</script>
<style lang="scss" scoped>
.navbar {
display: flex;
justify-content: space-between;
height: 50px;
overflow: hidden;
position: relative;
background: #fff;
.logoimg{
display: flex;
align-items: center;
}
.navbarleft{
width: 100%;
display: flex;
align-items: center;
margin-left: 1rem;
border-bottom: 1px solid #f3f4f5;
}
.hamburger-container {
line-height: 46px;
height: 100%;
float: left;
cursor: pointer;
transition: background .3s;
-webkit-tap-highlight-color: transparent;
&:hover {
background: rgba(0, 0, 0, .025)
}
}
.breadcrumb-container {
float: left;
}
.topmenu-container {
position: absolute;
left: 50px;
}
.errLog-container {
display: inline-block;
vertical-align: top;
}
.right-menu {
float: right;
height: 100%;
line-height: 50px;
&:focus {
outline: none;
}
.right-menu-item {
display: inline-block;
padding: 0 8px;
height: 100%;
font-size: 18px;
color: #5a5e66;
vertical-align: text-bottom;
&.hover-effect {
cursor: pointer;
transition: background .3s;
&:hover {
background: rgba(0, 0, 0, .025)
}
}
}
.avatar-container {
margin-right: 30px;
.avatar-wrapper {
margin-top: 5px;
position: relative;
.user-avatar {
cursor: pointer;
width: 40px;
height: 40px;
border-radius: 10px;
}
.el-icon-caret-bottom {
cursor: pointer;
position: absolute;
right: -20px;
top: 25px;
font-size: 12px;
}
}
}
}
}
</style>

@ -12,8 +12,8 @@
<!-- 右侧内容区域 -->
<div :class="{'content-container': true, 'sidebarHide': sidebar.hide}">
<tags-view v-if="needTagsView"/> <!-- 标签视图组件仅在 needTagsView 为真时显示 -->
<app-main/> <!-- 主要内容区域 -->
<div class="breadword-container"><Breadword></Breadword> </div>
<app-main style="background-color: #FAFAFA;"/>
</div>
</div>
@ -30,6 +30,7 @@ import { AppMain, Navbar, Settings, Sidebar, TagsView } from './components'
import ResizeMixin from './mixin/ResizeHandler'
import { mapState } from 'vuex'
import variables from '@/assets/styles/variables.scss'
import Breadword from './components/breadword.vue'
export default {
name: 'Layout',
@ -39,7 +40,8 @@ export default {
RightPanel,
Settings,
Sidebar,
TagsView
TagsView,
Breadword
},
mixins: [ResizeMixin],
computed: {
@ -52,7 +54,7 @@ export default {
}),
classObj() {
return {
hideSidebar: !this.sidebar.opened,
// hideSidebar: !this.sidebar.opened,
openSidebar: this.sidebar.opened,
withoutAnimation: this.sidebar.withoutAnimation
}
@ -96,7 +98,7 @@ export default {
display: flex;
flex: 1;
overflow: hidden;
background-color: #fff;
background-color: #FAFAFA;
}
.sidebar-container {
@ -105,13 +107,17 @@ export default {
transition: width 0.28s;
margin-top: 60px;
background-color: #f0f2f5;
// background-image: url("../../src/assets/images/bg@2x.png");
}
.breadword-container{
border-radius: 5rem;
}
.content-container {
flex: 1;
height: 100%;
overflow: auto;
padding: 16px;
background-color: #f0f2f5;
transition: margin-left 0.28s;

@ -1,13 +1,127 @@
<template>
<div>项目整体情况</div>
<div class="container">
<div>
<div class="title">整体项目情况</div class="title">
<table>
<thead>
<tr>
<th>项目总数</th>
<th>建筑面积(万平方米)</th>
<th>已建数量()</th>
<th>在建数量()</th>
<th>拟建数量()</th>
<th style="visibility: hidden;">拟建数量()</th>
</tr>
</thead>
<tbody>
<tr>
<td>{{ projectData.totalProjects }}</td>
<td>{{ projectData.totalArea }}</td>
<td>{{ projectData.completedProjects }}</td>
<td>{{ projectData.ongoingProjects }}</td>
<td>{{ projectData.plannedProjects }}</td>
</tr>
</tbody>
</table>
</div>
<div>
<div class="title">当年项目情况</div class="title">
<table>
<thead>
<tr>
<th>新开工项目数</th>
<th>建筑面积(万平方米)</th>
<th>已建数量()</th>
<th>在建数量()</th>
<th style="visibility: hidden;">拟建数量()</th>
<th style="visibility: hidden;">拟建数量()</th>
</tr>
</thead>
<tbody>
<tr>
<td>{{ projectData.totalProjects }}</td>
<td>{{ projectData.totalArea }}</td>
<td>{{ projectData.completedProjects }}</td>
<td>{{ projectData.ongoingProjects }}</td>
<!-- <td>{{ projectData.plannedProjects }}</td> -->
</tr>
</tbody>
</table>
</div>
</div>
</template>
<script>
export default {
data() {
return {
projectData: {
totalProjects: 384,
totalArea: 2352.6,
completedProjects: 189,
ongoingProjects: 100,
plannedProjects: 97
}
};
}
};
</script>
<style scoped>
.container {
display: flex;
flex-direction: column;
gap: 2rem;
}
table {
width: 100%;
border-collapse: collapse;
}
</script>
th,
td {
border: none;
padding: 8px;
text-align: left;
}
th {
width: 7rem;
}
<style scoped>
.title {
font-family: AlibabaPuHuiTi, AlibabaPuHuiTi;
font-weight: 600;
font-size: 1.25rem;
color: #3D424C;
line-height: 1.69rem;
text-align: left;
font-style: normal;
text-transform: none;
margin-bottom: .5rem;
margin-left: .4rem;
}
thead tr {
font-family: AlibabaPuHuiTi, AlibabaPuHuiTi;
font-weight: 400;
font-size: 0.88rem;
color: #7B8599;
line-height: 1.19rem;
text-align: left;
font-style: normal;
text-transform: none;
}
tbody tr {
font-family: DIN, DIN;
font-weight: 600;
font-size: 1.5rem;
color: #292C33;
line-height: 2.11rem;
text-align: left;
font-style: normal;
text-transform: none;
}
</style>

@ -1,166 +1,76 @@
<template>
<div class="container">
<div class="header">
<h2>项目总数</h2>
<p>384</p>
</div>
<div class="chart-container">
<div ref="chart" :style="{ width: '100%', height: '300px' }"></div>
</div>
<div class="legend">
<div v-for="item in legendData" :key="item.name" class="legend-item">
<span class="color-block" :style="{ backgroundColor: item.color }"></span>
<span class="label">{{ item.name }}</span>
<span class="value">{{ item.value }}</span>
<span class="percentage">{{ item.percentage }}%</span>
</div>
</div>
</div>
<div ref="chart" style="width: 30rem; height: 15rem;"></div>
</template>
<script>
import * as echarts from 'echarts';
export default {
name: 'ProjectDistributionModule',
data() {
return {
legendData: [
{ name: '高贸区', value: 54, percentage: 30, color: '#6eb158' },
{ name: '科创区', value: 65, percentage: 35, color: '#3f8cff' },
{ name: '度假区', value: 32, percentage: 12, color: '#ffc107' },
{ name: '商务区', value: 25, percentage: 13, color: '#cdcdcd' },
{ name: '苏相合作区', value: 15, percentage: 10, color: '#ff6b6b' },
],
};
},
name: 'RingChart',
mounted() {
this.initChart();
window.addEventListener('resize', this.resizeChart);
},
beforeUnmount() {
window.removeEventListener('resize', this.resizeChart);
if (this.myChart) {
this.myChart.dispose();
}
this.renderChart();
},
methods: {
//
initChart() {
this.myChart = echarts.init(this.$refs.chart);
const option = this.getChartOption();
this.myChart.setOption(option);
},
renderChart() {
const chartDom = this.$refs.chart;
const myChart = echarts.init(chartDom);
//
getChartOption() {
return {
const option = {
tooltip: {
trigger: 'item',
formatter: '{a} <br/>{b}: {c} ({d}%)',
trigger: 'item'
},
legend: {
orient: 'vertical', //
right: '10%', //
top: 'center', //
itemGap: 20, //
formatter: function (name) {
//
const data = [
{ value: 54, name: '高贸区' , itemStyle:{color:'#36C3FB'}},
{ value: 65, name: '科创区' , itemStyle:{color:'#5B76F9'} },
{ value: 32, name: '度假区' , itemStyle:{color:'#F08445'} },
{ value: 25, name: '商务区' , itemStyle:{color:'#F6B600'} },
{ value: 15, name: '苏相合作区' , itemStyle:{color:'#50DFB3'} }
];
//
const item = data.find(item => item.name === name);
return `${name} ${item.value}${((item.value / 384) * 100).toFixed(1)}%`;
}
},
series: [
{
name: '项目分布',
type: 'pie',
radius: ['40%', '70%'], //
data: this.legendData.map(item => ({
value: item.value,
name: item.name,
})),
radius: ['40%', '70%'],
center: ['30%', '50%'],
data: [
{ value: 54, name: '高贸区' , itemStyle:{color:'#36C3FB'}},
{ value: 65, name: '科创区' , itemStyle:{color:'#5B76F9'} },
{ value: 32, name: '度假区' , itemStyle:{color:'#F08445'} },
{ value: 25, name: '商务区' , itemStyle:{color:'#F6B600'} },
{ value: 15, name: '苏相合作区' , itemStyle:{color:'#50DFB3'} }
],
label: {
show: true, //
formatter: '{b}\n{c} ({d}%)', //
fontSize: 14,
fontWeight: 'bold',
},
labelLine: {
show: false, // 线
show: false //
},
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)',
},
},
},
],
color: this.legendData.map(item => item.color),
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
}
}
]
};
},
//
resizeChart() {
if (this.myChart) {
this.myChart.resize();
}
},
},
myChart.setOption(option);
}
}
};
</script>
<style scoped>
.container {
width: 40rem;
display: flex;
position: relative;
align-items: center;
border: 1px solid #ccc;
}
.header {
text-align: center;
margin-bottom: 20px;
position: absolute;
top: 0;
left: 0;
}
.header h2 {
font-size: 24px;
margin: 0;
}
.header p {
font-size: 32px;
font-weight: bold;
color: #333;
margin: 10px 0 0;
}
.chart-container {
margin-bottom: 20px;
}
.legend {
display: flex;
flex-direction: column;
gap: 10px;
margin-left: 5rem;
}
.legend-item {
display: flex;
align-items: center;
gap: 10px;
}
.color-block {
width: 16px;
height: 16px;
border-radius: 4px;
}
.label {
flex: 1;
font-size: 14px;
color: #333;
}
.value,
.percentage {
font-size: 14px;
color: #666;
}
/* 你可以在这里添加样式 */
</style>

@ -1,3 +1,74 @@
<template>
<div>分析</div>
</template>
</template><template>
<div ref="chart" style="width: 30rem; height: 15rem;"></div>
</template>
<script>
import * as echarts from 'echarts';
export default {
name: 'RingChart',
mounted() {
this.renderChart();
},
methods: {
renderChart() {
const chartDom = this.$refs.chart;
const myChart = echarts.init(chartDom);
const option = {
tooltip: {
trigger: 'item'
},
legend: {
orient: 'vertical', //
right: '10%', //
top: 'center', //
itemGap: 40, //
formatter: function (name) {
//
const data = [
{ value: 54, name: '国企' },
{ value: 65, name: '民企' },
{ value: 32, name: '外企' },
];
//
const item = data.find(item => item.name === name);
return `${name} ${item.value}${((item.value / 384) * 100).toFixed(1)}%`;
}
},
series: [
{
name: '项目分布',
type: 'pie',
radius: ['40%', '70%'],
center: ['30%', '50%'],
data: [
{ value: 54, name: '国企' , itemStyle:{color:'#36C3FB'}},
{ value: 65, name: '民企' , itemStyle:{color:'#5B76F9'} },
{ value: 32, name: '外企' , itemStyle:{color:'#F08445'} },
],
label: {
show: false //
},
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
}
}
]
};
myChart.setOption(option);
}
}
};
</script>
<style scoped>
/* 你可以在这里添加样式 */
</style>

@ -1,5 +1,5 @@
<template>
<div>地图模块</div>
<div class="mapcontain"></div>
</template>
<script>
@ -9,5 +9,11 @@
<style scoped>
.mapcontain{
width: 100%;
height: 19rem;
background-image: url(../../assets/images/map@2x.png);
background-size: 100% 100%;
background-repeat: no-repeat;
}
</style>

@ -1,13 +1,66 @@
<template>
<div>消息通知</div>
<div class="container">
<el-table :data="tableData" style="width: 100%" :show-header="false">
<el-table-column width="80">
<template slot-scope="scope">
<img :src="getIcon(scope.$index)" alt="icon" style="width: 2.19rem; height: 1.25rem;">
</template>
</el-table-column>
<el-table-column prop="name" width="300">
</el-table-column>
<el-table-column prop="date" width="100">
</el-table-column>
</el-table>
</div>
</template>
<script>
export default {
data() {
return {
tableData: [
{
date: '2016-05-02',
name: 'xxxxxxx项目2024年12月项目进展未填写',
},
{
date: '2016-05-04',
name: 'xxxxxxx项目2024年12月项目进展未填写',
},
{
date: '2016-05-01',
name: 'xxxxxxx项目2024年12月项目进展未填写',
},
{
date: '2016-05-03',
name: 'xxxxxxx项目2024年12月项目进展未填写',
},
{
date: '2016-05-03',
name: 'xxxxxxx项目2024年12月项目进展未填写',
},
{
date: '2016-05-03',
name: 'xxxxxxx项目2024年12月项目进展未填写',
},
{
date: '2016-05-03',
name: 'xxxxxxx项目2024年12月项目进展未填写',
}
]
}
},
methods: {
getIcon(index) {
return index === 0 ? require('@/assets/images/new@2x.png') : require('@/assets/images/other.png');
}
}
}
</script>
<style scoped>
.container{
width: 30rem;
height: 15.5rem;;
}
</style>

@ -1,13 +1,99 @@
<template>
<div>项目列表</div>
</template>
<script>
</script>
<style scoped>
</style>
<div class="projectList">
<el-table
:data="tableData"
style="width: 100%">
<el-table-column
prop="name"
label="项目名称"
width="170">
<template slot-scope="scope">
<span style="color: #2B62F1;">{{ scope.row.name }}</span>
</template>
</el-table-column>
<el-table-column
prop="address"
label="所在区域">
</el-table-column>
<el-table-column
prop="data"
label='总投资额(万元)'
width="88"
>
</el-table-column>
<el-table-column
prop="data"
label='建筑面积(万平方米)'
width="88">
</el-table-column>
<el-table-column
prop="status"
label="状态"
width="70">
<template slot-scope="scope">
<span :style="getStatusColor(scope.row.status)">{{ scope.row.status }}</span>
</template>
</el-table-column>
</el-table>
</div>
</template>
<script>
export default {
data() {
return {
tableData: [
{
date: '2016-05-02',
name: '大众电脑生成制造基地',
address: ' 1518 弄',
data: '1000',
status: '在建'
},
{
date: '2016-05-04',
name: '大众电脑生成制造基地',
address: ' 1517 弄',
data: '1500',
status: '拟建'
},
{
date: '2016-05-01',
name: '大众电脑生成制造基地',
address: ' 1519 弄',
data: '2000',
status: '已建'
},
{
date: '2016-05-03',
name: '大众电脑生成制造基地',
address: ' 1516 弄',
data: '2500',
status: '在建'
}
],
}
},
methods: {
getStatusColor(status) {
switch (status) {
case '在建':
return 'color: #2DD29F;';
case '拟建':
return 'color: #F08445;';
case '已建':
return 'color: #2B62F1;';
}
}
}
}
</script>
<style scoped>
.projectList {
padding: 0 .5rem 0rem 0;
height: 15rem;
overflow-y: auto;
}
</style>

@ -0,0 +1,59 @@
<template>
<div class="detail-container">
<h1>项目详情</h1>
<el-form :model="project" label-width="120px">
<el-form-item label="项目编号">
<span>{{ project.postId }}</span>
</el-form-item>
<el-form-item label="项目编码">
<span>{{ project.postCode }}</span>
</el-form-item>
<el-form-item label="项目名称">
<span>{{ project.postName }}</span>
</el-form-item>
<el-form-item label="项目排序">
<span>{{ project.postSort }}</span>
</el-form-item>
<el-form-item label="状态">
<dict-tag :options="dict.type.sys_normal_disable" :value="project.status"/>
</el-form-item>
<el-form-item label="创建时间">
<span>{{ parseTime(project.createTime) }}</span>
</el-form-item>
<el-form-item label="备注">
<span>{{ project.remark }}</span>
</el-form-item>
</el-form>
</div>
</template>
<script>
import { getPost } from "@/api/system/post";
export default {
name: "ProjectDetail",
dicts: ['sys_normal_disable'],
data() {
return {
project: {}
};
},
created() {
const postId = this.$route.params.postId;
this.getProjectDetail(postId);
},
methods: {
getProjectDetail(postId) {
getPost(postId).then(response => {
this.project = response.data;
});
}
}
};
</script>
<style scoped>
.detail-container {
padding: 20px;
}
</style>

@ -3,31 +3,51 @@
<div class="grid-container">
<div class="grid-item item-1">
<!-- 整体项目情况 -->
<div>
<div class="allarea">
<AllArea />
</div>
</div>
<div class="grid-item item-2">
<!-- 消息通知 -->
<div>
<div class="itemhead">
<span>消息通知</span>
</div>
<div class="mainarea">
<Message />
</div>
</div>
<div class="grid-item item-3">
<!-- 功能区 -->
<div>
<div class="itemhead">
<span>功能区</span>
</div>
<div class="relaitem">
<div class="itemsall">
<span>384</span>
<span>项目总数</span>
</div>
<FunctionArea />
</div>
</div>
<div class="grid-item item-4">
<!-- 项目列表 -->
<div>
<div class="itemhead">
<span>项目列表</span>
</div>
<div class="mainarea">
<ProjectList />
</div>
</div>
<div class="grid-item item-5">
<!-- 投资区 -->
<div>
<div class="itemhead">
<span>投资主体</span>
</div>
<div class="relaitem">
<div class="itemsall">
<span>112</span>
<span>项目总数</span>
</div>
<InvestArea />
</div>
</div>
@ -84,18 +104,78 @@ export default {
}
.grid-item {
background-color: #f0f0f0;
border: 1px solid #ccc;
padding: 1rem;
text-align: center;
font-size: 1.2rem;
font-weight: bold;
background-color: #FFFFFF;
border-radius: 0.5rem 0.5rem 0.5rem 0.5rem;
}
.itemhead {
width: 100%;
border-left: 0.25rem solid #2B62F1;
margin: 0.94rem 0;
height: 1.25rem;
display: flex;
align-items: center;
}
.relaitem{
position: relative;
}
.itemsall{
position: absolute;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
top: 5.5rem;
left: 7.2rem;
}
.itemsall span:nth-child(1){
font-family: DIN, DIN;
font-weight: 500;
font-size: 1.75rem;
color: #292C33;
line-height: 2.44rem;
text-align: left;
font-style: normal;
text-transform: none;
}
.itemsall span:nth-child(2){
font-family: AlibabaPuHuiTi, AlibabaPuHuiTi;
font-weight: 400;
font-size: 0.88rem;
color: #9E9E9E;
line-height: 1.25rem;
text-align: left;
font-style: normal;
text-transform: none;
}
.itemhead span {
margin-left: 1rem;
font-family: AlibabaPuHuiTi, AlibabaPuHuiTi;
font-weight: 600;
font-size: 1rem;
color: #3D424C;
line-height: 1.69rem;
text-align: left;
font-style: normal;
text-transform: none;
}
.mainarea{
padding: 0rem 0rem 0 1.4rem;
overflow: auto;
}
/* 第一行:第一个模块占两列 */
.item-1 {
grid-column: span 2;
/* 占两列 */
background-image: url(../../src/assets/images/allbg.png);
background-size: 100% 100%;
background-repeat: no-repeat;
}
.allarea {
width: 100%;
height: 15.5rem;
padding: 1rem 1.5rem;
}
/* 最后一行:一个模块占一整行 */

@ -191,7 +191,7 @@ export default {
}.loginleft {
width: 35rem;
height: 40rem;
background-image: url('../assets/images/loginleft.jpg');
background-image: url('../assets/images/loginleft.png');
background-size: 100% 100%;
background-repeat: no-repeat;
}
@ -253,8 +253,8 @@ export default {
}
.login-code {
width: 33%;
height: 38px;
width: 35%;
height: 1.8rem;
float: right;
img {

@ -0,0 +1,321 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="项目编码" prop="postCode">
<el-input
v-model="queryParams.postCode"
placeholder="请输入项目编码"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="项目名称" prop="postName">
<el-input
v-model="queryParams.postName"
placeholder="请输入项目名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="项目状态" clearable>
<el-option
v-for="dict in dict.type.sys_normal_disable"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"></el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"></el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['system:post:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['system:post:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['system:post:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['system:post:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="postList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="项目编号" align="center" prop="postId" />
<el-table-column label="项目编码" align="center" prop="postCode" />
<el-table-column label="项目名称" align="center" prop="postName" />
<el-table-column label="项目排序" align="center" prop="postSort" />
<el-table-column label="状态" align="center" prop="status">
<template slot-scope="scope">
<dict-tag :options="dict.type.sys_normal_disable" :value="scope.row.status"/>
</template>
</el-table-column>
<el-table-column label="创建时间" align="center" prop="createTime" width="180">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createTime) }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-view"
@click="handleDetail(scope.row)"
v-hasPermi="['system:post:detail']"
>详情</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:post:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:post:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改项目对话框 -->
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="项目名称" prop="postName">
<el-input v-model="form.postName" placeholder="请输入项目名称" />
</el-form-item>
<el-form-item label="项目编码" prop="postCode">
<el-input v-model="form.postCode" placeholder="请输入编码名称" />
</el-form-item>
<el-form-item label="项目顺序" prop="postSort">
<el-input-number v-model="form.postSort" controls-position="right" :min="0" />
</el-form-item>
<el-form-item label="项目状态" prop="status">
<el-radio-group v-model="form.status">
<el-radio
v-for="dict in dict.type.sys_normal_disable"
:key="dict.value"
:label="dict.value"
>{{dict.label}}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listPost, getPost, delPost, addPost, updatePost } from "@/api/system/post";
export default {
name: "Post",
dicts: ['sys_normal_disable'],
data() {
return {
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
postList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
postCode: undefined,
postName: undefined,
status: undefined
},
//
form: {},
//
rules: {
postName: [
{ required: true, message: "项目名称不能为空", trigger: "blur" }
],
postCode: [
{ required: true, message: "项目编码不能为空", trigger: "blur" }
],
postSort: [
{ required: true, message: "项目顺序不能为空", trigger: "blur" }
]
}
};
},
created() {
this.getList();
},
methods: {
/** 查询项目列表 */
getList() {
this.loading = true;
listPost(this.queryParams).then(response => {
this.postList = response.rows;
this.total = response.total;
this.loading = false;
});
},
//
cancel() {
this.open = false;
this.reset();
},
//
reset() {
this.form = {
postId: undefined,
postCode: undefined,
postName: undefined,
postSort: 0,
status: "0",
remark: undefined
};
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm");
this.handleQuery();
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.postId)
this.single = selection.length!=1
this.multiple = !selection.length
},
/** 新增按钮操作 */
handleAdd() {
this.reset();
this.open = true;
this.title = "添加项目";
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset();
const postId = row.postId || this.ids
getPost(postId).then(response => {
this.form = response.data;
this.open = true;
this.title = "修改项目";
});
},
/** 详情按钮操作 */
handleDetail(row) {
const userId = row.postId;
this.$router.push("/manage/detail/" + postId);
},
/** 提交按钮 */
submitForm: function() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.postId != undefined) {
updatePost(this.form).then(response => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
});
} else {
addPost(this.form).then(response => {
this.$modal.msgSuccess("新增成功");
this.open = false;
this.getList();
});
}
}
});
},
/** 删除按钮操作 */
handleDelete(row) {
const postIds = row.postId || this.ids;
this.$modal.confirm('是否确认删除项目编号为"' + postIds + '"的数据项?').then(function() {
return delPost(postIds);
}).then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
}).catch(() => {});
},
/** 导出按钮操作 */
handleExport() {
this.download('system/post/export', {
...this.queryParams
}, `post_${new Date().getTime()}.xlsx`)
}
}
};
</script>

@ -0,0 +1,3 @@
<template>
<div>123</div>
</template>

@ -36,7 +36,7 @@ module.exports = {
proxy: {
// detail: https://cli.vuejs.org/config/#devserver-proxy
[process.env.VUE_APP_BASE_API]: {
target: `https://vue.ruoyi.vip/prod-api`,
target: `http://192.168.0.125:7071`,
changeOrigin: true,
pathRewrite: {
['^' + process.env.VUE_APP_BASE_API]: ''

Loading…
Cancel
Save