修改很多内容

pull/6/head
guanghongwei 2015-03-03 18:42:06 +08:00
parent ad2a4d2d5d
commit fc007e96d7
10 changed files with 285 additions and 132 deletions

View File

@ -2,14 +2,17 @@
import django
import os
import sys
import random
import datetime
sys.path.append('../')
os.environ['DJANGO_SETTINGS_MODULE'] = 'jumpserver.settings'
django.setup()
from juser.views import db_add_user, md5_crypt, CRYPTOR
from juser.views import db_add_user, md5_crypt, CRYPTOR, db_add_group
from jasset.models import Asset, IDC, BisGroup
from juser.models import UserGroup
from juser.models import UserGroup, DEPT
from jasset.views import jasset_group_add
from jperm.models import CmdGroup
@ -29,15 +32,18 @@ def test_add_asset_group():
print 'Add: %s' % name
def test_add_user_group():
for i in range(1, 20):
name = 'DepartGroup' + str(i)
UserGroup.objects.create(name=name, type='M', comment=name)
print 'Add: %s' % name
def test_add_dept():
for i in range(1, 100):
name = 'DEPT' + str(i)
print "Add: %s" % name
DEPT.objects.create(name=name, comment=name)
for i in range(1, 20):
def test_add_group():
dept_all = DEPT.objects.all()
for i in range(1, 100):
name = 'UserGroup' + str(i)
UserGroup.objects.create(name=name, type='A', comment=name)
UserGroup.objects.create(name=name, dept=random.choice(dept_all), comment=name)
print 'Add: %s' % name
@ -52,15 +58,18 @@ def test_add_cmd_group():
def test_add_user():
for i in range(1, 500):
username = "test" + str(i)
dept_all = DEPT.objects.all()
group_all = UserGroup.objects.all()
group_all_id = [group.id for group in group_all]
db_add_user(username=username,
password=md5_crypt(username),
dept=random.choice(dept_all),
name=username, email='%s@jumpserver.org' % username,
groups=[1,3], role='CU',
ssh_pwd=CRYPTOR.encrypt(username),
groups=[random.choice(group_all_id) for i in range(1, 4)], role='CU',
ssh_key_pwd=CRYPTOR.encrypt(username),
ldap_pwd=CRYPTOR.encrypt(username),
is_active=True,
date_joined=0)
date_joined=datetime.datetime.now())
print "Add: %s" % username
@ -73,11 +82,8 @@ def test_add_asset():
if __name__ == '__main__':
test_add_idc()
test_add_asset_group()
test_add_user_group()
test_add_cmd_group()
test_add_asset()
#test_add_dept()
#test_add_group()
test_add_user()

View File

@ -4,7 +4,7 @@ import re
import time
from django import template
from juser.models import User, UserGroup
from juser.models import User, UserGroup, DEPT
from jasset.models import BisGroup
from jumpserver.views import perm_user_asset
@ -26,16 +26,16 @@ def int2str(value):
@register.filter(name='get_role')
def get_role(user_id):
user_role = {'SU': u'瓒呯骇绠$悊鍛', 'GA': u'绠$悊鍛', 'CU': u'鏅氱敤鎴'}
user_role = {'SU': u'瓒呯骇绠$悊鍛', 'DA': u'閮ㄩ棬绠$悊鍛', 'CU': u'鏅氱敤鎴'}
user = User.objects.get(id=user_id)
return user_role.get(str(user.role))
@register.filter(name='groups_str')
def groups_str(username):
def groups_str(user_id):
groups = []
user = User.objects.get(username=username)
for group in user.user_group.filter(type='A'):
user = User.objects.get(id=user_id)
for group in user.group.all():
groups.append(group.name)
if len(groups) < 4:
return ' '.join(groups)
@ -71,6 +71,15 @@ def member_count(group_id):
group = UserGroup.objects.get(id=group_id)
return group.user_set.count()
@register.filter(name='dept_member')
def dept_member(dept_id):
dept = DEPT.objects.filter(id=dept_id)
if dept:
dept = dept[0]
return dept.user_set.count()
else:
return 0
@register.filter(name='perm_count')
def perm_count(group_id):

