Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
J
jumpserver
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
ops
jumpserver
Commits
1925cf40
Commit
1925cf40
authored
Jan 14, 2015
by
halcyon
Browse files
Options
Browse Files
Download
Plain Diff
增加js判断
parents
6b95c7ed
7435d602
Show whitespace changes
Inline
Side-by-side
Showing
23 changed files
with
658 additions
and
82 deletions
+658
-82
connect.py
connect.py
+4
-4
views.py
jasset/views.py
+5
-0
jumpserver.conf
jumpserver.conf
+5
-0
settings.py
jumpserver/settings.py
+1
-0
__init__.py
jumpserver/templatetags/__init__.py
+1
-0
mytags.py
jumpserver/templatetags/mytags.py
+17
-0
views.py
jumpserver/views.py
+2
-0
views.py
juser/views.py
+264
-26
style.css
static/css/style.css
+2
-7
loading.gif
static/css/vaildator/images/loading.gif
+0
-0
validator_default.png
static/css/vaildator/images/validator_default.png
+0
-0
validator_simple.png
static/css/vaildator/images/validator_simple.png
+0
-0
jquery.validator.css
static/css/vaildator/jquery.validator.css
+64
-0
loading.gif
static/js/validator/images/loading.gif
+0
-0
validator_default.png
static/js/validator/images/validator_default.png
+0
-0
validator_simple.png
static/js/validator/images/validator_simple.png
+0
-0
jquery.validator.js
static/js/validator/jquery.validator.js
+5
-0
zh_CN.js
static/js/validator/zh_CN.js
+157
-0
jadd.html
templates/jasset/jadd.html
+70
-19
group_add.html
templates/juser/group_add.html
+4
-4
user_add.html
templates/juser/user_add.html
+51
-22
link_css.html
templates/link_css.html
+2
-0
script.html
templates/script.html
+4
-0
No files found.
connect.py
View file @
1925cf40
...
@@ -34,12 +34,12 @@ except ImportError:
...
@@ -34,12 +34,12 @@ except ImportError:
time
.
sleep
(
3
)
time
.
sleep
(
3
)
sys
.
exit
()
sys
.
exit
()
CURRENT
_DIR
=
os
.
path
.
dirname
(
__file__
)
BASE
_DIR
=
os
.
path
.
dirname
(
__file__
)
CONF
=
ConfigParser
()
CONF
=
ConfigParser
()
CONF
.
read
(
os
.
path
.
join
(
CURRENT
_DIR
,
'jumpserver.conf'
))
CONF
.
read
(
os
.
path
.
join
(
BASE
_DIR
,
'jumpserver.conf'
))
LOG_DIR
=
os
.
path
.
join
(
CURRENT
_DIR
,
'logs'
)
LOG_DIR
=
os
.
path
.
join
(
BASE
_DIR
,
'logs'
)
# Web generate user ssh_key dir.
# Web generate user ssh_key dir.
SSH_KEY_DIR
=
os
.
path
.
join
(
CURRENT
_DIR
,
'keys'
)
SSH_KEY_DIR
=
os
.
path
.
join
(
BASE
_DIR
,
'keys'
)
# User upload the server key to this dir.
# User upload the server key to this dir.
SERVER_KEY_DIR
=
os
.
path
.
join
(
SSH_KEY_DIR
,
'server'
)
SERVER_KEY_DIR
=
os
.
path
.
join
(
SSH_KEY_DIR
,
'server'
)
# The key of decryptor.
# The key of decryptor.
...
...
jasset/views.py
View file @
1925cf40
...
@@ -4,6 +4,7 @@ from django.shortcuts import render_to_response
...
@@ -4,6 +4,7 @@ from django.shortcuts import render_to_response
from
django.core.paginator
import
Paginator
,
EmptyPage
from
django.core.paginator
import
Paginator
,
EmptyPage
from
models
import
IDC
,
Asset
,
BisGroup
from
models
import
IDC
,
Asset
,
BisGroup
from
models
import
IDC
,
Asset
,
UserGroup
from
connect
import
PyCrypt
,
KEY
from
connect
import
PyCrypt
,
KEY
...
@@ -17,6 +18,9 @@ def jadd_host(request):
...
@@ -17,6 +18,9 @@ def jadd_host(request):
cryptor
=
PyCrypt
(
KEY
)
cryptor
=
PyCrypt
(
KEY
)
eidc
=
IDC
.
objects
.
all
()
eidc
=
IDC
.
objects
.
all
()
egroup
=
BisGroup
.
objects
.
all
()
egroup
=
BisGroup
.
objects
.
all
()
egroup
=
UserGroup
.
objects
.
all
()
is_actived
=
{
'active'
:
1
,
'no_active'
:
0
}
login_typed
=
{
'LDAP'
:
'L'
,
'SSH_KEY'
:
'S'
,
'PASSWORD'
:
'P'
,
'MAP'
:
'M'
}
if
request
.
method
==
'POST'
:
if
request
.
method
==
'POST'
:
j_ip
=
request
.
POST
.
get
(
'j_ip'
)
j_ip
=
request
.
POST
.
get
(
'j_ip'
)
...
@@ -30,6 +34,7 @@ def jadd_host(request):
...
@@ -30,6 +34,7 @@ def jadd_host(request):
j_idc
=
IDC
.
objects
.
get
(
name
=
j_idc
)
j_idc
=
IDC
.
objects
.
get
(
name
=
j_idc
)
for
group
in
j_group
:
for
group
in
j_group
:
c
=
BisGroup
.
objects
.
get
(
name
=
group
)
c
=
BisGroup
.
objects
.
get
(
name
=
group
)
c
=
UserGroup
.
objects
.
get
(
name
=
group
)
groups
.
append
(
c
)
groups
.
append
(
c
)
if
Asset
.
objects
.
filter
(
ip
=
str
(
j_ip
)):
if
Asset
.
objects
.
filter
(
ip
=
str
(
j_ip
)):
...
...
jumpserver.conf
View file @
1925cf40
...
@@ -12,6 +12,11 @@ host_url = ldap://192.168.8.60:389
...
@@ -12,6 +12,11 @@ host_url = ldap://192.168.8.60:389
base_dn
=
dc
=
fengxing
,
dc
=
org
base_dn
=
dc
=
fengxing
,
dc
=
org
root_dn
=
cn
=
admin
,
dc
=
fengxing
,
dc
=
org
root_dn
=
cn
=
admin
,
dc
=
fengxing
,
dc
=
org
root_pw
=
123456
root_pw
=
123456
ldap_enable
=
0
host_url
=
ldap
://
127
.
0
.
0
.
1
:
389
base_dn
=
dc
=
jumpserver
,
dc
=
org
root_dn
=
cn
=
admin
,
dc
=
jumpserver
,
dc
=
org
root_pw
=
secret234
[
web
]
[
web
]
key
=
88
aaaf7ffe3c6c04
key
=
88
aaaf7ffe3c6c04
...
...
jumpserver/settings.py
View file @
1925cf40
...
@@ -46,6 +46,7 @@ INSTALLED_APPS = (
...
@@ -46,6 +46,7 @@ INSTALLED_APPS = (
'django.contrib.sessions'
,
'django.contrib.sessions'
,
'django.contrib.messages'
,
'django.contrib.messages'
,
'django.contrib.staticfiles'
,
'django.contrib.staticfiles'
,
'jumpserver'
,
'juser'
,
'juser'
,
'jasset'
,
'jasset'
,
'jpermission'
,
'jpermission'
,
...
...
jumpserver/templatetags/__init__.py
0 → 100644
View file @
1925cf40
__author__
=
'Hudie'
jumpserver/templatetags/mytags.py
0 → 100644
View file @
1925cf40
import
time
from
django
import
template
register
=
template
.
Library
()
@register.filter
(
name
=
'stamp2str'
)
def
stamp2str
(
value
):
try
:
return
time
.
strftime
(
'
%
Y/
%
m/
%
d
%
H:
%
M:
%
S'
,
time
.
localtime
(
value
))
except
AttributeError
:
return
'0000/00/00 00:00:00'
@register.filter
(
name
=
'int2str'
)
def
int2str
(
value
):
return
str
(
value
)
jumpserver/views.py
View file @
1925cf40
...
@@ -10,3 +10,5 @@ def base(request):
...
@@ -10,3 +10,5 @@ def base(request):
def
skin_config
(
request
):
def
skin_config
(
request
):
return
render_to_response
(
'skin_config.html'
)
return
render_to_response
(
'skin_config.html'
)
juser/views.py
View file @
1925cf40
# coding: utf-8
# coding: utf-8
# Author: Guanghongwei
# Email: ibuler@qq.com
import
time
import
os
import
hashlib
import
random
import
subprocess
import
ldap
from
ldap
import
modlist
from
Crypto.PublicKey
import
RSA
import
crypt
from
django.shortcuts
import
render_to_response
from
django.shortcuts
import
render_to_response
from
django.core.exceptions
import
ObjectDoesNotExist
from
juser.models
import
UserGroup
,
User
from
juser.models
import
UserGroup
,
User
from
connect
import
PyCrypt
,
KEY
from
connect
import
BASE_DIR
from
connect
import
CONF
CRYPTOR
=
PyCrypt
(
KEY
)
LDAP_ENABLE
=
CONF
.
getint
(
'ldap'
,
'ldap_enable'
)
if
LDAP_ENABLE
:
LDAP_HOST_URL
=
CONF
.
get
(
'ldap'
,
'host_url'
)
LDAP_BASE_DN
=
CONF
.
get
(
'ldap'
,
'base_dn'
)
LDAP_ROOT_DN
=
CONF
.
get
(
'ldap'
,
'root_dn'
)
LDAP_ROOT_PW
=
CONF
.
get
(
'ldap'
,
'root_pw'
)
def
md5_crypt
(
string
):
return
hashlib
.
new
(
"md5"
,
string
)
.
hexdigest
()
def
gen_rand_pwd
(
num
):
"""生成随机密码"""
seed
=
"1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
salt_list
=
[]
for
i
in
range
(
num
):
salt_list
.
append
(
random
.
choice
(
seed
))
salt
=
''
.
join
(
salt_list
)
return
salt
def
bash
(
cmd
):
"""执行bash命令"""
return
subprocess
.
call
(
cmd
,
shell
=
True
)
def
is_dir
(
dir_name
,
mode
=
0755
):
if
not
os
.
path
.
isdir
(
dir_name
):
os
.
makedirs
(
dir_name
)
os
.
chmod
(
dir_name
,
mode
)
class
AddError
(
Exception
):
class
AddError
(
Exception
):
pass
pass
# class LDAPMgmt():
# def __init__(self,
# host_url=LDAP_HOST_URL,
# base_dn=LDAP_BASE_DN,
# root_cn=LDAP_ROOT_DN,
# root_pw=LDAP_ROOT_PW):
# self.ldap_host = host_url
# self.ldap_base_dn = base_dn
# self.conn = ldap.initialize(host_url)
# self.conn.set_option(ldap.OPT_REFERRALS, 0)
# self.conn.protocol_version = ldap.VERSION3
# self.conn.simple_bind_s(root_cn, root_pw)
#
# def list(self, filter, scope=ldap.SCOPE_SUBTREE, attr=None):
# result = {}
# try:
# ldap_result = self.conn.search_s(self.ldap_base_dn, scope, filter, attr)
# for entry in ldap_result:
# name, data = entry
# for k, v in data.items():
# print '%s: %s' % (k, v)
# result[k] = v
# return result
# except ldap.LDAPError, e:
# print e
#
# def add(self, dn, attrs):
# try:
# ldif = modlist.addModlist(attrs)
# self.conn.add_s(dn, ldif)
# except ldap.LDAPError, e:
# print e
#
# def modify(self, dn, attrs):
# try:
# attr_s = []
# for k, v in attrs.items():
# attr_s.append((2, k, v))
# self.conn.modify_s(dn, attr_s)
# except ldap.LDAPError, e:
# print e
#
# def delete(self, dn):
# try:
# self.conn.delete_s(dn)
# except ldap.LDAPError, e:
# print e
def
gen_sha512
(
salt
,
password
):
return
crypt
.
crypt
(
password
,
'$6$
%
s$'
%
salt
)
def
group_add
(
request
):
def
group_add
(
request
):
error
=
''
error
=
''
msg
=
''
msg
=
''
header_title
,
path1
,
path2
=
'添加属组 | Add Group'
,
'juser'
,
'group_add'
if
request
.
method
==
'POST'
:
if
request
.
method
==
'POST'
:
group_name
=
request
.
POST
.
get
(
'
j_
group_name'
,
None
)
group_name
=
request
.
POST
.
get
(
'group_name'
,
None
)
comment
=
request
.
POST
.
get
(
'
j_
comment'
,
None
)
comment
=
request
.
POST
.
get
(
'comment'
,
None
)
try
:
try
:
if
not
group_name
:
if
not
group_name
:
...
@@ -37,44 +142,177 @@ def group_add(request):
...
@@ -37,44 +142,177 @@ def group_add(request):
else
:
else
:
msg
=
u'添加组
%
s 成功'
%
group_name
msg
=
u'添加组
%
s 成功'
%
group_name
return
render_to_response
(
'juser/group_add.html'
,
return
render_to_response
(
'juser/group_add.html'
,
locals
())
{
'header_title'
:
u'添加属组 | Add Group'
,
'path1'
:
'juser'
,
'path2'
:
'group_add'
,
'error'
:
error
,
'msg'
:
msg
})
def
group_list
(
request
):
def
group_list
(
request
):
header_title
,
path1
,
path2
=
'查看属组 | Add Group'
,
'juser'
,
'group_add'
groups
=
UserGroup
.
objects
.
all
()
groups
=
UserGroup
.
objects
.
all
()
return
render_to_response
(
'juser/group_list.html'
,
return
render_to_response
(
'juser/group_list.html'
,
locals
())
{
'header_title'
:
u'查看属组 | Add Group'
,
'path1'
:
'juser'
,
'path2'
:
'group_add'
,
'groups'
:
groups
})
def
user_list
(
request
):
def
user_list
(
request
):
pass
pass
def
db_add_user
(
**
kwargs
):
groups_post
=
kwargs
.
pop
(
'groups'
)
user
=
User
(
**
kwargs
)
group_select
=
[]
for
group_id
in
groups_post
:
group
=
UserGroup
.
objects
.
filter
(
id
=
group_id
)
group_select
.
extend
(
group
)
user
.
save
()
user
.
user_group
=
group_select
def
db_del_user
(
username
):
try
:
user
=
User
.
objects
.
get
(
username
=
username
)
user
.
delete
()
except
ObjectDoesNotExist
:
pass
def
gen_ssh_key
(
username
,
password
=
None
,
length
=
2048
):
private_key_dir
=
os
.
path
.
join
(
BASE_DIR
,
'keys/jumpserver/'
)
private_key_file
=
os
.
path
.
join
(
private_key_dir
,
username
)
public_key_dir
=
'/home/
%
s/.ssh/'
%
username
public_key_file
=
os
.
path
.
join
(
public_key_dir
,
'authorized_keys'
)
is_dir
(
private_key_dir
)
is_dir
(
public_key_dir
,
mode
=
0700
)
key
=
RSA
.
generate
(
length
)
with
open
(
private_key_file
,
'w'
)
as
pri_f
:
pri_f
.
write
(
key
.
exportKey
(
'PEM'
,
password
))
os
.
chmod
(
private_key_file
,
0600
)
pub_key
=
key
.
publickey
()
with
open
(
public_key_file
,
'w'
)
as
pub_f
:
pub_f
.
write
(
pub_key
.
exportKey
(
'OpenSSH'
))
os
.
chmod
(
public_key_file
,
0600
)
bash
(
'chown
%
s:
%
s
%
s'
%
(
username
,
username
,
public_key_file
))
def
server_add_user
(
username
,
password
,
ssh_key_pwd1
):
bash
(
'useradd
%
s; echo
%
s | passwd --stdin
%
s'
%
(
username
,
password
,
username
))
gen_ssh_key
(
username
,
ssh_key_pwd1
)
def
server_del_user
(
username
):
bash
(
'userdel -r
%
s'
%
username
)
def
ldap_add_user
(
username
,
ldap_pwd
):
user_dn
=
"uid=
%
s,ou=People,
%
s"
%
(
username
,
LDAP_BASE_DN
)
password_sha512
=
gen_sha512
(
gen_rand_pwd
(
6
),
ldap_pwd
)
user
=
User
.
objects
.
get
(
username
=
username
)
user_attr
=
{
'uid'
:
[
str
(
username
)],
'cn'
:
[
str
(
username
)],
'objectClass'
:
[
'account'
,
'posixAccount'
,
'top'
,
'shadowAccount'
],
'userPassword'
:
[
'{crypt}
%
s'
%
password_sha512
],
'shadowLastChange'
:
[
'16328'
],
'shadowMin'
:
[
'0'
],
'shadowMax'
:
[
'99999'
],
'shadowWarning'
:
[
'7'
],
'loginShell'
:
[
'/bin/bash'
],
'uidNumber'
:
[
str
(
user
.
id
)],
'gidNumber'
:
[
str
(
user
.
id
)],
'homeDirectory'
:
[
str
(
'/home/
%
s'
%
username
)]}
group_dn
=
"cn=
%
s,ou=Group,
%
s"
%
(
username
,
LDAP_BASE_DN
)
group_attr
=
{
'objectClass'
:
[
'posixGroup'
,
'top'
],
'cn'
:
[
str
(
username
)],
'userPassword'
:
[
'{crypt}x'
],
'gidNumber'
:
[
str
(
user
.
id
)]}
sudo_dn
=
'cn=
%
s,ou=Sudoers,
%
s'
%
(
username
,
LDAP_BASE_DN
)
sudo_attr
=
{
'objectClass'
:
[
'top'
,
'sudoRole'
],
'cn'
:
[
'
%
s'
%
str
(
username
)],
'sudoCommand'
:
[
'/bin/pwd'
],
'sudoHost'
:
[
'192.168.1.1'
],
'sudoOption'
:
[
'!authenticate'
],
'sudoRunAsUser'
:
[
'root'
],
'sudoUser'
:
[
'
%
s'
%
str
(
username
)]}
ldap_conn
=
LDAPMgmt
()
ldap_conn
.
add
(
user_dn
,
user_attr
)
ldap_conn
.
add
(
group_dn
,
group_attr
)
ldap_conn
.
add
(
sudo_dn
,
sudo_attr
)
def
ldap_del_user
(
username
):
user_dn
=
"uid=
%
s,ou=People,
%
s"
%
(
username
,
LDAP_BASE_DN
)
group_dn
=
"cn=
%
s,ou=Group,
%
s"
%
(
username
,
LDAP_BASE_DN
)
sudo_dn
=
'cn=
%
s,ou=Sudoers,
%
s'
%
(
username
,
LDAP_BASE_DN
)
ldap_conn
=
LDAPMgmt
()
ldap_conn
.
delete
(
user_dn
)
ldap_conn
.
delete
(
group_dn
)
ldap_conn
.
delete
(
sudo_dn
)
def
user_add
(
request
):
def
user_add
(
request
):
error
=
''
error
=
''
msg
=
''
msg
=
''
header_title
,
path1
,
path2
=
'添加用户 | Add User'
,
'juser'
,
'user_add'
user_role
=
{
'SU'
:
'SuperUser'
,
'GA'
:
'GroupAdmin'
,
'CU'
:
'CommonUser
'
}
user_role
=
{
'SU'
:
u'超级管理员'
,
'GA'
:
u'组管理员'
,
'CU'
:
u'普通用户
'
}
groups
=
UserGroup
.
objects
.
all
()
all_group
=
UserGroup
.
objects
.
all
()
if
request
.
method
==
'POST'
:
if
request
.
method
==
'POST'
:
username
=
request
.
POST
.
get
(
'j_username'
,
None
)
username
=
request
.
POST
.
get
(
'username'
,
None
)
password
=
request
.
POST
.
get
(
'j_password'
,
None
)
password
=
request
.
POST
.
get
(
'password'
,
None
)
name
=
request
.
POST
.
get
(
'j_name'
,
None
)
name
=
request
.
POST
.
get
(
'name'
,
None
)
email
=
request
.
POST
.
get
(
'j_email'
,
''
)
email
=
request
.
POST
.
get
(
'email'
,
''
)
groups
=
request
.
POST
.
getlist
(
'j_group'
,
None
)
groups
=
request
.
POST
.
getlist
(
'groups'
,
None
)
role
=
request
.
POST
.
get
(
'j_role'
,
None
)
groups_str
=
' '
.
join
(
groups
)
ssh_pwd
=
request
.
POST
.
get
(
'j_ssh_pwd'
,
None
)
role_post
=
request
.
POST
.
get
(
'role'
,
None
)
is_active
=
request
.
POST
.
get
(
'j_is_active'
,
None
)
ssh_pwd
=
request
.
POST
.
get
(
'ssh_pwd'
,
None
)
ssh_key_pwd1
=
request
.
POST
.
get
(
'ssh_key_pwd1'
,
None
)
return
render_to_response
(
'juser/user_add.html'
,
is_active
=
request
.
POST
.
get
(
'is_active'
,
'1'
)
{
'header_title'
:
u'添加用户 | Add User'
,
ldap_pwd
=
gen_rand_pwd
(
16
)
'path1'
:
'juser'
,
'path2'
:
'user_add'
,
'roles'
:
user_role
,
'groups'
:
groups
})
try
:
if
None
in
[
username
,
password
,
ssh_key_pwd1
,
name
,
groups
,
role_post
,
is_active
]:
error
=
u'带*内容不能为空'
raise
AddError
user
=
User
.
objects
.
filter
(
username
=
username
)
if
user
:
error
=
u'用户
%
s 已存在'
%
username
raise
AddError
except
AddError
:
pass
else
:
time_now
=
time
.
time
()
try
:
db_add_user
(
username
=
username
,
password
=
md5_crypt
(
password
),
name
=
name
,
email
=
email
,
groups
=
groups
,
role
=
role_post
,
ssh_pwd
=
CRYPTOR
.
encrypt
(
ssh_pwd
),
ssh_key_pwd1
=
CRYPTOR
.
encrypt
(
ssh_key_pwd1
),
ldap_pwd
=
CRYPTOR
.
encrypt
(
ldap_pwd
),
is_active
=
is_active
,
date_joined
=
time_now
)
server_add_user
(
username
,
password
,
ssh_key_pwd1
)
if
LDAP_ENABLE
:
ldap_add_user
(
username
,
ldap_pwd
)
msg
=
u'添加用户
%
s 成功!'
%
username
except
Exception
,
e
:
error
=
u'添加用户
%
s 失败
%
s '
%
(
username
,
e
)
try
:
db_del_user
(
username
)
server_del_user
(
username
)
if
LDAP_ENABLE
:
ldap_del_user
(
username
)
except
Exception
:
pass
return
render_to_response
(
'juser/user_add.html'
,
locals
())
...
...
static/css/style.css
View file @
1925cf40
/*@import url("//fonts.googleapis.com/css?family=Open+Sans:300,400,600,700&lang=en");*/
@import
url("//fonts.useso.com/css?family=Open+Sans:300,400,600,700&lang=en")
;
/*
*
* INSPINIA - Responsive Admin Theme
* Copyright 2014 Webapplayers.com
*
*/
h1
,
h1
,
h2
,
h2
,
h3
,
h3
,
...
...
static/css/vaildator/images/loading.gif
0 → 100755
View file @
1925cf40
457 Bytes
static/css/vaildator/images/validator_default.png
0 → 100755
View file @
1925cf40
424 Bytes
static/css/vaildator/images/validator_simple.png
0 → 100755
View file @
1925cf40
1.05 KB
static/css/vaildator/jquery.validator.css
0 → 100755
View file @
1925cf40
/*! nice Validator 0.7.3
* (c) 2012-2014 Jony Zhang <zj86@live.cn>, MIT Licensed
* http://niceue.com/validator/
*/
.n-inline-block
,
.nice-validator
input
,
.nice-validator
select
,
.nice-validator
textarea
,
.msg-wrap
,
.n-icon
,
.n-msg
{
display
:
inline-block
;
*
display
:
inline
;
*
zoom
:
1
}
.msg-box
{
position
:
relative
;
*
zoom
:
1
}
.msg-wrap
{
position
:
relative
;
white-space
:
nowrap
}
.msg-wrap
,
.n-icon
,
.n-msg
{
vertical-align
:
top
}
.n-arrow
{
position
:
absolute
;
overflow
:
hidden
;}
.n-arrow
b
,
.n-arrow
i
{
position
:
absolute
;
left
:
0
;
top
:
0
;
border
:
0
;
margin
:
0
;
padding
:
0
;
overflow
:
hidden
;
font-weight
:
400
;
font-style
:
normal
;
font-size
:
12px
;
font-family
:
serif
;
line-height
:
14px
;
_line-height
:
15px
}
.n-arrow
i
{
text-shadow
:
none
}
.n-icon
{
width
:
16px
;
height
:
16px
;
overflow
:
hidden
;
background-repeat
:
no-repeat
}
.n-msg
{
display
:
inline-block
;
line-height
:
15px
;
margin-left
:
2px
;
*
margin-top
:
-1px
;
_margin-top
:
0
;
font-size
:
12px
;
font-family
:
simsun
}
.n-error
{
color
:
#c33
}
.n-ok
{
color
:
#390
}
.n-tip
,
.n-loading
{
color
:
#808080
}
.n-error
.n-icon
{
background-position
:
0
0
}
.n-ok
.n-icon
{
background-position
:
-16px
0
}
.n-tip
.n-icon
{
background-position
:
-32px
0
}
.n-loading
.n-icon
{
background
:
url("images/loading.gif")
0
center
no-repeat
!important
}
.n-top
,
.n-right
,
.n-bottom
,
.n-left
{
display
:
inline-block
;
line-height
:
0
;
vertical-align
:
top
;
outline
:
0
}
.n-top
.n-arrow
,
.n-bottom
.n-arrow
{
height
:
6px
;
width
:
12px
;
left
:
8px
}
.n-left
.n-arrow
,
.n-right
.n-arrow
{
width
:
6px
;
height
:
12px
;
top
:
6px
}
.n-top
{
vertical-align
:
top
;}
.n-top
.msg-wrap
{
margin-bottom
:
6px
}
.n-top
.n-arrow
{
bottom
:
-6px
;}
.n-top
.n-arrow
b
{
top
:
-6px
}
.n-top
.n-arrow
i
{
top
:
-7px
}
.n-bottom
{
vertical-align
:
bottom
;}
.n-bottom
.msg-wrap
{
margin-top
:
6px
}
.n-bottom
.n-arrow
{
top
:
-6px
;}
.n-bottom
.n-arrow
b
{
top
:
-1px
}
.n-bottom
.n-arrow
i
{
top
:
0
}
.n-left
.msg-wrap
{
right
:
100%
;
margin-right
:
6px
}
.n-left
.n-arrow
{
right
:
-6px
;}
.n-left
.n-arrow
b
{
left
:
-6px
}
.n-left
.n-arrow
i
{
left
:
-7px
}
.n-right
.msg-wrap
{
margin-left
:
6px
}
.n-right
.n-arrow
{
left
:
-6px
;}
.n-right
.n-arrow
b
{
left
:
1px
}
.n-right
.n-arrow
i
{
left
:
2px
}
.n-default
.n-left
,
.n-default
.n-right
{
margin-top
:
5px
}
.n-default
.n-top
.msg-wrap
{
bottom
:
100%
}
.n-default
.n-bottom
.msg-wrap
{
top
:
100%
}
.n-default
.msg-wrap
{
position
:
absolute
;
z-index
:
1
;}
.n-default
.msg-wrap
.n-icon
{
background-image
:
url("images/validator_default.png")
}
.n-default
.n-tip
.n-icon
{
display
:
none
}
.n-simple
.msg-wrap
{
position
:
absolute
;
z-index
:
1
;}
.n-simple
.msg-wrap
.n-icon
{
background-image
:
url("images/validator_simple.png")
}
.n-simple
.n-top
.msg-wrap
{
bottom
:
100%
}
.n-simple
.n-bottom
.msg-wrap
{
top
:
100%
}
.n-simple
.n-left
,
.n-simple
.n-right
{
margin-top
:
5px
}
.n-simple
.n-bottom
.msg-wrap
{
margin-top
:
3px
}
.n-simple
.n-tip
.n-icon
{
display
:
none
}
.n-yellow
.msg-wrap
{
position
:
absolute
;
z-index
:
1
;
padding
:
4px
6px
;
font-size
:
12px
;
border
:
1px
solid
transparent
;
background-color
:
#fffcef
;
border-color
:
#ffbb76
;
color
:
#db7c22
;
box-shadow
:
0
1px
3px
#ccc
;
border-radius
:
2px
;}
.n-yellow
.msg-wrap
.n-arrow
b
{
color
:
#ffbb76
;
text-shadow
:
0
0
2px
#ccc
}
.n-yellow
.msg-wrap
.n-arrow
i
{
color
:
#fffcef
}
.n-yellow
.msg-wrap
.n-icon
{
background-image
:
url("images/validator_simple.png")
}
.n-yellow
.n-top
.msg-wrap
{
bottom
:
100%
}
.n-yellow
.n-bottom
.msg-wrap
{
top
:
100%
}
.n-yellow
.n-tip
,
.n-yellow
.n-ok
,
.n-yellow
.n-loading
{
background-color
:
#f8fdff
;
border-color
:
#ddd
;
color
:
#333
;
box-shadow
:
0
1px
3px
#ccc
;}
.n-yellow
.n-tip
.n-arrow
b
,
.n-yellow
.n-ok
.n-arrow
b
,
.n-yellow
.n-loading
.n-arrow
b
{
color
:
#ddd
;
text-shadow
:
0
0
2px
#ccc
}
.n-yellow
.n-tip
.n-arrow
i
,
.n-yellow
.n-ok
.n-arrow
i
,
.n-yellow
.n-loading
.n-arrow
i
{
color
:
#f8fdff
}
.n-yellow
.n-tip
.n-icon
{
display
:
none
}
static/js/validator/images/loading.gif
0 → 100755
View file @
1925cf40
457 Bytes
static/js/validator/images/validator_default.png
0 → 100755
View file @
1925cf40
424 Bytes
static/js/validator/images/validator_simple.png
0 → 100755
View file @
1925cf40
1.05 KB
static/js/validator/jquery.validator.js
0 → 100755
View file @
1925cf40
/*! nice Validator 0.7.3
* (c) 2012-2014 Jony Zhang <zj86@live.cn>, MIT Licensed
* http://niceue.com/validator/
*/
!
function
(
e
,
t
){
"use strict"
;
function
i
(
n
,
s
){
var
r
=
this
;
return
!
r
instanceof
i
?
new
i
(
n
,
s
):(
r
.
$el
=
e
(
n
),
r
.
_init
(
n
,
s
),
t
)}
function
n
(
e
,
t
){
var
i
=
t
?
t
===!
0
?
this
:
t
:
n
.
prototype
;
if
(
z
(
e
))
for
(
var
s
in
e
)
i
[
s
]
=
r
(
e
[
s
])}
function
s
(
e
,
t
){
var
i
=
t
?
t
===!
0
?
this
:
t
:
s
.
prototype
;
if
(
z
(
e
))
for
(
var
n
in
e
){
if
(
!
e
[
n
])
return
;
i
[
n
]
=
e
[
n
]}}
function
r
(
t
){
switch
(
e
.
type
(
t
)){
case
"function"
:
return
t
;
case
"array"
:
return
function
(
e
){
return
t
[
0
].
test
(
e
.
value
)
||
t
[
1
]
||!
1
};
case
"regexp"
:
return
function
(
e
){
return
t
.
test
(
e
.
value
)}}}
function
a
(
t
){
var
i
=
""
;
return
e
.
map
(
t
.
split
(
" "
),
function
(
e
){
i
+=
","
+
(
"#"
===
e
.
charAt
(
0
)?
e
:
'[name="'
+
e
+
'"]'
)}),
i
.
substring
(
1
)}
function
l
(
t
){
var
i
;
if
(
t
&&
t
.
tagName
){
switch
(
t
.
tagName
){
case
"INPUT"
:
case
"SELECT"
:
case
"TEXTAREA"
:
case
"BUTTON"
:
case
"FIELDSET"
:
i
=
t
.
form
||
e
(
t
).
closest
(
"."
+
k
);
break
;
case
"FORM"
:
i
=
t
;
break
;
default
:
i
=
e
(
t
).
closest
(
"."
+
k
)}
return
e
(
i
).
data
(
h
)
||
e
(
i
)[
h
]().
data
(
h
)}}
function
u
(
e
){
var
t
,
i
=
e
.
currentTarget
;
i
.
form
&&
null
===
K
(
i
.
form
,
q
)
&&
(
t
=
l
(
i
),
t
?(
t
.
_parse
(
i
),
t
[
"_"
+
e
.
type
](
e
)):
K
(
i
,
V
,
null
))}
function
o
(
i
,
n
){
var
s
=
e
.
trim
(
K
(
i
,
V
+
"-"
+
n
));
if
(
s
)
return
s
=
Function
(
"return "
+
s
)(),
s
?
r
(
s
):
t
}
function
d
(
e
,
t
,
i
,
n
){
var
s
=
t
.
msg
,
r
=
t
.
_r
;
return
z
(
s
)
&&
(
s
=
s
[
r
]),
Q
(
s
)
||
(
s
=
K
(
e
,
A
+
"-"
+
r
)
||
K
(
e
,
A
)
||
i
||
(
n
?
Q
(
n
)?
n
:
n
[
r
]:
""
)),
s
}
function
c
(
e
){
var
t
;
return
e
&&
(
t
=
H
.
exec
(
e
)),
t
?
t
[
1
]:
""
}
function
f
(
e
){
return
"INPUT"
===
e
.
tagName
&&
"checkbox"
===
e
.
type
||
"radio"
===
e
.
type
}
function
g
(
e
){
return
Date
.
parse
(
e
.
replace
(
/
\.
|
\-
/g
,
"/"
))}
var
p
,
m
,
h
=
"validator"
,
v
=
"."
+
h
,
y
=
".rule"
,
_
=
".field"
,
b
=
".form"
,
k
=
"nice-"
+
h
,
w
=
"n-ok"
,
M
=
"n-error"
,
O
=
"n-tip"
,
$
=
"n-loading"
,
x
=
"msg-box"
,
C
=
"aria-required"
,
F
=
"aria-invalid"
,
V
=
"data-rule"
,
A
=
"data-msg"
,
R
=
"data-tip"
,
T
=
"data-ok"
,
S
=
"data-target"
,
E
=
"data-inputstatus"
,
q
=
"novalidate"
,
N
=
":verifiable"
,
j
=
/
(
!
?)\s?(\w
+
)(?:\[\s
*
(
.*
?\]?)\s
*
\]
|
\(\s
*
(
.*
?\)?)\s
*
\))?\s
*
(
;|
\|
|&
)?
/g
,
D
=
/
(\w
+
)(?:\[\s
*
(
.*
?\]?)\s
*
\]
|
\(\s
*
(
.*
?\)?)\s
*
\))?
/
,
I
=
/
(?:([^
:;
\(\[]
*
)
:
)?(
.*
)
/
,
U
=
/
[^\x
00-
\x
ff
]
/g
,
H
=
/^.*
(
top|right|bottom|left
)
.*$/
,
L
=
/
(?:(
post|get
)
:
)?(
.+
)
/i
,
P
=
/<|>/g
,
W
=
e
.
noop
,
B
=
e
.
proxy
,
X
=
e
.
isFunction
,
J
=
e
.
isArray
,
Q
=
function
(
e
){
return
"string"
==
typeof
e
},
z
=
function
(
e
){
return
e
&&
"[object Object]"
===
Object
.
prototype
.
toString
.
call
(
e
)},
G
=!
window
.
XMLHttpRequest
,
K
=
function
(
e
,
i
,
n
){
return
n
===
t
?
e
.
getAttribute
(
i
):(
null
===
n
?
e
.
removeAttribute
(
i
):
e
.
setAttribute
(
i
,
""
+
n
),
t
)},
Y
=
window
.
console
||
{
log
:
W
,
info
:
W
},
Z
=
{
debug
:
0
,
timely
:
1
,
theme
:
"default"
,
ignore
:
""
,
focusInvalid
:
!
0
,
beforeSubmit
:
W
,
validClass
:
"n-valid"
,
invalidClass
:
"n-invalid"
,
msgWrapper
:
"span"
,
msgMaker
:
function
(
e
){
var
t
,
i
=
{
error
:
M
,
ok
:
w
,
tip
:
O
,
loading
:
$
}[
e
.
type
];
return
t
=
'<span class="msg-wrap '
+
i
+
'" role="alert">'
,
t
+=
e
.
arrow
+
e
.
icon
+
'<span class="n-msg">'
+
e
.
msg
+
"</span>"
,
t
+=
"</span>"
},
msgIcon
:
'<span class="n-icon"></span>'
,
msgArrow
:
""
,
msgClass
:
""
,
defaultMsg
:
"{0} is not valid."
,
loadingMsg
:
"Validating..."
},
et
=
{
"default"
:{
formClass
:
"n-default"
,
msgClass
:
"n-right"
,
showOk
:
""
}};
e
.
fn
[
h
]
=
function
(
t
){
var
n
=
this
,
s
=
arguments
;
return
n
.
is
(
":input"
)?
n
:(
!
n
.
is
(
"form"
)
&&
(
n
=
this
.
find
(
"form"
)),
!
n
.
length
&&
(
n
=
this
),
n
.
each
(
function
(){
var
n
=
e
(
this
).
data
(
h
);
if
(
n
)
if
(
Q
(
t
)){
if
(
"_"
===
t
.
charAt
(
0
))
return
;
n
[
t
].
apply
(
n
,
Array
.
prototype
.
slice
.
call
(
s
,
1
))}
else
t
&&
(
n
.
_reset
(
!
0
),
n
.
_init
(
this
,
t
));
else
new
i
(
this
,
t
)}),
this
)},
e
.
fn
.
isValid
=
function
(
e
,
t
){
var
i
,
n
,
s
=
l
(
this
[
0
]),
r
=
X
(
e
);
return
s
?(
s
.
checkOnly
=!!
t
,
n
=
s
.
options
,
i
=
s
.
_multiValidate
(
this
.
is
(
":input"
)?
this
:
this
.
find
(
N
),
function
(
t
){
t
||!
n
.
focusInvalid
||
s
.
checkOnly
||
s
.
$el
.
find
(
":input["
+
F
+
"]:first"
).
focus
(),
r
&&
e
.
call
(
null
,
t
),
s
.
checkOnly
=!
1
}),
r
?
this
:
i
):
!
0
},
e
.
expr
[
":"
].
verifiable
=
function
(
e
){
var
t
=
e
.
nodeName
.
toLowerCase
();
return
(
"input"
===
t
&&!
{
submit
:
1
,
button
:
1
,
reset
:
1
,
image
:
1
}[
e
.
type
]
||
"select"
===
t
||
"textarea"
===
t
)
&&
e
.
disabled
===!
1
},
i
.
prototype
=
{
_init
:
function
(
i
,
r
){
var
l
,
u
,
o
,
d
=
this
;
if
(
X
(
r
)
&&
(
r
=
{
valid
:
r
}),
r
=
r
||
{},
o
=
K
(
i
,
"data-"
+
h
+
"-option"
),
o
=
o
&&
"{"
===
o
.
charAt
(
0
)?
Function
(
"return "
+
o
)():{},
u
=
et
[
r
.
theme
||
o
.
theme
||
Z
.
theme
],
l
=
d
.
options
=
e
.
extend
({},
Z
,
u
,
o
,
d
.
options
,
r
),
d
.
rules
=
new
n
(
l
.
rules
,
!
0
),
d
.
messages
=
new
s
(
l
.
messages
,
!
0
),
d
.
elements
=
d
.
elements
||
{},
d
.
deferred
=
{},
d
.
errors
=
{},
d
.
fields
=
{},
d
.
_initFields
(
l
.
fields
),
J
(
l
.
groups
)
&&
e
.
map
(
l
.
groups
,
function
(
i
){
return
Q
(
i
.
fields
)
&&
X
(
i
.
callback
)?(
i
.
$elems
=
d
.
$el
.
find
(
a
(
i
.
fields
)),
e
.
map
(
i
.
fields
.
split
(
" "
),
function
(
e
){
d
.
fields
[
e
]
=
d
.
fields
[
e
]
||
{},
d
.
fields
[
e
].
group
=
i
}),
t
):
null
}),
d
.
msgOpt
=
{
type
:
"error"
,
pos
:
c
(
l
.
msgClass
),
wrapper
:
l
.
msgWrapper
,
cls
:
l
.
msgClass
,
style
:
l
.
msgStyle
,
icon
:
l
.
msgIcon
,
arrow
:
l
.
msgArrow
,
show
:
l
.
msgShow
,
hide
:
l
.
msgHide
},
d
.
isAjaxSubmit
=!
1
,
l
.
valid
||!
e
.
trim
(
K
(
i
,
"action"
)))
d
.
isAjaxSubmit
=!
0
;
else
{
var
f
=
e
[
e
.
_data
?
"_data"
:
"data"
](
i
,
"events"
);
f
&&
f
.
valid
&&
e
.
map
(
f
.
valid
,
function
(
e
){
return
-
1
!==
e
.
namespace
.
indexOf
(
"form"
)?
1
:
null
}).
length
&&
(
d
.
isAjaxSubmit
=!
0
)}
d
.
$el
.
data
(
h
)
||
(
d
.
$el
.
data
(
h
,
d
).
addClass
(
k
+
" "
+
l
.
formClass
).
on
(
"submit"
+
v
+
" validate"
+
v
,
B
(
d
,
"_submit"
)).
on
(
"reset"
+
v
,
B
(
d
,
"_reset"
)).
on
(
"showtip"
+
v
,
B
(
d
,
"_showTip"
)).
on
(
"focusin"
+
v
+
" click"
+
v
+
" showtip"
+
v
,
N
,
B
(
d
,
"_focusin"
)).
on
(
"focusout"
+
v
+
" validate"
+
v
,
N
,
B
(
d
,
"_focusout"
)),
l
.
timely
>=
2
&&
d
.
$el
.
on
(
"keyup"
+
v
+
" paste"
+
v
,
N
,
B
(
d
,
"_focusout"
)).
on
(
"click"
+
v
,
":radio,:checkbox"
,
B
(
d
,
"_focusout"
)).
on
(
"change"
+
v
,
'select,input[type="file"]'
,
B
(
d
,
"_focusout"
)),
d
.
_novalidate
=
K
(
i
,
q
),
K
(
i
,
q
,
q
))},
_initFields
:
function
(
t
){
var
i
=
this
;
z
(
t
)
&&
e
.
each
(
t
,
function
(
e
,
t
){
if
(
null
===
t
){
var
n
=
i
.
elements
[
e
];
n
&&
i
.
_resetElement
(
n
,
!
0
),
delete
i
.
fields
[
e
]}
else
i
.
fields
[
e
]
=
Q
(
t
)?{
rule
:
t
}:
t
}),
i
.
$el
.
find
(
N
).
each
(
function
(){
i
.
_parse
(
this
)})},
_parse
:
function
(
e
){
var
t
,
i
=
this
,
n
=
e
.
name
,
s
=
K
(
e
,
V
);
s
&&
K
(
e
,
V
,
null
),(
e
.
id
&&
"#"
+
e
.
id
in
i
.
fields
||!
e
.
name
)
&&
(
n
=
"#"
+
e
.
id
),
n
&&
(
t
=
i
.
fields
[
n
]
||
{},
t
.
key
=
n
,
t
.
old
=
{},
t
.
rule
=
t
.
rule
||
s
||
""
,
t
.
rule
&&
(
t
.
rule
.
match
(
/match|checked/
)
&&
(
t
.
must
=!
0
),
-
1
!==
t
.
rule
.
indexOf
(
"required"
)
&&
(
t
.
required
=!
0
,
K
(
e
,
C
,
!
0
)),(
"timely"
in
t
&&!
t
.
timely
||!
i
.
options
.
timely
)
&&
K
(
e
,
"notimely"
,
!
0
),
Q
(
t
.
target
)
&&
K
(
e
,
S
,
t
.
target
),
Q
(
t
.
tip
)
&&
K
(
e
,
R
,
t
.
tip
),
i
.
fields
[
n
]
=
i
.
_parseRule
(
t
)))},
_parseRule
:
function
(
e
){
var
i
=
I
.
exec
(
e
.
rule
),
n
=
this
.
options
;
if
(
i
)
return
e
.
_i
=
0
,
i
[
1
]
&&
(
e
.
display
=
i
[
1
]),
!
e
.
display
&&
n
.
display
&&
(
e
.
display
=
n
.
display
),
i
[
2
]
&&
(
e
.
rules
=
[],
i
[
2
].
replace
(
j
,
function
(){
var
i
=
arguments
;
i
[
3
]
=
i
[
3
]
||
i
[
4
],
e
.
rules
.
push
({
not
:
"!"
===
i
[
1
],
method
:
i
[
2
],
params
:
i
[
3
]?
i
[
3
].
split
(
", "
):
t
,
or
:
"|"
===
i
[
5
]})})),
e
},
_multiValidate
:
function
(
i
,
n
){
var
s
=
this
,
r
=
s
.
options
;
return
s
.
verifying
=!
0
,
s
.
isValid
=!
0
,
r
.
ignore
&&
(
i
=
i
.
not
(
r
.
ignore
)),
i
.
each
(
function
(
e
,
i
){
var
n
=
s
.
getField
(
i
);
return
n
&&
(
s
.
_validate
(
i
,
n
),
!
s
.
isValid
&&
r
.
stopOnError
)?
!
1
:
t
}),
e
.
when
.
apply
(
null
,
e
.
map
(
s
.
deferred
,
function
(
e
){
return
e
})).
done
(
function
(){
n
.
call
(
s
,
s
.
isValid
),
s
.
verifying
=!
1
}),
e
.
isEmptyObject
(
s
.
deferred
)?
s
.
isValid
:
t
},
_submit
:
function
(
t
){
var
i
=
this
,
n
=
i
.
options
,
s
=
t
.
target
,
r
=
"submit"
===
t
.
type
;
t
.
preventDefault
(),
m
&&~
(
m
=!
1
)
||
i
.
submiting
||
"validate"
===
t
.
type
&&
i
.
$el
[
0
]
!==
s
||
n
.
beforeSubmit
.
call
(
i
,
s
)
===!
1
||
(
n
.
debug
&&
Y
.
log
(
"
\n
"
+
t
.
type
),
i
.
_reset
(),
i
.
submiting
=!
0
,
i
.
_multiValidate
(
i
.
$el
.
find
(
N
),
function
(
t
){
var
a
,
l
=
t
||
2
===
n
.
debug
?
"valid"
:
"invalid"
;
t
||
(
n
.
focusInvalid
&&
i
.
$el
.
find
(
":input["
+
F
+
'="true"]:first'
).
focus
(),
a
=
e
.
map
(
i
.
errors
,
function
(
e
){
return
e
})),
i
.
submiting
=!
1
,
X
(
n
[
l
])
&&
n
[
l
].
call
(
i
,
s
,
a
),
i
.
$el
.
trigger
(
l
+
b
,[
s
,
a
]),
t
&&!
i
.
isAjaxSubmit
&&
r
&&
(
m
=!
0
,
p
&&
p
.
name
&&
i
.
$el
.
append
(
'<input type="hidden" name="'
+
p
.
name
+
'" value="'
+
e
(
p
).
val
()
+
'">'
),
s
.
submit
())}))},
_reset
:
function
(
e
){
var
t
=
this
;
t
.
errors
=
{},
e
&&
t
.
$el
.
find
(
N
).
each
(
function
(
e
,
i
){
t
.
_resetElement
(
i
)})},
_resetElement
:
function
(
t
,
i
){
var
n
=
this
.
options
;
e
(
t
).
removeClass
(
n
.
validClass
+
" "
+
n
.
invalidClass
),
this
.
hideMsg
(
t
),
i
&&
K
(
t
,
C
,
null
)},
_focusin
:
function
(
t
){
var
i
,
n
=
this
,
s
=
n
.
options
,
r
=
t
.
target
;
n
.
verifying
||
(
"showtip"
!==
t
.
type
&&
"error"
===
K
(
r
,
E
)
&&
s
.
focusCleanup
&&
(
e
(
r
).
removeClass
(
s
.
invalidClass
),
n
.
hideMsg
(
r
)),
i
=
K
(
r
,
R
),
i
&&
n
.
showMsg
(
r
,{
type
:
"tip"
,
msg
:
i
}))},
_focusout
:
function
(
t
){
var
i
,
n
,
s
=
this
,
r
=
s
.
options
,
a
=
t
.
target
,
l
=
t
.
type
,
u
=
{
click
:
1
,
change
:
1
,
paste
:
1
},
o
=
0
;
if
(
!
u
[
l
]){
if
(
"validate"
===
l
)
n
=!
0
;
else
{
if
(
K
(
a
,
"notimely"
))
return
;
if
(
r
.
timely
>=
2
&&
"keyup"
!==
l
)
return
}
if
(
r
.
ignore
&&
e
(
a
).
is
(
r
.
ignore
))
return
;
if
(
"keyup"
===
l
){
var
d
=
t
.
keyCode
,
c
=
{
8
:
1
,
9
:
1
,
16
:
1
,
32
:
1
,
46
:
1
};
if
(
9
===
d
&&!
a
.
value
)
return
;
if
(
48
>
d
&&!
c
[
d
])
return
;
o
=
r
.
timely
>=
100
?
r
.
timely
:
500
}}
i
=
s
.
getField
(
a
),
i
&&
(
o
?(
i
.
_t
&&
clearTimeout
(
i
.
_t
),
i
.
_t
=
setTimeout
(
function
(){
s
.
_validate
(
a
,
i
,
n
)},
o
)):
s
.
_validate
(
a
,
i
,
n
))},
_showTip
:
function
(
e
){
var
t
=
this
;
t
.
$el
[
0
]
===
e
.
target
&&
t
.
$el
.
find
(
N
+
"["
+
R
+
"]"
).
each
(
function
(){
t
.
showMsg
(
this
,{
msg
:
K
(
this
,
R
),
type
:
"tip"
})})},
_validatedField
:
function
(
t
,
i
,
n
){
var
s
=
this
,
r
=
s
.
options
,
a
=
n
.
isValid
=
i
.
isValid
=!!
n
.
isValid
,
l
=
a
?
"valid"
:
"invalid"
;
n
.
key
=
i
.
key
,
n
.
rule
=
i
.
_r
,
a
?
n
.
type
=
"ok"
:(
s
.
submiting
&&
(
s
.
errors
[
i
.
key
]
=
n
.
msg
),
s
.
isValid
=!
1
),
i
.
old
.
value
=
t
.
value
,
i
.
old
.
id
=
t
.
id
,
s
.
elements
[
i
.
key
]
=
n
.
element
=
t
,
s
.
$el
[
0
].
isValid
=
a
?
s
.
isFormValid
():
a
,
X
(
i
[
l
])
&&
i
[
l
].
call
(
s
,
t
,
n
),
e
(
t
).
attr
(
F
,
a
?
null
:
!
0
).
removeClass
(
a
?
r
.
invalidClass
:
r
.
validClass
).
addClass
(
n
.
skip
?
""
:
a
?
r
.
validClass
:
r
.
invalidClass
).
trigger
(
l
+
_
,[
n
,
s
]),
s
.
$el
.
triggerHandler
(
"validation"
,[
n
,
s
]),
s
.
checkOnly
||
(
i
.
msgMaker
||
r
.
msgMaker
)
&&
s
[
n
.
showOk
||
n
.
msg
?
"showMsg"
:
"hideMsg"
](
t
,
n
,
i
)},
_validatedRule
:
function
(
i
,
n
,
s
,
r
){
n
=
n
||
o
.
getField
(
i
),
r
=
r
||
{};
var
a
,
l
,
u
,
o
=
this
,
c
=
o
.
options
,
f
=
n
.
_r
,
g
=!
1
;
if
(
null
===
s
)
return
o
.
_validatedField
(
i
,
n
,{
isValid
:
!
0
,
skip
:
!
0
}),
t
;
if
(
s
===!
0
||
s
===
t
||
""
===
s
?
g
=!
0
:
Q
(
s
)?
a
=
s
:
z
(
s
)
&&
(
s
.
error
?
a
=
s
.
error
:(
a
=
s
.
ok
,
g
=!
0
)),
n
.
rules
&&
(
l
=
n
.
rules
[
n
.
_i
],
l
.
not
&&
(
a
=
t
,
g
=
"required"
===
f
||!
g
),
l
.
or
))
if
(
g
)
for
(;
n
.
_i
<
n
.
rules
.
length
&&
n
.
rules
[
n
.
_i
].
or
;)
n
.
_i
++
;
else
u
=!
0
;
u
||
(
g
?(
r
.
isValid
=
g
,
c
.
showOk
!==!
1
&&
(
Q
(
a
)
||
(
Q
(
n
.
ok
)?
a
=
n
.
ok
:
Q
(
K
(
i
,
T
))?
a
=
K
(
i
,
T
):
Q
(
c
.
showOk
)
&&
(
a
=
c
.
showOk
)),
Q
(
a
)
&&
(
r
.
showOk
=
g
,
r
.
msg
=
a
)),
e
(
i
).
trigger
(
"valid"
+
y
,[
f
,
r
.
msg
])):(
r
.
msg
=
(
d
(
i
,
n
,
a
,
o
.
messages
[
f
])
||
Z
.
defaultMsg
).
replace
(
"{0}"
,
o
.
_getDisplay
(
i
,
n
.
display
||
""
)),
e
(
i
).
trigger
(
"invalid"
+
y
,[
f
,
r
.
msg
]))),
c
.
debug
&&
Y
.
log
(
" "
+
n
.
_i
+
": "
+
f
+
" => "
+
(
g
||
r
.
msg
||
g
)),
u
||
g
&&
n
.
_i
<
n
.
rules
.
length
-
1
?(
n
.
_i
++
,
o
.
_checkRule
(
i
,
n
)):(
n
.
_i
=
0
,
o
.
_validatedField
(
i
,
n
,
r
))},
_checkRule
:
function
(
i
,
n
){
var
s
,
r
,
a
=
this
,
l
=
n
.
key
,
u
=
n
.
rules
[
n
.
_i
],
d
=
u
.
method
,
c
=
u
.
params
;
a
.
submiting
&&
a
.
deferred
[
l
]
||
(
r
=
n
.
old
,
n
.
_r
=
d
,
s
=!
n
.
must
&&
r
.
ret
!==
t
&&
r
.
rule
===
u
&&
r
.
id
===
i
.
id
&&
i
.
value
&&
r
.
value
===
i
.
value
?
r
.
ret
:(
o
(
i
,
d
)
||
a
.
rules
[
d
]
||
W
).
call
(
a
,
i
,
c
,
n
),
z
(
s
)
&&
X
(
s
.
then
)?(
a
.
deferred
[
l
]
=
s
,
!
a
.
checkOnly
&&
a
.
showMsg
(
i
,{
type
:
"loading"
,
msg
:
a
.
options
.
loadingMsg
},
n
),
s
.
then
(
function
(
s
,
l
,
o
){
var
d
,
c
=
o
.
responseText
,
f
=
n
.
dataFilter
||
a
.
options
.
dataFilter
;
"json"
===
this
.
dataType
?
c
=
s
:
"{"
===
c
.
charAt
(
0
)
&&
(
c
=
e
.
parseJSON
(
c
)
||
{}),
X
(
f
)
||
(
f
=
function
(
e
){
return
Q
(
e
)
||
z
(
e
)
&&
(
"error"
in
e
||
"ok"
in
e
)?
e
:
t
}),
d
=
f
(
c
),
d
===
t
&&
(
d
=
f
(
c
.
data
)),
r
.
rule
=
u
,
r
.
ret
=
d
,
a
.
_validatedRule
(
i
,
n
,
d
)},
function
(
e
,
t
){
a
.
_validatedRule
(
i
,
n
,
t
)}).
always
(
function
(){
delete
a
.
deferred
[
l
]}),
n
.
isValid
=
t
):
a
.
_validatedRule
(
i
,
n
,
s
))},
_validate
:
function
(
i
,
n
){
if
(
!
i
.
disabled
&&
null
===
K
(
i
,
q
)){
var
s
,
r
=
this
,
a
=
{},
l
=
n
.
group
,
u
=
n
.
isValid
=!
0
;
if
(
n
.
rules
||
r
.
_parse
(
i
),
r
.
options
.
debug
&&
Y
.
info
(
n
.
key
),
l
&&
(
s
=
l
.
callback
.
call
(
r
,
l
.
$elems
),
s
!==
t
&&
(
r
.
hideMsg
(
l
.
target
,{},
n
),
s
===!
0
?
s
=
t
:(
n
.
_i
=
0
,
n
.
_r
=
"group"
,
u
=!
1
,
r
.
hideMsg
(
i
,{},
n
),
e
.
extend
(
a
,
l
)))),
u
&&!
n
.
required
&&!
n
.
must
&&!
i
.
value
){
if
(
"tip"
===
K
(
i
,
E
))
return
;
if
(
!
f
(
i
))
return
r
.
_validatedField
(
i
,
n
,{
isValid
:
!
0
}),
t
}
s
!==
t
?
r
.
_validatedRule
(
i
,
n
,
s
,
a
):
n
.
rule
&&
r
.
_checkRule
(
i
,
n
)}},
test
:
function
(
e
,
i
){
var
n
,
s
,
r
,
a
=
this
,
l
=
D
.
exec
(
i
);
return
l
&&
(
s
=
l
[
1
],
s
in
a
.
rules
&&
(
r
=
l
[
2
]
||
l
[
3
],
r
=
r
?
r
.
split
(
", "
):
t
,
n
=
a
.
rules
[
s
].
call
(
a
,
e
,
r
))),
n
===!
0
||
n
===
t
||
null
===
n
},
getRangeMsg
:
function
(
e
,
t
,
i
,
n
){
if
(
t
){
var
s
=
this
,
r
=
s
.
messages
[
i
]
||
""
,
a
=
t
[
0
].
split
(
"~"
),
l
=
a
[
0
],
u
=
a
[
1
],
o
=
"rg"
,
d
=
[
""
],
c
=+
e
===+
e
;
if
(
2
===
a
.
length
){
if
(
l
&&
u
){
if
(
c
&&
e
>=+
l
&&+
u
>=
e
)
return
!
0
;
d
=
d
.
concat
(
a
)}
else
if
(
l
&&!
u
){
if
(
c
&&
e
>=+
l
)
return
!
0
;
d
.
push
(
l
),
o
=
"gte"
}
else
if
(
!
l
&&
u
){
if
(
c
&&+
u
>=
e
)
return
!
0
;
d
.
push
(
u
),
o
=
"lte"
}}
else
{
if
(
e
===+
l
)
return
!
0
;
d
.
push
(
l
),
o
=
"eq"
}
return
r
&&
(
n
&&
r
[
o
+
n
]
&&
(
o
+=
n
),
d
[
0
]
=
r
[
o
]),
s
.
renderMsg
.
apply
(
null
,
d
)}},
renderMsg
:
function
(){
var
e
=
arguments
,
t
=
e
[
0
],
i
=
e
.
length
;
if
(
t
){
for
(;
--
i
;)
t
=
t
.
replace
(
"{"
+
i
+
"}"
,
e
[
i
]);
return
t
}},
_getDisplay
:
function
(
e
,
t
){
return
Q
(
t
)?
t
:
X
(
t
)?
t
.
call
(
this
,
e
):
""
},
_getMsgOpt
:
function
(
t
){
return
e
.
extend
({},
this
.
msgOpt
,
Q
(
t
)?{
msg
:
t
}:
t
)},
_getMsgDOM
:
function
(
t
,
i
){
var
n
,
s
,
r
,
a
=
e
(
t
);
if
(
a
.
is
(
":input"
)?(
r
=
i
.
target
||
K
(
t
,
S
),
r
&&
(
r
=
X
(
r
)?
r
.
call
(
this
,
t
):
this
.
$el
.
find
(
r
),
r
.
length
&&
(
r
.
is
(
":input"
)?
t
=
r
.
get
(
0
):
n
=
r
)),
n
||
(
s
=!
f
(
t
)
&&
t
.
id
?
t
.
id
:
t
.
name
,
n
=
this
.
$el
.
find
(
i
.
wrapper
+
"."
+
x
+
'[for="'
+
s
+
'"]'
))):
n
=
a
,
!
n
.
length
)
if
(
a
=
this
.
$el
.
find
(
r
||
t
),
n
=
e
(
"<"
+
i
.
wrapper
+
">"
).
attr
({
"class"
:
x
+
(
i
.
cls
?
" "
+
i
.
cls
:
""
),
style
:
i
.
style
||
""
,
"for"
:
s
}),
f
(
t
)){
var
l
=
a
.
parent
();
n
.
appendTo
(
l
.
is
(
"label"
)?
l
.
parent
():
l
)}
else
n
[
i
.
pos
&&
"right"
!==
i
.
pos
?
"insertBefore"
:
"insertAfter"
](
a
);
return
n
},
showMsg
:
function
(
t
,
i
,
n
){
var
s
,
r
=
this
,
a
=
r
.
options
;
if
(
i
=
r
.
_getMsgOpt
(
i
),(
i
.
msg
||
i
.
showOk
)
&&
(
t
=
e
(
t
).
get
(
0
),
e
(
t
).
is
(
N
)
&&
(
K
(
t
,
E
,
i
.
type
),
n
=
n
||
r
.
getField
(
t
),
n
&&
(
i
.
style
=
n
.
msgStyle
||
i
.
style
,
i
.
cls
=
n
.
msgClass
||
i
.
cls
,
i
.
wrapper
=
n
.
msgWrapper
||
i
.
wrapper
,
i
.
target
=
n
.
target
||
a
.
target
)),
s
=
(
n
||
{}).
msgMaker
||
a
.
msgMaker
)){
var
l
=
r
.
_getMsgDOM
(
t
,
i
),
u
=
l
[
0
].
className
;
!
H
.
test
(
u
)
&&
l
.
addClass
(
i
.
cls
),
G
&&
"bottom"
===
i
.
pos
&&
(
l
[
0
].
style
.
marginTop
=
e
(
t
).
outerHeight
()
+
"px"
),
l
.
html
(
s
.
call
(
r
,
i
))[
0
].
style
.
display
=
""
,
X
(
i
.
show
)
&&
i
.
show
.
call
(
r
,
l
,
i
.
type
)}},
hideMsg
:
function
(
t
,
i
,
n
){
var
s
=
this
,
r
=
s
.
options
;
t
=
e
(
t
).
get
(
0
),
i
=
s
.
_getMsgOpt
(
i
),
e
(
t
).
is
(
N
)
&&
(
K
(
t
,
E
,
null
),
K
(
t
,
F
,
null
),
n
=
n
||
s
.
getField
(
t
),
n
&&
(
i
.
wrapper
=
n
.
msgWrapper
||
i
.
wrapper
,
i
.
target
=
n
.
target
||
r
.
target
));
var
a
=
s
.
_getMsgDOM
(
t
,
i
);
a
.
length
&&
(
X
(
i
.
hide
)?
i
.
hide
.
call
(
s
,
a
,
i
.
type
):
a
[
0
].
style
.
display
=
"none"
)},
mapMsg
:
function
(
t
){
var
i
=
this
;
e
.
each
(
t
,
function
(
e
,
t
){
var
n
=
i
.
elements
[
e
]
||
i
.
$el
.
find
(
':input[name="'
+
e
+
'"]'
)[
0
];
i
.
showMsg
(
n
,
t
)})},
setMsg
:
function
(
e
){
new
s
(
e
,
this
.
messages
)},
setRule
:
function
(
t
){
new
n
(
t
,
this
.
rules
),
e
.
map
(
this
.
fields
,
function
(
e
){
e
.
old
=
{}})},
getField
:
function
(
e
){
var
t
,
i
=
this
;
return
t
=
e
.
id
&&
"#"
+
e
.
id
in
i
.
fields
||!
e
.
name
?
"#"
+
e
.
id
:
e
.
name
,
K
(
e
,
V
)
&&
i
.
_parse
(
e
),
i
.
fields
[
t
]},
setField
:
function
(
e
,
t
){
var
i
=
{};
Q
(
e
)?
i
[
e
]
=
t
:
z
(
e
)
&&
(
i
=
e
),
this
.
_initFields
(
i
)},
isFormValid
:
function
(){
var
e
=
this
.
fields
;
for
(
var
t
in
e
)
if
(
!
e
[
t
].
isValid
)
return
e
[
t
].
isValid
;
return
!
0
},
holdSubmit
:
function
(
e
){
this
.
submiting
=
e
===
t
||
e
},
cleanUp
:
function
(){
this
.
_reset
(
1
)},
destroy
:
function
(){
this
.
_reset
(
1
),
this
.
$el
.
off
(
v
).
removeData
(
h
),
K
(
this
.
$el
[
0
],
q
,
this
.
_novalidate
)}},
e
(
document
).
on
(
"focusin"
,
":input["
+
V
+
"]"
,
function
(
e
){
u
(
e
)}).
on
(
"click"
,
"input,button"
,
function
(
e
){
var
t
=
this
,
i
=
t
.
name
;
if
(
t
.
form
)
if
(
"submit"
===
t
.
type
)
p
=
t
,
null
!==
K
(
t
,
q
)
&&
(
m
=!
0
);
else
if
(
i
&&
f
(
t
)){
var
n
=
t
.
form
.
elements
[
i
];
n
.
length
&&
(
n
=
n
[
0
]),
K
(
n
,
V
)
&&
u
(
e
)}}).
on
(
"submit validate"
,
"form"
,
function
(
t
){
if
(
null
===
K
(
this
,
q
)){
var
i
,
n
=
e
(
this
);
n
.
data
(
h
)
||
(
i
=
n
[
h
]().
data
(
h
),
e
.
isEmptyObject
(
i
.
fields
)?(
K
(
this
,
q
,
q
),
n
.
off
(
v
).
removeData
(
h
)):
i
.
_submit
(
t
))}}),
new
n
({
required
:
function
(
t
,
i
){
var
n
=
e
.
trim
(
t
.
value
),
s
=!
0
;
if
(
i
)
if
(
1
===
i
.
length
){
if
(
!
n
&&!
this
.
test
(
t
,
i
[
0
]))
return
K
(
t
,
C
,
null
),
null
;
K
(
t
,
C
,
!
0
)}
else
"not"
===
i
[
0
]
&&
e
.
map
(
i
.
slice
(
1
),
function
(
t
){
n
===
e
.
trim
(
t
)
&&
(
s
=!
1
)});
return
s
&&!!
n
},
integer
:
function
(
e
,
t
){
var
i
,
n
=
"0|"
,
s
=
"[1-9]
\\
d*"
,
r
=
t
?
t
[
0
]:
"*"
;
switch
(
r
){
case
"+"
:
i
=
s
;
break
;
case
"-"
:
i
=
"-"
+
s
;
break
;
case
"+0"
:
i
=
n
+
s
;
break
;
case
"-0"
:
i
=
n
+
"-"
+
s
;
break
;
default
:
i
=
n
+
"-?"
+
s
}
return
i
=
"^(?:"
+
i
+
")$"
,
RegExp
(
i
).
test
(
e
.
value
)
||
this
.
messages
.
integer
[
r
]},
match
:
function
(
t
,
i
,
n
){
if
(
i
){
var
s
,
r
,
a
,
l
,
u
,
o
,
d
,
c
=
this
,
f
=
"eq"
;
if
(
1
===
i
.
length
?
a
=
i
[
0
]:(
f
=
i
[
0
],
a
=
i
[
1
]),
u
=
"#"
===
a
.
charAt
(
0
)?
a
:
':input[name="'
+
a
+
'"]'
,
o
=
c
.
$el
.
find
(
u
)[
0
]){
if
(
d
=
c
.
getField
(
o
),
s
=
t
.
value
,
r
=
o
.
value
,
n
.
_match
||
(
c
.
$el
.
on
(
"valid"
+
_
+
v
,
u
,
function
(){
e
(
t
).
trigger
(
"validate"
)}),
n
.
_match
=
d
.
_match
=
1
),
!
n
.
required
&&
""
===
s
&&
""
===
r
)
return
null
;
if
(
i
[
2
]
&&
(
"date"
===
i
[
2
]?(
s
=
g
(
s
),
r
=
g
(
r
)):
"time"
===
i
[
2
]
&&
(
s
=+
s
.
replace
(
":"
,
""
),
r
=+
r
.
replace
(
":"
,
""
))),
"eq"
!==
f
&&!
isNaN
(
+
s
)
&&
isNaN
(
+
r
))
return
!
0
;
switch
(
l
=
c
.
messages
.
match
[
f
].
replace
(
"{1}"
,
c
.
_getDisplay
(
t
,
d
.
display
||
a
)),
f
){
case
"lt"
:
return
+
r
>+
s
||
l
;
case
"lte"
:
return
+
r
>=+
s
||
l
;
case
"gte"
:
return
+
s
>=+
r
||
l
;
case
"gt"
:
return
+
s
>+
r
||
l
;
case
"neq"
:
return
s
!==
r
||
l
;
default
:
return
s
===
r
||
l
}}}},
range
:
function
(
e
,
t
){
return
this
.
getRangeMsg
(
+
e
.
value
,
t
,
"range"
)},
checked
:
function
(
t
,
i
,
n
){
if
(
f
(
t
)){
var
s
,
r
,
a
=
this
;
return
r
=
a
.
$el
.
find
(
'input[name="'
+
t
.
name
+
'"]'
).
filter
(
function
(){
var
t
=
this
;
return
!
s
&&
f
(
t
)
&&
(
s
=
t
),
!
t
.
disabled
&&
t
.
checked
&&
e
(
t
).
is
(
":visible"
)}).
length
,
i
?
a
.
getRangeMsg
(
r
,
i
,
"checked"
):
!!
r
||
d
(
s
,
n
,
""
)
||
a
.
messages
.
required
}},
length
:
function
(
e
,
t
){
var
i
=
e
.
value
,
n
=
(
t
[
1
]?
i
.
replace
(
U
,
"xx"
):
i
).
length
;
return
this
.
getRangeMsg
(
n
,
t
,
"length"
,
t
[
1
]?
"_2"
:
""
)},
remote
:
function
(
t
,
i
){
if
(
i
){
var
n
,
s
=
this
,
r
=
L
.
exec
(
i
[
0
]),
a
=
r
[
2
],
l
=
(
r
[
1
]
||
"POST"
).
toUpperCase
(),
u
=
{};
return
u
[
t
.
name
]
=
t
.
value
,
i
[
1
]
&&
e
.
map
(
i
.
slice
(
1
),
function
(
t
){
var
i
,
n
=
t
.
split
(
":"
);
t
=
e
.
trim
(
n
[
0
]),
i
=
e
.
trim
(
n
[
1
]
||
""
)
||
t
,
u
[
t
]
=
s
.
$el
.
find
(
"#"
===
i
.
charAt
(
0
)?
i
:
':input[name="'
+
i
+
'"]'
).
val
()}),
u
=
e
.
param
(
u
),
"POST"
===
l
&&
(
n
=
a
.
indexOf
(
"?"
),
-
1
!==
n
&&
(
u
+=
"&"
+
a
.
substring
(
n
+
1
,
a
.
length
),
a
=
a
.
substring
(
0
,
n
))),
e
.
ajax
({
url
:
a
,
type
:
l
,
data
:
u
,
cache
:
!
1
})}},
filter
:
function
(
e
,
t
){
e
.
value
=
e
.
value
.
replace
(
t
?
RegExp
(
"["
+
t
[
0
]
+
"]"
,
"gm"
):
P
,
""
)}}),
i
.
config
=
function
(
t
){
e
.
each
(
t
,
function
(
e
,
t
){
"rules"
===
e
?
new
n
(
t
):
"messages"
===
e
?
new
s
(
t
):
Z
[
e
]
=
t
})},
i
.
setTheme
=
function
(
t
,
i
){
z
(
t
)?
e
.
each
(
t
,
function
(
e
,
t
){
et
[
e
]
=
t
}):
Q
(
t
)
&&
z
(
i
)
&&
(
et
[
t
]
=
i
)},
e
[
h
]
=
i
}(
jQuery
);
static/js/validator/zh_CN.js
0 → 100755
View file @
1925cf40
/*********************************
* Themes, rules, and i18n support
* Locale: Chinese; 中文
*********************************/
(
function
(
factory
)
{
if
(
typeof
define
===
'function'
)
{
define
(
function
(
require
,
exports
,
module
){
var
$
=
require
(
'jquery'
);
$
.
_VALIDATOR_URI
=
module
.
uri
;
require
(
'../src/jquery.validator'
)(
$
);
factory
(
$
);
});
}
else
{
factory
(
jQuery
);
}
}(
function
(
$
)
{
/* Global configuration
*/
$
.
validator
.
config
({
//stopOnError: false,
//theme: 'yellow_right',
defaultMsg
:
"{0}格式不正确"
,
loadingMsg
:
"正在验证..."
,
// Custom rules
rules
:
{
digits
:
[
/^
\d
+$/
,
"请输入数字"
]
,
letters
:
[
/^
[
a-z
]
+$/i
,
"{0}只能输入字母"
]
,
tel
:
[
/^
(?:(?:
0
\d{2,3}[\-
]?[
1-9
]\d{6,7})
|
(?:[
48
]
00
[\-
]?[
1-9
]\d{6}))
$/
,
"电话格式不正确"
]
,
mobile
:
[
/^1
[
3-9
]\d{9}
$/
,
"手机号格式不正确"
]
,
email
:
[
/^
[\w\+\-]
+
(\.[\w\+\-]
+
)
*@
[
a-z
\d\-]
+
(\.[
a-z
\d\-]
+
)
*
\.([
a-z
]{2,4})
$/i
,
"邮箱格式不正确"
]
,
qq
:
[
/^
[
1-9
]\d{4,}
$/
,
"QQ号格式不正确"
]
,
date
:
[
/^
\d{4}
-
\d{1,2}
-
\d{1,2}
$/
,
"请输入正确的日期,例:yyyy-mm-dd"
]
,
time
:
[
/^
([
01
]\d
|2
[
0-3
])(
:
[
0-5
]\d){1,2}
$/
,
"请输入正确的时间,例:14:30或14:30:00"
]
,
ID_card
:
[
/^
[
1-9
]\d{5}[
1-9
]\d{3}((
0
\d)
|
(
1
[
0-2
]))(([
0|1|2
]\d)
|3
[
0-1
])((\d{4})
|
\d{3}[
A-Z
])
$/
,
"请输入正确的身份证号码"
]
,
url
:
[
/^
(
https
?
|ftp
)
:
\/\/[^\s]
+$/i
,
"网址格式不正确"
]
,
postcode
:
[
/^
[
1-9
]\d{5}
$/
,
"邮政编码格式不正确"
]
,
chinese
:
[
/^
[\u
0391-
\u
FFE5
]
+$/
,
"请输入中文"
]
,
username
:
[
/^
\w{3,12}
$/
,
"请输入3-12位数字、字母、下划线"
]
,
password
:
[
/^
[
0-9a-zA-Z
]{6,16}
$/
,
"密码由6-16位数字、字母组成"
]
,
accept
:
function
(
element
,
params
){
if
(
!
params
)
return
true
;
var
ext
=
params
[
0
];
return
(
ext
===
'*'
)
||
(
new
RegExp
(
".(?:"
+
(
ext
||
"png|jpg|jpeg|gif"
)
+
")$"
,
"i"
)).
test
(
element
.
value
)
||
this
.
renderMsg
(
"只接受{1}后缀"
,
ext
.
replace
(
'|'
,
','
));
}
}
});
/* Default error messages
*/
$
.
validator
.
config
({
messages
:
{
required
:
"{0}不能为空"
,
remote
:
"{0}已被使用"
,
integer
:
{
'*'
:
"请输入整数"
,
'+'
:
"请输入正整数"
,
'+0'
:
"请输入正整数或0"
,
'-'
:
"请输入负整数"
,
'-0'
:
"请输入负整数或0"
},
match
:
{
eq
:
"{0}与{1}不一致"
,
neq
:
"{0}与{1}不能相同"
,
lt
:
"{0}必须小于{1}"
,
gt
:
"{0}必须大于{1}"
,
lte
:
"{0}必须小于或等于{1}"
,
gte
:
"{0}必须大于或等于{1}"
},
range
:
{
rg
:
"请输入{1}到{2}的数"
,
gte
:
"请输入大于或等于{1}的数"
,
lte
:
"请输入小于或等于{1}的数"
},
checked
:
{
eq
:
"请选择{1}项"
,
rg
:
"请选择{1}到{2}项"
,
gte
:
"请至少选择{1}项"
,
lte
:
"请最多选择{1}项"
},
length
:
{
eq
:
"请输入{1}个字符"
,
rg
:
"请输入{1}到{2}个字符"
,
gte
:
"请至少输入{1}个字符"
,
lte
:
"请最多输入{1}个字符"
,
eq_2
:
""
,
rg_2
:
""
,
gte_2
:
""
,
lte_2
:
""
}
}
});
/* Themes
*/
var
TPL_ARROW
=
'<span class="n-arrow"><b>◆</b><i>◆</i></span>'
;
$
.
validator
.
setTheme
({
'simple_right'
:
{
formClass
:
'n-simple'
,
msgClass
:
'n-right'
},
'simple_bottom'
:
{
formClass
:
'n-simple'
,
msgClass
:
'n-bottom'
},
'yellow_top'
:
{
formClass
:
'n-yellow'
,
msgClass
:
'n-top'
,
msgArrow
:
TPL_ARROW
},
'yellow_right'
:
{
formClass
:
'n-yellow'
,
msgClass
:
'n-right'
,
msgArrow
:
TPL_ARROW
},
'yellow_right_effect'
:
{
formClass
:
'n-yellow'
,
msgClass
:
'n-right'
,
msgArrow
:
TPL_ARROW
,
msgShow
:
function
(
$msgbox
,
type
){
var
$el
=
$msgbox
.
children
();
if
(
$el
.
is
(
':animated'
))
return
;
if
(
type
===
'error'
)
{
$el
.
css
({
left
:
'20px'
,
opacity
:
0
}).
delay
(
100
).
show
().
stop
().
animate
({
left
:
'-4px'
,
opacity
:
1
},
150
).
animate
({
left
:
'3px'
},
80
).
animate
({
left
:
0
},
80
);
}
else
{
$el
.
css
({
left
:
0
,
opacity
:
1
}).
fadeIn
(
200
);
}
},
msgHide
:
function
(
$msgbox
,
type
){
var
$el
=
$msgbox
.
children
();
$el
.
stop
().
delay
(
100
).
show
().
animate
({
left
:
'20px'
,
opacity
:
0
},
300
,
function
(){
$msgbox
.
hide
();
});
}
}
});
}));
\ No newline at end of file
templates/jasset/jadd.html
View file @
1925cf40
...
@@ -31,17 +31,14 @@
...
@@ -31,17 +31,14 @@
</a>
</a>
</div>
</div>
</div>
</div>
<div
class=
"ibox-content"
name=
"addidc"
id=
"addidc"
onclick=
"show(this)"
>
addidc
</div>
<div
class=
"ibox-content"
id=
"addhost"
>
<div
class=
"ibox-content"
id=
"addhost"
>
{% if emg %}
{% if emg %}
<div
class=
"alert alert-warning text-center"
>
{{ emg }}
</div>
<div
class=
"alert alert-warning text-center"
>
{{ emg }}
</div>
{% endif %}
{% endif %}
<form
method=
"post"
class=
"form-horizontal"
>
<form
method=
"post"
id=
"jasset_add"
class=
"form-horizontal"
>
<div
class=
"form-group"
><label
class=
"col-sm-2 control-label"
>
IP地址
</label>
<div
class=
"form-group"
><label
class=
"col-sm-2 control-label"
>
IP地址
</label>
<div
class=
"col-sm-8"
><input
type=
"text"
value=
"{{ j_ip }}"
placeholder=
"192.168.1.1"
name=
"j_ip"
class=
"form-control"
></div>
<div
class=
"col-sm-8"
><input
type=
"text"
value=
"{{ j_ip }}"
name=
"j_ip"
class=
"form-control"
></div>
</div>
</div>
<div
class=
"hr-line-dashed"
></div>
<div
class=
"hr-line-dashed"
></div>
...
@@ -131,17 +128,6 @@
...
@@ -131,17 +128,6 @@
</div>
</div>
</div>
</div>
<!-- Peity -->
<script
src=
"static/js/plugins/peity/jquery.peity.min.js"
></script>
<!-- Custom and plugin javascript -->
<script
src=
"static/js/inspinia.js"
></script>
<script
src=
"static/js/plugins/pace/pace.min.js"
></script>
<!-- Peity -->
<script
src=
"static/js/demo/peity-demo.js"
></script>
<script>
<script>
var
showFlag
=
{};
var
showFlag
=
{};
function
show
(
o
){
function
show
(
o
){
...
@@ -149,12 +135,76 @@ var showFlag={};
...
@@ -149,12 +135,76 @@ var showFlag={};
if
(
showFlag
.
j_type
==
"MAP"
){
if
(
showFlag
.
j_type
==
"MAP"
){
document
.
getElementById
(
"a1"
).
style
.
display
=
""
;
document
.
getElementById
(
"a1"
).
style
.
display
=
""
;
}
}
else
if
(
showFlag
.
addidc
==
"addidc"
){
document
.
getElementById
(
"addidc"
).
style
.
display
=
""
;
}
else
{
else
{
document
.
getElementById
(
"a1"
).
style
.
display
=
"none"
;
document
.
getElementById
(
"a1"
).
style
.
display
=
"none"
;
}};
}};
//验证初始化
$
(
'#jasset_add'
).
validator
({
focusCleanup
:
true
,
stopOnError
:
false
,
//debug: true,
timely
:
2
,
theme
:
"yellow_right_effect"
,
//自定义规则(PS:建议尽量在全局配置中定义规则,统一管理)
rules
:
{
username
:
[
/^
[
a-zA-Z0-9
]
+$/
,
'用户名无效! 仅支持字母与数字。'
],
check_ip
:
[
/^
(\d{1,2}
|1
\d\d
|2
[
0-4
]\d
|25
[
0-5
])(\.(\d{1,2}
|1
\d\d
|2
[
0-4
]\d
|25
[
0-5
])){3}
$/
,
'ip不正确'
],
check_port
:
[
/^
\d{1,5}
$/
,
'端口号不正确'
]
},
fields
:
{
"j_ip"
:
{
rule
:
"required;check_ip"
,
tip
:
"请输入IP"
,
ok
:
"ok"
,
msg
:
{
required
:
"必须填写!"
}
},
"j_port"
:
{
rule
:
"required;check_port"
,
tip
:
"请输入端口号"
,
ok
:
"ok"
,
msg
:
{
required
:
"必须填写!"
}
},
"user[user_password]"
:
{
rule
:
"required;length[6~];password;strength"
,
tip
:
"6个或更多字符! 要复杂些。"
,
ok
:
""
,
msg
:
{
required
:
"密码不能为空!"
,
length
:
"密码最少为6位。"
}
},
"user[screen_name]"
:
{
rule
:
"required;username;remote[check/user.php]"
,
tip
:
"别担心,你可以稍后进行修改。"
,
ok
:
"用户名可以使用。<br>你可以稍后进行修改。"
,
msg
:
{
required
:
"用户名必填!<br>你可以稍后进行修改。"
}
}
},
//验证成功
valid
:
function
(
form
)
{
$
.
ajax
({
url
:
'results.php'
,
type
:
'POST'
,
data
:
$
(
form
).
serialize
(),
success
:
function
(
d
){
$
(
'#result'
).
fadeIn
(
300
).
delay
(
2000
).
fadeOut
(
500
);
}
});
},
//验证失败
invalid
:
function
(
form
)
{
//按钮动画效果
$
(
'#btn-submit'
).
stop
().
delay
(
100
)
.
animate
({
left
:
-
5
},
100
)
.
animate
({
left
:
5
},
100
)
.
animate
({
left
:
-
4
},
100
)
.
animate
({
left
:
4
},
100
)
.
animate
({
left
:
-
3
},
100
)
.
animate
({
left
:
0
},
100
);
}
});
</script>
</script>
{% endblock %}
{% endblock %}
\ No newline at end of file
templates/juser/group_add.html
View file @
1925cf40
...
@@ -35,16 +35,16 @@
...
@@ -35,16 +35,16 @@
<div
class=
"alert alert-success text-center"
>
{{ msg }}
</div>
<div
class=
"alert alert-success text-center"
>
{{ msg }}
</div>
{% endif %}
{% endif %}
<div
class=
"form-group"
>
<div
class=
"form-group"
>
<label
for=
"
j_
group_name"
class=
"col-sm-2 control-label"
>
组名
<span
class=
"red-fonts"
>
*
</span></label>
<label
for=
"group_name"
class=
"col-sm-2 control-label"
>
组名
<span
class=
"red-fonts"
>
*
</span></label>
<div
class=
"col-sm-8"
>
<div
class=
"col-sm-8"
>
<input
id=
"
j_group_name"
name=
"j_
group_name"
placeholder=
"Group name"
type=
"text"
class=
"form-control"
>
<input
id=
"
group_name"
name=
"
group_name"
placeholder=
"Group name"
type=
"text"
class=
"form-control"
>
</div>
</div>
</div>
</div>
<div
class=
"hr-line-dashed"
></div>
<div
class=
"hr-line-dashed"
></div>
<div
class=
"form-group"
>
<div
class=
"form-group"
>
<label
for=
"
j_
comment"
class=
"col-sm-2 control-label"
>
备注
</label>
<label
for=
"comment"
class=
"col-sm-2 control-label"
>
备注
</label>
<div
class=
"col-sm-8"
>
<div
class=
"col-sm-8"
>
<input
id=
"
j_comment"
name=
"j_
comment"
placeholder=
"Comment"
type=
"text"
class=
"form-control"
>
<input
id=
"
comment"
name=
"
comment"
placeholder=
"Comment"
type=
"text"
class=
"form-control"
>
</div>
</div>
</div>
</div>
...
...
templates/juser/user_add.html
View file @
1925cf40
{% extends 'base.html' %}
{% extends 'base.html' %}
{% load mytags %}
{% block content %}
{% block content %}
{% include 'nav_cat_bar.html' %}
{% include 'nav_cat_bar.html' %}
...
@@ -27,18 +28,24 @@
...
@@ -27,18 +28,24 @@
</div>
</div>
</div>
</div>
<div
class=
"ibox-content"
>
<div
class=
"ibox-content"
>
<form
method=
"get"
class=
"form-horizontal"
>
<form
method=
"post"
class=
"form-horizontal"
action=
""
>
{% if error %}
<div
class=
"alert alert-warning text-center"
>
{{ error }}
</div>
{% endif %}
{% if msg %}
<div
class=
"alert alert-success text-center"
>
{{ msg }}
</div>
{% endif %}
<div
class=
"form-group"
>
<div
class=
"form-group"
>
<label
for=
"
j_
username"
class=
"col-sm-2 control-label"
>
用户名
<span
class=
"red-fonts"
>
*
</span></label>
<label
for=
"username"
class=
"col-sm-2 control-label"
>
用户名
<span
class=
"red-fonts"
>
*
</span></label>
<div
class=
"col-sm-8"
>
<div
class=
"col-sm-8"
>
<input
id=
"
j_username"
name=
"username"
placeholder=
"Username"
type=
"text"
class=
"form-control"
>
<input
id=
"
username"
name=
"username"
placeholder=
"Username"
type=
"text"
class=
"form-control"
value=
{{
username
}}
>
</div>
</div>
</div>
</div>
<div
class=
"hr-line-dashed"
></div>
<div
class=
"hr-line-dashed"
></div>
<div
class=
"form-group"
>
<div
class=
"form-group"
>
<label
for=
"
j_
password"
class=
"col-sm-2 control-label"
>
密码
<span
class=
"red-fonts"
>
*
</span></label>
<label
for=
"password"
class=
"col-sm-2 control-label"
>
密码
<span
class=
"red-fonts"
>
*
</span></label>
<div
class=
"col-sm-8"
>
<div
class=
"col-sm-8"
>
<input
id=
"
j_password"
name=
"j_password"
placeholder=
"Password"
type=
"password"
class=
"form-control"
>
<input
id=
"
password"
name=
"password"
placeholder=
"Password"
type=
"password"
class=
"form-control"
value=
{{
password
}}
>
<span
class=
"help-block m-b-none"
>
<span
class=
"help-block m-b-none"
>
登陆web的密码
登陆web的密码
</span>
</span>
...
@@ -46,62 +53,84 @@
...
@@ -46,62 +53,84 @@
</div>
</div>
<div
class=
"hr-line-dashed"
></div>
<div
class=
"hr-line-dashed"
></div>
<div
class=
"form-group"
>
<div
class=
"form-group"
>
<label
for=
"
j_name"
class=
"col-sm-2 control-label"
>
姓名
<span
class=
"red-fonts"
>
*
</span></label>
<label
for=
"
ssh_key_pwd1"
class=
"col-sm-2 control-label"
>
密钥密码
<span
class=
"red-fonts"
>
*
</span></label>
<div
class=
"col-sm-8"
>
<div
class=
"col-sm-8"
>
<input
id=
"j_name"
name=
"j_name"
placeholder=
"Name"
type=
"text"
class=
"form-control"
>
<input
id=
"ssh_key_pwd1"
name=
"ssh_key_pwd1"
placeholder=
"SSH Key Password"
type=
"password"
class=
"form-control"
value=
"{{ ssh_key_pwd1 }}"
>
<span
class=
"help-block m-b-none"
>
登陆 Jumpserver 使用的SSH密钥的密码
</span>
</div>
</div>
</div>
</div>
<div
class=
"hr-line-dashed"
></div>
<div
class=
"hr-line-dashed"
></div>
<div
class=
"form-group"
>
<div
class=
"form-group"
>
<label
for=
"
j_email"
class=
"col-sm-2 control-label"
>
Email
</label>
<label
for=
"
name"
class=
"col-sm-2 control-label"
>
姓名
<span
class=
"red-fonts"
>
*
</span>
</label>
<div
class=
"col-sm-8"
>
<div
class=
"col-sm-8"
>
<input
id=
"
j_email"
name=
"j_email"
type=
"email"
placeholder=
"Email"
class=
"form-control"
>
<input
id=
"
name"
name=
"name"
placeholder=
"Name"
type=
"text"
class=
"form-control"
value=
{{
name
}}
>
</div>
</div>
</div>
</div>
<div
class=
"hr-line-dashed"
></div>
<div
class=
"hr-line-dashed"
></div>
<div
class=
"form-group"
>
<div
class=
"form-group"
>
<label
for=
"
j_group
"
class=
"col-lg-2 control-label"
>
属组
<span
class=
"red-fonts"
>
*
</span></label>
<label
for=
"
groups
"
class=
"col-lg-2 control-label"
>
属组
<span
class=
"red-fonts"
>
*
</span></label>
<div
class=
"col-sm-8"
>
<div
class=
"col-sm-8"
>
<select
id=
"j_group"
name=
"j_group"
class=
"form-control m-b"
multiple
>
<select
id=
"groups"
name=
"groups"
class=
"form-control m-b"
multiple
>
{% for group in groups %}
{% for group in all_group %}
{% if forloop.first %}
{% if groups_str %}
{% if group.id|int2str in groups_str %}
<option
value=
"{{ group.id }}"
selected
>
{{ group.name }}
</option>
<option
value=
"{{ group.id }}"
selected
>
{{ group.name }}
</option>
{% else %}
<option
value=
"{{ group.id }}"
>
{{ group.name }}
</option>
{% endif %}
{% endif %}
{% else %}
{% if forloop.first %}
<option
value=
"{{ group.id }}"
selected
>
{{ group.name }}
</option>
{% else %}
<option
value=
"{{ group.id }}"
>
{{ group.name }}
</option>
<option
value=
"{{ group.id }}"
>
{{ group.name }}
</option>
{% endif %}
{% endif %}
{% endfor %}
{% endfor %}
</select>
</select>
</div>
</div>
</div>
</div>
<div
class=
"hr-line-dashed"
></div>
<div
class=
"hr-line-dashed"
></div>
<div
class=
"form-group"
>
<div
class=
"form-group"
>
<label
for=
"
j_
role"
class=
"col-lg-2 control-label"
>
角色
<span
class=
"red-fonts"
>
*
</span></label>
<label
for=
"role"
class=
"col-lg-2 control-label"
>
角色
<span
class=
"red-fonts"
>
*
</span></label>
<div
class=
"col-sm-8"
>
<div
class=
"col-sm-8"
>
<select
id=
"j_role"
name=
"j_role"
class=
"form-control m-b"
>
<select
id=
"role"
name=
"role"
class=
"form-control m-b"
>
{% for r, role in roles.items %}
{% for r, role_name in user_role.items %}
<option
value=
"{{ r }}"
>
{{ role }}
</option>
{% ifequal r role_post %}
<option
value=
"{{ r }}"
selected
>
{{ role_name }}
</option>
{% else %}
<option
value=
"{{ r }}"
>
{{ role_name }}
</option>
{% endifequal %}
{% endfor %}
{% endfor %}
</select>
</select>
</div>
</div>
</div>
</div>
<div
class=
"hr-line-dashed"
></div>
<div
class=
"hr-line-dashed"
></div>
<div
class=
"form-group"
>
<div
class=
"form-group"
>
<label
for=
"
j_ldap
_pwd"
class=
"col-sm-2 control-label"
>
SSH密码
</label>
<label
for=
"
ssh
_pwd"
class=
"col-sm-2 control-label"
>
SSH密码
</label>
<div
class=
"col-sm-8"
>
<div
class=
"col-sm-8"
>
<input
id=
"
j_ldap_pwd"
name=
"j_ldap_pwd"
type=
"password"
placeholder=
"LDAP Password"
class=
"form-control
"
>
<input
id=
"
ssh_pwd"
name=
"ssh_pwd"
type=
"password"
placeholder=
"SSH Password"
class=
"form-control"
value=
"{{ ssh_pwd }}
"
>
<span
class=
"help-block m-b-none"
>
<span
class=
"help-block m-b-none"
>
如果使用password方式,该密码是用户在后端服务器的密码
如果使用password方式,该密码是用户在后端服务器的密码
</span>
</span>
</div>
</div>
</div>
</div>
<div
class=
"hr-line-dashed"
></div>
<div
class=
"hr-line-dashed"
></div>
<div
class=
"form-group"
>
<label
for=
"email"
class=
"col-sm-2 control-label"
>
Email
</label>
<div
class=
"col-sm-8"
>
<input
id=
"email"
name=
"email"
type=
"email"
placeholder=
"Email"
class=
"form-control"
value=
"{{ email }}"
>
</div>
</div>
<div
class=
"hr-line-dashed"
></div>
<div
class=
"form-group"
><label
class=
"col-sm-2 control-label"
>
是否启用
</label>
<div
class=
"form-group"
><label
class=
"col-sm-2 control-label"
>
是否启用
</label>
<div
class=
"col-sm-8"
>
<div
class=
"col-sm-8"
>
<div
class=
"radio i-checks"
>
<div
class=
"radio i-checks"
>
<label><input
type=
"radio"
value=
"1"
name=
"
j_
is_active"
checked
>
启用
</label>
<label><input
type=
"radio"
value=
"1"
name=
"is_active"
checked
>
启用
</label>
</div>
</div>
<div
class=
"radio i-checks"
>
<div
class=
"radio i-checks"
>
<label><input
type=
"radio"
value=
"0"
name=
"
j_
is_active"
>
禁用
</label>
<label><input
type=
"radio"
value=
"0"
name=
"is_active"
>
禁用
</label>
</div>
</div>
</div>
</div>
</div>
</div>
...
...
templates/link_css.html
View file @
1925cf40
...
@@ -4,3 +4,4 @@
...
@@ -4,3 +4,4 @@
<link
href=
"/static/css/animate.css"
rel=
"stylesheet"
>
<link
href=
"/static/css/animate.css"
rel=
"stylesheet"
>
<link
href=
"/static/css/style.css"
rel=
"stylesheet"
>
<link
href=
"/static/css/style.css"
rel=
"stylesheet"
>
<link
href=
"/static/css/colorbox.css"
rel=
"stylesheet"
>
<link
href=
"/static/css/colorbox.css"
rel=
"stylesheet"
>
<link
href=
"/static/css/vaildator/jquery.validator.css"
rel=
"stylesheet"
>
\ No newline at end of file
templates/script.html
View file @
1925cf40
...
@@ -29,3 +29,7 @@
...
@@ -29,3 +29,7 @@
<!-- pop windows -->
<!-- pop windows -->
<script
src=
"/static/js/jquery.colorbox.js"
></script>
<script
src=
"/static/js/jquery.colorbox.js"
></script>
<!-- validator js -->
<script
src=
"/static/js/validator/jquery.validator.js"
></script>
<script
src=
"/static/js/validator/zh_CN.js"
></script>
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment