Category: Web

Odoo 文档生成

Sphinx 使用 reStructuredText 标记语法(和其他一些语法)来提供文档控制。如果您之前编写过纯文本文件,那么您可能非常了解精通 Sphinx 所需的语法。

Odoo也是采用这种文档书写!

当然官方也提供了这么一份文档:http://www.odoo.com/documentation/user/10.0/index.html

但国内访问实在是太慢了。。这里我们自己生成一份最新的版本!

# 安装支持库
yum install -y epel-release
yum install python-pip python-wheel python-setuptools python-devel gcc

# 安装sphinx(文件在/odoo/doc下)
pip install -r requirements.txt

# 生成(可以直接执行make查看生成格式)
make html 

Tomcat 设置默认访问项目

方法一:(最简单直接的方法)

删除原 webapps/ROOT 目录下的所有文件,将应用下的所有文件和文件夹复制到ROOT文件夹下。

方法二:

删除原 webapps/ROOT 目录下的所有文件,修改文件“conf/server.xml”,在Host节点下增加如下Context的内容配置:

<Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="true"
    xmlValidation="false" xmlNamespaceAware="false">
    ......
    <Context path="" docBase="C:/apache-tomcat-6.0.32/myapps/bc.war"></Context>
</Host>

注意:

  • path 的值设置为空;
  • 应用不要放到tomcat的webapps目录下(如上述配置是放到自定义的文件夹myapps内的),否则访问时路径很有问题;
  • docBase指定到绝对路径。
    如此设置后重启tomcat,如果docBase指向的是war文件,会自动将war解压到 webapps/ROOT 目录;如果docBase指向的是应用已解压好的目录,如 docBase="C:/apache-tomcat-6.0.32/myapps/bc",tomcat不会生成webapps/ROOT目录(这种情况下之前可以不用删除webapps/ROOT目录,但webapps/ROOT目录内的内容是无法访问的),访问时将直接使用docBase指定的目录。

方法三:

与方法二类似,但不是修改全局配置文件“conf/server.xml”,而是在“conf/Catalina/localhost”目录下增加新的文件"ROOT.xml"(注意大小写哦),文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<Context path="" docBase="C:/apache-tomcat-6.0.32/myapps/bc.war"></Context>

bootstrap table 服务端搜索/分页/异步刷新

最近项目中用到了很多的Table,在jsp中构建的话太过繁琐,不宜与后续dom的操作。所以特意研究了一下Bootstrap Table这个插件!!

Java Json包 https://github.com/FasterXML/jackson

插件地址:Bootstrap Table

使用该插件需要Jquery与Bootstrap支持

Html部分

<!DOCTYPE html>
<html lang="en">
 
<head>
	<meta charset="UTF-8">
	<title>Deomo</title>
	<link rel="stylesheet" href="/assets/css/bootstrap.min.css" />
	<link rel="stylesheet" href="/assets/css/bootstrap-table.min.css">
</head>
 
<body>
	<!--查询窗体-->
	<div class="widget-content">
		<form method="post" class="form-horizontal" id="eventqueryform">
			<input type="text" class="span3" name="eventName" placeholder="事件名称"> <input type="text" class="span2" name="status" placeholder="灾情状态"> 
			<input type="text" class="span3" name="location" placeholder="发现位置">
			<div data-date="" class="input-append date datepicker" data-date-format="yyyy-mm-dd">
				<input type="text" class="span10" name="startdate" placeholder="起始日期"> <span class="add-on"><i class="icon-th"></i></span>
			</div>
			<div data-date="" class="input-append date datepicker" data-date-format="yyyy-mm-dd">
				<input type="text" class="span10" name="enddate" placeholder="结束日期"> <span class="add-on"><i class="icon-th"></i></span>
			</div>
			<input type="button" class="btn btn-default span1" id="eventquery" value="查询">
		</form>
	</div>
 
	<div class="widget-content">
		<!--工具条-->
		<div id="toolbar">
			<button class="btn btn-success btn-xs" data-toggle="modal" data-target="#add">添加事件</button>
		</div>
		<table id="eventTable"></table>
	</div>
 
	<script src="/assets/js/jquery.min.js"></script>
	<script src="/assets/js/bootstrap.min.js"></script>
	<script src="/assets/js/bootstrap-table.min.js"></script>
	<script src="/assets/js/bootstrap-table-zh-CN.min.js"></script>
	<script src="/assets/js/event.js"></script>
 
