Commit 8837d3f6 authored by 吴贤德's avatar 吴贤德

Merge branch 'develop' of ssh://code.dev.soooner.com:50022/wuxiande/SooonerHotel into develop

# Conflicts: # SooonerHotel/App/Lib/Action/System/UserAction.class.php
parent 980ee345
......@@ -5,12 +5,18 @@ class LoginAction extends Action{
function _empty(){
header("Location: /login");
}
//登陆页
//登陆页GA
public function index(){
session_destroy();
$this->assign('SYSTEM_INFO',C('SYSTEM_INFO'));
$this->display();
}
//登陆页
public function index_up(){
session_destroy();
$this->assign('SYSTEM_INFO',C('SYSTEM_INFO'));
$this->display();
}
//登陆操作
public function loginDo(){
$UserModel = D("User");
......@@ -127,4 +133,59 @@ class LoginAction extends Action{
$model->execute($sql);
}
public function loginGa(){
//1.验证 UP
//2.验证 GA
$UserModel = D("User");
$username=I('username');
$password=I('password','',md5);
$code=I('code');
$where['account'] = $username;
$where['password'] = $password;
$r = $UserModel->where($where)->find();
if ($r) {
//验证GA
require_once './App/PHPGangsta/GoogleAuthenticator.php';
$ga = new PHPGangsta_GoogleAuthenticator();
$secret = $r["secret"];
if ($ga->verifyCode($secret, $code, 2)) {
session('username', $username);
session(C('USER_AUTH_KEY'), $r['id']);
setcookie("USER_AUTH_KEY", $r['id'], time() + 3600 * 24);
$userInfo = $UserModel->getUserInfo($r['id']);
session('_USER_INFO', $userInfo[0]);//用户基本信息
if ($userInfo[0]["grade"] == 3) {
$spList = $UserModel->getSpList($r['id']);//SP列表
$spIDList = array();
foreach ($spList as $sp) {
$spIDList[] = $sp['id'];
}
session('_USER_SPID_LIST', $spIDList);;
}
$login_count = $r['login_count'] + 1;
$data = array('last_login_time' => time(), 'last_login_ip' => get_client_ip(), 'login_count' => $login_count);
$UserModel->where('id=' . $r['id'])->setField($data);//
//RBAC
import('ORG.Util.RBAC');
RBAC::saveAccessList();
if ($userInfo[0]["grade"] == 3) {
$this->redirect('Portal/index');
} else {
$this->redirect('Index/index');
}
}else{
header('Content-Type:text/html; charset=utf-8');
echo "<script>alert('GA验证失败,请重新登录!');window.top.location.href='/login/index';</script>";
}
} else {
header('Content-Type:text/html; charset=utf-8');
echo "<script>alert('账号验证失败,请重新登录!');window.top.location.href='/login/index';</script>";
}
}
}
\ No newline at end of file
<?php
require_once './App/PHPGangsta/GoogleAuthenticator.php';
class UserAction extends CommonAction{
//用户管理
public function addUser(){
......@@ -103,8 +106,15 @@ class UserAction extends CommonAction{
$user["last_login_ip"]="127.0.0.1";
$user["update_time"]=time();
$user["remark"]='';
$ga = new PHPGangsta_GoogleAuthenticator();
$secret = $ga->createSecret();
$user["secret"]=$secret;
$uid = $UserModel->add($user);
<<<<<<< HEAD
// echo $UserModel->getLastSql();
=======
$SpUserMapModel->where("user_id = $uid")->delete();
if($sp_ids){
......@@ -115,6 +125,7 @@ class UserAction extends CommonAction{
$SpUserMapModel->addAll($mapData);
}
>>>>>>> 980ee345f9634e1754770ec7a03395b1e371512d
if($uid){
$role["role_id"]=I("role_id","",int);
$role["user_id"]=$uid;
......
<?php
/**
* PHP Class for handling Google Authenticator 2-factor authentication.
*
* @author Michael Kliewe
* @copyright 2012 Michael Kliewe
* @license http://www.opensource.org/licenses/bsd-license.php BSD License
*
* @link http://www.phpgangsta.de/
*/
class PHPGangsta_GoogleAuthenticator
{
protected $_codeLength = 6;
/**
* Create new secret.
* 16 characters, randomly chosen from the allowed base32 characters.
*
* @param int $secretLength
*
* @return string
*/
public function createSecret($secretLength = 16)
{
$validChars = $this->_getBase32LookupTable();
// Valid secret lengths are 80 to 640 bits
if ($secretLength < 16 || $secretLength > 128) {
throw new Exception('Bad secret length');
}
$secret = '';
$rnd = false;
if (function_exists('random_bytes')) {
$rnd = random_bytes($secretLength);
} elseif (function_exists('mcrypt_create_iv')) {
$rnd = mcrypt_create_iv($secretLength, MCRYPT_DEV_URANDOM);
} elseif (function_exists('openssl_random_pseudo_bytes')) {
$rnd = openssl_random_pseudo_bytes($secretLength, $cryptoStrong);
if (!$cryptoStrong) {
$rnd = false;
}
}
if ($rnd !== false) {
for ($i = 0; $i < $secretLength; ++$i) {
$secret .= $validChars[ord($rnd[$i]) & 31];
}
} else {
throw new Exception('No source of secure random');
}
return $secret;
}
/**
* Calculate the code, with given secret and point in time.
*
* @param string $secret
* @param int|null $timeSlice
*
* @return string
*/
public function getCode($secret, $timeSlice = null)
{
if ($timeSlice === null) {
$timeSlice = floor(time() / 30);
}
$secretkey = $this->_base32Decode($secret);
// Pack time into binary string
$time = chr(0).chr(0).chr(0).chr(0).pack('N*', $timeSlice);
// Hash it with users secret key
$hm = hash_hmac('SHA1', $time, $secretkey, true);
// Use last nipple of result as index/offset
$offset = ord(substr($hm, -1)) & 0x0F;
// grab 4 bytes of the result
$hashpart = substr($hm, $offset, 4);
// Unpak binary value
$value = unpack('N', $hashpart);
$value = $value[1];
// Only 32 bits
$value = $value & 0x7FFFFFFF;
$modulo = pow(10, $this->_codeLength);
return str_pad($value % $modulo, $this->_codeLength, '0', STR_PAD_LEFT);
}
/**
* Get QR-Code URL for image, from google charts.
*
* @param string $name
* @param string $secret
* @param string $title
* @param array $params
*
* @return string
*/
public function getQRCodeGoogleUrl($name, $secret, $title = null, $params = array())
{
$width = !empty($params['width']) && (int) $params['width'] > 0 ? (int) $params['width'] : 200;
$height = !empty($params['height']) && (int) $params['height'] > 0 ? (int) $params['height'] : 200;
$level = !empty($params['level']) && array_search($params['level'], array('L', 'M', 'Q', 'H')) !== false ? $params['level'] : 'M';
$urlencoded = urlencode('otpauth://totp/'.$name.'?secret='.$secret.'');
if (isset($title)) {
$urlencoded .= urlencode('&issuer='.urlencode($title));
}
return "https://api.qrserver.com/v1/create-qr-code/?data=$urlencoded&size=${width}x${height}&ecc=$level";
}
/**
* Check if the code is correct. This will accept codes starting from $discrepancy*30sec ago to $discrepancy*30sec from now.
*
* @param string $secret
* @param string $code
* @param int $discrepancy This is the allowed time drift in 30 second units (8 means 4 minutes before or after)
* @param int|null $currentTimeSlice time slice if we want use other that time()
*
* @return bool
*/
public function verifyCode($secret, $code, $discrepancy = 1, $currentTimeSlice = null)
{
if ($currentTimeSlice === null) {
$currentTimeSlice = floor(time() / 30);
}
if (strlen($code) != 6) {
return false;
}
for ($i = -$discrepancy; $i <= $discrepancy; ++$i) {
$calculatedCode = $this->getCode($secret, $currentTimeSlice + $i);
if ($this->timingSafeEquals($calculatedCode, $code)) {
return true;
}
}
return false;
}
/**
* Set the code length, should be >=6.
*
* @param int $length
*
* @return PHPGangsta_GoogleAuthenticator
*/
public function setCodeLength($length)
{
$this->_codeLength = $length;
return $this;
}
/**
* Helper class to decode base32.
*
* @param $secret
*
* @return bool|string
*/
protected function _base32Decode($secret)
{
if (empty($secret)) {
return '';
}
$base32chars = $this->_getBase32LookupTable();
$base32charsFlipped = array_flip($base32chars);
$paddingCharCount = substr_count($secret, $base32chars[32]);
$allowedValues = array(6, 4, 3, 1, 0);
if (!in_array($paddingCharCount, $allowedValues)) {
return false;
}
for ($i = 0; $i < 4; ++$i) {
if ($paddingCharCount == $allowedValues[$i] &&
substr($secret, -($allowedValues[$i])) != str_repeat($base32chars[32], $allowedValues[$i])) {
return false;
}
}
$secret = str_replace('=', '', $secret);
$secret = str_split($secret);
$binaryString = '';
for ($i = 0; $i < count($secret); $i = $i + 8) {
$x = '';
if (!in_array($secret[$i], $base32chars)) {
return false;
}
for ($j = 0; $j < 8; ++$j) {
$x .= str_pad(base_convert(@$base32charsFlipped[@$secret[$i + $j]], 10, 2), 5, '0', STR_PAD_LEFT);
}
$eightBits = str_split($x, 8);
for ($z = 0; $z < count($eightBits); ++$z) {
$binaryString .= (($y = chr(base_convert($eightBits[$z], 2, 10))) || ord($y) == 48) ? $y : '';
}
}
return $binaryString;
}
/**
* Get array with all 32 characters for decoding from/encoding to base32.
*
* @return array
*/
protected function _getBase32LookupTable()
{
return array(
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', // 7
'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', // 15
'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', // 23
'Y', 'Z', '2', '3', '4', '5', '6', '7', // 31
'=', // padding char
);
}
/**
* A timing safe equals comparison
* more info here: http://blog.ircmaxell.com/2014/11/its-all-about-time.html.
*
* @param string $safeString The internal (safe) value to be checked
* @param string $userString The user submitted (unsafe) value
*
* @return bool True if the two strings are identical
*/
private function timingSafeEquals($safeString, $userString)
{
if (function_exists('hash_equals')) {
return hash_equals($safeString, $userString);
}
$safeLen = strlen($safeString);
$userLen = strlen($userString);
if ($userLen != $safeLen) {
return false;
}
$result = 0;
for ($i = 0; $i < $userLen; ++$i) {
$result |= (ord($safeString[$i]) ^ ord($userString[$i]));
}
// They are only identical strings if $result is exactly 0...
return $result === 0;
}
}
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>播控列表</title>
<link href="__PUBLIC__/css/style_frame.css" rel="stylesheet" type="text/css" />
<link rel="stylesheet" type="text/css" href="__PUBLIC__/js/jquery-easyui-1.3.4/themes/default/easyui.css">
<link rel="stylesheet" type="text/css" href="__PUBLIC__/js/jquery-easyui-1.3.4/themes/icon.css">
<script type="text/javascript" src="__PUBLIC__/js/jquery.min.js"></script>
<script type="text/javascript" src="__PUBLIC__/js/jquery-easyui-1.3.4/jquery.easyui.min.js"></script>
<script type="text/javascript" src="__PUBLIC__/js/jquery-easyui-1.3.4/locale/easyui-lang-{$language}.js"></script>
<script type="text/javascript" src="__PUBLIC__/newVsdn/js/zDialog/zDrag.js"></script>
<script type="text/javascript" src="__PUBLIC__/newVsdn/js/zDialog/zDialog.js"></script>
<script type="text/javascript" src="__PUBLIC__/js/common/functions.js"></script>
<script type="text/javascript" src="__PUBLIC__/js/common/md5.js"></script>
<link href="__PUBLIC__/newVsdn/css/style_frame.css" rel="stylesheet" type="text/css" />
</head>
<body style="padding:20px">
<!--搜索和按钮 开始 -->
<div class="searchPlayCtrl clearfix">
<div class="layui-tab-content">
<div class="layui-tab-item layui-show">
<div class="hyperchanne clearfix">
<form name="searchform" method="post" action="" id ="searchform">
<input type="hidden" name="op" value="getjson">
<div class="inputBox">
<select class="select" name="searchSp">
<option value="0">合作方</option>
<volist name="sp_lists" id="item">
<option value="{$item.id}">{$item.name}</option>
</volist>
</select>
<select class="select" name="searchHotel">
<option value="0">酒店</option>
<volist name="hotel_lists" id="item">
<option value="{$item.id}">{$item.name}</option>
</volist>
</select>
<input class="input" type="hidden" value="{$id}" name="searchTaskID">
</div>
<input id="submit_search" name="" type="button" value="查询" class="btn_go_s btn_orange" />
</form>
</div><!--hyperchanne end-->
<div class="">
<!-- <ul class="operationBox">
<li class="add">
<a href="javascript:;" onclick="add()" class="on"><span></span>新增</a>
</li>
</ul>-->
</div><!--mainBox end-->
</div>
</div>
</div>
<!--搜索和按钮 结束-->
<table id="dg" title=""
data-options="
iconCls: 'icon-edit',
singleSelect: true,
url: '/PlayCtrl/PlayCtrl/lists/',
method: 'post',
pagination: true,
pageList:[15,30,45,60],
rownumbers: true,
sortName:'id',
sortOrder:'asc',
queryParams: form2Json('searchform'),
fitColumns: true,
height:'auto',
onRowContextMenu : onRowContextMenu
">
<thead>
<tr>
<th data-options="field:'task_name',width:50" sortable="true">播控名称</th>
<th data-options="field:'media_name',width:100" sortable="true">媒资名称</th>
<th data-options="field:'hotel_name',width:50" sortable="true">酒店名称</th>
<th data-options="field:'sp_name',width:30" sortable="true">合作方名称</th>
<th data-options="field:'addtime',width:30" sortable="true">创建时间</th>
<th data-options="field:'updatetime',width:30" sortable="true">更新时间</th>
<th data-options="field:'status'" sortable="true" align="center">状态</th>
<!--<th field="action" align="center" formatter="InputAction">操作</th>-->
</tr>
</thead>
</table>
<div id="mm1" class="easyui-menu" style="width:120px;display: none">
<div iconCls="icon-edit" id="menuEdit" onclick="edit()" {:buttonAuth('PlayCtrl','PlayCtrlLog','add')}>编辑</div>
<div iconCls="icon-cancel" id="menuDel" onclick="del()" {:buttonAuth('PlayCtrl','PlayCtrlLog','deletehandle')}>删除</div>
<div class="menu-sep"></div>
<div iconCls="icon-edit" id="menuEdit" onclick="edit()" {:buttonAuth('PlayCtrl','PlayCtrlLog','add')}>列表</div>
<!-- <div class="menu-sep"></div>
<div iconCls="icon-stop" id="menuStop" onclick="enable(1)" {:buttonAuth('PlayCtrl','PlayCtrlLog','updateStatusAjaxHandle')}>禁用</div>
<div iconCls="icon-start" id="menuStart" onclick="enable(0)" {:buttonAuth('PlayCtrl','PlayCtrlLog','updateStatusAjaxHandle')}>启用</div>-->
</div>
<div id="mm2" class="easyui-menu" style="width:120px;display: none">
<div iconCls="icon-edit" id="menuEdit" onclick="edit()" {:buttonAuth('PlayCtrl','PlayCtrlLog','add')}>编辑</div>
<div iconCls="icon-cancel" id="menuDel" onclick="del()" {:buttonAuth('PlayCtrl','PlayCtrlLog','deletehandle')}>删除</div>
<div class="menu-sep"></div>
<div iconCls="icon-edit" id="menuEdit" onclick="edit()" {:buttonAuth('PlayCtrl','PlayCtrlLog','add')}>列表</div>
<!-- <div class="menu-sep"></div>
<div iconCls="icon-stop" id="menuStop" onclick="enable(1)" {:buttonAuth('PlayCtrl','PlayCtrlLog','updateStatusAjaxHandle')}>禁用</div>
<div iconCls="icon-start" id="menuStart" onclick="enable(0)" {:buttonAuth('PlayCtrl','PlayCtrlLog','updateStatusAjaxHandle')}>启用</div>-->
</div>
<script type="text/javascript">
function onRowContextMenu(e, rowIndex, rowData){
e.preventDefault();
$('#dg').datagrid('unselectAll');
$('#dg').datagrid('selectRow', rowIndex);
$('#mm2').menu('show', {
left:e.pageX,
top:e.pageY
});
}
function InputAction(value, row, index) {
return'<a href="javascript:void(0)" id="mb' + index + '" class="easyui-menubutton" menu="#mm1" iconCls="icon-list" onmouseover="setSelectRow(' + index + ')">'+this.title+'</a>';
}
function TypeAction(value, row, index){
if(value==0){
return '主(Master)';
}else{
return '从(Slave)';
}
}
function setSelectRow(index) {
$('#dg').datagrid('unselectAll');
$('#dg').datagrid('selectRow', index);
}
//初始化菜单按钮
$(function(){
$('#dg').datagrid({
onLoadSuccess: function (data) {
for (i = 0; i < $('#dg').datagrid('getRows').length; i++) {
$('#mb' + i).menubutton();
}
}
})
});
//禁用启用
function enable(status){
var row = $('#dg').datagrid('getSelected');
if (row){
var msg='启用';
if(status==1)
msg='禁用'
$.messager.confirm('操作确认', '确认['+msg+']该记录?', function(r){
if (r){
$.post("/PlayCtrl/PlayCtrlLog/updateStatusAjaxHandle/", {id:row.id,status:status},
function(data){
$('#dg').datagrid('reload');
});
}
});
}else{
$.messager.alert('提示', '请选择要操作的记录!','info');
}
}
function add(){
pop('80%',700,true,'dg','datagrid','/PlayCtrl/PlayCtrlLog/add/')
}
function edit(){
var row = $('#dg').datagrid('getSelected');
if (row){
pop('80%',700,true,'dg','datagrid','/PlayCtrl/PlayCtrlLog/add/id/'+row.id);
}else{
$.messager.alert('提示', '请选择要操作的记录!','info');
}
}
function del(){
var row = $('#dg').datagrid('getSelected');
if (row){
$.messager.confirm('操作确认', '确认[删除]该记录?', function(r){
if (r){
$.post("/PlayCtrl/PlayCtrlLog/deleteHandle/", {id:row.id},
function(data){
$('#dg').datagrid('reload');
});
}
});
}else{
$.messager.alert('提示', '请选择要操作的记录!','info');
}
}
$("#submit_search").click(function () {
$('#dg').datagrid({ queryParams: form2Json("searchform") }); //点击搜索
});
/**
* JQuery扩展方法,用户对JQuery EasyUI的DataGrid控件进行操作。
*/
$.fn.extend({
/**
* 修改DataGrid对象的默认大小,以适应页面宽度。
*
* @param heightMargin
* 高度对页内边距的距离。
* @param widthMargin
* 宽度对页内边距的距离。
* @param minHeight
* 最小高度。
* @param minWidth
* 最小宽度。
*
*/
resizeDataGrid : function(heightMargin, widthMargin, minHeight, minWidth) {
var height = $(document.body).height() - heightMargin;
var width = $(document.body).width() - widthMargin;
height = height < minHeight ? minHeight : height;
width = width < minWidth ? minWidth : width;
$(this).datagrid('resize', {
//height : height,
width : width
});
}
});
$(function() {
// datagrid数据表格ID
var datagridId = 'dg';
// 第一次加载时自动变化大小
$('#' + datagridId).resizeDataGrid(0, 10, 0, 0);
// 当窗口大小发生变化时,调整DataGrid的大小
$(window).resize(function() {
$('#' + datagridId).resizeDataGrid(0, 10, 0, 0);
});
});
</script>
</body>
</html>
\ No newline at end of file
......@@ -69,10 +69,14 @@ $().ready(function(){
<div><label class="label_s">用户名:</label>
{$user.account}
</div>
<div><label class="label_s">GA秘钥:</label>
{$user.secret}
</div>
</if>
<div><label class="label_s">昵称:</label>
<input name="nickname" class="easyui-validatebox input_s" type="text" data-options="required:true" value="{$user.nickname}"></input>
</div>
<div><label class="label_s">email:</label>
<input name="email" class="easyui-validatebox input_s" type="text" value="{$user.email}"></input>
</div>
......
......@@ -20,11 +20,7 @@
obj.value=obj.defaultValue;
}
} //这个函数是当失去焦点的时候,value的值又显示在input框中
function changeCode(obj) {
$("#code").attr("src","/login/verify?"+Math.random());
return false;
}
</script>
<script type="text/javascript">
......@@ -87,7 +83,7 @@
<div class="fromWrap">
<div class="logo2">用户登录</div>
<div class="userBox">
<form id="f" action="{:U('Login/loginDo')}" method="POST">
<form id="f" action="{:U('Login/loginGa')}" method="POST">
<div class="inputWrap">
<img src="__PUBLIC__/newVsdn/images/user.png" />
<input id="username" name="username" type="text" value="用户名" onclick="Focus(this);" onblur="Blur(this);" class="input">
......@@ -98,9 +94,7 @@
</div>
<div class="inputWrap">
<img src="__PUBLIC__/newVsdn/images/password.png"/>
<input name="code" onclick="Focus(this);" onblur="Blur(this);" class="input_code">
<img title="看不清,点击换一张!" onclick="javascript:void(changeCode(this))" id="code" src="{:U('/login/verify')}"/>
<!--<a href="javascript:void(changeCode(this))">看不清,换一张!</a>-->
<input name="code" type="text" value="请输入6位数字认证码" onclick="Focus(this);" onblur="Blur(this);" class="input">
</div>
<div class="loginBtn">
<input type="button" onclick="login()" value="登录">
......@@ -123,7 +117,7 @@
<div class="loginFooter">
<p class="copyRight">北京赛维安讯科技发展有限公司</p>
<!--<p class="copyRight">北京赛维安讯科技发展有限公司</p>-->
</div><!--loginFooter end-->
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=7" />
<title>{$SYSTEM_INFO.name}</title>
<link rel="shortcut icon" href="/{$SYSTEM_INFO.favicon}">
<link href="__PUBLIC__/newVsdn/css/style_login.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="__PUBLIC__/js/jquery.min.js"></script>
<script type="text/javascript">
//搜索输入框
function Focus(obj) {
if(obj.value==obj.defaultValue){
obj.value='';
}
}
function Blur(obj) {
if(obj.value==''){
obj.value=obj.defaultValue;
}
} //这个函数是当失去焦点的时候,value的值又显示在input框中
function changeCode(obj) {
$("#code").attr("src","/login/verify?"+Math.random());
return false;
}
</script>
<script type="text/javascript">
function login(){
$("#f").submit();
}
$(function(){
$("input").keydown(function (e){
var keyCode = e.keyCode ? e.keyCode : e.which ? e.which : e.charCode;
if (keyCode == 13){
if($("#username").val()!=""&&$("#password").val()!=""){
$("#f").submit();
}else{
$('input:first').focus();
$('input').bind("keydown", function (e) {
if (e.which == 13) { //Enter key
e.preventDefault(); //to skip default behaviour of enter key
var nextinput = $('input')[$('input').index(this) + 1];
if (nextinput != undefined) {
nextinput.focus();
} else {
//alert("没有下一个输入框!");
}
}
});
}
}else{
return true;
}
return false;
});
});
$(function () {
$('input:text:first').focus();
var $inp = $('input:text');
$inp.bind('keydown', function (e) {
var key = e.which;
if (key == 13) {
e.preventDefault();
var nxtIdx = $inp.index(this) + 1;
$(":input:text:eq(" + nxtIdx + ")").focus();
}
});
});
</script>
</head>
<body class="noBg">
<div class="loginHeader">
<div class="headerWrap clearfix">
<div class="logo">
<img src="__PUBLIC__/newVsdn/images/{$SYSTEM_INFO.logo}"/>
<span>{$SYSTEM_INFO.name}</span>
</div>
</div>
</div><!--loginHeader end-->
<div class="loginBox clearfix">
<div class="img"></div>
<div class="fromWrap">
<div class="logo2">用户登录</div>
<div class="userBox">
<form id="f" action="{:U('Login/loginDo')}" method="POST">
<div class="inputWrap">
<img src="__PUBLIC__/newVsdn/images/user.png" />
<input id="username" name="username" type="text" value="用户名" onclick="Focus(this);" onblur="Blur(this);" class="input">
</div>
<div class="inputWrap">
<img src="__PUBLIC__/newVsdn/images/password.png"/>
<input id="password" name="password" type="password" value="***" onclick="Focus(this);" onblur="Blur(this);" class="input">
</div>
<div class="inputWrap">
<img src="__PUBLIC__/newVsdn/images/password.png"/>
<input name="code" onclick="Focus(this);" onblur="Blur(this);" class="input_code">
<img title="看不清,点击换一张!" onclick="javascript:void(changeCode(this))" id="code" src="{:U('/login/verify')}"/>
<!--<a href="javascript:void(changeCode(this))">看不清,换一张!</a>-->
</div>
<div class="loginBtn">
<input type="button" onclick="login()" value="登录">
</div>
<div class="other clearfix">
<!--<div class="checkBox">-->
<!--<img src="__PUBLIC__/newVsdn/images/radio.png" />-->
<!--&lt;!&ndash;选中状态-->
<!--<img src="__PUBLIC__/newVsdn/images/radio-on.png" />-->
<!--&ndash;&gt;-->
<!--</div>-->
<!--<span id="remember_p" class="text">记住密码</span>-->
<!--<span id="remember_p" class="text"><a href="/Portal/regist" target="_self">注册自服务账号</a></span>-->
</div>
</form>
</div>
</div>
</div><!--loginBox end-->
<div class="loginFooter">
<p class="copyRight">北京赛维安讯科技发展有限公司</p>
</div><!--loginFooter end-->
</body>
</html>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment