为公司其他部门做的技术分享,在一定程度上也算是在公司内部推广Python。不过很不幸的是由于某些原因,该分享不幸夭折。
PPT在这里:http://vik.haoluobo.com/static/slide/oa/
下面是更为详细的文案。
OA平台概况
- Nginx
- 使用Nginx作为前端服务器,负责静态资源处理及HTTP请求分发
 - 在需要扩展到多服务器时,Nginx可以用做负载均衡服务器
 
 - UCenter(统一认证中心)
- 统一的用户登陆管理
 - 用户信息存储在公司的AD域中
 
 - OA
- 业务平台,公司的行政、人力等各项OA业务都在该平台搭建
 - 同携程、inTrack平台对接实现相关业务
 - 数据的汇总及分析
 
 
OA构架
- 基于Django搭建的可插拔APP平台
- 核心APP(基础APP)
- 核心APP包括:UI框架、权限认证、流程引擎、用户、员工、部门管理等
 - 作为系统的核心模块,需要被其他各个业务模块所用到。
 - 为具体业务做支撑,大多不同具体业务相关
 - 核心模块在系统上线后将不太做改动,只需要少量的核心开发人员维护即可
 - 核心模块也是可复用的
- UCenter同OA就是公用的相同的UI框架
 
 
 - 可插拔APP(业务APP)
- 可插拔APP包括:人力模,请假出差、财务模块,报销、预算、行政、固定资产管理…
 - 同具体业务相关,依赖核心模块。
 - 业务需求多,且易变,在平台建设初期难以做周全的计划。
 - 各个业务模块相对独立,各业务模块可独立开发。
 - 多个业务模块可由多人并行开发。
 
 
 - 核心APP(基础APP)
 
Django
- The web framework for perfectionists with deadlines.
 - 全功能的Web开发框架,依托Python提供快速开发的支持
– 提供模板、控制器、URL路由、表单、验证、ORM等各项Web开发需要的基础功能
– ORM及其强大,即使不懂SQL也可使用。
– 支持数据库的版本管理,并可自动更新线上数据库结构
– 模板支持继承清晰易用,对前后端分离提供很好的支持。- 成熟的社区环境,大量现成的APP可用
 - 被广泛应用,有成功易用范例:Instagram、OpenStack
 
 
流程引擎
- 采用Python自主开发
 - 编码同配置结合在确保使用便携性的同时确保的功能的强大
- 表单、业务处理逻辑编码实现
- 数据模型通常变动不大,采用配置方式实现不但实现复杂,也不会能为开发维护带来多少便利
 - 流程常用的,同意、驳回、打回、撤销等基础操作流程引擎已自动实现,不需要额外开发。
 - 如在流程流转需要进行特殊操作,需用代码给出对应的实现。
- 比如新员工入职流程结束后需要自动在系统中创建员工账号等
 
 - 配合代码生成器的使用,对于标准流程编码工作流程只需要完成数据模型的设计即可。
 
 - 流程流转用配置实现
- 流程的审批节点,审批人变动概率较大,采用编码方式实现既不方便又不灵活
 - 流程流转的功能需要比较清晰,使用配置方式即可比较好的满足需求
- 流转方式:抢先,会签
 - 流程节点的审批人、周知人、权限分享。
 - 流程分支支持
 
 
 - OA上所有流程都基于流程引擎开发
 
 - 表单、业务处理逻辑编码实现
 - 提供代码生成工具生成流程框架
- 对于简单的流程,只需要实现数据模型即可生成完整的业务代码
 
 
Why
- 
Why
- 
Python
- Python is powerful… and fast;
- 这里的快更多的是开发速度快。语法丰富,简洁
 - 开发效率高是我们选择Python的一个重要原因。
- 信息部就2人,需要负责需求整理、设计、开发、测试所有工作,对开发效率要求非常高。
 
 - 不需要编译,启动时间快节约开发时间
- 一个大Java项目编译要超过一分钟,Web服务器启动又会超过一分钟
 - OA对比原有的KM。KM启动时间超过1分钟,OA可在5秒内完成重启。
 
 - Python本身并不慢,
 - 真正影响性能的代码所占总代码的比重很少。
- Python可方便的同C集成,用C扩展性能
 - 注:使用Cython可直接在Python里写C代码以提高性能
 - 目前不少性能敏感的库都采用C扩展的方式进行加速,方案成熟
 
 
 - plays well with others;
