国产成人精品无码青草_亚洲国产美女精品久久久久∴_欧美人与鲁交大毛片免费_国产果冻豆传媒麻婆精东

15158846557 在線咨詢 在線咨詢
15158846557 在線咨詢
所在位置: 首頁 > 營銷資訊 > 網(wǎng)站運營 > 基于 React+antd 的環(huán)境監(jiān)測網(wǎng)站的設(shè)計與實現(xiàn)

基于 React+antd 的環(huán)境監(jiān)測網(wǎng)站的設(shè)計與實現(xiàn)

時間:2023-09-04 14:06:01 | 來源:網(wǎng)站運營

時間:2023-09-04 14:06:01 來源:網(wǎng)站運營

基于 React+antd 的環(huán)境監(jiān)測網(wǎng)站的設(shè)計與實現(xiàn):摘 要: 生態(tài)環(huán)境是人類生存的物質(zhì)基礎(chǔ),也是經(jīng)濟系統(tǒng)運行的基礎(chǔ),生態(tài)環(huán)境問題是由于人類長期的生產(chǎn)和生活等社會經(jīng)濟行為所引起的生態(tài)環(huán)境破壞而反作用于人類社會經(jīng)濟生活的不良影響,其實質(zhì)是經(jīng)濟發(fā)展與環(huán)境保護、人與自然關(guān)系的失調(diào)。目前,環(huán)境問題已成為全球社會性的問題。如何解決好這一問題,關(guān)系到人類社會的生存。因此,采取有效的治理措施,對促進(jìn)社會經(jīng)濟持續(xù)、健康發(fā)展具有十分重要的意義。所以,本網(wǎng)站的作用就是致力于監(jiān)控生態(tài)環(huán)境并處理污染,主要針對空氣、水質(zhì)、土質(zhì)和污染四個方面,并根據(jù)這四個方面來改善周圍環(huán)境。本文主要闡述的是利用 React+antd 框架來搭建一個環(huán)境監(jiān)測管理網(wǎng)站,包括網(wǎng)頁制作,數(shù)據(jù)聯(lián)調(diào)和功能說明等。

關(guān)鍵詞:React;antd;管理網(wǎng)站; B/S 結(jié)構(gòu);環(huán)境;

1 引言

1972 年 6 月 5 日在瑞典首都斯德哥爾摩召開《聯(lián)合國人類環(huán)境會議》,會議通過了《人類環(huán)境宣言》,并提出將每年的 6 月 5 日定為"世界環(huán)境日"。同年 10 月,第 27 屆聯(lián)合國大會通過決議接受了該建議。世界環(huán)境日的確立,反映了世界各國人民對環(huán)境問題的認(rèn)識和態(tài)度,表達(dá)了我們?nèi)祟悓γ篮铆h(huán)境的向往和追求。

1989 年《中華人民共和國環(huán)境保護法》對環(huán)境的定義為:影響人類生存和發(fā)展的各種天然的和經(jīng)過人工改造的自然因素的總體,包括大氣、水、海洋、土地、礦藏、森林、草原、野生生物、自然遺跡、人文遺跡、自然保護區(qū)、風(fēng)景名勝區(qū)、城市和鄉(xiāng)村等。

環(huán)境是人類生存和發(fā)展的基本前提。環(huán)境為我們生存和發(fā)展提供了必需的資源和條件。隨著社會經(jīng)濟的發(fā)展,環(huán)境問題已經(jīng)作為一個不可回避的重要問題提上了各國政府的議事日程。保護環(huán)境,減輕環(huán)境污染,遏制生態(tài)惡化趨勢,成為政府社會管理的重要任務(wù)。對于我們國家,保護環(huán)境是我國的一項基本國策,解決全國突出的環(huán)境問題,促進(jìn)經(jīng)濟、社會與環(huán)境協(xié)調(diào)發(fā)展和實施可持續(xù)發(fā)展戰(zhàn)略,是政府面臨的重要而又艱巨的任務(wù)。

本網(wǎng)站的建設(shè)主要是為了監(jiān)測周圍空氣、水質(zhì)、土質(zhì)和污染程度四個方面的數(shù)據(jù),進(jìn)行分析處理,最后實地解決環(huán)境問題。

2 系統(tǒng)概述

2.1 系統(tǒng)開發(fā)方法

