diff --git a/README b/README new file mode 100644 index 00000000..ce013625 --- /dev/null +++ b/README @@ -0,0 +1 @@ +hello diff --git a/README.md b/README.md deleted file mode 100644 index 8fe2feb0..00000000 --- a/README.md +++ /dev/null @@ -1,75 +0,0 @@ -基于最新的windframework开发的phpwind9请点击-> https://github.com/phpwind/nextwind - -##关于框架 - -windframework是一个轻量级的php开源框架。它以组件工厂为核心,提供了像MVC,数据持久化,视图模板引擎等应用技术。此外`windframework`采取了一种组件化的开发模式。虽然目前的组件库还不算丰富健壮,但是基于这种开发模式,使组件的扩展变得非常的容易。`windframework`拥有一个强健的内核,它实现了基于配置的Ioc控制反转技术。开发者只需要简单的配置,就可以实现类的依赖注入,完全实现了类与类的松耦合。当然它的美妙之处还不仅于此。 - -经典的`hello world`应用实例,用一个非常熟悉的应用来开启一个新框架的学习应用吧!这个应用实例会一如既往的在浏览器窗口打印`Hello World`字样。完成这个应用我们将了解到: - -* 如何获取windframework框架源码 - -* windframework框架环境需求 - -* windframework基础的目录结构和默认运行规则 - -* 你还会创建自己的第一个action controller - -当然这个应用非常的简单,我们应该可以很快的完成这个应用并看到`hello world`的输出。我想这应该快速的拉近了我们之间的距离,但是想要做出强大的应用只是这样还远远不够。 - -##获取源码 - -通过[https://github.com/phpwind/windframework/]([https://github.com/phpwind/windframework, "windframework")获取源码。 - -##环境要求: - -* php5.1.2及以上版本。 -* 可发布的web环境,apache或nginx - -##开始我们的helloworld之旅 - -###创建应用目录文件 - -我们在web的根目录(`/var/www`或者其他地方)创建一个文件夹,命名为helloworld。将下载好的框架解压并放到该应用目录下。创建好的目录结构如下: - - /var/www/helloworld/ - wind/ 框架目录 - controller/ 应用控制器目录,业务代码放在该目录下 - controller/IndexController.php 默认访问的应用控制器 - template/ 页面模板目录 - template/index.htm 模板文件 - index.php 入口脚本文件 - - -###编辑入口脚本index.php - -在应用目录下创建入口脚本index.php,它的主要工作是加载框架并启动应用。代码如下: - - require_once ('../../wind/Wind.php'); - Wind::application()->run(); - -*PS:当然也可以同时在index.php中设置错误级别,WIND_DEBUG模式等。相关内容后面会介绍* - -###创建IndexController.php - -在应用目录下创建controller/目录。controller目录是windframework默认定义的应用控制器存放的目录,我们也可以通过手动配置的方式来改变应用的访问路径。在我们创建的 controller/ 目录下创建IndexController.php类文件。文件内容如下: - - - * @author Qiong Wu - * @version $Id: IndexController.php 2806 2011-09-23 03:28:55Z long.shi $ - * @package - */ - class IndexController extends WindController { - - public function run() { - echo 'hello world'; - } - } - ?> - -*在windframework中文件名和类名是相同的,这一点有点类似于java。windframework提供了两个应用控制器的类型‘WindSimpleController’,‘WindController’。在这里我们继承自‘WindController’,这两个应用控制器的区别,在后面会具体介绍。* - -至此,我们的`hello world` 应用已经完成。快通过浏览器访问下我们的`hello world`吧: - - http://localhost/helloworld/index.php diff --git a/_compile/config/components_config.xml b/_compile/config/components_config.xml index 7731caeb..a38a8f12 100644 --- a/_compile/config/components_config.xml +++ b/_compile/config/components_config.xml @@ -15,9 +15,10 @@ - + - + - * @copyright ©2003-2103 phpwind.com - * @license http://www.phpwind.com/license.php - * @version $Id$ - * @package wind - */ -class CompileCmdHelp { - - /** - * 获取用户输入信息 - * - * @param string $message - * @return string - */ - static public function getInput($message) { - echo $message; - return str_replace(array("\r", "\n"), '', fgets(STDIN)); - } - - /** - * 显示提示信息 - * - * @param string $message - */ - static public function showMessge($message) { - if (is_array($message)) { - foreach ($message as $key => $value) { - echo "'" . $key . "' => '" . $value . "',\r\n"; - } - } else - echo $message; - } - - /** - * 显示系统错误信息 - * - * @param string $message - * @param string $cmd - */ - static public function showError($message, $cmd = 'pack') { - $_msg = "Error: " . $message . "\r\n"; - $_msg .= "Try: " . $cmd . " help for usage\r\n"; - exit($_msg); - } -} - -?> \ No newline at end of file diff --git a/_compile/lib/CompilePack.php b/_compile/lib/CompilePack.php deleted file mode 100644 index f6cca8d5..00000000 --- a/_compile/lib/CompilePack.php +++ /dev/null @@ -1,95 +0,0 @@ - - * @copyright ©2003-2103 phpwind.com - * @license http://www.phpwind.com/license.php - * @version $Id$ - * @package wind - */ -class CompilePack { - private $extensions = 'php'; - private $_r = false; - private $_p = false; - public $fileList = array(); - public $imports = array(); - public $classes = array(); - public $namespace = array(); - - /** - * 默认为 r,p 都为 true - * - * @param boolean $r 是否递归文件夹 - * @param boolean $p 是否生成打包 - */ - public function __construct($r = false, $p = false) { - $this->_r = $r; - $this->_p = $p; - } - - /** - * 将一组文件列表合并为一个文件列表 - * - * @param array $files 文件/文件夹列表 - * @param string $packPath 打包文件存放路径 - * @param $boolean - */ - public function pack($files, $packPath = '', $namespace = '') { - $namespace = explode(' ', $namespace); - $i = 0; - foreach ($files as $filePath) { - if (!$filePath = realpath($filePath)) continue; - $_dir = dirname($filePath); - $_n = isset($namespace[$i]) ? $namespace[$i] : basename($_dir); - $_n = array(strtoupper($_n), $_dir . '/'); - $this->_import($filePath, $_n); - $i++; - } - if ($this->_p && $this->fileList) { - Wind::import('WIND:utility.WindPack'); - $pack = new WindPack(); - $pack->setContentInjectionCallBack(array($this, 'injectionImports')); - if (!$pack->packFromFileList($this->fileList, $packPath, WindPack::STRIP_PHP, true)) throw new Exception( - 'failed to create pack file (' . $packPath . ')'); - } - } - - /** - * 向打包好的文件头部注入 import 信息 - */ - public function injectionImports() { - $_content = WindString::varToString($this->imports); - $_content = str_replace(array("\r\n", "\t", " "), '', $_content); - return 'Wind::$_imports += ' . $_content . ';'; - } - - /** - * @param string $filePath - * @throws Exception - */ - private function _import($filePath, $namespace) { - if (is_dir($filePath)) { - if (false === ($files = scandir($filePath, 0))) throw new Exception( - 'the file ' . $filePath . ' open failed!'); - foreach ($files as $file) { - if (!$file || $file[0] === '.') continue; - if (!$this->_r && is_dir($filePath . '/' . $file)) continue; - $this->_import($filePath . '/' . $file, $namespace); - } - } elseif (is_file($filePath)) { - $_info = pathinfo($filePath); - if ($_info['extension'] !== 'php') return; - $this->fileList[$_info['filename']] = $filePath; - $_file = $_info['dirname'] . '/' . $_info['filename']; - $_key = str_replace(array($namespace[1], '/'), array($namespace[0] . ':', '.'), $_file); - $this->imports[$_key] = $_info['filename']; - $this->classes[$_info['filename']] = str_replace($namespace[1], '', $_file); - $this->namespace[$namespace[0]] = $namespace[1]; - Wind::$_classes[$_info['filename']] = $_file; - } else - throw new Exception($filePath . ': No such file or directory'); - } -} - -?> \ No newline at end of file diff --git a/_compile/tools/pack.php b/_compile/tools/pack.php deleted file mode 100644 index faf1ce16..00000000 --- a/_compile/tools/pack.php +++ /dev/null @@ -1,95 +0,0 @@ - - * -r 是否递归的方式打包文件夹 - * -p 将所列文件夹打包,合并成一个文件(去除空格,注释等) - * example: - * pack -pci /var/www/wind/utility /var/www/wind/base - * 这个例子中包含两个文件夹utility、base(支持文件,文件夹;支持一个或者多个)。打包工具将这两个文件夹下面的文件打包到同一个文件下。 - * 并将 /var/www/wind/ 以WIND别名注册为系统目录别名 - * - * @author Qiong Wu 2010-11-2 - * @link http://www.phpwind.com - * @copyright Copyright © 2003-2010 phpwind.com - * @license http://www.phpwind.com/license.php - */ -include '../../wind/Wind.php'; -Wind::register(dirname(dirname(__FILE__)), '_COMPILE'); -Wind::import('_COMPILE:lib.*'); - -$args = isset($_SERVER['argv']) ? $_SERVER['argv'] : array(); -if (count($args) < 2) CompileCmdHelp::showError('Not enough arguments provided'); -unset($args[0]); -$files = array(); -$params = ''; -foreach ($args as $value) { - if (!$value) continue; - if ($value[0] === '-') - $params .= trim($value, '-'); - else - $files[] = $value; -} -empty($files) && CompileCmdHelp::showError('Not enough arguments provided'); - -$params = '-' . $params; -$_p = strpos($params, 'p'); -$_r = strpos($params, 'r'); - -$packFile = $namespace = ''; -if ($_p) { - $packFile = CompileCmdHelp::getInput("Enter folder in which to save the pack file (default: /home/you/):"); - if (!$packFile) { - $processUser = posix_getpwuid(posix_geteuid()); - $packFile = '/home/' . $processUser['name'] . '/wind_basic.php'; - } - $namespace = CompileCmdHelp::getInput("Enter namespace for folder (default: folder name):"); -} - -try { - $pack = new CompilePack($_r, $_p); - $pack->pack($files, $packFile, $namespace); -} catch (Exception $e) { - CompileCmdHelp::showError($e->getMessage()); -} - -CompileCmdHelp::showMessge("Operation was successful!\r\n"); -$_p && CompileCmdHelp::showMessge( - "Your pack file has been saved in: " . $packFile . " (" . filesize($packFile) . ")\r\n"); -if ($pack->namespace) { - CompileCmdHelp::showMessge( - "If use the parameters (i or c), You need the 'wind_basic.php' is loaded before the registration of the following information to the system.\r\n"); - CompileCmdHelp::showMessge($pack->namespace); -} - -do { - $_op = CompileCmdHelp::getInput("Show Details(i/c/p):"); - switch ($_op) { - case 'i': - CompileCmdHelp::showMessge("The imports list:\r\n"); - CompileCmdHelp::showMessge($pack->imports); - break; - case 'c': - CompileCmdHelp::showMessge("The classes list:\r\n"); - CompileCmdHelp::showMessge($pack->classes); - break; - case 'p': - CompileCmdHelp::showMessge("The pack file list:\r\n"); - CompileCmdHelp::showMessge($pack->fileList); - break; - default: - $_op = ''; - break; - } -} while ($_op); - -exit(); - - - - - - - - diff --git a/_compile/tools/readme b/_compile/tools/readme deleted file mode 100644 index 632562b8..00000000 --- a/_compile/tools/readme +++ /dev/null @@ -1,5 +0,0 @@ -Performance tools 性能优化工具 - -1. pack - 打包工具,用于将一组文件打包成一个文件,并去除注释和空格。 - 通过打包,可以有效的减少字节,减少文件加载数,以及文件名处理时间。 diff --git a/demos/blog/compile/template/index.tpl b/demos/blog/compile/template/index.tpl new file mode 100644 index 00000000..adaa7580 --- /dev/null +++ b/demos/blog/compile/template/index.tpl @@ -0,0 +1,72 @@ + + + + +首页 + + + + +
+ +
+
+
+
+ +
Hi, getUsername());?> 欢迎您!
+ + +
用户登录
+
+
+
姓名*
+
+
+
+
密码*
+
+
+ + +
+ +
+
+
+
+ +
+ + \ No newline at end of file diff --git a/demos/blog/compile/template/layout.tpl b/demos/blog/compile/template/layout.tpl new file mode 100644 index 00000000..9afc98ab --- /dev/null +++ b/demos/blog/compile/template/layout.tpl @@ -0,0 +1,49 @@ + + + + +首页 + + + + +
+ +
+ content();?> +
+ +
+ + \ No newline at end of file diff --git a/demos/blog/conf/config.php b/demos/blog/conf/config.php deleted file mode 100644 index 848d10c9..00000000 --- a/demos/blog/conf/config.php +++ /dev/null @@ -1,41 +0,0 @@ - array( - 'db' => array( - 'config' => array( - 'resource' => 'conf.db_config.php', - ) - ) - ), - //应用配置,支持多个应用配置。一个应用支持多个modules(业务模块),每个modules都有一个别名用于访问。 - //当不输入任何modules时访问‘default’默认模块 - 'web-apps' => array( - 'blog' => array( - 'modules' => array( - 'default' => array( - //应用控制器访问路径定义,当前定义的路径是当前应用根目录下的‘controller/’ - 'controller-path' => 'controller', - //应用控制器后缀定义 - 'controller-suffix' => 'Controller', - //模板目录定义 - 'template-path' => 'template', - //编译文件目录定义 - 'compile-path' => 'data.compile', - //错误处理句柄定义 - 'error-handler' => 'controller.ErrorController', - ) - ), - //过滤器配置,在这里部署了一个form表单过滤器 - 'filters' => array( - 'user' => array( - 'class' => 'WIND:web.filter.WindFormFilter', - 'pattern' => 'default/Index/(login|dreg)', - 'form' => 'service.UserForm' - ) - ) - ) - ) -); diff --git a/demos/blog/config/config.php b/demos/blog/config/config.php new file mode 100644 index 00000000..2269e507 --- /dev/null +++ b/demos/blog/config/config.php @@ -0,0 +1,29 @@ + array( + 'db' => array( + 'config' => array( + 'resource' => 'config.db_config.php' + ) + ) + ), + 'web-apps' => array( + 'blog' => array( + 'modules' => array( + 'default' => array( + 'controller-path' => 'controller', + 'controller-suffix' => 'Controller', + 'error-handler' => 'BLOG:controller.ErrorController', + ) + ), + 'filters' => array( + 'user' => array( + 'class' => 'WIND:web.filter.WindFormFilter', + 'pattern' => 'default/Index/(login|dreg)', + 'form' => 'BLOG:model.UserForm' + ) + ) + ) + ), + //'router' => array('config' => array('resource' => 'BLOG:config.route_config.php')), +); \ No newline at end of file diff --git a/demos/blog/conf/db_config.php b/demos/blog/config/db_config.php similarity index 83% rename from demos/blog/conf/db_config.php rename to demos/blog/config/db_config.php index ce429f3c..729c9421 100644 --- a/demos/blog/conf/db_config.php +++ b/demos/blog/config/db_config.php @@ -1,7 +1,7 @@ 'mysql:host=localhost;dbname=test', 'user' => 'root', 'pwd' => 'phpwind.net', - 'charset' => 'utf8'); \ No newline at end of file + 'charset' => 'utf8' +); \ No newline at end of file diff --git a/demos/blog/config/route_config.php b/demos/blog/config/route_config.php new file mode 100644 index 00000000..4d35bc01 --- /dev/null +++ b/demos/blog/config/route_config.php @@ -0,0 +1,9 @@ + array( + 'WindRoute' => array( + 'class' => 'WIND:router.route.WindRewriteRoute', + //'default' => true, + ), + ), +); \ No newline at end of file diff --git a/demos/blog/conf/user.sql b/demos/blog/config/user.sql similarity index 100% rename from demos/blog/conf/user.sql rename to demos/blog/config/user.sql diff --git a/demos/blog/controller/ErrorController.php b/demos/blog/controller/ErrorController.php index 8a37de1a..75c217d1 100644 --- a/demos/blog/controller/ErrorController.php +++ b/demos/blog/controller/ErrorController.php @@ -16,8 +16,8 @@ class ErrorController extends WindErrorHandler { */ public function run() { $this->setLayout('layout'); - $this->setGlobal($this->getRequest()->getBaseUrl(true) . '/template/images', 'images'); - $this->setGlobal($this->getRequest()->getBaseUrl(true) . '/template/images', 'css'); + $this->setGlobal($this->getRequest()->getBaseUrl(true) . '/static/images', 'images'); + $this->setGlobal($this->getRequest()->getBaseUrl(true) . '/static/images', 'css'); $topic = "Blog Error"; $this->setOutput($topic, "errorHeader"); $this->setOutput($this->urlReferer, "baseUrl"); diff --git a/demos/blog/controller/IndexController.php b/demos/blog/controller/IndexController.php index bb2b1185..b2b53f89 100644 --- a/demos/blog/controller/IndexController.php +++ b/demos/blog/controller/IndexController.php @@ -1,4 +1,5 @@ session = $this->getSystemFactory()->getInstance('windSession'); + $this->userInfo = $this->session->get('user'); $this->setLayout('layout'); + $this->setGlobal($this->getRequest()->getBaseUrl(true) . '/static/images', 'images'); + $this->setGlobal($this->getRequest()->getBaseUrl(true) . '/static/images', 'css'); $this->setOutput('utf8', 'charset'); - $this->setGlobal($this->getRequest()->getBaseUrl(true) . '/template/images', 'images'); - $this->setGlobal($this->getRequest()->getBaseUrl(true) . '/template/images', 'css'); } /* (non-PHPdoc) * @see WindController::run() */ public function run() { - Wind::import('service.UserForm'); - $userService = $this->load(); - $userInfo = $userService->isLogin(); - $this->setOutput($userInfo, 'userInfo'); + $this->setOutput($this->userInfo, 'userInfo'); $this->setTemplate('index'); } - /** - * 访问用户注册页面 - */ - public function regAction() { - $this->setTemplate('reg'); - } - /** * 用户登录 */ public function loginAction() { - $userService = $this->load(); - $userInfo = $userService->isLogin(); - if ($userInfo) $this->showMessage('已登录~'); - + if ($this->userInfo) $this->showMessage('已登录,请先注销.'); /* @var $userForm UserForm */ $userForm = $this->getInput("userForm"); if (!$userForm) $this->showMessage('获取用户登录数据失败'); - if (!$userService->login($userForm)) $this->showMessage('登录失败.'); + /* @var $db WindConnection */ + $db = $this->getSystemFactory()->getInstance('db'); + $stmt = $db->createStatement('SELECT userid FROM user WHERE username=:username AND password =:password'); + if (!$stmt->getValue(array('username' => $userForm->getUsername(), 'password' => $userForm->getPassword()))) { + $this->showMessage('登录失败.'); + } + $this->session->set('user', $userForm); $this->forwardRedirect(WindUrlHelper::createUrl('run')); } + /** + * 访问用户注册页面 + */ + public function regAction() { + $this->setTemplate('reg'); + } + /** * 处理用户注册表单 */ public function dregAction() { - $userService = $this->load(); - $userForm = $this->getInput("userForm"); - if (!$userService->register($userForm)) $this->showMessage('注册失败.'); - $this->setOutput($userForm, 'userInfo'); + $this->session->destroy(); + if ($userForm = $this->getInput("userForm")) { + $db = $this->getSystemFactory()->getInstance('db'); + $stmt = $db->createStatement('SELECT * FROM user WHERE username=:username'); + if ($stmt->getOne(array(':username' => $userForm->getUsername()))) $this->showMessage('该用户已经注册.'); + if (!$db->execute( + "INSERT INTO user SET " . $db->sqlSingle( + array('username' => $userForm->getUsername(), 'password' => $userForm->getPassword())))) $this->showMessage( + '注册失败.'); + $this->setOutput($userForm, 'userInfo'); + } $this->setTemplate('reg'); } @@ -70,14 +88,7 @@ public function dregAction() { * 用户退出 */ public function logoutAction() { - $this->load()->logout(); + $this->session->destroy(); $this->forwardRedirect(WindUrlHelper::createUrl('run')); } - - /** - * @return UserService - */ - private function load() { - return Wind::getApp()->getWindFactory()->createInstance(Wind::import('service.UserService')); - } } \ No newline at end of file diff --git a/demos/blog/index.php b/demos/blog/index.php index db46cc83..66613c81 100644 --- a/demos/blog/index.php +++ b/demos/blog/index.php @@ -2,5 +2,6 @@ error_reporting(E_ALL & ~E_NOTICE & ~E_WARNING); define('WIND_DEBUG', 1); require_once '../../wind/Wind.php'; -Wind::application('blog', 'conf/config.php')->run(); + +Wind::application('blog', 'config/config.php')->run(); diff --git a/demos/blog/service/UserForm.php b/demos/blog/model/UserForm.php similarity index 100% rename from demos/blog/service/UserForm.php rename to demos/blog/model/UserForm.php diff --git a/demos/blog/service/UserService.php b/demos/blog/service/UserService.php deleted file mode 100644 index cc8a3bc8..00000000 --- a/demos/blog/service/UserService.php +++ /dev/null @@ -1,77 +0,0 @@ - 2012-3-15 - * @copyright ©2003-2103 phpwind.com - * @license http://www.windframework.com - * @version $Id$ - * @package demos - * @subpackage blog.service - */ -class UserService { - protected $cookieName = 'blogloginUser'; - - /** - * 判断用户是否登录 - * - * @return boolean|UserForm - */ - public function isLogin() { - /* @var $user UserForm */ - $user = WindCookie::get($this->cookieName); - if (!$user) return false; - $stmt = $this->_getConnecion()->createStatement('SELECT * FROM user WHERE username=:username'); - if (!$stmt->getValue(array('username' => $user->getUsername()))) return false; - - return $user; - } - - /** - * 用户退出 - * - * @return boolean - */ - public function logout() { - return WindCookie::set($this->cookieName, '', -1); - } - - /** - * 用户登录服务 - * - * @param UserForm $userInfo - * @return boolean - */ - public function login($userInfo) { - $db = $this->_getConnecion(); - $stmt = $db->createStatement('SELECT * FROM user WHERE username=:username AND password =:password'); - if (!$stmt->getValue(array('username' => $userInfo->getUsername(), 'password' => $userInfo->getPassword()))) { - return false; - } - return WindCookie::set($this->cookieName, $userInfo); - } - - /** - * 用户注册服务 - * - *@param UserForm $userInfo - *@return boolean - */ - public function register($userInfo) { - $db = $this->_getConnecion(); - $stmt = $db->createStatement('SELECT * FROM user WHERE username=:username'); - if ($stmt->getOne(array(':username' => $userInfo->getUsername()))) $this->showMessage('该用户已经注册.'); - return $db->execute( - "INSERT INTO user SET " . $db->sqlSingle( - array('username' => $userInfo->getUsername(), 'password' => $userInfo->getPassword()))); - } - - /** - * @return WindConnection - */ - private function _getConnecion() { - return Wind::getApp()->getWindFactory()->getInstance('db'); - } - -} - -?> \ No newline at end of file diff --git a/demos/blog/static/images/bg.jpg b/demos/blog/static/images/bg.jpg new file mode 100644 index 00000000..da9392cd Binary files /dev/null and b/demos/blog/static/images/bg.jpg differ diff --git a/demos/blog/static/images/bgA.png b/demos/blog/static/images/bgA.png new file mode 100644 index 00000000..882d05b1 Binary files /dev/null and b/demos/blog/static/images/bgA.png differ diff --git a/demos/blog/static/images/breadEm.png b/demos/blog/static/images/breadEm.png new file mode 100644 index 00000000..e0bd839f Binary files /dev/null and b/demos/blog/static/images/breadEm.png differ diff --git a/demos/blog/static/images/button.png b/demos/blog/static/images/button.png new file mode 100644 index 00000000..e47ce4cf Binary files /dev/null and b/demos/blog/static/images/button.png differ diff --git a/demos/blog/static/images/core.css b/demos/blog/static/images/core.css new file mode 100644 index 00000000..a0be2b6a --- /dev/null +++ b/demos/blog/static/images/core.css @@ -0,0 +1,197 @@ +/*------------------------------------- +#Description: pw_core.css +#Version: v1.0 +#Author: 2010-12-3 +#Recent: 2010-12-3 +-------------------------------------*/ +/*初始化结构*/ +body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,form,p,blockquote,th,td{margin: 0;padding: 0;} +ol,ul,li{list-style: none;} +table {border-collapse: collapse;border-spacing: 0;} +th{text-align: left;} +td,th,div{word-break:break-all;word-wrap:break-word;} +form{display:inline;} +*{outline:none} +img{border:0;} +/*模型补丁*/ +.mb5{margin-bottom:5px;} +.mb10{margin-bottom:10px;} +.mb15{margin-bottom:15px;} +.mb20{margin-bottom:20px;} +.mr5{margin-right:5px;} +.mr10{margin-right:10px;} +.mr15{margin-right:15px;} +.mr20{margin-right:20px;} +.p5{padding:5px;} +.p10{padding:10px;} +.p15{padding:15px;} +.p20{padding:20px;} +/*清楚浮动*/ +.cc{*zoom:1;} +.cc:after{content:'\20';display:block;height:0;clear:both;visibility: hidden;} +.c{clear:both;font:0px/0px Arial;overflow:hidden;height:0;width:0;} +/*通用样式*/ +.b,b,strong{ font-weight:700;} +.w{white-space:nowrap;} +.tal{text-align:left;} +.tac{text-align:center;} +.tar{text-align:right;} +.fr{float:right;} +.fl{float:left;} +.pr{position:relative;} +.cp{cursor:pointer;} +.vt{vertical-align:top;} +.link_down span{padding:0 10px 0 0;background:url(icon/down.png) center right no-repeat; display:inline-block; cursor:pointer;} +/*通用字体*/ +.f10,small,.small{font-size:10px;-webkit-text-size-adjust:none;} +.f12{font-size:12px} +.f14{font-size:14px} +.f16{font-size:16px;} +.f20{font-size:20px;} +.f24{font-size:24px;} +.fn,.fn a{font-weight:normal} +/**/ +html{ overflow-y:scroll; font-size:12px;} +.bgA{background:#f7fbff;} +/* span color*/ +.s1{color:#ff0000;} +.s2{color:#ff6600;} +.s3{color:#008800;} +.s4{color:#014c90;} +.s5{color:#000;} +.s6{color:#666;} +.gray{color:#999;} +/*link*/ +a{color:#0e6caa; text-decoration:none;} +/*提示信息*/ +.tipsA,.tipsB{background:url(tips/tips.png) 999px 999px no-repeat;border:1px solid #7eb8e5;background-color:#eff8ff;color:#0c4b7b;} +.tipsA{ background-position:-200px 0;padding:10px 20px 10px 50px;font:14px/25px Arial;} +.tipsB{ background-position:-200px -300px; padding:5px 20px 5px 30px;line-height:18px;} +.successA,.successB{background-color:#eff9e5;border:1px solid #6ac20f;color:#008800;} +.confirmA,.confirmB{border:1px solid #e2a73f;background-color:#fff7e8;color:#ff6600;} +.errorA,.errorB{border:1px solid #fe5301;background-color:#ffe5d8;color:#902800;} +.successA{ background-position:-150px -50px;} +.successB{ background-position:-150px -350px;} +.confirmA{ background-position:-100px -100px;} +.confirmB{ background-position:-100px -400px;} +.errorA{ background-position:-50px -150px;} +.errorB{ background-position:-50px -450px;} +/*弹窗*/ +.popoutContent{background:#ffffff;border:1px solid #bbbbbb;} +.bgcorner1,.bgcorner2,.bgcorner3,.bgcorner4,.pobg1,.pobg2,.pobg3,.pobg4{filter:Alpha(opacity=39);_filter:Alpha(opacity=39);opacity:.39;overflow:hidden;z-index:1005;line-height:0 } +.bgcorner1,.bgcorner2,.bgcorner3,.bgcorner4{width:5px;height:5px;background:#bbbbbb;} +.pobg1,.pobg2,.pobg3,.pobg4{ background:#bbbbbb;} +.pobg1{height:5px; } +.pobg2{width:5px;} +.pobg3{height:5px;} +.pobg4{width:5px;} +.popTop{padding:5px 10px 4px;font-weight:700;font-size:14px;color:#333;border-bottom:1px solid #d9e5f2;background:#eaf2fa;height:21px;_height:16px;} +.popTop select,.popTop input{ font-size:12px;} +.popBottom{padding:5px 10px;background:#f7f7f7;border-top:1px solid #e4e4e4;text-align:center;} +.popCont{padding:30px 50px;line-height:2;color:#333; text-align:center;} +.popTop .adel{margin-top:4px;} +.popTop ul{margin:1px 0 -4px -1px;*margin:6px 0 -5px -1px;_margin:1px 0 -5px -1px;_position:relative;height:23px;} +.popTop li{float:left;} +.popTop li a{line-height:24px;height:24px;padding:0 10px;float:left;color:#1b72af;font-size:12px; text-decoration:none; white-space:nowrap;} +.popTop li a:hover{ text-decoration:none;} +.popTop .current a{border:1px solid #d9e5f2;background:#ffffff;border-bottom:0;color:#333;} +.popoutContent table{width:100%; table-layout:fixed;} +.popoutContent th{width:80px; font-weight:100;} +.popoutContent th,.popoutContent td{padding:5px;border-top:1px solid #ebf4fc;} +.popoutContent .bgA{background:#f7fbff;} +.popoutContent label input{padding:0;margin:0 4px 3px 0;} +.popoutContent .s1{color:#ff0000;font-family:Simsun;padding:0 3px;} +/*关闭删除操作*/ +.adel,.aedit,.g_photosbox .updel{background:url(del.png) 9999px 9999px no-repeat;width:12px;height:13px;text-indent:-2000em;display:block;overflow:hidden;float:right;padding:0;-webkit-transition: all 0.2s ease-out;} +.adel,.g_photosbox .updel{ background-position:0 -15px} +.adel:hover,.g_photosbox .updel:hover{ background-position:-34px -15px;} +.aedit{ background-position:0 0;} +.aedit:hover{ background-position:-34px 0;} +/*全局按钮*/ +span.btn ,span.bt ,span.btn2 ,span.bt2 ,span.bts ,span.btn span ,span.bt span ,span.btn2 span ,span.bt2 span ,span.bts span{background:url(button.png) 9999px 9999px;} +span.btn ,span.bt ,span.btn2 ,span.bt2 ,span.bts {padding:0 2px 0 0;zoom: 1;display: inline-block;vertical-align: middle; cursor: pointer; _display: inline;margin:0 3px;} +span.btn button ,span.bt button ,span.btn2 button ,span.bt2 button ,span.bts button{display:block;overflow:visible;width:auto;_width:0;border:0 none;background:none;text-decoration:none;vertical-align:middle;white-space:nowrap;cursor:pointer;} +span.btn span,span.bt span,span.bts span{display: block;padding:0 11px 0 13px;*padding:0 13px 0 15px;} +span.btn button,span.bt button,span.bts button{height:27px;margin:0 -15px;padding:0 17px;line-height:27px;font-size:14px;font-weight:700;padding-bottom:4px;_padding-bottom:0px;} +span.btn2 span,span.bt2 span{display: block;padding:0 5px 0 7px;*padding:0 7px 0 9px;} +span.btn2 button,span.bt2 button{height:21px;margin:0 -9px;padding:0 10px;line-height:23px;padding-bottom:2px;_padding-bottom:0px;} +span.btn{background-position:right 0;} +span.btn span{background-position:0 0;} +span.btn2{background-position:right -60px;} +span.btn2 span{background-position:0 -60px;} +span.bt{ background-position:right -30px;} +span.bt span{ background-position:left -30px;} +span.bt2{ background-position:right -85px;} +span.bt2 span{ background-position:left -85px;} +span.bts{ background-position:right -110px;} +span.bts span{ background-position:0 -110px;} +span.btn button,span.btn2 button{color:#ffffff;} +span.bt button,span.bt2 button{color:#555555;} +span.bts button{color:#cd4604;} +/*表单*/ +input{padding:0;margin:0; vertical-align:middle;} +textarea,.input,select{font:12px Arial;vertical-align:middle;border:1px solid; border-color: #999999 #e1e1e1 #e1e1e1 #999999;background:#fff;color:#000;} +textarea{padding:3px;overflow:auto;line-height:1.3;} +select{padding:1px;} +.input{padding:2px 3px;font-size:1em;} +.input:hover,.textareaA:hover,select:hover{border:1px solid #23a6dd;-webkit-box-shadow:0 0 5px #9fe3ff;-moz-box-shadow:0 0 5px #9fe3ff;box-shadow:0 0 5px #9fe3ff;} +.textareaA{width:332px;height:62px;} +.input{width:152px;} +.selectA{width:340px;} +/*下拉*/ +.pw_menu{border:1px solid #a6cbe7;background:#fff; position:absolute;-webkit-box-shadow:3px 3px 0 #e4e4e4;-moz-box-shadow:3px 3px 0 #e4e4e4;box-shadow:3px 3px 0 #e4e4e4;} +/*时间控件*/ +.timeSelect{padding:1px solid #fff;width:180px;color:#333;line-height:18px;} +.timeSelect .input{width:20px;margin:0 5px;} +.timeSelect table{margin-bottom:5px;} +.timeSelect td,.timeSelect th{border-right:1px solid #d9e5f2;border-bottom:1px solid #d9e5f2; text-align:center; font-weight:100; font-family:Simsun;} +.timeSelect th{background:#f7fbff;} +.timeSelect td:hover{} +.timeSelect .sun{color:#f50;} +.timeSelect .sat{border-right:0 none;color:#080;} +.timeSelect .current,.timeSelect .current:hover{background:#308cb2;color:#fff;} +.timeSelect td span{display:block;border:1px solid #fff; cursor:pointer;-webkit-transition: all 0.5s ease-out;transition: all 0.2s ease-out;} +.timeSelect td span:hover{background:#dfeaf5;} +/*select 模拟下拉*/ +.selectDiv{border:1px solid; border-color: #999999 #e1e1e1 #e1e1e1 #999999;background:#fff;color:#000;padding-right:5px;outline:none;font:100 12px/1.5 Simsun;float:left} +.selectDiv h6{ font-size:12px; font-weight:100;padding:0 10px 0 5px;display:block;margin:0;background:url(icon/down.gif) no-repeat right center;cursor:default;} +.selectDiv:hover,.selectDiv:hover dl{border:1px solid #23a6dd;} +.selectDiv:hover dl{ display:block;} +.selectDiv * {-moz-user-select:none;} +.selectDiv dl{position:absolute;border:1px solid; border-color: #999999 #e1e1e1 #e1e1e1 #999999;background:#fff;margin-left:-1px;display:none;} +.selectDiv dd a{ text-decoration:none;color:#333;display:block;height:18px;padding:0 15px 0 5px;overflow:hidden;} +.selectDiv dd a:hover,.selectDiv dd.over a{background:#23a6dd;color:#fff;} +/*统一头像*/ +.img_50{display:block;float:left;background:url(tips/facebg.png) no-repeat;width:54px;height:54px;} +.img_50:hover{ text-decoration:none;} +.img_50 img{width:48px;height:48px;margin:3px 0 0 3px;} +/*自适应 Nature dl 55*/ +.nadlA dt{float:left;width:65px;margin-right:-65px;} +.nadlA dd,.nadlB dd{float:left;width:100%;} +.nadlA .nadlCon{margin-left:65px; position:relative;} +/*自适应 Nature dl 120*/ +.nadlB dt{float:left;width:110px;margin-right:-110px;} +.nadlB .nadlCon{margin-left:120px;position:relative;} +/*相册*/ +.albumbg{float:left;width:110px;height:114px;background:url(tips/albumbg.png) no-repeat;display:block;overflow:hidden;} +.albumbg img{float:left;width:100px;height:100px;margin:5px 0 0 5px;} +.albumList .nadlCon{padding:10px 0 0 5px;} +.albumList .nadlCon div{margin-bottom:3px;} +.albumList dl{margin-bottom:10px;} +/*新鲜事*/ +.conFeed dl{border-bottom:1px dotted #ccc;padding:10px 2px;} +.conFeed .title{ font-size:14px;margin-bottom:5px;} +.conFeed .opera{color:#bbb; font-family:Simsun;} +.conFeed .opera a{margin:0 3px;} +.conFeed .num,.conFeed .num a{color:#999;} +/*名片*/ +.popCard{width:278px;} +.popCard .popBottom{text-align:left;} +.popCard .popBottom a{margin:0 15px 0 0;padding-left:18px;display:inline-block;color:#333;} +.add_mes{ background:url(icon/mail.png) no-repeat;} +.add_fol{ background:url(icon/follow.png) no-repeat;} +.add_fri{ background:url(icon/friends.png) no-repeat;} + + + + diff --git a/demos/blog/static/images/css.css b/demos/blog/static/images/css.css new file mode 100644 index 00000000..3e1c9070 --- /dev/null +++ b/demos/blog/static/images/css.css @@ -0,0 +1,95 @@ +/*body*/ +body{ font:12px/1.5 Arial;color:#444;background:url(bg.jpg) center -40px repeat-x;} + +/*link*/ +a{color:#333; text-decoration:none;} +a:hover{color:#014c90;} + +/*layout*/ +.header,.main,.footer{width:960px;margin-left:auto;margin-right:auto;} + +/*grid*/ +.cm{float:left;width:100%;min-height:1px;} +.cw{position:relative;} +.sd{width:250px;float:left;} +.md{width:250px;float:left;} +.grid_2 .cw{margin-right:260px;} +.grid_2 .sd{margin-left:-250px;} +.grid_2r .cw{margin-left:260px;} +.grid_2r .sd{margin-right:-260px;} +.grid_3 .cw{margin:0 260px;} +.grid_3 .md{width:250px;margin-right:-250px;} +.grid_3 .sd{margin-left:-250px;} +.grid_3r .cw{margin-right:520px;} +.grid_3r .sd{margin-left:-510px;} +.grid_3r .md{margin-left:-250px;} + +/*nav*/ +#navA{background:#176eac;border:1px solid #085e9c;} +.navA{border:1px solid #2580c1;height:33px;border-left:0;} +.navA ul{} +.navA li{float:left;border-right:1px solid #085e9c;border-left:1px solid #2580c1;} +.navA li a{display:block;float:left;height:33px;padding:0 15px;color:#fff; font:bold 14px/33px Arial;} +.navA li.current a,.navA li a:hover{background:#085e9c;} +.navA li.tail{height:33px;border-right:0;width:2px;overflow:hidden;} +.navB{background:#f7f7f7;border:1px solid #ccc;border-top:0 none;} +.navB ul{padding:5px 5px 3px;} +.navB li{float:left;} +.navB li a{display:block;float:left;height:25px;padding:0 10px; font:12px/25px Arial; white-space:nowrap;} + +/*login header*/ +.login_header{ text-align:left;padding-top:5px;} +.login_dlA{margin-bottom:5px;} +.login_dlA dt,.login_dlA dd{float:left;margin-left:5px;} +.login_dlA dd{width:60px;} +.login_dlA .input{width:100px;} +.login_dlA .bt2,.login_dlA .btn2{margin:0;} +.login_dlA .bt2 button,.login_dlA .btn2 button{width:60px;} + +/*footer*/ +.footer{border-top:1px solid #ccc;padding:10px 0; text-align:center;color:#999;} +.bottom{margin-bottom:5px;} +.bottom li{ display:inline-block;} +.bottom li a{margin:0 8px 0 5px;} + +/*boxA*/ +.bA{background:#ffffff;border:1px solid #c0d8ea;border-top:2px solid #065792;} +.bB{border:1px solid #e4e4e4;background:#ffffff;} + +/*head title*/ +.hdA,.hdB{line-height:26px;height:26px;padding:0 10px;font-size:12px;} +.hdA{border-bottom:1px solid #ccc;background:#f7f7f7;} +.hdB{border-bottom:1px solid #e4e4e4;background:#f7f7f7 url(hdB.png) 0 -26px repeat-x;padding-left:24px;} + +/*tags*/ +.tags li{float:left;margin-right:10px; white-space:nowrap;} + +/*dome_dlA*/ +.dome_dlA {padding-bottom:40px;} +.dome_dlA dl{padding:25px 30px;border-bottom:1px dotted #ccc;} +.dome_dlA dt a{ text-decoration:underline;} +.dome_dlA dd { font-family:Simsun;} +.dome_dlA dd cite{ font-style:normal;color:#008800;margin-right:10px;} +.dome_dlA dd a{color:#014c90;} + +/*breadCrumb*/ +#breadCrumb{zoom:1; border:1px solid #c1d8ea;background:#f5fafe;padding:0 5px 0 10px;margin-bottom:10px;border-top:0;} +#breadCrumb a{line-height:30px;float:left;} +#breadCrumb em{height:30px;background:url(breadEm.png) 0 0 no-repeat;width:10px;overflow:hidden;margin:0 5px;float:left;} +#breadCrumb img.breadHome{float:left;margin:6px 5px 0 0;} + + +/*content*/ +.content{padding:20px 30px 100px;min-height:300px;_height:300px;line-height:1.8em;} +.content h1{ font-size:22px;color:#014c90; text-align:center;padding:5px 0;} +.content h3{background:#eaf2fa;color:#333;padding:3px 10px;border-left:3px solid #d9e5f2;} +.content h4{padding:5px 0 5px 15px;} +.content ol{list-style-type:decimal;margin-left:40px;} +.content ol li{list-style-type:decimal;} + +.input_320{width:332px;} +.input_err,.input_err:hover{background:#f8e6e6;border:1px solid #d1aaaa;} +.read_info{ text-align:center;border-bottom:1px dotted #ccc;padding:10px 0 5px; font-family:Simsun;margin-bottom:20px;} +.read_info a{color:#014c90;} + + diff --git a/demos/blog/static/images/del.png b/demos/blog/static/images/del.png new file mode 100644 index 00000000..285698b8 Binary files /dev/null and b/demos/blog/static/images/del.png differ diff --git a/demos/blog/static/images/hdB.png b/demos/blog/static/images/hdB.png new file mode 100644 index 00000000..2654a078 Binary files /dev/null and b/demos/blog/static/images/hdB.png differ diff --git a/demos/blog/static/images/home.gif b/demos/blog/static/images/home.gif new file mode 100644 index 00000000..95fd38b3 Binary files /dev/null and b/demos/blog/static/images/home.gif differ diff --git a/demos/blog/static/images/logo.png b/demos/blog/static/images/logo.png new file mode 100644 index 00000000..ab101a8f Binary files /dev/null and b/demos/blog/static/images/logo.png differ diff --git a/demos/blog/template/error.htm b/demos/blog/template/error.htm index 8abc46dc..bd5b5e35 100644 --- a/demos/blog/template/error.htm +++ b/demos/blog/template/error.htm @@ -1,16 +1,17 @@
-
    +
      -
    • {$error}
    • +
    • {$key}. {$error}
    • -
