当前位置:文档之家› 数据分析软件FineBI如何实现OAuth单点登录

数据分析软件FineBI如何实现OAuth单点登录

数据分析软件FineBI如何实现OAuth单点登录
数据分析软件FineBI如何实现OAuth单点登录

数据分析软件FineBI如何实现 OAuth单点登录

OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是OAUTH的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此OAUTH是安全的。oAuth是Open Authorization的简写。

1.2 OAuth单点登录原理

通过过滤器拦截请求,期间通过aouth的认证过程,拿到user,实现帆软的单点登录。

1.3 实现步骤

1.将以下4个jave(HttpUtil.java、myexporter.java、myfilter.java、SSLConnectionClient.java)文件编译为class文件后,放到FineBI对应工程路径下:\WebReport\WEB-INF\classes\com\fr

注:若FineBI对应工程路径下的WEB-INF文件夹中没有classes\com\fr该路径,自行新建该路径。

HttpUtil.java

1.package com.fr;

2.

3.import https://www.doczj.com/doc/f7316590.html,.hsqldb.lib.StringUtil;

4.

5.import https://www.doczj.com/doc/f7316590.html,.ssl.*;

6.import java.io.*;

7.import https://www.doczj.com/doc/f7316590.html,.HttpURLConnection;

8.import https://www.doczj.com/doc/f7316590.html,.URL;

9.import https://www.doczj.com/doc/f7316590.html,.URLDecoder;

10.import https://www.doczj.com/doc/f7316590.html,.URLEncoder;

11.import java.security.SecureRandom;

12.import java.security.cert.X509Certificate;

13.import java.util.HashMap;

14.import java.util.Map;

15.import java.util.Map.Entry;

16.

17./**

18. * 进行http访问的基本类

19. */

