当前位置: 首页 > 编程日记 > 正文

GPS部标平台的架构设计(十)-基于Asp.NET MVC构建GPS部标平台

在当前很多的GPS平台当中,有很多是基于asp.NET+siverlight开发的遗留项目,代码混乱而又难以维护,各种耦合和关联,要命的是界面也没见到比Javascript做的控件有多好看,随着需求的增多,平台已经臃肿不堪。

设计基于.NET的GPS部标平台,我们坚定不移的选择了基于JQUERY+Asp.NET MVC来作为前端交互和后台处理的框架。选用一个灵活的脚手架,同时团队又能掌握这个脚手架为团队所用。

对于一个web应用项目,基于MVC的框架,前面文章提到过,最大的优点就是结构清晰,强制性的将繁乱的页面,请求,后台处理逻辑,划分成MVC三层结构,一层一层的做开发,一层一层的维护,同时层也不多,适可而止。通过MVC,高手和低手,在开发的初期基本上站在一个起跑线上,这个我认为很重要,特别是团队开发和维护,团队中的人开发水平各不一样,对于架构设计这种抽象到家的技术,理解也各不一样,每次项目启动的时候,都有各种各样的争论,都觉得自己是架构师,这是很要命的,很多人认为设计可以让开发效率更高,代码更容易扩展,后期更容易维护,性能更好更稳定,更易用。但糅合各种意见、评审、讨论、妥协的设计无一例外最终却走向反面。

很多人都是从asp.net web form过来的,对这个很不以为然,其实正是这种温吞水煮青蛙的开发技术,造成了部分人员留下了惨痛的后遗症,主要表现在:

1.首先就是学习能力差,其实也不是没学习能力,主要是看见新东西没兴趣,没动力,这个要命的缺点造成了后面的缺点

2.大量依赖于服务器端控件,对于前端的javascript以及js框架,css+div布局等技术,掌握很少,造成前端开发效率低下,出一点问题就调试老半天。技术太单一,在职场上可以说没有竞争力和吸引力。

3.写代码时,各种随意,有的不分层,各种逻辑都一股脑揉进UI,有的分层,但往往受PetStore的毒害,搞了很多层,画虎不成反类犬,为了重用,一层套一层,连环调用,看代码,需要运行打断点,一层一层往下看,就像进入十八层地狱,最后终于到底看到了SQL。代码中特别喜欢直接写SQL,各种insert,select满天飞,各种ifelse,各种重复,这些项目中代码量最大的地方,往往就在这个地方,而这个地方是最没技术含量的。

很多开发者经历过各种苦难,都想在下一次开发中不要这样,但如果出于对未来变数的恐惧而总是追求各种莫须有以后也从未发生过的扩展,在项目的初期就臆想各种高性能,高批量,大规模,因为抽象而引入各种抽象,因为架构设计就设计一个复杂的架构。那么开发者的宿命就是不断的轮回。

对于一个GPS的Web平台,设计的重心就是要回归到结构清晰,先谈结构,再谈架构,结构是扁平化,清晰化,一堆乱如麻的东西我们的目标就是消除臃肿,归类,分清楚,需用用的时候找得到,简洁化;架构是立体化,也是复杂化,多个子系统,多个接口,多个服务,多种面向服务的调用。

我们在设计的时候,总是先在文档中牛掰的写到设计原则与目标,但是往后面看,发现我们设计和开发的东西和我们写的原则没有一点毛关系。所以要想设计好,就要想清楚你得设计原则是不是有利于你的设计目标,你做的东西是不是奔着你设计的目标去了。

我们的设计原则就是追求结构清晰,说白了就是追求单一职责原则的最大化,无论前端还是后台。一个萝卜一个坑,一个萝卜坑里面就是一个萝卜,不能里面放一颗白菜。

1.MVC,三层够用,再多打屁屁。

2.追求命名具体而规范,特别是前端。看到命名,能知道功能,最好就像仓库的标签。看到名字,就知道是干什么的,在哪里放着,也知道应该在哪里放。

3.减少抽象, C#和java放弃了c++的多重继承,就是因为复杂度的增加,得不偿失。你要理解这个,多重接口你也不愿意用,看者都晕。我在看Ibatis的源码的时候,一个类后面继承了五六个接口,看到一个接口定义的变量后,如果不打上断点,都找不到实现类在哪里。很多代码都是如此,等项目结束了,回头看,好听点就是层层调用,通俗地说就是大方法里套小方法,小方法里调邻居方法,调的多了,复杂度就上来了,一个方法多个地方调用、重写(override),等你想修改的时候,影响一大片。