+
- -

You Can Get Help In:

+ +

You Can Get Help In:

> cc 作用于父模型 ->> c 作用于浮动模型后,父模型区域里 -=================== -*/ -.cc{ - zoom:1; -} -.cc:after{ - content:'\20'; - display:block; - height:0; - clear:both; - visibility: hidden; -} - -/* -=================== -结构 -=================== -*/ -html{ - overflow-y:scroll; -} -body{ - background:url(bg.png); - font:14px/1.5 Arial "Microsoft Yahei"; -} -.head_wrap{ - background:url(head.png); - height:90px; -} -.main_wrap{ - border-top:1px solid #ffffff; - min-height:600px; -} -.head, -.main{ - width:800px; - margin:0 auto; -} -.main{ - padding:20px 0; -} -a{ - color:#3a7cbb; - text-decoration:none; -} -a:hover{ - text-decoration:underline; -} - -/* -=================== -logo -=================== -*/ -.logo{ - float:left; - margin:25px 0 0 0; -} - -/* -=================== -导航 -=================== -*/ -.nav{ - float:right; - padding-top:42px; -} -.nav li{ - float:left; - margin-left:30px; - padding:15px 0; - position:relative; -} -.nav li a{ - color:#fff; - font-size:14px; - font-weight:700; - text-decoration:none; -} -.nav li.current em{ - position:absolute; - width:0; - height:0; - padding:0; - bottom:0; - left:50%; - margin-left:-8px; - border-bottom:8px #fff solid; - border-top:8px transparent dashed; - border-right:8px transparent dashed; - border-left:8px transparent dashed; - overflow:hidden; -} - -/* -=================== -底部 -=================== -*/ -.footer_wrap{ - background:#000; - padding:5px; - color:#999; - text-align:center; - font-size:12px; -} - -/* -=================== -通用标题 -=================== -*/ -.h{ - font-size:16px; - font-weight:400; - padding:10px 0; - background:url(hr.png) 0 bottom repeat-x; -} - -/* -=================== -首页框架简介 -=================== -*/ -.home_info{ - padding:15px 0; - font-size:14px; - color:#666; - line-height:1.8; -} - -/* -=================== -下载 -=================== -*/ -.home_down{ - padding:15px 0; - color:#666; -} -.home_down .downlink{ - height:56px; - margin-bottom:15px; -} -.home_down .other{ - padding-bottom:10px; -} -.home_down .other a{ - margin-right:20px; -} - -/* -=================== -下载按钮 -=================== -*/ -.zip_down, -.tar_down{ - float:left; - height:56px; - width:211px; - overflow:hidden; - text-indent:-2000em; - background:url(down.png) no-repeat; - margin-right:20px; -} -.zip_down:hover{ - background-position:0 -56px; -} -.tar_down{ - background-position:0 -112px; -} -.tar_down:hover{ - background-position:0 -168px; -} - -/* -=================== -优点 -=================== -*/ -.home_actor{ - padding:15px 0; -} -.home_actor li{ - float:left; - width:49.8%; - height:120px; - padding:15px 0 0; - font-size:16px; - color:#666; -} -.home_actor li span{ - overflow:hidden; - float:left; - width:280px; -} -.home_actor li:hover span{ - color:#115cb7; -} -.home_actor li p{ - float:left; - width:300px; - font-size:12px; - color:#999; -} -.home_actor li:hover p{ - color:#333; -} -.home_actor li em{ - width:30px; - height:30px; - float:left; - margin-right:15px; - background:url(num.png) no-repeat; - text-indent:-2000em; - overflow:hidden; -} -.home_actor li em.num_1{ - background-position:0 0; -} -.home_actor li em.num_2{ - background-position:-30px 0; -} -.home_actor li em.num_3{ - background-position:-60px 0; -} -.home_actor li em.num_4{ - background-position:-90px 0; -} -.home_actor li em.num_5{ - background-position:-120px 0; -} -.home_actor li em.num_6{ - background-position:-150px 0; -} -.home_actor li em.num_7{ - background-position:-180px 0; -} -.home_actor li em.num_8{ - background-position:-210px 0; -} -.home_actor li em.num_9{ - background-position:-240px 0; -} -.home_actor li em.num_10{ - background-position:-270px 0; -} -.home_actor li em.num_11{ - background-position:-300px 0; -} -.home_actor li em.num_12{ - background-position:-330px 0; -} -.home_actor li em.num_13{ - background-position:-360px 0; -} -.home_actor li em.num_14{ - background-position:-390px 0; -} -.home_actor li em.num_15{ - background-position:-420px 0; -} -.home_actor li em.num_16{ - background-position:-450px 0; -} -.home_actor li em.num_17{ - background-position:-480px 0; -} -.home_actor li:hover{ - color:#333; -} - -/* -=================== -项目背景 -=================== -*/ -.project_bg{ - padding:20px 0; - color:#444; -} -.project_bg p{ - padding:0 0 20px; - line-height:1.8; - text-indent:2em; -} - -/* -=================== -框架介绍 -=================== -*/ -.framework_info{ - padding:0; - color:#444; -} -.framework_info h3{ - padding-top:20px; - font-size:16px; - margin-bottom:10px; - color:#074179; -} -.framework_info h4{ - font-size:14px; - margin-bottom:10px; - color:#5183b2; -} -.framework_info p{ - padding:0 0 20px; - line-height:1.8; - text-indent:2em; -} -.framework_info .thumb{ - padding:10px; - background:#fff; - border:1px solid #e4e4e4; - text-align:center; - margin-bottom:10px; - overflow:hidden; -} -.framework_info .thumb p{ - padding:10px 0 0; -} -.framework_info ol{ - margin-left:3em; - margin-bottom:20px; -} - -.code{ - border:1px solid #e4e4e4; - min-height:200px; - margin-bottom:20px; - background:#fff; -} - - - - - - - -.login{ - padding:50px 20px; -} -.login dd{ - padding:5px 0 20px; -} -.login .input{ - padding:4px 4px; - font-size:100%; - line-height:18px; - border:1px solid #ccc; - background-color:#fff; - box-shadow:2px 2px 2px #f0f0f0 inset; - vertical-align: middle; - margin: 0; - font-family: inherit; - color:#333; - width:200px; -} -.input:focus{ - outline:1px solid #99d8f5; - border-color:#99d8f5; -} -.login button{ - overflow:visible; - padding:0 0px; - cursor:pointer; - height:30px; - text-align:center; - width:80px; -} - - - - - - - - - - - diff --git a/demos/blog/template/index.htm b/demos/blog/template/index.htm index a006e1b4..4acecb4f 100644 --- a/demos/blog/template/index.htm +++ b/demos/blog/template/index.htm @@ -1,23 +1,24 @@ - +

+
+
Hi, {$userInfo->getUsername()} 欢迎您!
-

用户登录

-
- + +
+
+
+
\ No newline at end of file diff --git a/demos/blog/template/layout.htm b/demos/blog/template/layout.htm index 7c01dd66..3836b80c 100644 --- a/demos/blog/template/layout.htm +++ b/demos/blog/template/layout.htm @@ -1,32 +1,49 @@ - + 首页 - + + -
-
- -