php上传文件处理(转)

众所周知,文件上传在一些网站应用中是必不可少的一部分。比如个人博客上传个性头像,一些论坛分享好的学习资料等,这就涉及到使用表单处理文件上传的知识,在php中 我们可以使用$_FILES这个全局数组来处理。下面就看看基本的文件上传处理部分。首先要说明的,能够上传文件必定是一个安全隐患,所以在开发这部分功 能时,一定要注意网站的安全性。而本文所探讨的只是基本的文件上传部分,关于安全性这方面考虑的较少,希望在日后的高级应用中可以学习的到。

PHP预定义变量这一节我们对一些预定义变量进行了一些大概的学习,其中就有$_FILES这个全局变量,那么现在再来详细的了解关于这个全局量的知识,因为我在处理文件上传时,要使用到它的相关功能。

$_FILES参数详解:
$_FILES["file"]["name"] – 被上传文件的名称
$_FILES["file"]["type"] – 被上传文件的类型
$_FILES["file"]["size"] – 被上传文件的大小,以字节计
$_FILES["file"]["tmp_name"] – 存储在服务器的文件的临时副本的名称
$_FILES["file"]["error"] – 由文件上传导致的错误代码

$_FILES["file"]["error"]中的["error"]值情况:
UPLOAD_ERR_OK
0:没有错误发生,文件上传成功
UPLOAD_ERR_INI_SIZE
1:上传的文件超过了 php.ini中upload_max_filesize(默认情况为2M) 选项限制的值
UPLOAD_ERR_FORM_SIZE
2:上传文件的大小超过了 HTML表单中MAX_FILE_SIZE选项指定的值
UPLOAD_ERR_PARTIAL
3:文件只有部分被上传
UPLOAD_ERR_NO_FILE
4:没有文件被上传
5:传文件大小为0
下面我们就来看看最基本的文件上传:

<html>
<body>
<form action=”upload-file.php” method=”post”
enctype=”multipart/form-data”>
<label for=”file”>文件名:</label>
<input type=”file” name=”file” id=”file” />
<br />
<input type=”submit” name=”submit” value=”提交” />
</form>
</body>
</html>

这个HTML页面如下图:

upload-file

upload-file.php代码如下:

<?php
if ($_FILES["file"]["error"] > 0)
  {
  echo “错误: ” . $_FILES["file"]["error"] . “<br />”;
  }
else
  {
  echo “文件名: ” . $_FILES["file"]["name"] . “<br />”;
  echo “类型: ” . $_FILES["file"]["type"] . “<br />”;
  echo “大小: ” . ($_FILES["file"]["size"] / 1024) . ” Kb<br />”;
  echo “存储位置: ” . $_FILES["file"]["tmp_name"];
  }
?>

我们随便上传一个word文件,看看处理结果如何:

文件名: css.doc
类型: application/msword
大小: 81.5 Kb
存储位置: C:\WINDOWS\temp\php7D.tmp

可以看到,这个文件被保存到C:\WINDOWS\temp\临时目录下,你可能想去看看在这个目录是否存在这个文件,但结果是:没有!为什么呢? 因为php在执行完这个脚本后,把它生成的文件又删除了,所以在上传之后还要进一步处理。另外还随便提一下,在windows下,php所生成的临时文件 如php7D.tmp是有规律的,也就是说在下一次通过表单上传的文件应该像这样:php7E.tmp
为了保存我们上传的文件,要使用move_uploaded_file函数。在你的upload-file.php文件同目录创建一个upload文件夹。下面再来看看上面那个示例:

<?php
if ($_FILES["file"]["error"] > 0)
  {
  echo “错误: ” . $_FILES["file"]["error"] . “<br />”;
  }
else
  {
  echo “文件名: ” . $_FILES["file"]["name"] . “<br />”;
  echo “类型: ” . $_FILES["file"]["type"] . “<br />”;
  echo “大小: ” . ($_FILES["file"]["size"] / 1024) . ” Kb<br />”; 
  }
 if (file_exists(”upload/” . $_FILES["file"]["name"]))
    {
      echo $_FILES["file"]["name"] . ” 文件已经存在. “;
    }
else
    {
      move_uploaded_file($_FILES["file"]["tmp_name"],
      “upload/” . $_FILES["file"]["name"]);
      echo “文件已经被存储到: ” . “upload/” . $_FILES["file"]["name"];
    }

 

?>

再来看看结果:

文件名: css.doc
类型: application/msword
大小: 81.5 Kb
文件已经被存储到: upload/css.doc

经过这一步的处理,在我们所指定的地方(upload)就可以得到我们上传的文件。到这里,最基本的文件上传就结束了。还说一下,我们在上传的时候一定要考虑文件的类型,要考虑文件的大小等。

 

Posted by sqlwang in PHP, web - Tags: - Comments (0)
2 九月

ExtJs:xtype的含义

根据我在EXT论坛上的观察,xtype用起来的时候疑惑会比较多。甚至有些人根本忽略xtype,或者不清楚它是什么。所以我决定阐述一下这个xtype的概念。

定义

xtype就是一个代表类(Class)的标识名字。

譬如,你有这个类,名字是Ext.ux.MyGrid。正常情况下你需要用这个名字来实例化这个类(创建类的对象)。

除了类名外,你还可以这样登记类的xtype

Ext.reg('mygrid', Ext.ux.MyGrid);

其中xtypemygrid 而类名的一般形式是Ext.ux.MyGrid。上面的语句登记了新的xtype,换种说法说,xtype mygrid 与类 Ext.ux.MyGrid是连在一起的。

到底有什么好处?

试想一下,你手头上的是一个大型的项目,为了响应用户的操作,程序里面包含者大量的对象(windows、forms、grids)。用户点击图标或按钮,就会新建一个窗体,窗体里面又有grid,最终在屏幕上渲染出来。

嗯,我们回到Ext2.x之前的编码,那时候我们实例化所有对象是页面第一次加载后就进行的(程序代码第一次的运行)。在客户端内存中,Ext.ux.MyGrid类的对象已经存在,等待用户的点击。同样是这个grid,假设你上百个的实例,…是多么浪费宝贵的资源啊!很多grid其实用户未必会点击让它出现。

延时实例化

如果你使用xtype,那么在代码中的仅仅是一个用于配置的对象,像:

