关于后端:DTCloud模块开发规范

2次阅读

共计 4328 个字符,预计需要花费 11 分钟才能阅读完成。

开源市场介绍

DTCloud 开发者社区,赋能开发者,共建企业应用市场。

集体开发者,可在开源市场下载安装模块,也可将本人开发的模块,上传开源市场。

DTCloud 模块开发标准

1. 利用模块目录

  • 项目名称
  1. 对立的前缀 dt_
  2. 对立为英语字母小写
  3. 不必驼峰表示法,如果有多个单词,倡议以 ”_” 分隔,比方 dictionary_management 这两个单词之间为 _ 下划线。
  • 各目录含意

api 提供内部调用接口
controller 控制器
data 数据
demo 必须要有 demo, 用户须要晓得怎么操作
doc 放入相干文档,如 doc 等,用于介绍我的项目或其它
edi 数据交换
i18n 语言目录
models 模型定义
report 报表相干
security 权限相干
static 动态文件等
tests 寄存 python 或 yml 测试用例
views 视图模板
wizard 寄存长期的 model 和视图

2. __manifest__.py 规范

  • 对立文件正文,除最初一行日期,其它不倡议更改

    # -*- coding: utf-8 -*-
    # &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
    # DTCloud v2.0
    # QQ: 35350428
    # 邮件: 35350428@qq.com
    # 手机: 13584935775
    # 作者: 'zyf_Amos'
    # 公司网址: http://www.dtcloud360.com
    # Copyright 中亿丰数字科技有限公司 2012-2022 Amos
    # 日期: 2022/5/29
  • manifest.py 规范

    {
      'name': "百度地图",  #  模块名称
      'summary': """百度地图视图""",  # 模块介绍
      'category': '中台利用 / 地图',
      'author': "zyfd_Amos",  # 模块开发者名称
      'website': "http://www.dtcloud360.com",
      'depends': ['web'],
      'version': '1.0',  # 版本号留神, 两位,初始版本为 1.0
      'installable': True,
      'application': True,
      'auto_install': False,
      'license': 'LGPL-3',
      'price': '10',  #   模块价格,在利用市场上会显示这里的价格
      'currency': 'CNY',  # 价格以人民币为规范
      'data': [
          'security/data.xml',
          'views/views.xml',
          'views/templates.xml',
      ],
      'images': [
          'static/description/static/images/map.png',
          'static/description/banner.png',
      ],
      'assets': {
          'web.assets_backend': [
              'dt_map/static/src/js/bmap_model.js',
              'dt_map/static/src/js/bmap_controller.js',
              'dt_map/static/src/js/bmap_view.js',
              'dt_map/static/src/js/bmap_render.js',
              'dt_map/static/src/js/geolocation.js',
              'dt_map/static/src/css/bmap.css',
              'dt_map/static/src/css/bmap_view.scss',
          ],
          'web.assets_qweb': [
              'dt_map/static/src/xml/bmap.xml',
              'dt_map/static/src/xml/geolocation.xml',
          ],
      },
      'description': """""",  # 相干模块介绍
    }
  • 分类

中台利用:根底,短信,邮件,地图
解决方案:XX 智慧工地解决方案,XX 公司 ERP 解决方案等
企业应用:销售,洽购,仓库,生产,会计,人事,我的项目等
工地利用:IOT 设施(门禁,视频,门磁,升降机等), 人员治理等
楼宇利用:IOT 设施(空调,门禁),客房零碎,停车零碎等
城市利用:智慧社区,智慧园区,智慧城市等

3. Banner 图片、icon 文件文件等,可参照以下文档局部

https://blog.csdn.net/ekcchina/article/details/125080888

DTCloud 罕用代码开发命名规定

