文章目录

  • 前言
  • 一、准备工作
    • 1.python安装
    • 2.PyCharm安装
    • 3.PostgreSQL数据库安装
    • 4.准备Odoo源代码
    • 5.安装虚拟环境
    • 6.安装虚拟环境管理包
    • 7.配置虚拟环境安装位置
    • 8.创建新的虚拟环境
    • 9.安装扩展包
    • 10.选择虚拟环境
    • 11.创建run.py文件
    • 12.创建addons目录
    • 13.创建一个PostgreSQL超级用户
    • 14.创建odoo-data目录
  • 二、odoo配置环境
    • 1. 配置config
  • 三、odoo命令
    • 1.创建应用命令
    • 2. 启动 Odoo命令
    • 3.启动shell脚本命令
  • 四.配置应用文件(__manifest__.py)
  • 五.模型
    • 1.Odoo的三种模型
    • 2.模型属性
    • 3.模型字段
    • 4.字段属性
    • 5.模型之间的关系
    • 6.模型书写的路径与配置
    • 7.模型的书写
    • 8.显示模型字段
    • 9.自定义字段
    • 10.模型中的ORM操作
  • 六、视图
    • 1.menu(菜单)视图
    • 2.form视图
    • 3.tree视图
    • 3.action窗口动作
  • 七、安装APP
  • 总结

前言

做这篇文章主要是给odoo小白提供部署方便,本文为原创,转载或使用请注明出处谢谢!


一、准备工作

1.python安装

现如今Odoo框架越来越成熟,对python的版本也越来越高,故在此需要安装python3.5以上的版本!

官网地址: https://www.python.org/downloads/

2.PyCharm安装

为了统一开发工具,建议选择PyCharm来开发,这样操作数据库会比较方便,这里选择2019的专业版[Professional],这里需要注意的是2019以下的版本对于PostgreSQL数据库不是特别友好。
官网地址: https://www.jetbrains.com/pycharm/download/other.html

3.PostgreSQL数据库安装

因为odoo强集成了postgresql,所以只能用postgresql,不能用其他数据库,odoo所用的数据库集成 ,在开发的时候可以随意增加或删除字段,因此给开发者省去了重构及清库的麻烦。
官网地址: https://www.postgresql.org/download/
具体安装攻略详见我的CSDN:
https://blog.csdn.net/weixin_43464076/article/details/111763557

4.准备Odoo源代码

在官网下载Odoo源代码
官网地址: https://www.odoo.com/zh_CN/page/download
以下是翻译的结果,以及下载步骤:


这里需要下载最后一个,这个才是源码,其他是exe文件,企业版需要付费所以这里选择社区版。

这里注意下载的源码解压后是这样的

为了方便操作就把主目录这一长串的字改成source,方便以后操作!

5.安装虚拟环境

                 pip install virtualenv

6.安装虚拟环境管理包

windows环境:pip install virtualenvwrapper-win
其他环境:pip install virtualenvwrapper

7.配置虚拟环境安装位置

不配置的话会默认安装在C:\Users\Admin\Envs,以我的电脑为例:

接下来配置位置
桌面→我的电脑→右键→属性→高级系统设置→环境变量→系统变量或者用户变量里面新建一个WORKON_HOME的变量名[这里推荐系统变量,这样切换另一个电脑账号的时候就不需要再配置]→变量值选择你要安装的目录.

8.创建新的虚拟环境

在CMD或者pycharm的Terminal中输入以下代码,注:virtual_name为虚拟环境名称

             mkvirtualenv virtual_name

查看已安装的虚拟环境

                     workon

9.安装扩展包

在odoo源码中已经提供好了可能需要的扩展包名称
在odoo.egg-info下的requires.txt
然后只需要将里面的扩展包一一安装就好了。
注意:这里要安装刚刚创建的虚拟环境,因为后期都会在虚拟环境下操作,而且交付代码或者打包的时候不会过多的打包其他所依赖的库,比如爬虫什么的,我们只需打包虚拟环境下所依赖的库即上述库,这样就解决了效率,与空间的问题。
这里最好自己写个脚本安装,直接用文件一次性安装会导致一个包安装失败了,那么安装程序就会停止,这里为了考虑效率,故可以用以下的脚本来安装所有依赖的包