{xtype:'mygrid", border:false, width:600, height:400, ...}

消耗没有实例对象来得大。

嗯,用户点击按钮或图标会怎么样呢?Ext会辨认出它是一个准备要渲染的grid但不立刻实例化,Ext在ComponentMgr的帮忙下明白这么一回事:“如果我要实例化xtype mygrid的对象,我就知道要创建的实际是类Ext.ux.MyGrid的对象”。即如下列代码:

 

create : function(config, defaultType){
    return new types[config.xtype || defaultType](config);
}

等价于:

return new Ext.ux.MyGrid(config);

然后实例化grid,进行渲染和显示。谨记:需要的时候才实例化

ExtJs xtype一览

基本组件:
xtype Class 描述
button Ext.Button 按钮
splitbutton Ext.SplitButton 带下拉菜单的按钮
cycle Ext.CycleButton 带下拉选项菜单的按钮
buttongroup Ext.ButtonGroup 编组按钮(Since 3.0)
slider Ext.Slider 滑动条
progress Ext.ProgressBar 进度条
statusbar Ext.StatusBar 状态条,2.2加进来,3.0 又去了
colorpalette Ext.ColorPalette 调色板
datepicker Ext.DatePicker 日期选择面板
 
容器及数据类组件
xtype Class 描述
window Ext.Window 窗口
viewport Ext.ViewPort 视口,即浏览器的视口,能随之伸缩
box Ext.BoxComponent 盒子组件,相当于一个 <div>
component Ext.Component 组件
container Ext.Container 容器
panel Ext.Panel 面板
tabpanel Ext.TabPanel 选项面板
treepanel Ext.tree.TreePanel 树型面板
flash Ext.FlashComponent 显示 Flash 的组件(Since 3.0)
grid Ext.grid.GridPanel 表格
editorgrid Ext.grid.EditorGridPanel 可编辑的表格
propertygrid Ext.grid.PropertyGrid 属性表格
editor Ext.Editor 编辑器
dataview Ext.DataView 数据显示视图
listview Ext.ListView 列表视图
 
工具栏组件:
xtype Class 描述
paging Ext.PagingToolbar 分页工具条
toolbar Ext.Toolbar 工具栏
tbbutton Ext.Toolbar.Button 工具栏按钮
tbfill Ext.Toolbar.Fill 工具栏填充区
tbitem Ext.Toolbar.Item 工具条项目
tbseparator Ext.Toolbar.Separator 工具栏分隔符
tbspacer Ext.Toolbar.Spacer 工具栏空白
tbsplit Ext.Toolbar.SplitButton 工具栏分隔按钮
tbtext Ext.Toolbar.TextItem 工具栏文本项
 
菜单组件:
xtype Class 描述
menu Ext.menu.Menu 菜单
colormenu Ext.menu.ColorMenu 颜色选择菜单
datemenu Ext.menu.DateMenu 日期选择菜单
menubaseitem BaseItem  
menucheckitem Ext.menu.CheckItem 选项菜单项
menuitem Ext.menu.Item  
menuseparator Ext.menu.Separator 菜单分隔线
menutextitem Ext.menu.TextItem 文本菜单项
 
表单及表单域组件:
xtype Class 描述
form Ext.FormPanel/Ext.form.FormPanel 表单面板
checkbox Ext.form.Checkbox 多选框
combo Ext.form.ComboBox 下拉框
datefield Ext.form.DateField 日期选择项
timefield Ext.form.TimeField 时间录入项
field Ext.form.Field 表单字段
fieldset Ext.form.FieldSet 表单字段组
hidden Ext.form.Hidden 表单隐藏域
htmleditor Ext.form.HtmlEditor HTML 编辑器
label Ext.form.Label 标签
numberfield Ext.form.NumberField 数字编辑器
radio Ext.form.Radio 单选按钮
textarea Ext.form.TextArea 多行文本框
textfield Ext.form.TextField 表单文本框
trigger Ext.form.TriggerField 触发录入项
checkboxgroup Ext.form.CheckboxGroup 编组的多选框(Since 2.2)
displayfield Ext.form.DisplayField 仅显示,不校验/不被提交的文本框
radiogroup Ext.form.RadioGroup 编组的单选按钮(Since 2.2)
 
图表组件:
xtype Class 描述
chart Ext.chart.Chart 图表组件
barchart Ext.chart.BarChart 柱状图
cartsianchart Ext.chart.CartesianChart  
columnchart Ext.chart.ColumnChart  
linechart Ext.chart.LineChart 连线图
piechart Ext.chart.PieChart 扇形图
 
数据集 Store:
xtype Class 描述
arraystore Ext.data.ArrayStore  
directstore Ext.data.DirectStore  
groupingstore Ext.data.GroupingStore  
jsonstore Ext.data.JsonStore  
simplestore Ext.data.SimpleStore  
store Ext.data.Store  
xmlstore Ext.data.XmlStore

 

 

 

 

Posted by sqlwang in ext js, javascript - Tags: - Comments (0)
17 八月

javascript正则表达式的基本方法

通常上, 正则表达式会用到以下的几个"符号":
^ - 代表字串前面一定要有这样的字, 如^http://, 代表前面一定要有http://
$ - 代表字串后面一定要有这样的字.
? (一个问号) - 它代表一个或没有字元
* (一个*) - 它代表没有或者更多前面的字元
. (一个句点) - 它代表任何一个字元
+ (一个加) - 它代表至少一个或更多前面的字元
[xyz] - 它代表任何一个字元, 或x, 或y, 或z
[a-z] - 它代表任何一个字元, 由a至z
[[:alnum:]] - 代表由a至z, 0至9
[[:digit:]] - 代表由0至9

当使用正则表达式时, 必需注意ereg及eregi可大大不同喔~
ereg是非常敏感的 (意即大小字母都分得非常清楚), 而eregi则不是 (只要记着i代表case-insensitive就可以了)

这里举一些例子:

$regexp = eregi("a?c", "abc"); //– 这是对的, 因?可以代表"一个"或没有字元
$regexp = eregi("a?c", "ac"); //– 这也是对的, 因?可以代表一个或"没有"字元
$regexp = eregi("a?c", "a"); //– 这样就不对了, 纵使有a, 可是还是要有c

$regexp = eregi("[abc]", "a"); //– 这是对的, 因a是大括号里的其中一个字元
$regexp = eregi("[a-z]", "c"); //– 这是对的, 因c包括在a至z里
$regexp = eregi("[a-z]", "0"); //– 这是不对的, 因0并不包括在a至z里面

$regexp = eregi("a.c", "abc"); //– 这是对的, 因一个.代表"任何"一个字
$regexp = eregi("a.c", "ac"); //– 这可就不对了, 因.代表"一个"字元, 所以放abbc也是不对的

$regexp = eregi("a+c", "aaaac"); //– 这是对的, 因+代表一人或"更多"前面的字元
$regexp = eregi("a+c", "abbc"); //– 这样是不对的, +代表一个或更多"前面的字元", 而不是代表任何一个字元
$regexp = eregi("a+c", "abc"); //– 这样也是不对的, 注释如上

$regexp = eregi("[^abc]", "a"); //– 这是比较不同的一点, 那就是如果^出现在[]里面, 代表"除"了里面的字, 全部都是对的.
$regexp = eregi("[^abc]", "d"); //– 这是对的, 因d并不在abc里面
$regexp = eregi("[^[:alnum:]]", "9"); //–这是对的, 因~并不包括在a至z, 0至9里面
当然, [[:digit:]]用法也是相同:
$regexp = eregi("[^[:digit:]]", "a"); //– 这是对的, 因a并不包括在0至9里面

最后, 举个有用的例子,
比如说, 我要每个人的密码都不准拥有0至9, 可以这样试验:
$regexp = eregi("^[^0-9]+$", "aaa9"); //–把aaa9当做密码
if ($regexp == "") {
echo "密码拥有号码, 请改过";
} else {
echo "密码没有号码, 通过";
}

测验显示, 密码拥有号码, 请改过.
相信每个人都看到, [^0-9]前后各有^及$, 这是为了确保前后不能拥有号码, 而+则确保中间没有任何的号码,
[]里面的^, 则是"除了0至9之外, 其他一律通过"
所以只要将9拿去, 就会显示"密码没有号码, 通过"了 ! 

Posted by sqlwang in javascript - Comments (0)
13 八月

Extjs 实践细节备忘(一)(转)

在使用 extjs 开发 OAOP 应用中 ,除了API文档外,还有很多细节需要注意,往往稍不慎便会白白浪费很多时间用来调试,记下来这些api语焉不详或不常使用的地方。

 

0.中文问题

 

在载入ext库后 在 添加 locale/ext-lang-zh-CN.js

 

1.空白图片问题

 

需要设置 Ext.BLANK_IMAGE_URL 为本机的 Ext空白图片地址 ,否则 如果不能联网就会界面叉了。

 

2.事件停止

 

最好在处理事件后 ,调用 e.stopEvent() ,停止冒泡以及 默认行为。

 

3.Ext.EventObject 中有 按键的常量定义,很好

 

4.Ext.encode

 

Ext.encodedecode 是用来对 json 和字符串相互转化的 ,urlEncode ,urlDecode 才是 相对原生javascript编码的替代。

 

5. Ext.extend 继承机制

 

采用 Ext.extend 继承机制时 , 子类构造函数 第一行要写 sub.superclass.constructor.call(this,config) 来调用父类构造器。

 

6.apply override

 

apply 是对 对象属性设置 ,override 是对 函数的 prototype 设置属性。

 

7.DomQuery

 

很好用 ,支持很多 css3 选择器  ,要多用 ext.select 添加 无侵入的代码

 

8.DomHelper 的 元素对象表示

 

除了 tag cls children(cn) html 其他都会直接作为 新元素的属性 生成为 html

 

9.quicktip

 

使用的话,必须 ext.onready 后 调用 Ext.quicktips.init();  hml可以设置 ext:qtitle extlqtip 属性 ,以及一些控制显示效果的属性。

 

10.ext.state

 

使用时,最好设置 stateId ,免得 状态混乱。

 

11.Element.getUpdater

 

可以简化 ajax 更新流程,直接帮你读取并更新

 

12.mixedcollection

 

很强大的容器,可以对她监听事件。

 

13: 表格的查询功能

 

设置 grid.store.baseParams ,然后 调用 grid.store.load({params:{start:0,limit:xx}}); 才能从第一页显示查询后结果

 

14.树节点刷新

 

可以只对某个子树节点调用 reload

 

15.树节点 配置属性获得

 

node.attributes 里有起始配置的属性

 

16.注意 window 的关闭

 

默认为 close(destroy ),最好设为隐藏 closeAction:hide


17.SimpleStore ,jsonstore

 

常常使用的simplestore 就是 store + memoryproxy + arrayreader

 

jsonstore = store +httpproxy + jsonreader

 

18 分页

 

只有 动态数据才能分页,可以设置总条数 ,以及数据区的 key 。

 

19 分组

 

若要分组 就要用 groupstore 与 groupview

 

20 createDelegate 等

 

主要是对 Function 就行 argument , 里面进行一些操作,再调用 this();

 

21. Ext.Ajax

 

为 Ext.data.Connection 的一个实例 ,那么可以 以AOP 的思路,在 Ext.Ajax.on(’beforeXX’,function(){//todo}); 等等设置统一的访问前访问后处理 ,例如 gmail 的 右上角的条状提示

 

Posted by sqlwang in ext js, javascript - Comments (0)
9 八月

一些重要的算法(转)

面是一些比较重要的算法,原文罗 列了32个,但我觉得有很多是数论里的,和计算机的不相干,所以没有选取。下面的这些,有的我们经常在用,有的基本不用。有的很常见,有的很偏。不过了解 一下也是好事。也欢迎你留下你觉得有意义的算法。(注:本篇文章并非翻译,其中的算法描述大部份摘自Wikipedia,因为维基百科描述的很专业了)

  1. A*搜寻算法
    俗称A星算法。这是一种在图形平面上,有多个节点的路径,求出最低通过成本的算法。常用于游戏中的NPC的移动计算,或线上游戏的BOT的移动计算上。该算法像Dijkstra算法一样,可以找到一条最短路径;也像BFS一样,进行启发式的搜索。
  2. Beam Search
    束搜索(beam search) 方法是解决优化问题的一种启发式方法,它是在分枝定界方法基础上发展起来的,它使用启发式方法估计k 个最好的路径,仅从这k 个路径出发向下搜索,即每一层只有满意的结点会被保留,其它的结点则被永久抛弃,从而比分枝定界法能大大节省运行时间。束搜索于20 世纪70 年代中期首先被应用于人工智能领域,1976 年Lowerre 在其称为HARPY的语音识别系统中第一次使用了束搜索方法,他的目标是并行地搜索几个潜在的最优决策路径以减少回溯,并快速地获得一个解。
  3. 二分取中查找算法
    一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于或 者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。这种搜索算法每一次比较都使搜索范围缩小一半。
  4. Branch and bound
    分支定界 (branch and bound) 算法是一种在问题的解空间树上搜索问题的解的方法。但与回溯算法不同,分支定界算法采用广度优先或最小耗费优先的方法搜索解空间树,并且,在分支定界算法中,每一个活结点只有一次机会成为扩展结点。
  5. 数据压缩
    数据压缩是通过减少计算机中所存储数据或者通信传播中数据的冗余度,达到增大数据密度,最终使数据的存储空间减少的技术。数据压缩在文件存储和分布式系统领域有着十分广泛的应用。数据压缩也代表着尺寸媒介容量的增大和网络带宽的扩展。
  6. Diffie–Hellman密钥协商
    Diffie–Hellman key exchange,简称“D–H”, 是一种安全协议。它可以让双方在完全没有对方任何预先信息的条件下通过不安全信道建立起一个密钥。这个密钥可以在后续的通讯中作为对称密钥来加密通讯内容。
  7. Dijkstra’s 算法
    迪科斯彻算法(Dijkstra)是由荷兰计算机科学家艾兹格·迪科斯彻(Edsger Wybe Dijkstra)发明的。算法解决的是有向图中单个源点到其他顶点的最短路径问题。举例来说,如果图中的顶点表示城市,而边上的权重表示著城市间开车行经的距离,迪科斯彻算法可以用来找到两个城市之间的最短路径。
  8. 动态规划
    动态规划是一种在数学和计算机科学中使用的,用于求解包含重叠子问题的最优化问题的方法。其基本思想是,将原问题分解为相似的子问题,在求解的过程中通过子问题的解求出原问题的解。动态规划的思想是多种算法的基础,被广泛应用于计算机科学和工程领域。比较著名的应用实例有:求解最短路径问题,背包问题项目管理网络流优化等。这里也有一篇文章说得比较详细。
  9. 欧几里得算法
    在数学中,辗转相除法,又称欧几里得算法,是求最大公约数的算法。辗转相除法首次出现于欧几里得的《几何原本》(第VII卷,命题i和ii)中,而在中国则可以追溯至东汉出现的《九章算术》。
  10. 最大期望(EM)算法
    在统计计算中,最大期望(EM)算法是在概率probabilistic)模型中寻找参数最大似然估计的算法,其中概率模型依赖于无法观测的隐藏变量(Latent Variable)。最大期望经常用在机器学习计算机视觉数据聚类Data Clustering) 领域。最大期望算法经过两个步骤交替进行计算,第一步是计算期望(E),利用对隐藏变量的现有估计值,计算其最大似然估计值;第二步是最大化(M),最大 化在 E 步上求得的最大似然值来计算参数的值。M 步上找到的参数估计值被用于下一个 E 步计算中,这个过程不断交替进行。
  11. 快速傅里叶变换 (FFT)
    快速傅里叶变换(Fast Fourier Transform,FFT),是离散傅里叶变换的快速算法,也可用于计算离散傅里叶变换的逆变换。快速傅里叶变换有广泛的应用,如数字信号处理、计算大整数乘法、求解偏微分方程等等。本条目只描述各种快速算法,对于离散傅里叶变换的性质和应用,请参见离散傅里叶变换
  12. 哈希函数
    Hash Function是一种从任何一种数据中创建小的数字“指纹”的方法。该函数将数据打乱混合,重新创建一个叫做散列值的指纹。散列值通常用来代表一个短的 随机字母和数字组成的字符串。好的散列函数在输入域中很少出现散列冲突。在散列表和数据处理中,不抑制冲突来区别数据,会使得数据库记录更难找到。
  13. 堆排序
    Heapsort 是指利用堆积树)这种数据结构所设计的一种排序算法。堆积树是一个近似完全二叉树的结构,并同时满足堆积属性:即子结点的键值或索引总是小于(或者大于)它的父结点。
  14. 归并排序
    Merge sort是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
  15. RANSAC 算法
    RANSAC 是”RANdom SAmple Consensus”的缩写。该算法是用于从一组观测数据中估计数学模型参数的迭代方法,由Fischler and Bolles在1981 提出,它是一种非确定性算法,因为它只能以一定的概率得到合理的结果,随着迭代次数的增加,这种概率是增加的。 该算法的基本假设是观测数据集中存在”inliers”(那些对模型参数估计起到支持作用的点)和”outliers”(不符合模型的点),并且这组观测 数据受到噪声影响。RANSAC 假设给定一组”inliers”数据就能够得到最优的符合这组点的模型。
  16. RSA加密演算法
    这是一个公钥加密算法,也是世界上第一个适合用来做签名的算法。今天的RSA已经专利失效,其被广泛地用于电子商务加密,大家都相信,只要密钥足够长,这个算法就会是安全的
  17. 并查集Union-find
    并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。常常在使用中以森林来表示。
  18. Viterbi algorithm
    寻找最可能的隐藏状态序列(Finding most probable sequence of hidden states)