本系統(tǒng)使用 B/S 架構(gòu)開發(fā),這樣使得用戶訪問系統(tǒng)沒有門檻。前端頁面使用標(biāo)準(zhǔn)的 React+antd 設(shè)計,對大多數(shù)瀏覽器都很友好,配合使用 AJAX、XML、JSON、HTML5、CSS3 等技術(shù),實現(xiàn)了非常好的視覺效果和用戶體驗,代碼編輯器使用 Sublime Text3,數(shù)據(jù)將使用自己定義的 mock 數(shù)據(jù),它將根據(jù)設(shè)置的 JSON 格式自動生成相應(yīng)的數(shù)據(jù)。

綜上所述,基于該一整套方案進(jìn)行本系統(tǒng)的開發(fā)是可行的,可靠的,優(yōu)秀的。

2.2 系統(tǒng)開發(fā)技術(shù)

本系統(tǒng)程序使用 React 技術(shù)編寫,附加 antd 庫,highcharts 庫,配合 AJAX、XML、JSON、HTML5、CSS3,完成網(wǎng)站的設(shè)計和制作,還涉及到 ES6 代碼書寫的規(guī)范。

(1) React 技術(shù)簡介

React 是近期非常熱門的一個前端開發(fā)框架,其本身作為 MVC 中的 View 層可以用來構(gòu)建 UI,也可以以插件的形式應(yīng)用到 Web 應(yīng)用非 UI 部分的構(gòu)建中,輕松實現(xiàn)與其他 JS 框架的整合,比如 AngularJS。同時,React 通過對虛擬 DOM 中的微操作來實對現(xiàn)實際 DOM 的局部更新,提高性能。其組件的模塊化開發(fā)提高了代碼的可維護性。單向數(shù)據(jù)流的特點,讓每個模塊根據(jù)數(shù)據(jù)量自動更新,讓開發(fā)者可以只專注于數(shù)據(jù)部分,改善程序的可預(yù)測性。

(2) React 特性

  1. 采用單向數(shù)據(jù)流,易追蹤數(shù)據(jù)
  2. 將 HTML,JS 結(jié)合起來構(gòu)建組件,組件狀態(tài)和結(jié)果意義對應(yīng)起來,實現(xiàn)模塊化開發(fā)。
  3. 創(chuàng)建了高性能的虛擬 DOM,避免直接操作 DOM。即組件不是真實的 DOM 節(jié)點,而是存在于內(nèi)存中的一種數(shù)據(jù)結(jié)構(gòu)。所有的 DOM 變動都先在虛擬 DOM 上發(fā)生,然后再將實際發(fā)生變動的部分反映在真實 DOM 上。(DOM diff 算法)。
(3)AJAX 技術(shù)概述

AJAX 全稱為 Asynchronous JavaScript and XML(異步的 JavaScript 和 XML)。是一種使用現(xiàn)有 JavaScript 技術(shù)標(biāo)準(zhǔn)的新方法。在 2005 年,Google 通過其 Google Suggest 使 AJAX 變得流行起來。

(4)AJAX 技術(shù)優(yōu)勢

Google 對 AJAX 技術(shù)使用使得 Google 的服務(wù)在用戶體驗上高人一籌。原因是 AJAX 可以讓網(wǎng)頁在不刷新的情況下實時更新來自服務(wù)器的內(nèi)容而傳統(tǒng)的網(wǎng)頁(不使用 AJAX)如果需要更新內(nèi)容,必需重載整個網(wǎng)頁面。因此使用 AJAX 技術(shù)能讓用戶獲得更好的體驗。如今越來多的網(wǎng)絡(luò)服務(wù)使用 AJAX 技術(shù),如:新浪微博、Google 地圖、人人網(wǎng)、開心網(wǎng)等等。

(5)Node.js

Node.js 是一個基于 Chrome V8 引擎的 JavaScript 運行環(huán)境,Node.js 使用了一個事件驅(qū)動、非阻塞式 I/O 的模型,使其輕量又高效。

這里將用到 Node.js 的包管理器 npm,npm 是全球最大的開源庫生態(tài)系統(tǒng)。

(6)JSON 概述

JSON 是 JavaScript 對象表示法(JavaScript Object Notation),是存儲和交換文本信息的語法,類似 XML。但是 JSON 比 XML 更小、更快,更易解析。用來傳輸小數(shù)據(jù)量的數(shù)據(jù)具有優(yōu)勢。

(7)highcharts 簡介

Highcharts 是一個用純 JavaScript 編寫的一個圖表庫, 能夠很簡單便捷的在 Web 網(wǎng)站或是 Web 應(yīng)用程序添加有交互性的圖表,并且免費提供給個人學(xué)習(xí)、個人網(wǎng)站和非商業(yè)用途使用。HighCharts 支持的圖表類型有曲線圖、區(qū)域圖、柱狀圖、餅狀圖、散狀點圖和綜合圖表。