import osBASE_DIR = os.path.dirname(os.path.abspath(__file__))
filepath = os.path.join(BASE_DIR, 'requirements.txt')   # 这里是你的'requirements.txt路径with open(filepath, 'r') as fp:package = fp.readlines()err_list = []
for i in package:p = i.strip('\n')
try:
# odoo_env2是虚拟环境的名字os.system('workon odoo_env2 && pip install {} -i https://pypi.tuna.tsinghua.edu.cn/simple'.format(p))except:print('安装[{}]包发生错误'.format(p))err_list.append(p)# 安装失败的包自己百度解决,通常情况下把错误信息复制百度即可
print('安装失败的包: ', err_list)

10.选择虚拟环境

  1. 打开PyCharm,点击左上角的File→Setting
  2. 找到 Project Interpreter选项(再左上角可以搜索)→右边的设置→Add
  3. 左边第一个→右边第二个点→三个点的方框(浏览)
  4. 选择自己的虚拟环境安装路径→打开Script→选择python.exe→选择虚拟环境→配置环境变量→OK







11.创建run.py文件

这里需要解释一下run.py文件其实是source(源码)\setup\odoo文件.在多级目录下,不好方便操作,所以在一级目录()下创建run.py文件然后配置odoo的启动设置,这样也能使odoo框架跑起来,并且在一级目录下好操作!

run.py文件的代码

 run.py
import os
import sys
__import__('os').environ['TZ'] = 'UTC'  # 这里改时区中国是’Asia/Shanghai’# 把源码路径加到系统中(源码中的odoo没有这一段)
# LIB_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'source')
# sys.path.append(LIB_PATH)
sys.path.append(r’path’)  # 这里填你项目中source(源码)的路径import odooif __name__ == "__main__":odoo.cli.main()

12.创建addons目录

  1. 在主目录下创建一个addons目录,用于存放app(应用/模块)。

13.创建一个PostgreSQL超级用户

  1. 在安装完PostgreSQL数据库后→开始→PostgreSQL→pgAdmin
    或者在菜单栏里搜索pgAdmin





  1. 创建超级管理员
1.创建超级用户
CREATE ROLE 用户名superuser PASSWORD '密码' login;2.创建用户u1
create role u1 with login password '123456';login是赋予登录权限,否则是不能登录的

这里是创建超级管理,那么就输入第一条即可

14.创建odoo-data目录

  1. 这个目录用于存放session信息,以及附件
  2. 这里创建的方式最好在另一个目录创建,与源码的目录分开 例如: 源码在D://odoo//odooProject目录下
    那么我门就创建在其他地方,如D://odoo//odoo-data

二、odoo配置环境

1. 配置config

  1. 创建config目录以及.conf文件:
    在主目录下创建一个config文件夹,在此文件夹中创建一个.conf文件,一般来说简单一点就是odoo.conf文件。

  1. 配置.conf文件

主要配置说明:

addons_path
1.配置APP(应用/模块)路径,注意两个路径间用英文逗号隔开:
2.第一个路径是源码的addons路径,第二个是自己创建的addons路径

addons_path = D:\odoo\myodoo\source\odoo\addons,D:\odoo\myodoo\addons

admin_passwd
1.Odoo超级管理员(用于创建,还原和备份数据库的操作)

admin_passwd = 123456

data_dir
1.在文件夹中于存放session信息,附件等,不存在则自动创建

data_dir = D:\odoo\odoo-data

db_name
1.强制指定一个数据库连接(没有该数据库时会创建该数据库)

db_name = myodoo_odoo

db_user
1.刚刚创建数据库的超级管理员名称

db_user = odoo

db_password
1.超级管理员密码

db_password = odoo

db_host
1.数据库地址

db_host = 127.0.0.1

db_port
1.数据库端口

db_port = 5432

db_filter
1.过滤数据库,即查找到有这个字样的数据库名称(正则)

dbfilter = ^myodoo

