0%

知识太多了就容易装B,知识太少就容易犯浑,像我这样不多不少刚刚好,想装B就装B,想犯浑就犯浑。

准备

1
2
3
php artisan make:auth
php artisan migrate
npm install

注册用户以后登录到 home, 接下来我们会在 home 视图上创建我们的第一个组件;

使用laravel提供的一个默认组件

执行命令

1
npm run dev

默认组件位置:

1
la555\resources\assets\js\components\Example.vue

组件注册位置:

1
2
la555\resources\assets\js\app.js
Vue.component('example', require('./components/Example.vue'));

在视图页面中直接使用:

1
<example></example>

刷新页面即可

创建我们自己的组件

创建组件并注册使用

1
la555\resources\assets\js\components\Like.vue
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<template>
<button
class="btn btn-default"
>
like
</button>
</template>

<script>
export default {
mounted() {
console.log('初次加载')
}
}
</script>

注册

1
2
3
4
5
Vue.component('example', require('./components/Example.vue'));
Vue.component('like', require('./components/Like.vue'));
const app = new Vue({
el: '#app'
});

在模版页面中使用

1
<like></like>

组件传参数

1
<like user="{{ Auth::id() }}" title="yangzie"></like>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<template>
<button
class="btn btn-default"
>
like
</button>
</template>

<script>
export default {
props: ['user', 'title'],
mounted() {
console.log(this.user);
console.log(this.title);
}
}
</script>

年纪越大,越没有人会原谅你的穷

简介

Laravel Mix 提供了一套流式 API,使用一些通用的 CSS 和 JavaScript 预处理器为 Laravel 应用定义 Webpack 构建步骤。通过简单的方法链,你可以流式定义资源管道。例如:

1
2
mix.js('resources/assets/js/app.js', 'public/js')
.sass('resources/assets/sass/app.scss', 'public/css');

如果你对如何开始使用 Webpack 和前端资源编译感到困惑,那么你会爱上 Laravel Mix。不过,并不是强制要求在开发期间使用它。你可以自由选择使用任何前端资源管道工具,或者压根不使用。

webpack用法

Mix 是位于 Webpack 顶层的配置层,所以要运行 Mix 任务你只需要在运行包含在默认 package.json 文件中的其中某个 NPM 脚本即可:

1
2
3
4
5
6
7
8
9
10
11
12
// 1.安装package.json 包
npm install

// 2.运行所有 Mix 任务...
npm run dev

// 运行所有 Mix 任务并减少输出...
// npm run production

// 3.监控前端资源改变
npm run watch
监控前端资源改变

npm run watch命令将会持续在终端运行并监听所有相关文件的修改,Webpack将会在发现修改后自动重新编译资源文件:

webpack.mix.js 添加版本

1
2
3
4
5
const { mix } = require('laravel-mix');

mix.js('resources/assets/js/app.js', 'public/js')
.sass('resources/assets/sass/app.scss', 'public/css')
.version();

前端app.blade.php引入资源方法修改:

1
2
3
4
5
<!-- Styles -->
<link href="{{ mix('css/app.css') }}" rel="stylesheet">

<!-- Scripts -->
<script src="{{ mix('js/app.js') }}"></script>

Laravel-elixir

旧版本用的是laravel-elixir处理的,只需执行gulp命令即可整合前端的资源,gulpfile.js为入口文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var elixir = require('laravel-elixir');

/*
|--------------------------------------------------------------------------
| Elixir Asset Management
|--------------------------------------------------------------------------
|
| Elixir provides a clean, fluent API for defining some basic Gulp tasks
| for your Laravel application. By default, we are compiling the Sass
| file for our application, as well as publishing vendor resources.
|
*/

elixir(function(mix) {
mix.sass('app.scss')
.browserify('app.js');
mix.version(['js/app.js', 'css/app.css'])
});

如果运行该命令后,全端资源有缓存影响,我们可以在上边的配置文件中,对输出的资源加版本:

1
mix.version(['app.js', 'app.css'])