(8)antd 簡介

antd 全名 Ant Design 是螞蟻金服針對 mobile 研發(fā)推出的一套基于 React 實現(xiàn)的 H5 組件庫,類似于 bootstrap,React+antd 的組合類似于 JQuery+bootstrap 的組合。一個服務(wù)于企業(yè)級產(chǎn)品的設(shè)計體系,通過模塊化的解決方案,讓設(shè)計者專注于更好的用戶體驗,旨在幫助用戶快速完成 H5 頁面開發(fā)。Ant Design 提供了一套非常完整的 組件化設(shè)計規(guī)范 與 組件化編碼規(guī)范,大幅提高了部分產(chǎn)品的設(shè)計研發(fā)效率及質(zhì)量。Ant Design 與 G2 的代碼質(zhì)量和文檔質(zhì)量都非常高,算是阿里提出 “大中臺,小前臺” 后外面可見的杰出作品。

(9)antd 的特性

  1. 提煉自企業(yè)級中后臺產(chǎn)品的交互語言和視覺風(fēng)格。
  2. 開箱即用的高質(zhì)量 React 組件。
  3. 使用 TypeScript 構(gòu)建,提供完整的類型定義文件。
  4. 全鏈路開發(fā)和設(shè)計工具體系。
(10)ES6

ECMAScript 6.0(簡稱 ES6)是 JavaScript 語言的下一代標(biāo)準(zhǔn),已經(jīng)在 2015 年 6 月正式發(fā)布了。它的目標(biāo),是使得 JavaScript 語言可以用來編寫復(fù)雜的大型應(yīng)用程序,成為企業(yè)級開發(fā)語言。

綜上所述,本系統(tǒng)將結(jié)合以上種種技術(shù)進(jìn)行開發(fā)。

3 系統(tǒng)調(diào)研及可行性分析

3.1 系統(tǒng)調(diào)研

通過對一些后臺工作網(wǎng)站瀏覽及調(diào)查研究,經(jīng)過綜合分析,了解了各種后臺工作網(wǎng)站的大致的一個流程和功能,一般具備以下一些特征。

1 左側(cè)導(dǎo)航條

一般后臺工作網(wǎng)站的網(wǎng)頁不會太多,有兩級導(dǎo)航欄就可以滿足基本功能,如圖 2.1 所示。







圖 2.1 antd 官網(wǎng)分類導(dǎo)航

2 頭部信息

后臺管理類的網(wǎng)站頭部不會放很多功能,一般由網(wǎng)站的 logo 圖標(biāo)和登錄注冊之類的功能。如圖 2.2 所示微博頭部的頁面展示。







圖 2.2 淘寶網(wǎng)搜索欄

3 功能臺

右側(cè)的頁面就是后臺網(wǎng)站主要的功能點了,負(fù)者了網(wǎng)站絕大部分的功能,對后臺管理網(wǎng)站來說是非常重要的了,如 2.3 所示,為 Ant Design Pro 網(wǎng)站展示。







圖 2.3 Ant Design Pro 網(wǎng)站

通過調(diào)研發(fā)現(xiàn)的以上結(jié)果,會在本系統(tǒng)中重點設(shè)計。

3.2 系統(tǒng)總體目標(biāo)

本系統(tǒng)的總體目標(biāo)是能夠?qū)τ跀?shù)據(jù)能清晰的顯示和分析,突出簡單大氣的后臺網(wǎng)站的特點,如要對功能模塊方面作修改,則無需進(jìn)行整個系統(tǒng)的重新架構(gòu),只要部分修改即可。

3.3 可行性分析

3.3.1 項目基本要求

項目功能包括用戶可以上傳環(huán)境數(shù)據(jù)、查看環(huán)境數(shù)據(jù),可以分配項目,進(jìn)行工作分類完成。項目中的數(shù)據(jù)暫時用模擬的數(shù)據(jù),在頁面不重新啟動的情況下有保存數(shù)據(jù)的功能。

3.3.2 系統(tǒng)總體目標(biāo)

環(huán)境監(jiān)測系統(tǒng)主要分為數(shù)據(jù)分析頁,數(shù)據(jù)監(jiān)控頁,用戶工作臺,財務(wù)管理,項目管理和人員管理等幾個板塊內(nèi)容,分別應(yīng)用于環(huán)境數(shù)據(jù)分析,環(huán)境數(shù)據(jù)實時監(jiān)控,用戶處理工作,項目的財務(wù)分配和回收,新建和處理環(huán)境項目以及環(huán)境監(jiān)測的人員目錄。