4.追求单一职责,一个功能,或者逻辑紧密相关的功能,归结到一个类中。单一职责原则中对职责的理解各不一样,同时也可大可小,小到一个功能点,大到一个功能模块,子系统。这也是要求我们要把这个原则从小到大,从底向上,从前到后,贯穿始终。单一职责原则和命名规范结合一起,有利于维护结构的清晰。比如你看到GPS平台的车辆树菜单,想进入到js代码中调试,由于我们把关于车辆树的代码都写入到一个独立的vehicleTree.js中,那就直接找到了。看到前端代码后,我们想看看后端是怎么是怎么处理ajax 请求的,由于是采用MVC框架,处理前端请求的都是编写对应的controller类,我们命名是VehicelTreeController.cs文件,这样我们也快速的定位到代码,也明白了从前到后的调用路径和结构。同时这个里面的代码就是写的再乱,也不会传染给其他代码,所谓的传染就是一段复杂难理解、难调试、难维护的代码,不会造成其他文件或功能的代码难以理解、调试和维护。

5.减少装逼。在项目的前期,各种装逼,什么需求分析,概念设计,架构设计,UML等等时间杀手,装逼的成本高昂,代价惨重。我们追求的结构就是扁平化,不需要你装逼,整各种傻逼UML图,也不需要你写各种自己都不会去看的文档。一个excel就够了。

功能描述js类controller类service类
车辆树vehicleTree.js
主菜单mainMenu.js

当然一个复杂的部标平台,不仅仅是web,还要部标808和809GPS服务器等,各个子系统之间也需要互联互通,压力最大的在于GPS服务器, 参见我前面的文章:

GPS部标监控平台的架构设计(八)-基于WCF的平台数据通信设计

部标808协议模拟终端的设计和开发

1)808GPS服务器,采用交通部的部标808协议,负责与终端的数据接收、指令下发; 参见:基于部标JT/T 808协议及数据格式的GPS服务器

2)809转发服务器,采用交通部的部标809协议,作为企业下级平台,负责转发GPS数据到政府平台的服务器;参见:基于JT/T809-2011的(已过检)GPS平台数据交换及转发服务器

最后的工程:

如需购买GPS平台源码+文档+服务,可以联系我2379423771@qq.com。

转载于:https://www.cnblogs.com/productivity/p/4405600.html

相关文章:

关于CSDN不给任何通知强制关闭我的6年博客,我深表痛心

关于CSDN不给任何通知强制关闭我的6年博客,我深表痛心。最近有很长一段时间没有去csdn博客了, 前几天去看的时候发现博客被封闭了。 我联系了管理员,但是没有得到任何回复。 我猜想,可能是不是我在博客文章里面加入 自己网站的网…

Vue 环境搭建(win10)

1.安装node node官网安装地址 推荐安装稳定版本(LTS)以及安装路径为系统盘(C) 查看node安装成功否 注释:以下命令使用 命令提示符(管理员)权限,win10 对user权限的限制了访问权限。node -v 查看…

Java项目:化妆品商城系统(java+Springboot+ssm+mysql+jsp+maven)

源码获取:博客首页 "资源" 里下载! 一、项目简述 本系统主要实现的功能有: 网上商城系统,前台后台管理,用户注册,登录,上架展示,分组展示,搜索,收…

python 绘图脚本系列简单记录

简单记录平时画图用到的python 便捷小脚本 1. 从单个文件输入 绘制坐标系图 #!/usr/bin/python # coding: utf-8 import matplotlib.pyplot as plt import numpy as np import matplotlib as mpl import sysfile_name1 sys.argv[1] data_title sys.argv[2] print(file_name1…

iOS-c语言小练习01

// // main.c // C&#xff0d;变量的地址 // // Created by cgq on 15/4/9. // Copyright (c) 2015年 cgq. All rights reserved. // #include <stdio.h> //访问变量的地址 void test1() { char a A; int b 44; printf("a的值&#xff1a;%d\n",a); pri…

蓝桥杯 【基础练习】 十六进制转八进制

问题描述给定n个十六进制正整数&#xff0c;输出它们对应的八进制数。输入格式输入的第一行为一个正整数n &#xff08;1<n<10&#xff09;。接下来n行&#xff0c;每行一个由0~9、大写字母A~F组成的字符串&#xff0c;表示要转换的十六进制正整数&#xff0c;每个十六进…

泛在网:泛在网

