15158846557 在线咨询 在线咨询
15158846557 在线咨询
所在位置: 首页 > 营销资讯 > 网站运营 > 基于 React+antd 的环境监测网站的设计与实现

基于 React+antd 的环境监测网站的设计与实现

时间:2023-09-04 14:06:01 | 来源:网站运营

时间:2023-09-04 14:06:01 来源:网站运营

基于 React+antd 的环境监测网站的设计与实现:摘 要: 生态环境是人类生存的物质基础,也是经济系统运行的基础,生态环境问题是由于人类长期的生产和生活等社会经济行为所引起的生态环境破坏而反作用于人类社会经济生活的不良影响,其实质是经济发展与环境保护、人与自然关系的失调。目前,环境问题已成为全球社会性的问题。如何解决好这一问题,关系到人类社会的生存。因此,采取有效的治理措施,对促进社会经济持续、健康发展具有十分重要的意义。所以,本网站的作用就是致力于监控生态环境并处理污染,主要针对空气、水质、土质和污染四个方面,并根据这四个方面来改善周围环境。本文主要阐述的是利用 React+antd 框架来搭建一个环境监测管理网站,包括网页制作,数据联调和功能说明等。

关键词:React;antd;管理网站; B/S 结构;环境;

1 引言

1972 年 6 月 5 日在瑞典首都斯德哥尔摩召开《联合国人类环境会议》,会议通过了《人类环境宣言》,并提出将每年的 6 月 5 日定为"世界环境日"。同年 10 月,第 27 届联合国大会通过决议接受了该建议。世界环境日的确立,反映了世界各国人民对环境问题的认识和态度,表达了我们人类对美好环境的向往和追求。

1989 年《中华人民共和国环境保护法》对环境的定义为:影响人类生存和发展的各种天然的和经过人工改造的自然因素的总体,包括大气、水、海洋、土地、矿藏、森林、草原、野生生物、自然遗迹、人文遗迹、自然保护区、风景名胜区、城市和乡村等。

环境是人类生存和发展的基本前提。环境为我们生存和发展提供了必需的资源和条件。随着社会经济的发展,环境问题已经作为一个不可回避的重要问题提上了各国政府的议事日程。保护环境,减轻环境污染,遏制生态恶化趋势,成为政府社会管理的重要任务。对于我们国家,保护环境是我国的一项基本国策,解决全国突出的环境问题,促进经济、社会与环境协调发展和实施可持续发展战略,是政府面临的重要而又艰巨的任务。

本网站的建设主要是为了监测周围空气、水质、土质和污染程度四个方面的数据,进行分析处理,最后实地解决环境问题。

2 系统概述

2.1 系统开发方法

本系统使用 B/S 架构开发,这样使得用户访问系统没有门槛。前端页面使用标准的 React+antd 设计,对大多数浏览器都很友好,配合使用 AJAX、XML、JSON、HTML5、CSS3 等技术,实现了非常好的视觉效果和用户体验,代码编辑器使用 Sublime Text3,数据将使用自己定义的 mock 数据,它将根据设置的 JSON 格式自动生成相应的数据。

综上所述,基于该一整套方案进行本系统的开发是可行的,可靠的,优秀的。

2.2 系统开发技术

本系统程序使用 React 技术编写,附加 antd 库,highcharts 库,配合 AJAX、XML、JSON、HTML5、CSS3,完成网站的设计和制作,还涉及到 ES6 代码书写的规范。

(1) React 技术简介

React 是近期非常热门的一个前端开发框架,其本身作为 MVC 中的 View 层可以用来构建 UI,也可以以插件的形式应用到 Web 应用非 UI 部分的构建中,轻松实现与其他 JS 框架的整合,比如 AngularJS。同时,React 通过对虚拟 DOM 中的微操作来实对现实际 DOM 的局部更新,提高性能。其组件的模块化开发提高了代码的可维护性。单向数据流的特点,让每个模块根据数据量自动更新,让开发者可以只专注于数据部分,改善程序的可预测性。

(2) React 特性

  1. 采用单向数据流,易追踪数据
  2. 将 HTML,JS 结合起来构建组件,组件状态和结果意义对应起来,实现模块化开发。
  3. 创建了高性能的虚拟 DOM,避免直接操作 DOM。即组件不是真实的 DOM 节点,而是存在于内存中的一种数据结构。所有的 DOM 变动都先在虚拟 DOM 上发生,然后再将实际发生变动的部分反映在真实 DOM 上。(DOM diff 算法)。
(3)AJAX 技术概述

AJAX 全称为 Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。是一种使用现有 JavaScript 技术标准的新方法。在 2005 年,Google 通过其 Google Suggest 使 AJAX 变得流行起来。

(4)AJAX 技术优势