在前端 HTML 页面引入打包后的 css 或 js 资源时,可以用全局的方法 elixir这样写:

1
2
3
4
5
6
7
<!-- Styles -->
// <link href="{{ asset('css/app.css') }}" rel="stylesheet">
<link href="{{ elixir('css/app.css') }}" rel="stylesheet">

<!-- Scripts -->
// <script src="{{ asset('js/app.js') }}"></script>
<script src="{{ elixir('js/app.js') }}"></script>

然后再执行gulp命令:

1
gulp

https://segmentfault.com/a/1190000008666954

如果这件事不是发生在我身上,那可真是太搞笑了。
### 问题 Laravel 框架内,因为安全的原因考虑,默认对所有 cookie 进行加密存储。 有些时候,你想设置一个 Cookie 是不加密的,例如想用来跟 JS 交互,JS 可以直接读取到明文,可是以下面的代码设置后:
1
Cookie::queue('cookie_for_js', 'can you read me?', 99999999);
得到的却是一个加密后的字符串;

解决方案

添加到 App\Http\Middleware\EncryptCookies 的 排除名单 中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php

namespace App\Http\Middleware;

use Illuminate\Cookie\Middleware\EncryptCookies as BaseEncrypter;

class EncryptCookies extends BaseEncrypter
{
/**
* The names of the cookies that should not be encrypted.
*
* @var array
*/
protected $except = [
'cookie_for_js',
];
}

即可。

去除 HTTP ONLY

如果要给 JS 读取的话,要把 cookie 的 http only 属性去掉,请使用以下代码:

1
Cookie::queue('cookie_for_js', 'can you read me?', $minutes = 99999999, $path = null, $domain = null, $secure = false, $httpOnly = false);

https://laravel-china.org/topics/1758/tips-to-share-in-the-laravel-is-not-encrypted-cookie

你要知道,有一句话,普天之下莫非王土。但还有一句话,天高皇帝远。
Redis 是一个开源的内存数据库服务器,得益于内建的数据类型,Redis 不仅仅只能做简单的 key/value 存储。

Predis

predis,是PHP版本写的redis client,

Phpredis

php extension redis是PHP原生扩展,C写的,对于大量使用 Redis 的应用程序来说会产生更好的性能。

长连接 vs 短连接

  • 当使用pconnect时,连接会被重用,连接的生命周期是fpm进程的生命周期,而非一次php的执行。

  • 如果代码中使用pconnect, close的作用仅是使当前php不能再进行redis请求,但无法真正关闭redis长连接,连接在后续请求中仍然会被重用,直至fpm进程生命周期结束。

https://github.com/phpredis/phpredis

每个人都是他人生的主角, 可是一旦沦为配角,就是他最伤心的时候。
select2是一个可以给你定制支持搜索、标签、远程数据集,无限滚动,以及其他常用功能的一个下拉框美化插件。总之,功能很强大。 ### 配置
1
2
<link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.2/css/select2.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.2/js/select2.min.js"></script>

基本使用

1
2
3
<script type="text/javascript">
$('select').select2();
</script>

单选框

1
2
3
4
5
6
7
8
9
10
11
<script type="text/javascript">
$(document).ready(function() {
$(".js-example-basic-single").select2();
});
</script>

<select class="js-example-basic-single">
<option value="AL">Alabama</option>
...
<option value="WY">Wyoming</option>
</select>

多选框

1
2
3
4
5
6
7
8
9
<script type="text/javascript">
$(".js-example-basic-multiple").select2();
</script>

<select class="js-example-basic-multiple" multiple="multiple">
<option value="AL">Alabama</option>
...
<option value="WY">Wyoming</option>
</select>

提示信息

1
2
3
4
5
6
7
$(".js-example-placeholder-single").select2({
placeholder: "Select a state",
allowClear: true //可以删除
});
$(".js-example-placeholder-multiple").select2({
placeholder: "Select a state"
});