</body>
 
</html>

JS部分

$(document).ready(function() {
	// 初始化表格
	initTable();
});
 
// 表格初始化
function initTable() {
	$('#eventTable').bootstrapTable({
		method : 'post',	// 向服务器请求方式
		contentType : "application/x-www-form-urlencoded",	// 如果是post必须定义
		url : '/program/event/findbyitem',	// 请求url
		cache : false, // 是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*)
		striped : true, // 隔行变色
		dataType : "json",	// 数据类型
		pagination : true,	// 是否启用分页
		showPaginationSwitch : false, // 是否显示 数据条数选择框
		pageSize : 5, // 每页的记录行数(*)
		pageNumber : 1,		// table初始化时显示的页数
		search : false, // 不显示 搜索框
		sidePagination : 'server', // 服务端分页
		classes : 'table table-bordered', // Class样式
 
		// showRefresh : true, // 显示刷新按钮
 
		silent : true, // 必须设置刷新事件
 
		toolbar : '#toolbar',		// 工具栏ID
		toolbarAlign : 'right',		// 工具栏对齐方式
 
		queryParams : queryParams,	// 请求参数,这个关系到后续用到的异步刷新
 
		columns : [ {
			field : 'eventName',
			title : '事件名称',
			align : 'center'
		}, {
			field : 'date',
			title : '日期',
			align : 'center'
		}, {
			field : 'location',
			title : '发生位置',
			align : 'center'
		}, {
			field : 'mesures',
			title : '防治方案',
			align : 'center'
		}, {
			field : 'status',
			title : '灾情状态',
			align : 'center'
		}, {
			field : 'id',
			title : '操作',
			align : 'center',
			width : '280px',
			formatter : function(value, row, index) {
				var view = '<a href="#view" data-toggle="modal" class="btn btn-default" onclick="view(\'' + row.id + '\')">查看</a> ';
				var update = '<a href="#update" data-toggle="modal" class="btn btn-default update" onclick="update(\'' + row.id + '\')">修改</a> ';
				var review = '<a href="#review" class="btn btn-default update" onclick="review(\'' + row.id + '\')">申请专家会审</a> ';
 
				// console.log(JSON.stringify(row));
 
				if (row.status === '已得到控制') {
					return view + update
				} else {
					return view + update + review;
				}
 
			}
		} ],
	});
}
 
// 分页查询参数,是以键值对的形式设置的
function queryParams(params) {
	return {
		eventName : $('#eventqueryform input[name=\'eventName\']').val(),	// 请求时向服务端传递的参数
		status : $('#eventqueryform input[name=\'status\']').val(),			// 请求时向服务端传递的参数
		location : $('#eventqueryform input[name=\'location\']').val(),		// 请求时向服务端传递的参数
		startdate : $('#eventqueryform input[name=\'startdate\']').val(),	// 请求时向服务端传递的参数
		enddate : $('#eventqueryform input[name=\'enddate\']').val(),		// 请求时向服务端传递的参数
 
		limit : params.limit, // 每页显示数量
		offset : params.offset, // SQL语句偏移量
	}
}
 
// 搜索按钮触发事件
$(function() {
	$("#eventquery").click(function() {
		$('#eventTable').bootstrapTable(('refresh'));	// 很重要的一步,刷新url!
		// console.log("/program/area/findbyItem?offset="+0+"&"+$("#areaform").serialize())
		$('#eventqueryform input[name=\'eventName\']').val('')
		$('#eventqueryform input[name=\'status\']').val('')
		$('#eventqueryform input[name=\'location\']').val('')
		$('#eventqueryform input[name=\'startdate\']').val('')
		$('#eventqueryform input[name=\'enddate\']').val('')
	});
 
});

Read more