Эх сурвалжийг харах

git-svn-id: svn+ssh://10.10.101.21/source/platform/platform-b2b@898 f3bf4e98-0cf0-11e4-a00c-a99a8b9d557d

administrator 11 жил өмнө
parent
commit
93fdee6595

+ 33 - 28
src/main/java/com/uas/platform/b2b/controller/UserController.java

@@ -11,6 +11,7 @@ import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.ModelMap;
 import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
@@ -93,34 +94,19 @@ public class UserController {
 		map.put("username", SystemSession.getUser().getUserName());
 		return new ResponseEntity<ModelMap>(map, headers, HttpStatus.OK);
 	}
-	
-	/**
-	 * 修改用户基本信息
-	 * @param email
-	 * @return
-	 */
-	@RequestMapping(value = "/saveUser", method = RequestMethod.POST)
-	public ResponseEntity<String> saveUser(@RequestBody String json, HttpServletRequest request) {
-		User user = FlexJsonUtils.fromJson(json, User.class);
-		user = userService.updateUserInfo(user);
-		if(user != null) {
-			logger.log("用户信息", "修改用户信息,UU:" + user.getUserUU());
-			request.getSession().setAttribute("user", user);
-		}
-		return new ResponseEntity<String>(HttpStatus.OK);
-	}
 
 	/**
 	 * 验证用户输入的密码是否正确
+	 * 
 	 * @param email
 	 * @return
 	 */
 	@RequestMapping(value = "/checkPassword", method = RequestMethod.GET)
 	public ResponseEntity<String> checkPassword(String password) {
 		User user = SystemSession.getUser();
-		if(!StringUtils.isEmpty(password)) {
+		if (!StringUtils.isEmpty(password)) {
 			boolean result = user.getUserPwd().equals(Md5Utils.encode(password, user.getUserUU()));
-			if(result) {
+			if (result) {
 				return new ResponseEntity<String>(HttpStatus.OK);
 			}
 			logger.log("用户信息", "验证用户密码,UU:" + user.getUserUU());
@@ -130,43 +116,62 @@ public class UserController {
 
 	/**
 	 * 修改用户密码
+	 * 
 	 * @param email
 	 * @return
 	 */
 	@RequestMapping(value = "/updatePassword", method = RequestMethod.POST)
 	public ResponseEntity<String> updatePassword(String password, String newPassword) {
 		User user = SystemSession.getUser();
-		if(!StringUtils.isEmpty(newPassword)) {
+		if (!StringUtils.isEmpty(newPassword)) {
 			userService.updatePassword(user, password, newPassword);
 			logger.log("用户信息", "修改用户密码,UU:" + user.getUserUU());
 			return new ResponseEntity<String>(HttpStatus.OK);
-		}else 
+		} else
 			throw new IllegalOperatorException("新密码不能为空");
 	}
-	
+
 	/**
 	 * 新增用户
-	 * @param 
+	 * 
+	 * @param
 	 * @return
 	 */
-	@RequestMapping(value = "/addUser", method = RequestMethod.POST)
+	@RequestMapping(method = RequestMethod.POST)
 	public ResponseEntity<String> addUser(@RequestBody String json, HttpServletRequest request) {
 		User user = FlexJsonUtils.fromJson(json, User.class);
 		user = userService.addUser(user, request);
-		if(user != null) {
+		if (user != null) {
 			logger.log("用户信息", "新增用户,姓名:" + user.getUserName());
 		}
 		return new ResponseEntity<String>(HttpStatus.OK);
 	}
-	
+
+	/**
+	 * 修改用户基本信息
+	 * 
+	 * @return
+	 */
+	@RequestMapping(method = RequestMethod.PUT)
+	public ResponseEntity<String> saveUser(@RequestBody String json, HttpServletRequest request) {
+		User user = FlexJsonUtils.fromJson(json, User.class);
+		user = userService.updateUserInfo(user);
+		if (user != null) {
+			logger.log("用户信息", "修改用户信息,UU:" + user.getUserUU());
+			if (SystemSession.getUser().getUserUU() == user.getUserUU())
+				request.getSession().setAttribute("user", user);
+		}
+		return new ResponseEntity<String>(HttpStatus.OK);
+	}
 
 	/**
 	 * 删除用户
-	 * @param 
+	 * 
+	 * @param
 	 * @return
 	 */
-	@RequestMapping(value = "/removeUser", method = RequestMethod.GET)
-	public ResponseEntity<String> removeUser(Long uu, HttpServletRequest request) {
+	@RequestMapping(value = "/{uu}", method = RequestMethod.DELETE)
+	public ResponseEntity<String> removeUser(@PathVariable("uu") Long uu) {
 		userService.removeUser(uu);
 		logger.log("用户信息", "删除用户,UU:" + uu);
 		return new ResponseEntity<String>(HttpStatus.OK);

+ 1 - 1
src/main/java/com/uas/platform/b2b/model/User.java

@@ -103,7 +103,7 @@ public class User implements Serializable {
 	@ManyToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE }, fetch = FetchType.EAGER)
 	@JoinTable(name = "sec$userrole", joinColumns = @JoinColumn(name = "user_uu", referencedColumnName = "user_uu"), inverseJoinColumns = @JoinColumn(name = "role_id", referencedColumnName = "role_id"))
 	@OrderBy("id")
-	@Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
+	@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
 	private Set<Role> roles;
 	
 	/**

+ 24 - 15
src/main/java/com/uas/platform/b2b/service/impl/UserServiceImpl.java

@@ -86,16 +86,16 @@ public class UserServiceImpl implements UserService {
 	@Override
 	public User updateUserInfo(User user) {
 		User newUser = userDao.findOne(user.getUserUU());
-		if(newUser != null) {
-			if(!newUser.getUserTel().equals(user.getUserTel().trim())) {//修改了用户手机号
+		if (newUser != null) {
+			if (!newUser.getUserTel().equals(user.getUserTel().trim())) {// 修改了用户手机号
 				List<User> users = userDao.findUserByUserTel(user.getUserTel().trim());
-				if(users.size() > 0) {
+				if (users.size() > 0) {
 					throw new IllegalOperatorException("电话号码重复,建议输入您自己的手机号");
 				}
 			}
-			if(!newUser.getUserTel().equals(user.getUserTel().trim())) {//修改了用户邮箱地址
+			if (!newUser.getUserTel().equals(user.getUserTel().trim())) {// 修改了用户邮箱地址
 				List<User> users = userDao.findUserByUserEmail(user.getUserEmail().trim());
-				if(users.size() > 0) {
+				if (users.size() > 0) {
 					throw new IllegalOperatorException("邮箱地址重复,建议输入您自己的电子邮箱地址");
 				}
 			}
@@ -104,19 +104,21 @@ public class UserServiceImpl implements UserService {
 			newUser.setUserTel(user.getUserTel().trim());
 			newUser.setUserSex(user.getUserSex());
 			newUser.setUserIdcode(user.getUserIdcode());
+			newUser.setRoles(user.getRoles());
 			newUser = userDao.save(newUser);
 			newUser.setEnterprise(SystemSession.getUser().getEnterprise());
-			SystemSession.setUser(newUser);
+			if (SystemSession.getUser().getUserUU() == newUser.getUserUU())
+				SystemSession.setUser(newUser);
 			return newUser;
 		} else {
 			throw new IllegalOperatorException("修改的用户不存在");
 		}
 	}
-	
+
 	@Override
 	public User updatePassword(User user, String password, String newPassword) {
 		boolean result = user.getUserPwd().equals(Md5Utils.encode(password, user.getUserUU()));
-		if(result) {
+		if (result) {
 			User user1 = userDao.findOne(user.getUserUU());
 			user1.setUserPwd(Md5Utils.encode(newPassword, user1.getUserUU()));
 			userDao.save(user1);
@@ -129,11 +131,11 @@ public class UserServiceImpl implements UserService {
 	@Override
 	public User addUser(User user, HttpServletRequest request) {
 		List<User> users = userDao.findUserByUserTel(user.getUserTel().trim());
-		if(users.size() > 0) {
+		if (users.size() > 0) {
 			throw new IllegalOperatorException("电话号码重复,建议输入您自己的手机号");
 		}
 		List<User> users2 = userDao.findUserByUserEmail(user.getUserEmail().trim());
-		if(users2.size() > 0) {
+		if (users2.size() > 0) {
 			throw new IllegalOperatorException("邮箱地址重复,建议输入您自己的电子邮箱地址");
 		}
 		user.setUserUU(null);
@@ -153,19 +155,26 @@ public class UserServiceImpl implements UserService {
 		model.put("dateTime", timeFormat.format(new Date()));
 		model.put("userTel", user.getUserTel());
 		model.put("rootpath", AgentUtils.getHost(request));
-		sendMailService.sendTemplateMail(user.getUserEmail(),
-				"欢迎使用UAS管理平台", model, "velocity/newUser.vm");
+		sendMailService.sendTemplateMail(user.getUserEmail(), "欢迎使用UAS管理平台", model, "velocity/newUser.vm");
 		return user;
 	}
 
 	@Override
 	public void removeUser(Long uu) {
 		User user = userDao.findOne(uu);
-		if(user != null) {
-			if(user.getEnterprises().contains(SystemSession.getUser().getEnterprise())) {
+		if (user != null) {
+			if (user.getEnterprises().contains(SystemSession.getUser().getEnterprise())) {
 				user.removeEnterprise(SystemSession.getUser().getEnterprise());
-				if(user.getEnterprises().size() == 0) user.setEnable((short) Status.DISABLED.value());
+				if (user.getEnterprises().size() == 0)
+					user.setEnable((short) Status.DISABLED.value());
 				userDao.save(user);
+				if (user.getEnterprises().size() == 0) {
+					try {
+						userDao.delete(user);
+					} catch (Exception e) {
+						// 尝试删除,存在关联的单据则不删
+					}
+				}
 			} else {
 				throw new IllegalArgumentException();
 			}

+ 92 - 0
src/main/webapp/resources/css/index.css

@@ -1201,6 +1201,39 @@ a.none:hover {
   	border: 1px solid #8a6d3b;
 }
 
+.row-operator {
+	position: relative;
+}
+
+.row-operator>.operator-menu {
+	position: absolute;
+	width: 140px;
+	height: 0;
+	line-height: 30px;
+	padding: 0 10px;
+	top: 0;
+	left: 100%;
+	background-color: #333;
+	border-radius: 0 3px 3px 0;
+	opacity: 0;
+}
+
+.row-operator>.operator-menu a {
+	color: #fff;
+}
+
+.row-operator>.operator-menu a:hover {
+	color: #56a022;
+}
+
+.row-operator:hover>.operator-menu {
+	height: 30px;
+	opacity: .75;
+	-webkit-transition: all 0.25s ease-in-out;
+	-moz-transition: all 0.25s ease-in-out;
+	transition: all 0.25s ease-in-out;
+}
+
 .resource-container,.role-container {
 	padding: 15px;
 	min-height: 645px;
@@ -1286,6 +1319,65 @@ a.none:hover {
 	margin-left: 150px;
 }
 
+.userrole-list {
+	width: 576px;
+	font-size: 12px;
+	max-height: 500px;
+}
+
+.userrole-list:before,.userrole-list:after {
+	display: table;
+	content: " ";
+	clear: both;
+}
+
+.userrole-list>.item {
+	float: left;
+	width: 192px;
+	height: 120px;
+	padding: 5px 10px;
+	border: 2px dashed;
+	border-color: #fff #ededed #ededed #fff;
+	position: relative;
+}
+
+.userrole-list>.item.checked {
+	border-color: #ff7300;
+}
+
+.userrole-list>.item>.icon{
+  	float: left;
+  	width: 60px;
+  	height: 60px;
+  	line-height: 60px;
+  	text-align: center;
+  	color: #56a022;
+  	font-size: 36px;
+  	border-radius: 50%;
+ 	-webkit-box-shadow: inset 0 0 1px rgba(0, 0, 0, 0.03);
+  	box-shadow: inset 0 0 1px rgba(0, 0, 0, 0.03);
+  	background-color: #f3f3f4;
+}
+
+.userrole-list>.item>.desc {
+	margin-left: 90px;
+	text-overflow: ellipsis;
+}
+
+.userrole-list>.item:hover>.icon {
+	background-color: #fff1d0;
+}
+
+.userrole-list>.item.checked>.checker {
+	position: absolute;
+	left: -2px;
+	top: -2px;
+	width: 0;
+	height: 0;
+	border: 8px solid;
+	border-color: #ff7300 #fff #fff #ff7300;
+}
+
 .choose-inline {
 	display: table;
 	width: 100%;

+ 100 - 33
src/main/webapp/resources/js/index/app.js

@@ -945,7 +945,6 @@ define([ 'toaster', 'charts', 'ngTable', 'common/services', 'service/Purc', 'ser
 				angular.forEach(inquiry.attachs, function(attach){
 					attach.type = attach.name.substr(attach.name.lastIndexOf('.')+1);
 				});
-				console.log(inquiry);
 				$scope.inquiry = inquiry;
 			});
 		};
@@ -1976,7 +1975,7 @@ define([ 'toaster', 'charts', 'ngTable', 'common/services', 'service/Purc', 'ser
 		});
 	});
 	
-	app.controller('UserCtrl', function($scope, $filter, AuthenticationService, AccountUser, BaseService, ngTableParams, toaster, $modal, $http){
+	app.controller('UserCtrl', function($scope, $filter, AuthenticationService, AccountUser, BaseService, ngTableParams, toaster, $modal, $http, ngAlert){
 		$scope.editing = false;
 		$scope.loading = true;
 		AuthenticationService.getAuthentication().success(function(data) {
@@ -2001,23 +2000,23 @@ define([ 'toaster', 'charts', 'ngTable', 'common/services', 'service/Purc', 'ser
 	            $defer.resolve($scope.users);
 			}
 		});
-		AccountUser.getAll({}, function(data){
-			users = data;
-			$scope.tableParams.reload();
-			$scope.loading = false;
-		});
+		var loadUsers = function() {
+			AccountUser.query({}, function(data){
+				users = data;
+				$scope.tableParams.reload();
+				$scope.loading = false;
+			});
+		};
+		loadUsers();
 		$scope.saveUser = function(){
 			$scope.loading = true;
-			AccountUser.saveUser({}, $scope.user, function(data){
+			AccountUser.update({}, $scope.user, function(data){
 				$scope.loading = false;
 				toaster.pop('success', '提示', '修改用户信息成功');
 				AuthenticationService.getAuthentication().success(function(data) {
 					$scope.user = data;
 				});
-				AccountUser.getAll({}, function(data){
-					users = data;
-					$scope.tableParams.reload();
-				});
+				loadUsers();
 				$scope.editing = false;
 			}, function(reponse){
 				$scope.loading = false;
@@ -2047,14 +2046,10 @@ define([ 'toaster', 'charts', 'ngTable', 'common/services', 'service/Purc', 'ser
 		 */
 		$scope.addUser = function() {
 			$scope.adding = true;
-			console.log($scope.newUser);
-			AccountUser.add({}, $scope.newUser, function(){
+			AccountUser.save({}, $scope.newUser, function(){
 				toaster.pop('success', '提示', '增加用户成功:' + $scope.newUser.userName);
 				$scope.newUser = {userSex: 'M'};
-				AccountUser.getAll({}, function(data){
-					users = data;
-					$scope.tableParams.reload();
-				});
+				loadUsers();
 				$scope.adding = false;
 				$scope.newUserForm.newUserTel.$setValidity('available', false);
 				$scope.newUserForm.newUserEmail.$setValidity('available', false);
@@ -2071,7 +2066,6 @@ define([ 'toaster', 'charts', 'ngTable', 'common/services', 'service/Purc', 'ser
 		 * 验证手机号是否可用
 		 */
 		$scope.telValid = function(tel) {
-			console.log($scope.newUser);
 			if(tel) {
 				$http.get('account/user/telEnable', {
 					params: {
@@ -2131,18 +2125,93 @@ define([ 'toaster', 'charts', 'ngTable', 'common/services', 'service/Purc', 'ser
 		/**
 		 * 删除用户
 		 */
-		$scope.removeUser = function(uu) {
-			AccountUser.remove({uu: uu}, function(){
-				toaster.pop('success', '提示', '删除用户成功。');
-				AccountUser.getAll({}, function(data){
-					users = data;
-					$scope.tableParams.reload();
-				});
+		$scope.removeUser = function(user) {
+			new ngAlert({
+				title: '提示',
+				content: '确定删除用户(' + user.userName + ')吗?'
 			}, function(){
-				toaster.pop('error', '提示', '删除用户失败。');
+				AccountUser.remove({uu: user.userUU}, function(){
+					toaster.pop('success', '提示', '用户删除成功。');
+					loadUsers();
+				}, function(response){
+					toaster.pop('error', '删除失败', response.data);
+				});
 			});
 		};
-		
+		// 编辑用户的角色
+		$scope.editUserRole = function(user) {
+			var modalInstance = $modal.open({
+				animation: true,
+				templateUrl: 'static/tpl/index/account/user_role.html',
+				controller: 'UserRoleCtrl',
+				resolve: {
+					user: function() {
+						return user;
+					}
+				}
+			});
+			modalInstance.result.then(function(changed, checked){
+				if(changed) {
+					if(checked)
+						$scope.newUser.roles = checked;
+					else 
+						loadUsers();
+				}
+			});
+		};
+	});
+	
+	app.controller('UserRoleCtrl', function($scope, $modalInstance, user, AccountRole, AccountUser, toaster){
+		$scope.checked = [];
+		$scope.master = [];
+		AccountRole.query({}, function(data){
+			if(user && data) {
+				var rs = [], checked = [];
+				angular.forEach(user.roles, function(r){
+					rs.push(r.id);
+				});
+				angular.forEach(data, function(d){
+					if(rs.indexOf(d.id) > -1) {
+						d.$checked = true;
+						checked.push(d);
+					}
+				});
+			}
+			$scope.roles = data;
+			$scope.checked = checked;
+			$scope.master = angular.copy($scope.checked);
+		});
+		$scope.select = function(role) {
+			role.$checked = !role.$checked;
+			if(role.$checked) {
+				$scope.checked.push(role);
+			} else {
+				angular.forEach($scope.checked, function(c, i){
+					if(c.id == role.id)
+						$scope.checked.splice(i, 1);
+				});
+			}
+		};
+		$scope.isChanged = function() {
+			return !angular.equals($scope.master, $scope.checked);
+		};
+		$scope.close = function(save) {
+			if(save) {
+				if(user.userUU) {
+					user.roles = $scope.checked;
+					AccountUser.update({}, user, function(){
+						toaster.pop('success', '提示', '保存成功');
+						$modalInstance.close(true);
+					}, function(response){
+						toaster.pop('error', '保存失败', response.data);
+					});
+				} else {
+					$modalInstance.close(true, $scope.checked);
+				}
+			} else {
+				$modalInstance.close(false);
+			}
+		};
 	});
 	
 	app.controller('PasswordCtrl', function($scope, $modalInstance, user, AccountUser, toaster){
@@ -2166,8 +2235,6 @@ define([ 'toaster', 'charts', 'ngTable', 'common/services', 'service/Purc', 'ser
 		
 		//修改密码
 		$scope.ok = function () {
-			console.log($scope.user.newPassword);
-			console.log($scope.user.newPassword1);
 			if($scope.user.newPassword == $scope.user.newPassword1) {//验证重复密码相等
 				AccountUser.updatePassword({password: $scope.user.password, newPassword: $scope.user.newPassword}, {}, function(data){
 					toaster.pop('success', '成功', '修改密码成功,请牢记您的新密码。');
@@ -2234,7 +2301,7 @@ define([ 'toaster', 'charts', 'ngTable', 'common/services', 'service/Purc', 'ser
 	});
 	
 	app.controller('ResourceCtrl', function($scope, AccountResource){
-		AccountResource.getAll({}, function(data){
+		AccountResource.query({}, function(data){
 			if(data && data.length > 0) {
 				data[0].$open = true;
 			}
@@ -2245,7 +2312,7 @@ define([ 'toaster', 'charts', 'ngTable', 'common/services', 'service/Purc', 'ser
 	app.controller('RoleCtrl', function($scope, $modal, AccountRole){
 		$scope.roles = {};
 		var getData = function() {
-			AccountRole.getAll({}, function(data){
+			AccountRole.query({}, function(data){
 				var defaults = [], custom = [];
 				angular.forEach(data, function(d){
 					if(d.isdefault == 1)
@@ -2281,7 +2348,7 @@ define([ 'toaster', 'charts', 'ngTable', 'common/services', 'service/Purc', 'ser
 		$scope.cancel = function() {
 			$modalInstance.close(false);
 		};
-		AccountResource.getAll({}, function(data){
+		AccountResource.query({}, function(data){
 			if(data && data.length > 0) {
 				if(role && role.resourceItems) {
 					var rs = [];// 已分配的资源的id

+ 5 - 25
src/main/webapp/resources/js/index/services/Account.js

@@ -7,13 +7,9 @@ define([ 'ngResource' ], function() {
 			}
 		});
 	}).factory('AccountUser', function($resource) {
-		return $resource('account/user', {}, {
-			getAll: {
-				isArray: true
-			},
-			saveUser: {
-				url: 'account/user/saveUser',
-				method: 'POST'
+		return $resource('account/user/:uu', {}, {
+			update: {
+				method: 'PUT'
 			},
 			checkPassword: {
 				url: 'account/user/checkPassword',
@@ -30,14 +26,6 @@ define([ 'ngResource' ], function() {
 			emailEnable: {
 				url: 'account/user/emailEnable',
 				method: 'GET'
-			},
-			add: {
-				url: 'account/user/addUser',
-				method: 'POST'
-			},
-			remove: {
-				url: 'account/user/removeUser',
-				method: 'GET'
 			}
 		});
 	}).factory('ErpLog', function($resource) {
@@ -45,16 +33,8 @@ define([ 'ngResource' ], function() {
 	}).factory('UsageLog', function($resource) {
 		return $resource('log/usage', {});
 	}).factory('AccountResource', function($resource) {
-		return $resource('account/resource', {}, {
-			getAll: {
-				isArray: true
-			}
-		});
+		return $resource('account/resource', {});
 	}).factory('AccountRole', function($resource) {
-		return $resource('account/role/:id', {}, {
-			getAll: {
-				isArray: true
-			}
-		});
+		return $resource('account/role/:id');
 	});
 });

+ 17 - 7
src/main/webapp/resources/tpl/index/account/user.html

@@ -159,7 +159,7 @@
 						<th width="170">身份证号</th>
 						<th width="170">电话</th>
 						<th width="200">邮箱</th>
-						<th>角色</th>
+						<th colspan="2">角色</th>
 					</tr>
 				</thead>
 				<tbody>
@@ -191,11 +191,12 @@
 							name="newUserEmail" class="form-control input-sm" type="text"
 							placeholder="邮箱">
 						</td>
-						<td><a ng-click="">设置角色</a></td>
+						<td colspan="2"><a class="text-inverse"
+							ng-click="editUserRole(newUser)">设置角色</a></td>
 					</tr>
 				</tbody>
 				<tbody>
-					<tr ng-repeat="u in $data track by u.userUU">
+					<tr ng-repeat="u in $data">
 						<td class="text-center" ng-bind="::u.userUU"></td>
 						<td class="text-center" ng-bind="::u.userName"></td>
 						<td class="text-center" ng-bind="::u.userSex == 'F' ? '女' : '男'"></td>
@@ -203,11 +204,20 @@
 						<td class="text-center" ng-bind="::u.userTel"></td>
 						<td class="text-center" ng-bind="::u.userEmail"></td>
 						<td class="user-role">
-							<div class="role-item" ng-repeat="role in u.roles"><span class="icon" ng-class="{'info':role}" ng-bind="role.desc | firstchar"></span></div>
+							<div class="role-item" ng-repeat="role in u.roles"
+								title="{{role.desc}}">
+								<span class="icon"
+									ng-class="{'info':role.issys == 1,'danger':role.isdefault == 0}"
+									ng-bind="::role.desc | firstchar"></span>
+							</div>
+						</td>
+						<td class="row-operator">
+							<a class="operator-trigger" href="javascript:void(0);"><i class="fa fa-pencil fa-lg"></i></a>
+							<ul class="list-unstyle list-inline operator-menu">
+								<li><a ng-click="editUserRole(u)"><i class="fa fa-fw fa-pencil-square-o"></i>编辑</a></li>
+								<li><a ng-click="removeUser(u)" ng-if="u.userUU != user.userUU"><i class="fa fa-fw fa-trash-o"></i>删除</a></li>
+							</ul>
 						</td>
-						<!-- <td class="text-center"><a ng-if="u.userUU != user.userUU"
-							ng-click="removeUser(u.userUU)" title="删除该用户"><i
-								class="fa fa-trash-o fa-lg"></></a></td> -->
 					</tr>
 				</tbody>
 			</table>

+ 25 - 0
src/main/webapp/resources/tpl/index/account/user_role.html

@@ -0,0 +1,25 @@
+<div class="modal-header">
+	<h3 class="modal-title">
+		<i class="fa fa-user fa-fw text-default"></i>选择角色
+	</h3>
+</div>
+<div class="modal-body">
+	<div class="userrole-list">
+		<div class="item" ng-repeat="role in roles track by role.id" ng-click="select(role)" ng-class="{'checked': role.$checked}">
+			<div class="icon"> <i class="fa fa-user"
+				ng-class="{'fa-user-md': role.name=='ROLE_ADMIN','fa-male': role.name=='ROLE_SALE','fa-street-view': role.name=='ROLE_USER'}"></i>
+				<h5 ng-bind="role.desc"></h5>
+			</div>
+			<div class="desc">
+				<div class="text-muted" ng-bind="role.duty"></div>
+			</div>
+			<div class="checker"></div>
+		</div>
+	</div>
+</div>
+<div class="modal-footer">
+	<span class="pull-left text-muted"><i
+		class="fa fa-fw fa-warning"></i>点击角色选中或取消</span>
+	<button class="btn btn-primary" ng-disabled="!isChanged()" ng-click="close(true)">确认并保存</button>
+	<button class="btn btn-default" ng-click="close(false)" type="button">取消</button>
+</div>