diff --git a/jperm/views.py b/jperm/views.py
index 3735b2001..57f2aaadd 100644
--- a/jperm/views.py
+++ b/jperm/views.py
@@ -3,7 +3,6 @@ import sys
 reload(sys)
 sys.setdefaultencoding('utf8')
 
-from django.core.mail import send_mail
 from django.shortcuts import render_to_response
 from django.template import RequestContext
 from jperm.models import Perm, SudoPerm, CmdGroup, Apply
@@ -11,12 +10,6 @@ from django.db.models import Q
 from jumpserver.api import *
 
 
-CONF = ConfigParser()
-CONF.read('%s/jumpserver.conf' % BASE_DIR)
-send_ip = CONF.get('base', 'ip')
-send_port = CONF.get('base', 'port')
-
-
 def asset_cmd_groups_get(asset_groups_select='', cmd_groups_select=''):
     asset_groups_select_list = []
     cmd_groups_select_list = []
@@ -120,7 +113,7 @@ def dept_perm_list(request):
     if keyword:
         contact_list = DEPT.objects.filter(Q(name__icontains=keyword) | Q(comment__icontains=keyword)).order_by('name')
     else:
-        contact_list = DEPT.objects.filter(id__gt=1)
+        contact_list = DEPT.objects.filter(id__gt=2)
 
     contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(contact_list, request)
 
@@ -533,14 +526,23 @@ def cmd_add(request):
         dept_id = request.POST.get('dept_id')
         cmd = ','.join(request.POST.get('cmd').split())
         comment = request.POST.get('comment')
-
         dept = DEPT.objects.filter(id=dept_id)
-        if dept:
+
+        try:
+            if CmdGroup.objects.filter(name=name):
+                error = '%s 命令组已存在'
+                raise ServerError(error)
+
+            if not dept:
+                error = u"部门不能为空"
+                raise ServerError(error)
+        except ServerError, e:
+            pass
+        else:
             dept = dept[0]
             CmdGroup.objects.create(name=name, dept=dept, cmd=cmd, comment=comment)
-        else:
-            error = u"部门不能为空"
-        msg = u'命令组添加成功'
+            msg = u'命令组添加成功'
+            return HttpResponseRedirect('/jperm/cmd_list/')
 
     return render_to_response('jperm/sudo_cmd_add.html', locals(), context_instance=RequestContext(request))
 
@@ -555,8 +557,16 @@ def cmd_add_adm(request):
         cmd = ','.join(request.POST.get('cmd').split())
         comment = request.POST.get('comment')
 
-        CmdGroup.objects.create(name=name, dept=dept, cmd=cmd, comment=comment)
-        msg = u'命令组添加成功'
+        try:
+            if CmdGroup.objects.filter(name=name):
+                error = '%s 命令组已存在'
+                raise ServerError(error)
+        except ServerError, e:
+            pass
+        else:
+            CmdGroup.objects.create(name=name, dept=dept, cmd=cmd, comment=comment)
+            return HttpResponseRedirect('/jperm/cmd_list/')
+
         return HttpResponseRedirect('/jperm/cmd_list/')
 
     return render_to_response('jperm/sudo_cmd_add.html', locals(), context_instance=RequestContext(request))
@@ -568,10 +578,12 @@ def cmd_edit(request):
 
     cmd_group_id = request.GET.get('id')
     cmd_group = CmdGroup.objects.filter(id=cmd_group_id)
+    dept_all = DEPT.objects.all()
 
     if cmd_group:
         cmd_group = cmd_group[0]
         cmd_group_id = cmd_group.id
+        dept_id = cmd_group.dept.id
         name = cmd_group.name
         cmd = '\n'.join(cmd_group.cmd.split(','))
         comment = cmd_group.comment
@@ -579,12 +591,23 @@ def cmd_edit(request):
     if request.method == 'POST':
         cmd_group_id = request.POST.get('cmd_group_id')
         name = request.POST.get('name')
+        dept_id = request.POST.get('dept_id')
         cmd = ','.join(request.POST.get('cmd').split())
         comment = request.POST.get('comment')
-
         cmd_group = CmdGroup.objects.filter(id=cmd_group_id)
-        if cmd_group:
-            cmd_group.update(name=name, cmd=cmd, comment=comment)
+
+        dept = DEPT.objects.filter(id=dept_id)
+        try:
+            if not dept:
+                error = '没有该部门'
+                raise ServerError(error)
+
+            if not cmd_group:
+                error = '没有该命令组'
+        except ServerError, e:
+            pass
+        else:
+            cmd_group.update(name=name, cmd=cmd, dept=dept[0], comment=comment)
             return HttpResponseRedirect('/jperm/cmd_list/')
     return render_to_response('jperm/sudo_cmd_add.html', locals(), context_instance=RequestContext(request))
 