附录

Posted by sqlwang in Linux, linux下C编程 - Comments (0)
23 七月

使用route命令解决一机双网访问

使用route命令解决一机双网访问 经常遇到一台计算机要同时访问两个网络(一个是互联网,一个是企业内部网)的要求 以本单位为例:地址是虚构的^_^ 机器有两块网卡,接到两台交换机上 internet地址:218.22.123.123,子网掩码:255.255.255.0,网关:218.22.123.254 企业内部网地址:10.128.123.123,子网掩码:255.255.255.0,网关:10.128.123.254 如果按正常的设置方法设置每块网卡的ip地址和网关,再cmd下使用route print查看时会看到 Network Destination Netmask Gateway Interface Metric 0.0.0.0 0.0.0.0 218.22.123.254 218.22.123.123 20 0.0.0.0 0.0.0.0 10.128.123.254 10.128.123.123 1 即指向0.0.0.0的有两个网关,这样就会出现路由冲突,两个网络都不能访问。要实现同时访问两个网络就要用到route命令 第一步:route delete 0.0.0.0 "删除所有0.0.0.0的路由" 第二步:route add 0.0.0.0 mask 0.0.0.0 218.22.123.254 "添加0.0.0.0网络路由" 第三步:route add 10.0.0.0 mask 255.0.0.0 10.128.123.254 "添加10.0.0.0网络路由" 这时就可以同时访问两个网络了,但碰到一个问题,使用上述命令添加的路由在系统重新启动后会自动丢失,怎样保存现有的路由表呢? 在win2000 下可以使用route add -p 添加静态路由,即重启后,路由不会丢失。注意使用前要在tcp/ip设置里去掉接在企业内部网的网卡的网关 在win98下没有-p 参数,可以把以上命令存入到一个.bat文件中,然后在启动时调用即可

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/szwangdf/archive/2007/12/09/1925346.aspx