4 系統(tǒng)分析

4.1 系統(tǒng)需求分析

經(jīng)過以上對本系統(tǒng)的調(diào)研確定總體目標(biāo)及可行性分析后,下面將對系統(tǒng)在功能上以及性能上進(jìn)行進(jìn)一步的需求分析。明確系統(tǒng)功能的組成和分布以及對設(shè)備性能的最低要求及推薦配置。

4.1.1 功能需求

系統(tǒng)的功能模塊大體如下:

1 首頁

有分析頁,展示當(dāng)日的天氣狀況和時間,展示環(huán)境指數(shù)的當(dāng)日評分的各個地區(qū)的排名。

有監(jiān)控頁,實時監(jiān)控環(huán)境指數(shù)的分值,可以查看哪個用于提交的數(shù)值。

有工作臺,可以讓登錄的用戶查看自己負(fù)者的項目和項目進(jìn)度,并根據(jù)自己線下的工作更新項目進(jìn)度。

2 列表頁

有項目頁,可以查看全部項目的進(jìn)度和詳情信息。

有人員信息頁,可以查看全部人員的詳細(xì)信息。

3 操作頁

可以新建項目,可以管理財務(wù)相關(guān)功能。

4.1.2 非功能性需求

系統(tǒng)的非功能模塊大體如下。

  1. 易用性需求:界面的易用性不錯、界面美觀。
  2. 安全性需求:用戶操作具有相對安全性,不會造成密碼泄露等安全隱患。
  3. 運行環(huán)境約束:暫時只兼容電腦端頁面以及需要擁有網(wǎng)絡(luò)的環(huán)境,頁面源代碼文件需要在裝有 Node.jsde 電腦上進(jìn)行 npm 運行,打包好的頁面文件需要在服務(wù)器上才可運行。

5 系統(tǒng)設(shè)計

5.1 概要設(shè)計

5.1.1 網(wǎng)站結(jié)構(gòu)設(shè)計

網(wǎng)站目錄結(jié)構(gòu)如下:

1 app 文件夾

actions 文件夾:接口返回數(shù)據(jù)處理。

components 文件夾:存放全局組件,如導(dǎo)航條,頭部信息等。

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

containers 文件夾:存放各個頁面的組件代碼。

reducers 文件夾:接口數(shù)據(jù)中轉(zhuǎn)站,根據(jù)不同接口的數(shù)據(jù)進(jìn)行分配。

routes 文件夾:頁面路由管理,定義各個頁面組件,讓各個頁面可以使用 LInk 跳轉(zhuǎn)以及 js 觸發(fā)跳轉(zhuǎn)并傳參。

static 文件夾:有 CSS 文件夾、font 文件夾、img 文件夾、img 文件夾、js 文件夾,分別存放全局 CSS 樣式,font 樣式,全局圖片和全局 js 代碼。

stores 文件夾:定義 React 中的基礎(chǔ)組件 store,用于存儲狀態(tài)信息。

Inde.html 文件:頁面主頁。

main.Jsx 文件:頁面進(jìn)入時最先加載 main.jsx 文件。

2 node_modules 文件夾

React 的依賴包,用于代碼解析和插件管理,里面文件很多,一般用 npm 進(jìn)行下載。

3 package.json 文件

定義了這個項目所需要的各種模塊,以及項目的配置信息(比如名稱、版本、許可證等元數(shù)據(jù))。npm install 命令根據(jù)這個配置文件,自動下載所需的模塊,也就是配置項目所需的運行和開發(fā)環(huán)境。就是上面的 node_modules 文件夾。

4 webpack.config.js 文件

可以看做是模塊打包機,主要功能是分析你的項目結(jié)構(gòu),找到 JavaScript 模塊以及其它的一些瀏覽器不能直接運行的拓展語言(Scss,TypeScript 等),并將其轉(zhuǎn)換和打包為合適的格式供瀏覽器使用。

5 webpack.production.config.js 文件

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

5.1.2 功能模塊圖

網(wǎng)站一級功能模塊分為查看數(shù)據(jù),項目管理和財務(wù)管理。

查看數(shù)據(jù)下包含了查看當(dāng)日天氣,時間和用戶所在管理的地區(qū)。查看環(huán)境數(shù)據(jù)和全國排行榜以及網(wǎng)站的人員信息。

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

財務(wù)管理下包含了分配和回收資金。







圖 4.1 功能模塊圖

5.2 數(shù)據(jù)設(shè)計

數(shù)據(jù)以變量的方式存儲在 app>contants>DataSource.jsx 文件中,網(wǎng)頁初始進(jìn)入時會隨機生成相應(yīng)的數(shù)據(jù)。并以 JSON 的方式保存。