@@ -624,10 +647,22 @@ def cmd_del(request):
 
 @require_admin
 def cmd_detail(request):
-    cmd_id = request.GET.get('id')
-    cmd_group = CmdGroup.objects.filter(id=cmd_id)
-    if cmd_group:
-        cmd_group = cmd_group[0]
+    cmd_ids = request.GET.get('id').split(',')
+    cmds = []
+    if len(cmd_ids) == 1:
+        cmd_group = CmdGroup.objects.filter(id=cmd_ids[0])
+        if cmd_group:
+            cmd_group = cmd_group[0]
+            cmds.extend(cmd_group.cmd.split(','))
+            cmd_group_name = cmd_group.name
+    else:
+        cmd_groups = []
+        for cmd_id in cmd_ids:
+            cmd_groups.extend(CmdGroup.objects.filter(id=cmd_id))
+        for cmd_group in cmd_groups:
+            cmds.extend(cmd_group.cmd.split(','))
+
+    cmds_str = ', '.join(cmds)
 
     return render_to_response('jperm/sudo_cmd_detail.html', locals(), context_instance=RequestContext(request))
 
@@ -660,7 +695,7 @@ def perm_apply(request):
         time_now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
         a = Apply.objects.create(applyer=applyer, dept=dept, bisgroup=group, date_add=datetime.datetime.now(), asset=hosts, status=0, comment=comment)
         uuid = a.uuid
-        url = "http://%s:%s/jperm/apply_exec/?uuid=%s" % (send_ip, send_port, uuid)
+        url = "http://%s:%s/jperm/apply_exec/?uuid=%s" % (SEND_IP, SEND_PORT, uuid)
         mail_msg = """
         Hi,%s:
             有新的权限申请, 详情如下:
@@ -674,7 +709,7 @@ def perm_apply(request):
             %s
         """ % (da.username, applyer, group_lis, hosts_lis, time_now, comment, url)
 
-        send_mail(mail_title, mail_msg, 'jkfunshion@fun.tv', [mail_address], fail_silently=False)
+        send_mail(mail_title, mail_msg, MAIL_FROM, [mail_address], fail_silently=False)
         smg = "提交成功,已发邮件通知部门管理员。"
         return render_to_response('jperm/perm_apply.html', locals(), context_instance=RequestContext(request))
     return render_to_response('jperm/perm_apply.html', locals(), context_instance=RequestContext(request))
diff --git a/jumpserver.conf b/jumpserver.conf
index 291aaf3ef..58a6475e7 100644
--- a/jumpserver.conf
+++ b/jumpserver.conf
@@ -1,8 +1,10 @@
 #coding: utf8
 
 [base]
-ip = 192.168.173.129
+ip = 192.168.20.209
 port = 80
+key = 88aaaf7ffe3c6c04
+
 
 
 [db]
@@ -25,13 +27,9 @@ root_pw = secret234
 web_socket_host = 192.168.173.129:3000
 
 
-[web]
-key = 88aaaf7ffe3c6c04
-
-
 [mail]
-email_host = mail.funshion.com
+email_host = smtp.exmail.qq.com
 email_port = 25
-email_host_user = jkfunshion
-email_host_password = jkmail%
+email_host_user = noreply@jumpserver.org
+email_host_password = jumpserver123
 email_use_tls = False
diff --git a/jumpserver/api.py b/jumpserver/api.py
index 6f642188c..db2b93e3b 100644
--- a/jumpserver/api.py
+++ b/jumpserver/api.py
@@ -19,6 +19,7 @@ from jasset.models import Asset, BisGroup, IDC
 from jlog.models import Log
 from jasset.models import AssetAlias
 from django.core.exceptions import ObjectDoesNotExist
+from django.core.mail import send_mail
 
 
 BASE_DIR = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
@@ -27,18 +28,12 @@ CONF.read(os.path.join(BASE_DIR, 'jumpserver.conf'))
 LOG_DIR = os.path.join(BASE_DIR, 'logs')
 SSH_KEY_DIR = os.path.join(BASE_DIR, 'keys')
 SERVER_KEY_DIR = os.path.join(SSH_KEY_DIR, 'server')
-KEY = CONF.get('web', 'key')
+KEY = CONF.get('base', 'key')
 LOGIN_NAME = getpass.getuser()
 LDAP_ENABLE = CONF.getint('ldap', 'ldap_enable')
-
-
-# def user_perm_group_api(username):
-#     user = User.objects.get(username=username)
-#     if user:
-#         perm_list = []
-#         user_group_all = user.group.all()
-#         for user_group in user_group_all:
-#             perm_list.extend(user_group.perm_set.all())
+SEND_IP = CONF.get('base', 'ip')
+SEND_PORT = CONF.get('base', 'port')
+MAIL_FROM = CONF.get('mail', 'email_host_user')
 
 
 class LDAPMgmt():