View File

@ -13,6 +13,8 @@ urlpatterns = patterns('juser.views',
(r'^group_list/$', 'group_list'),
(r'^dept_list/$', 'dept_list'),
(r'^dept_add/$', 'dept_add'),
(r'^dept_del/$', 'dept_del'),
(r'^dept_detail/$', 'dept_detail'),
(r'^user_detail/$', 'user_detail'),
(r'^user_del/$', 'user_del'),
(r'^user_edit/$', 'user_edit'),

View File

@ -62,15 +62,7 @@ def gen_sha512(salt, password):
return crypt.crypt(password, '$6$%s$' % salt)
def db_add_group(**kwargs):
name = kwargs.get('name')
group = UserGroup.objects.filter(name=name)
if group:
raise AddError(u'鐢ㄦ埛缁 %s 宸茬粡瀛樺湪' % name)
UserGroup(**kwargs).save()
def group_add_user(group_name, user_id=None, username=None):
def group_add_user(group, user_id=None, username=None):
try:
if user_id:
user = User.objects.get(id=user_id)
@ -79,10 +71,24 @@ def group_add_user(group_name, user_id=None, username=None):
except ObjectDoesNotExist:
raise AddError('鐢ㄦ埛鑾峰彇澶辫触')
else:
group = UserGroup.objects.get(name=group_name)
group.user_set.add(user)
def db_add_group(**kwargs):
name = kwargs.get('name')
group = UserGroup.objects.filter(name=name)
users = kwargs.pop('users')
if group:
raise AddError(u'鐢ㄦ埛缁 %s 宸茬粡瀛樺湪' % name)
group = UserGroup(**kwargs)
group.save()
for user_id in users:
group_add_user(group, user_id)
def group_update_user(group_id, users_id):
group = UserGroup.objects.get(id=group_id)
group.user_set.clear()
@ -109,12 +115,14 @@ def db_update_user(**kwargs):
user = User.objects.filter(username=username)
user.update(**kwargs)
user = User.objects.get(username=username)
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
if groups_post:
group_select = []
for group_id in groups_post:
group = UserGroup.objects.filter(id=group_id)
group_select.extend(group)
user.user_group = group_select
def db_del_user(username):
@ -249,7 +257,11 @@ def dept_add(request):
def dept_list(request):
header_title, path1, path2 = '鏌ョ湅閮ㄩ棬', '鐢ㄦ埛绠$悊', '鏌ョ湅閮ㄩ棬'
contact_list = DEPT.objects.all()
keyword = request.GET.get('search')
if keyword:
contact_list = DEPT.objects.filter(Q(name__icontains=keyword) | Q(comment__icontains=keyword)).order_by('name')
else:
contact_list = DEPT.objects.all()
p = paginator = Paginator(contact_list, 10)
try:
@ -266,10 +278,32 @@ def dept_list(request):
return render_to_response('juser/dept_list.html', locals(), context_instance=RequestContext(request))
def group_add(request, group_type_select='A'):
def dept_detail(request):
dept_id = request.GET.get('id', None)
if not dept_id:
return HttpResponseRedirect('/juser/dept_list/')
dept = DEPT.objects.filter(id=dept_id)
if dept:
dept = dept[0]
users = dept.user_set.all()
return render_to_response('juser/dept_detail.html', locals(), context_instance=RequestContext(request))
def dept_del(request):
dept_id = request.GET.get('id', None)
if not dept_id:
return HttpResponseRedirect('/juser/dept_list/')
dept = DEPT.objects.filter(id=dept_id)
if dept:
dept = dept[0]
dept.delete()
return HttpResponseRedirect('/juser/dept_list/')
def group_add(request):
error = ''
msg = ''
header_title, path1, path2 = '娣诲姞灞炵粍', '鐢ㄦ埛绠$悊', '娣诲姞鐢ㄦ埛缁'
header_title, path1, path2 = '娣诲姞', '鐢ㄦ埛绠$悊', '娣诲姞'
user_all = User.objects.all()
dept_all = DEPT.objects.all()
@ -290,7 +324,7 @@ def group_add(request, group_type_select='A'):
else:
AddError(u'閮ㄩ棬涓嶅瓨鍦')
db_add_group(name=group_name, dept=dept, comment=comment)
db_add_group(name=group_name, users=users_selected, dept=dept, comment=comment)
except AddError:
pass
except TypeError:
@ -302,8 +336,12 @@ def group_add(request, group_type_select='A'):
def group_list(request):
header_title, path1, path2 = '鏌ョ湅灞炵粍 | Show Group', '鐢ㄦ埛绠$悊', '鏌ョ湅鐢ㄦ埛缁'
contact_list = UserGroup.objects.all()
header_title, path1, path2 = '鏌ョ湅灏忕粍', '鐢ㄦ埛绠$悊', '鏌ョ湅灏忕粍'
keyword = request.GET.get('search', '')
if keyword:
contact_list = UserGroup.objects.filter(Q(name__icontains=keyword) | Q(comment__icontains=keyword))
else:
contact_list = UserGroup.objects.all().order_by('name')
p = paginator = Paginator(contact_list, 10)
try:
@ -370,10 +408,80 @@ def group_edit(request):
return HttpResponseRedirect('/juser/group_list/')
def user_add(request):
error = ''
msg = ''
header_title, path1, path2 = '娣诲姞鐢ㄦ埛 | User Add', '鐢ㄦ埛绠$悊', '娣诲姞鐢ㄦ埛'
user_role = {'SU': u'瓒呯骇绠$悊鍛', 'DA': u'閮ㄩ棬绠$悊鍛', 'CU': u'鏅氱敤鎴'}
dept_all = DEPT.objects.all()
group_all = UserGroup.objects.all()
if request.method == 'POST':
username = request.POST.get('username', '')
password = request.POST.get('password', '')
name = request.POST.get('name', '')
email = request.POST.get('email', '')
dept_id = request.POST.get('dept_id')
groups = request.POST.getlist('groups', [])
role_post = request.POST.get('role', 'CU')
ssh_key_pwd = request.POST.get('ssh_key_pwd', '')
is_active = request.POST.get('is_active', '1')
ldap_pwd = gen_rand_pwd(16)
try:
if None in [username, password, ssh_key_pwd, name, groups, role_post, is_active]:
error = u'甯*鍐呭涓嶈兘涓虹┖'
raise AddError
user = User.objects.filter(username=username)
if user:
error = u'鐢ㄦ埛 %s 宸插瓨鍦' % username
raise AddError
dept = DEPT.objects.filter(id=dept_id)
if dept:
dept = dept[0]
else:
error = u'閮ㄩ棬涓嶅瓨鍦'
raise AddError(error)
except AddError:
pass
else:
try:
db_add_user(username=username,
password=md5_crypt(password),
name=name, email=email, dept=dept,
groups=groups, role=role_post,
ssh_key_pwd=CRYPTOR.encrypt(ssh_key_pwd),
ldap_pwd=CRYPTOR.encrypt(ldap_pwd),
is_active=is_active,
date_joined=datetime.datetime.now())
server_add_user(username, password, ssh_key_pwd)
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(), context_instance=RequestContext(request))
def user_list(request):
user_role = {'SU': u'瓒呯骇绠$悊鍛', 'GA': u'缁勭鐞嗗憳', 'CU': u'鏅氱敤鎴'}
header_title, path1, path2 = '鏌ョ湅鐢ㄦ埛 | Show User', '鐢ㄦ埛绠$悊', '鐢ㄦ埛鍒楄〃'
users = contact_list = User.objects.all().order_by('id')
header_title, path1, path2 = '鏌ョ湅鐢ㄦ埛', '鐢ㄦ埛绠$悊', '鐢ㄦ埛鍒楄〃'
keyword = request.GET.get('search', '')
if keyword:
contact_list = User.objects.filter(Q(username__icontains=keyword) | Q(name__icontains=keyword)).order_by('name')
else:
contact_list = User.objects.all().order_by('id')
p = paginator = Paginator(contact_list, 10)
try:
@ -479,72 +587,6 @@ def user_edit(request):
return render_to_response('juser/user_add.html', locals(), context_instance=RequestContext(request))
def user_add(request):
error = ''
msg = ''
header_title, path1, path2 = '娣诲姞鐢ㄦ埛 | User Add', '鐢ㄦ埛绠$悊', '娣诲姞鐢ㄦ埛'
user_role = {'SU': u'瓒呯骇绠$悊鍛', 'DA': u'閮ㄩ棬绠$悊鍛', 'CU': u'鏅氱敤鎴'}
dept_all = DEPT.objects.all()
group_all = UserGroup.objects.all()
if request.method == 'POST':
username = request.POST.get('username', '')
password = request.POST.get('password', '')
name = request.POST.get('name', '')
email = request.POST.get('email', '')
dept_id = request.POST.get('dept_id')
groups = request.POST.getlist('groups', [])
role_post = request.POST.get('role', 'CU')
ssh_key_pwd = request.POST.get('ssh_key_pwd', '')
is_active = request.POST.get('is_active', '1')
ldap_pwd = gen_rand_pwd(16)
try:
if None in [username, password, ssh_key_pwd, name, groups, role_post, is_active]:
error = u'甯*鍐呭涓嶈兘涓虹┖'
raise AddError
user = User.objects.filter(username=username)
if user:
error = u'鐢ㄦ埛 %s 宸插瓨鍦' % username
raise AddError
dept = DEPT.objects.filter(id=dept_id)
if dept:
dept = dept[0]
else:
error = u'閮ㄩ棬涓嶅瓨鍦'
raise AddError(error)
except AddError:
pass
else:
try:
db_add_user(username=username,
password=md5_crypt(password),
name=name, email=email, dept=dept,
groups=groups, role=role_post,
ssh_key_pwd=CRYPTOR.encrypt(ssh_key_pwd),
ldap_pwd=CRYPTOR.encrypt(ldap_pwd),
is_active=is_active,
date_joined=datetime.datetime.now())
server_add_user(username, password, ssh_key_pwd)
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(), context_instance=RequestContext(request))
def profile(request):
user_id = request.session.get('user_id')
if not user_id:
@ -558,6 +600,3 @@ def chg_pass(request):
return render_to_response('juser/user_add.html', locals(), context_instance=RequestContext(request))