6 系統(tǒng)的實現(xiàn)

6.1 React 基礎(chǔ)配置

頁面加載時,首頁加載了 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 基礎(chǔ)組件和配置的路由。路由可以說是各個頁面的路徑,這里使用了按需加載路由的方式,只有打開的頁面才回被渲染,其他頁面打開會重新渲染。路由配置在 routes 文件夾下,代碼如 5.1.2.







圖 5.1.2 路由配置文件代碼

其中,加載的頁面是 containers 文件夾中 App 文件夾下的 index.jsx,默認(rèn)路由是 Analysis,也就是分析頁面。

在 containers 文件夾中 App 文件夾下的 index.jsx 文件就是頁面的核心部分了,可以說所以頁面的渲染內(nèi)容都是在這里整合出去的。以下是源代碼部分:

'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> {/*導(dǎo)航條*/} <Sider className = 'navigation'> <Navigation navlist = {NavList} pathname = {this.props.location.pathname} /> </Sider> {/*右側(cè)內(nèi)容*/} <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 類,類中有構(gòu)造函數(shù)和 render 輸出。

import 引入了 React 的基礎(chǔ)組件和定義的全局 CSS 樣式,還有 antd 的插件以及自己編寫的 React 組件和全局方法。

在 constructor 方法中,就是這個類的構(gòu)造函數(shù),它起到的最主要的作用就是接收狀態(tài)信息和定義 state 狀態(tài)。

render 方法中就是和 HTML 很像了,在 render 方法下的 return 方法中就可以直接用 HTML 語言編寫頁面。

在以上代碼中,return 輸出分為三個部分,Headers 標(biāo)簽頭部和 Sider 標(biāo)簽導(dǎo)航欄和 Content 標(biāo)簽中的主體部分,使用了 antd 中的 Layout 組件將三個部分包含住,進(jìn)行布局,布局效果如圖 5.1.3。Headers 標(biāo)簽中的 Headers 標(biāo)簽就是引入 components 文件夾中的 Header 組件,Sider 標(biāo)簽中的 Navigation 標(biāo)簽引入的是 components 文件夾中的 Navigation 組件,而主體內(nèi)容就是引入剛才的默認(rèn)路由地址 Analysis,在構(gòu)造函數(shù)中接收到了路由以及路由地址,所以使用 this.props.children 能渲染出來。







圖 5.1.3 Layout 組件布局效果

6.2 頁面頭部組件設(shè)計與實現(xiàn)

頭部組件存放在 components 文件夾中的 Header 文件下,使用了 antd 的 Dropdown 下拉菜單組件實現(xiàn)退出登錄功能,效果如圖 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 頁面導(dǎo)航條組件設(shè)計與實現(xiàn)

導(dǎo)航條組件存放在 components 文件夾中的 Navigation 文件下,使用了 antd 的 Menu 組件,主要結(jié)構(gòu)是:

<Menu><Menu.Item>菜單項</Menu.Item><SubMenu title="子菜單"> <Menu.Item><Link to ="路由" >子菜單項</Link></Menu.Item> </SubMenu> </Menu>其中導(dǎo)航條個數(shù)和導(dǎo)航條標(biāo)題內(nèi)容主要存放在相同文件夾的 NavList.jsx 文件中,代碼是:

const NavList = [ {component: '',layout: '',name: '導(dǎo)航條',path: '',children: [{name:'首頁',icon:'laptop',path:'首頁',children:[{name:'分析',path:'/Analysis',component:'首頁', },{name:'監(jiān)控',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:'財務(wù)管理',path:'/Finance',component:'操作' }] },{name:'排行榜',icon:'bars',path:'/Rankings' }]} ];export default NavList;使用 getNavMenuItems 方法把以上代碼進(jìn)行 map 循環(huán),輸出每一個的導(dǎo)航條按鈕,效果如圖 5.3.1。主要 getNavMenuItems 方法代碼如下:

//獲取導(dǎo)航欄目錄名字信息,輸出 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 導(dǎo)航條效果圖

6.4 分析頁面組件設(shè)計與實現(xiàn)

主內(nèi)容頁面分為 5 個模塊,分別為今日天氣,時間,地區(qū),環(huán)境指數(shù)和歷史環(huán)境指數(shù)折線圖,每個模塊使用 antd 中的卡片組件(Card 標(biāo)簽)來形成樣式,然后使用 antd 中的 Row 標(biāo)簽和 Col 標(biāo)簽來完成布局,效果圖如圖 5.4.1。