20.public class HttpUtil {

21.

22.private static final String DEFAULT_CHARSET = "UTF-8";

23.

24.private static final String METHOD_POST = "POST";

25.

26.private static final String METHOD_GET = "GET";

27.

28.private static final int CONNECTTIMEOUT = 5000;

29.

30.private static final int READTIMEOUT = 5000;

31.

32.private static class DefaultTrustManager implements X509TrustMa

nager {

33.

34.public X509Certificate[] getAcceptedIssuers() {

35.return null;

36. }

37.

38.@Override

39.public void checkClientTrusted(X509Certificate[] cert, Stri

ng oauthType)

40.throws java.security.cert.CertificateException {

41. }

42.

43.@Override

44.public void checkServerTrusted(X509Certificate[] cert, Stri

ng oauthType)

45.throws java.security.cert.CertificateException {

46. }

47. }

48.

49.private static HttpURLConnection getConnection(URL url, String

method, String ctype)

50.throws IOException {

51. HttpURLConnection conn = null;

52.if ("https".equals(url.getProtocol())) {

53. SSLContext ctx = null;

54.try {

55. ctx = SSLContext.getInstance("TLS");

56. ctx.init(new KeyManager[0], new TrustManager[] { ne

w DefaultTrustManager() },

57.new SecureRandom());

58. } catch (Exception e) {

59.throw new IOException(e);

60. }

61. HttpsURLConnection connHttps = (HttpsURLConnection) url

.openConnection();

62. connHttps.setSSLSocketFactory(ctx.getSocketFactory());

63. connHttps.setHostnameVerifier(new HostnameVerifier() {

64.public boolean verify(String hostname, SSLSession s

ession) {

65.return true;// 默认都认证通过

66. }

67. });

68. conn = connHttps;

69. } else {

70. conn = (HttpURLConnection) url.openConnection();

71. }

72. conn.setRequestMethod(method);

73. conn.setDoInput(true);

74. conn.setDoOutput(true);

75. conn.setRequestProperty("User-Agent", "quantangle-

apiclient-java");

76. conn.setRequestProperty("Content-Type", ctype);

77. conn.setRequestProperty("Connection", "Keep-Alive");

78.return conn;

79. }

80.

81./**

82. * 通过get方法访问,默认编码为utf-8

83. *

84. * @param url 访问的url地址

85. * @param params 请求需要的参数

86. * @return 返回请求响应的数据

87. * @throws IOException

88. */

89.public static String doGet(String url, Map para

ms) throws IOException {

90.return doGet(url, params, DEFAULT_CHARSET);

91. }

92.

93./**

94. * 通过get方法访问

95. *

96. * @param url 访问的url地址

97. * @param params 请求需要的参数

98. * @param charset 字符编码

99. * @return 返回请求响应的数据

100. * @throws IOException

101. */

102.public static String doGet(String url, Map pa rams, String charset)

103.throws IOException {

104.if (StringUtil.isEmpty(url) || params == null) {

105.return null;

106. }

107. String response = "";

108. url += "?" + buildQuery(params, charset);

109. HttpURLConnection conn = null;

110. String ctype = "application/x-www-form-

urlencoded;charset=" + charset;

111. conn = getConnection(new URL(url), METHOD_GET, ctype); 112. response = getResponseAsString(conn);

113.return response;

114. }

115.

116./**

117. *

118. * @param url api请求的权路径url地址

119. * @param params api请求的业务级参数

120. * @return

121. * @throws IOException

122. */

123.public static String doPost(String url, Map p arams) throws IOException {

124.return doPost(url, params, CONNECTTIMEOUT, READTIMEOUT);

125. }

126.

127./**

128. *

129. * 通过post方法请求数据,默认字符编码为utf-8

130. *

131. * @param url 请求的url地址

132. * @param params 请求的参数

133. * @param connectTimeOut 请求连接过期时间

134. * @param readTimeOut 请求读取过期时间

135. * @return 请求响应

136. * @throws IOException

137. */

138.public static String doPost(String url, Map p arams, int connectTimeOut,

139.int readTimeOut) throws IOExcepti on {

140.return doPost(url, params, DEFAULT_CHARSET, connectTimeOu t, readTimeOut);

141. }

142.

143./**

144. *

145. * 通过post方法请求数据

146. *

147. * @param url 请求的url地址

148. * @param params 请求的参数

149. * @param charset 字符编码格式

150. * @param connectTimeOut 请求连接过期时间

151. * @param readTimeOut 请求读取过期时间

152. * @return 请求响应

153. * @throws IOException

154. */

155.public static String doPost(String url, Map p arams, String charset,

156.int connectTimeOut, int readTimeO ut) throws IOException {

157. HttpURLConnection conn = null;

158. String response = "";

159. String ctype = "application/x-www-form-

urlencoded;charset=" + charset;

160. conn = getConnection(new URL(url), METHOD_POST, ctype); 161. conn.setConnectTimeout(connectTimeOut);

162. conn.setReadTimeout(readTimeOut);

163. conn.getOutputStream().write(buildQuery(params, charset).

getBytes(charset));

164. response = getResponseAsString(conn);

165.return response;

166. }

167.

168./**

169. *

170. * @param params 请求参数

171. * @return 构建query

172. */

173.public static String buildQuery(Map params, S tring charset) {

174.if (params == null || params.isEmpty()) {

175.return null;

176. }

177. StringBuilder sb = new StringBuilder();

178.boolean first = true;

179.for (Entry entry : params.entrySet()) { 180.if (first) {

181. first = false;

182. } else {

183. sb.append("&");

184. }

185. String key = entry.getKey();

186. String value = entry.getValue();

187.if (!StringUtil.isEmpty(key) && !StringUtil.isEmpty(v alue)) {

188.try {

189. sb.append(key).append("=").append(URLEncoder.

encode(value, charset));

190. } catch (UnsupportedEncodingException e) {} 191. }

192. }

193.return sb.toString();

194.

195. }

196.

197.public static Map splitQuery(String query, St ring charset) {

198. Map ret = new HashMap();

199.if (!StringUtil.isEmpty(query)) {

200. String[] splits = query.split("\\&");

201.for (String split : splits) {

202. String[] keyAndValue = split.split("\\=");

203.boolean flag=true;

204.int i=0;int len=keyAndValue.length;

205.for (;i

206. {

207.if (StringUtil.isEmpty(keyAndValue[i]))

208. {

209. flag=false;

210.break;

211. }

212. }

213.if (flag && keyAndValue.length == 2) {

214.try {

215. ret.put(keyAndValue[0], URLDecoder.decode (keyAndValue[1], charset));

216. } catch (UnsupportedEncodingException e) {} 217. }

218. }

219. }

220.return ret;

221. }

222.

223.private static byte[] getTextEntry(String fieldName, String f ieldValue, String charset)

224.throws IOException {

225. StringBuilder entry = new StringBuilder();

226. entry.append("Content-Disposition:form-data;name=\""); 227. entry.append(fieldName);

228. entry.append("\"\r\nContent-Type:text/plain\r\n\r\n"); 229. entry.append(fieldValue);

230.return entry.toString().getBytes(charset);

231. }

232.

233.private static byte[] getFileEntry(String fieldName, String f ileName, String mimeType,

234. String charset) throws IOE xception {

235. StringBuilder entry = new StringBuilder();

236. entry.append("Content-Disposition:form-data;name=\""); 237. entry.append(fieldName);

238. entry.append("\";filename=\"");

239. entry.append(fileName);

240. entry.append("\"\r\nContent-Type:");

241. entry.append(mimeType);

242. entry.append("\r\n\r\n");

243.return entry.toString().getBytes(charset);

244. }

245.

246.private static String getResponseAsString(HttpURLConnection c onn) throws IOException {

247. String charset = getResponseCharset(conn.getContentType() );

248. InputStream es = conn.getErrorStream();

249.if (es == null) {

250.return getStreamAsString(conn.getInputStream(), chars et);

251. } else {

252. String msg = getStreamAsString(es, charset);

253.if (StringUtil.isEmpty(msg)) {

254.throw new IOException("{\"" + conn.getResponseCod e() + "\":\"" + conn.getResponseMessage() + "\"}");

255. } else {

256.throw new IOException(msg);

257. }

258. }

259.

260. }

261.

262.private static String getStreamAsString(InputStream input, St ring charset) throws IOException {

263. StringBuilder sb = new StringBuilder();

264. BufferedReader bf = null;

265.try {

266. bf = new BufferedReader(new InputStreamReader(input, charset));

267. String str;

268.while ((str = bf.readLine()) != null) {

269. sb.append(str);

270. }

271.return sb.toString();

272. } finally {

273.if (bf != null) {

274. bf.close();

275. bf = null;

276. }

277. }

278.

279. }

280.

281.private static String getResponseCharset(String ctype) { 282. String charset = DEFAULT_CHARSET;

283.if (!StringUtil.isEmpty(ctype)) {

284. String[] params = ctype.split("\\;");

285.for (String param : params) {

286. param = param.trim();

287.if (param.startsWith("charset")) {

288. String[] pair = param.split("\\=");

289.if (pair.length == 2) {

290. charset = pair[1].trim();

291. }

292. }

293. }

294. }

295.return charset;

296. }

297.

298.}

myexporter.java

1.package com.fr;

2.import com.fr.base.DynamicUnitList;

3.import com.fr.base.FRContext;

4.import com.fr.base.ResultFormula;

5.import https://www.doczj.com/doc/f7316590.html,paratorUtils;

6.import com.fr.general.DeclareRecordType;

7.import com.fr.general.ModuleContext;

8.import com.fr.general.web.ParameterConsts;

9.import com.fr.io.TemplateWorkBookIO;

10.import com.fr.io.exporter.AppExporter;

11.import com.fr.io.exporter.PDFExporter;

12.import com.fr.io.exporter.WordExporter;

13.import com.fr.json.JSONArray;

14.import com.fr.json.JSONException;

15.import com.fr.json.JSONObject;

16.import com.fr.main.TemplateWorkBook;

17.import com.fr.main.workbook.ResultWorkBook;

18.import com.fr.page.PageSetProvider;

19.import com.fr.page.PaperSettingProvider;

20.import com.fr.report.cell.CellElement;

21.import com.fr.report.cell.DefaultTemplateCellElement;

22.import com.fr.report.cell.ResultCellElement;

23.import com.fr.report.cell.cellattr.PageExportCellElement;

24.import com.fr.report.core.ReportUtils;

25.import com.fr.report.core.block.PolyResultWorkSheet;

26.import com.fr.report.module.EngineModule;

27.import com.fr.report.worksheet.PageRWorkSheet;

28.import com.fr.stable.CodeUtils;

29.import com.fr.stable.ColumnRow;

30.import com.fr.stable.PageActor;

31.import com.fr.stable.unit.FU;

32.import com.fr.stable.unit.UNIT;

33.import com.fr.web.Browser;

34.import com.fr.web.core.ErrorHandlerHelper;

35.import com.fr.web.core.utils.ExportUtils;

36.import com.fr.web.utils.WebUtils;

37.import javax.servlet.ServletException;

38.import javax.servlet.http.HttpServlet;

39.import javax.servlet.http.HttpServletRequest;

40.import javax.servlet.http.HttpServletResponse;

41.import java.io.IOException;

42.import java.io.OutputStream;

43.import java.util.*;

44.import java.util.regex.Matcher;

45.import java.util.regex.Pattern;

46.public class myexporter extends HttpServlet {

47.private static boolean offlineWriteAble = true;

48.private static final Pattern KEY_VALUE_PATTERN = https://www.doczj.com/doc/f7316590.html,pil

e("[^{,}]*:[^{,}]*");

49.public static void dealResponse4Export(HttpServletResponse res)

{

50. res.setHeader("Cache-Control", "public");

51. res.setHeader("Cache-Control", "max-age=3");

52. res.reset();

53. }

54.private static final long serialVersionUID = 1L;

55.public void doPost(HttpServletRequest request, HttpServletR

esponse response) throws ServletException, IOException {

56. doGet(request, response);

57. }

58.public void doGet(HttpServletRequest req, HttpServletRespon

se res) throws ServletException, IOException {

59.// 首先需要定义执行所在的环境,这样才能正确读取数据库信息

60.try {

61. ModuleContext.startModule(EngineModule.class.getNam

e());

62. dealResponse4Export(res);

63. String fileName = WebUtils.getHTTPRequestParameter(

req, ParameterConsts.__FILENAME__);

64. String format = WebUtils.getHTTPRequestParameter(re

q, "format");

65. Browser browser = Browser.resolve(req);

66. fileName = browser.getEncodedFileName4Download(file

Name);

67. List paraMapList = new ArrayList();

68. List reportPathList = new ArrayList();

69. PaperSettingProvider paperSettingProvider=null;

70.if (WebUtils.getHTTPRequestParameter(req, Parameter

Consts.REPORTLETS) != null) {

71. createReportsFromReportlets(WebUtils.getHTTPReq

uestParameter(req, ParameterConsts.REPORTLETS), reportPathList, par aMapList);

72. ResultWorkBook[] resultWorkBook = new ResultWor

kBook[reportPathList.size()];

73. PolyResultWorkSheet allInOneSheet = new PageRWo

rkSheet();

74.for (int i = 0; i < reportPathList.size(); i++)

{

75. TemplateWorkBook workbook = TemplateWorkBoo

kIO.readTemplateWorkBook(FRContext.getCurrentEnv(), String.valueOf( reportPathList.get(i)));

76. java.util.Map paraMap = (Map) paraMapList.g

et(i);

77. resultWorkBook[i] = workbook.execute(paraMa

p, new PageActor());

78.if (i==0)

79. {

80. paperSettingProvider=ReportUtils.getPap

erSettingListFromWorkBook(workbook).get(0);

81. }

82. }

83.int countx; int county; int length = result

WorkBook.length;

84.long sumx;long sumy;

85.long[] lengthx = new long[length];long[] l

engthy = lengthx.clone();

86.if (length > 0) {

87. lengthx[0] = lengthy[0] = 0;

88. }

89.for (int i = 1; i < length; i++) {

90. sumy = 0;

91. county = resultWorkBook[i - 1].getEleme

ntCaseReport(0).getRowCount();

92.while (county-- > 0) {

93. sumy = sumy + resultWorkBook[i - 1]

.getElementCaseReport(0).getRowHeight(county).getLen();

94. }

95.

96. lengthx[i] = 0;lengthy[i] = sumy+length

y[i-1];

97. }

98. ArrayList verticalList = new ArrayLis

t();

99. ArrayList horizontalList = new ArrayL

ist();

100. analyElementColumnRow(verticalList, horiz ontalList, resultWorkBook, lengthx, lengthy);

101. allInOneSheet = setNewColRowSize(vertical List, horizontalList, allInOneSheet);

102.//填充空白单元格

103. allInOneSheet = fillBlankCell(verticalLis t.size(), horizontalList.size(), allInOneSheet);

104.for (int i = 0, len = reportPathList.size (); i < len; i++) {

105.//添加当前元素到新sheet中去

106. allInOneSheet = addElemToSheet(vertic alList, horizontalList, allInOneSheet, resultWorkBook[i], lengthx[i ], lengthy[i]);

107. }

108.if (paperSettingProvider==null)

109. {

110.return;

111. }

112.// 将结果工作薄导出为Excel文件

113. doExport(req, res, format, fileName,false, br owser,allInOneSheet.generateReportPageSet(paperSettingProvider)); 114. }

115. }catch(Exception e){

116. e.printStackTrace();

117. }

118. }

119.private static void doExport(HttpServletRequest req, HttpServ letResponse res,String format, String fileName, boolean isEmbbed, B rowser browser,PageSetProvider page) throws Exception {

120. AppExporter[] exporters = new AppExporter[] {null}; 121. DeclareRecordType[] exportTypes = new DeclareRecordType[] {null};

122. OutputStream outputStream = res.getOutputStream();

123. getExporterAndTypeAndexport(req, res, format, fileName, i sEmbbed, browser, exporters,exportTypes,outputStream,page);

124. DeclareRecordType exportType = exportTypes[0];

125.

126.if (exportType == null) {

127. ErrorHandlerHelper.getErrorHandler().error(req, res, "Cannot recognize the specifed export format:" + format + ",\nThe c orrect format can be PDF,Excel,Word,SVG,CSV,Text or Image."); 128.return;

129. }

130.

131.try {

132. outputStream.flush();

133. outputStream.close();

134. } catch (IOException e) {

135.// alex:有些Exporter在export里面可能会已经做了out.close 操作,为了不打印IOException,这里catch到之后不输出

136. }

137. }

138.private static void getExporterAndTypeAndexport(HttpServletRe quest req, HttpServletResponse res,

139. String format, String fileName, boolean isEmbbed, Browser browser, AppExporter[] exporter s, DeclareRecordType[] exportTypes,OutputStream out,PageSetProvider page) throws Exception{

140.if (format.equalsIgnoreCase("PDF")) {

141. ExportUtils.setPDFContent(res, fileName, isEmbbed); 142. PDFExporter PDFExport = new PDFExporter();

143. PDFExport.export(out, page);

144. } else if (format.equalsIgnoreCase("Word")) {

145. ExportUtils.setWordConetent(res, fileName);

146. WordExporter WordExport = new WordExporter();

147. WordExport.export(out, page);

148. }

149. }

150.// private static AppExporter getPDFExporter(HttpServletReques t req, ReportSessionIDInfor sessionIDInfor) {

151.// AppExporter exporter;

152.// String extype = WebUtils.getHTTPRequestParameter(req, "

extype");

153.// // james:是否是PDF客户端打印

154.// boolean isPDFPrint = ComparatorUtils.equals(WebUtils.ge tHTTPRequestParameter(req, "isPDFPrint"), "true");

155.// // 标志是否正在为客户端PDF打印而生成PDF文件

156.// // 打印的话,记录下

157.// if (isPDFPrint) {

158.// LogUtils.recordPrintInfo(sessionIDInfor.getBookPath (), sessionIDInfor.getParameterMap4Execute4Consisent(),

159.// DeclareRecordType.PRINT_TYPE_PDF, sessionID Infor);

160.// if (!Browser.resolve(req).isIE()) {

161.// FRContext.getLogger().error(Inter.getLocText("N S_print_pdf"));

162.// }

163.// }

164.// /*

165.// * 根据sessionIDInfor获取当前的打印机偏移量,若为打印则设置偏移导出则不偏移

166.// */

167.// SetPrinterOffsetService setprinteroffsetservice = new S etPrinterOffsetService();

168.// float[] offset = setprinteroffsetservice.getOffsetBySes sionIDInfor(sessionIDInfor);

169.// sessionIDInfor.setoffset(isPDFPrint ? offset : new floa t[2]);

170.// // carl:两种类型

171.// if (ComparatorUtils.equals(ExportConstants.TYPE_RESOLVE SOMETHING, extype)) {

172.// exporter = new PDFExporter2(isPDFPrint);

173.// } else {

174.// exporter = new PDFExporter(isPDFPrint);

175.// }

176.// return exporter;

177.// }

178.//

179.// private static void dealExcelExporter(HttpServletRequest re q, HttpServletResponse res, ReportSessionIDInfor sessionIDInfor, 180.// AppExporter[] exporte rs, DeclareRecordType[] exportTypes, String fileName, Browser brows er) {

181.// // carl:四种输出方式

182.// String extype = WebUtils.getHTTPRequestParameter(req, "

extype");

183.// // 假如是层式报表默认使用大数据方式

184.// ResultWorkBook wb = sessionIDInfor.getWorkBook2Show();

185.// boolean isPage = true; // 大数据量的时候要不要分页

186.// for (int i = 0; i < wb.getReportCount(); i++) {

187.// if (wb.getReport(i) instanceof LayerReport || wb.ge tReport(i) instanceof LayerPageReport) {

e(extype)) {

189.// isPage = false;

190.// }

191.// if (!ExportConstants.TYPE_PAGETOSHETT.equalsIgn oreCase(extype)) {

192.// extype = ExportConstants.TYPE_LARGEDATA_PAG E;

193.// }

194.// break;

195.// }

196.// }

197.//

198.// if (ExportConstants.TYPE_LARGEDATA_PAGE.equalsIgnoreCas e(extype)) {

199.// ExportUtils.setZipContext(res, fileName, browser.sh ouldSetContentTypeOnZipDownload());

200.// exporters[0] = new LargeDataPageExcelExporter(Repor tUtils.getPaperSettingListFromWorkBook(sessionIDInfor.getContextBoo k()), isPage);

201.// exportTypes[0] = DeclareRecordType.EXPORT_TYPE_EXCE L_LARGE;

202.// } else {

203.// if (ExcelUtils.checkPOIJarExist() && !WebUtils.getH TTPRequestBoolParameter(req, "isExcel2003")) {

204.// ExportUtils.setExcel2007Content(res, fileName);

205.// } else {

206.// ExportUtils.setExcelContent(res, fileName); 207.// }

208.//

209.// if (ExportConstants.TYPE_SIMPLE.equalsIgnoreCase(ex type)) {

210.// exporters[0] = new ExcelExporter(ReportUtils.ge tPaperSettingListFromWorkBook(sessionIDInfor.getContextBook())); 211.// exportTypes[0] = DeclareRecordType.EXPORT_TYPE_ EXCEL_ORIGINAL;

212.// } else if (ExportConstants.TYPE_PAGETOSHETT.equalsI gnoreCase(extype)) {

213.// exporters[0] = new PageToSheetExcelExporter(Rep ortUtils.getPaperSettingListFromWorkBook(sessionIDInfor.getContextB ook()));

214.// exportTypes[0] = DeclareRecordType.EXPORT_TYPE_ EXCEL_PAGESHEET;

Case(extype)) {

216.// exporters[0] = new StreamExcelExporter(ReportUt ils.getPaperSettingListFromWorkBook(sessionIDInfor.getContextBook() ));

217.// exportTypes[0] = DeclareRecordType.EXPORT_TYPE_ EXCEL_ORIGINAL;

218.// } else {

219.// exporters[0] = new PageExcelExporter(ReportUtil s.getPaperSettingListFromWorkBook(sessionIDInfor.getContextBook())) ;

220.// exportTypes[0] = DeclareRecordType.EXPORT_TYPE_ EXCEL_PAGE;

221.// }

222.//

223.// ((ExcelExporter)exporters[0]).setExcel2003(WebUtils .getHTTPRequestBoolParameter(req, "isExcel2003"));

224.// }

225.// }

226.//

227.// private static DeclareRecordType getImageExportType(HttpSer vletRequest req) {

228.// DeclareRecordType[] supportImageType = {DeclareRecordTy pe.EXPORT_TYPE_IMAGE_PNG, DeclareRecordType.EXPORT_TYPE_IMAGE_JPG,

229.// DeclareRecordType.EXPORT_TYPE_IMAGE_GIF, Declar eRecordType.EXPORT_TYPE_IMAGE_BMP, DeclareRecordType.EXPORT_TYPE_IM AGE_WBMP

230.// };

231.// String extype = WebUtils.getHTTPRequestParameter(req, "

extype");

232.// int defaulttype = 0;

233.// if (extype != null) {

234.// for (int i = 0; i < supportImageType.length; i++) {

235.// if (extype.equalsIgnoreCase(supportImageType[i] .getTypeString())) {

236.// defaulttype = i;

237.// break;

238.// }

239.// }

240.// }

241.// return supportImageType[defaulttype];

242.// }

243.public static PolyResultWorkSheet fillBlankCell(int rowCount, int colCount,PolyResultWorkSheet allInOneSheet ){

244.for (int i = 0; i < rowCount; i++) {

245.for (int j = 0; j < colCount; j++) {

246.//填充空白格, 主要是为了方便后续分页取cell iterator.next方便, 不然是null就不往下走了

247. ResultCellElement ce = createDefaultCellElement(j , i);

248. allInOneSheet.addCellElement(ce);

249. }

250. }

251. allInOneSheet.setRowMappingArray(new int[0]);

252. allInOneSheet.setColumnMappingArray(new int[0]);

253.return allInOneSheet;

254. }

255.public static ResultCellElement createDefaultCellElement(int col, int row){

256.return new PageExportCellElement(new DefaultTemplateCellE lement(col, row));

257. }

258.public static PolyResultWorkSheet addElemToSheet(ArrayList< UNIT> verticalList, ArrayList horizontalList, PolyResultWorkS heet page_sheet, ResultWorkBook resultWorkBook,long lengthx,long l engthy){

259. UNIT x= FU.getInstance(lengthx);

260. UNIT y= FU.getInstance(lengthy);

261. DynamicUnitList newRowList = page_sheet.getRowHeightList_ DEC();

262. DynamicUnitList newColList = page_sheet.getColumnWidthLis t_DEC();

263.int rowCount = page_sheet.getRowCount();

264.int colCount = page_sheet.getColumnCount();

265. DynamicUnitList rowHeightList = resultWorkBook.getElement CaseReport(0).getRowHeightList_DEC();

266. DynamicUnitList colWidthList = resultWorkBook.getElementC aseReport(0).getColumnWidthList_DEC();

267. Iterator it = resultWorkBook.getElementCase Report(0).cellIterator();

268. HashMap columnRowMap = new HashMap();

269. HashMap formulaMap = new Hash Map();

270.while(it.hasNext()){

271. CellElement ce = it.next();

272. UNIT ceX = x.add(colWidthList.getRangeValueFromZero(c

e.getColumn()));

273. UNIT ceWidth = colWidthList.getRangeValue(ce.getColum n(), ce.getColumn() + ce.getColumnSpan());

274. UNIT ceY = y.add(rowHeightList.getRangeValueFromZero( ce.getRow()));

275. UNIT ceHeight = rowHeightList.getRangeValue(ce.getRow (), ce.getRow() + ce.getRowSpan());

276.//直接去坐标列表里找, 然后+1, 因为行高list就是根据坐标列表生成的.

277.int newCeCol = horizontalList.indexOf(ceX) + 1; 278.int newCeColSpan = getNewSpan(newCeCol, newColList, c eWidth, colCount);

279.int newCeRow = verticalList.indexOf(ceY) + 1;

280.int newCeRowSpan = getNewSpan(newCeRow, newRowList, c eHeight, rowCount);

281. ColumnRow oriCR = ColumnRow.valueOf(ce.getColumn(), c

e.getRow());

282. ColumnRow newCR = ColumnRow.valueOf(newCeCol, newCeRo w);

283.//记录下格子的变迁, A1->B5, 这样后续公式有用到A1的都改成B5

284. columnRowMap.put(oriCR.toString(), newCR.toString());

285. ResultCellElement newCe = (ResultCellElement) ce.deri veCellElement(newCeCol, newCeRow, newCeColSpan, newCeRowSpan); 286. page_sheet.addCellElement(newCe);

287.if(ce.getValue() instanceof ResultFormula){

288. formulaMap.put(newCe, (ResultFormula) ce.getValue ());

289. }

290. }

291.//改变所有保留公式里的ColumnRow

292. modifyAllFormula(formulaMap, columnRowMap);

293.return page_sheet;

294. }

295.public static int getNewSpan(int newCeColRow, DynamicUnitList newColRowList, UNIT ceWidthHeight, int count){

296.for (int i = newCeColRow; i < count + 1; i++) {

297.if(ComparatorUtils.equals(ceWidthHeight, newColRowLis t.getRangeValue(newCeColRow, i))){

298.return i - newCeColRow;

299. }

300. }

301.

302.return0;

303. }

304.public static PolyResultWorkSheet setNewColRowSize(ArrayL ist verticalList, ArrayList horizontalList, PolyResu ltWorkSheet allInOneSheet){

305.//从坐标列表里生成行高列宽 [0, 2, 6] -> [2, 4]

306.for (int i = 0; i < verticalList.size(); i++) {

307. UNIT lastCoordinate = i == 0 ? UNIT.ZERO : verticalLi st.get(i - 1);

308. UNIT rowHeight = verticalList.get(i).subtract(lastCoo rdinate);

309. allInOneSheet.setRowHeight(i, rowHeight);

310. }

311.

312.for (int i = 0; i < horizontalList.size(); i++) {

313. UNIT lastCoordinate = i == 0 ? UNIT.ZERO : horizontal List.get(i - 1);

314. UNIT colWidth = horizontalList.get(i).subtract(lastCo ordinate);

315. allInOneSheet.setColumnWidth(i, colWidth);

316. }

317.return allInOneSheet;

318. }

319.public static void analyElementColumnRow(ArrayList vert icalList, ArrayList horizontalList,

320. ResultWorkBook [] re sultWorkBooks,long [] lengthx,long [] lengthy){

321.int length=resultWorkBooks.length;

322.for (int i=0;i

323. ResultWorkBook resultWorkBook = resultWorkBooks[i]; 324. UNIT y = FU.getInstance(lengthy[i]);

325.int rowCount = resultWorkBook.getElementCaseReport(0) .getRowCount();

326. DynamicUnitList rowHeightList = resultWorkBook.getEle mentCaseReport(0).getRowHeightList_DEC();

327. analyColumnRow(y, verticalList, rowHeightList, rowCou nt);

328.

329.//列处理

330. UNIT x = FU.getInstance(lengthx[i]);

331.int colCount = resultWorkBook.getElementCaseReport(0) .getColumnCount();

332. DynamicUnitList colWidthList = resultWorkBook.getElem entCaseReport(0).getColumnWidthList_DEC();

333. analyColumnRow(x, horizontalList, colWidthList, colCo unt);

334.

335.//得到的多个块, 需要按序排列下, 才好切行高

336. }

337. sort(verticalList, horizontalList);

338. }

339.public static void analyColumnRow(UNIT startPoint, ArrayList verticalSet,

340. DynamicUnitList rowHeightL ist, int count){

341. verticalSet.add(startPoint);

342.for (int i = 0; i < count; i++) {

343. UNIT rowHeight = rowHeightList.getRangeValueFromZero(

i + 1);

344. UNIT rowY = rowHeight.add(startPoint);

345. verticalSet.add(rowY);

346. }

347. }

348.public static void sort(ArrayList verticalList, Array List horizontalList){

349.

350. Comparator compare = new Comparator() { 351.

352.public int compare(UNIT o1, UNIT o2) {

353.if (o1.subtract(o2).equal_zero()){

354.return0;

355. }

356.

357.return o1.subtract(o2).more_than_zero() ? 1 : -1;

358. };

359. };

360.

361. Collections.sort(verticalList, compare);

362. Collections.sort(horizontalList, compare);

363. }

364.private static void modifyAllFormula(HashMap formulaMap, HashMap columnRowMap){ 365. Iterator> formulaIt = formulaMap.entrySet().iterator();

366.while(formulaIt.hasNext()){

软件需求分析

软件需求分析 目录 1.引言 1.1项目名称 1.2编写目的 1.3开发背景 2.任务概述 2.1目标 2.1.2 应用目标 2.2运行环境 3. 数据描述 4.功能要求 4.1功能划分 4.2功能描述 5.性能要求 5.1数据精确 5.2时间特性 5.3适应性 6.运行需求 6.1用户界面 6.2硬件接口 6.3软件接口

6.4故障处理 7.其他要求 8.实现代码(部分) 9.个人感想 1.引言 1.1项目名称: 制作一个财务管理系统 1.2编写目的: 编写财务管理系统需求分析的目的是明确所开发的软件的功能、性能、界面,使系统分析人员及软件开发人员能清楚地了解用户的需求,方便开发工作和测试工作。现代企业围绕提高经济效益而进行财务管理所要达到的目的,是评价企业财务活动是否合理的标准。国内外关于财务管理目标的观点众多,但影响较广的主要以下几种观点:企业利润最大化、股东财富最大化、投资报酬率最大化,资本配置最优化。 1.3开发背景: 随着现代社会的快速发展,各个企业公司在多方面都不断地创新与提高,财务管理作为整个公司运筹的重要组成部分之一,因此大力发展财务管理很有必要,怎样合理而有效的提高财务管理水平和工作效率--已成为企业亟需解决的问题。 为帮助企业更好的实现信息化管理,各个公司成功地推出了适应现代社会发展的财务管理软件,大大提高了企业的管理水平和工作效率,使企业能够从容面对激烈的市场竟争。

2.任务概述 2.1目标 2. 1.1开发目标 财务系统用于让各地市、厅局等单位或部门等的各项与财务有关的资料的维护,同时提供良好的各项资产的管理。 2. 1.2应用目标 项目的目标是实现对各个部门的财务信息的分层次管理,可以对管理人员设置角色,实现对不同部门,不同操作权限的设置。 2.2运行环境 ?Windows xp操作系统 ?MyEclipse 3.数据描述 共有1个表,分别为通讯录管理系统的数据库,财务上包括姓名、职位、工资等字段 4.功能要求 4.1功能划分 本系统有以下功能模块: 1)登陆模块 2)数据输入功能 3)数据显示功能 4)查询功能 5)修改功能