View File

@ -0,0 +1,42 @@
{% load mytags %}
<html>
<head>
{% include 'link_css.html' %}
<style type="text/css">
body
{
background: #FFFFFF;
}
</style>
</head>
<body>
<div class="row">
<div class="contact-box">
<h2 class="text-center"><b>{{ dept.name }}</b> 閮ㄩ棬鎴愬憳</h2>
<div class="ibox-content">
<table class="table table-striped table-bordered table-hover " id="editable" >
<thead>
<tr>
<th class="text-center">鐢ㄦ埛鍚</th>
<th class="text-center">濮撳悕</th>
<th class="text-center">瑙掕壊</th>
</tr>
</thead>
<tbody>
{% for user in users %}
<tr class="gradeX">
<td class="text-center">{{ user.username }}</td>
<td class="text-center">{{ user.name }}</td>
<td class="text-center">{{ user.id|get_role }}</td>
</tr>
{% endfor %}
</tbody>
</tbody>
</table>
</div>
</div>
</body>
</html>

View File

@ -31,11 +31,25 @@
<div class="ibox-content">
<div class="">
<a target="_blank" href="/juser/dept_add/" class="btn btn-sm btn-primary "> 娣诲姞 </a>
<a target="_blank" href="/juser/group_add/" class="btn btn-sm btn-danger "> 鍒犻櫎鎵閫 </a>
<form id="search_form" method="get" action="" class="pull-right mail-search">
<div class="input-group">
<input type="text" class="form-control input-sm" id="search_input" name="search" placeholder="Search">
<div class="input-group-btn">
<button id='search_btn' type="submit" class="btn btn-sm btn-primary">
Search
</button>
</div>
</div>
</form>
</div>
<table class="table table-striped table-bordered table-hover " id="editable" >
<thead>
<tr>
<th class="text-center">
<input type="checkbox" id="select_all" onclick="selectAll()" name="select_all">
</th>
<th class="text-center">閮ㄩ棬鍚嶇О</th>
<th class="text-center">鎴愬憳鏁伴噺</th>
<th class="text-center">澶囨敞</th>
@ -45,13 +59,16 @@
<tbody>
{% for dept in contacts.object_list %}
<tr class="gradeX">
<td class="text-center">
<input type="checkbox" name="selected" value="{{ dept.id }}">
</td>
<td class="text-center"> {{ dept.name }} </td>
<td class="text-center"> {{ dept.name }} </td>
<td class="text-center"> {{ dept.id | dept_member }} </td>
<td class="text-center"> {{ dept.comment }} </td>
<td class="text-center">
<a title="[ {{ dept.name }} ] 鎴愬憳淇℃伅" href="../dept_detail/?id={{ group.id }}" class="iframe btn btn-xs btn-primary">鎴愬憳</a>
<a href="../dept_edit/?id={{ group.id }}" class="btn btn-xs btn-info">缂栬緫</a>
<a href="../dept_del/?id={{ group.id }}" class="btn btn-xs btn-danger">鍒犻櫎</a>
<a title="[ {{ dept.name }} ] 鎴愬憳淇℃伅" href="../dept_detail/?id={{ dept.id }}" class="iframe btn btn-xs btn-primary">鎴愬憳</a>
<a href="../dept_edit/?id={{ dept.id }}" class="btn btn-xs btn-info">缂栬緫</a>
<a href="../dept_del/?id={{ dept.id }}" class="btn btn-xs btn-danger">鍒犻櫎</a>
</td>
</tr>
{% endfor %}
@ -75,8 +92,8 @@
<a href="#">Previous</a>
</li>
{% endif %}
{% for page in p.page_range %}
{% ifequal offset1 page %}
{% for page in page_range %}
{% ifequal current_page page %}
<li class="paginate_button active" aria-controls="editable" tabindex="0"><a href="?page={{ page }}" title="绗瑊{ page }}椤">{{ page }}</a></li>
{% else %}
<li class="paginate_button" aria-controls="editable" tabindex="0"><a href="?page={{ page }}" title="绗瑊{ page }}椤">{{ page }}</a></li>