圖 5.4.1 分析頁效果圖

1 今日天氣模塊制作

今日天氣從 DataSource 中獲取數(shù)據(jù),根據(jù)天氣的不同,給 div 附上相應(yīng)的類名,不同的類名有不同的樣式,使用 css3 的樣式來制作天氣顯示的動畫效果,其他信息進(jìn)過處理直接用文字顯示。

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 地區(qū)模塊制作

信息由文字直接顯示,用戶點擊更改按鈕時,最下面的地區(qū)會變成下拉菜單可供選擇。

4 環(huán)境指數(shù)模塊與環(huán)境歷史指數(shù)模塊制作

左邊信息顯示加上 antd 中表格組件,往里面?zhèn)鲄?。右邊使?Highchart 組件,先編輯基本的信息參數(shù),然后把獲取的數(shù)據(jù)往里面填,具體代碼如下:

<ReactHighcharts config={config1} />let config1 = this.formChart({ title:'環(huán)境指數(shù)評分詳情(每天12點更新)', series:[{ name:'分值', data: [ {name:'空氣',y: endexData[analysisJson.region].a,color: '#008CFF'}, {name:'污染',y: endexData[analysisJson.region].b,color:'#008CFF'}, {name:'水質(zhì)',y: endexData[analysisJson.region].c,color:'#008CFF'}, {name:'土質(zhì)',y: endexData[analysisJson.region].d,color:'#008CFF'}, ] }], type:'bar', xAxis:{ categories: ['空氣', '污染', '水質(zhì)', '土質(zhì)'], 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, //禁用數(shù)據(jù)名稱 } } }, exporting:{ enabled:false }, credits:{ enabled: false // 禁用版權(quán)信息 }, series: option.series }; return config; }環(huán)境歷史指數(shù)也是使用相同的 formChart 方法來完成 Highchart 的配置,部分代碼如下:

let config2 = this.formChart({title:'歷史環(huán)境指數(shù)評分(每月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 監(jiān)控頁面組件設(shè)計與實現(xiàn)

頁面內(nèi)容分為 4 個部分,分別為實時監(jiān)控數(shù)據(jù)報表,著重排行,評分比重和動態(tài)列表。實時監(jiān)控圖里分別對應(yīng) 4 個環(huán)境指數(shù)的報表。具體效果圖如圖 5.5.1。







圖 5.5.1 監(jiān)控頁效果圖

這個頁面中最關(guān)鍵的就是四個環(huán)境數(shù)據(jù)報表的實時數(shù)據(jù)報表,這里也是使用 formChart 方法定義基本參數(shù),然后定義不同的變量傳遞不同的數(shù)據(jù),形成不同數(shù)據(jù)的報表,部分代碼如下:

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: '實時數(shù)據(jù)' },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 // 禁用版權(quán)信息 },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 工作臺頁面組件設(shè)計與實現(xiàn)

工作臺頁面是這個網(wǎng)站的中樞,連接了該網(wǎng)站主要的操作頁面,設(shè)計界面時功能點非常多,最后簡化了該界面。工作臺有 4 個模塊,分別是頭部信息展示,我的項目模塊,動態(tài)和和我有關(guān)信息展示。頭部信息展示了登錄的用戶的基本信息,有所在的隊伍,隊伍排行,用戶負(fù)責(zé)的項目數(shù)量。我的項目模塊展示了該用戶正在進(jìn)行的前 6 個項目進(jìn)度和全部項目的鏈接,點擊展示的項目還可以跳轉(zhuǎn)到相應(yīng)的項目詳情。動態(tài)模塊中展示了隊伍中人員所操作的項目信息。和我有關(guān)模塊展示了用戶對項目的操作,比如新建項目,加入了什么項目。具體效果圖如圖 5.6.1。







圖 5.6.1 工作臺頁效果圖

工作臺頁面中使用了 antd 中的頭像組件(Avatar)用與用戶頭像顯示和項目頭像顯示。使用了列表組件(List)用于動態(tài)和與我有關(guān)中的信息展示。組件中有固定的傳參方式,從數(shù)據(jù)文件中拿到數(shù)據(jù)后存入 state 狀態(tài)中,當(dāng) state 改變是會找到相應(yīng)使用 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 項目列表和項目詳情頁面組件設(shè)計與實現(xiàn)

項目是該網(wǎng)站的核心功能,用戶可以新建項目、分配項目,被分配到項目中的人員可以完成項目,提交每日完成情況,直到項目完成。

1 項目列表頁

項目列表用于展示全部項目的統(tǒng)計信息,鏈接到每一個具體的項目。頁面分為兩個模塊,一個是頭部信息統(tǒng)計,一個是項目分類顯示。頭部信息展示了進(jìn)行中的項目、本月應(yīng)完成的項目和項目總數(shù)。項目分類顯示將項目分為進(jìn)行中、完成、終止和全部,每一類對應(yīng)了相應(yīng)的項目。具體效果圖如圖 5.7.1。







圖 5.7.1 項目列表頁效果圖

2 項目詳情頁

項目的詳情頁要展示的信息就非常多了,而且里面的數(shù)據(jù)都是從數(shù)據(jù)文件中取的。在 React 中,剛開始加載時,有些數(shù)據(jù)狀態(tài)還沒有從后臺返回,所以會有空數(shù)據(jù)的情況,而空數(shù)據(jù)要避免頁面無法渲染的情況。項目詳情頁效果圖如圖 5.7.2。













圖 5.7.2 項目詳情頁效果圖

項目詳情頁分為 3 個模塊,分別是項目信息,項目成員管理和項目進(jìn)度。在項目成員模塊中顯示了該項目的成員信息,可以在這里刪除項目中的成員。在項目信息中,展示了項目標(biāo)題、項目的創(chuàng)建人、創(chuàng)建時間、結(jié)束時間和初始分?jǐn)?shù)、目標(biāo)分?jǐn)?shù),還有可用資金、已用資金以及項目的進(jìn)度和項目狀態(tài)。在這個模塊中還有兩個按鈕,一個是今日提交,另一個是更多。點擊今日提交會彈出一個模態(tài)框,能填寫今日完成的進(jìn)度、今日使用的資金和日報。提交后會在該頁面的項目進(jìn)度模塊中顯示。效果如圖 5.7.3。更多按鈕點擊后會下拉顯示兩個按鈕,分別是終止項目和完成項目,用于更改項目的狀態(tài),效果如圖 5.7.3。