@@ -201,6 +196,9 @@ def require_login(func):
 
 def require_super_user(func):
     def _deco(request, *args, **kwargs):
+        if not request.session.get('user_id'):
+            return HttpResponseRedirect('/login/')
+
         if request.session.get('role_id', 0) != 2:
             return HttpResponseRedirect('/')
         return func(request, *args, **kwargs)
@@ -209,6 +207,9 @@ def require_super_user(func):
 
 def require_admin(func):
     def _deco(request, *args, **kwargs):
+        if not request.session.get('user_id'):
+            return HttpResponseRedirect('/login/')
+
         if request.session.get('role_id', 0) < 1:
             return HttpResponseRedirect('/')
         return func(request, *args, **kwargs)
@@ -276,7 +277,8 @@ def view_splitter(request, su=None, adm=None):
         return su(request)
     elif is_group_admin(request):
         return adm(request)
-    raise Http404
+    else:
+        return HttpResponseRedirect('/login/')
 
 
 def user_perm_group_api(username):
@@ -384,39 +386,38 @@ def validate(request, user_group=None, user=None, asset_group=None, asset=None,
 
     if user_group:
         dept_user_groups = dept.usergroup_set.all()
-        user_groups = []
-        for user_group_id in user_group:
-            user_groups.extend(UserGroup.objects.filter(id=user_group_id))
-        if not set(user_groups).issubset(set(dept_user_groups)):
+        user_group_ids = []
+        for group in dept_user_groups:
+            user_group_ids.append(str(group.id))
+
+        if not set(user_group).issubset(set(user_group_ids)):
             return False
 
     if user:
         dept_users = dept.user_set.all()
-        users = []
-        for user_id in user:
-            users.extend(User.objects.filter(id=user_id))
+        user_ids = []
+        for user in dept_users:
+            user_ids.append(str(user.id))
 
-        if not set(users).issubset(set(dept_users)):
+        if not set(user).issubset(set(user_ids)):
             return False
 
     if asset_group:
         dept_asset_groups = dept.bisgroup_set.all()
-        asset_groups = []
-        for group_id in asset_group:
-            asset_groups.extend(BisGroup.objects.filter(id=int(group_id)))
+        asset_group_ids = []
+        for group in dept_asset_groups:
+            asset_group_ids.append(group.id)
 
-        if not set(asset_groups).issubset(set(dept_asset_groups)):
+        if not set(asset_group).issubset(set(asset_group_ids)):
             return False
 
     if asset:
         dept_assets = dept.asset_set.all()
-        assets, eassets = [], []
-        for asset_id in dept_assets:
-            eassets.append(int(asset_id.id))
-        for i in asset:
-            assets.append(int(i)) 
+        asset_ids = []
+        for asset in dept_assets:
+            asset_ids.append(str(asset.id))
 
-        if not set(assets).issubset(eassets):
+        if not set(asset).issubset(set(asset_ids)):
             return False
 
     return True
diff --git a/jumpserver/templatetags/mytags.py b/jumpserver/templatetags/mytags.py
index 8ca36df99..a427f3b5e 100644
--- a/jumpserver/templatetags/mytags.py
+++ b/jumpserver/templatetags/mytags.py
@@ -163,6 +163,18 @@ def ugrp_perm_agrp_count(user_group_id):
     return 0
 
 
+@register.filter(name='ugrp_sudo_agrp_count')
+def ugrp_sudo_agrp_count(user_group_id):
+    user_group = UserGroup.objects.filter(id=user_group_id)
+    asset_groups = []
+    if user_group:
+        user_group = user_group[0]
+        for perm in user_group.sudoperm_set.all():
+            asset_groups.extend(perm.asset_group.all())
+        return len(set(asset_groups))
+    return 0
+
+
 @register.filter(name='ugrp_perm_asset_count')
 def ugrp_perm_asset_count(user_group_id):
     user_group = UserGroup.objects.filter(id=user_group_id)
@@ -175,6 +187,21 @@ def ugrp_perm_asset_count(user_group_id):
     return len(set(assets))
 
 
+@register.filter(name='ugrp_sudo_asset_count')
+def ugrp_sudo_asset_count(user_group_id):
+    user_group = UserGroup.objects.filter(id=user_group_id)
+    asset_groups = []
+    assets = []
+    if user_group:
+        user_group = user_group[0]
+        for perm in user_group.sudoperm_set.all():
+            asset_groups.extend(perm.asset_group.all())
+
+        for asset_group in asset_groups:
+            assets.extend(asset_group.asset_set.all())
+    return len(set(assets))
+
+
 @register.filter(name='get_user_alias')
 def get_user_alias(post, user_id):
     user = User.objects.get(id=user_id)
@@ -304,8 +331,52 @@ def sudo_cmd_list(cmd_group_id):
 
 
 @register.filter(name='sudo_cmd_count')
-def sudo_cmd_count(cmd_group_id):
-    cmd_group = CmdGroup.objects.filter(id=cmd_group_id)
-    if cmd_group:
-        cmd_group = cmd_group[0]
-        return len(cmd_group.cmd.split(','))
+def sudo_cmd_count(user_group_id):
+    user_group = UserGroup.objects.filter(id=user_group_id)
+    cmds = []
+    if user_group:
+        user_group = user_group[0]
+        cmd_groups = []
+
+        for perm in user_group.sudoperm_set.all():
+            cmd_groups.extend(perm.cmd_group.all())
+
+        for cmd_group in cmd_groups:
+            cmds.extend(cmd_group.cmd.split(','))
+        return len(set(cmds))
+
+    else:
+        return 0
+
+
+@register.filter(name='sudo_cmd_count')
+def sudo_cmd_count(user_group_id):
+    user_group = UserGroup.objects.filter(id=user_group_id)
+    cmds = []
+    if user_group:
+        user_group = user_group[0]
+        cmd_groups = []
+        for perm in user_group.sudoperm_set.all():
+            cmd_groups.extend(perm.cmd_group.all())
+
+        for cmd_group in cmd_groups:
+            cmds.extend(cmd_group.cmd.split(','))
+        return len(set(cmds))
+    else:
+        return 0
+
+
+@register.filter(name='sudo_cmd_ids')
+def sudo_cmd_ids(user_group_id):
+    user_group = UserGroup.objects.filter(id=user_group_id)
+    if user_group:
+        user_group = user_group[0]
+        cmd_groups = []
+        for perm in user_group.sudoperm_set.all():
+            cmd_groups.extend(perm.cmd_group.all())
+        cmd_ids = [str(cmd_group.id) for cmd_group in cmd_groups]
+        return ','.join(cmd_ids)
+    else:
+        return '0'
+
+
diff --git a/jumpserver/views.py b/jumpserver/views.py
index 609be01ab..ec012bcb6 100644
--- a/jumpserver/views.py
+++ b/jumpserver/views.py
@@ -50,7 +50,7 @@ def index_cu(request):
         user = user[0]
     login_types = {'L': 'LDAP', 'M': 'MAP'}
     user_id = request.session.get('user_id')
-    username = User.objects.get(id=user_id).name
+    username = User.objects.get(id=user_id).username
     posts = user_perm_asset_api(username)
     host_count = len(posts)
     new_posts = []
@@ -248,11 +248,12 @@ def login(request):
     else:
         username = request.POST.get('username')
         password = request.POST.get('password')
-        user = User.objects.filter(username=username)
-        if user:
-            user = user[0]
+        user_filter = User.objects.filter(username=username)
+        if user_filter:
+            user = user_filter[0]
             if md5_crypt(password) == user.password:
                 request.session['user_id'] = user.id
+                user_filter.update(last_login=datetime.datetime.now())
                 if user.role == 'SU':
                     request.session['role_id'] = 2
                 elif user.role == 'DA':
diff --git a/juser/views.py b/juser/views.py
index ad3bf4405..c470013b1 100644
--- a/juser/views.py
+++ b/juser/views.py
@@ -68,9 +68,11 @@ def db_add_user(**kwargs):
             group = UserGroup.objects.filter(id=group_id)
             group_select.extend(group)
         user.group = group_select
+    return user
 
 
 def db_update_user(**kwargs):
+    print kwargs
     groups_post = kwargs.pop('groups')
     user_id = kwargs.pop('user_id')
     user = User.objects.filter(id=user_id)
@@ -152,18 +154,8 @@ def ldap_add_user(username, ldap_pwd):
                   '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.add(user_dn, user_attr)
     ldap_conn.add(group_dn, group_attr)
-    # ldap_conn.add(sudo_dn, sudo_attr)
 
 
 def ldap_del_user(username):
@@ -354,11 +346,16 @@ def group_add(request):
                 error = u'组名 或 部门 不能为空'
                 raise AddError(error)
 
+            if UserGroup.objects.filter(name=group_name):
+                error = u'组名已存在'
+                raise AddError(error)
+
             dept = DEPT.objects.filter(id=dept_id)
             if dept:
                 dept = dept[0]
             else:
-                AddError(u'部门不存在')
+                error = u'部门不存在'
+                raise AddError(error)
 
             db_add_group(name=group_name, users=users_selected, dept=dept, comment=comment)
         except AddError:
@@ -596,13 +593,13 @@ def user_add(request):
 
     if request.method == 'POST':
         username = request.POST.get('username', '')
-        password = request.POST.get('password', '')
+        password = gen_rand_pwd(16)
         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', '')
+        ssh_key_pwd = gen_rand_pwd(16)
         is_active = True if request.POST.get('is_active', '1') == '1' else False
         ldap_pwd = gen_rand_pwd(16)
 
@@ -626,19 +623,30 @@ def user_add(request):
             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())