Posted by sqlwang in Window - Comments (0)
16 七月

Pgcluster 1.7 安装手顺 (转)

这几天一直接触postgres,想做集群。
简单做了一下,效果还不错。步骤如下。

pgcluster
–主要介绍
http://www.pgcluster.org/
http://pgcluster.projects.postgresql.org/

– 下载
–http://pgfoundry.org/frs/?group_id=1000072
–选择最新版本下载
pgcluster-1.7.0rc7.tar.bz2

– 配置4台linux机器分别如下
ip                        hostname
192.168.0.1   loadbalancer
192.168.0.11    cluster_1
192.168.0.12    cluster_2
192.168.0.21    replicate_upper

–在4台linux机器上用root帐号分别设置hosts
vi /etc/hosts
#
# load balancer
#
192.168.0.1      loadbalancer
#
# Cluster DBs
#
192.168.0.11     cluster_1
192.168.0.12     cluster_2
#
# replication server
#
192.168.0.21     replicate_upper

–将下载的文件pgcluster-1.7.0rc7.tar.bz2放到4台机器的/tmp目录下用 root帐号进行安装,4台机器一样
cd /tmp
tar xvfj pgcluster-1.7.0rc7.tar.bz2
cd pgcluster-1.7.0rc7
./configure
gmake
gmake install