View File

@ -14,7 +14,7 @@
<body>
<div class="row">
<div class="contact-box">
<h2 class="text-center">{{ group.name }} 灞炵粍璇︽儏</h2>
<h2 class="text-center"><b>{{ group.name }}</b> 缁勪腑鎴愬憳</h2>
<div class="ibox-content">
<table class="table table-striped table-bordered table-hover " id="editable" >

View File

@ -31,11 +31,26 @@
<div class="ibox-content">
<div class="">
<a target="_blank" href="/juser/group_add/" class="btn btn-sm btn-primary "> 娣诲姞 </a>
<a target="_blank" href="/juser/group_add/" class="btn btn-sm btn-danger "> 鍒犻櫎鎵閫 </a>
<form id="search_form" method="get" action="" class="pull-right mail-search">
<div class="input-group">
<input type="text" class="form-control input-sm" id="search_input" name="search" placeholder="Search">
<div class="input-group-btn">
<button id='search_btn' type="submit" class="btn btn-sm btn-primary">
Search
</button>
</div>
</div>
</form>
</div>
<table class="table table-striped table-bordered table-hover " id="editable" >
<thead>
<tr>
<th class="text-center">
<input type="checkbox" id="select_all" onclick="selectAll()" name="select_all">
</th>
<th class="text-center">缁勫悕</th>
<th class="text-center">鎵灞為儴闂</th>
<th class="text-center">鎴愬憳鏁伴噺</th>
@ -46,9 +61,12 @@
<tbody>
{% for group in contacts.object_list %}
<tr class="gradeX">
<td class="text-center">
<input type="checkbox" name="selected" value="{{ group.id }}">
</td>
<td class="text-center"> {{ group.name }} </td>
<td class="text-center"> {{ group.dept.name }} </td>
<td class="text-center"> {{ group.name }} </td>
<td class="text-center"> {{ group.id | member_count }} </td>
<td class="text-center"> {{ group.comment }} </td>
<td class="text-center">
<a title="[ {{ group.name }} ] 鎴愬憳淇℃伅" href="../group_detail/?id={{ group.id }}" class="iframe btn btn-xs btn-primary">鎴愬憳</a>
@ -77,8 +95,8 @@
<a href="#">Previous</a>
</li>
{% endif %}
{% for page in p.page_range %}
{% ifequal offset1 page %}
{% for page in page_range %}
{% ifequal current_page page %}
<li class="paginate_button active" aria-controls="editable" tabindex="0"><a href="?page={{ page }}" title="绗瑊{ page }}椤">{{ page }}</a></li>
{% else %}
<li class="paginate_button" aria-controls="editable" tabindex="0"><a href="?page={{ page }}" title="绗瑊{ page }}椤">{{ page }}</a></li>
@ -107,6 +125,17 @@
$(document).ready(function(){
$(".iframe").colorbox({iframe:true, width:"70%", height:"70%"});
});
{# function user_group_search(){#}
{# $.ajax({#}
{# type: "GET",#}
{# url: "/juser/group_search/",#}
{# data: $("#search_form").serialize(),#}
{# success: function (data) {#}
{# $("#contents_form").html(data);#}
{# }#}
{# });#}
{# }#}
</script>
{% endblock %}

View File

@ -31,6 +31,17 @@
<div class="ibox-content">
<div class="">
<a target="_blank" href="/juser/user_add/" class="btn btn-sm btn-primary "> 娣诲姞 </a>
<a target="_blank" href="/juser/group_add/" class="btn btn-sm btn-danger "> 鍒犻櫎鎵閫 </a>
<form id="search_form" method="get" action="" class="pull-right mail-search">
<div class="input-group">
<input type="text" class="form-control input-sm" id="search_input" name="search" placeholder="Search">
<div class="input-group-btn">
<button id='search_btn' type="submit" class="btn btn-sm btn-primary">
Search
</button>
</div>
</div>
</form>
</div>
<table class="table table-striped table-bordered table-hover " id="editable" >
@ -39,11 +50,10 @@
<th class="text-center">
<input type="checkbox" id="select_all" onclick="selectAll()" name="select_all">
</th>
<th class="text-center">ID</th>
<th class="text-center">鐢ㄦ埛鍚</th>
<th class="text-center">濮撳悕</th>
<th class="text-center">閮ㄩ棬</th>
<th class="text-center">鐢ㄦ埛</th>
<th class="text-center"></th>
<th class="text-center">瑙掕壊</th>
<th class="text-center">婵娲</th>
<th class="text-center">鎿嶄綔</th>
@ -55,12 +65,11 @@
<td class="text-center">
<input type="checkbox" name="selected" value="{{ user.id }}">
</td>
<td class="text-center"> {{ user.id }} </td>
<td class="text-center"> {{ user.username }} </td>
<td class="text-center"> {{ user.name }} </td>
<td class="text-center"> {{ user.username|group_manage_str }} </td>
<td class="text-center"> {{ user.username|groups_str }}</td>
<td class="text-center">{{ user.id|get_role }}</td>
<td class="text-center"> {{ user.dept.name }} </td>
<td class="text-center"> {{ user.id | groups_str }} </td>
<td class="text-center"> {{ user.id | get_role }}</td>
<td class="text-center">{{ user.is_active|bool2str }}</td>
<td class="text-center">
<a title="[ {{ user.name }} ] 璇︽儏" href="../user_detail/?id={{ user.id }}" class="iframe btn btn-xs btn-primary">璇︽儏</a>

View File

@ -1,9 +1,9 @@
<nav class="navbar navbar-static-top" role="navigation" style="margin-bottom: 0">
<div class="navbar-header">
<a class="navbar-minimalize minimalize-styl-2 btn btn-primary " href="#"><i class="fa fa-bars"></i> </a>
<form role="search" class="navbar-form-custom" method="post" action="search_results.html">
<form role="search" class="navbar-form-custom" method="get" action="">
<div class="form-group">
<input type="text" placeholder="杈撳叆鎼滅储..." class="form-control" name="top-search" id="top-search">
<input type="text" placeholder="杈撳叆鎼滅储..." class="form-control" name="search" id="top-search">
</div>
</form>
</div>