+                user = db_add_user(username=username,
+                                   password=md5_crypt(password),
+                                   name=name, email=email, dept=dept,
+                                   groups=groups, role=role_post,
+                                   ssh_key_pwd=md5_crypt(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
+                mail_title = u'恭喜你的跳板机用户添加成功 Jumpserver'
+                mail_msg = """
+                Hi, %s
+                    您的用户名: %s
+                    您的部门: %s
+                    您的角色: %s
+                    您的web登录密码: %s
+                    您的ssh登录密码: %s
+                    密钥下载地址: http://%s:%s/juser/down_key/?id=%s
+                    说明: 请登陆后再下载密钥!
+                """ % (name, username, dept.name, user_role.get(role_post, ''),
+                       password, ssh_key_pwd, SEND_IP, SEND_PORT, user.id)
 
             except Exception, e:
                 error = u'添加用户 %s 失败 %s ' % (username, e)
@@ -649,6 +657,9 @@ def user_add(request):
                         ldap_del_user(username)
                 except Exception:
                     pass
+            else:
+                send_mail(mail_title, mail_msg, MAIL_FROM, [email], fail_silently=False)
+                msg = u'添加用户 %s 成功! 用户密码已发送到 %s 邮箱!' % (username, email)
     return render_to_response('juser/user_add.html', locals(), context_instance=RequestContext(request))
 
 
@@ -662,11 +673,11 @@ def user_add_adm(request):
 
     if request.method == 'POST':
         username = request.POST.get('username', '')
-        password = request.POST.get('password', '')
+        password = gen_rand_pwd(16)
         name = request.POST.get('name', '')
         email = request.POST.get('email', '')
         groups = request.POST.getlist('groups', [])
-        ssh_key_pwd = request.POST.get('ssh_key_pwd', '')
+        ssh_key_pwd = gen_rand_pwd(16)
         is_active = True if request.POST.get('is_active', '1') == '1' else False
         ldap_pwd = gen_rand_pwd(16)
 
@@ -687,7 +698,7 @@ def user_add_adm(request):
                             password=md5_crypt(password),
                             name=name, email=email, dept=dept,
                             groups=groups, role='CU',
-                            ssh_key_pwd=CRYPTOR.encrypt(ssh_key_pwd),
+                            ssh_key_pwd=md5_crypt(ssh_key_pwd),
                             ldap_pwd=CRYPTOR.encrypt(ldap_pwd),
                             is_active=is_active,
                             date_joined=datetime.datetime.now())
@@ -695,7 +706,6 @@ def user_add_adm(request):
                 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)
