自动化平台开发的几点总结
最近花了些时间在琢磨自动化平台开发的事情,所以每天都会抽出几个小时来写一写,大方向的开发任务算是逐步有了眉目。如果客观来说,这部分的工作算是完成了20%左右。前期花在基础架构上的功夫比较多。
为了方便平台化的开发,我主要考虑了一下几点:
- 动态菜单,不同权限,不同业务的人看到的菜单是不一样的
- 对于权限的粒度把握,增删改查的业务权限尽管声明了不同的菜单权限,但是权限的粒度还是需要考虑的。
- 对于操作日志的记录,做了什么操作,哪些操作这些信息还是需要格外重视的。
- 基础功能实现可配置化,比如菜单,权限,这些都是基础的数据,完全实现配置化的工作,会让整个平台的可操作性提高不少。
从最开始的时候,我是本着从简的思路,能用一个表搞定,绝对不适用两个表。设计的时候,允许部分的数据冗余,确切的说,我不喜欢过度设计,因为耦合度太低,最终还是要花大力气整合起来。
模型设计中的枚举值
在前期的准备过程中,最开始写页面的时候,对于枚举值都是在MTV的M层来定义,我在models.py文件里面做了很多的配置,但是发现按照这种扩展的方式,后期处理就很尴尬了。因为ORM层面的映射是体现不出这种枚举值的差异的。而且数据从后端到前端,还得逐个转换一般,比如这种方式,在实际的前端页面中,还需要二次过滤,看起来实现了配置化,但是效率确实不高。
class Cmdb_server(models.Model):
db_types_choices = (
('mysql', u'MySQL'),
('redis', u'Redis'),
('greenplum', u'GreenPlum'),
)
db_role_choices =(
('master', u'Master'),
('slave', u'Slave'),
)
server_status_choices = (
('1','online'),
('0','fault'),
('2','offline'),
)
server_os_hostname = models.CharField(max_length=50,verbose_name='主机名')
所以越是扩展和改变代码,发现这个地方越来越是一个坑,所以在后面果断使用了数据字典的配置方式来统一管控。
动态二级菜单
我希望实现的一个比较规范的功能就是动态菜单,即不同权限的用户看到的菜单项是不同的。前后改了好几版,总算是把整个流程调通了。
设计到细节的时候,发现很容易有使用的歧义或者不明确的地方。
二级菜单的设计真是一把辛酸泪,最开始感觉这个很简单,一个for循环能够搞定,但是落实到代码层面,琢磨了很多想法,发现自己最开始的切入点就不太对,循环输出HTML标签,结束标签的循环就是一个技巧了。
写了很多版本,至少有6个版本,有的菜单不够稳定,有的显示出来乱七八糟的。拿着代码反反复复看了多遍,赶紧还是有点抓耳挠腮的感觉,于是乎直接把关键代码打印出来,在那儿盘算了一会,总算是得出了满意的答案。
改造一个统一的模板
开发这个平台的时候,如果为了降低开发的难度,提高资源的可重复效率,是用统一的模板,然后在这个基础上修修改改即可。但是实际上自己看了很多原型之后,发现目前的实现和现在的存在着较大的差异。所以这样一个件看起来不闹心的事情,自己就花了一些精力,专门来做统筹的工作。
按照优先级,否则易陷入死胡同
在开发的过程中,总是会冒出一些想法来,想自己能够实现一些比较好的功能,但是实际上,这个过程总是事与愿违。一个看起来简单的功能,想追求完美,但是实际这样下来,效率不高,效果反而会差一些。还是需要按照优先级来做,而不要总是被打断。
- Premiere&After Effects的实时预览插件开发
- 委托与事件
- 一款批量修改AE模板的工具
- 深入线程
- 【插件开发】—— 2 插件入门
- 线程间通讯:WaitHandler使用实例及分析
- 域名Deskbike.com刚注册没多久就以五位数结拍
- 一起Polyfill系列:Function.prototype.bind的四个阶段
- winform实现拼图游戏
- 一起Polyfill系列:让Date识别ISO 8601日期时间格式
- Oracle 监听器无法启动(TNS-12537,TNS-12560,TNS-00507)
- Javascript Prototypes之旅(A Plain English Guide to JavaScript Prototypes译文)
- Python补充03 Python内置函数清单
- 不懂JQuery的孩子:自封装Ajax函数
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- git | Windows下如何利用Linux的命令
- python3 爬虫第三步 本文包你学会正则 不会就来锤我
- php基础教程 第三步 学习字符串及相关函数
- php基础教程 第四步 学习运算符
- php基础教程 第五步 逻辑控制
- php基础教程 第六步 学习数组以及条件判断switch补充
- php基础教程 第七步数组补充及循环基础
- php基础教程 第八步循环补充
- php基础教程 第九步 自定义函数
- php基础教程 第十步 阶段性知识补充
- php基础教程 第十一步 面向对象
- php基础教程 第十一步 面向对象补充
- Serverless|Framework——图文玩转 AWS Lambda
- C++入门指南及实战 第一步 概述及经典HelloWorld
- C++入门指南及实战 第二步 HelloWorld及扩展详解