生产运营分析报告风电

2017年07月生产运营分析报告 一、本月主要生产指标完成情况 1、发电量: 当期风电计划为万kW·h,当期风电实际完成万kW·h,完成当期计划的%,环比减少%,同比增加%,完成年计划的% 。当期光伏计划为27万kW·h,当期光伏实际完成万kW·h,完成当期计划的%,环比减少%,完成年计划的%。 2、上网电量: 当期风电计划万kW·h,当期风电实际完成为万kW·h,完成当期计划的%,环比减少% ,同比增长%,完成年计划%。当期光伏计划万kW·h,当期光伏实际完成万kW·h,完成当期计划的%,环比减少%,完成年计划的%。 本月实际完成发电量与当期计划发电量差值原因: 风电方面: 1)拉马风电场本期可研风速为s,同期风速为s,上期平均风速为s,本期实际测得风速为s。鲁南风电场本期可研风速为6m/s,同期风速为s,上期平均风速为s,而本期实际测得风速为s。鲁北风电场本期可研风速为s, ,

上期平均风速为s,而本期实际测得风速为s。大面山一期可研平均风速s,上期平均风速 m/s 实际平均风速s上。大面山二期可研平均风速 m/s,上期平均风速s,实际平均风速s 。实际风速小于可研风速较多,。根据平均风速分析,本期拉马、鲁北、大面山一期、大面山二期风电场风速比同期风速和可研风速以及上期风速都低,加之二期投运时间较计划时间有所滞后,所以导致风电公司本期都没有完成发电任务。 2)拉马、鲁南66箱变过电压保护器改造,存在一定损失电量。 3)拉马、鲁南发电机批量更换,产生较多机组故障损失电量。 4)拉马风机存在叶片螺栓批次断裂和发电机定子损坏的情况。这也是造成本期未完成发电任务的原因之一。 光伏方面: 1)进入夏季光照强度增加,所以本期光伏超额完成任务。 二、本月生产运营情况 1.生产运营情况 1)电力供需及电力交易情况 目前四川电力系统开始模拟按照水、火电站的考核方式对风电、光伏进行“两个细则的考核”,但是目前没有限制风电、光伏的负荷,根据来风、光照情况进行发电,且本月没有交易电量。