Google 对 AJAX 技术使用使得 Google 的服务在用户体验上高人一筹。原因是 AJAX 可以让网页在不刷新的情况下实时更新来自服务器的内容而传统的网页(不使用 AJAX)如果需要更新内容,必需重载整个网页面。因此使用 AJAX 技术能让用户获得更好的体验。如今越来多的网络服务使用 AJAX 技术,如:新浪微博、Google 地图、人人网、开心网等等。

(5)Node.js

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。

这里将用到 Node.js 的包管理器 npm,npm 是全球最大的开源库生态系统。

(6)JSON 概述

JSON 是 JavaScript 对象表示法(JavaScript Object Notation),是存储和交换文本信息的语法,类似 XML。但是 JSON 比 XML 更小、更快,更易解析。用来传输小数据量的数据具有优势。

(7)highcharts 简介

Highcharts 是一个用纯 JavaScript 编写的一个图表库, 能够很简单便捷的在 Web 网站或是 Web 应用程序添加有交互性的图表,并且免费提供给个人学习、个人网站和非商业用途使用。HighCharts 支持的图表类型有曲线图、区域图、柱状图、饼状图、散状点图和综合图表。

(8)antd 简介

antd 全名 Ant Design 是蚂蚁金服针对 mobile 研发推出的一套基于 React 实现的 H5 组件库,类似于 bootstrap,React+antd 的组合类似于 JQuery+bootstrap 的组合。一个服务于企业级产品的设计体系,通过模块化的解决方案,让设计者专注于更好的用户体验,旨在帮助用户快速完成 H5 页面开发。Ant Design 提供了一套非常完整的 组件化设计规范 与 组件化编码规范,大幅提高了部分产品的设计研发效率及质量。Ant Design 与 G2 的代码质量和文档质量都非常高,算是阿里提出 “大中台,小前台” 后外面可见的杰出作品。

(9)antd 的特性

  1. 提炼自企业级中后台产品的交互语言和视觉风格。
  2. 开箱即用的高质量 React 组件。
  3. 使用 TypeScript 构建,提供完整的类型定义文件。
  4. 全链路开发和设计工具体系。
(10)ES6

ECMAScript 6.0(简称 ES6)是 JavaScript 语言的下一代标准,已经在 2015 年 6 月正式发布了。它的目标,是使得 JavaScript 语言可以用来编写复杂的大型应用程序,成为企业级开发语言。

综上所述,本系统将结合以上种种技术进行开发。

3 系统调研及可行性分析

3.1 系统调研

通过对一些后台工作网站浏览及调查研究,经过综合分析,了解了各种后台工作网站的大致的一个流程和功能,一般具备以下一些特征。

1 左侧导航条

一般后台工作网站的网页不会太多,有两级导航栏就可以满足基本功能,如图 2.1 所示。







图 2.1 antd 官网分类导航

2 头部信息

后台管理类的网站头部不会放很多功能,一般由网站的 logo 图标和登录注册之类的功能。如图 2.2 所示微博头部的页面展示。







图 2.2 淘宝网搜索栏

3 功能台

右侧的页面就是后台网站主要的功能点了,负者了网站绝大部分的功能,对后台管理网站来说是非常重要的了,如 2.3 所示,为 Ant Design Pro 网站展示。







图 2.3 Ant Design Pro 网站

通过调研发现的以上结果,会在本系统中重点设计。

3.2 系统总体目标

本系统的总体目标是能够对于数据能清晰的显示和分析,突出简单大气的后台网站的特点,如要对功能模块方面作修改,则无需进行整个系统的重新架构,只要部分修改即可。

3.3 可行性分析

3.3.1 项目基本要求

项目功能包括用户可以上传环境数据、查看环境数据,可以分配项目,进行工作分类完成。项目中的数据暂时用模拟的数据,在页面不重新启动的情况下有保存数据的功能。

3.3.2 系统总体目标

环境监测系统主要分为数据分析页,数据监控页,用户工作台,财务管理,项目管理和人员管理等几个板块内容,分别应用于环境数据分析,环境数据实时监控,用户处理工作,项目的财务分配和回收,新建和处理环境项目以及环境监测的人员目录。

4 系统分析

4.1 系统需求分析

经过以上对本系统的调研确定总体目标及可行性分析后,下面将对系统在功能上以及性能上进行进一步的需求分析。明确系统功能的组成和分布以及对设备性能的最低要求及推荐配置。

4.1.1 功能需求

系统的功能模块大体如下:

1 首页

有分析页,展示当日的天气状况和时间,展示环境指数的当日评分的各个地区的排名。

有监控页,实时监控环境指数的分值,可以查看哪个用于提交的数值。

有工作台,可以让登录的用户查看自己负者的项目和项目进度,并根据自己线下的工作更新项目进度。

2 列表页