– 创建用户
/usr/sbin/adduser postgres
mkdir -p /usr/local/pgsql/data
chown -R postgres.postgres /usr/local/pgsql
su - postgres
–设置环境变量
vi .bash_profile
export LD_LIBRARY_PATH=/usr/local/pgsql/lib
PATH=/usr/local/pgsql/bin:$PATH
export PATH
MANPATH=/usr/local/pgsql/man:$MANPATH
export MANPATH
PGDATA=/usr/local/pgsql/data
export PGDATA
source .bash_profile
–创建数据库集群
/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data

–设置loadbalancer server
su - postgres
cd /usr/local/pgsql/share
cp pglb.conf.sample pglb.conf
vi pglb.conf
#============================================================
#          Load Balance Server configuration file
#————————————————————-
# file: pglb.conf
#————————————————————-
# This file controls:
#       o which hosts are db cluster server
#       o which port  use connect to db cluster server
#       o how many connections are allowed on each DB server
#============================================================
#————————————————————-
# set cluster DB server information
#               o Host_Name :           Hostname of Cluster
#                                       Please write a host name by FQDN or IP address.
#               o Port :                Connection port for postmaster
#               o Max_Connection :      Maximum number of connections to postmaster
#————————————————————-
<Cluster_Server_Info>
   <Host_Name>                cluster_1                            </Host_Name>
   <Port>                     5432                    </Port>
   <Max_Connect>              32                      </Max_Connect>
</Cluster_Server_Info>
<Cluster_Server_Info>
   <Host_Name>                cluster_2                         </Host_Name>
   <Port>                     5432                    </Port>
   <Max_Connect>              32                      </Max_Connect>
</Cluster_Server_Info>
#<Cluster_Server_Info>
#    <Host_Name>                post3.pgcluster.org     </Host_Name>
#    <Port>                     5432                    </Port>
#    <Max_Connect>              32                      </Max_Connect>
#</Cluster_Server_Info>
#————————————————————-
# set Load Balance server information
#               o Host_Name :           The host name of this load balance server
#                                       Please write a host name by FQDN or IP address.
#               o Backend_Socket_Dir :  Unix domain socket path for the backend
#               o Receive_Port          Connection port from client
#               o Recovery_Port :       Connection port for recovery process
#               o Max_Cluster_Num :     Maximum number of cluster DB servers
#               o Use_Connection_Pooling : Use connection pool [yes/no]
#               o Lifecheck_Timeout :   Timeout of the lifecheck response
#               o Lifecheck_Interval :  Interval time of the lifecheck
#                               (range 1s - 1h)
#                               10s   — 10 seconds
#                               10min — 10 minutes
#                               1h    – 1 hours
#————————————————————-
<Host_Name>                     loadbalancer                                  </Host_Name>
<Backend_Socket_Dir>            /tmp                            </Backend_Socket_Dir>
<Receive_Port>                  5432                            </Receive_Port>
<Recovery_Port>         6001                            </Recovery_Port>
<Max_Cluster_Num>               128                             </Max_Cluster_Num>
<Use_Connection_Pooling>        no                              </Use_Connection_Pooling>
<LifeCheck_Timeout>             3s                              </LifeCheck_Timeout>
<LifeCheck_Interval>            15s                             </LifeCheck_Interval>
#————————————————————-
# A setup of a log files
#
#               o File_Name :   Log file name with full path
#               o File_Size :   Maximum size of each log files
#                               Please specify in a number and unit(K or M)
#                                10   — 10 Byte
#                                10K  – 10 KByte
#                                10M  – 10 MByte
#               o Rotate :      Rotation times
#                               If specified 0, old versions are removed.
#————————————————————-
<Log_File_Info>
       <File_Name>             /tmp/pglb.log   </File_Name>
       <File_Size>             1M              </File_Size>
       <Rotate>                3               </Rotate>
</Log_File_Info>

– 设置cluster db,两台的设置差不多只是主机名不同
su - postgres
cd /usr/local/pgsql/data
vi postgresql.conf
# - Connection Settings -

listen_addresses = ‘*’          # what IP address(es) to listen on;
                                       # comma-separated list of addresses;
                                       # defaults to ‘localhost’, ‘*’ = all
                                       # (change requires restart)
port = 5432                             # (change requires restart)
max_connections = 100                   # (change requires restart)

vi pg_hba.conf
# TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD

# "local" is for Unix domain socket connections only
local   all         all                               trust
# IPv4 local connections:
host    all         all         127.0.0.1/32          trust
host    all         all         192.168.0.0/24        trust
# IPv6 local connections:
host    all         all         ::1/128               trust

vi cluster.conf
#============================================================
#          Cluster DB Server configuration file
#————————————————————
# file: cluster.conf
#————————————————————
# This file controls:
#       o which hosts & port are replication server
#       o which port use for replication request to replication server
#       o which command use for recovery function
#============================================================
#————————————————————
# set Replication Server information
#               o Host_Name :           hostname
#               o Port :                Connection port for postmaster
#               o Recovery_Port :       Connection port for recovery process
#————————————————————
<Replicate_Server_Info>
       <Host_Name>             replicate_upper                 </Host_Name>
       <Port>                  8001                            </Port>
       <Recovery_Port>         8101                            </Recovery_Port>