数据分析中常用的10种图表及制作过程

数据分析中常用得10种图表 1折线图 折线图可以显示随时间(根据常用比例设置)而变化得连续数据,因此非常适用于显示在相等时间间隔下数据得趋势。 表1家用电器前半年销售量 月份冰箱电视电脑平均销售量合计 1月68 45 139 84 252 2月33 66 166 88 265 3月43 79 160 94 282 4月61 18 115 65 194 5月29 19 78 42 126 6月22 49 118 63 189 图1 数点折线图 图2堆积折线图

图3百分比堆积折线图 2柱型图 柱状图主要用来表示各组数据之间得差别。主要有二维柱形图、三维柱形图、圆柱图、圆锥图与棱锥图。 图4二维圆柱图 3堆积柱形图 堆积柱形图不仅可以显示同类别中每种数据得大小还可以显示总量得大小。 图5堆积柱形图

图6百分比堆积柱形图 百分比堆积柱形图主要用于比较类别柱上每个数值占总数得百分比,该图得目得就是强调每个数据系列得比例。 4线-柱图 图7线-柱图 这种类型得图不仅可以显示出同类别得比较,更可以显示出平均销售量得趋势情况。 5两轴线-柱图 月份工资收 入(元) 其她收入 (元) 工资占其她收入得百分 比 1月5850 12000 48、75% 2月5840 15000 38、93% 3月4450 20000 22、25%

4月6500 10000 65、00% 5月5200 18000 28、89% 6月5500 30000 18、33% 图8两轴线-柱图 操作步骤:01 绘制成一样得柱形图,如下表所示: 图1 操作步骤02: 左键单击要更改得数据,划红线部分所示,单击右键选择【设置数据系列格式】,打开盖对话框,将【系列选项】中得【系统绘制在】更改为“次坐标轴”,得到图4得展示结果。

软件工程用户界面设计报告书

软件工程用户界面设计报告书

目录 0. 文档介绍3 0.1 文档目的3 0.2 文档范围3 0.3 读者对象3 0.4 参考文献3 0.5 术语与缩写解释4 1. 应当遵循的界面设计规范4 2. 界面的关系图和工作流程图9 3. 主界面 10 4. 子界面 A 12 5. 子界面 B 13 6. 美学设计13 7. 界面资源设计错误!未定义书签。 8. 其它错误!未定义书签。