有项目页,可以查看全部项目的进度和详情信息。

有人员信息页,可以查看全部人员的详细信息。

3 操作页

可以新建项目,可以管理财务相关功能。

4.1.2 非功能性需求

系统的非功能模块大体如下。

  1. 易用性需求:界面的易用性不错、界面美观。
  2. 安全性需求:用户操作具有相对安全性,不会造成密码泄露等安全隐患。
  3. 运行环境约束:暂时只兼容电脑端页面以及需要拥有网络的环境,页面源代码文件需要在装有 Node.jsde 电脑上进行 npm 运行,打包好的页面文件需要在服务器上才可运行。

5 系统设计

5.1 概要设计

5.1.1 网站结构设计

网站目录结构如下:

1 app 文件夹

actions 文件夹:接口返回数据处理。

components 文件夹:存放全局组件,如导航条,头部信息等。

constans 文件夹:存放全局的方法。

containers 文件夹:存放各个页面的组件代码。

reducers 文件夹:接口数据中转站,根据不同接口的数据进行分配。

routes 文件夹:页面路由管理,定义各个页面组件,让各个页面可以使用 LInk 跳转以及 js 触发跳转并传参。

static 文件夹:有 CSS 文件夹、font 文件夹、img 文件夹、img 文件夹、js 文件夹,分别存放全局 CSS 样式,font 样式,全局图片和全局 js 代码。

stores 文件夹:定义 React 中的基础组件 store,用于存储状态信息。

Inde.html 文件:页面主页。

main.Jsx 文件:页面进入时最先加载 main.jsx 文件。

2 node_modules 文件夹

React 的依赖包,用于代码解析和插件管理,里面文件很多,一般用 npm 进行下载。

3 package.json 文件

定义了这个项目所需要的各种模块,以及项目的配置信息(比如名称、版本、许可证等元数据)。npm install 命令根据这个配置文件,自动下载所需的模块,也就是配置项目所需的运行和开发环境。就是上面的 node_modules 文件夹。

4 webpack.config.js 文件

可以看做是模块打包机,主要功能是分析你的项目结构,找到 JavaScript 模块以及其它的一些浏览器不能直接运行的拓展语言(Scss,TypeScript 等),并将其转换和打包为合适的格式供浏览器使用。

5 webpack.production.config.js 文件

和 webpack.config.js 文件功能相同,在项目打包时用到。

5.1.2 功能模块图

网站一级功能模块分为查看数据,项目管理和财务管理。

查看数据下包含了查看当日天气,时间和用户所在管理的地区。查看环境数据和全国排行榜以及网站的人员信息。

项目管理下包含了新建项目和更改项目。

财务管理下包含了分配和回收资金。







图 4.1 功能模块图

5.2 数据设计

数据以变量的方式存储在 app>contants>DataSource.jsx 文件中,网页初始进入时会随机生成相应的数据。并以 JSON 的方式保存。

6 系统的实现

6.1 React 基础配置

页面加载时,首页加载了 app 文件夹下的 index.html 文件和 main.jsx 文件,React 不使用 HTML,而使用 JSX ,index.html 只是页面渲染的地方,主要代码还是在 main.jsx 文件中,main.jsx 文件代码如图 5.1.1。







图 5.1.1 main.jsx 文件代码

在 main.jsx 中加载了 React 基础组件和配置的路由。路由可以说是各个页面的路径,这里使用了按需加载路由的方式,只有打开的页面才回被渲染,其他页面打开会重新渲染。路由配置在 routes 文件夹下,代码如 5.1.2.







图 5.1.2 路由配置文件代码

其中,加载的页面是 containers 文件夹中 App 文件夹下的 index.jsx,默认路由是 Analysis,也就是分析页面。

在 containers 文件夹中 App 文件夹下的 index.jsx 文件就是页面的核心部分了,可以说所以页面的渲染内容都是在这里整合出去的。以下是源代码部分:

'use strict';import React, { Component } from 'react';import { connect } from 'react-redux';import { Link,browserHistory } from 'react-router';import Headers from '../../components/Header';import Navigation from '../../components/Navigation';import NavList from '../../components/Navigation/NavList.jsx';import { Layout } from 'antd';const { Header, Footer, Sider, Content } = Layout;import '../../static/css/reset.css';import '../../static/css/common.css';import '../../static/css/icon.less';import './App.css';import Login from '../Login/index.jsx';import { fetchPost, fetchPut, fetchGet, fetchDelete } from '../../static/js/httprequest';import URL from '../../constants/HostConfig';import {adminUser} from '@app/constants/DataSource.jsx';class App extends Component { constructor(props, context) { super(props); this.state = { }; } componentWillMount() { if(adminUser.login === false) { browserHistory.push('/Login'); } } render() { return ( <div> { adminUser.login ?<Layout style = {{ minHeight: document.body.clientHeight,minWidth: 980 }}> {/*头部*/} <Header className='header'> <Headers isOline = {false} userName = {'admin'} menuList = { [{title: '退出登录',props: {onClick: () => {adminUser.login = false; browserHistory.push('/Login');} } }] } /> </Header> <Layout> {/*导航条*/} <Sider className = 'navigation'> <Navigation navlist = {NavList} pathname = {this.props.location.pathname} /> </Sider> {/*右侧内容*/} <Content className = "main" style = {{padding:20}}> {this.props.children} </Content> </Layout> </Layout>: <Login /> } </div> ); }}function mapStateToProps(state) { return { }}export default connect( mapStateToProps,{}App)React 的 jsx 代码和 Java 代码很像,都有头部 import 引入,定义 Class 类,类中有构造函数和 render 输出。

