OA平台技术分享

为公司其他部门做的技术分享,在一定程度上也算是在公司内部推广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包括:人力模,请假出差、财务模块,报销、预算、行政、固定资产管理…
      • 同具体业务相关,依赖核心模块。
      • 业务需求多,且易变,在平台建设初期难以做周全的计划。
      • 各个业务模块相对独立,各业务模块可独立开发。
      • 多个业务模块可由多人并行开发。

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无所不能,但并不适合做所有事情。比如Android移动端的开发还是用Java更合适

      • 开发效率高

        • 信息部人少,需要快速实现需求
        • Java严谨、Java有接口等概念,在大项目协作时更容易。但由此带来的开销是在小团队情况下开发效率更低。
    • 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)
      • 开发应当优先考虑功能的稳定性,然后才是性能问题。
      • 性能问题更多的是构架问题,应当优先优化构架。
      • 以我们公司的规模还远没到需要增加缓存的情况。
      • 缓存会增加系统复杂度,也可能带来一定的潜在风险。

前端技术构架

  • UI
    • AdminLTE(Bootstrap)
      • 信息部人少,缺少专业的UI及前端人员,尽可能的利用现有可用的资源。
      • AdminLTE是一套基础Bootstrap的界面框架,提供了大量基础的界面功能。
      • Bootstrap是当前非常流行的前端框架,有着丰富的资源。
  • JS
    • 使用Bower管理静态资源。
      • 静态资源的包管理工具
      • 方便静态资源的升级管理
      • 避免将静态资源直接复制到代码库,为代码库增加存储以及响应压力
    • JQuery
      • JS事实上的标准库,可极大的加速JS开发。
    • formset.js、datepicker等
      • 实现formset,日期选择等节目效果。
    • 使用Django-Compressor进行静态资源的压缩优化。
  • Why Not
    • Webpack
      • 近几年前端发展速度非常快,前端开始变的复杂。JS不仅仅是为Web页面锦上添花。为配合使用JS进行大规模项目的开发,需要相关工具进行配合。
      • 前端打包工具,可对JS库进行依赖管理,控制JS包的按需加载。可对JS/CSS编译(ES6/TypeScript/SCSS/LESS),压缩,图片优化等
      • OA前端应用相对比较简单,Django-Compressor可以满足要求现阶段需求。相比Webpack能带来的好处,没必要为项目增加不必要的复杂度。
    • React
      • 用来构建用户界面的 JavaScript 库
      • 更适合单页面的应用,如为手机提供类似APP的体验。
      • 不采用原因同Webpack一样。