ylbtech-泛在网&#xff1a;泛在网泛在网络来源于拉丁语Ubiquitous&#xff0c;从字面上看就是广泛存在的&#xff0c;无所不在的网络。也就是人置身于无所不在的网络之中&#xff0c;实现人在任何时间、地点&#xff0c;使用任何网络与任何人与物的信息交换&#xff0c;基于个…

Mac 从Makefile 编译 Rocksdb 源码的一些注意事项

文章目录前言Makefile 编译流程1. 平台变量/环境变量的初始化。2. 编译需要的源码文件变量初始化。3. include 目录的设置。4. 编译的执行逻辑。问题记录1&#xff1a;可能的打包命令ar 失效问题5. 执行具体的编译指令问题记录2: jar 包编译前言 最近在Mac 本地编译Rocksdb 过…

Java项目:在线考试系统(单选,多选,判断,填空,简答题)(java+Springboot+ssm+mysql+html+maven)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 功能&#xff1a; 学生信息 班级 专业 学号 姓名 在线考试 成绩查询 个人信息 密码修改 教师管理 教师编号 姓名 所教科目 题库管理 单选题 多选题 填空题 判断题&#xff0c;简答题&#xff08;人工…

看了极光推送技术原理的几点思考

看了极光推送技术原理的几点思考 分类&#xff1a; android2012-11-26 20:50 16586人阅读 评论(18) 收藏 举报目录(?)[] 移动互联网应用现状 因为手机平台本身、电量、网络流量的限制&#xff0c;移动互联网应用在设计上跟传统 PC 上的应用很大不一样&#xff0c;需要根据手机…

查询远程或本地计算机的登录账户

用下面这个函数能获取远程或本地电脑的当前登录用户&#xff0c;同时附加了它的计算机名&#xff0c;所以当你查询多台电脑时将知道结果从哪里来。function Get-LoggedOnUser {param([String[]]$ComputerName $env:COMPUTERNAME)$ComputerName | ForEach-Object {(quser /SERV…

LIS ZOJ - 4028

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode4028 memset超时 这题竟然是一个差分约束 好吧呢 对于每一个a[i], l < a[i] < r 那么设一个源点s 使 l < a[i] - s < r 是不是就能建边了 然后对于每一个f[i] 如果前面有一个相等的f[j] 则肯定 a[i…

存储引擎 K/V 分离下的index回写问题

前言 近期在做on nvme hash引擎相关的事情&#xff0c;对于非全序的数据集的存储需求&#xff0c;相比于我们传统的LSM或者B-tree的数据结构来说 能够减少很多维护全序上的计算/存储资源。当然我们要保证hash场景下的高写入能力&#xff0c;append-only 还是比较友好的选择。 …

经典贪心法:时间序列问题及其全局最优性证明

贪心算法是指在对问题求解时&#xff0c;总做出在当前看来是最好的选择。也就是说&#xff0c;不从整体上加以考虑&#xff0c;它所作出的仅仅是在某种意义上的局部最优解。一旦贪心算法求出了一个可行解&#xff0c;就要确定这个算法是否找到了最优解。为此&#xff0c;要么证…

Java项目:在线水果商城系统(java+JSP+Spring+SpringMVC +MyBatis+html+mysql)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 一、项目简述 功能&#xff1a; 区分为管理员用户和普通用户&#xff0c;普通用户&#xff1a;用户注册登录&#xff0c;首页水果展示&#xff0c;商品分类展示&#xff0c;购物车添加&#xff0c;下单&…

曲苑杂坛--收缩数据库文件

很多人在删除大量数据后收缩数据库&#xff0c;却发现没法收缩到预期效果。 由于使用DBCC SHRINKFILE来收缩数据文件时&#xff0c;是针对数据区来收缩&#xff0c;因此可以先使用DBCC SHOWFILESTATS来查看文件中未使用的分区数(TotalExtents-UsedExtents)&#xff0c;如果删除…

python字典去重

今天实习的web大表哥说帮我看环境不过前提是要我帮他写个python合并列表的demo,大概思路就是利用zip库进行keys和values的遍历&#xff0c;然后在输出就行key1{name1:小明,name2:小红} key2{小明:[men,20],小红:[women,30]} for k,v in zip(key1.values(),key1.keys()):for i, …

关于 线程模型中经常使用的 __sync_fetch_and_add 原子操作的性能

最近从 kvell 这篇论文中看到一些单机存储引擎的优秀设计&#xff0c;底层存储硬件性能在不远的未来可能不再是主要的性能瓶颈&#xff0c;反而高并发下的CPU可能是软件性能的主要限制。像BPS/AEP/Optane-SSD 等Intel 推出的硬件存储栈已经能够在延时上接近DRAM的量级&#xff…

R 语言爬虫 之 cnblog博文爬取

Cnbolg Crawl a). 加载用到的R包 ##library packages needed in this case library(proto) library(gsubfn) ## Warning in doTryCatch(return(expr), name, parentenv, handler): 无法载入共享目标对象‘/Library/Frameworks/R.framework/Resources/modules//R_X11.so’&#…