圖 5.7.3 今日提交效果圖







圖 5.7.3 更多按鈕效果圖

6.8 人員信息頁面組件設(shè)計與實現(xiàn)

人員信息頁面主要展示該網(wǎng)站的全部人員及其信息,該頁面還帶人員搜索功能,能根據(jù)人員的職位,姓名或手機號碼搜索。效果如圖 5.8.1。







圖 5.8.1 人員信息效果圖

6.9 新建項目頁面組件設(shè)計與實現(xiàn)

在新建項目頁面中,最困難的就是各個輸入框的驗證,每一個輸入輸入不同的數(shù)據(jù)要返回不同的驗證信息,在這里將降低自己書寫代碼的代碼量,著重使用 antd 中的表單組件來提高容錯率,在表單組件中,根據(jù)需要輸入的數(shù)據(jù)的不同使用不同的組件,效果圖如圖 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="土質(zhì)">土質(zhì)</Option> <Option value="水質(zhì)">水質(zhì)</Option> </Select> )}</FormItem><FormItem{...formItemLayout}label="初始分?jǐn)?shù)" >{ getFieldDecorator('initial', {rules: [{required: true, message: '請輸入初始分?jǐn)?shù)', }], })( <InputNumber min = {0} max = {100} placeholder = '請輸入'/> )}</FormItem><FormItem{...formItemLayout}label="目標(biāo)分?jǐn)?shù)" >{ getFieldDecorator('target', {rules: [{ required: true, message: '請輸入目標(biāo)分?jǐn)?shù)' }], })( <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="開始和結(jié)束時間" >{ getFieldDecorator('time', {rules: [{ required: true, message: '請選擇開始和結(jié)束時間' }], })( <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 財務(wù)管理頁面組件設(shè)計與實現(xiàn)

財務(wù)管理頁面功能點比較簡單,就是對各個項目的資金進(jìn)行回收和撥款,使網(wǎng)站更具有完整性。頁面效果如圖 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>財務(wù)管理</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 排行榜頁面組件設(shè)計與實現(xiàn)

排行榜頁面用于顯示全國各地各個隊伍所管理的地區(qū)的環(huán)境指數(shù)排行,用于相互之間比較和相互扶持,頁面中暫時只建立了 5 個隊伍 5 個地區(qū),未來可以進(jìn)行擴展,頁面效果如 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>環(huán)境指數(shù)</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 系統(tǒng)測試

7.1 系統(tǒng)測試的重要性和目的

軟件測試是對軟件需求分析、設(shè)計、編碼實現(xiàn)的審查,它是軟件質(zhì)量保證的關(guān)鍵步驟。通常對測試的定義有兩中描述:

  1. 軟件測試是為了發(fā)現(xiàn)錯誤而執(zhí)行程序的過程;
  2. 軟件測試是根據(jù)軟件開發(fā)各個階段的規(guī)格說明和程序的內(nèi)部結(jié)構(gòu)而精心設(shè)計的一批測試用例,并利用這些測試用例運行程序以及發(fā)現(xiàn)錯誤的過程,即執(zhí)行測試步驟。
測試應(yīng)該盡早進(jìn)行,因為軟件的質(zhì)量是在開發(fā)過程中形成的,缺陷是在不知不覺中引入的。測試的目的就是設(shè)計測試案例,通過這些測試案例來發(fā)現(xiàn)軟件的缺陷和排除缺陷。測試的目的是在最小的成本和最少的時間內(nèi),通過設(shè)計合適的測試用例,系統(tǒng)地發(fā)現(xiàn)不同類別的錯誤,從而更好的解決問題,使系統(tǒng)不斷完善,滿足用戶的需求。

7.2 測試方法

測試任何產(chǎn)品都有兩種方法:如果已經(jīng)知道了產(chǎn)品應(yīng)該具有的功能,可以通過測試來檢驗是否每個功能正常使用;如果知道了產(chǎn)品的內(nèi)部工作過程,可以通過測試來檢測產(chǎn)品內(nèi)部動作是否按照說明書的規(guī)定正常工作。前一種稱為黒盒測試又稱功能測試,后一種方法稱為白盒測試又稱結(jié)構(gòu)測試。

在測試本系統(tǒng)時,采用的是白盒測試來設(shè)計測試用例,白盒測試法從總體上可劃分為靜態(tài)測試和動態(tài)測試;按測試操作的實施方式劃分為手工測試和借助于工具的自動化測試。

白盒測試的靜態(tài)測試方法:代碼檢查法、靜態(tài)結(jié)構(gòu)分析法、代碼質(zhì)量度量法等。

白盒測試的動態(tài)測試方法:功能確認(rèn)與接口測試、邏輯覆蓋分析法、基本路徑測試法、性能分析、內(nèi)存分析等。

本系統(tǒng)主要的是動態(tài)測試中的功能確認(rèn)。

7.3 系統(tǒng)模塊測試

1 測試問題

經(jīng)過各模塊測試,發(fā)現(xiàn)的問題羅列如下:

2 問題嚴(yán)重度描述,如表 6.1 所示:

表 6.1 系統(tǒng)模塊測試說明表

級別描述

結(jié)論

經(jīng)過以上詳細(xì)的設(shè)計與構(gòu)架,基本上完成系統(tǒng)的開發(fā)。在本次開發(fā)過程中,使用了到的是學(xué)校中沒有學(xué)習(xí)過的 React、antd、Highchart 和 ES6 編碼規(guī)范,在上手時十分困難,后來也是慢慢才摸索到要門。制作網(wǎng)站時,最困難的部分就是設(shè)計部分,網(wǎng)站中的功能點都可以實現(xiàn),而如何設(shè)計合理,又要讓網(wǎng)站功能飽滿是個重點。本網(wǎng)站還有很多不足之處和不合理的地方,但是大概的模型是有了,網(wǎng)站設(shè)計是一項非常精細(xì)的工作,需要耐心去精雕細(xì)琢才能日趨完美。制作網(wǎng)站的技術(shù)每天都有更新,如果一味的使用以前的技術(shù)會更不上進(jìn)度,網(wǎng)上有許多網(wǎng)站制作的分享網(wǎng)站和技術(shù)更新后的 API 網(wǎng)站,這些網(wǎng)站給網(wǎng)站制作者提供了很好的平臺,每天能從這些網(wǎng)站中吸取知識對自己能力的提升有很大的幫助,這些網(wǎng)站對有一定基礎(chǔ)的學(xué)者很友好,認(rèn)真學(xué)習(xí)幾次以后就能在這里自學(xué)了,互聯(lián)網(wǎng)這個工具一定要好好利用。

參考文獻(xiàn)及網(wǎng)站

React 技術(shù)棧系列教程: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 命令運行,運行完畢后如沒有網(wǎng)頁自動打開,請打開游覽器,輸入。

2 打完包的文件夾是 build,內(nèi)容應(yīng)該如下:







需要把這些文件放到服務(wù)器上才可運行。

關(guān)鍵詞:設(shè)計,實現(xiàn)

74
73
25
news

版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。

為了最佳展示效果,本站不支持IE9及以下版本的瀏覽器,建議您使用谷歌Chrome瀏覽器。 點擊下載Chrome瀏覽器
關(guān)閉