http-interface
1. 监听HTTP服务的接口地址 0.0.0.0表示可以被所有地址访问

http-interface = 0.0.0.0

http_port
1. HTTP服务的侦听端口 默认8069

http_port = 8069

pg_path
1.选择postgresql数据库路径,导出数据时【可能】需要运行该路径下的Pg_dump

pg_path = E:\python_tool\PostgreSql13.1.1_64\bin

附上代码图:
记得修改里面的参数!

三、odoo命令

1.创建应用命令

python run.py scaffold app名称 [指定路径] [-t 指定模板]

指定路径是自己创建的addons的路径,不指定会默认创建在主目录上,如下图:

2. 启动 Odoo命令

参数 解释
-c 指定配置文件 配置的.conf文件例如:-c ./config/.conf
-u 升级App 在多个App(应用/模块)中,开发的时候只修改了其中一个那么就不需要重新升级所有的App,直须升级修改后的.例如:-u app
–dev=xml 只升级修改的视图 与-u原理一样

当然要使用-u 或者 --dev=xml 则必须要与-c一起
例如:

-c ./config/odoo.conf -u app

再次启动的时候,若只修改了app则可以改成:
然后再重新运行程序,每次都要重新运行

-c ./config/odoo.conf --dev=xml

若后面只须改动视图,说明都不修改的情况下改成:
重新启动程序,后续修改就只需要刷新页面即可

配置启动命令,不配置的话次次在CMD/Terminal上执行太麻烦了:





这里弄完先别关闭!
这里需要注意的是,要保证虚拟环境安装了我们所需要的扩展包,不然运行一些东西的时候会出错!
接着就是配置启动命令,初次启动就不需要输入启动命令的-u或者–dev=xml
同样的在Parameters这个框框加入Odoo的启动命令,记得-c后面加自己配置的.conf


配置好后点击OK,现在即可来试着启动odoo框架啦!

这里是不是不知道用户密码?不要慌,odoo管理员默认的账号和密码分别是admin和admin

3.启动shell脚本命令

python run.py shell -c 配置文件 [-d 指定数据库]