- 对C友好,使用ctypes可直接使用C接口的动态库
 - 很多软件都有提供Python接口。如:OpenCV、MATLAB
 
 - runs everywhere;
- 支持几乎所有的操作系统(包括各类嵌入式系统)
 
 - is friendly & easy to learn;
- 非常容易入门。对有经验的开发者,花一天时间熟悉语法就可直接使用
 
 - is Open.
 - Python的第三方资源足够丰富,应用也足够广泛
- 有很多采用Python的成功应用
- OpenStack、Dropbox、Youtube、Mercurial
 
 - 虽然比不上Java,但Python的资源也非常丰富。
- Django(Web)、Cython(在Python中直接写C)、NumPy(可选计算)、PyQT(UI)、QPython(Python on Android)
 
 
 - 有很多采用Python的成功应用
 - 
Python无所不能,但并不适合做所有事情。比如Android移动端的开发还是用Java更合适
 - 
开发效率高
- 信息部人少,需要快速实现需求
 - Java严谨、Java有接口等概念,在大项目协作时更容易。但由此带来的开销是在小团队情况下开发效率更低。
 
 
 - Python is powerful… and fast;
 - Django
 
 - 
 - Why Not
- Java
- Java严谨、Java有接口等概念,在大项目协作时更容易。但由此带来的开销是在小团队情况下开发效率更低。
 - 信息部是个小团,Java带来的好处不如优点大。
 - 即使是一个大团队,也可通过模块化的方式来减少规模化带来的沟通开销。除阿里这样的超大公司外,很多时候Java都不是一个很好的选择。
 - Java在Web开发方面一直是由多个开源项目所推动,本身就缺乏一个很好的体系。
- Java的各个开源项目独立发展,在开发初期并未仔细考虑过如何同其他项目协作。
 - Java主流实现都是围绕如何实现一个超大规模项目来设计,对小项目来说负担太重。
 - 使用Java实现一个非常小的功能也需要写大量的代码及超多的XML配置。现阶段Java开发已经简化很多,但相比Python依旧太过繁琐。
 
 
 - Node.js
- 近年来前端技术发展非常迅速。
 - 前端开发只能用JS,因此会JS的群体非常广泛。
 - Chrome V8,Node.js将JS引入服务端,收到广大前端爱好者的支持,迅速发展。
 - Node.js天生异步,有着不错的性能。
 - 使用callback实现异步,大量的callback导致代码不容易理解。
 
 - redis(Cache)
- 开发应当优先考虑功能的稳定性,然后才是性能问题。
 - 性能问题更多的是构架问题,应当优先优化构架。
 - 以我们公司的规模还远没到需要增加缓存的情况。
 - 缓存会增加系统复杂度,也可能带来一定的潜在风险。
 
 
 - Java
 
前端技术构架
- UI
- AdminLTE(Bootstrap)
- 信息部人少,缺少专业的UI及前端人员,尽可能的利用现有可用的资源。
 - AdminLTE是一套基础Bootstrap的界面框架,提供了大量基础的界面功能。
 - Bootstrap是当前非常流行的前端框架,有着丰富的资源。
 
 
 - AdminLTE(Bootstrap)
 - JS
- 使用Bower管理静态资源。
- 静态资源的包管理工具
 - 方便静态资源的升级管理
 - 避免将静态资源直接复制到代码库,为代码库增加存储以及响应压力
 
 - JQuery
- JS事实上的标准库,可极大的加速JS开发。
 
 - formset.js、datepicker等
- 实现formset,日期选择等节目效果。
 
 - 使用Django-Compressor进行静态资源的压缩优化。
 
 - 使用Bower管理静态资源。
 - Why Not
- Webpack
- 近几年前端发展速度非常快,前端开始变的复杂。JS不仅仅是为Web页面锦上添花。为配合使用JS进行大规模项目的开发,需要相关工具进行配合。
 - 前端打包工具,可对JS库进行依赖管理,控制JS包的按需加载。可对JS/CSS编译(ES6/TypeScript/SCSS/LESS),压缩,图片优化等
 - OA前端应用相对比较简单,Django-Compressor可以满足要求现阶段需求。相比Webpack能带来的好处,没必要为项目增加不必要的复杂度。
 
 - React
- 用来构建用户界面的 JavaScript 库
 - 更适合单页面的应用,如为手机提供类似APP的体验。
 - 不采用原因同Webpack一样。
 
 
 - Webpack