文档介绍 0.1 文档目的 界面设计是为了满足软件专业化标准化的需求而产生的对软 件的使用界面进行美化优化规范化的设计分支。界面设计文档能 够让用户对软件产品有了更直观的了解,而且了解各个模块的设计及用意。 0.2 文档范围 文档包括公用界面设计,学生用户界面设计,教师用户界面设计,其中各个界面包括框架设计,编程设计,按钮设计,面板设计,菜单设计,标签设计,图标设计,滚动条及状态栏设计。 0.3 读者对象 登陆网站的游客、注册成会员的学生、教师以及管理员。 0.4 参考文献 提示:列出本文档的所有参考文献(能够是非正式出版物),格式如下: [1] 张海藩,<软件工程导论(第5版)>,清华大学出版社,19 01月 [2] 杨培添,<软件界面设计>,电子工业出版社, 02月 [3] 林锐,,电子工业出版社, 5月 [4] 吴士力,汪孝宜,胡俦,<网络系统开发实例精粹(JSP版)>,电 子工业出版社, 8月 [5] 黄艳群,黎旭,李荣丽,<设计·人机界面>,北京理工大学出版社, 5月

0.5 术语与缩写解释 缩写、术语解释 SPP 精简并行过程,Simplified Parallel Process SD 系统设计,System Design 1. 应当遵循的界面设计规范 软件界面的设计,既要从外观上进行创意以到达吸引眼球的目的,还要结合图形和版面设计的相关原理,从而使得软件设计变成了一门独特的艺术。软件用户界面的设计应遵循以下几个基本原 则: 用户导向原则: 明确到底谁是使用者,要站在用户的观点和立场上来考虑设计软件。要作到这一点,必须要和用户来沟通,了解她们的需求、目标、期望和偏好等。网页的设计者要清楚,用户之间差别很大,她们的能力各有不同。比如有的用户可能会在视觉方 面有欠缺(如色盲),对很多的颜色分辨不清;有的用户的听觉也会有障碍,对于软件的语音提示反映迟钝;而且相当一部分用户

软件开发需求分析报告

需求分析报告 1.引言 1.1目的 需求,指的是系统提供的能力必须遵从的条件,一个系统能否达到预期目标,系统需求做的好坏起着决定性作用,因此,他无疑是该平台开发过程中的重要一环。按照传统的软件工程理论,需求分析的目标就是确定要干什么,而不是怎么干,按照统一软件过程的理论(RUP理论),该平台的需求分析就是要致力于高效的正确的开发系统。必须足够详细的描述出系统需求,同时也要详细的描述系统必须达到的条件或实现的功能,使得用户就系统产生的问题一致。 本章将要对”基于教学POI的校园公共服务平台设计与开发”的需求进行分析,再此基础上将会对系统的各个功能进行建模,并且给出模型模型描述的图例序列图等模型。建立系统目标和需要解决的问题。 1.2背景 本设计将对基于教学POI的校园公共服务平台设计与开发进行详细的需求分析;基于教学POI的校园公共服务平台设计在兴趣点软件或APP中属于较为新颖贴近学生生活与教学内容的软件在这方面有大量的资源可循但是并没有与之相关的软件。作为本次软件工程设计的需求总体分析我们需要在POI、教学以及手机软件开发进行基本的融会贯通。 1.3术语 列出本报告中用到的专门术语的定义。 2.任务概述 2.1目标 POI信息平台系统的建立,最直接的提供了非常好的查询管理平台,极大的方便了学生的查询教学点\课程等方案的选择,为学生教师等提供了海量的便利教学信息;学生再也不用考虑担心自己找不到有疑问而大费精力. 通过对用户需求分析以及POI流程研究我们应该解决以下问题 在APP中搜索到正确的\合理的POI信息; POI信息的充分展现,包括地图展示并标记POI点的特殊标记;

大数据分析及其在医疗领域中的应用-图文(精)

第7期 24 2014年4月10日 计算机教育 ComputerEducation ◆新视点 文章编号:1672.5913(2014)07—0024-06 中图分类号:G642 大数据分析及其在医疗领域中的应用 邹北骥 (中南大学信息科学与工程学院,湖南长沙410083) 摘要:互联网和物联网技术的快速发展给数据的上传与下载带来了前所未有的便利,使得互联网上 的数据量急剧增长,由此产生了针对大数据的存储、计算、分析、处理等新问题,尤其是对大数据的挖掘。文章分析当前大数据产生的背景,阐述大数据的基本特征及其应用,结合医疗领域,论述医疗 大数据分析的目的、意义和主要方法。 关键词:大数据;物联网;医疗;大数据挖掘 1 大数据早已存在,为何现在称之为大

数据时代 计算与数据是一对孪生姐妹,计算需要数据,数据通过计算产生新的价值。数据是客观事 物的定量表达,来自于客观世界并早已存在。例 如,半个世纪前,全球的人口数量就有数十亿,与之相关的数据就是大数据;但是在那个时代,由于技术的局限性,大数据的采集、存储和处理 还难以实现。 互联网时代之前,采集世界各地的数据并让它们快速地进入计算系统几乎是一件不可想象的 事情。20世纪80年代兴起的互联网技术在近30 年里发生了翻天覆地的变化,彻底地改变了人们的工作和生活方式【l】。通过互联网人们不仅可以下载到新闻、小说、论文等各类文字数据,而且可以轻而易举地下载到音乐、图像和视频等多媒体数据,这使得互联网上的数据流量急剧增长。据统计,现在互联网上每分钟流人流出的数 据量达到1 000 PB,即10亿 GBt21。 推动大数据产生的另一个重要因素是物联网技术。近几年发展起来的物联网技 术通过给每个物品贴上标签 并应用RFID等技术实现了

软件工程--需求分析报告

文档编号:001 版本号:1.0 文档名称:需求分析 项目名称:学生智能管理系统 项目负责人:朱岩 项目组长:朱岩 组员:王增、皮素梅、潘鸯鸯、陈金龙、贾春阳 开发单位:西邮07级科技1班软件开发小组 一、引言: 1、编写目的:

对庞大的信息随着学校的规模不断扩大,学生数量急剧增加,有关学生的各种信息也成倍增长。有必要开发学生信息管理系统来提高学生管理工作的效率。通过这样的系统,可以做到信息的规范管理、科学统计和快速查询,从而减少管理方面的工作量,同时也可以方便学生对信息的获取。 学生信息系统也是实现学校管理现代化和信息化的重要内容。因此,学生信息管理系统应该能够为用户提供充足的信息和快捷的查询手段,并且,面对学生生活的不断丰富化,各种小方面管理软件的泛滥,身为学生以及考虑学校本身管理的多方面的统一。本小组所开发系统是基于C/S结构,使用Visual Basic程序设计语言及SQLServer2000数据库进行设计与开发。 本系统针对软件界面的人性化,生活化,做了突破性的工作,以及多项管理功能的集成上作了初步的拓展,目的在于使管理者和访问者易于甚至乐于接受,并提出学校管理系统的一体化概念,使学校的管理更有效率。 2、编写背景: 系统待开发的名称:学生智能管理系统 项目组长:朱岩 程序录入:朱岩、王增、皮素梅、 需求分析:朱岩、潘鸯鸯、陈金龙、皮素梅 软件测试:朱岩、王增、皮素梅、潘鸯鸯、陈金龙、贾春阳

本系统的用户:学生,老师,管理员 3、定义: (1)静态数据:系统内部有关的数据结构和操作规程 (2)动态数据:程序运行时输入和输出的数据 (3)数据字典:数据字典(DD,Data Dictionary)是关于数据流 程图中出现的所有名字(数据流、处理、数据存储) 的定义的集合。 4、参考资料: [1]张向宏.软件生命周期质量保证与测试.北京:电子工业出版 社.2009 [2]张海藩.软件工程导论.北京:清华大学出版社. 2005 [3]张焕君.基于VB和SQL的数据库编程技术.北京:清华大学出版 社.2008 二:任务概述: 1、目标: (1)给出软件系统的数据流程图和数据结构。 (2)提出详细的功能说明,确定设计限定条件,规定性能需求。(3)密切与用户的联系,使用户明确自己的任务,以便实现上述两项目标。 (4)以最低的成本,在最短的期限内开发出具有管理学生和学生信息

风机运行常见故障原因分析

风机运行时常见故障原因分析及处理 风机是一种将原动机的机械能转换为输送气体、给予气体能量的机械,按作用原理可分为:容积式、透平式。 容积式:回转式罗茨风机滑片式螺杆式 往复式活塞式隔膜式自由活塞式 透平式离心式轴流式混流式 实际运行中风机故障较多的是:轴承振动、轴承温度高、动叶卡涩、保护装置误动。 1 风机轴承振动超标 风机轴承振动是运行中常见的故障,风机的振动会引起轴承和叶片损坏、螺栓松动、机壳和风道损坏等故障,严重危及风机的安全运行。风机轴承振动超标的原因较多,如能针对不同的现象分析原因采取恰当的处理办法,往往能起到事半功倍的效果。 1.1 平衡破坏,叶片非工作面积灰引起风机振动 这类缺陷因为叶片的积灰不均匀导致叶轮质量分布不平衡,从而使风机振动增大。 在这种情况下,通常只需把叶片上的积灰铲除,叶轮又将重新达到平衡,从而减少 风机的振动。 1.2 磨损引起的振动 磨损是风机中最常见的现象,风机在运行中振动缓慢上升,一般是由于叶片磨损,平衡破坏后造成的。 1.3 动、静部分相碰或轴承间隙大,引起风机振动 在生产实际中引起动、静部分相碰的主要原因: (1)叶轮和进风口(集流器)不在同一轴线上。 (2)运行时间长后进风口损坏、变形。

(3)叶轮松动使叶轮晃动度大。 (4)轴与轴承松动。 (5)轴承损坏。 (6)主轴弯曲。 (7)联轴器对中或松动。 (8)基础或机座刚性不够 (9)原动机振动引起 引起风机振动的原因很多,有时是多方面的原因造成的结果。实际工作中应认真总结经验,多积累数据,掌握设备的状态,摸清设备劣化的规律,出现问题就能有的放矢地采取相应措施解决。 2 轴承温度高 风机轴承温度异常升高的原因有三类:润滑不良、冷却不够、轴承异常。离心式风机轴承置于风机外,若是由于轴承疲劳磨损出现脱皮、麻坑、间隙增大引起的温度升高,一般可以通过听轴承声音和测量振动等方法来判断,如是润滑不良、冷却不够的原因则是较容易判断的。而轴流风机的轴承集中于轴承箱内,置于进气室的下方,当发生轴承温度高时,由于风机在运行,很难判断是轴承有问题还是润滑、冷却的问题。实际工作中应先从以下几个方面解决问题。 (1)加油是否恰当。包括:油脂质量、加油周期、加油量、油脂中是否含杂质或水等,应当按照定期工作的要求给轴承加油。轴承加油后有时也会出现温度高的情况,主要是加油过多。这时现象为温度持续不断上升,到达某点后(一般在比正常运行温度高10℃~15℃左右)就会维持不变,然后会逐渐下降。 (2)冷却风机小,冷却风量不足。轴承如果没有有效的冷却,轴承温度会升高。比较简单同时又节约厂用电的解决方法是在轮毂侧轴承设置压缩空气、水冷却。当温度低时可以不开启压缩空气、水冷却,温度高时开启压缩空气、水冷却。 (3)确认不存在上述问题后再检查轴承。 3 旋转失速和喘振 喘振是由于风机处在不稳定的工作区运行出现流量、风压大幅度波动的现象。具有驼峰型特性的压缩机、风机和泵在运行过程中,当进气量低于某一定值,由于鼓风机产生的压力突然低于出口背压,致使后面管路的气体倒流,来弥补留流量的不足,恢复正常工况。把倒流的空气压出去,又使流量减少,压力再度突然下降,致使后面管路的气体又倒流回来。不断重复上述现象,机组及管路产生低频高振幅的压力脉动,并发出很大声响,机组产生剧烈振动。这时流量忽多忽少,一会儿向

一种界面需求分析的方法

软件界面是人与计算机之间的媒介。用户通过软件界面来与计算机进行信息交换。因此,软件界面的质量,直接关系到应用系统的性能能否充分发挥,能否使用户准确、高效、轻松、愉快地工作,所以软件的友好性、易用性对于软件系统至关重要。目前国内软件开发者在设计过程中很注重软件的开发技术及其具有的业务功能,而忽略了用户对软件界面的需求,影响软件的易用性、友好性;对界面设计的研究也集中在界面设计技术、设计手段上面。软件开发人员在设计时以经验为参考依据,缺乏对实际用户需求的了解。而软件的友好性、易用性同用户特征紧密相联,同样的软件界面,不同用户可能有绝然相反的评价。因此分析用户特征、了解用户需求和操作习惯,是开发软件界面的必有步骤,必须引起足够重视。 本文讨论了一种界面需求分析的方法,意在探讨研究如何完成针对系统所有用户的界面需求定义,从而开发为用户所接受的界面。讨论该方法的目的在于帮助设计人员快速明确用户的界面需求,让用户充分参与到界面需求分析中,从而在最终界面需求说明中体现用户的思想,满足用户要求。 2、界面需求分析过程 2.1界面元素 通常一个软件界面的元素包括界面主颜色、字体颜色、字体大小、界面布局、界面交互方式、界面功能分布、界面输入输出模式。其中,对用户工作效率有显著影响的元素包括:输入输出方式、交互方式、功能分布,在使用命令式交互方式的系统中,命令名称、参数也是界面元素的内容,如何设计命令及参数也很重要。影响用户对系统友好性评价的元素则有:颜色、字体大小、界面布局等,这种划分不是绝对的,软件界面作为一个整体,其中任何一个元素不符合用户习惯、不满足用户要求都将降低用户对软件系统的认可度,甚至影响用户的工作效率,而使用户最终放弃使用系统。围绕界面元素所要达到的设计目的是让最终用户能够获得美感、提高工作效率、易于操作使用系统。 目前在界面元素的选择、布局设计等方面的研究进行得较多,内容涵盖了人机工程学、认知心理学、、美学、色彩理论等方面的探讨。

金风直驱型风机与双馈型风机实际运行情况分析

金风直驱型风机与双馈型风机实际运行情况分析 金风直驱型机组自2007年投入市场以来,产品技术路线经历了市场的疑虑、选择、认可过程。从最初对直驱型风机优越性的理论性分析说明到目前实际的运行数据对比,充分证明了直驱型风机发电效率高、维护量少、备品备件消耗品用量少,寿命期内维护成本低,大部件寿命长的特点。以下内容是华能马力风电厂对该风电场金风GW1500kW机组与同风场1500kW双馈机组运行情况的对比分析。 1.调试及运行情况 从我厂调试及试运行情况来看,金风直驱型风机的故障率较低,且调试工作作业量较小,7个工作日共完成调试风机11台,在运行期间共出现过两次变流器功率模块故障,截止2009年6月20日可利用率指标为97%;双馈型风机因系统较为复杂,调试工作量大、周期长,运行期间多出现齿轮传动系统、润滑系统等故障,另外,因变桨系统装有电池(非电容放电),风机断电后,电池放电风机全顺桨刹车,恢复运行时需将电池充潢电后方可运行,因此恢复运行的时间较长,电量损失较大。 直驱风机与双馈风机日发电量实测对照表: 上表是两种机型均无故障情况下的发电量数据,从实际统计的发电量指标可以分析出,金风82型风机的发电功率曲线明显优于双馈型风机。 2.检修情况 双馈机型因机械传动系统部件较为复杂,单元(齿轮箱、散热器、油泵、油管路、冷却风扇、传感器、控制单元)较多,一但出现故障难于查找和处理,且工作量较大,废弃的油污处理不当时,对环境污染严重,有背于环保要求。 金风直驱型风机无齿轮箱,提高了机组的可靠性和可利用率,降低了机组的噪音。对比双馈机组,永磁发电技术避免了机组励磁装置和励磁损失,提高了整

用户界面设计实验-系统界面设计实例完整版.doc

用户界面设计实例 ● 设计的系统名称:个人日常事务管理系统 ● 针对用户群是:广大电脑用户(有一定的电脑操作基础),officer 和广大学 生。 一、系统需求分析(The system requirement ) 针对officer 和学生们的需求分析,从我自身分析:对于我日常的安排我平 时会用专门的记事本记录和更改,对于日常各种事务可能会冲突或不变携带,现在针对这些需求,设计出符合此人群适合的一款系统来帮助人们更好的安排日程和完成工作。此系统是要面向个人的,同企业系统相比,此软件要力求操作简单,效率要高效,由于针对的人群是officer 和大学生,这些人都是年轻的一代人,对计算机和系统都比较了解,而且倾向于华丽的界面,但是该系统同时要解决高效,较少的操作较快地达到用户的需求。由于工作原因或计算机系统崩溃等用户在本机保存的日程安排等数据可能丢失的情况,同时,有些情况下可能无法连接网络,此系统应支持 1.、本机数据保存。2、可以上传到服务器数据库,用户注册可获得免费的空间,用户注册后,只要登录就能在随时随地获得自己的日程安排等信息。 二、系统功能定义(The function definitions ) 个人日程管理系统主要是提供个人时间日程安排系统软件,它具有相当方便的操作接口,让用户能够对所安排的行程一目了然,除去主要功能还附带了更多功能和小工具,安排的行程可以生成通行路线,并会根据天气预报提醒当天安排是否影响。而且用户可以注册,注册后用户有更多的服务,安排的日程数据可以保存到本地同时可以更新到服务器,这样用户就算到外地也可以随时查看自己的日程安排,同时其他功能有:时钟提醒、通讯录、效率评估等。 实现功能(主界面导航): 个人日常事 务管理系统

软件工程用户界面设计报告.doc

目录0. 文档介绍 4 文档目的4 文档范围4 读者对象4 参考文献4 术语与缩写解释4 1. 应当遵循的界面设计规范 5 ; 2. 界面的关系图和工作流程图5 3. 主界面5 4. 子界面A 5 5. 子界面B 5 6. 美学设计 6 7. 界面资源设计6 8. 其他6

文档介绍 , 文档目的 界面设计是为了满足软件专业化标准化的需求而产生的对软件的使用界面进行美化优化规范化的设计分支。界面设计文档可以让用户对软件产品有了更直观的了解,并且了解各个模块的设计及用意。 文档范围 文档包括公用界面设计,学生用户界面设计,教师用户界面设计,其中各个界面包括框架设计,编程设计,按钮设计,面板设计,菜单设计,标签设计,图标设计,滚动条及状态栏设计。 读者对象 登陆网站的游客、注册成会员的学生、教师以及管理员。 参考文献 提示:列出本文档的所有参考文献(可以是非正式出版物),格式如下: ¥ [1] 张海藩,《软件工程导论(第5版)》,清华大学出版社,1900年01月 [2] 杨培添,《软件界面设计》,电子工业出版社,2007年02月 [3] 林锐,《Web软件用户界面设计指南》,电子工业出版社,2005年5月 [4]吴士力,汪孝宜,胡俦,《网络系统开发实例精粹(JSP版)》,电子工业出版社, 2006年8月 [5] 黄艳群,黎旭,李荣丽,《设计·人机界面》,北京理工大学出版社,2007年5月 术语与缩写解释 %

1. 应当遵循的界面设计规范 软件界面的设计,既要从外观上进行创意以到达吸引眼球的目的,还要结合图形和版面设计的相关原理,从而使得软件设计变成了一门独特的艺术。软件用户界面的设计应遵循以下几个基本原则: 用户导向原则: 明确到底谁是使用者,要站在用户的观点和立场上来考虑设计软件。要作到这一点,必须要和用户来沟通,了解他们的需求、目标、期望和偏好等。网页的设计者要清楚,用户之间差别很大,他们的能力各有不同。比如有的用户可能会在视觉方面有欠缺(如色盲),对很多的颜色分辨不清;有的用户的听觉也会有障碍,对于软件的语音提示反映迟钝;而且相当一部分用户的计算机使用经验很初级,对于复杂一点的操作会感觉到很费力。另外,用户使用的计算机机器配置也是千差万别,包括显卡、声卡、内存、网速、操作系统以及浏览器等都会有不同。设计者如果忽视了这些差别,设计出的网页在不同的机器上显示就会造成混乱。 … KISS原则: KISS原则就是"Keep It Simple And Stupid"的缩写,简洁和易于操作是网页设计的最重要的原则。毕竟,软件建设出来是用于普通网民来查阅信息和使用网络服务。没有必要在网页上设置过多的操作,堆集上很多复杂和花哨的图片。该原则一般的要求,网页的下载不要超过10秒钟(普通的拨号用户56 Kbps网速);尽量使用文本链接,而减少大幅图片和动画的使用;操作设计尽量简单,并且有明确的操作提示;软件所有的内容和服务都在显眼处向用户予以说明等。 布局控制: 关于网页排版布局方面,很多网页设计者重视不够,网页排版设计的过于死板,甚至照抄他人。如果网页的布局凌乱,仅仅把大量的信息堆集在页面上,会干扰浏览者的阅读。一般在网页设计上所要遵循的原理有: Miller公式。根据心理学家George 的研究表明,人一次性接受的信息量在7个比 特左右为宜。总结一个公式为:一个人一次所接受的信息量为7±2 比特。这一原 理被广泛应用于软件建设中,一般网页上面的栏目选择最佳在5~9个之间,如果 软件所提供给浏览者选择的内容链接超过这个区间,人在心理上就会烦躁,压抑, 会让人感觉到信息太密集,看不过来,很累。例如的栏目设置:Main、MyAol、 Mail、People、Search、Shop、Channels和Devices共八个分类。的栏目设置:MSN Home、My MSN、Hotmail、Search、Shopping、Money和People & Chat共七项。 然而很多国内的软件在栏目的设置远远超出这个区间。 (2)分组处理。上面提到,对于信息的分类,不能超过9个栏目。但如果你的内容实在是多,超出了9个,需要进行分组处理。如果,你的网页上提供几十篇文章的链接,需要每隔7篇加一个空行或平行线做以分组。如果你的软件内容栏目超出9个,如微软公司的软件,共有11个栏目,超过了9个。为了不破坏Miller公式,在设计时使用蓝黑两种颜色分开,具体可以访问视觉平衡: 网页设计时,也要各种元素(如图形、文字、空白)都会有视觉作用。根据视觉原理,图形与一块文字相比较,图形的视觉作用要大一些。所以,为了达到

2017年7月风机运行分析报告

2017年7月风机运行分析报告 (2017年06月26日-2017年07月25日) (苏扬) 一、概述 大面山一期风电场已投运23台单机2MW的东汽FD116A弱风型风力发电机组,装机总容量46MW。截止2017年06月25日24时年累计发电量为5405.288万kWh。 大面山二期风电场已投运46台单机2MW的东汽FD116A弱风型风力发电机组,装机总容量92MW。截止2017年06月25日24时年累计发电量为5275.268万kWh。 二、单机发电量分析 1.单机发电量分类 发电量A类风机(20万及以上)5台:二期:#24、#25、#26、#27、#28。 发电量B类风机(20万以下15万及以上)5台:二期:#18、#19、#21、#22、#23。 发电量C类风机(15万以下)36台:一期:#1、#2、#3、#4、#5、#6、#7、#8、#9、#10、#11、#12、#13、#14、#15、#16、#17、#18、#19、#20、#21、#22、#23;二期:#3、#4、#5、#6、#7、#8、#9、#10、#11、#12、#39、#40、#41、#42、#43、#44、#45、#46、#47、#48、#49、#50、#29、#30、#31、#32、#33、#34、#35、#14、#16、#17、#20、#36、#37、#38。 最大发电量#24-#2301风机23.1301万kWh,最小发电量#17-#1309风机4.9606万kWh;发电小时数最高#18-#2405风机423.94h,发电小时数最低#17-#1309风机123.1h;平均风速最高#47-#2209风机3.85m/s,平均风速

软件项目需求分析通用模板

1. 引言 1.1 目的 说明编写这份报告的目的,指出预期的读者。 1.2 背景 指出待开发的软件系统的名称;行业情况;本项目的任务提出者、开发者、用户;该软件系统同其他系统或其他机构的基本的相互来往关系。 1.3 参考资料 列出编写本报告时参考的文件(如经核准的计划任务书或合同、上级机关的批文等)、资料、技术标准,以及他们的作者、标题、编号、发布日期和出版单位。 列出编写本报告时查阅的Intenet上杂志、专业著作、技术标准以及他们的网址。 1.4 术语 列出本报告中用到的专门术语的定义。

2.任务概述 2.1目标 叙述该项软件开发的意图、应用目标、作用范围以及其他应向读者说明的有关该软件开发的背景材料。解释被开发软件与其他有关软件之间的关系。如果本软件产品是一项独立的软件,而且全部内容自含,则说明这一点。如果所定义的产品是一个更大的系统的一个组成部分,则应说明本产品与该系统中的其他各组成部分之间的关系,为此可使用一张方框图来说明该系统的组成和本产品同其他各部分的联系和接口。 2.2系统(或用户)的特点 如果是产品开发,应列出本软件的特点,与老版本软件(如果有的话)的不同之处,与市场上同类软件(如果有的话)的比较。说明本软件预期使用频度; 如果是针对合同开发,则应列出本软件的最终用户的特点,充分说明操作人员、维护人员的教育水平和技术专长,以及本软件预期使用频度。这些是软件设计工作的重要约束。3.假定和约束 列出进行本软件开发工作的假定和约束,例如经费限制、开发期限等。 4.需求规定 4.1软件功能说明 逐项定量和定性地叙述对系统所提出的功能要求,说明输入什么量、经怎样的处理、得到什么输出,说明产品的容量,包括系统应支持的终端数和应支持的并行操作的用户数等指标。 4.2对功能的一般性规定

UI界面设计的需求分析方法

UI界面设计的需求分析方法 1、引言 软件界面是人与计算机之间的媒介。用户通过软件界面来与计算机进行信息交换。因此,软件界面的质量,直接关系到应用系统的性能能否充分发挥,能否使用户准确、高效、轻松、愉快地工作,所以软件的友好性、易用性对于软件系统至关重要。目前国内软件开发者在设计过程中很注重软件的开发技术及其具有的业务功能,而忽略了用户对软件界面的需求,影响软件的易用性、友好性;对界面设计的研究也集中在界面设计技术、设计手段上面。软件开发人员在设计时以经验为参考依据,缺乏对实际用户需求的了解。而软件的友好性、易用性同用户特征紧密相联,同样的软件界面,不同用户可能有绝然相反的评价。因此分析用户特征、了解用户需求和操作习惯,是开发软件界面的必有步骤,必须引起足够重视。 本文讨论了一种界面需求分析的方法,意在探讨研究如何完成针对系统所有用户的界面需求定义,从而开发为用户所接受的界面。讨论该方法的目的在于帮助设计人员快速明确用户的界面需求,让用户充分参与到界面需求分析中,从而在最终界面需求说明中体现用户的思想,满足用户要求。 2、界面需求分析过程 2.1界面元素 通常一个软件界面的元素包括界面主颜色、字体颜色、字体大小、界面布局、界面交互方式、界面功能分布、界面输入输出模式。其中,对用户工作效率有显著影响的元素包括:输入输出方式、交互方式、功能分布,在使用命令式交互方式的系统中,命令名称、参数也是界面元素的内容,如何设计命令及参数也很重要。影响用户对系统友好性评价的元素则有:颜色、字体大小、界面布局等,这种划分不是绝对的,软件界面作为一个整体,其中任何一个元素不符合用户习惯、不满足用户要求都将降低用户对软件系统的认可度,甚至影响用户

风机运行维护相当有指导意义

随着科技的进步,风电事业的不断发展, 风机也由原来的引进进口设备,发展到了如今自己设计、生产的国产化风机。伴随着风机种类和数量的增加,新机组的不断投运,旧机组的不断老化,风机的日常运行维护也是越来越重要。现在就风机的运行维护作一下探讨。 一运行 风力发电机组的控制系统是采用工业微处理器进行控制,一般都由多个CPU并列运行,其自身的抗干扰能力强,并且通过通信线路与计算机相连,可进行远程控制,这大大降低了运行的工作量。所以风机的运行工作就是进行远程故障排除和运行数据统计分析及故障原因分析。 1 远程故障排除 风机的大部分故障都可以进行远程复位控制和自动复位控制。风机的运行和电网质量好坏是息息相关的,为了进行双向保护,风机设置了多重保护故障,如电网电压高、低,电网频率高、低等,这些故障是可自动复位的。由于风能的不可控制性,所以过风速的极限值也可自动复位。还有温度的限定值也可自动复位,如发电机温度高,齿轮箱温度高、低,环境温度低等。风机的过负荷故障也是可自动复位的。 除了自动复位的故障以外,其它可远程复位控制故障引起的原因有以下几种: (1)风机控制器误报故障; (2)各检测传感器误动作; (3)控制器认为风机运行不可靠。 2.运行数据统计分析 对风电场设备在运行中发生的情况进行详细的统计分析是风电场管理的一项重要内容。通过运行数据的统计分析,可对运行维护工作进行考核量化,也可对风电场的设计,风资源的评