</Replicate_Server_Info>
#<Replicate_Server_Info>
#       <Host_Name>             replicate2.pgcluster.org        </Host_Name>
#       <Port>                  8002                            </Port>
#       <Recovery_Port>         8102                            </Recovery_Port>
#</Replicate_Server_Info>
#<Replicate_Server_Info>
#       <Host_Name>             replicate3.pgcluster.org        </Host_Name>
#       <Port>                  8003                            </Port>
#       <Recovery_Port>         8103                            </Recovery_Port>
#</Replicate_Server_Info>
#————————————————————-
# set Cluster DB Server information
#               o Host_Name :           Host name which connect with replication server
#               o Recovery_Port :       Connection port for recovery
#               o Rsync_Path :          Path of rsync command
#               o Rsync_Option :        File transfer option for rsync
#               o Rsync_Compress :      Use compression option for rsync
#                                       [yes/no]. default : yes
#               o Pg_Dump_Path :        Path of pg_dump
#               o When_Stand_Alone :    When all replication servers fell,
#                                       you can set up two kinds of permission,
#                                       "real_only" or "read_write".
#               o Replication_Timeout : Timeout of each replication request
#               o Lifecheck_Timeout :   Timeout of the lifecheck response
#               o Lifecheck_Interval :  Interval time of the lifecheck
#                               (range 1s - 1h)
#                               10s   — 10 seconds
#                               10min — 10 minutes
#                               1h    – 1 hours
#————————————————————-
<Host_Name>                     cluster_1               </Host_Name>
<Recovery_Port>         7001                            </Recovery_Port>
<Rsync_Path>                    /usr/bin/rsync                  </Rsync_Path>
<Rsync_Option>                  ssh -1                          </Rsync_Option>
<Rsync_Compress>                yes                             </Rsync_Compress>
<Pg_Dump_Path>                  /usr/local/pgsql/bin/pg_dump    </Pg_Dump_Path>
<When_Stand_Alone>              read_only                       </When_Stand_Alone>
<Replication_Timeout>           1 min                           </Replication_Timeout>
<LifeCheck_Timeout>             3s                              </LifeCheck_Timeout>
<LifeCheck_Interval>            11s                             </LifeCheck_Interval>
#————————————————————-
# set partitional replicate control information
#     set DB name and Table name to stop reprication
#       o DB_Name :             DB name
#       o Table_Name :  Table name
#————————————————————-
#<Not_Replicate_Info>
#       <DB_Name>               test_db         </DB_Name>
#       <Table_Name>            log_table       </Table_Name>
#</Not_Replicate_Info>

– 注意上面的<Host_Name>部分.不同的机器需要设置相对应主机名

–设置replicate server
su - postgres
cd /usr/local/pgsql/share
cp pgreplicate.conf.sample pgreplicate.conf
vi pgreplicate.conf
#=============================================================
#  PGReplicate configuration file
#————————————————————-
# file: pgreplicate.conf
#————————————————————-
# This file controls:
#       o which hosts & port are cluster server
#       o which port use for replication request from cluster server
#=============================================================
#
#————————————————————-
# A setup of Cluster DB(s)
#
#               o Host_Name :           The host name of Cluster DB.
#                                       Please write a host name by FQDN.
#                                       DO NOT write IP address.
#               o Port :                The connection port with postmaster.
#               o Recovery_Port :       The connection port at the time of
#                                       a recovery sequence.
#————————————————————-
<Cluster_Server_Info>
   <Host_Name>                 cluster_1                       </Host_Name>
   <Port>                      5432                            </Port>
   <Recovery_Port>             7001                            </Recovery_Port>
</Cluster_Server_Info>
<Cluster_Server_Info>
   <Host_Name>                 cluster_2                       </Host_Name>
   <Port>                      5432                            </Port>
   <Recovery_Port>             7001                            </Recovery_Port>
</Cluster_Server_Info>
#<Cluster_Server_Info>
#    <Host_Name>                cluster3.pgcluster.org          </Host_Name>
#    <Port>                     5432                            </Port>
#    <Recovery_Port>            7001                            </Recovery_Port>
#</Cluster_Server_Info>
#
#————————————————————-
# A setup of Load Balance Server
#
#               o Host_Name :           The host name of a load balance server.
#                                       Please write a host name by FQDN or IP address.
#               o Recovery_Port :       The connection port at the time of
#                                       a recovery sequence .
#————————————————————-
<LoadBalance_Server_Info>
       <Host_Name>             loadbalancer                    </Host_Name>
       <Recovery_Port>         6001                            </Recovery_Port>
</LoadBalance_Server_Info>
#
#————————————————————
# A setup of the cascade connection between replication servers.
# When you do not use RLOG recovery, you can skip this setup
#
#               o Host_Name :   The host name of the upper replication server.
#                               Please write a host name by FQDN or IP address.
#               o Port :        The connection port with postmaster.
#               o Recovery_Port : The connection port at the time of
#                                 a recovery sequence .
#————————————————————
#<Replicate_Server_Info>
#       <Host_Name>             upper_replicate.pgcluster.org   </Host_Name>
#       <Port>                  8002                            </Port>
#       <Recovery_Port>         8102                            </Recovery_Port>
#</Replicate_Server_Info>
#
#————————————————————-
# A setup of a replication server
#
#               o Host_Name :           The host name of the this replication server.
#                                       Please write a host name by FQDN or IP address.
#               o Replicate_Port :      Connection port for replication
#               o Recovery_Port :       Connection port for recovery
#               o RLOG_Port :           Connection port for replication log
#               o Response_mode :       Timing which returns a response
#                                       normal   — return result of DB which received the query
#                                       reliable — return result after waiting for response of
#                               all Cluster DBs.
#               o Use_Replication_Log : Use replication log
#                                       [yes/no]. default : no
#               o Replication_Timeout : Timeout of each replication response
#               o Lifecheck_Timeout :   Timeout of the lifecheck response
#               o Lifecheck_Interval :  Interval time of the lifecheck
#                                       (range 1s - 1h)
#                                       10s   — 10 seconds
#                                       10min — 10 minutes
#                                       1h    – 1 hours
#————————————————————-
<Host_Name>                     replicate_upper         </Host_Name>
<Replication_Port>              8001                            </Replication_Port>
<Recovery_Port>         8101                            </Recovery_Port>
<RLOG_Port>                     8301                            </RLOG_Port>
<Response_Mode>         normal                          </Response_Mode>
<Use_Replication_Log>           no                              </Use_Replication_Log>
<Replication_Timeout>           1min                            </Replication_Timeout>
<LifeCheck_Timeout>             3s                              </LifeCheck_Timeout>
<LifeCheck_Interval>            15s                             </LifeCheck_Interval>
#————————————————————-
# A setup of a log files
#
#               o File_Name :   Log file name with full path
#               o File_Size :   Maximum size of each log files
#                               Please specify in a number and unit(K or M)
#                                 10  – 10 Byte
#                                 10K — 10 KByte
#                                 10M — 10 MByte
#               o Rotate :      Rotation times
#                               If specified 0, old versions are removed.
#————————————————————-
<Log_File_Info>
       <File_Name>             /tmp/pgreplicate.log    </File_Name>
       <File_Size>             1M                      </File_Size>
       <Rotate>                3                       </Rotate>