加载数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<script type="text/javascript">
var data = [
{ id: 0, text: 'enhancement' },
{ id: 1, text: 'bug' },
{ id: 2, text: 'duplicate' },
{ id: 3, text: 'invalid' },
{ id: 4, text: 'wontfix' }];
$(".js-example-data-array").select2({
data: data
})
$(".js-example-data-array-selected").select2({
data: data
})
</script>
<select class="js-example-data-array"></select>
<select class="js-example-data-array-selected">
<option value="2" selected="selected">duplicate</option>
</select>

加载远程数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
$(".js-data-example-ajax").select2({
ajax: {
url: "https://api.github.com/search/repositories",
dataType: 'json',
delay: 250,
data: function (params) {
return {
q: params.term, // search term
page: params.page
};
},
processResults: function (data, params) {
// parse the results into the format expected by Select2
// since we are using custom formatting functions we do not need to
// alter the remote JSON data, except to indicate that infinite
// scrolling can be used
params.page = params.page || 1;
return {
results: data.items,
pagination: {
more: (params.page * 30) < data.total_count
}
};
},
cache: true
},
escapeMarkup: function (markup) { return markup; }, // let our custom formatter work
minimumInputLength: 1,
templateResult: formatRepo, // omitted for brevity, see the source of this page
templateSelection: formatRepoSelection // omitted for brevity, see the source of this page
});

禁用模式

1
2
3
4
5
6
7
8
$(".js-programmatic-enable").on("click", function () {
$(".js-example-disabled").prop("disabled", false);
$(".js-example-disabled-multi").prop("disabled", false);
});
$(".js-programmatic-disable").on("click", function () {
$(".js-example-disabled").prop("disabled", true);
$(".js-example-disabled-multi").prop("disabled", true);
});

禁用结果

1
2
3
4
5
<select class="js-example-disabled-results">
<option value="one">First</option>
<option value="two" disabled="disabled">Second (disabled)</option>
<option value="three">Third</option>
</select>

限制个数

1
2
3
$(".js-example-basic-multiple-limit").select2({
maximumSelectionLength: 2
});

隐藏搜索框

1
2
3
$(".js-example-basic-hide-search").select2({
minimumResultsForSearch: Infinity
});

DOM事件

1
2
3
4
5
6
7
8
9
change //选中或删除触发
select2:open //下拉框打开触发
select2:opening //下拉框打开之前
select2:close //下拉框关闭
select2:closing //下拉框关闭之前
select2:select //选中结果触发
select2:selecting //选中之前
select2:unselect //结果未选中
select2:unselecting //结果未选中之前
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
var $eventLog = $(".js-event-log");
var $eventSelect = $(".js-example-events");
$eventSelect.on("select2:open", function (e) { log("select2:open", e); });
$eventSelect.on("select2:close", function (e) { log("select2:close", e); });
$eventSelect.on("select2:select", function (e) { log("select2:select", e); });
$eventSelect.on("select2:unselect", function (e) { log("select2:unselect", e); });
$eventSelect.on("change", function (e) { log("change"); });
function log (name, evt) {
if (!evt) {
var args = "{}";
} else {
var args = JSON.stringify(evt.params, function (key, value) {
if (value && value.nodeName) return "[DOM node]";
if (value instanceof $.Event) return "[$.Event]";
return value;
});
}
var $e = $("<li>" + name + " -> " + args + "</li>");
$eventLog.append($e);
$e.animate({ opacity: 1 }, 10000, 'linear', function () {
$e.animate({ opacity: 0 }, 2000, 'linear', function () {
$e.remove();
});
});
}

自定义控制

1
2
3
4
5
6
7
8
9
var $example = $(".js-example-programmatic").select2();
var $exampleMulti = $(".js-example-programmatic-multi").select2();
$(".js-programmatic-set-val").on("click", function () { $example.val("CA").trigger("change"); });
$(".js-programmatic-open").on("click", function () { $example.select2("open"); });
$(".js-programmatic-close").on("click", function () { $example.select2("close"); });
$(".js-programmatic-init").on("click", function () { $example.select2(); });
$(".js-programmatic-destroy").on("click", function () { $example.select2("destroy"); });
$(".js-programmatic-multi-set-val").on("click", function () { $exampleMulti.val(["CA", "AL"]).trigger("change"); });
$(".js-programmatic-multi-clear").on("click", function () { $exampleMulti.val(null).trigger("change"); });

