核心业务:基础设置(物流业务管理 元数据):取派标准、取派时间、车辆、快递员、区域
取派:下单、取件、配送
中转:中转点、出入库
路由:运输线路、交通工具
PDA:快递员无线通讯设备 通讯功能
财务:快递员费用统计、计算等
管理报表需求:物流业务数据产生报表
服务器:(fore前端系统;bos核心支撑系统;crm客户信息管理系统;)---pub路由系统;price计价系统;财务系统;
使用到的技术:struts2--表现层mvc框架;
hibernate-数据层持久框架;
Spring.springdataJPA---业务管理IOC和AOP框架;
junit---单元测试;
jQuery.jQuery Easy UI ===js框架;
angular---js前端UI框架;
Ztree---js树形菜单插件;
POI---office文档读写组件;
CXF---webService远程调用;
ActiveMQ---消息队列;
Apache Shiro--权限管理框架
Elasticsearch.SpringdadaElasticsearch---搜索服务器;
Quartz---任务调度框架;
EhCache---缓存技术;
dubbo
solr
redis
React 前端技术
RabbitMQ 消息队列技术
****前端用到:easyUI:使用easyui你不需要写很多代码,你只需要通过编写一些简单HTML标记,就可以定义用户界面。
页面布局:layout; 1.在body或者div里设置class=”easyui-layout”;
2.data-options="region:'north',title:'管理系统'" style="height: 100px;"
折叠面板:accordion;1、在body或者div里设置class=”easyui-accordion”;
2、设置title、fit:true
选项卡面板:tabs; 1、在body或者div里设置class=”easyui-tabs”;
2、通过超链接,点击后,添加新的选项卡;
3、使用jquery语法,为超链接绑定一个点击事件
$("#mytabs").tabs('add',{
title:'第一名',
content: '有好吃的'
});
****前端用到:Ztree---js树形菜单插件;
1.在页面显示菜单位置,添加<ul>设置class=”ztree”;
2.进行ztree菜单设置;
3.提供ztree树形菜单数据 ;
4.生成菜单;
****springdataJPA---业务管理IOC和AOP框架;
目的:为了简化.统一持久层各种实现技术API,
所以springdata提供了一套api和不同持久层整合技术实现
配置了<jpa:repositories> 后,Spring 初始化容器时为继承 Repository
或其子接口的接口创建代理对象,并将代理对象注册为 Spring Bean,
业务层便可以通过 Spring 自动封装的特性来直接使用该对象。
步骤: 1.声明持久层接口
2.在接口中声明需要的业务方法;
3.在spring配置文件中增加声明,让Spring为声明的接口创建代理对象;并将代理对象注册为 Spring Bean
****jpaSpecificationExecutor接口;
dao层继承;用来进行条件分页查询;
Page<T> findAll(Specification<T> spec,Pageable pageable);
specification代表条件查询对象;pageable代表分页查询对象;
****批量导入一键上传;ocupload
1.在选择文件后,关闭自动提交,判定文件格式,再手动提交
2.使用struts2文件上传机制,接收上传文件
3.编写Action接收上传文件
4.HSSF解析Excel 97-2007格式(.xls),poi…jar解析HSSF
5.XSSF解析Excel 2007格式(.xlsx),poi ooxml…jar 解析XSSF(来POI包)
6.Pinyin4jUtils工具类生成区域简码和城市编码;
****webservice远程调用;解决多个系统之间进行分布的部署,系统数据通信的技术;
最主流的框架是CXF,分为两种传输数据的方式ws和rs;
jax-ws:基于soap协议,传输xml格式;
jax-rs:基于http协议,传输xml和json格式;基于restful架构风格;
restful风格:1.提供了一种设计原则和约束条件,编写更简洁;
2.基于HTTP协议,支持多种消息格式比如xml和json
3.更容易实现缓存机制;
jax-rs使用步骤:
1.建立maven项目;基于maven导入坐标
2.导入实体类;@XmlRootElement指定序列化(转换XML)对象名字
3.编写业务类; @Consumes 指定能够处理客户端传递过来数据格式
@Produces 指定能够生成哪种格式数据返回给客户端
4.发布服务;a>>>创建业务接口实现类对象;
b>>>服务器factorybean创建服务;
c>>>发布服务;
最终访问资源服务路径:
服务器根目录地址+web.xml配置+applicationContext.xml address配置+类@Path+方法@Path
jax-rs客户端webclient工具类的使用
create建立与调用服务资源路径相连接;
type:发送给服务器数据格式用consumes注解
accept:接收服务器传输数据格式用produces注解
post/delete/put/get:增删改查;
添加json转换支持:pom引入json转换器;
****AngularJS:(做了个倒计时????????????)
双向数据绑定:更新模型,视图会自动更新.更新视图.模型会自动更新;
使用ngRepeat遍历显示集合数据
路由思想:头尾不变中间变;
****activeMQ:消息队列技术;
****发短信功能:阿里大鱼
****发邮件功能:Javamail技术,用redis实现激活码保存时长;可以用Java语言jedis来操作redis;
(redis内存数据库是键值对形式存储结构)
****高并发activeMQ消息队列技术解决
为什么使用:1.解决服务器之间的耦合;2.增加并发处理量;用户的请求可以更快的响应,
应用场景:1)用户注册,重点用户信息数据库保存,发短信、发邮件,增加业务处理复杂度,
这时候用MQ,将发短信、发邮箱,通知MQ,由另外服务平台完成
2)搜索平台、缓存平台
查询数据,建立缓存/索引,不从数据库查询,从缓存或者索引库查询..当增加/修改/删除数据时,
发送消息给MQ,缓存平台、索引平台从MQ获取到这个消息,更新缓存或者索引
****quartz
定时框架,重要接口说明
1,Job:工作任务,你要做什么,Job一般自定义实现,由接口JobDetail来创建
2,Trigger执行工作任务,什么时间执行,多久执行一次
常用的有:SimpleTrigger、CronTrigger
3,Scheduler定时器对象,开启定时任务
(上面三个都要在applicationcontext中配置)
执行流程:1、定义一个被spring管理的bean
2、在Job中注入spring管理的bean
3、需要在Scheduler中自定义JobFactory...配置applicationContext.xml
****city-picker-master:省市三级联动
****百度地图JavaScript;
城市为中心展示地图;
设置最小最大级别
移动地图
计算两点距离完成两点画线
工具条
缩略图控件
城市列表控件
添加覆盖物
弹跳动画
自定义图标
闪烁点/热力图/聚类图
鼠标滚轮/鼠标测距/点击获取坐标/实时路况显示/地图加载事件
两点路线规划
坐标转换地址解析
关键字检索,多关键字,附近内容,自动补全;
百度地图LBS云存储服务;
调用Java使用httpclient实现;
1.在pom.xml引入http client的开发组件
2.基于httpclient工具,访问LBS接口(创建表)
a>>>创建httpclient对象
b>>>请求对象
c>>>绑定参数
d>>>发送请求
e>>>打印结果数据
3.查询表
a>>>创建httpclient对象
b>>>请求对象
c>>>绑定参数
d>>>发送请求
e>>>打印结果数据
****kindeditor编辑器使用:自定义图片上传;
工作原理:隐藏原来textarea文本框,生成iframe,在iframe里进行编辑
****前端框架:
1、AngularJs
html和js之间的数据衔接层,可以操控html元素(数据绑定、MVC、依赖注入)等,
AngularJs是一个javascript的框架,是为了开发有复杂业务逻辑的CRUD应运而生的。
2、BootStrap
用于页面布局样式设计、CSS等,与数据无关,是一种UI设计工具,一般搭配AngularJs使用。
BootStrap不算是javascript框架,它只是一个前端的UI框架,然后有一些附带的js插件而已。
3、JQuery
是一个 JavaScript 函数库,更偏重于操作dom元素,对dom遍历和修改。
4、JqueryEasyUI
是基于jQuery的框架,它侧重于页面显示部分,即UI,但是所有效果都是用JQuery实现的。
5、Freemarker
页面静态化使用,实现自定义标签模板;通常扩展名称.ftl
{变量},需要在程序中指定变量,合并到模板文件一同输出
4、JqueryEasyUI
4、JqueryEasyUI
4、JqueryEasyUI
****ElasticSearch搜索服务器,底层基于Lucene
<传统数据库用模糊查询时候like效率太低;>
<映射:中文默认是一个字一个字查询.所以才使用ik分词器>*******重要
<文档:相当于数据库的记录>
<文档类型:每个可以是相等的;>
<映射:相当于数据库的表,是数据如何存到库中,还包括以什么类型存储,是否存储,,是否分词;>
先按一定规则,分词,根据词条建立索引;倒排索引;
1、 全文检索:针对文本中每个词,创建词条建立索引,进行搜索。
编程步骤
1)建立索引对象
2)建立映射(建立关系:)
3)存储数据【文档】
4)指定文档类型进行搜索数据【文档】
2.ik分词器;
将字符串分成多个词条;
****lucene基于Java语言开发,是一个底层类库
用到了倒排索引的技术;根据数据库中原始的数据创建新的文档列表和倒排索引区域,
用户有查询需求时先访问倒排索引数据区域得出文档编号即可快速找到具体的文档内容;
分词 单词永不重复 单词就是索引 单词是最小的搜索单位
ik分词器:采用了特有的正向迭代最细粒度切分算法;支持细粒度和智能分词两种切分模式;
*****solor是一个服务,程序,解决跨平台跨语言,
****缓存框架;ehcache;(redis,ehcache,memcache)
shiro默认支持ehcache;使用普遍,只支持单服务器,只支持Java语言;用空间换时间,减少数据库访问次数,提高查询性能;
(redis还支持其他语言;支持分布式服务器,数据量很大时候用redis,还支持数据持久化;《rdb和aof》)
一>>>使用ehcache缓存shiro权限数据------shiro和ehcache整合;
二>>>使用ehcache缓存业务数据
1,ehcache和spring整合.shiro和ehcache整合;
2,先把数据存到shiro的缓存管理器中.再插到ehcache的缓存安全管理器中.
在realm中指定要使用的缓存区;
3,配spring缓存管理器,注入cache缓存管理器;
4,实体类都要实现序列化接口,
5,无参数方法service实现类中方法上添加注解可以添加移除缓存;
5,有参数的方法(如分页缓存),参数作为key.
****中转业务模块;记录起点到终点的过程; 入库-出库-盘库-合包-拆包-到达网点--派送-签收
⭐※※一个运输信息包含多个出/入库信息,一个派送,一个签收信息
一>>>>>>发货操作(向transistInfo表生成一条记录,代表运单已发货)
二>>>>>>运输路径规划和显示
三>>>>>>运输信息列表分页查询
分拣管理:入库-出库-盘库-合包-拆包
在运单显示页面点击开始中转配送,后台判断如果是选中了一行,就会在运输信息中
插入一条运输信息数据,后台拿到运单号判断如果不是空就去数据库找运单,
判断状态是不是待发货,如果是就生成运输信息数据,修改运输信息状态和运单状态,
(出入库):选中一条信息;判断状态是不是出入库中转,如果是才能操作出入库对应操作;
回显运单信息;填空保存;保存出入库信息之后要再查出来运输信息加上出入库信息一块回显;
(开始配送),指定快递员:当运输状态为到达网点时;就开始配送了;再显示运输信息,填空保存,
关联快递员,状态改为正在配送;
(签收录入):运输状态为开始配送的时候.弹窗口,运输配送信息回显;填空保存;
后台:拿到运输配送信息和签收信息分别保存;更改运输配送状态和运单状态,还有索引库状态;
一个运输信息包含多个出/入库信息,一个派送,一个签收信息
运输配送管理:地图显示,加途径点参数显示; (百度地图)
进出港管理:
物流管理:
异常处理:
****报表业务模块;
Excle格式报表生成:
根据POI生成excel:新建excle文档-新建sheet-新建row-新建cell单元格-写单元格
POI生成HSSF(xls)/
步骤:1.查询出满足当前条件结果数据
2.生成excle文件:HSSFWorkbook.creatsheet
3.表头:HSSFRow(headRow).creatCell.setCellValue("")
4.表数据:HSSFRow(dataRow).creatCell.setCellValue();
5.下载导出:设置头信息contenttype;转码;设置头:content-disposition;输出流写出;关闭;
PDF格式
技术:ireort,可以通过图形化界面进行操作,配中文支持,查表,拖拉显示,配中文,自动换行;
用JasperReport导出pdf:
先查询出满足条件的结果数据,设置头信息,根据JasperReport模板生成pdf,读取模板文件;
设置模板数据;设置变量填充;输入流pdf输出流到浏览器;导出
highcharts:前端报表生成技术
****延迟加载如果想要的话(就是说集合数据转换为json返回),就有三种方法;
1.在业务层手动查询
2.配置立即抓取
3.配置OpenentityManagerInView过滤器;效率低简单;
异常能处理就try catch 不能处理就抛出去;
分布式系统;bos;多台服务器;多人做事,省时间;稳定性更好,支持更大的并发量,减轻压力;管理方便;>>>10人做饭分工不同;
集群:多台服务器,一个人做所有事,多个人时候每个人都做完整程序;读写分离,故障转移,负载均衡 >>>10人做饭每人都要买洗切炒
用户注册;活动促销;
(优点是什么?怎么用?)
三个技术点:shiro粗粒度权限管理;poi生成excel报表;定时框架quartz
shiro粗粒度权限管理:shiro是轻量级框架,可以提高效率降低开发成本;
可以基于Filter实现
在数据库中存放用户、权限、访问URL对应关系,当前用户访问一个URL地址,
查询数据库判断用户当前具有权限,是否包含这个URL,如果包含允许访问,
如果不包含则权限不足
认证过程:创建安全管理器--调用登陆方法提交认证,把用户信息存在token中--
安全管理器进行认证--认证器进行认证--realm根据用户名查询用户信息--
如果有,返回用户信息;如果没有,返回null--如果不是null,就比较两个密码是否一样,
不一样就抛异常;
授权过程:
1.对subject进行授权.调用ispermitted方法
2.安全管理器执行授权.授权器执行授权
3.授权器从数据库查询权限数据.调用realm的授权方法
4.realm从数据库查询权限数据返回授权器
5.授权器调用PermissionResolver进行权限串比对
6.6、如果比对后,isPermitted中"permission串"在realm查询到权限数据中
,说明用户访问permission串有权限,否则 没有权限,抛出异常。
通过给用户赋予角色、角色拥有权限的模式,达到控制用户具有权限的目的。
同时,还复用了角色,这样可以让多个相同职务(或职能)的人拥有同样的角色。
RBAC(Role Based Access Control ,基于角色的访问控制 )
2.在在过滤器中定义放行的连接,因为不是每个操作都会存在session
(如:进入登录的界面、生成验证码的界面)
3.在过滤器中获取登陆后存放的Session,如果Session不为空,则放行,
即可以操作定义的业务功能,如果Session为空,则挑转到登陆页面。
定时框架quartz:
能嵌入到任何独立的系统中运行,能被实例化为独立项目的集群;
因为有cron表达式所以精确度更高,每次执行都创建一个新的任务对象,
所以某次有异常发生时不会影响下次执行任务,
1.创建job类作为任务处理方法;
2.配置到spring容器
3.配置jobdetail(JobDetail表示一个具体的可执行的调度程序,Job是这个
可执行程调度程序所要执行的内容,它包含了这个任务调度的方案和策略。)
4.配置调度触发器trigger(来告诉调度容器什么时候去调用JobDetail。)
5.scheduler:是一个调度容器,可以注册多个jobdetail和trigger
poi
POI生成Excel(xls格式)步骤写Excel过程一样,新建Excel文档 新建Sheet 新建Row
新建Cell单元格 写单元格数据
步骤:1.查询出满足条件的数据显示出来
2.生成excle文件,
3.设置表头
4.设置表数据
5.下载导出
activeMQ:
为什么使用消息队列技术
1)解决服务之间耦合
2)使用消息队列,增加系统并发处理量
队列的主要作用是消除高并发访问高峰,加快网站的响应速度
ActiveMQ 应用场景分析
1)用户注册,重点用户信息数据库保存,发短信、发邮件,增加业务处理复杂度,
这时候用MQ,将发短信、发邮箱,通知MQ,由另外服务平台完成
2)搜索平台、缓存平台
查询数据,建立缓存、索引,不从数据库查询,从缓存或者索引库查询
当增加、修改,删除数据时,发送消息给MQ,缓存平台、索引平台从MQ获取到
这个消息,更新缓存或者索引
类型:
quene队列:一对一
topic订阅模式:一对多
cookie和session的区别:
1.Cookie是把数据保存在浏览器,Session是把数据保存在服务器
2.无论客户端做什么设置,session都能正常工作,而客户端可以选择禁用cookie,但是,session仍然能够工作,因为客户端无法禁用服务器端的session
3.在存储数据量方面session和cookie也是不一样,session能够存储任意的java对象,cookie只能存储String类型的对象,Cookie是有个数和大小限制的(不同浏览器不同限制);而Session没有。
4.安全性:cookie低,session高;
5.请求时携带的数据数量:cookie全部,session仅sessionid