import 引入了 React 的基础组件和定义的全局 CSS 样式,还有 antd 的插件以及自己编写的 React 组件和全局方法。

在 constructor 方法中,就是这个类的构造函数,它起到的最主要的作用就是接收状态信息和定义 state 状态。

render 方法中就是和 HTML 很像了,在 render 方法下的 return 方法中就可以直接用 HTML 语言编写页面。

在以上代码中,return 输出分为三个部分,Headers 标签头部和 Sider 标签导航栏和 Content 标签中的主体部分,使用了 antd 中的 Layout 组件将三个部分包含住,进行布局,布局效果如图 5.1.3。Headers 标签中的 Headers 标签就是引入 components 文件夹中的 Header 组件,Sider 标签中的 Navigation 标签引入的是 components 文件夹中的 Navigation 组件,而主体内容就是引入刚才的默认路由地址 Analysis,在构造函数中接收到了路由以及路由地址,所以使用 this.props.children 能渲染出来。







图 5.1.3 Layout 组件布局效果

6.2 页面头部组件设计与实现

头部组件存放在 components 文件夹中的 Header 文件下,使用了 antd 的 Dropdown 下拉菜单组件实现退出登录功能,效果如图 5.2.1。主要 return 方法代码如下:

const menuList = this.props.menuList;const messageList = this.props.messageList;const menu = ( <Menu>{ menuList.map((item, index) => ( <Menu.Item key = {index}> <a {...item.props}>退出登录</a> </Menu.Item>}</Menu> );let menuNode, messageNode;return ( <div> <img className = 'header-img' src = '../../static/img/logo.png' /> <span className = 'alimis-header-title'></span> <ul className = "login-message"> <li className = 'login-menu-list' ref = {(node) => menuNode = node}> <Dropdown overlay= {menu} trigger= {['click']}getPopupContainer = {() => { return menuNode; }}><a> {adminUser.name}<Icon style = {{ fontSize: 12 }} type="down" /></a></Dropdown></li></ul></div> );





图 5.2.1 头部信息效果图

6.3 页面导航条组件设计与实现

导航条组件存放在 components 文件夹中的 Navigation 文件下,使用了 antd 的 Menu 组件,主要结构是:

<Menu><Menu.Item>菜单项</Menu.Item><SubMenu title="子菜单"> <Menu.Item><Link to ="路由" >子菜单项</Link></Menu.Item> </SubMenu> </Menu>其中导航条个数和导航条标题内容主要存放在相同文件夹的 NavList.jsx 文件中,代码是:

const NavList = [ {component: '',layout: '',name: '导航条',path: '',children: [{name:'首页',icon:'laptop',path:'首页',children:[{name:'分析',path:'/Analysis',component:'首页', },{name:'监控',path:'/Monitor',component:'首页' },{name:'工作台',path:'/Workbench',component:'首页' }] },{name:'列表',icon:'line-chart',path:'列表',children:[{name:'项目',path:'/ProjectTeam',component:'列表',info:'/ProjectInfo' },{name:'人员信息',path:'/UserManage',component:'列表', }] },{name:'操作',icon:'setting',path:'操作',children:[{name:'新建项目',path:'/ProjectForm',component:'操作' },{name:'财务管理',path:'/Finance',component:'操作' }] },{name:'排行榜',icon:'bars',path:'/Rankings' }]} ];export default NavList;使用 getNavMenuItems 方法把以上代码进行 map 循环,输出每一个的导航条按钮,效果如图 5.3.1。主要 getNavMenuItems 方法代码如下:

//获取导航栏目录名字信息,输出 DOM 目录getNavMenuItems = (menusData) => { if (!menusData) { return []; } return menusData.map((item) => { if (!item.name) { return null; } let itemPath; if (item.path.indexOf('http') === 0) { itemPath = item.path; } else { itemPath = `$ {item.path || ''}`.replace(///+/g, '/'); } let active = []; if (item.children && item.children.some(child => child.name)) { return ( <SubMenu title = { item.icon ? ( <span> <Icon type = {item.icon}/> <span>{item.name}</span> </span> : item.name } key = {item.path || item.key} > {this.getNavMenuItems(item.children)} </SubMenu> ); } return ( <Menu.Item key = {item.key || item.path}> <Link to = {itemPath} target = {item.target} onClick = {this.props.onClick}> {item.icon ? <Icon type = {item.icon}/> : null} <span> {item.name}</span> </Link> </Menu.Item> ); });}





图 5.3.1 导航条效果图

6.4 分析页面组件设计与实现

主内容页面分为 5 个模块,分别为今日天气,时间,地区,环境指数和历史环境指数折线图,每个模块使用 antd 中的卡片组件(Card 标签)来形成样式,然后使用 antd 中的 Row 标签和 Col 标签来完成布局,效果图如图 5.4.1。













图 5.4.1 分析页效果图

1 今日天气模块制作

今日天气从 DataSource 中获取数据,根据天气的不同,给 div 附上相应的类名,不同的类名有不同的样式,使用 css3 的样式来制作天气显示的动画效果,其他信息进过处理直接用文字显示。

2 时间模块制作

使用 setInterval 方法每秒钟获取时间,然后把获取的时间信息存放到 state 中,只有使用到 state 的模块才会被重新渲染。代码如下:

clockTime = () =>{ this.timer = setInterval(() => { const time = new Date(); this.setState({time}); },1000); }return 方法代码如下:

<div> <p>{formatTime(this.state.time,'yyyy年mm月dd')}日</p> <p>星期{dayArr[this.state.time.getDay()]}</p> <p style = {{color:'#008CFF'}}>{formatTime(this.state.time,'hh:ff:ss')}</p> </div>

3 地区模块制作

信息由文字直接显示,用户点击更改按钮时,最下面的地区会变成下拉菜单可供选择。

4 环境指数模块与环境历史指数模块制作

左边信息显示加上 antd 中表格组件,往里面传参。右边使用 Highchart 组件,先编辑基本的信息参数,然后把获取的数据往里面填,具体代码如下:

<ReactHighcharts config={config1} />let config1 = this.formChart({ title:'环境指数评分详情(每天12点更新)', series:[{ name:'分值', data: [ {name:'空气',y: endexData[analysisJson.region].a,color: '#008CFF'}, {name:'污染',y: endexData[analysisJson.region].b,color:'#008CFF'}, {name:'水质',y: endexData[analysisJson.region].c,color:'#008CFF'}, {name:'土质',y: endexData[analysisJson.region].d,color:'#008CFF'}, ] }], type:'bar', xAxis:{ categories: ['空气', '污染', '水质', '土质'], title: { text: null } }, legend:{ enabled:false }});formChart = (option) => { let config = { chart: { type: option.type, height:423 }, title: { text: option.title, style:{'fontSize': '16px'} }, xAxis: option.xAxis, yAxis: { min: 0, max:100, title: { text: null } }, legend:option.legend, plotOptions: { bar: { dataLabels: { allowOverlap: true, enabled: true, //禁用数据名称 } } }, exporting:{ enabled:false }, credits:{ enabled: false // 禁用版权信息 }, series: option.series }; return config; }环境历史指数也是使用相同的 formChart 方法来完成 Highchart 的配置,部分代码如下:

let config2 = this.formChart({title:'历史环境指数评分(每月1号更新)',series:[{name:'分值',data: endexData[analysisJson.region].score,color:'#008CFF' },{name:'平均分值',data: [89,90,89,86,86,88,92,91,86,85,84,90],color:'#00FF00' }],type:'',xAxis:{ max:12, min:1, maxPadding:1 },legend: {layout: 'vertical',align: 'right',verticalAlign: 'middle' }});

6.5 监控页面组件设计与实现

页面内容分为 4 个部分,分别为实时监控数据报表,着重排行,评分比重和动态列表。实时监控图里分别对应 4 个环境指数的报表。具体效果图如图 5.5.1。







图 5.5.1 监控页效果图

这个页面中最关键的就是四个环境数据报表的实时数据报表,这里也是使用 formChart 方法定义基本参数,然后定义不同的变量传递不同的数据,形成不同数据的报表,部分代码如下:

formChart = (option) => { let config = {chart: {type: 'spline' , marginRight: 10,events: {load: function () { var series = this.series[0], series1 = this.series[1], chart = this; option.clock(option.timer,option.wholeNum,series,series1); } } },title: {text: '实时数据' },tooltip: {dateTimeLabelFormats: {millisecond:"%b %e, %H:%M:%S" } },xAxis: {type: 'datetime' , tickPixelInterval: 150,dateTimeLabelFormats: {millisecond: '%H:%M:%S' , } },yAxis: {title: {text: '值' }, max:100, min:50 },legend: {enabled: true },exporting: {enabled: false },credits: {enabled: false // 禁用版权信息 },series: [{name: '分值',data: (function () { var data = [], time = (new Date()).getTime()+1000*60*60*8, i; for (i = -100; i <= 0; i += 1) { data.push({x: time + i * 1000,y: option.wholeNum + ((-1)^Math.ceil(Math.random()*10))*(Math.ceil(Math.random()*100)/100) }); } return data; } ()),color:'#008CFF' },{name: '平均值',data: (function () { var data = [], time = (new Date()).getTime()+1000*60*60*8, i; for (i = -100; i <= 0; i += 1) { data.push({x: time + i * 1000,y: option.wholeNum + ((-1)^Math.ceil(Math.random()*10))*(Math.ceil(Math.random()*100)/100) }); } return data; } ()),color:'#FF0000' },] }; return config;}

6.6 工作台页面组件设计与实现

工作台页面是这个网站的中枢,连接了该网站主要的操作页面,设计界面时功能点非常多,最后简化了该界面。工作台有 4 个模块,分别是头部信息展示,我的项目模块,动态和和我有关信息展示。头部信息展示了登录的用户的基本信息,有所在的队伍,队伍排行,用户负责的项目数量。我的项目模块展示了该用户正在进行的前 6 个项目进度和全部项目的链接,点击展示的项目还可以跳转到相应的项目详情。动态模块中展示了队伍中人员所操作的项目信息。和我有关模块展示了用户对项目的操作,比如新建项目,加入了什么项目。具体效果图如图 5.6.1。







图 5.6.1 工作台页效果图

工作台页面中使用了 antd 中的头像组件(Avatar)用与用户头像显示和项目头像显示。使用了列表组件(List)用于动态和与我有关中的信息展示。组件中有固定的传参方式,从数据文件中拿到数据后存入 state 状态中,当 state 改变是会找到相应使用 state 的组件完成更新渲染。

我的项目模块中的项目部分代码如下:

const Card_Grid = [];for(let i = 0; i<6; i++) { if(projectData[i]) { let status = 'normal'; if(projectData[i].state === 0) { status='active'; } else if(projectData[i].state === 1) { status='exception'; } else if(projectData[i].state ===2) { status = 'success'; } Card_Grid.push( <Card.Grid style= {gridStyle} key = {'Card.Grid'+i} style = {{paddingBottom:20}}> <Link to = {'/ProjectInfo?key='+i}> <div className = 'xiangmu'><Avatar style= {{ backgroundColor: projectData[i].color, verticalAlign: 'middle' }}> {projectData[i].title.substr(3,2)} </Avatar> <span className = 'titleItem'> {projectData[i].title}</span> <Progress percent= {projectData[i].process} status= {status}/><div style = {{marginTop:10,fontSize:10,color:'#999'}}> {projectData[i].name} <Divider type="vertical" style = {{height:10,top:0}}/> {projectData[i].endDate} </div> </div> </Link> </Card.Grid> ) }}

6.7 项目列表和项目详情页面组件设计与实现

项目是该网站的核心功能,用户可以新建项目、分配项目,被分配到项目中的人员可以完成项目,提交每日完成情况,直到项目完成。

1 项目列表页

项目列表用于展示全部项目的统计信息,链接到每一个具体的项目。页面分为两个模块,一个是头部信息统计,一个是项目分类显示。头部信息展示了进行中的项目、本月应完成的项目和项目总数。项目分类显示将项目分为进行中、完成、终止和全部,每一类对应了相应的项目。具体效果图如图 5.7.1。







图 5.7.1 项目列表页效果图

2 项目详情页

项目的详情页要展示的信息就非常多了,而且里面的数据都是从数据文件中取的。在 React 中,刚开始加载时,有些数据状态还没有从后台返回,所以会有空数据的情况,而空数据要避免页面无法渲染的情况。项目详情页效果图如图 5.7.2。













图 5.7.2 项目详情页效果图

项目详情页分为 3 个模块,分别是项目信息,项目成员管理和项目进度。在项目成员模块中显示了该项目的成员信息,可以在这里删除项目中的成员。在项目信息中,展示了项目标题、项目的创建人、创建时间、结束时间和初始分数、目标分数,还有可用资金、已用资金以及项目的进度和项目状态。在这个模块中还有两个按钮,一个是今日提交,另一个是更多。点击今日提交会弹出一个模态框,能填写今日完成的进度、今日使用的资金和日报。提交后会在该页面的项目进度模块中显示。效果如图 5.7.3。更多按钮点击后会下拉显示两个按钮,分别是终止项目和完成项目,用于更改项目的状态,效果如图 5.7.3。







图 5.7.3 今日提交效果图







图 5.7.3 更多按钮效果图

6.8 人员信息页面组件设计与实现

人员信息页面主要展示该网站的全部人员及其信息,该页面还带人员搜索功能,能根据人员的职位,姓名或手机号码搜索。效果如图 5.8.1。







图 5.8.1 人员信息效果图

6.9 新建项目页面组件设计与实现

在新建项目页面中,最困难的就是各个输入框的验证,每一个输入输入不同的数据要返回不同的验证信息,在这里将降低自己书写代码的代码量,着重使用 antd 中的表单组件来提高容错率,在表单组件中,根据需要输入的数据的不同使用不同的组件,效果图如图 5.9.1,具体的 return 方法中的代码如下:

<div className = 'projectForm'> <Card> <Breadcrumb> <Breadcrumb.Item><Link to = '/Analysis'>首页</Link></Breadcrumb.Item> <Breadcrumb.Item>新建项目</Breadcrumb.Item> </Breadcrumb><p style = {{fontSize:20,paddingTop:20}}>新建项目</p></Card><Card style = {{marginTop:20}}><Row><Col span = {12} offset = {5}> <Form onSubmit= {this.handleSubmit}> <FormItem{...formItemLayout}label="项目名称" >{ getFieldDecorator('title', {rules: [{required: true, message: '请输入项目名称', }], })( <Input placeholder = '请输入项目名称'/> )}</FormItem><FormItem{...formItemLayout}label="项目类型" >{ getFieldDecorator('type', {rules: [{required: true, message: '请选择项目类型', }], })( <Select placeholder="请选择项目类型"> <Option value="空气">空气</Option> <Option value="污染">污染</Option> <Option value="土质">土质</Option> <Option value="水质">水质</Option> </Select> )}</FormItem><FormItem{...formItemLayout}label="初始分数" >{ getFieldDecorator('initial', {rules: [{required: true, message: '请输入初始分数', }], })( <InputNumber min = {0} max = {100} placeholder = '请输入'/> )}</FormItem><FormItem{...formItemLayout}label="目标分数" >{ getFieldDecorator('target', {rules: [{ required: true, message: '请输入目标分数' }], })( <InputNumber min = {0} max = {100} placeholder = '请输入'/> )}</FormItem><FormItem{...formItemLayout}label="资金" >{ getFieldDecorator('capitalAll', {rules: [{ required: true, message: '请输入资金' }], })( <InputNumber min = {0} max = {10000} placeholder = '请输入'/> )}</FormItem><FormItem{...formItemLayout}label="开始和结束时间" >{ getFieldDecorator('time', {rules: [{ required: true, message: '请选择开始和结束时间' }], })( <RangePicker onChange={this.onChange}/> )}</FormItem><FormItem{...formItemLayout}label="成员" >{ getFieldDecorator('user', {rules: [{ required: true, message: '请至少选择一个成员' }], })( <Select mode="multiple" placeholder="请选择成员" > {userList} </Select> )}</FormItem><FormItem{...formItemLayout}label="描述" >{ getFieldDecorator('task', {rules: [{ required: true, message: '请输入描述' }], })( <TextArea rows={4} placeholder = '请输入描述'/> )}</FormItem><FormItem {...tailFormItemLayout}><Button type="primary" htmlType="submit">新建</Button> </FormItem> </Form> </Col> </Row> </Card> </div>





图 5.9.1 人员信息效果图

6.10 财务管理页面组件设计与实现

财务管理页面功能点比较简单,就是对各个项目的资金进行回收和拨款,使网站更具有完整性。页面效果如图 5.10.1。部分代码如下:

<div className = 'workbench'> <Row gutter = {16}> <Col span = {24}> <Card loading = {this.state.loading}> <Breadcrumb> <Breadcrumb.Item><Link to = '/Analysis'>首页</Link></Breadcrumb.Item> <Breadcrumb.Item>财务管理</Breadcrumb.Item> </Breadcrumb> <Table dataSource={this.state.data} columns={columns} /> </Card> </Col> </Row> <Modal title="拨款" visible={this.state.visible} onOk={this.handleOk} onCancel={this.handleCancel} > 资金:<InputNumber min={0} max={100000} defaultValue={0} onChange = {this.onChange}/> </Modal> </div>





图 5.10.1 人员信息效果图

6.11 排行榜页面组件设计与实现

排行榜页面用于显示全国各地各个队伍所管理的地区的环境指数排行,用于相互之间比较和相互扶持,页面中暂时只建立了 5 个队伍 5 个地区,未来可以进行扩展,页面效果如 5.11.1,部分代码如下:

<div className = 'workbench'> <Row gutter = {16}> <Col span = {24}> <Card> <Breadcrumb> <Breadcrumb.Item><Link to='/Analysis'>首页</Link></Breadcrumb.Item> <Breadcrumb.Item>排行榜</Breadcrumb.Item> </Breadcrumb> <Row><Col span = {24} style = {{paddingTop:30,textAlign:'center'}}><div className = 'statItem'> <p>环境指数</p> <p> {endexData[analysisJson.region].fraction}</p> </div> <Divider type="vertical" /> <div className = 'statItem'> <p>队伍编号</p> <p> {endexData[analysisJson.region].ranksId}</p> </div> <Divider type="vertical" /> <div className = 'statItem'> <p>队伍排名</p> <p> {endexData[analysisJson.region].key}/ {endexData.length}</p> </div> </Col> </Row> <Table dataSource= {data} columns= {columns} loading = {this.state.loading}/> </Card> </Col> </Row> </div>





图 5.11.1 排行榜页面效果图

7 系统测试

7.1 系统测试的重要性和目的

软件测试是对软件需求分析、设计、编码实现的审查,它是软件质量保证的关键步骤。通常对测试的定义有两中描述:

  1. 软件测试是为了发现错误而执行程序的过程;
  2. 软件测试是根据软件开发各个阶段的规格说明和程序的内部结构而精心设计的一批测试用例,并利用这些测试用例运行程序以及发现错误的过程,即执行测试步骤。
测试应该尽早进行,因为软件的质量是在开发过程中形成的,缺陷是在不知不觉中引入的。测试的目的就是设计测试案例,通过这些测试案例来发现软件的缺陷和排除缺陷。测试的目的是在最小的成本和最少的时间内,通过设计合适的测试用例,系统地发现不同类别的错误,从而更好的解决问题,使系统不断完善,满足用户的需求。

7.2 测试方法

测试任何产品都有两种方法:如果已经知道了产品应该具有的功能,可以通过测试来检验是否每个功能正常使用;如果知道了产品的内部工作过程,可以通过测试来检测产品内部动作是否按照说明书的规定正常工作。前一种称为黒盒测试又称功能测试,后一种方法称为白盒测试又称结构测试。

在测试本系统时,采用的是白盒测试来设计测试用例,白盒测试法从总体上可划分为静态测试和动态测试;按测试操作的实施方式划分为手工测试和借助于工具的自动化测试。

白盒测试的静态测试方法:代码检查法、静态结构分析法、代码质量度量法等。

白盒测试的动态测试方法:功能确认与接口测试、逻辑覆盖分析法、基本路径测试法、性能分析、内存分析等。

本系统主要的是动态测试中的功能确认。

7.3 系统模块测试

1 测试问题

经过各模块测试,发现的问题罗列如下:

2 问题严重度描述,如表 6.1 所示:

表 6.1 系统模块测试说明表

级别描述

结论

经过以上详细的设计与构架,基本上完成系统的开发。在本次开发过程中,使用了到的是学校中没有学习过的 React、antd、Highchart 和 ES6 编码规范,在上手时十分困难,后来也是慢慢才摸索到要门。制作网站时,最困难的部分就是设计部分,网站中的功能点都可以实现,而如何设计合理,又要让网站功能饱满是个重点。本网站还有很多不足之处和不合理的地方,但是大概的模型是有了,网站设计是一项非常精细的工作,需要耐心去精雕细琢才能日趋完美。制作网站的技术每天都有更新,如果一味的使用以前的技术会更不上进度,网上有许多网站制作的分享网站和技术更新后的 API 网站,这些网站给网站制作者提供了很好的平台,每天能从这些网站中吸取知识对自己能力的提升有很大的帮助,这些网站对有一定基础的学者很友好,认真学习几次以后就能在这里自学了,互联网这个工具一定要好好利用。

参考文献及网站

React 技术栈系列教程:http://www.ruanyifeng.com/blog/2016/09/react-technology-stack.html Ant Design 组件库:https://ant.design/index-cn  ES6 入门:http://es6.ruanyifeng.com/ [4] hcharts 教程:http://www.hcharts.cn/

附录:

1 在 Git 仓库或者是源代码文件中的代码是源代码,build 文件夹里的是打完包之后的代码,未打包的 React 代码,无法直接打开运行,需要电脑中安装有 node.js。打开方式如下: (1)在命令行中找到并打开该文件夹







(2)使用 npm start 命令运行,运行完毕后如没有网页自动打开,请打开游览器,输入。

2 打完包的文件夹是 build,内容应该如下:







需要把这些文件放到服务器上才可运行。

关键词:设计,实现

74
73
25
news

版权所有© 亿企邦 1997-2025 保留一切法律许可权利。

为了最佳展示效果,本站不支持IE9及以下版本的浏览器,建议您使用谷歌Chrome浏览器。 点击下载Chrome浏览器
关闭