标签支持

1
2
3
$(".js-example-tags").select2({
tags: true
})

自动标记

当我们输入值匹配成功后 键入空格就会自动标签化

1
2
3
4
$(".js-example-tokenizer").select2({
tags: true,
tokenSeparators: [',', ' ']
})

自定义查找匹配

1
2
3
4
5
6
7
8
9
10
11
12
function matchStart (term, text) {
if (text.toUpperCase().indexOf(term.toUpperCase()) == 0) {
return true;
}
return false;
}
$.fn.select2.amd.require(['select2/compat/matcher'],
function (oldMatcher) {
$(".js-example-matcher-start").select2({
matcher: oldMatcher(matchStart)
});
});

其他

关于select2的CDN资源整理:http://www.bootcdn.cn/select2/

1
2
3
4
5
<link href="http://libs.baidu.com/bootstrap/3.0.3/css/bootstrap.min.css" rel="stylesheet">
<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
<script src="http://libs.baidu.com/bootstrap/3.0.3/js/bootstrap.min.js"></script>
<script src="http://cdn.bootcss.com/select2/4.0.2/js/select2.js"></script>
<link href="http://cdn.bootcss.com/select2/4.0.2/css/select2.css" rel="stylesheet" />

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<select id="sel_menu2" multiple="multiple" name="tags" class="form-control">
<optgroup label="选择标签">
<option value="1">用户管理</option>
<option value="2">角色管理</option>
<option value="3">部门管理</option>
<option value="4">菜单管理</option>
</optgroup>
</select>
<script type="text/javascript">
//多选
$("#sel_menu2").select2({
tags: true,
maximumSelectionLength: 5 //最多能够选择的个数
});
</script>

https://www.bandari.net/blog/14
https://stackoverflow.com/questions/14577014/select2-dropdown-but-allow-new-values-by-user
https://my.oschina.net/corwien/blog/672858

当我站在瀑布前,觉得非常的难过,我总觉得,应该是两个人站在这里

安装步骤

1.在mysql官网下载压缩包,我选取的是最新版的5.7.17连接:https://dev.mysql.com/downloads/mysql/
2.趁着下载的时间可以把之前的数据库数据备份下,我把 phpStudy 中 MySQL 文件夹可以重命名下,备用
3.把下载的 MySQL 压缩文件解压至 phpStudy 下的 MySQL目录,复制my-default.ini ,重命名为 my.ini。
4.打开 my.ini,找到 #basedir 处编辑:(我的安装在了C盘,路径根据phpstudy的安装路径选择)

1
2
basedir = C:\phpStudy7\MySQL
datadir = C:\phpStudy7\MySQL\data

5.在cmd下进入MySQL的bin目录(我的是 C:\phpStudy7\MySQL\bin),(初始化数据库:mysqld --initialize)

错误解决

错误一

如果是timestamp的错误,在my.ini中添加

1
2
[mysqld]
explicit_defaults_for_timestamp=true

错误二

如果有[ERROR]mysqld:Error while setting value
‘’ONLY_FULL_GROUP_BY,NO_AUTO_VALUE_ON_ZERO,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,’to ‘sql_mode’
在my.ini中添加

1
2
[mysqld]
sql_mode='NO_AUTO_VALUE_ON_ZERO,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,PIPES_AS_CONCAT,ANSI_QUOTES'

错误三

如果是错误:initialize specified but the data directory has files in it.aborting
管理员身份运行cmd,然后cd至mysql下的bin,运行mysql install,然后就成功了
或者mysql中的data目录已经有数据了, 清空重新执行
执行完后,重启phpstudy

错误四

此时登入 MySQL 报错:#1045 无法登录 MySQL 服务器,
打开 my.ini,找到 [mysqld],在下面添加:

1
skip-grant-tables #(此参数用于忘记mysql密码)并保存

此时使用 root 账号,密码处按回车即可登录。
如果想增加密码,在无密码的情况下进去mysql命令行,找到mysql数据库的user表:修改密码:
update user set authentication_string=’新密码’ where user=’root’ ;
此时仍然用root密码仍登录不进去的话,在phpstudy修改密码,原来的密码为空

http://www.jianshu.com/p/b238da2f9134

被人看得见的努力,都是肤浅的努力
### 原文 If you don't put a die() or exit() after your header('Location: http://something') your script may continue resulting in unexpected behaviour. This may for example result in content being disclosed that you actually wanted to prevent with the redirect (HTTP 301). The aforementioned may not directly be visible for an end user as the browser may not render it (due to the 301). Conclusion, the exit() and die() functions stop the script from continuing.

翻译

这句话的意思是说如果你不在header(‘Location: http://something')你的脚本后面加上 die() 或者 exit(), 你的脚本就会继续向下执行,这样你的脚本就可能跳转不成功;

https://stackoverflow.com/questions/8665985/php-utilizing-exit-or-die-after-headerlocation

走出来的是因为从来没进去过, 进去了的, 我从没见过走出来的
大部分时候我们项目的业务逻辑是同步阻塞运行的,但是有些时候会遇到一些耗时较大的操作,比如向十万个用户群发通知邮件,我们的程序不可能等待十万次循环后再执行其他操作,这种时候我们会采用异步操作,由 worker 进程向 task 进程发送任务,task 进程处理完全部任务之后通过onFinish回调函数通知 worker 进程。 ### 创建命令行类 创建application/console/AsyncTask.php文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
<?php
namespace App\Console;

use think\console\Command;
use think\console\Input;
use think\console\Output;


class AsyncTask extends Command
{
protected $server;

// 设置命令行名称,以及命令行描述
protected function configure()
{
$this->setName('task:start')->setDescription('Start TCP(Timer) Server!');
}

protected function execute(Input $input, Output $output)
{
$this->server = new \swoole_server("0.0.0.0", 9501);
$this->server->set([
'worker_num' => 4,
'daemonize' => false,
'task_worker_num' => 4 # task 进程数
]);
$this->server->on('Start', [$this, 'onStart']);
$this->server->on('Connect', [$this, 'onConnect']);
$this->server->on('Receive', [$this, 'onReceive']);
$this->server->on('Task', [$this, 'onTask']);
$this->server->on('Finish', [$this, 'onFinish']);
$this->server->on('Close', [$this, 'onClose']);
$this->server->start();
}
// 主进程启动时回调函数
public function onStart(\swoole_server $server)
{
echo "开始\n";
}
// 建立连接时回调函数
public function onConnect(\swoole_server $server, $fd, $from_id)
{
echo "连接上了\n";
}

public function onReceive(\swoole_server $server, $fd, $from_id, $data)
{
//echo "message: {$data} form Client: {$fd} \n";
// 投递异步任务
$task_id = $server->task($data);
// echo "Dispath AsyncTask: id={$task_id}\n";
// 将受到的客户端消息再返回给客户端
$server->send($fd, "Message form Server: {$data}, task_id: {$task_id}");
}


// 异步任务处理函数
public function onTask(\swoole_server $server, $task_id, $from_id, $data)
{
echo "{$task_id}, 任务处理 \n";
$server->finish("$data -> OK");
}

public function onFinish(\swoole_server $server, $task_id, $data)
{
echo "结束";
}

// 关闭连时回调函数
public function onClose(\swoole_server $server, $fd, $from_id)
{
echo "结束\n";
}

}

修改配置文件

文件所在 application/command.php

1
2
3
4
5
<?php

return [
'app\console\AsyncTask',
];

启动任务

1
php think task:start

使用 telnet 进行测试

建议使用 xshell

1
telnet 60.205.200.40 9501

连接上服务器后,输入hello回车,发送消息给 TCP 服务器,将受到一下回执

http://www.iswoole.com/article/2066

我有一把折断的剑,一条荆棘的路,一个看不清的未来和一场回不去的梦。
### 创建命令行类

创建application/console/Timer.php文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
<?php

namespace app\Console;


use think\console\Command;
use think\console\Input;
use think\console\Output;

class Timer extends Command
{
protected $server;
// 命令行配置函数
protected function configure()
{
// setName 设置命令行名称
// setDescription 设置命令行描述
$this->setName('timer:start')->setDescription('Start TCP(Timer) Server!');
}
// 设置命令返回信息
protected function execute(Input $input, Output $output)
{
$this->server = new \swoole_server('0.0.0.0', 9501);
$this->server->set([
'worker_num' => 4,
'daemonize' => false,
]);
$this->server->on('Start', [$this, 'onStart']);
$this->server->on('WorkerStart', [$this, 'onWorkerStart']);
$this->server->on('Connect', [$this, 'onConnect']);
$this->server->on('Receive', [$this, 'onReceive']);
$this->server->on('Close', [$this, 'onClose']);
$this->server->start();
// $output->writeln("TCP: Start.\n");
}
// 主进程启动时回调函数
public function onStart(\swoole_server $server)
{
echo "Start" . PHP_EOL;
}
// Worker 进程启动时回调函数
public function onWorkerStart(\swoole_server $server, $worker_id)
{
// 仅在第一个 Worker 进程启动时启动 Timer 定时器
if ($worker_id == 0) {
// 启动 Timer,每 1000 毫秒回调一次 onTick 函数,
swoole_timer_tick(1000, [$this, 'onTick']);
}
}
// 定时任务函数
public function onTick($timer_id, $params = null)
{
echo 'Hello' . PHP_EOL;
}
// 建立连接时回调函数
public function onConnect(\swoole_server $server, $fd, $from_id)
{
echo "Connect" . PHP_EOL;
}
// 收到信息时回调函数
public function onReceive(\swoole_server $server, $fd, $from_id, $data)
{
echo "message: {$data} form Client: {$fd}" . PHP_EOL;
// 将受到的客户端消息再返回给客户端
$server->send($fd, "Message form Server: ".$data);
}
// 关闭连时回调函数
public function onClose(\swoole_server $server, $fd, $from_id)
{
echo "Close" . PHP_EOL;
}
}

注册命令

文件所在 application/command.php

1
2
3
4
5
<?php

return [
'app\console\Timer',
];

接下来就可以通过命令行来启动毫秒定时器

1
php think timer:start

查看结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@iZ2ze20vl8jnphmrpet8txZ tp5]# php think timer:start
Start
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello

http://www.iswoole.com/article/2067

我对蝉说:他日再见,要待来年. 蝉对我说:他日重逢,要等来生
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>当前系统时间</title>
<link rel="stylesheet" href="style.css" />
<script language="javascript" type="text/javascript">
window.onload = function(){
showTime();
}
function checkTime(i){ //补位处理
if(i<10) {
i='0'+i;
}
return i;
}
function showTime(){
var now=new Date();
var year= now.getFullYear() ;
var month= now.getMonth()+1 ;
var day= now.getDate() ;
var h= now.getHours() ;
var m= now.getMinutes() ;
var s= now.getSeconds() ;
m=checkTime(m)
s=checkTime(s)

var weekday=new Array(7)
weekday[0]="星期日"
weekday[1]="星期一"
weekday[2]="星期二"
weekday[3]="星期三"
weekday[4]="星期四"
weekday[5]="星期五"
weekday[6]="星期六"

document.getElementById("show").innerHTML=""+year+"年"+month+"月"+day+"日 "+ weekday[now.getDay()] +h+":"+m+":"+s;
t=setTimeout('showTime()',500)
}
</script>
</head>
<body>
<div class="content1">
<div id="show">显示时间的位置</div>
</div>
</body>
</html>