估,设备选型提供有效的理论依据。 每个月的发电量统计报表,是运行工作的重要内容之一,其真实可靠性直接和经济效益挂钩。其主要内容有:风机的月发电量,场用电量,风机的设备正常工作时间,故障时间,标准利用小时,电网停电,故障时间等。 风机的功率曲线数据统计与分析,可对风机在提高出力和提高风能利用率上提供实践依据。例如,在对国产化风机的功率曲线分析后,我们对后三台风机的安装角进行了调节,降低了高风速区的出力,提高了低风速区的利用率,减少了过发故障和发电机温度过高故障,提高了设备的可利用率。通过对风况数据的统计和分析,我们掌握了各型风机随季节变化的出力规律,并以此可制定合理的定期维护工作时间表,以减少风资源的浪费。 3.故障原因分析 我们通过对风机各种故障深入的分析,可以减少排除故障的时间或防止多发性故障的发生次数,减少停机时间,提高设备完好率和可利用率。如对150kW风机偏航电机过负荷这一故障的分析,我们得知有以下多种原因导致该故障的发生,首先机械上有电机输出轴及键块磨损导致过负荷,偏航滑靴间隙的变化引起过负荷,偏航大齿盘断齿发生偏航电机过负荷,在电气上引起过负荷的原因有软偏模块损坏,软偏触发板损坏,偏航接触器损坏,偏航电磁刹车工作不正常等。又如,在对Jacobs系列风机控制电压消失故障分析中,我们采用排除实验法,将安全链当中有可能引起该故障的测量信号元件用信号继电器和短接线进行电路改造,最终将故障原因定位在过速压力开关的整定上,将该故障的发生次数减少,提高了设备使用率,减少了闸垫的更换次数,降低了运行成本。 二.维护 风力发电机是集电气、机械、空气动力学等各学科于一体的综合产品,各部分紧密联系,息

设计师必备的五种数据分析UI设计

学IT技能上我学院网https://www.doczj.com/doc/f7316590.html, 设计师必备的五种数据分析UI设计 数据分析在UI设计中运用非常多,且在大数据的前景下,数据分析的地位也非常高,UI设计中过多运用视觉设计技巧,往往忽视了用户体验,很大程度上只是在欣赏数据分析的视觉冲击,但却不懂分析的内容,这是致命的,也不是数据分析设计的初衷,那么如何做到让数据分析设计更易看懂,更加人性化,不仅能够做到美观,而且还能够很轻易的表达出意义来呢,我们来探讨这个问题。 本文会教你如何设计出极具美感的数据分析界面,且达到数据分析的效果,加强交互设计,让用户轻易获取数据信息。 一、数据可视化分析 1、原始数据分析 有时客户并不完全了解自己的数据,人员更替,平台迁移,数据遗失,没有专门的负责人去进行数据的管理和维护,都会造成数据的资源浪费。虽然随着时间过去,越早的数据价值越小,但是有人(我)说过,不能坦然面对过去的人,也无法面对将来。所以,先从整理过去开始吧。

学IT技能上我学院网https://www.doczj.com/doc/f7316590.html, 2、营销数据分析 营销数据的重要性就不用赘述,既要多纬度多,又要分析深刻结论明了。最好又美观又能方便导出,还可以通过邮箱分享或者嵌入网页。

学IT技能上我学院网https://www.doczj.com/doc/f7316590.html, 3、业务场景数据分析 能把已有业务场景数据可视化是比较个性化的需求了,但是一旦实现出来,某种程度来说还是能增加工作效率。

学IT技能上我学院网https://www.doczj.com/doc/f7316590.html, 4、地理位置数据分析 一般的LBS场景是,将业务数据放置于地图中,用户可以获取可视化的数据分析,并能自行上传位置数据。但是现在也有结合物联网需求的可视化地理位置分析,是不是更有实感?看见我的快递努力的在朝我的方向移动,突然有点感动是怎么回事。 5、用户画像 当我真的被准确的定位成女屌丝的那一刻,我发现,我不太喜欢这个功能。所以并不面向用户本身的话,可能还不错。让商家去具象的了解用户的信息,做出判断和营销。

软件工程之软件设计方法

软件工程之软件设计方法 简介 您是如何开始一个新工程的?是不是跳到计算机前,打开您喜爱的RAD工具开始输入代码?有没有想过程序会执行些什么或者系统是如何操纵数据的?有没有想过要记下些东西来帮助提醒您或阐明您已经开发的代码的逻辑实现?如果您对第一个问题答"不",而其他问题答"是"的话,您可以跳过这篇文档。否则的话,请好好读读这篇文章。您应该有个计划、蓝图,并且在手边有个对您的问题解决方案的简明安排。"您必须知道您要去哪儿得到一切!"让我们来看看开发一个能实现您所设计的功能的程序时,什么最棘手。 (软件)设计是什么? E.S. Taylor给设计下的定义是: "…the process of applying various techniques and principles for the purpose of defining a device, a process or a system in sufficient detail to permit its physical realization. " "…应用各种各样的技术和原理,并用它们足够详细的定义一个设备、一个程序或系统的物理实现的过程。" 对任意的工程产品或系统,开发阶段绝对的第一步是确定将来所要构建的制造原型或实体表现的目标构思。这个步骤是由多方面的直觉与判断力来共同决定的。这些方面包括构建类似模型的经验、一组引领模型发展的原则、一套启动质量评价的标准、以及重复修改直至设计最后定型的过程本身。计算机软件设计与其他工程学科相比还处在幼年时期,仍在不断变化中,例如更新的方法、更好的算法分析、以及理解力的显著进化。软件设计的方法论的出现也只有三十年多一点,仍然缺乏深度、适应性和定量性质,通常更多的与经典工程设计学科相联系。尽管如此,现今的软件技术已经存在、设计质量的标准也可使用、设计符号亦可以应用。带着这些意见,我们一起来看看什么有助于程序员们找到他们的软件涅盘(天堂的意思)。 (软件)设计过程 软件的设计是一个将需求转变为软件陈述(表达)的过程。这种陈述给我们一个对软件的全局观点。系统通过逐步求精使得设计陈述逐渐接近源代码。这里有两个基本步骤;第一步是初步设计Preliminary design ,关注于如何将需求转换成数据和软件框架。第二步是详细设计Detail design ,关注于将框架逐步求精细化为具体的数据结构和软件的算法表达。发生中的设计行为、数据、算法和程序设计都需要由现代程序所需的界面设计这一清晰的行为来结合起来。界面设计Interface design 建立程序布局和人机交互机制。贯穿设计过程的质量由一系列的正式技术评定formal technical reviews 或设计排演design walkthroughs 来评价。良好的设计规范必须建立在对设计陈述(表达)的评估之上,以下是一些指导方针: 1. 设计应该展现层次结构使得软件各部分之间的控制更明智。 2. 设计应当模块化;这就是说,软件应在逻辑上分割为实现特定的功能和子功能的部分。 3. 设计应当由清晰且可分离的数据和过程表达来构成。 4. 设计应使得模块展现独立的功能特性。 5. 设计应使得界面能降低模块之间及其与外部环境的连接复杂性。 6. 设计应源自于软件需求分析期间获得的信息所定之可重复方法的使用。 要拥有良好的设计特征不是靠碰运气,而在设计过程中通过综合运用基础设计原理、系统方法论、彻底的评定回顾可以有助于良好的设计。软件设计方法每天都在进化,作为已经经过

软件开发中的需求分析

软件开发中的需求分析 在软件开发项目中,需求分析是关乎软件项目开发成败的重要因素。现在的软件项目中返工开销占了总开销很大比例,而导致返工的主要原因是需求分析不明确。针对这一情况,文章阐述了软件开发中需求分析任务、需求分析过程、需求分析方法、需求分析变更问题,以及如何确保需求分析质量的措施。 随着全球经济、科技的快速发展和社会信息化进程的加快,计算机被广泛应用于各行业中,各种应用软件应运而生,各行业的管理或生产日趋专一化、数字化、快捷化。从而用户对计算机软件的要求更加复杂和严格。软件需求分析正是解决用户这种需求,软件需求分析是关乎软件项目开发成败的重要因素。有资料表明,现在的软件项目中返工开销几乎占了总开发的一半,而导致返工的主要原因是需求分析不明确,甚至有些人不知道需求分析是什么,从而引发项目开发中的一系列更改。这些更改可能导致浪费大量资源、软件项目无法按时完成等严重问题。所以,需求分析是软件设计和实现的基础,是软件项目迈向成功的第一步! 一、软件需求分析的任务 一个软件项目的开发主要分为五个阶段:需求分析阶段、设计阶段、编码阶段、测试阶段和维护阶段。而需求分析阶段所得到的结果,是软件项目开发中其他四个阶段的必备条件。从以往的经验来看,需求分析中的一个小的偏差,就可能导致整个项目无法达到预期的效果,或者说最终开发出的产品不是用户所需要的。何谓软件需求分析。先举个例子来说明,对于建造房子这个问题相信大多数人都知道,用户要建一幢房子,建房者一定会与用户详细讨论各种细节,楼层高多少?构架如何?图纸样式等等,每个环节都有详细的过程文档,双方都明白假如完工后修改带来的损失以及变更细节的危害性。同样在软件需求分析中也需要有详细的文档,软件开发者要从用户的业务中提取出软件系统能够帮助用户解决的业务问题,通过对用户业务问题的分析,规划出开发者的软件产品。这个步骤是对用户业务需求的一个升华,是一个把用户业务管理流程优化,转化为软件产品,从而提升管理而实现质的飞跃,这一步是否成功,直接关系到开发出来的软件产品能否得到用户认可,顺利交付给客户,客户能否真正运用开发者的产品帮助他解决业务或管理问题。 软件需求分析的任务不是确定系统怎样完成的工作,而是确定系统必须完成那些工作,也就是对目标系统提出完整、准确、清晰、具体的要求。它所做的工作是深入描述软件的功能和性能,确定软件设计的限制和软件同其他系统的接口细节,定义软件的其他有效性要求。转自项目管理者联盟 软件需求分析的任务就是借助于当前系统的逻辑模型导出目标系统的逻辑模型,解决目标系统的“做什么”的问题。其实现步骤是:(1)获得当前系统的物理模型;(2)抽象出当前系统的逻辑模型;(3)建立目标系统的逻辑模型。如图1所示:

相关主题
文本预览
相关文档 最新文档