python run.py shell -c ./config/.conf -d database
注意: 如果配置文件里配置了指定的数据库,则不需要参数`-d database
什么意思呢?就是说在.conf文件中,是直接指定了一个数据,而不是查找有某个字段的数据库再选定.
操作数据库的增删查改都需要命令去实现,所以这时需要进入shell脚本操作
这里选择使用pycharm的Terminal来打开shell脚本
下面是启动成功的案例

四.配置应用文件(manifest.py)

该文件就在应用目录下:

该文件打开就报黄,不用理!
该文件是一个python字典。其中每个键指定应用数据单元。其内容如下:

# -*- coding: utf-8 -*-
{'name': "other_App",  # 这是应用的名字(必填)'summary': """Short (1 phrase/line) summary of the module's purpose, used assubtitle on modules listing or apps.openerp.com""",'description': """# 模块的描述Long description of module's purpose""",'author': "My Company",  # 作者的名字'website': "http://www.yourcompany.com",  # 作者的网站# Categories can be used to filter modules in modules listing# Check https://github.com/odoo/odoo/blob/12.0/odoo/addons/base/data/ir_module_category_data.xml# for the full list'category': 'Uncategorized','version': '0.1',  # 应用的版本号# any module necessary for this one to work correctly'depends': ['base'],  # 需要继承的模板# always loaded'data': [  #必须保持通过模块安装或更新的数据文件列表。来自模块根目录的路径列表,现价段来说基本是视图文件# 'security/ir.model.access.csv','views/views.xml','views/templates.xml',],# only loaded in demonstration mode'demo': [  # 仅在演示模式下安装或更新的数据文件列表'demo/demo.xml',],
}

更多介绍请看官网: https://alanhou.org/odoo-13-module-manifests/

五.模型

1.Odoo的三种模型

  1. 一般模型(models.Model):

    映射到数据库中的表

  2. 瞬态模型(models.TransientModel):

    存于数据,但会被定期清理,通常用于向导

  3. 抽象模型(models.AbstractModel):

    不存储数据,不会在数据库创建表。 抽象模型作为可重用的功能集,利用Odoo的继承功能,混入到其他模型。通常用于定义接口或者用作报表模型

2.模型属性

属性 解释
_name 模型名称
_inherit Python继承的模型(‘model.inherit’ or [‘model.inherit’])
_inherits 委托继承
_rec_name 用来指出引用关联字描述记录的字段
_order 当浏览模型记录或者显示在列表视图时,设置默认顺序。
_description 模型的非正式名称,当用户界面显示模型时,一个方便用户的模型记录标题。

3.模型字段

源码/odoo/fields.py

字段 解释
Char 单行文本
Text 多行文本
Selection 下拉单选
Htmlhtml 富文本
Integer 整型
Float 浮点型
Monetary 货币型
Date 日期型
Datetime 日期+时间型
Boolean 布尔型
Binary 二进制文件类型
Many2one 多对一
One2many 一对多
Many2many 多对多

4.字段属性

源码/odoo/fields.py

属性 解释
string 字段名称(str)
default 默认值
help 帮助提示内容(str)
readonly 是否为只读(boolean)
required 是否为必填(boolean)
index 是否为索引字段(boolean)
copy 是否为允许复制(boolean)
related 关联字段, 表示本字段引用关联表中的某字段。
groups 定义可操作的用户组(str)
domain 用于关联字段记录的过滤
store 是否存入数据库 默认为True
compute 用于创建一个默认记录给指定字段,不可编辑,store默认为False
inverse 操作compute的默认记录,反向操作给depends绑定的字段,且compute操作后的记录还是操作前的记录
related 关联字段, 表示本字段引用关联表中的某字段
groups 用户组,定义可操作的用户组(str)
ondelete set null: 当b中删除记录时,modelA中相关记录的a=null ; ; ; cascade: 当b中删除记录时,modelA中相关记录也全部删除 ; ; ;restrict: 当b中删除记录时,如果modelA中存在对应记录,则无法操作 b 的删除;;;;;;;;;;;;;;;;;;;;;\;;;;;; ; 如果Many2one字段中没有设置ondelete属性,则默认为set null

domain属性的详细操作步骤与说明:

 用于该字段能够选择的时候用。

此处为多对一的例子:
表示该字段与模型phonemodel.model建立多对一的关系

而添加domain属性后,下拉选择框只出现过滤后的字段:

ompute属性的详细操作步骤与说明:



这里说明一下self的意思:
大概意思就是这个数据表的所有有效记录.




inverse属性的详细操作步骤与说明:



5.模型之间的关系

字段 解释
Many2one (多对一) many2one_b_id = fields.Many2one(‘关联模型的_name’)
One2many (一对多) one2many_a_ids = fields.One2many(‘关联模型的_name’,’关联模型的字段名’)
Many2many (多对多) many2many = fields.Many2many(‘关联模型的_name’)

6.模型书写的路径与配置

在安装的App目录下的models目录下的models.py文件下编写模型

当然为了以后的开发我们只须在models目录下创建一个.py文件,起名为你创建模型的类别,因为以后一个应用下有用户、管理员或者商品类等模型,那么我们就可以把这三个模型,分类,可以写成3个py文件而原本的models.py文件是可以删除的。
那么创建完之后需要在models目录下的__init__.py文件配置模型,不然不起作用。配置如下:

from . import 模型
若你的模型是user.py那么配置就是 from . import user 后面的.py不需要加上

7.模型的书写


写完模型记得在__init__导入,这个很重要!!!

  1. 如果是创建的文件一定不要省略最基本的导入,自动创建会自动存在这一个语句:
from odoo import models, fields, api
  1. 每个模型必须写成一个类,一般继承models.Model,这样才能使模型映射到数据库上
  2. 创建类的名称,使用大驼峰命名
  3. __ name为映射到数据库的名称,但是若有.的话,数据库显示是 _,用上图做例子:
    fruit_fruit_model
    后期操作(还是按照.的形式而不是_(sql语句与ir.model.access.csv用_)
    这里说一下比较好的模型名称书写:
    a.与class名字基本一致
    例如:
    class FruitModel()
    那么_name为:fruit.model
    b.例如上图test.test.model这个名字:
    第一个fruit指创建的应用,fruit与model指你命名的名称,单词之间用.连接,不要用_这是odoo的规范。
    这样的好处就是方便知道这个模型在那个应用,而且在用界面浏览的时候也能方便浏览到属于这个应用的模型

8.显示模型字段

当我们在模型之间设置多对一,一对多,多对多时,通常选择以及显示时会显示模型名称+id的形式,那样不便于我们选择及观看,故可以给他们规定一些字段来显示。

_rec_name 规定使用模型的字段值显示

注意这个字段是要在被绑定关系的一方进行设置(被选择)
这个例子为多对一,水果绑定了水果类型,水果类型属于被绑定

9.自定义字段

当然也可以样式字段来显示(详见odoo源码中的models.py,1573行)

重写源码中的name_get方法:

当然想在odoo中安装应用则需要写视图来让改应用暴露出来安装

10.模型中的ORM操作

当在系统手动CURD(增删查改)模型的字段时候可以让写一些判断,让系统做一些处理反馈给系统或者自动修改一些字段存入数据库:

  • 这里需要注意,这些方法在是默认存在的,但想在创建CURD的方法且自定义一些判断就得重写此类方法,这时要使用相应的装饰器修饰,才能起效果。
装饰器 解释
@api.model 模型层装饰器
@api.multi 记录集装饰器
@api.onchange 监控前端页面某个字段的变化
@api.depends 计算依赖
@api.constrains 约束,只支持简单字段,不支持关联字段

六、视图

构建完模型后需要写相应的视图让应用暴露出来安装模型才有效!
Odoo的视图文件不同于前端,它有自己的视图体系名为qweb格式为xml而不是html。
odoo的后台视图的主要组成部分:

视图名 解释
menu(菜单) 显示该应用的主要模块体系
form(表单) 创建、编辑、展示数据模型所用视图
tree(列表) 创建、编辑、展示数据模型时使用
action(动作窗口) 提供后台的点击窗口,展示action对应id的视图
search(搜索) 制定视图右上角对于当前数据模型的可搜索字段与可用过滤器

目录结构:
templates.xml与views.xml都是模板文件,提示我们该怎么书写视图,而里面的内容都是全部都注释了的,可以不用管,自己在views目录下新建.xml文件然后配置就行了。

1.menu(菜单)视图

菜单常见属性:

属性 解释
name 菜单显示名称
id 菜单id
action 视图窗口动作
parent 父级菜单(除了一级菜单)id
web_icon 图标(一级菜单)
sequence 菜单排序(小→大)

这里我习惯在views下创建一个menu.xml文件来书写菜单


基本结构:

  1. 一级菜单
    除了parent属性 其他都可以设置。
    一级菜单部分属性解释:
    action属性:
    写上某视图对应的action的id,这里的作用为类似html的首页,点进app就是先显示该页面,该属性看需求书写
    sequence属性:
    通常一级菜单只有一个可以不用排序
    web_icon属性:
    web_icon = “fruit,static/description/phone.png”
    test_app为模块
    后面的是图片路径,根据源码的书写统一都是在app下的这个路径存放
    注意:
    这里的模块和路径必须要用英文逗号隔开!

  1. 二级菜单
    相比一级菜单而言二级菜单就不需要写web_icon,其他基本都要写,除了该菜单下还有三级菜单时action属性不用写.
    二级菜单部分属性解释:
    action属性:
    若该菜单有三级菜单可以不用设置,否则在菜单栏上不会出现该菜单名
    parent属性:
    与上级菜单绑定,二级菜单的上级为一级菜单id
    sequence属性:
    菜单升序



  2. 三级菜单
    该菜单是附着二级菜单里面的。
    属性与二级菜单相似,唯一不同的是parent属性是绑定二级菜单的id


    当然还有四级菜单等…

2.form视图

form视图就是提供一个表单给你填写信息
我们需要在views下创建一个xml文件
这里我的命名规则是:模型文件+model+具体模型名称+view

页面基本结构如下:
黄色方框内的不许变动,红色方框内的是要显示的模型字段
1、第一个field的name="name"标签是网页的名字
2、第二个field的name="model"标签是模型的名字

白色方框为分组显示,后面会提到,这里别漏了group,否则在打开form表单时字段名称会不见且只有横线,如图

加了group标签后:

3.tree视图

如果是同一个模型的话就可以在同一个xml文件写,这样为了方便我们日后的修改。
tree视图与From的结构类似主要就是form标签的变换
如下图:

3.action窗口动作

终于到最关键的视图编写了,写了该视图那么应用安装就能显示在主页上了。
与tree视图同个道理,同一个模型下可写在同一个界面
主要结构如下:
第一处红色部分id必须要与menu的action一样,否则会报错
第二处红色部分就是进去将要需要展示的页面 可以是tree的id也可以是form的id,一般有form与tree视图,就展示tree视图

整个menu视图文件代码如下:

<?xml version="1.0" encoding="UTF-8" ?>
<odoo><!--  一级菜单  --><menuitem id="menu_fruit_app_root"name="水果"web_icon="fruit_app,static/description/icon.png"/><!--      二级菜单--><menuitem id="menu_fruit_app_model_fruit_model"name="水果模型"parent="menu_fruit_app_root"action="fruit_app_fruit_model_action"sequence="1"/><!--  三级菜单  --><!--  四级菜单  -->
</odoo>

整个模型视图文件代码如下:

<?xml version="1.0" encoding="UTF-8" ?>
<odoo><record model="ir.ui.view" id="fruit_model_form"><field name="name">水果模型</field><field name="model">fruit.fruit.model</field><field name="arch" type="xml"><form><sheet><group><field name="name"/><field name="fruit_model_id"/></group></sheet></form></field></record><record model="ir.ui.view" id="fruit_model_tree"><field name="name">水果模型</field><field name="model">fruit.fruit.model</field><field name="arch" type="xml"><tree><field name="name"/><field name="fruit_model_id"/></tree></field></record><record model="ir.actions.act_window" id="fruit_app_fruit_model_action"><field name="name">水果模型</field><field name="res_model">fruit.fruit.model</field><field name="view_type">form</field><field name="view_mode">tree,form</field><field name="view_id" eval="fruit_model_tree"/></record></odoo>

这里需要注意的是

七、安装APP

那么现在就可以安装APP了
第一步:
在该应用下的__manifest__.py文件

添加写好的menu.xml,与视图xml文件 ,将其余两个.xml注释掉,这两个文件是创建应用自带的,里面只有默认的注释所以不需要运行
这里需要注意:必须将menu放在所有视图文件的下面,假若有action视图动作,menu在上面会报错提示找不到该动作。

然后运行odoo框架,点击apps

搜索自己的应用,点击安装即可,注意我们在一级菜单上写的web_icon就是该应用的显示图标!!!

这时安装完了之后再主页面没有显示我们刚刚安装的应用图标。
那是因为,我们需要添加权限!
只有我们添加权限之后才能看到我们的应用。
那么我们就需要打开

这里系统会默认添加一条数据 告知我们怎么写 ,只需要改动就行了

红色框内的内容改为所创建的模型,注意我们命名的模型是.二这里需要改为_黄色方框是不能变动,最后的数字是权限控制.

我们添加完之后还得将在该应用下的__manifest__.py文件把data里面的.csv文件注释放开,然后重启odoo。

然后再升级APPS应用内升级即可


总结

odoo框架入门并不难,难的是要理解里面的系统逻辑以及需要结合源码自定义开发的模块。

最适合小白的Odoo12框架详解(更新完毕!!!有错请指正)相关推荐

  1. SLF4J和Logback日志框架详解

    SLF4J和Logback日志框架详解 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs 本文讲述SLF4J和Logback日志框架.    SLF4J是一 ...

  2. Django REST 框架详解 07 | 三大认证与权限六表

    文章目录 一.三大认证 1. 认证组件:校验用户 2. 权限组件:校验用户权限 3. 频率组件:限制视图接口被访问次数 4. 分析源码 二.权限六表 1. RBAC 认证 2. 权限三表 3. 权限五 ...

  3. jQuery Validate验证框架详解

    2019独角兽企业重金招聘Python工程师标准>>> 一.导入js库 <script type="text/javascript" src="& ...

  4. shiro放行_Shiro框架详解 tagline

    部分面试资料链接:https://pan.baidu.com/s/1qDb2YoCopCHoQXH15jiLhA 密码:jsam 想获得全部面试必看资料,关注公众号,大家可以在公众号后台回复" ...

  5. [Cocoa]深入浅出 Cocoa 之 Core Data(1)- 框架详解

    深入浅出 Cocoa 之 Core Data(1)- 框架详解 罗朝辉(http://blog.csdn.net/kesalin) CC 许可,转载请注明出处 Core data 是 Cocoa 中处 ...

  6. WebDriver自动化测试框架详解

    webDriver自动化测试框架详解 一. 简介 WebDriver API相对于Selenium Remote Control API来说,虽然同样是控制浏览器,但它的编程接口更加简洁 WebDri ...

  7. atitit.jQuery Validate验证框架详解与ati Validate 设计新特性

    atitit.jQuery Validate验证框架详解与ati Validate 设计新特性 1. AtiValidate的目标1 2. 默的认校验规则1 2.1. 使用方式 1.metadata用 ...

  8. Android 动画框架详解,第 1 部分

    2019独角兽企业重金招聘Python工程师标准>>> Android 平台提供了一套完整的动画框架,使得开发者可以用它来开发各种动画效果,本文将向读者阐述 Android 的动画框 ...

  9. springboot2整合mysql5_SpringBoot2整合SSM框架详解

    SpringBoot2整合SSM框架详解 发布时间:2019-01-15 21:33, 浏览次数:1218 , 标签: SpringBoot SSM <>开发环境 * 开发工具:Eclip ...

最新文章

  1. Hadoop自学笔记(二)HDFS简单介绍
  2. 吴恩达:AI未来将呈现四大发展趋势
  3. 解决Fedora 自己编译的内核不能运行Virtualbox的问题。
  4. Java关键字synchronized详解
  5. mysql停止服务命令_0789不停止MySQL服务重做备库的方法
  6. Chrome 开发者工具无法显示服务器正常返回的 HTTP 请求 - Failed to load response data
  7. flex 下对齐_CSS3中Flex弹性布局该如何灵活运用?
  8. 【电路补习笔记】5、三极管的参数与选型
  9. oracle深度巡检指标,oracle DBA 巡检项目
  10. 系统目录结构 ls命令 文件类型 alias命令
  11. 学习:MOSS2007 实现单点登陆(转)
  12. 苹果应用商店新增对“非公开上市”应用程序的支持
  13. MockWebServer--环境
  14. 数学建模竞赛常考四大模型总结【预测模型、分类模型、优化模型、评价模型】
  15. 三、用python实现平稳时间序列的建模
  16. win10 桌面的的文件都不见了 提示不注销保存都文件都为临时_在桌面上创建一个关机快捷方式,只需一条命令,关机速度大幅提升...
  17. 孙陶然将公司管理分为三个阶段
  18. 数字组合(算法竞赛进阶指南)
  19. wr703n 官方固件140120版本刷openwrt
  20. Spring-JdbcTemplate环境搭配及基本功能

热门文章

  1. 写一段有趣的科普文来介绍鲫鱼
  2. 本轮沙尘已跨过长江!这些地区请注意加强防范
  3. 你好,你是谁,可不可以向我出示源代码让我确认身份
  4. 数据库 - 字段属性
  5. 在Ubuntu 16.04中安装Google拼音
  6. 银河麒麟高级服务器v10 sp2 下fpm工具打包rpm
  7. python画图代码大全-纯干货:手把手教你用Python做数据可视化(附代码)
  8. 关于thinkphp写入缓存失败的原因
  9. Java使用QQ邮箱发送邮件
  10. maven添加sqljdbc4.jar,并引用