罕用

  • 防止创立生成器和装璜器:仅应用 DTCloud API 已有的
  • 可应用 filtered,mapped,sorted 办法来晋升代码可读性和性能
  • 尽量应用 ORM
    当 ORM 能够实现的时候尽量应用 ORM 而不要间接写 sql,因为它可能会绕过 orm 的一些规定如权限、事务等,还会让代码变得难读且不平安。

    # 谬误的写法,注入危险,代码效率低
    self.env.cr.execute('SELECT id FROM auction_lots WHERE auction_id in (' + ','.join(map(str, ids))+') AND state=%s AND obj_price > 0', ('draft',))
    auction_lots_ids = [x[0] for x in self.env.cr.fetchall()]
    
    # 不会被注入,但依然是谬误的写法
    self.env.cr.execute('SELECT id FROM auction_lots WHERE auction_id in %s'\
             'AND state=%s AND obj_price > 0', (tuple(ids), 'draft',))
    auction_lots_ids = [x[0] for x in self.env.cr.fetchall()]
    
    # 举荐的写法
    auction_lots_ids = self.search([('auction_id','in',ids), ('state','=','draft'), ('obj_price','>',0)])
  • 新增

    values = {'name': '',}
    obj = self.env['models'].create(values)
    
  • 批改

    values = {'state': '已审核',}
    self.sudo().write(values)
  • 删除

    self.unlink()
  • 查问

    obj = self.env['models'].search([('name', '=', '')], order="sequence, id desc", limit=1)
    或
    model_data = self.env['model'].search_read([('module', '=', 'amos')], ['res_id'])
  • 读取

    self.env['models'].browse(id)
  • 计数

    domain = [('company_id', '=', self.env.ref('base.main_company').id)]
    rows_count = self.env['account.account'].search_count(domain)
  • 避免注入

不要用 python 的 + 号连接符、% 解释符来拼 sql

# 谬误的写法
self.env.cr.execute('SELECT distinct child_id FROM account_account_consol_rel' +
           'WHERE parent_id IN ('+','.join(map(str, ids))+')')

# 举荐的写法
self.env.cr.execute('SELECT DISTINCT child_id'\
           'FROM account_account_consol_rel'\
           'WHERE parent_id IN %s',
           (tuple(ids),))
  • 不要手动提交事务

DTCloud 有本人的一套机制用于事务处理,如 self._cr.commit(), 非凡场景除外

  • 符号和习惯

模型名 - 应用. 分隔,模块名做前缀

  1. 定义 DTCloud 模型时,应用复数模式的名字如 res.user,res.partner
  2. 定义 wizard 时,命名格局为 <related_base_model>.<action>,related_base_model 是关联模型名称,action 是性能简称,如 account.invoice.make
  3. 定义报表模型时,应用 <related_base_model>.report.<action>,和 wizard 一样
  4. python 类 - 应用驼峰命名形式 AccountInvoice。如果是 DTCloud 表对象应用 account_invoice(小写)
  • 变量名
  1. 模型变量应用驼峰命名形式
  2. 一般变量用下划线 + 小写字母
  3. 因为新 api 中记录是汇合模式,当变量不蕴含 id 时不以 id 作后缀

    ResPartner = self.env['res.partner']
    partners = ResPartner.browse(ids)
    partner_id = partners[0].id
  4. One2Many,Many2Many 字段个别以 ids 作为后缀如:sale_order_line_ids
  5. Many2One 个别以_id 为后缀如:partner_id, user_id
  6. 办法命名

    计算字段 – 计算方法个别是_compute_<field_name>
    默认办法 – _default_<field_name>
    onchange 办法 – _onchange_<field_name>
    束缚办法 – _check_<constraint_name>
    action 办法 – 一个对象的动作办法个别以 action_结尾,它的装璜器是 @api.multi,如果它只应用单条计算,可在办法头增加 self.ensure_one()

接口

  • 工作流
    _api_my_workflow:与零碎中的事件名称一一对应,APP 的按钮有后盾接口提供动态显示
  • 一条记录
    _api_one:数据库中一条记录
  • 列表
    _api_page:带分页的数据集
  • 排序
    _api_page_order:列表显示程序
  • 过滤
    _api_page_domain:列表数据显示规定
  • 置顶
    _api_top_time:列表排序中退出

API 接口罕用

  • 创立
    _api_create:因为非凡起因要对数据做解决,所以要给前端提供后盾解决
  • 批改
    _api_write:能够做更多判断操作,如果没有更多操作能够间接走零碎批改
  • 删除
    _api_unlink:次要是提供删除判断,能够提供软删除
  • 调配
    _api_distribution:单据上绑定相操作人
  • 支付
    _api_receive:单据认领
正文完
 0