API 接口?
使用Web服务(Working with Web Services)?
鉴于OpenERP的架构,它不适合直接通过PostgreSQL客户端或者 ODBC 这样的连接方法访问数据库, 幸运的是,OpenERP提供了一个非常全面的web服务集,允许你通过标准协议做任何事情。
Note
虽然直接访问数据库,在技术上是可行的,你必须意识到这可能对您的数据造成灾难性的后果,除非你知道你是在做 什么。当你直接访问数据库的时候,建议您关闭OpenERP服务器,以避免缓存和并发问题。
支持的网络服务协议(Supported Web Services Protocols)?
目前支持的协议是XML-RPC和Net-RPC。XML-RPC是用于Web服务的第一批标准之一, 几乎可以再任何语言中使用。这是一个非常详细的协议,而且在需要的时候可以引入潜在位。 另一方面,Net-RPC是一个优化的协议,特别用在Python编写的应用程序之间。.
对于REST风格的web服务的支持在将来的OpenErp发布包中支持。
对于SOAP协议,目前的OPenErp已经不再支持,但是如果在社区有足够的爱好者的话将来可能恢复。
可用的Web服务(Available Web Services)?
OpenERP 为你提供了以下的Web服务.
Note
你能在服务的源码(/bin/service/web_services.py)的对应类里面找到每种服务的细节 .
db: 提供函数创建、删除、备份、恢复数据库. 请谨慎使用!
Technorati 标签: weberp,api,webservice,接口
common:
openerp,api,接口,webservice
让你登录和退出 OpenERP, 并且提供各种实用功能。你只有登录后才能使用其他的网络服务.
object: 这是最有用的网络服务,因为通过它可以访问 OpenERP 对象. 值得注意的是, 函数 “execute” 让你调用对象的方法, 比如可以搜索的大部分的ORM方法,读写记录。它也可以用来调用价格计算等对象的其他方法.
Note
主要的 ORM 方法一览:
create({‘field’:’value’})
创建一个具有指定值的新纪录
Returns: 新纪录的ID
search([(‘arg1’,’=’,’value1’)...], offset=0, limit=1000)
read([IDS], [‘field1’,’field2’,...])
write([IDS], {‘field1’:’value1’,’field2’:3})
values: 更新的字段的值
Updates 对给定的记录按照给定的值进行更新
Returns: True
unlink([IDS])
按照给定的IDS删除记录
Returns: True
通过 Web 服务不能使用 Browse() 函数.
另一个有用的功能是 “exec_workflow”, 它可以让你通过工作流制定记录的进展.
向导:
提供对旧式的向导。新风格的向导是基于ORM的,因此他们可以通过 “object” web 服务来进行访问.
报告:
让你生成和检索报告.
例子:通过Web服务写入数据(Example:writing data through the Web Service)?
下面是一个写数据的例子程序。在下一章你会发现关于多种编程语言 XML-RPC的更详尽的例子.
login: 在Web服务 “common” 中调用 “login” 函数,使用下面的参数:
database
user name
password
创建一个新的合作者: 在Web服务 “object” 中调用 “execute” 函数,使用下面的参数:
database
user id provided by “login” in step 1.
the object name : ‘res.partner’
the name of the ORM method : “create”
some data to be recorded
上面提到的数据都是键值对, 比如:
name: Fabien Pinckaers
lang: fr_FR
但是更复杂的数据结构也可以发送。比如你可以在一个单一的Web服务调用中创建一个合作者 和他的地址。在那种情况下,所有的数据在服务的相同的数据库事务中来处理。这意味. 着你一定要保存好你的数据一致性的状态。这是对所有ERP应用的关键要求.
XML-RPC Web服务(XML-RPC Web Services)?
XML-RPC 是一个著名的Web服务. Web 服务是一个工具,它可以再现有的网络基础设施上面设置分布式的应用程序。这些应用程序使用一种传输层的网络但是并不提供直接通过浏览器的人机界面。可扩展标记语言(XML)提供了描述远程过程调用(RPC)的词汇表,RPC是使用超文本传输协议(HTTP) 在计算机之间传输。实际上,RPC让各开发者自行定义网络调用中的接口。这些接口可以是很简单的一个函数调用也可以像大型API那样复杂.
XML-RPC 允许在两台或者更多运行不同操作系统和不同语言程序的计算机之间协同处理。比如,一个JAVA应用可以和一个Perl应用会谈,一个Perl应用可以同一个同ASP会谈的PYTHON应用会谈,等等。系统集成商往往在不同系统之间建立自己的连接,创建它们自己定义的格式的协议来进行通信,但是这造成了大量的不常使用的协议。RPC方法的程序员无需了解底层的协议、网络以及各种实施细则.
XML-RPC 可以同 Python, Java, Perl, PHP, C, C++, Ruby, Microsoft’s .NET 以及许多其他的编程语言来一起使用。它的实现被广泛用于 Unix, Linux, Windows 和 Macintosh 的平台.
一个 XML-RPC 调用实在双方之间进行的,客户端(调用程序)和服务器(被调用过程)。服务时提供在一个特定的URL上的,比如 (such as http://example.org:8080/rpcserv/).
上面我们只是接触了 XML-RPC 的表面. 我推荐 O’Reilly’s “Programming Web Service with XML-RPC” 进行进一步的学习。还可以阅读以下几个环节:
接口(InterFaces)?
XML-RPC?
XML-RPC 架构?
OpenERP 基于C/S体系结构。服务器和客户端之间的通信使用XML-RPC协议。XML-RPC是一个非常简单的协议,它允许客户端进行远程过程调用。被调用的函数,它的参数,调用结果通过XML编码并且使用HTTP进行传输。欲了解更多的关于XML-RPC的详尽信息,请参阅: http://www.xml-rpc.com.
架构(Architecture)?
下面的图标综合了OpenERP的客户端和服务器结构。OpenERP的服务器和客户端通信使用 XML-RPC.
客户端
OpenERP 的逻辑是在服务器端配置的。客户端是很简单的,它是仅用于POST的数据(forms, lists, trees)并且把结果发回服务器。新功能的更新和加入并不需要客户端的升级,这使得OpenERP更容易维护.
客户端并不明白POST的内容。即使像点击打印图标的行动时发送到服务器并且询问如何作出反应.
客户端的操作时很简单的,当客户发出一个动作(保存一个表格、打开一个目录、打印…)它发送动作到服务器。然后服务器执行客户端的请求并将结果发送回来.
下面是三种行为;
Python?
通过 xml-rpc 获取数据?
代码示例?
import xmlrpclib
username = 'admin' # OpenERP 登陆用户
pwd = 'admin' # 登陆密码
dbname = 'terp' # OpenERP 帐套
# Get the uid
sock_common = xmlrpclib.ServerProxy ('http://localhost:8069/xmlrpc/common')
uid = sock_common.login(dbname, username, pwd)
#replace localhost with the address of the server
sock = xmlrpclib.ServerProxy('http://localhost:8069/xmlrpc/object')
partner = {
'name': 'Fabien Pinckaers',
'lang': 'fr_FR',
}
partner_id = sock.execute(dbname, uid, pwd, 'res.partner', 'create', partner)
address = {
'partner_id': partner_id,
'type' : 'default',
'street': 'Chaussée de Namur 40',
'zip': '1367',
'city': 'Grand-Rosière',
'phone': '+3281813700',
'fax': '+3281733501',
}
address_id = sock.execute(dbname, uid, pwd, 'res.partner.address', 'create', address)
查询业务伙伴
args = [('vat', '=', 'ZZZZZZ')] # 查询过滤条件
ids = sock.execute(dbname, uid, pwd, 'res.partner', 'search', args)
读取业务伙伴数据
fields = ['name', 'active', 'vat', 'ref'] # 需要读取的数据字段
data = sock.execute(dbname, uid, pwd, 'res.partner', 'read', ids, fields) #ids is a list of id
更新业务伙伴数据
values = {'vat': 'ZZ1ZZZ'} # 待更新数据Dictionary
result = sock.execute(dbname, uid, pwd, 'res.partner', 'write', ids, values)
删除业务伙伴
# ids : 待删除业务伙伴id列表
result = sock.execute(dbname, uid, pwd, 'res.partner', 'unlink', ids)
PHP?
通过 xml-rpc 获取数据?
下载 XML-RPC PHP Library
windows / linux: 从 http://phpxmlrpc.sourceforge.net/ 上下载xmlrpc框架,目前最新的正式版本是2007年2月25日发行的2.2版本
配置 PHP XML-RPC Library
从xmlrpc-2.2.tar.gz 解压出xmlrpc.inc 文件,把这个文件放到php函数库文件夹中,重启apache/iis 服务器
代码示例
function connect() {
var $user = 'admin';
var $password = 'admin';
var $dbname = 'db_name';
var $server_url = 'http://localhost:8069/xmlrpc/';
if(isset($_COOKIE["user_id"]) == true) {
if($_COOKIE["user_id"]>0) {
return $_COOKIE["user_id"];
}
}
$sock = new xmlrpc_client($server_url.'common');
$msg = new xmlrpcmsg('login');
$msg->addParam(new xmlrpcval($dbname, "string"));
$msg->addParam(new xmlrpcval($user, "string"));
$msg->addParam(new xmlrpcval($password, "string"));
$resp = $sock->send($msg);
$val = $resp->value();
$id = $val->scalarval();
setcookie("user_id",$id,time()+3600);
if($id > 0) {
return $id;
}else{
return -1;
}
}
/**
* $client = xml-rpc handler
* $relation = name of the relation ex: res.partner
* $attribute = name of the attribute ex:code
* $operator = search term operator ex: ilike, =, !=
* $key=search for
*/
function search($client,$relation,$attribute,$operator,$keys) {
var $user = 'admin';
var $password = 'admin';
var $userId = -1;
var $dbname = 'db_name';
var $server_url = 'http://localhost:8069/xmlrpc/';
$key = array(new xmlrpcval(array(new xmlrpcval($attribute , "string"),
new xmlrpcval($operator,"string"),
new xmlrpcval($keys,"string")),"array"),
);
if($userId<=0) {
connect();
}
$msg = new xmlrpcmsg('execute');
$msg->addParam(new xmlrpcval($dbname, "string"));
$msg->addParam(new xmlrpcval($userId, "int"));
$msg->addParam(new xmlrpcval($password, "string"));
$msg->addParam(new xmlrpcval($relation, "string"));
$msg->addParam(new xmlrpcval("search", "string"));
$msg->addParam(new xmlrpcval($key, "array"));
$resp = $client->send($msg);
$val = $resp->value();
$ids = $val->scalarval();
return $ids;
}
new xmlrpcval('Fabien Pinckaers', "string") ,
'vat'=>new xmlrpcval('BE477472701' , "string")
);
$client = new xmlrpc_client("http://localhost:8069/xmlrpc/object");
$msg = new xmlrpcmsg('execute');
$msg->addParam(new xmlrpcval("dbname", "string"));
$msg->addParam(new xmlrpcval("3", "int"));
$msg->addParam(new xmlrpcval("demo", "string"));
$msg->addParam(new xmlrpcval("res.partner", "string"));
$msg->addParam(new xmlrpcval("create", "string"));
$msg->addParam(new xmlrpcval($arrayVal, "struct"));
$resp = $client->send($msg);
if ($resp->faultCode())
echo 'Error: '.$resp->faultString();
else
echo 'Partner '.$resp->value()->scalarval().' created !';
?>
/**
* $client = xml-rpc handler
* $relation = name of the relation ex: res.partner
* $attribute = name of the attribute ex:code
* $operator = search term operator ex: ilike, =, !=
* $id = id of the record to be updated
* $data = data to be updated
*/
function write($client,$relation,$attribute,$operator,$data,$id) {
var $user = 'admin';
var $password = 'admin';
var $userId = -1;
var $dbname = 'db_name';
var $server_url = 'http://localhost:8069/xmlrpc/';
$id_val = array();
$id_val[0] = new xmlrpcval($id, "int");
if($userId<=0) {
connect();
}
$msg = new xmlrpcmsg('execute');
$msg->addParam(new xmlrpcval($dbname, "string"));
$msg->addParam(new xmlrpcval($userId, "int"));
$msg->addParam(new xmlrpcval($password, "string"));
$msg->addParam(new xmlrpcval($relation, "string"));
$msg->addParam(new xmlrpcval("write", "string"));
$msg->addParam(new xmlrpcval($id, "array"));
$msg->addParam(new xmlrpcval($data, "struct"));
$resp = $client->send($msg);
$val = $resp->value();
$record = $val->scalarval();
return $record;
}
JAVA?
通过 xml-rpc 获取数据?
下载 JAVA XML-RPC Library
从 http://ws.apache.org/xmlrpc/ 上下载java xmlrpc框架,目前最新版本是2007年8月发布的3.1版本. All OpenERP errors throw exceptions because the framework allows only an int as the error code where OpenERP returns a string.
代码示例
import java.net.URL;
import java.util.Vector;
import org.apache.commons.lang.StringUtils;
import org.apache.xmlrpc.XmlRpcException;
import org.apache.xmlrpc.client.XmlRpcClient;
import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;
public Vector getDatabaseList(String host, int port)
{
XmlRpcClient xmlrpcDb = new XmlRpcClient();
XmlRpcClientConfigImpl xmlrpcConfigDb = new XmlRpcClientConfigImpl();
xmlrpcConfigDb.setEnabledForExtensions(true);
xmlrpcConfigDb.setServerURL(new URL("http",host,port,"/xmlrpc/db"));
xmlrpcDb.setConfig(xmlrpcConfigDb);
try {
//Retrieve databases
Vector params = new Vector();
Object result = xmlrpcDb.execute("list", params);
Object[] a = (Object[]) result;
Vector res = new Vector();
for (int i = 0; i < a.length; i++) {
if (a[i] instanceof String)
{
res.addElement((String)a[i]);
}
}
catch (XmlRpcException e) {
logger.warn("XmlException Error while retrieving OpenERP Databases: ",e);
return -2;
}
catch (Exception e)
{
logger.warn("Error while retrieving OpenERP Databases: ",e);
return -3;
}
}
import java.net.URL;
import org.apache.commons.lang.StringUtils;
import org.apache.xmlrpc.XmlRpcException;
import org.apache.xmlrpc.client.XmlRpcClient;
import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;
public int Connect(String host, int port, String tinydb, String login, String password)
{
XmlRpcClient xmlrpcLogin = new XmlRpcClient();
XmlRpcClientConfigImpl xmlrpcConfigLogin = new XmlRpcClientConfigImpl();
xmlrpcConfigLogin.setEnabledForExtensions(true);
xmlrpcConfigLogin.setServerURL(new URL("http",host,port,"/xmlrpc/common"));
xmlrpcLogin.setConfig(xmlrpcConfigLogin);
try {
//Connect
params = new Object[] {tinydb,login,password};
Object id = xmlrpcLogin.execute("login", params);
if (id instanceof Integer)
return (Integer)id;
return -1;
}
catch (XmlRpcException e) {
logger.warn("XmlException Error while logging to OpenERP: ",e);
return -2;
}
catch (Exception e)
{
logger.warn("Error while logging to OpenERP: ",e);
return -3;
}
}
查询业务伙伴
TODO
创建业务伙伴
TODO
更新业务伙伴
TODO
Python 代码示例?
创建合作伙伴和他们的地址的例子.
import xmlrpclib
sock = xmlrpclib.ServerProxy('http://localhost:8069/xmlrpc/object')
uid = 1
pwd = 'demo'
partner = {
'title': 'Monsieur',
'name': 'Fabien Pinckaers',
'lang': 'fr',
'active': True,
}
partner_id = sock.execute(dbname, uid, pwd, 'res.partner', 'create', partner)
address = {
'partner_id': partner_id,
'type': 'default',
'street': 'Rue du vieux chateau, 21',
'zip': '1457',
'city': 'Walhain',
'phone': '(+32)10.68.94.39',
'fax': '(+32)10.68.94.39',
}
sock.execute(dbname, uid, pwd, 'res.partner.address', 'create', address)
用下面的脚本来获得用户的 UID :
sock = xmlrpclib.ServerProxy('http://localhost:8069/xmlrpc/common')
UID = sock.login('terp3', 'admin', 'admin')
CRUD(创建/读取/更新/删除)代码示例:
"""
:The login function is under
:: http://localhost:8069/xmlrpc/common
:For object retrieval use:
:: http://localhost:8069/xmlrpc/object
"""
import xmlrpclib
user = 'admin'
pwd = 'admin'
dbname = 'terp3'
model = 'res.partner'
sock = xmlrpclib.ServerProxy('http://localhost:8069/xmlrpc/common')
uid = sock.login(dbname ,user ,pwd)
sock = xmlrpclib.ServerProxy('http://localhost:8069/xmlrpc/object')
# CREATE A PARTNER
partner_data = {'name'.. code-block:: php:'Tiny', 'active':True, 'vat':'ZZZZZ'}
partner_id = sock.execute(dbname, uid, pwd, model, 'create', partner_data)
# The relation between res.partner and res.partner.category is of type many2many
# To add categories to a partner use the following format:
partner_data = {'name':'Provider2', 'category_id': [(6,0,[3, 2, 1])]}
# Where [3, 2, 1] are id fields of lines in res.partner.category
# SEARCH PARTNERS
args = [('vat', '=', 'ZZZZZ'),]
ids = sock.execute(dbname, uid, pwd, model, 'search', args)
# READ PARTNER DATA
fields = ['name', 'active', 'vat', 'ref']
results = sock.execute(dbname, uid, pwd, model, 'read', ids, fields)
print results
# EDIT PARTNER DATA
values = {'vat':'ZZ1ZZ'}
results = sock.execute(dbname, uid, pwd, model, 'write', ids, values)
# DELETE PARTNER DATA
results = sock.execute(dbname, uid, pwd, model, 'unlink', ids)
PRINT(打印) 示例代码:
打印发票
IDS is the invoice ID, as returned by:
ids = sock.execute(dbname, uid, pwd, ‘account.invoice’, ‘search’, [(‘number’, ‘ilike’, invoicenumber), (‘type’, ‘=’, ‘out_invoice’)])
import time
import base64
printsock = xmlrpclib.ServerProxy('http://server:8069/xmlrpc/report')
model = 'account.invoice'
id_report = printsock.report(dbname, uid, pwd, model, ids, {'model': model, 'id': ids[0], 'report_type':'pdf'})
time.sleep(5)
state = False
attempt = 0
while not state:
report = printsock.report_get(dbname, uid, pwd, id_report)
state = report['state']
if not state:
time.sleep(1)
attempt += 1
if attempt>200:
print 'Printing aborted, too long delay !'
string_pdf = base64.decodestring(report['result'])
file_pdf = open('/tmp/file.pdf','w')
file_pdf.write(string_pdf)
file_pdf.close()
PHP 代码示例?
下面的例子是如何使用 PHP 创建一个合作伙伴. 这里使用 phpxmlrpc 库, 在 sourceforge 上有效.
new xmlrpcval('Fabien Pinckaers', "string") ,
'vat'=>new xmlrpcval('BE477472701' , "string")
);
$client = new xmlrpc_client("http://localhost:8069/xmlrpc/object");
$msg = new xmlrpcmsg('execute');
$msg->addParam(new xmlrpcval("dbname", "string"));
$msg->addParam(new xmlrpcval("3", "int"));
$msg->addParam(new xmlrpcval("demo", "string"));
$msg->addParam(new xmlrpcval("res.partner", "string"));
$msg->addParam(new xmlrpcval("create", "string"));
$msg->addParam(new xmlrpcval($arrayVal, "struct"));
$resp = $client->send($msg);
if ($resp->faultCode())
echo 'Error: '.$resp->faultString();
else
echo 'Partner '.$resp->value()->scalarval().' created !';
?>
Perl 代码示例?
下面的例子是使用 Perl 创建、查找、删除一个合作伙伴.
#!c:/perl/bin/perl
# 17-02-2010
# OpenERP XML RPC communication example
# Todor Todorov
use strict;
use Frontier::Client;
use Data::Dumper;
my($user) = 'admin';
my($pw) = 'admin';
my($db) = 'put_your_dbname_here';
my($model) = 'res.partner';
#登录
my $server_url = 'http://localhost:8069/xmlrpc/common';
my $server = Frontier::Client->new('url' => $server_url);
my $uid = $server->call('login',$db,$user,$pw);
print Dumper($uid);
my $server_url = 'http://localhost:8069/xmlrpc/object';
my $server = Frontier::Client->new('url' => $server_url);
print Dumper($server);
#
# 创建合作伙伴
#
my $partner_data = {'name'=>'MyNewPartnerName',
'active'=> 'True',
'vat'=>'ZZZZZ'};
my $partner_id = $server->call('execute',$db, $uid, $pw, $model, 'create', $partner_data);
print Dumper($partner_id);
#
# 搜索合作伙伴
#
my $query = [['vat', '=', 'ZZZZZ']];
print Dumper($query);
my $ids = $server->call('execute',$db, $uid, $pw, $model, 'search', $query);
print Dumper($ids);
#这里等待用户输入
#OpenERP interface my be checked if partner is shown there
print $/."Check OpenERP if partner is inserted. Press ENTER".$/;
;
#
# 删除合作伙伴
#
my $results = $server->call('execute',$db, $uid, $pw, $model, 'unlink', $ids);
print Dumper($results);
在 OpenERP 的 GTK 或 web 客户端的一切活动都是通过 XML/RPC webservices. 启动 openERP GTK 客户端 使用 ./openerp-client.py -l debug_rpc (or debug_rpc_answer) 然后你可以在 GTK 客户端操作,查看客户端操作日志, 你将看到webservice的标签。通过在日志中创建缩进将帮助您 找出它的web服务.
你可能感兴趣的:(odo,odoo)
全球第一开源ERP软件Odoo 安装和初始设置指南
weixin_44793763
odoo 安装和初始设置 ERP 软件
1.1Odoo的结构Odoo使用Web浏览器来访问Odoo服务,因此你的Odoo服务器可以部署在较远的地方(如另外一个城市),用户的计算机上只需安装谷歌、火狐或IE9以上的浏览器,所以Web客户端不需要特别的维护。一个Odoo系统由两个主要的组件组成:1)数据库服务器PostgreSQL,它包含了所有的数据库,每个数据库都包含了部分Odoo系统设置和全部客户数据。2)Odoo应用服务,Odoo应用
1.1 Ubuntu 22.04上从源代码安装Odoo17
山上春
Odoo17学习 ubuntu linux 运维
在企业数字化转型的浪潮中,Odoo作为一款强大的开源企业资源规划(ERP)软件,备受关注。今天,我们将深入探讨如何在Ubuntu22.04操作系统上从源代码安装Odoo,并详细解释每个步骤背后的原理。一、前期准备1.系统选择建议使用LinuxUbuntu操作系统进行Odoo的安装。这是因为Odoo在其所有测试、调试和企业版安装中都使用该系统,而且大多数Odoo开发者也使用GNU/Linux发行版,
odoo17 4模型视图理解
山上春
Odoo17学习 java 前端 odoo
XML代码结构概览这段XML代码定义了my_hostel模块中hostel.hostel模型的两个视图:列表视图(treeview)和表单视图(formview),以及一个动作(action)和两个菜单项(menuitem)。整体框架:XML文件的根元素,表示这是一个Odoo的XML配置文件。:包含所有Odoo记录(records)的容器。这些记录通常是视图,动作,菜单项等。记录(record)的
如何配置 PostgreSQL 允许远程连接 - 以 Odoo 数据库为例
山上春
数据库 postgresql linux github ubuntu git
如何配置PostgreSQL允许远程连接-以Odoo数据库为例问题背景在使用Odoo时,我们经常需要通过远程工具(如DataGrip、pgAdmin等)连接数据库进行管理和查询。然而,PostgreSQL默认只允许本地连接,需要进行适当的配置才能实现远程访问。本文将详细介绍如何配置PostgreSQL以允许远程连接。环境说明操作系统:Linux(Ubuntu/Debian)PostgreSQL版本
odoo初始化数据库
山上春
数据库 odoo
在Odoo中,初始化数据库的命令会因使用的环境和启动方式而有所不同,下面为你详细介绍几种常见的初始化数据库的方式。1.使用命令行工具初始化在命令行中,你可以使用Odoo的启动脚本并结合相关参数来初始化数据库。以下是基本的命令格式:odoo-bin-d--db_user--db_password--db_host--db_port--initall--without-demoall参数说明:-d:指
Odoo软件二次开发:Odoo自动化测试与持续集成
kkchenjj
工业软件二次开发全集 ci/cd 工业软件 ERP 开发语言
Odoo软件二次开发:Odoo自动化测试与持续集成Odoo自动化测试基础自动化测试的重要性在软件开发过程中,自动化测试扮演着至关重要的角色。它不仅提高了测试的效率和准确性,还减少了人为错误,确保了软件质量。对于Odoo这样的复杂ERP系统,自动化测试更是必不可少,因为它可以帮助开发者快速定位问题,确保在进行二次开发时,新功能的加入不会影响现有系统的稳定性。Odoo测试框架介绍Odoo的测试框架基于
【AI+智造】基于阿里云Ubuntu24.04系统,使用Ollama部署开源DeepSeek模型并集成到企业微信
邹工转型手札
Duodoo开源 Odoo18开源 企业信息化 制造 人工智能 数据分析
作者:Odoo技术开发/资深信息化负责人日期:2025年2月28日本方案结合了本地部署与云服务调用的技术路径,涵盖部署步骤、集成逻辑及关键问题点,适用于企业级AI应用场景。一、方案背景与架构设计1.技术选型背景DeepSeek模型:作为开源大模型,支持文本生成、智能问答等场景,适合企业知识库与自动化服务。Ollama工具:轻量化本地模型部署框架,支持一键拉取模型镜像并启动API服务。企业微信集成:
【AI+智造】用DeepSeek支持设备温度、振动、速度、加速度量化数据的应用方案——以常州新能源动力电池制造企业为例
邹工转型手札
Duodoo开源 企业信息化 Odoo18开源 人工智能 制造 数据分析
作者:Odoo技术开发/资深信息化负责人日期:2025年2月25日一、常州制造业特点与行业选择依据常州作为“中国新能源之都”,其制造业的核心竞争力体现在新能源产业链的垂直整合能力、智能化升级需求以及科创资源的集聚效应。2024年,常州新能源产业规模突破8500亿元,动力电池产业链完整度高达97%,产业集聚度全国第三,投资热度连续三年全国第一。以动力电池行业为例,其生产设备需高精度控制温度、振动、速
【AI+智造】基于DeepSeek的船舶海工设备多维度数据分析技术方案——以南通船舶制造企业为例
邹工转型手札
企业信息化 Duodoo开源 Odoo18开源 人工智能 制造 数据分析
作者:Odoo技术开发/资深信息化负责人日期:2025年2月25日以下技术方案基于南通市制造业特点,结合船舶海工行业实际应用场景,针对设备数据量化分析需求展开论述。全文以技术可行性、行业适配性及实施路径为核心,深度整合区域产业特征与数字化技术解决方案。一、南通制造业特点与船舶海工行业背景1.南通制造业特征分析南通市作为长三角制造业重镇,已形成"传统产业+新兴产业+未来产业"的三级发展体系,2024
如何配置 PostgreSQL 允许远程连接 - 以 Odoo 数据库为例
m0_74823842
面试 学习路线 阿里巴巴 数据库 postgresql
如何配置PostgreSQL允许远程连接-以Odoo数据库为例问题背景在使用Odoo时,我们经常需要通过远程工具(如DataGrip、pgAdmin等)连接数据库进行管理和查询。然而,PostgreSQL默认只允许本地连接,需要进行适当的配置才能实现远程访问。本文将详细介绍如何配置PostgreSQL以允许远程连接。环境说明操作系统:Linux(Ubuntu/Debian)PostgreSQL版本
使用Odoo Shell卸载模块
odoo中国
odoo odoo 开源软件 erp
使用OdooShell卸载模块我们在Odoo使用过程中,因为模块安装错误或者前端错误等导致odoo无法通过界面登录,这时候你可以使用OdooShell来卸载模块。OdooShell是一个交互式Pythonshell,允许你直接与Odoo数据库和模型进行交互。以下是使用OdooShell卸载模块的详细步骤:步骤1:启动OdooShell要启动OdooShell,你需要在终端中运行以下命令。确保你已经
数字化转型实战:Odoo+工业物联网技术破解江苏食品制造行业三大核心痛点
邹工转型手札
风吟九宵 Duodoo开源 企业信息化 运维 人工智能 制造
行业背景与挑战江苏省作为中国食品工业产值前三强省份,拥有光明乳业、雨润食品等龙头企业及近2000家中小型食品制造企业。2023年江苏省食品工业协会调研显示:行业平均设备综合效率(OEE)仅为62.3%月度异常停机时间达42小时/产线质量追溯周期超过3.5小时库存周转天数高于行业标杆企业27%在实地调研南京某糕点生产企业时发现,其ERP系统与生产设备存在严重数据断层:车间主任需每天手工录入6类表单、
如何在 Odoo 18 中向聊天窗口(Chatter)添加自定义按钮
odoo中国
odoo odoo 开源软件 python erp
如何在Odoo18中向聊天窗口(Chatter)添加自定义按钮在Odoo中,提升用户体验通常涉及对聊天窗口的定制——聊天窗口是针对特定记录进行交流和更新的集中平台。在聊天窗口中添加自定义按钮可以显著简化操作流程,使用户能够直接在界面中执行特定操作,例如触发工作流或生成报告。本文将指导您如何在Odoo18中向聊天窗口添加按钮,涵盖必要的步骤和代码片段,帮助您定制此功能以更好地满足业务需求并提高整体效
钢铁行业设备智能运维实战:基于DuodooBMS+SKF的减速机全生命周期管理方案
邹工转型手札
风吟九宵 企业信息化 Duodoo开源 运维 数据库 人工智能 制造 开源
(导语:在钢铁行业"设备即产能"的竞争格局下,某大型钢铁集团通过DuodooBMS+SKFObseverPhoenixAPI系统实现核心设备预测性维护,热轧产线非计划停机减少42%,设备综合效率OEE提升17%)一、钢铁企业设备管理之痛某年产800万吨的钢铁联合企业热轧车间,12台关键减速机连续发生异常磨损事故:2023年Q1因1#摆剪减速机轴承失效导致非计划停机23小时,直接损失超200万元传统
基于Odoo的数据中台建设:助力企业数据驱动决策
邹工转型手札
风吟九宵 Duodoo开源 企业信息化 人工智能 开源 制造
在数字化时代,数据已成为企业最宝贵的资产之一。数据中台作为企业数字化转型的核心,承担着整合数据资源、优化业务流程、提升决策效率的重要使命。Odoo作为全球领先的开源ERP系统,凭借其强大的数据整合与分析能力,正在成为企业构建数据中台的理想选择。一、数据中台的重要性数据中台是企业实现数据驱动决策的关键基础设施。它通过打破数据孤岛,整合来自不同业务系统的数据,为企业提供了一个统一的数据管理和分析平台。
开源ERP系统odoo的安装与配置
catmes
开源 ERP python postgresql OpenERP
开源ERP系统odoo的安装与配置安装下载源码安装PostgreSQL安装Python3下载odoo依赖配置启动安装安装方式有两种:分发包安装:https://www.odoo.com/documentation/16.0/administration/install/packages.html源码安装:https://www.odoo.com/documentation/16.0/adminis
【DuodooBMS】基于Odoo的开源制造执行系统——以开源之力,驱动智能制造
邹工转型手札
Duodoo开源 Odoo 企业信息化 开源 制造 人工智能
以用户为中心的开放式智造平台DuodooMES的设计始终围绕“用户可编程、生态可生长”的核心思想,打破传统工业软件的封闭性,让制造企业真正成为系统的“主人”:1.用户可编程:生产流程由你定义界面可配置:无需代码即可拖拽生成车间看板、报表模板,适配不同岗位的操作习惯(如质检员聚焦缺陷统计,班组长关注工单进度)。逻辑可编排:通过低代码工具自定义业务规则,例如“当设备温度超限时,自动触发停机指令并通知维
江苏地区电子制造行业首选的设备运行监测系统SKF IMAX-8边缘计算盒子与DuodooBMS实现高效预测性维护
邹工转型手札
Duodoo开源 企业信息化 开源 开源 人工智能 制造
引言在电子制造行业中,设备高精度、高复杂度、高频率换线的生产特点对设备稳定性提出了严苛要求。传统维护方式依赖人工巡检和定期检修,存在响应滞后、成本高昂等问题。预测性维护(PredictiveMaintenance,PdM)通过实时数据分析和AI算法,能够提前识别设备潜在故障,大幅降低停机风险。然而,实现这一目标需要解决设备数据采集、边缘实时计算、平台深度融合等关键问题。本文将结合SKFIMAX-8
江苏地区纺织机械行业首选的设备运行监测系统基于SKF IMAX-8与开源DuodooBMS的纺织机械预测性维护全流程方案
邹工转型手札
Duodoo开源 企业信息化 开源 开源 制造 人工智能
引言:工业设备维护的数字化转型挑战纺织机械行业面临高湿度、高粉尘、连续运行等严苛工况,传统定期维护模式存在效率低、成本高、故障响应滞后等问题。预测性维护(PdM)通过实时数据分析与AI模型预测设备健康状态,成为行业降本增效的关键路径。然而,如何实现从边缘数据采集到云平台分析的深度融合,仍是技术落地的难点。本文将结合SKFIMAX-8边缘计算盒子与开源DuodooBMS(基于Odoo的设备数采方案)
《手札·开源篇》Odoo系统与SKF Observer Phoenix API双向对接方案
邹工转型手札
企业信息化 风吟九宵 开源 开源 python 制造
Odoo系统与SKFObserverPhoenixAPI双向对接方案一、方案设计概述(一)目标实现Odoo设备维护模块与SKFObserverPhoenix的传感器数据双向同步:Odoo→SKF:推送维护工单状态、设备档案信息。SKF→Odoo:同步设备传感器数据(振动、温度、转速等)和预测性维护建议。(二)技术架构Odoo端:使用XML-RPC/JSON-RPC接口对外暴露API,并通过自定义模
《手札·数转篇》开源Odoo软件与SKF Observer API钢铁厂双向集成方案
邹工转型手札
企业信息化 风吟九宵 Odoo 开源 python 制造
一、项目背景在钢铁厂的生产环境中,设备的稳定运行、质量控制以及数据采集是确保生产效率和产品质量的关键。开源Odoo软件提供了强大的维护模块、质量模块和数据采集(数采)模块,结合SKFObserverAPI,可以实现设备状态监测、质量数据同步以及生产数据的实时采集与分析,从而提升钢铁厂的智能化管理水平。二、集成目标设备维护模块集成:通过Odoo维护模块与SKFObserverAPI对接,实时获取设备
《手札·行业篇》开源Odoo MES系统与SKF Observer Phoenix API双向对接方案
邹工转型手札
风吟九宵 Odoo 开源 开源 python 制造
一、项目背景江苏省作为中国重要的制造业基地,钢铁行业在其中占据重要地位。随着工业4.0的推进,钢铁厂需要通过智能化手段提升生产效率、降低设备故障率、优化质量控制。开源OdooMES系统与SKFObserverPhoenixAPI的双向对接,能够实现设备状态监测、生产数据采集和质量控制的自动化与智能化,为江苏钢铁行业提供高效、透明的生产管理解决方案。二、集成目标设备状态监测:通过SKFObserve
odoo qweb模板文件t-学习最新总结
信息化未来
odoo15 owl学用笔记 利用开源 打造自己实用ERP python
模板文件常用的-t意义Odoo中有相当多的视图,挂件等组件,在产品拥有个性化定制需求的时候,我们要修改某些widgets或者classes,那么就需要理解Odoo中前端框架的JS架构,并且掌握继承JS的方法。js要与xml配套来学,先看下模板中的标签(以"t-"开始)的意义,以利于快速理解学习。t-name用于指明模板的名称,t-call用于调用另外模板,后面带一个模板的名称t-extend用于指
DeepSeek与Odoo融合,赋能企业智慧运营
odoo中国
人工智能 odoo 开源软件 deep learning python
在数字化浪潮席卷全球的今天,企业不仅要应对日益复杂的市场环境,还需要不断提升内部管理效率。作为一款流行的开源ERP系统,Odoo已经在帮助企业优化资源配置、提高运营效率方面发挥了重要作用。但随着人工智能技术的快速发展,传统的业务处理模式已难以满足现代企业的需求。深度求索(DeepSeek)这样的前沿AI公司,凭借其强大的模型能力和丰富的行业经验,为企业提供了完善的人工智能解决方案。DeepSeek
《手札·开源篇》从开源到商业化:中小企业的低成本数字化转型路径 ——以Odoo为数据中台低成本实现售前售中一体化
OpenCoze开源扣子
CodeLychee 风吟九宵 开源 开源
某机电设备有限公司数字化转型案例:以Odoo为数据中台实现售前售中一体化一、企业背景某机电设备有限公司在机电设备领域历经多年发展,业务广泛,涵盖工业自动化设备、电力设备等产品的销售与服务。随着业务版图不断拓展,企业面临着业务流程繁杂、数据分散等难题。公司此前采用金蝶ERP进行财务、生产等后端管理,利用纷享销客CRM进行客户关系及销售流程管理。但二者之间缺乏有效数据互通,致使售前到售中环节存在信息脱
《手札·开源篇》从开源到商业化:中小企业的低成本数字化转型路径 ——SKF轴承贸易商的十年信息化演进启示
OpenCoze开源扣子
CodeLychee 风吟九宵 开源 开源
一、战略驱动的数字化演进逻辑在轴承行业利润持续走低的背景下,我们选择了一条"开源筑基-场景突破-数据驱动"的演进路径。从2013年金蝶EAS的基础供应链管理,到2023年实现车间设备全要素数字化,系统建设始终遵循"业务场景驱动、数据价值反哺"的核心原则。在Odoo开源ERP基础上,我们构建了涵盖CRM、WMS、MES的完整数字化链条,支撑企业年产值实现翻倍增长。二、双中台架构的实践路径业务中台化改
【零散技术】MAC 安装多版本node
Odoo穆尘
前端 macos
时间是我们最宝贵的财富,珍惜手上的每个时分不同前端项目运行的node版本不一致,会导致无法运行,就像Odoo也需要依据版本使用对应的python环境。python可以用conda随时切换版本,那么Node可以吗?答案是肯定的。1、安装n(类似于conda的工具,单一字符还是很特别)npminstall-gn2、安装nodesudo-En14.21.3版本参照表Node.jsVersionRelea
【odoo】odoo基本视图中的kanban视图
种花的人_
odoo python
文章目录概要看板视图的基本特点:看板视图的工作流程:看板视图的优点:举个例子关键要素解析总结概要Odoo看板视图(KanbanView)是Odoo中的一种可视化视图,它通常用于管理任务、项目、销售机会、库存管理等业务流程。看板视图的设计灵感来源于“看板管理”方法,这种方法源于日本丰田汽车生产体系,它注重流程的可视化和任务的快速流转。通过看板视图,用户可以更直观地查看工作状态、追踪任务进度,并快速对
【odoo】odoo 公共方法的设计与实现
种花的人_
odoo python
Odoo公共方法的设计与实现1.功能需求2.seController类分析2.1res_ok方法:返回成功响应2.2res_err方法:返回错误响应2.3res_exception方法:捕获并返回异常2.4json_default方法:自定义JSON序列化2.5错误码字典error_code3.总结在Odoo开发中,我们常常需要编写一些通用的功能方法,这些方法可以帮助我们更高效地处理数据格式化、错
用ODOO11后,Odoo12令人期待的新特性
zzlyx99
Odoo12 Odoo12
Odoo12版本有许多令人期待的改进,必将成为一个重要改进版本,以下是odoo12主要改进:1)物联网盒子(IoTBox)-IoTBox(IoT物联网)是一个数据收集网关,可以部署在生产环境中(例如,工艺路线某个节点上)收集数据并更新Odoo工单或者进行其他类似操作。2)报表设计器(OdooStudio内置)-有odoo实施经验的小伙伴都知道,odoo的基于XML的报表设计效率较低,需要很长时间开
ios内付费
374016526
ios 内付费
近年来写了很多IOS的程序,内付费也用到不少,使用IOS的内付费实现起来比较麻烦,这里我写了一个简单的内付费包,希望对大家有帮助。
具体使用如下:
这里的sender其实就是调用者,这里主要是为了回调使用。
[KuroStoreApi kuroStoreProductId:@"产品ID" storeSender:self storeFinishCallBa
20 款优秀的 Linux 终端仿真器
brotherlamp
linux linux视频 linux资料 linux自学 linux教程
终端仿真器是一款用其它显示架构重现可视终端的计算机程序。换句话说就是终端仿真器能使哑终端看似像一台连接上了服务器的客户机。终端仿真器允许最终用户用文本用户界面和命令行来访问控制台和应用程序。(LCTT 译注:终端仿真器原意指对大型机-哑终端方式的模拟,不过在当今的 Linux 环境中,常指通过远程或本地方式连接的伪终端,俗称“终端”。)
你能从开源世界中找到大量的终端仿真器,它们
Solr Deep Paging(solr 深分页)
eksliang
solr深分页 solr分页性能问题
转载请出自出处:http://eksliang.iteye.com/blog/2148370
作者:eksliang(ickes) blg:http://eksliang.iteye.com/ 概述
长期以来,我们一直有一个深分页问题。如果直接跳到很靠后的页数,查询速度会比较慢。这是因为Solr的需要为查询从开始遍历所有数据。直到Solr的4.7这个问题一直没有一个很好的解决方案。直到solr
数据库面试题
18289753290
面试题 数据库
1.union ,union all
网络搜索出的最佳答案:
union和union all的区别是,union会自动压缩多个结果集合中的重复结果,而union all则将所有的结果全部显示出来,不管是不是重复。
Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;
Union All:对两个结果集进行并集操作,包括重复行,不进行排序;
2.索引有哪些分类?作用是
Android TV屏幕适配
酷的飞上天空
android
先说下现在市面上TV分辨率的大概情况
两种分辨率为主
1.720标清,分辨率为1280x720.
屏幕尺寸以32寸为主,部分电视为42寸
2.1080p全高清,分辨率为1920x1080
屏幕尺寸以42寸为主,此分辨率电视屏幕从32寸到50寸都有
适配遇到问题,已1080p尺寸为例:
分辨率固定不变,屏幕尺寸变化较大。
如:效果图尺寸为1920x1080,如果使用d
Timer定时器与ActionListener联合应用
永夜-极光
java
功能:在控制台每秒输出一次
代码:
package Main;
import javax.swing.Timer;
import java.awt.event.*;
public class T {
private static int count = 0;
public static void main(String[] args){
Ubuntu14.04系统Tab键不能自动补全问题解决
随便小屋
Ubuntu 14.04
Unbuntu 14.4安装之后就在终端中使用Tab键不能自动补全,解决办法如下:
1、利用vi编辑器打开/etc/bash.bashrc文件(需要root权限)
sudo vi /etc/bash.bashrc
接下来会提示输入密码
2、找到文件中的下列代码
#enable bash completion in interactive shells
#if
学会人际关系三招 轻松走职场
aijuans
职场
要想成功,仅有专业能力是不够的,处理好与老板、同事及下属的人际关系也是门大学问。如何才能在职场如鱼得水、游刃有余呢?在此,教您简单实用的三个窍门。
第一,多汇报
最近,管理学又提出了一个新名词“追随力”。它告诉我们,做下属最关键的就是要多请示汇报,让上司随时了解你的工作进度,有了新想法也要及时建议。不知不觉,你就有了“追随力”,上司会越来越了解和信任你。
第二,勤沟通
团队的力
《O2O:移动互联网时代的商业革命》读书笔记
aoyouzi
读书笔记
移动互联网的未来:碎片化内容+碎片化渠道=各式精准、互动的新型社会化营销。
O2O:Online to OffLine 线上线下活动
O2O就是在移动互联网时代,生活消费领域通过线上和线下互动的一种新型商业模式。
手机二维码本质:O2O商务行为从线下现实世界到线上虚拟世界的入口。
线上虚拟世界创造的本意是打破信息鸿沟,让不同地域、不同需求的人
js实现图片随鼠标滚动的效果
百合不是茶
JavaScript 滚动属性的获取 图片滚动 属性获取 页面加载
1,获取样式属性值
top 与顶部的距离
left 与左边的距离
right 与右边的距离
bottom 与下边的距离
zIndex 层叠层次
例子:获取左边的宽度,当css写在body标签中时
<div id="adver" style="position:absolute;top:50px;left:1000p
ajax同步异步参数async
bijian1013
jquery Ajax async
开发项目开发过程中,需要将ajax的返回值赋到全局变量中,然后在该页面其他地方引用,因为ajax异步的原因一直无法成功,需将async:false,使其变成同步的。
格式:
$.ajax({ type: 'POST', ur
Webx3框架(1)
Bill_chen
eclipse spring maven 框架 ibatis
Webx是淘宝开发的一套Web开发框架,Webx3是其第三个升级版本;采用Eclipse的开发环境,现在支持java开发;
采用turbine原型的MVC框架,扩展了Spring容器,利用Maven进行项目的构建管理,灵活的ibatis持久层支持,总的来说,还是一套很不错的Web框架。
Webx3遵循turbine风格,velocity的模板被分为layout/screen/control三部
【MongoDB学习笔记五】MongoDB概述
bit1129
mongodb
MongoDB是面向文档的NoSQL数据库,尽量业界还对MongoDB存在一些质疑的声音,比如性能尤其是查询性能、数据一致性的支持没有想象的那么好,但是MongoDB用户群确实已经够多。MongoDB的亮点不在于它的性能,而是它处理非结构化数据的能力以及内置对分布式的支持(复制、分片达到的高可用、高可伸缩),同时它提供的近似于SQL的查询能力,也是在做NoSQL技术选型时,考虑的一个重要因素。Mo
spring/hibernate/struts2常见异常总结
白糖_
Hibernate
Spring
①ClassNotFoundException: org.aspectj.weaver.reflect.ReflectionWorld$ReflectionWorldException
缺少aspectjweaver.jar,该jar包常用于spring aop中
②java.lang.ClassNotFoundException: org.sprin
jquery easyui表单重置(reset)扩展思路
bozch
form jquery easyui reset
在jquery easyui表单中 尚未提供表单重置的功能,这就需要自己对其进行扩展。
扩展的时候要考虑的控件有:
combo,combobox,combogrid,combotree,datebox,datetimebox
需要对其添加reset方法,reset方法就是把初始化的值赋值给当前的组件,这就需要在组件的初始化时将值保存下来。
在所有的reset方法添加完毕之后,就需要对fo
编程之美-烙饼排序
bylijinnan
编程之美
package beautyOfCoding;
import java.util.Arrays;
/*
*《编程之美》的思路是:搜索+剪枝。有点像是写下棋程序:当前情况下,把所有可能的下一步都做一遍;在这每一遍操作里面,计算出如果按这一步走的话,能不能赢(得出最优结果)。
*《编程之美》上代码有很多错误,且每个变量的含义令人费解。因此我按我的理解写了以下代码:
*/
Struts1.X 源码分析之ActionForm赋值原理
chenbowen00
struts
struts1在处理请求参数之前,首先会根据配置文件action节点的name属性创建对应的ActionForm。如果配置了name属性,却找不到对应的ActionForm类也不会报错,只是不会处理本次请求的请求参数。
如果找到了对应的ActionForm类,则先判断是否已经存在ActionForm的实例,如果不存在则创建实例,并将其存放在对应的作用域中。作用域由配置文件action节点的s
[空天防御与经济]在获得充足的外部资源之前,太空投资需有限度
comsci
资源
这里有一个常识性的问题:
地球的资源,人类的资金是有限的,而太空是无限的.....
就算全人类联合起来,要在太空中修建大型空间站,也不一定能够成功,因为资源和资金,技术有客观的限制....
&
ORACLE临时表—ON COMMIT PRESERVE ROWS
daizj
oracle 临时表
ORACLE临时表 转
临时表:像普通表一样,有结构,但是对数据的管理上不一样,临时表存储事务或会话的中间结果集,临时表中保存的数据只对当前
会话可见,所有会话都看不到其他会话的数据,即使其他会话提交了,也看不到。临时表不存在并发行为,因为他们对于当前会话都是独立的。
创建临时表时,ORACLE只创建了表的结构(在数据字典中定义),并没有初始化内存空间,当某一会话使用临时表时,ORALCE会
基于Nginx XSendfile+SpringMVC进行文件下载
denger
应用服务器 Web nginx 网络应用 lighttpd
在平常我们实现文件下载通常是通过普通 read-write方式,如下代码所示。
@RequestMapping("/courseware/{id}")
public void download(@PathVariable("id") String courseID, HttpServletResp
scanf接受char类型的字符
dcj3sjt126com
c
/*
2013年3月11日22:35:54
目的:学习char只接受一个字符
*/
# include <stdio.h>
int main(void)
{
int i;
char ch;
scanf("%d", &i);
printf("i = %d\n", i);
scanf("%
学编程的价值
dcj3sjt126com
编程
发一个人会编程, 想想以后可以教儿女, 是多么美好的事啊, 不管儿女将来从事什么样的职业, 教一教, 对他思维的开拓大有帮助
像这位朋友学习:
http://blog.sina.com.cn/s/articlelist_2584320772_0_1.html
VirtualGS教程 (By @林泰前): 几十年的老程序员,资深的
二维数组(矩阵)对角线输出
飞天奔月
二维数组
今天在BBS里面看到这样的面试题目,
1,二维数组(N*N),沿对角线方向,从右上角打印到左下角如N=4: 4*4二维数组
{ 1 2 3 4 }
{ 5 6 7 8 }
{ 9 10 11 12 }
{13 14 15 16 }
打印顺序
4
3 8
2 7 12
1 6 11 16
5 10 15
9 14
13
要
Ehcache(08)——可阻塞的Cache——BlockingCache
234390216
并发 ehcache BlockingCache 阻塞
可阻塞的Cache—BlockingCache
在上一节我们提到了显示使用Ehcache锁的问题,其实我们还可以隐式的来使用Ehcache的锁,那就是通过BlockingCache。BlockingCache是Ehcache的一个封装类,可以让我们对Ehcache进行并发操作。其内部的锁机制是使用的net.
mysqldiff对数据库间进行差异比较
jackyrong
mysqld
mysqldiff该工具是官方mysql-utilities工具集的一个脚本,可以用来对比不同数据库之间的表结构,或者同个数据库间的表结构
如果在windows下,直接下载mysql-utilities安装就可以了,然后运行后,会跑到命令行下:
1) 基本用法
mysqldiff --server1=admin:12345
spring data jpa 方法中可用的关键字
lawrence.li
java spring
spring data jpa 支持以方法名进行查询/删除/统计。
查询的关键字为find
删除的关键字为delete/remove (>=1.7.x)
统计的关键字为count (>=1.7.x)
修改需要使用@Modifying注解
@Modifying
@Query("update User u set u.firstna
Spring的ModelAndView类
nicegege
spring
项目中controller的方法跳转的到ModelAndView类,一直很好奇spring怎么实现的?
/*
* Copyright 2002-2010 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* yo
搭建 CentOS 6 服务器(13) - rsync、Amanda
rensanning
centos
(一)rsync
Server端
# yum install rsync
# vi /etc/xinetd.d/rsync
service rsync
{
disable = no
flags = IPv6
socket_type = stream
wait
Learn Nodejs 02
toknowme
nodejs
(1)npm是什么
npm is the package manager for node
官方网站:https://www.npmjs.com/
npm上有很多优秀的nodejs包,来解决常见的一些问题,比如用node-mysql,就可以方便通过nodejs链接到mysql,进行数据库的操作
在开发过程往往会需要用到其他的包,使用npm就可以下载这些包来供程序调用
&nb
Spring MVC 拦截器
xp9802
spring mvc
Controller层的拦截器继承于HandlerInterceptorAdapter
HandlerInterceptorAdapter.java 1 public abstract class HandlerInterceptorAdapter implements HandlerIntercep