@@ -706,6 +716,23 @@ def user_add_adm(request):
                         ldap_del_user(username)
                 except Exception:
                     pass
+            else:
+                mail_title = u'恭喜你的跳板机用户添加成功 Jumpserver'
+                mail_msg = """
+                Hi, %s
+                    您的用户名: %s
+                    您的部门: %s
+                    您的角色: %s
+                    您的web登录密码: %s
+                    您的ssh登录密码: %s
+                    密钥下载地址: http://%s:%s/juser/down_key/?id=%s
+                    说明: 请登陆后再下载密钥!
+                """ % (name, username, dept.name, '普通用户',
+                       password, ssh_key_pwd, SEND_IP, SEND_PORT, user.id)
+                print MAIL_FROM
+                send_mail(mail_title, mail_msg, MAIL_FROM, [email], fail_silently=False)
+                msg = u'添加用户 %s 成功! 用户密码已发送到 %s 邮箱!' % (username, email)
+
     return render_to_response('juser/user_add.html', locals(), context_instance=RequestContext(request))
 
 
@@ -843,7 +870,7 @@ def user_edit(request):
             groups_str = ' '.join([str(group.id) for group in user.group.all()])
 
     else:
-        user_id = request.GET.get('user_id', '')
+        user_id = request.POST.get('user_id', '')
         password = request.POST.get('password', '')
         name = request.POST.get('name', '')
         email = request.POST.get('email', '')
@@ -858,7 +885,7 @@ def user_edit(request):
         if dept:
             dept = dept[0]
         else:
-            dept = DEPT.objects.get(id='1')
+            dept = DEPT.objects.get(id='2')
 
         if user_id:
             user = User.objects.filter(id=user_id)
diff --git a/log_handler.py b/log_handler.py
index f64445cd4..a3942a288 100755
--- a/log_handler.py
+++ b/log_handler.py
@@ -1,5 +1,5 @@
 #!/usr/bin/python
-#coding: utf-8
+# coding: utf-8
 
 import os
 import re
diff --git a/service.sh b/service.sh
new file mode 100644
index 000000000..fbac87af4
--- /dev/null
+++ b/service.sh
@@ -0,0 +1,24 @@
+#!/bin/bash
+# Date: 2015-04-12
+# Version: 2.0.0
+# Site: http://www.jumpserver.org
+# Author: jumpserver group
+
+. /etc/init.d/functions
+export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/node/bin
+
+base_dir=$(dirname $0)
+
+case $1 in
+start)
+    daemon $base_dir/manage.py runserver 0.0.0.0:80 &
+    daemon $base_dir/log_handler.py &
+    cd $base_dir/websocket/; daemon node index.js &
+    ;;
+
+stop)
+    pkill -15 python
+    pkill -15 node
+    ;;
+
+esac
diff --git a/static/js/base.js b/static/js/base.js
index 4b0adfe76..6a88472bc 100644
--- a/static/js/base.js
+++ b/static/js/base.js
@@ -59,10 +59,13 @@ function GetTableDataBox() {
     return returnData;
 }
 
-function move(from, to) {
+function move(from, to, from_o, to_o) {
     $("#" + from + " option").each(function () {
         if ($(this).prop("selected") == true) {
             $("#" + to).append(this);
+            if( typeof from_o !== 'undefined'){
+                $("#"+to_o).append($("#"+from_o +" option[value='"+this.value+"']"));
+            }
         }
     });
 }
@@ -76,12 +79,12 @@ function move_left(from, to) {
     });
 }
 
-function move_all(from, to) {
-    $("#" + from).children().each(function () {
-        $("#" + to).append(this);
-    });
-}
-
+//function move_all(from, to) {
+//    $("#" + from).children().each(function () {
+//        $("#" + to).append(this);
+//    });
+//}
+//
 
 function selectAll(){
          var checklist = document.getElementsByName ("selected");
@@ -100,12 +103,12 @@ function selectAll(){
 
         }
 
-
-function move_all(from, to){
-    $("#"+from).children().each(function(){
-        $("#"+to).append(this);
-    });
-}
+//
+//function move_all(from, to){
+//    $("#"+from).children().each(function(){
+//        $("#"+to).append(this);
+//    });
+//}
 
 //function commit_select(form_array){
 //    $('#{0} option'.format(form_array)).each(function(){
diff --git a/templates/jperm/dept_perm_edit.html b/templates/jperm/dept_perm_edit.html
index 10c2d7fae..7d9c8247f 100644
--- a/templates/jperm/dept_perm_edit.html
+++ b/templates/jperm/dept_perm_edit.html
@@ -16,8 +16,6 @@ function search_ip(text, noselect, total){
         })
 }
 
-
-
 </script>
 
 <div class="wrapper wrapper-content animated fadeInRight">
@@ -103,8 +101,8 @@ function search_ip(text, noselect, total){
 
                                 <div class="col-sm-1">
                                     <div class="btn-group" style="margin-top: 60px;">
-                                        <button type="button" class="btn btn-white" onclick="move('assets', 'asset_select'  )"><i class="fa fa-chevron-right"></i></button>
-                                        <button type="button" class="btn btn-white" onclick="move('asset_select', 'assets')"><i class="fa fa-chevron-left"></i> </button>
+                                        <button type="button" class="btn btn-white" onclick="move('assets', 'asset_select', 'assets_total', 'asset_select_total'  )"><i class="fa fa-chevron-right"></i></button>
+                                        <button type="button" class="btn btn-white" onclick="move('asset_select', 'assets', 'asset_select_total', 'assets_total')"><i class="fa fa-chevron-left"></i> </button>
                                     </div>
                                 </div>
 
@@ -118,8 +116,6 @@ function search_ip(text, noselect, total){
                                     </div>
                                 </div>
                             </div>
-
-
                         </div>
 
                         <div class="row">
@@ -172,14 +168,11 @@ $('#sudoPerm').validator({
 
 $(document).ready(function(){
     $("#submit_button").click(function(){
-        $('#users_selected option').each(function(){
+        $('#sudoPerm option').each(function(){
             $(this).prop('selected', true)
         })
     });
 
-
-
-
 })
 </script>
 
diff --git a/templates/jperm/sudo_cmd_add.html b/templates/jperm/sudo_cmd_add.html
index 603600201..9f9e8990e 100644
--- a/templates/jperm/sudo_cmd_add.html
+++ b/templates/jperm/sudo_cmd_add.html
@@ -63,7 +63,12 @@
                                 <div class="col-sm-8">
                                     <select id="dept_id" name="dept_id" class="form-control m-b">
                                         {% for dept in dept_all %}
-                                            <option value="{{ dept.id }}" selected>{{ dept.name }}</option>
+                                            {% ifequal dept_id dept.id %}
+                                                <option value="{{ dept.id }}" selected>{{ dept.name }}</option>
+                                            {% else %}
+                                                <option value="{{ dept.id }}">{{ dept.name }}</option>
+                                            {% endifequal %}
+
                                         {% endfor %}
                                     </select>
                                 </div>
diff --git a/templates/jperm/sudo_cmd_detail.html b/templates/jperm/sudo_cmd_detail.html
index 215961585..26a7b8e72 100644
--- a/templates/jperm/sudo_cmd_detail.html
+++ b/templates/jperm/sudo_cmd_detail.html
@@ -14,10 +14,13 @@
     <body>
         <div class="row">
             <div class="contact-box">
+                {% if cmd_group_name %}
                 <h2 class="text-center">{{ cmd_group.name }} 命令详情</h2>
+                {% endif %}
                 <div class="ibox-content">
 
                     <table class="table table-striped table-bordered table-hover " id="editable" >
+                        {% if cmd_group_name %}
                         <thead>
                             <tr>
                                 <td class="text-center" width="120">ID</td>
@@ -31,10 +34,11 @@
                             <td class="text-center">{{ cmd_group.name }}</td>
                             <td class="text-center">{{ cmd_group.dept.name }}</td>
                         </tr>
+                        {% endif %}
                         <tr>
                             <td colspan="1" class="text-center">命令:</td>
                             <td colspan="6" class="text-center">
-                                    <b>{{ cmd_group.cmd }}</b>
+                                    <b>{{ cmds_str }}</b>
                             </td>
                         </tr>
                     </table>
diff --git a/templates/jperm/sudo_cmd_list.html b/templates/jperm/sudo_cmd_list.html
index 73e8b77de..f7c2d9652 100644
--- a/templates/jperm/sudo_cmd_list.html
+++ b/templates/jperm/sudo_cmd_list.html
@@ -49,6 +49,7 @@
                             <tr>
                                 <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>
                             </tr>
@@ -58,9 +59,10 @@
                             <tr class="gradeX">
                                 <td class="text-center"> {{ group.name }} </td>
                                 <td class="text-center" title="{{ group.cmd }}"> {{ group.cmd | string_length:50 }} </td>
+                                <td class="text-center"> {{ group.dept.name }} </td>
                                 <td class="text-center"> {{ group.comment }} </td>
                                 <td class="text-center">
-{#                                    <a href="../cmd_detail/?id={{ group.id }}" class="btn btn-xs btn-info">详情</a>#}
+                                    <a value="../cmd_detail/?id={{ group.id }}" class="btn btn-xs btn-primary iframe">详情</a>
                                     <a href="../cmd_edit/?id={{ group.id }}" class="btn btn-xs btn-info">编辑</a>
                                     <a href="../cmd_del/?id={{ group.id }}" class="btn btn-xs btn-danger">删除</a>
                                 </td>
@@ -117,8 +119,21 @@
 </div>
 
 <script>
-    $(document).ready(function(){
-        $(".iframe").colorbox({iframe:true, width:"70%", height:"70%"});
+    $(document).ready(function() {
+        $(".iframe").on('click', function () {
+            var url = $(this).attr("value");
+            $.layer({
+                type: 2,
+                title: '命令详情',
+                maxmin: true,
+                shift: 'top',
+                border: [2, 0.3, '#1AB394'],
+                shade: [0.5, '#000000'],
+                shadeClose: true,
+                area: ['800px', '600px'],
+                iframe: {src: url}
+            });
+        });
     });
 </script>
 
diff --git a/templates/jperm/sudo_list.html b/templates/jperm/sudo_list.html
index 6dde473a7..9335119a1 100644
--- a/templates/jperm/sudo_list.html
+++ b/templates/jperm/sudo_list.html
@@ -67,9 +67,9 @@
                                                 <td class="text-center"> {{ group.name }} </td>
                                                 <td class="text-center"> {{ group.dept.name }} </td>
                                                 <td class="text-center"><a href="/juser/user_list/?gid={{ group.id }}">{{ group.id | member_count }} </a> </td>
-                                                <td class="text-center"><a href="/jasset/group_list/?sid={{ group.id }}">{{ group.id | ugrp_perm_agrp_count }} </a> </td>
-                                                <td class="text-center"><a href="/jasset/host_list/?sid={{ group.id }}"> {{ group.id | ugrp_perm_asset_count }} </a> </td>
-                                                <td class="text-center"><a value="/jperm/cmd_detail/?id={{ group.id }}"  class="iframe">{{ group.id | sudo_cmd_count }}</a> </td>
+                                                <td class="text-center"><a href="/jasset/group_list/?sid={{ group.id }}">{{ group.id | ugrp_sudo_agrp_count }} </a> </td>
+                                                <td class="text-center"><a href="/jasset/host_list/?sid={{ group.id }}"> {{ group.id | ugrp_sudo_asset_count }} </a> </td>
+                                                <td class="text-center"><a value="/jperm/cmd_detail/?id={{ group.id | sudo_cmd_ids }}"  class="iframe">{{ group.id | sudo_cmd_count }}</a> </td>
                                                 <td class="text-center"> {{ group.comment }} </td>
                                                 <td class="text-center">
                                                     <a href="../sudo_edit/?id={{ group.id }}" class="btn btn-xs btn-danger">sudo授权</a>
diff --git a/templates/juser/user_add.html b/templates/juser/user_add.html
index be832e2f1..2a097fae8 100644
--- a/templates/juser/user_add.html
+++ b/templates/juser/user_add.html
@@ -42,26 +42,26 @@
                                     <input id="username" name="username" placeholder="Username" type="text" class="form-control" {% if error %}value="{{ username }}" {% endif %}>
                                 </div>
                             </div>
-                            <div class="hr-line-dashed"></div>
-                            <div class="form-group">
-                                <label for="password" class="col-sm-2 control-label">密码<span class="red-fonts">*</span></label>
-                                <div class="col-sm-8">
-                                    <input id="password" name="password" placeholder="Password" type="password" class="form-control" {% if error %}value="{{ password }}" {% endif %}>
-                                    <span class="help-block m-b-none">
-                                        登陆web的密码
-                                    </span>
-                                </div>
-                            </div>
-                            <div class="hr-line-dashed"></div>
-                            <div class="form-group">
-                                <label for="ssh_key_pwd" class="col-sm-2 control-label">密钥密码<span class="red-fonts">*</span></label>
-                                <div class="col-sm-8">
-                                    <input id="ssh_key_pwd" name="ssh_key_pwd" placeholder="SSH Key Password" type="password" class="form-control" {% if error %}value="{{ ssh_key_pwd }}" {% endif %}>
-                                    <span class="help-block m-b-none">
-                                        登陆 Jumpserver 使用的SSH密钥的密码
-                                    </span>
-                                </div>
-                            </div>
+{#                            <div class="hr-line-dashed"></div>#}
+{#                            <div class="form-group">#}
+{#                                <label for="password" class="col-sm-2 control-label">密码<span class="red-fonts">*</span></label>#}
+{#                                <div class="col-sm-8">#}
+{#                                    <input id="password" name="password" placeholder="Password" type="password" class="form-control" {% if error %}value="{{ password }}" {% endif %}>#}
+{#                                    <span class="help-block m-b-none">#}
+{#                                        登陆web的密码#}
+{#                                    </span>#}
+{#                                </div>#}
+{#                            </div>#}
+{#                            <div class="hr-line-dashed"></div>#}
+{#                            <div class="form-group">#}
+{#                                <label for="ssh_key_pwd" class="col-sm-2 control-label">密钥密码<span class="red-fonts">*</span></label>#}
+{#                                <div class="col-sm-8">#}
+{#                                    <input id="ssh_key_pwd" name="ssh_key_pwd" placeholder="SSH Key Password" type="password" class="form-control" {% if error %}value="{{ ssh_key_pwd }}" {% endif %}>#}
+{#                                    <span class="help-block m-b-none">#}
+{#                                        登陆 Jumpserver 使用的SSH密钥的密码#}
+{#                                    </span>#}
+{#                                </div>#}
+{#                            </div>#}
                             <div class="hr-line-dashed"></div>
                             <div class="form-group">
                                 <label for="name" class="col-sm-2 control-label">姓名<span class="red-fonts">*</span></label>
diff --git a/templates/login.html b/templates/login.html
index df3b35f2b..3eb83c4a3 100644
--- a/templates/login.html
+++ b/templates/login.html
@@ -14,6 +14,7 @@
     <link href="/static/css/animate.css" rel="stylesheet">
     <link href="/static/css/style.css" rel="stylesheet">
 
+
 </head>
 
 <body class="gray-bg">
diff --git a/templates/upload.html b/templates/upload.html
index c2a19ebcb..a235d11b2 100644
--- a/templates/upload.html
+++ b/templates/upload.html
@@ -56,7 +56,7 @@
             uploadMultiple: true,
             parallelUploads: 100,
             maxFiles: 100,
-            url: '/upload/',
+            url: '/file/upload/',
 
             // Dropzone settings
             init: function() {