Java项目:宿舍管理系统(java+jsp+SSM+Spring+mysql)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 一、项目简述 功能&#xff1a;包括学生管理&#xff0c;班级管理&#xff0c;宿舍管理&#xff0c;人员信息维 护。维修登记&#xff0c;卫生管理&#xff0c;访客管理等等。 二、项目运行 环境配置&am…

项目管理5大过程组,42个过程一句话讲解

2019独角兽企业重金招聘Python工程师标准>>> 启动过程组&#xff1a;&#xff08;1&#xff09;制定项目章程&#xff1a;诞生项目&#xff0c;并为项目经理“正名”&#xff1b;&#xff08;2&#xff09;识别干系人&#xff1a;搞清楚谁与项目相关&#xff1b;规划…

Android Q 变更和新特性

安全和隐私变更 隐私保护是Android Q重要的主题之一&#xff0c;Android Q带来了一系列增强用户隐私保护的变更。 1 应用文件存储空间限制 应用访问限制是Android Q影响最大变更之一。在Android Q系统中&#xff0c;应用只可以通过路径读取自己应用沙箱内的文件&#xff0c;如果…

KVell 单机k/v引擎:用最少的CPU 来调度Nvme的极致性能

文章目录前言KVell背景业界引擎使用Nvme的问题CPU 会是 LSM-kv 存储的瓶颈CPU 也会是 Btree-kv 存储的瓶颈KVell 设计亮点 及 总体架构实现KVell 设计亮点1. Share nothing2. Do not sorted on disk, but keep indexes in memory3. Aim for fewer syscalls , not for sequentia…

android录像增加时间记录(源码里修改)

需要做一个功能&#xff0c;录像和播放时都显示录时的时间&#xff0c;参考文章链接找不到了&#xff0c;不好意思&#xff0c;这里记录一下&#xff0c;防止下次找不到了。另一篇关于源码录像的流程请参考 http://www.verydemo.com/demo_c131_i79000.html 在源码CameraSource.…

Java项目:在线旅游系统(java+jsp+SSM+Spring+mysql+maven)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 一、项目简述 功能&#xff1a;用户的登录注册&#xff0c;旅游景点的展示&#xff0c;旅游预订&#xff0c;收藏&#xff0c;购买&#xff0c;以及酒店住宿留言等等&#xff0c;后台管理员&#xff0c;订单…

混合式APP开发中中间件方案Rexsee

发现Rexsee时&#xff0c;他已经一年多没有更新过了&#xff0c;最后版本是2012年的。 他的实现思路是通过Android自带的Java - Javascript 桥机制&#xff0c;在WebView中的JavaScript同Java进行通信&#xff0c;而这样的话即Javascript可以直接创建原生UI界面&#xff0c;以获…

vue 前端框架 (三)

VUE 生命周期 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><script type"text/javascript" src"js/vue.js"></script><link rel"stylesheet" type"te…

Rocksdb 的 MergeOperator 简单使用记录

本篇仅仅是一个记录 MergeOperator 的使用方式。 Rocksdb 使用MergeOperator 来代替Update 场景中的读改写操作&#xff0c;即用户的一个Update 操作需要调用rocksdb的 Get Put 接口才能完成。 而这种情况下会引入一些额外的读写放大&#xff0c;对于支持SQL这种update 频繁的…

Java项目:考试系统Java基础Gui(java+Gui)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 功能简介&#xff1a; 所属课程、题目内容、题目选项、题目答案、题目等级、学生管理、试卷管理、题目管理、时间控制 服务页面&#xff1a; public class ServerClient extends javax.swing.JFrame {/** …

软件工程需求设计说明书

Java即时通聊天程序 设计需求说明书 专业班级&#xff1a; 计本班1202班 项目组成员&#xff1a; 杨宗坤 刘瑞 满亚洲 指导教师&#xff1a; 张利峰 开始日期&#xff1a; 完成日期&#xff1a; 编写目的&#xff1a; 本说明书是在充分理解系统需求分析…