</Log_File_Info>

– 启动replicate server
/usr/local/pgsql/bin/pgreplicate -D /usr/local/pgsql/share
–/usr/local/pgsql/bin/pgreplicate -D /usr/local/pgsql/share stop

–启动cluster db server
/usr/local/pgsql/bin/pg_ctl start -D /usr/local/pgsql/data -o "-U"
–/usr/local/pgsql/bin/pg_ctl stop -D /usr/local/pgsql/data

–启动loadbalancer server
/usr/local/pgsql/bin/pglb -D /usr/local/pgsql/share
–/usr/local/pgsql/bin/pglb -D /usr/local/pgsql/share stop

–最后测试一下是否成功
su - postgres
pgsql -h 192.168.0.11
create table demo (id int);
insert into demo values(1);
insert into demo values(2);
insert into demo values(3);
select * from demo;
\q
pgsql -h 192.168.0.12
select * from demo;
\q

Posted by sqlwang in PostgreSQL, 数据库 - Comments (0)
5 七月

回车与换行的区别

今天,我总算搞清楚“回车”(carriage return)和“换行”(line feed)这两个概念的来历和区别了。
在计算机还没有出现 之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符。要是在这0.2秒里面,又有新 的字符传过来,那么这个字符将丢失。

于是,研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符。一个叫做“回车”,告 诉打字机把打印头定位在左边界;另一个叫做“换行”,告诉打字机把纸向下移一行。

这就是“换行”和“回车”的来历,从它们的英语名字上也 可以看出一二。

后来,计算机发明了,这两个概念也就被般到了计算机上。那时,存储器很贵,一些科学家认为在每行结尾加两个字符太浪费了, 加一个就可以。于是,就出现了分歧。

Unix系统里,每行结尾只有“<换行>”,即“\n”;Windows系统里面,每行 结尾是“<换行><回车>”,即“\n\r”;Mac系统里,每行结尾是“<回车>”。一个直接后果 是,Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix/Mac下打开的话,在每行的结 尾可能会多出一个^M符号。

c语言编程时(windows系统)

\r 就是return 回到 本行 行首 这就会把这一行以前的输出 覆盖掉

如:
int main() {

cout << "hahaha" << "\r" << "xixi" ;

}
最后只显示 xixi 而 hahaha 背覆盖了

\n 是回车+换行 把光标 先移到 行首 然后换到下一行 也就是 下一行的行首拉

int main() {

cout << "hahaha" << "\n" << "xixi" ;

}
则 显示
hahaha
xixi

Posted by sqlwang in PHP, web - Comments (0)
29 六月

freeradius配置杂记(转)

