- 浏览: 1779937 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (641)
- vb2005xu自己动手系列 (174)
- vb2005xu开发文章转摘 (47)
- vb2005xu发发牢骚 (99)
- vb2005xu新技术灌水 (12)
- vb2005xu网络资源集锦 (21)
- vb2005xu软件学习 (60)
- 英语学习 (3)
- JavaScript 学习 (54)
- JAVA OOP 巩固 之 CustomDatabase 的开发 (5)
- 2013年9月之前所在公司 记事 (7)
- FleaPHP/QEEPHP 资料 (87)
- JAVA MAIL 学习篇 (4)
- Python turbogears (5)
- Rails 个人开发四部曲 (3)
- 名人传 (8)
- iwp framework (5)
- 高考零分作文 (5)
- startos (8)
- lua (0)
- 职场 (1)
最新评论
-
hellotieye:
自己 评论 自己 挺嗨呀
Mysql sql查询时 if 的用法 -
igevin:
转载请标明出处,转自Gevin的博客http://blog.i ...
RESTful API 编写指南 -
Theobob:
...
实现简单的ACL -
vb2005xu:
比如 对于 curl 调用就不再需要 加各种if 判断了,
$ ...
搞一个简单的数据打印工具AsDebug の Laravel -
vb2005xu:
http://geekplux.com/wiki/
YII2 模块内自定义错误页
前两天得到1份 QEEPHP v3的测试版本... 新功能确实很好,而且变小了很多,虽然离正式版的出现还有些距离,但是已经能看出
很多的改变,比如 事件机制,实体操作层的改变,MVC的处理改变 等等....
此处 因为之前的 CoreApp-mini 已经写了很多,其里面并没有对模块实现进行限制,可以使用多种方式来实现...
之前 缺少MVC的完整实现,此处正好把QEE 的MVC模式引过来....
因为 v3里面C处 没有 模块/命名空间/控制器/动作 这么一说 只有 action 但是 action 是可以存在 以 . 分隔的 多级
所以 现有的qee2.1的 url 路由 可以 修剪下 就能 放到 qee v3版本里面的MVC 中,
将 UDI 转成 .分隔的actionName 应该很好做到
同理 actionName 到UDI应该也好实现
主要就是在 这2个的转换上面
同理 actionName 到UDI应该也好实现
主要就是在 这2个的转换上面
因为 CoreApp-mini 里面已经有了个正向的url路由,所以也就没有引入qee的路由...
CoreApp-mini 的定位就是 简单,够用, 小系统的专用框架,大的复杂的项目可以使用 QEEPHP来实现
先上图:
再上代码:
<?php /* * 简易MVC组件[改自Qee v3 beta] * -- 带特定的目录结构 * -- 不再有控制器这个物件 * -- by sese coreapp-mini */ /** * 视图对象 */ class MvcView { /** * 视图文件所在目录 * * @var string */ public $view_dir; /** * 视图默认使用的布局 * * @var string */ public $view_layout; /** * 默认使用的视图 * * @var string */ public $viewname; /** * 视图变量 * * @var array */ public $vars; /** * 构造函数 * * @param string $view_dir * @param string $viewname * @param array $vars */ function __construct($view_dir, $viewname, array $vars) { $this->view_dir = $view_dir; $this->vars = $vars; $this->vars['_BASE_DIR'] = get_request_dir(); $this->viewname = $viewname; } /** * 渲染一个视图文件,返回结果 * * @return string */ function execute() { $viewname = $this->viewname; $child = new MvcViewLayer($this, $viewname); $error_reporting = ini_get('error_reporting'); error_reporting($error_reporting & ~E_NOTICE); $child->parse(); $layer = $child; while (($parent = $layer->parent) != null) { $parent->parse($layer->blocks); $layer = $parent; } error_reporting($error_reporting); return $child->root()->contents; } /** * 查找指定视图文件 * * @param string $viewname * * @return string */ function view_filename($viewname) { $filename = str_replace('.', DIRECTORY_SEPARATOR, $viewname) . '.php'; return $this->view_dir . DIRECTORY_SEPARATOR . $filename; } } /** * 视图层 */ class MvcViewLayer { /** * 该层所属的视图对象 * * @var MvcView */ public $view; /** * 父层对象 * * @var MvcViewLayer */ public $parent; /** * 视图名称 * * @var string */ public $viewname; /** * 该层的内容 * * @var string */ public $contents; /** * 该层区块的内容 * * @var array */ public $blocks = array(); /** * 该层的区块 * * @var array */ private $_block_stack = array(); /** * 预定义的区块 * * @var array */ private $_predefined_blocks = array(); /** * 构造函数 * * @param MvcView $view * @param string $viewname */ function __construct(MvcView $view, $viewname) { $this->view = $view; $this->viewname = $viewname; } /** * 返回该层的顶级层(最底层的视图) * * @return MvcViewLayer */ function root() { return ($this->parent) ? $this->parent->root() : $this; } /** * 分析视图,并返回结果 * * @param array $predefined_blocks */ function parse(array $predefined_blocks = array()) { $this->_predefined_blocks = $predefined_blocks; ob_start(); extract($this->view->vars); include $this->view->view_filename($this->viewname); $this->contents = ob_get_clean(); $this->_predefined_blocks = null; foreach ($this->blocks as $block_name => $contents) { $search = "%_view_block.{$block_name}_%"; if (strpos($this->contents, $search) !== false) { $this->contents = str_replace($search, $contents, $this->contents); } } } /** * 从指定层继承 * * @param string $viewname */ function extend($viewname) { $this->parent = new MvcViewLayer($this->view, $viewname); } /** * 定义一个区块 * * @param string $block_name * @param boolean $append */ function block($block_name, $append = false) { array_push($this->_block_stack, array($block_name, $append)); ob_start(); } /** * 结束最后定义的一个区块 */ function endblock() { list($block_name, $append) = array_pop($this->_block_stack); $contents = ob_get_clean(); $this->_create_block($contents, $block_name, $append); } /** * 定义一个空区块 * * @param string $block_name * @param boolean $append */ function empty_block($block_name, $append = false) { $this->_create_block('', $block_name, $append); } /** * 载入一个视图片段 * * @param string $viewname 视图片段名 */ function element($viewname) { $__filename = $this->view->view_filename("_elements/{$viewname}"); extract($this->view->vars); include $__filename; } /** * 完成一个区块 * * @param string $contents * @param string $block_name * @param boolean $append */ private function _create_block($contents, $block_name, $append) { if (isset($this->_predefined_blocks[$block_name])) { if ($append) { $contents .= $this->_predefined_blocks[$block_name]; } else { $contents = $this->_predefined_blocks[$block_name]; } } $this->blocks[$block_name] = $contents; echo "%_view_block.{$block_name}_%"; } } /** * MvcAction没有找到 * */ class MvcActionMissingException extends Exception { /** * 动作名 * * @var string */ public $actionName; /** * 构造函数 * * @param string $actionName */ function __construct($actionName){ $this->actionName = $actionName; parent::__construct(sprintf('缺少Action "%s".',$actionName)); } } /** * 动作对象基础类 */ abstract class MvcBaseAction { /** * 应用程序对象 * * @var MvcAppEntry */ public $app; /** * 动作名称 * * @var string */ public $name; /** * 当前请求 * * @var MvcRequest */ public $request; /** * 执行结果 * * @var mixed */ public $result; /** * 构造函数 * * @param MvcAppEntry $app * @param string $name */ function __construct($app, $name) { $this->app = $app; $this->name = $name; $this->request = $app->request; } /** * UDI 转 MVC Action 标识 */ static function formatUDIAction(array $udi){ return sprintf('%s.%s.%s',$udi[Router::module],$udi[Router::operate],$udi[Router::action]); } /** * 执行动作 */ function __execute() { if (!$this->__before_execute()) return; if ($this->validate_input()) { $result = $this->execute(); if (!is_null($result)) $this->result = $result; if (!$this->validate_output()) { $this->on_validate_output_failed(); } } else { $this->on_validate_input_failed(); } $this->__after_execute(); } /** * 执行指定的视图对象 * * @param array $vars */ function view(array $vars = null) { if (!is_array($vars)) $vars = array(); $this->result = $this->app->view($this->name, $vars); } /** * 应用程序执行的动作内容,在继承的动作对象中必须实现此方法 * * 返回值会被保存到动作对象的 $result 属性中。 * * @return mixed */ abstract function execute(); /** * 继承类覆盖此方法,用于在执行请求前过滤并验证输入数据 * * 如果返回 false 则阻止调用 execute() 方法,并调用 validate_input_failed() 方法。 * * @return bool */ function validate_input() { return true; } /** * 继承类覆盖此方法,用于在执行请求后过滤并验证输出数据 * * 如果返回 false 则调用 validate_output_failed() 方法。 * * @return bool */ function validate_output() { return true; } /** * 请求前对数据进行验证失败时调用此方法 */ function on_validate_input_failed() { } /** * 请求执行后对数据进行验证失败时调用此方法 */ function on_validate_output_failed() { } /** * 执行动作之前调用,如果返回 false 则阻止动作的执行 * * @return bool */ protected function __before_execute() { return true; } /** * 执行动作之后调用 */ protected function __after_execute() { } } /** * 封装一个请求 */ class MvcRequest { /** * GET 数据 * * @var array */ public $get; /** * POST 数据 * * @var array */ public $post; /** * COOKIE 数据 * * @var array */ public $cookie; /** * SESSION 数据 * * @var array */ public $session; function __construct($get, $post, $cookie, $session) { $this->get = $get; $this->post = $post; $this->cookie = $cookie; $this->session = $session; } /** * 从 GET 取得数据,如果指定数据不存在则返回 $default 指定的默认值 * * @param string $name * @param mixed $default * * @return mixed */ function get($name, $default = null) { return isset($this->get[$name]) ? $this->get[$name] : $default; } /** * 从 POST 取得数据,如果指定数据不存在则返回 $default 指定的默认值 * * @param string $name * @param mixed $default * * @return mixed */ function post($name, $default = null) { return isset($this->post[$name]) ? $this->post[$name] : $default; } /** * 从 COOKIE 取得数据,如果指定数据不存在则返回 $default 指定的默认值 * * @param string $name * @param mixed $default * * @return mixed */ function cookie($name, $default = null) { return isset($this->cookie[$name]) ? $this->cookie[$name] : $default; } /** * 从 SESSION 取得数据,如果指定数据不存在则返回 $default 指定的默认值 * * @param string $name * @param mixed $default * * @return mixed */ function session($name, $default = null) { return isset($this->session[$name]) ? $this->session[$name] : $default; } } /** * 用与保存和读取应用程序设置的工具类 */ class MvcConfig { /** * 应用程序设置 * * @var array */ protected $_config = array(); /** * 导入设置 * * @param array $config */ function import(array $config) { $this->_config = array_merge($this->_config, $config); } /** * 读取指定的设置,如果不存在则返回$default参数指定的默认值 * * @param string $item * @param mixed $default * @param bool $found * * @return mixed */ function get($item, $default = null, & $found = false) { if (is_array($item)) { $found = false; foreach ($item as $key) { $return = $this->get($key, $default, $found); if ($found) return $return; } return $default; } if (strpos($item, '/') === false) { $found = array_key_exists($item, $this->_config); return $found ? $this->_config[$item] : $default; } list($keys, $last) = self::_get_nested_keys($item); $config =& $this->_config; foreach ($keys as $key) { if (array_key_exists($key, $config)) { $config =& $config[$key]; } else { return $default; } } $found = array_key_exists($last, $config); return $found ? $config[$last] : $default; } /** * 修改指定的设置 * * @param string $item * @param mixed $value */ function set($item, $value) { if (strpos($item, '/') === false) { $this->_config[$item] = $value; } list($keys, $last) = self::_get_nested_keys($item); $config =& $this->_config; foreach ($keys as $key) { if (!array_key_exists($key, $config)) { $config[$key] = array(); } $config =& $config[$key]; } $config[$last] = $value; } static private function _get_nested_keys($key) { $keys = normalize($key, '/'); $last = array_pop($keys); return array($keys, $last); } } /** * MvcAppEntry 类封装了一个基本的应用程序对象 * * 如果需要定制应用程序对象,开发者可以从 MvcAppEntry 派生自己的继承类。 * 在coreapp-mini 中 每个 MvcAppEntry 对应一个内属的模块 */ class MvcAppEntry { /** * 当前请求 * * @var MvcRequest */ public $request; /** * 当前MvcAppEntry 对应的设置对象 * * @var MvcConfig */ public $config; /** * 应用程序基本路径 * * @var string */ private $_base_path; /** * 应用模块的标识 * * @var string */ private $_app_id; /** * 工具对象集合 * * @var array */ private $_tools_instance = array(); /** * 应用程序实例对象集合 * * @var array */ private static $_instances = array(); /** * 构造函数 * * 参数 $config 包含应用模块的设置,必须包含如下4个键 * * app.id: 应用模块的标识,如 pwadmin * app.base_path: 应用模块相对于根目录的基准路径,如 /modules/pwadmin * app.defentry: 应用模块的初始执行入口 * app.creator: 应用模块的创建者,如 色色 * * @param array $config * @param bool $set_instance 是否增加到实例对象列表,是则可以通过 instance(app_id)返回MvcAppEntry对象 */ function __construct(array $config, $set_instance = true) { $must_opt = array( 'app.id', 'app.base_path', 'app.defentry', 'app.creator', ); foreach ($must_opt as $opt){ if (isset($config[$opt]) && !empty($config[$opt])) continue; throw new Exception(sprintf('需要的键 "%s" 没有找到.', $opt)); } $this->config = new MvcConfig(); $this->config->import($config); $this->_app_id = $this->config->get('app.id'); $this->_base_path = rtrim($this->config->get('app.base_path'), '/\\'); $autoload_tools = $this->config->get('app.autoload_tools',null); if ($autoload_tools){ $autoload_tools = normalize($autoload_tools); foreach ($autoload_tools as $name) { $tool = $this->tool($name); if (method_exists($tool, 'autorun')) $tool->autorun(); } } $this->request = new MvcRequest($_GET, $_POST, isset($_COOKIE) ? $_COOKIE : array(), isset($_SESSION) ? $_SESSION : array()); if ($set_instance) { self::$_instances[strtolower(trim($this->_app_id))] = $this; } } /** * 取得应用程序实例 * * @param string $app_id * * @return MvcAppEntry */ static function instance($app_id) { if (!empty($app_id)){ $app_id = strtolower(trim($this->_app_id)); if ( isset(self::$_instances[$app_id]) && (self::$_instances[$app_id] instanceof MvcAppEntry) ) return self::$_instances[$app_id]; } return null; } /** * 返回应用程序根目录 * * @return string */ function base_path() { return $this->_base_ath; } /** * 返回应用模块的标识 * * @return string */ function app_id() { return $this->_app_id; } /** * 执行应用程序 * * @param string $action_name 这个应该是 将 udi 转换之后的名称 * * @return mixed */ function run($action_name = null) { // 解析请求 URL 中的动作名称 if (is_null($action_name)) { $action_name = $this->config->get('app.defentry'); } $action_name = self::_format_action_name($action_name); // 动作对象 $action_class_name = str_replace('.', '_', $action_name) . 'Action'; $action_class_file = $this->_base_path . '/actions/' . str_replace('.', '/', $action_name) . '.php'; CoreApp::import($action_class_file,true); if (!class_exists($action_class_name,false)) { return $this->_process_result($this->_on_action_not_found($action_class_name)); } // 执行动作 $action = new $action_class_name($this, $action_name); /* @var $action BaseAction */ $action->__execute(); return $this->_process_result($action->result); } /** * 生成 URL * * @param string $url * @param array $params * * @return string */ function url($url, array $params = null) { return url($url,$params); } /** * 取得指定的视图对象 * * @param string $viewname * @param array $vars * * @return View */ function view($viewname, array $vars) { return new View($this->_base_ath . '/views', $viewname, $vars); } /** * 根据 tools 设定创建并返回指定的工具对象 * * @param string $toolname * * @return object */ function tool($toolname) { if (!isset($this->_tools_instance[$toolname])) { $tool_config = $this->config->get("app.tools/{$toolname}"); if (is_array($tool_config)) { $class = $tool_config['class']; $class_file = $tool_config['file']; } else { if (is_string($tool_config) && !empty($tool_config)) { $class = $tool_config; } else { $class = ucfirst($toolname) . 'Tool'; } $file = $this->_base_path . '/tools/' . $class . '.php'; if (!is_array($tool_config)) $tool_config = array(); } CoreApp::import($file,true); $this->_tools_instance[$toolname] = new $class($this, $tool_config); } return $this->_tools_instance[$toolname]; } /** * 确定指定的工具对象是否存在 * * @param string $toolName * * @return bool */ function has_tool($toolName) { return isset($this->_tools[$toolName]); } /** * 处理动作对象的执行结果 * * @param mixed $result */ protected function _process_result($result) { $charset = $this->config->get('app.output_charset', 'utf-8'); if (is_object($result) && method_exists($result, 'execute')) { if (!headers_sent()) { header('X-Powered-By-CoreAppMini: ' . CoreApp::VER); header("Content-Type: text/html; charset={$charset}"); } return $result->execute(); } elseif (is_string($result)) { if (!headers_sent()) { header('X-Powered-By-CoreAppMini: ' . CoreApp::VER); header("Content-Type: text/html; charset={$charset}"); } return $result; } else { return $result; } } /** * 指定的控制器或动作没有找到 * * @param string $action_name */ protected function _on_action_not_found($action_name) { throw new MvcActionMissingException($action_name); } /** * 格式化动作名称 * * @param string $action_name * * @return string */ protected static function _format_action_name($action_name) { $action_name = strtolower($action_name); if (strpos($action_name, '.') !== false) { $action_name = preg_replace('/\.+/', '.', $action_name); } $action_name = trim($action_name, ". \t\r\n\0\x0B"); return preg_replace('/[^a-z\.]/', '', $action_name); } }
确实可以使用 哈哈哈 修改了下一个方法
- coreapp-mini-mvc.rar (4.9 KB)
- 下载次数: 35
- ripcord-1.1.rar (77.8 KB)
- 下载次数: 26
评论
3 楼
sharmy
2012-04-05
QeePHP还有v3?
2 楼
vb2005xu
2011-10-28
每个 sapid=0x181319811559 均当成是一个版本号
所有相同的版本号 的东西隶属于一个页面
色の(449211678) 22:34:10
当打开新页面时 sapid 产生1个新的 所以可以将 刷新与新开窗口区分出来
同理 前进/后退 按钮 也能实现
在 同一个 sapid= 中 不存在 前进/后退 因为所有操作 均使用 ajax处理
色の(449211678) 22:35:18
只存在刷新
每个 刷新 之后的url 与 该版本最后一次更新的 lasturl 比对
色の(449211678) 22:36:35
如果 lasturl存在 且 当前url不等于 lasturl 则 重定向到 lasturl
否则 执行当前页
并把当前页存到 lasturl 中
所有相同的版本号 的东西隶属于一个页面
色の(449211678) 22:34:10
当打开新页面时 sapid 产生1个新的 所以可以将 刷新与新开窗口区分出来
同理 前进/后退 按钮 也能实现
在 同一个 sapid= 中 不存在 前进/后退 因为所有操作 均使用 ajax处理
色の(449211678) 22:35:18
只存在刷新
每个 刷新 之后的url 与 该版本最后一次更新的 lasturl 比对
色の(449211678) 22:36:35
如果 lasturl存在 且 当前url不等于 lasturl 则 重定向到 lasturl
否则 执行当前页
并把当前页存到 lasturl 中
1 楼
vb2005xu
2011-10-12
http://hi.baidu.com/chenwei6111/blog/item/b3bacf38c7e86fccd462253f.html
转一个好文: 互联网敏捷开发实践之路-腾讯王速瑜
转一个好文: 互联网敏捷开发实践之路-腾讯王速瑜
发表评论
-
ws-http 最简单轻量的PHP CURL工具库
2016-07-29 20:44 2632欢迎大家拍砖 https://github.com/to ... -
Facade 包装类 -- 解决视图里面长长的命名空间调用问题
2016-04-20 10:48 1750有时候模版里面定义 ... -
PHP单例模式面试注意事项
2015-10-20 09:57 1956最近面了不少PHP从业者,有实习生也有5/6年以上的开发者 ... -
NGINX 配置 SSL 证书 搭建 HTTPS 网站
2015-10-19 19:19 2920下面是详细的配置过程: 1、在服务器上使用 Open ... -
关于php cron任务管理的实现假想
2015-10-17 21:25 1903之前每开发一个计划任务功能均需要在线上操作crontab来新 ... -
修改一些PHP工具
2014-10-24 19:27 1804原来的代码 在非框架下是木有问题的,但是用在框架下就报错, ... -
sublime text linux上中文输入问题的终极解决方案
2014-10-13 11:07 8569我一直在使用sublime text ... -
qeephp3.0 发布了
2014-10-07 17:21 1707QeePHP 是一个快速、灵活的开发框架。应用各种成熟的架构 ... -
swiftmailer 的快捷助手 qser-mailer
2014-09-09 23:52 3595近日在对charsen的修改版上进行了再次的修改与调整,对 ... -
PHP 中简单的伪造IP刷票实现
2014-05-15 17:06 2764一般而言,我们的获取用户真实ip的代码大致是这样... / ... -
PHP5.5 htmlspecialchars 返回null的坑
2014-04-25 12:23 2616昨天在写 PDO数据库封装类的 测试代码时遇到这个问题,取 ... -
PHP 5.5 empty + 魔术变量 的坑
2014-04-16 15:53 1606今天在测试代码时遇到这么一个疑问? dump((in ... -
Aert_Log: 设计一个精简易用的日志
2014-04-13 18:28 2485日志记录对于应用的 ... -
创建一个简单的短链服务类
2013-07-01 18:20 1371整理一个简单的短链算法,整理到自己的代码库中: &l ... -
收集常用的PHP简单代码
2013-06-30 17:53 2059对于日常工作中整理出来的某些功能做个简单梳理: 1 ... -
简易PHP路由,支持正反向url解析支持
2013-06-21 22:23 8233几年前实现了一个简单的正向路由,那时候不会写反向路由解析, ... -
系统学习のCACHE 学习
2012-11-21 13:58 1910http://www.phpfans.net/article/ ... -
YY 下 sql查询封装类 不知道好不好使
2012-07-18 16:44 1336<?php class Pkg_Db_Actor { ... -
生成后台管理菜单 admin_menu 类
2012-05-05 18:27 4655<?php /** * 管理菜单 * */ ... -
抽取个sql生成器工具 -- 摘自 fuelphp1.1 版本
2012-04-25 20:17 1233<?php /** * Sql 创造者类 * ...
相关推荐
qee框架目前文档不多,没有更完善的更新。希望有利于大家更好的了解该框架和学习
QEE113封装类型为侧视型(Sidelooker),意味着它的发射方向是从侧面而非正面发出,这在需要特定角度发射光线的应用中特别有用。 芯片材料采用镓砷化物(GaAs),这是一种常见的半导体材料,因其在红外光谱区的良好...
- QeePHP遵循MVC(Model-View-Controller)架构,其目录结构包括`app/`(应用程序目录)、`lib/`(库文件)、`public/`(公共文件,如CSS、JavaScript)和`tests/`(测试)等。 3. **路由与控制器** - 路由是...
ee 排队基类和现成品安装$ npm install qee用import Transform from 'qee/source/Transform' ;let queue = new TransformQueue ( ... transforms ) . process ( data ) ;延长import Queue from 'qee'class ...
FAT32 文件系统格式化图形界面工具,支持Windows 下FAT32 格式化单一分区 2000GB,是对 Windows Vista/Seven和XP 磁盘管理控制台的补充。 在 Windows2000/XP/Vista/Seven 下用其磁盘管理控制台格式化磁盘时,采用 ...
Intro 的网站后台页面与后端代码,基于laravel+vue.js。 技术栈 laravel5.4 + passport + vue2 + element-ui + axios + stylus ... * PASSWORD_CLIENT_SECRET=OdIzVLnICs7dXYz3QEe9xeo1ITr2ugpdrwR1xvGb **/ php arti
* 理解 OOP、设计模式、MVC、JS 原型、闭包、JS Level 2 事件模型等概念 作品 * 简单的卖咖啡的网站(后台代码编写、数据库设计) * 音乐 SNS 网站(后台代码编写、数据库设计、Ajax 交互、使用 Qee 开发) 外语...
[Alpha]网址匹配从URL轻松提取有趣的信息。 受Clojure的 (一个很棒的路由库)的启发。用法示例from url_match import make_schema , matchyt_be_schema = make_schema ( 'https? youtu.be /:id {t=:ts}' )match ( ...
用“Googling ...灵感来自:http://bit.ly/1HF3QEe 该应用将“编程”一词替换为“谷歌搜索StackOverflow”以及“编程”一词的其他几种变体。 这是由The Allium启发的:http://bit.ly/1HF3QEe 支持语言:English
高电压技术是电气工程及其自动化、脉冲功率与等离子体等专业的基础课程,涉及到电气电子设备内的高压绝缘问题,主要关注点在于电极间电场分布与绝缘击穿特性之间的关系。这类课程往往理论与工程实际相结合,但是因为...