reeradius(http://www.freeradius.org/)是一个开源的高性能 radius服务器程序,据统计目前有超过50000套涉及计费的系统部署中选择了freeradius。freeradius以她的高灵活性和可配置性 以及开源而闻名。支持的特性包括SQL,LDAP,RADIUS代理,负载均衡以及近100个字典文件。支持的验证方式包括 PAP, CHAP, MS-CHAP, EAP-MD5, EAP-GTC, EAP-TLS, EAP-TTLS, PEAPv0, LEAP, EAP-SIM等,目前最新的稳定版是1.1.7。

 

freeradius的配置项目繁多,但是关键的配置文件也就几个,clients.conf, radiusd.conf以及sql.conf是最主要的配置文件。

 

1. clients.conf

freeradius在clients.conf中存储radius客户端的验证信息根据客户端IPsecret,两边都做MD5的结果进行校验。中途不传输secrte,只传输md5结果。

 

client 192.168.0.1

{

       secret             = test

       shortname      = nas01

       nastype          = other

}

 

2.radiusd.conf

这是freeradius的主配置文件

 

下面的设置是程序和配置信息路径

prefix = /usr/local

exec_prefix = ${prefix}

sysconfdir = ${prefix}/etc

localstatedir = ${prefix}/var

sbindir = ${exec_prefix}/sbin

logdir = ${localstatedir}/log/radius

raddbdir = ${sysconfdir}/raddb

radacctdir = ${logdir}/radacct

 

#  Location of config and logfiles.

confdir = ${raddbdir}

run_dir = ${localstatedir}/run/radiusd

 

每个请求的最长处理时间,如果超过这个时间,则这个请求会抛弃,返 回REJECT消 息

max_request_time = 30

 

回复消息发出后再缓存的时间(以用于丢失 时重传)

cleanup_delay = 5

 

最多并存的请求数

max_requests = 1024

 

工作线程池配置

thread pool {

初始的工作线程数      

start_servers = 10

 

关于模块的配置

每个要加载的模块都有一个配置块,类似以 下格式:

name [ instance ] {

       config_item = value

      

}

name表示模块名,比如mschap. freeradius在需要时加载rlm_mschap.so动态库

instance表示加载时的实例名,一般为一个模块一个实例,也可以存在多个实例

大括号中的为具体配置信息。

 

#

#  Pre-accounting.  Decide which accounting type to use.

#

preacct {

       preprocess

 

       #

       #  Ensure that we have a semi-unique identifier for every

       #  request, and many NAS boxes are broken.

       acct_unique

 

       #

       #  Look for IPASS-style ‘realm/’, and if not found, look for

       #  ‘@realm’, and decide whether or not to proxy, based on

       #  that.

       #

       #  Accounting requests are generally proxied to the same

       #  home server as authentication requests.

#     IPASS

       suffix

#     ntdomain

 

       #

       #  Read the ‘acct_users’ file

       ##files

}

 

#

#  Accounting.  Log the accounting data.

#

accounting {

       #

       #  Create a ‘detail’ed log of the packets.

       #  Note that accounting requests which are proxied

       #  are also logged in the detail file.

       detail

#     daily

 

       #  Update the wtmp file

       #

       #  If you don’t use "radlast", you can delete this line.

       #unix

 

       #

       #  For Simultaneous-Use tracking.

       #

       #  Due to packet losses in the network, the data here

       #  may be incorrect.  There is little we can do about it.

       radutmp

#     sradutmp

 

       #  Return an address to the IP Pool when we see a stop record.

#     main_pool

#     sqlippool

 

       #

       #  Log traffic to an SQL database.

       #

       #  See "Accounting queries" in sql.conf

       sql

 

       #

       #  Instead of sending the query to the SQL server,

       #  write it into a log file.

       #

#     sql_log

 

       #  Cisco VoIP specific bulk accounting

#     pgsql-voip

 

}

 

3. sql.conf

这里存储数据库相关的配置

sql {

        # Database type

        # Current supported are: rlm_sql_mysql, rlm_sql_postgresql,

        # rlm_sql_iodbc, rlm_sql_oracle, rlm_sql_unixodbc, rlm_sql_freetds

这里选择数据驱动类型,freeradius已经实现了最常用的数据库驱动接口,包括mysql,oracel,MS SQL SERVER,DB2等

 

        #driver = "rlm_sql_mysql"

        driver = "rlm_sql_oracle"

 

这里设置数据库的登录用户名,密码,数据库等

        # Connect info

        server = "radiushost"

        login = "loginname"

        password = "loginpassword"

 

        # Database table configuration

        radius_db = "radiusdb

Posted by sqlwang in Radius, VoIP - Tags: - Comments (0)
17 六月

extjs 根据tree的操作刷新grid(转)

buildUnitTree=function(){

   //定义根节点的Loader
//   var treeloader=new Tree.TreeLoader({dataUrl:’unit.do?m=unitTree’});

   //异步加载根节点
    var rootnode=new Ext.tree.AsyncTreeNode({
        id:”,
        text:’目录树根节点’,
        expandable :true
                });
   
   var treepanel = new Ext.tree.TreePanel({
                //renderTo:"tree_div",//如果使用renderTo,则不能使用setRootNode()方法,需要在TreePanel中设 置root属性。
                el:’unit_tree’,        //填充区域
                rootVisible:true,     //隐藏根节点
                border:true,          //边框
                animate:false,         //动画效果
                autoScroll:true,      //自动滚动
                enableDD:false,       //拖拽节点    
                checkModel: ‘cascade’,   //对树的级联多选 
                onlyLeafCheckable: false,//对树所有结点都可选         
                containerScroll:true,
                rootVisible : false,   
                root: rootnode,
                loader:
                    new Ext.tree.TreeLoader({
                        dataUrl:"unit.do?m=unitTree",
                        baseAttrs: { uiProvider: Ext.tree.TreeCheckNodeUI }
                    })          
            });

   //设置根节点
 //  treepanel.setRootNode(rootnode);

   //响应事件,传递node参数
       treepanel.on(’beforeload’,
                function(node){
                   treepanel.loader.dataUrl=’unit.do?m=unitTree&parentId=’+node.id;    //定义子节点的Loader  
                });
    treepanel.on(’beforeexpandnode’,function(node){//展开时在gird加载对应的数据数据
            buildUnitGrid(node.id);
    });
    treepanel.on(’beforecollapsenode’,function(node){//当点击收起来的时候在grid加载上一层的数 据
            buildUnitGrid(node.parentNode.id);       
    });
     treepanel.on("check",function(node,checked){alert(node.text+" = "+checked)}); //注册"check"事件 
     treepanel.on(’checkchange’, function(node, checked) { 
                      //Ext.MessageBox.alert(buildUnitGrid(node.id));
                       
                    node.expand(); 
                     node.attributes.checked = checked; 
                     node.eachChild(function(child) { 
                         child.ui.toggleCheck(checked); 
                         child.attributes.checked = checked; 
                        child.fireEvent(’checkchange’, child, checked); 
                     });
                 }); 
     treepanel.on(’click’,function(node){//单击树的一个节点 grid显示该节点的单位信息
         gridPanel.store.proxy=new Ext.data.HttpProxy({url:"unit.do?m=viewUnit&id="+node.id});
         gridPanel.store.load();
         gridPanel.render();
     });           
       treepanel.render();          
      treepanel.getRootNode().expand();

}

var gridPanel;

buildUnitGrid=function(parentId){
    var cbsm=new Ext.grid.CheckboxSelectionModel({dataIndex:"id"});//定义复选框
    var store=new Ext.data.Store({
             proxy:new Ext.data.HttpProxy({url:"unit.do?m=unitList&parentId="+(parentId==undefined?null:parentId)}),
             reader:new Ext.data.JsonReader({totalProperty:"totalPorperty",root:"root"},
             ["id",
             "name",
             "address",
             "phone",
             {name : 'createDate', type : 'date', mapping : 'createDate.time', dateFormat : 'time' } ,
             "comm"])
         });//定义数据源
     store.load();//加载数据
     var colm=new Ext.grid.ColumnModel([//定义列
             new Ext.grid.RowNumberer(),
             cbsm,
             { id:'id',header: "id", sortable: true, dataIndex: 'id',hidden:true},
             {header:"单位名",sortable:false,dataIndex:"name"},
            {header: "单位地址",sortable: false, dataIndex: 'address'},
            {header: "单位电话",sortable: false, dataIndex: 'phone'},
            {header: "创建时间", sortable: true, dataIndex: 'createDate',renderer:Ext.util.Format.dateRenderer('Y年m月d日')},
            {header: "备注",  sortable:false, renderer: Ext.util.Format.ellipsis(".",30), dataIndex: 'comm'},
              {header:"操作",dataIndex:'id',renderer:operation}
         ]);
//     var pageBar=new Ext.PagingToolbar({    //定义分页条
//                pageSize: 10,   
//                store: store,
//                displayInfo: true,   
//                displayMsg: ‘第{0} 到 {1} 条数据 共{2}条’,   
//                emptyMsg: "没有数据"   
//            });
      
    gridPanel=new Ext.grid.GridPanel({
         store:store,
         cm:colm,
         sm:cbsm,
         width:’60%’,
        autoHeight:true,
     //   bbar:pageBar,
       // frame:false,
        title:’单位列表’,
       // iconCls:’icon-grid’,
        autoHeight: true,
        el: "unit_grid"
        
     });
     gridPanel.render();
}

 function operation(value){
              var _context=’<a onclick="updateUnit(’+value+’)" style="text-decoration: underline">修改</a>&nbsp;&nbsp;’;
              _context+=’<a onclick="deleteUnit(’+value+’)" style="text-decoration: underline">删除</a>’;
              return _context;
          }

Posted by sqlwang in ext js, javascript - Comments (0)
3 六月