SysUsers.cshtml 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412
  1. @using ShwasherSys.Authorization.Permissions
  2. @using ShwasherSys.Models
  3. @using ShwasherSys.Models.Layout
  4. @using ShwasherSys.Models.Modal
  5. @{
  6. /**/
  7. /**/
  8. ViewBag.ActiveMenu = PermissionNames.PagesSystemUsers; //The menu item will be active for this page.
  9. ViewBag.Title = "用户管理";
  10. CurrentUserViewModel currentUser = ViewBag.CurrentUser;
  11. List<SelectListItem> userType = ViewBag.UserType;
  12. List<SelectListItem> activeType = ViewBag.IsActive;
  13. List<SelectListItem> factories = ViewBag.Factories;
  14. List<SelectListItem> departments = ViewBag.Departments;
  15. List<SelectListItem> duties = ViewBag.Duties;
  16. var searchForm = new SearchFormViewModal(new List<SearchItem>()
  17. {
  18. new SearchItem("userName","用户名"),
  19. new SearchItem("realName","真实姓名"),
  20. new SearchItem("userType","用户类型",FiledType.I )
  21. .SetSearchItem(userType),
  22. new SearchItem("emailAddress","电子邮箱"),
  23. new SearchItem("isActive","激活状态",FiledType.B)
  24. .SetSearchItem(activeType),
  25. //.SetSearchItem(new List<SelectListItem>
  26. //{
  27. // new SelectListItem(){Text = @"激活",Value = "1"},
  28. // new SelectListItem(){Text = @"锁定",Value = "0"},
  29. //}),
  30. //new SearchItem("lastLoginTime","最后登陆时间",FiledType.D,ExpType.GreaterOrEqual),
  31. }, false);
  32. }
  33. <link href="~/Content/Plugins/jstree/themes/default/style.min.css" rel="stylesheet" />
  34. <link href="~/Content/Plugins/jstree/themes/jstree-self.css" rel="stylesheet" />
  35. <div class="table-box mr-4 iwb-bootstrap-table">
  36. @Html.Action("ToolMenu", "Layout", new { pageName = ViewBag.ActiveMenu, searchForm })
  37. <table id="table"
  38. data-url="/api/services/app/Users/GetAllUser"
  39. data-striped="true" data-id-field="id" data-unique-id="id"
  40. data-method="post"
  41. data-side-pagination="server"
  42. data-content-type="application/x-www-form-urlencoded; charset=UTF-8"
  43. data-cache="false"
  44. data-pagination="true"
  45. data-page-size="30"
  46. data-page-number="1"
  47. data-page-list="[30,50,100,200]" data-pagination-detail-h-align="right" data-pagination-h-align="left"
  48. data-query-params="QueryParams"
  49. data-response-handler="ResponseHandler"
  50. data-click-to-select="true"
  51. data-single-select="true">
  52. <thead>
  53. <tr class="row" id="header">
  54. <th data-field="state" data-checkbox="true"></th>
  55. <th data-align="center" data-field="userName">用户名</th>
  56. <th data-align="center" data-field="realName">真实姓名</th>
  57. <th data-align="center" data-field="userTypeName" data-formatter="UserTypeFormatter">用户类型</th>
  58. <th data-align="center" data-field="emailAddress">电子邮箱</th>
  59. <th data-align="center" data-field="isActiveName" data-formatter="ActiveStateFormatter">激活状态</th>
  60. @*<th data-align="center" data-field="lastLoginTime">最后登陆时间</th>
  61. <th data-align="center" data-field="lastModificationTime">最后修改时间</th>
  62. <th data-align="center" data-field="lastModifierUserName">最后修改人</th>*@
  63. </tr>
  64. </thead>
  65. </table>
  66. </div>
  67. @section modal{
  68. <section>
  69. <!--Main Modal-->
  70. <div class="modal fade" id="modal" role="dialog" tabindex="-1" aria-labelledby="ModalLabel" aria-hidden="true">
  71. <div class="modal-dialog modal-dialog-centered" role="document">
  72. <div class="modal-content">
  73. @Html.Partial("Modals/_ModalHeader", new ModalHeaderViewModel("用户"))
  74. @{
  75. var inputs = new List<InputViewModel>
  76. {
  77. new InputViewModel("id", hide: true),
  78. new InputViewModel("userName", displayName: "用户名"),
  79. new InputViewModel("userType", InputTypes.List,"用户类型")
  80. .SetSelectOptions(userType),
  81. new InputViewModel("realName", displayName: "真实姓名"),
  82. new InputViewModel("emailAddress", displayName: "电子邮箱"),
  83. new InputViewModel("isActive",InputTypes.List, "激活状态")
  84. .SetSelectOptions(activeType),
  85. new InputViewModel("factoryID",InputTypes.List, "办公地点")
  86. .SetSelectOptions(factories),
  87. new InputViewModel("departmentID",InputTypes.List, "部门")
  88. .SetSelectOptions(departments),
  89. new InputViewModel("dutyID",InputTypes.List, "职务")
  90. .SetSelectOptions(duties)
  91. };
  92. if (currentUser.UserType == 1 || currentUser.UserType == 2)
  93. {
  94. inputs.Add(new InputViewModel("roleNames", InputTypes.List, "角色信息", other: "multiple").SetNotRequired()
  95. .SetSelectOptions((List<SelectListItem>)ViewBag.Roles));
  96. }
  97. //var specials = new List<SpecialInputModel>();
  98. }
  99. @Html.Partial("Modals/_ModalBody", new ModalBodyViewModel(inputs))
  100. @Html.Partial("Modals/_ModalFooter", "0")
  101. </div>
  102. </div>
  103. </div>
  104. </section>
  105. <section>
  106. <!--Auth Modal -->
  107. <div class="modal fade" id="auth_Modal" role="dialog" aria-labelledby="ModalLabel_AUTH" aria-hidden="true">
  108. <div class="modal-dialog modal-dialog-centered" role="document" style="min-height: 700px;">
  109. <div class="modal-content">
  110. @Html.Partial("Modals/_ModalHeader", new ModalHeaderViewModel("用户权限配置", ""))
  111. <form>
  112. <div class="modal-body" style="max-height: 500px;overflow: auto">
  113. <div class="" id="auth-tree"></div>
  114. </div>
  115. </form>
  116. <div class="modal-footer">
  117. <button type="button" class="btn btn-default waves-effect" data-dismiss="modal">@L("Cancel")</button>
  118. <button type="button" class="btn btn-primary save-btn waves-effect">@L("Save")</button>
  119. </div>
  120. </div>
  121. </div>
  122. </div>
  123. </section>
  124. @*<section>
  125. Auth Modal
  126. <div class="modal fade" id="auth_Modal" role="dialog" aria-labelledby="ModalLabel_AUTH" aria-hidden="true">
  127. <div class="modal-dialog modal-dialog-centered" role="document" style="min-height: 700px;">
  128. <div class="modal-content">
  129. @Html.Partial("Modals/_ModalHeader", new ModalHeaderViewModel("用户权限配置",""))
  130. <form>
  131. <div class="modal-body" style="max-height: 500px;overflow: auto">
  132. </div>
  133. </form>
  134. <div class="modal-footer">
  135. <div class="pull-left" id="checkAll" style="margin: 10px 20px 0 70px;color: red;">
  136. <input class="filled-in" type="checkbox" name="checkAll" value="" />
  137. <label style="font-size: 15px">全选</label>
  138. </div>
  139. <button type="button" class="btn btn-default waves-effect" data-dismiss="modal">@L("Cancel")</button>
  140. <button type="button" class="btn btn-primary save-btn waves-effect">@L("Save")</button>
  141. </div>
  142. </div>
  143. </div>
  144. </div>
  145. </section>*@
  146. }
  147. @section scripts
  148. {
  149. <script src="~/Content/Plugins/jstree/jstree.min.js"></script>
  150. <script type="text/javascript">
  151. $(function () {
  152. LoadTable();
  153. var funs = window.funs || { none: function () { console.log("No type"); } };
  154. funs["btnUpdate"] = function() {
  155. var rows = config.table.bootstrapTable("getSelections");
  156. if (rows.length === 1) {
  157. var userId = rows[0].id;
  158. abp.ajax({
  159. url: window.appUrl + 'Users/GetUserRoles?UserId=' + userId,
  160. type: 'POST',
  161. dataType: "json",
  162. success: function (res) {
  163. var data = rows[0];
  164. data.roleNames = res;
  165. //console.log(data);
  166. //$("#accountType").off("change.accountType");
  167. BtnUpdate({ readonly: "userName,userType",data:data });
  168. //$("#accountType").on("change.accountType", ChangeAccountList);
  169. //ChangeAccountList(rows[0].accountNo);
  170. }
  171. });
  172. }
  173. };
  174. funs["btnAuth"] = function() {
  175. var rows = config.table.bootstrapTable("getSelections");
  176. if (rows.length === 1) {
  177. abp.ui.setBusy();
  178. var userId = rows[0].id;
  179. abp.ajax({
  180. url: abp.appPath + 'System/GetUserPermission?userId=' + userId,
  181. type: 'POST',
  182. dataType: "json",
  183. success: function (res) {
  184. $("#auth_Modal").on('show.bs.modal',function() {
  185. AuthFormate(res);
  186. $("#auth_Modal").find("button.save-btn").off("click").on("click", function() {
  187. var authData = GetAuthData(userId);
  188. SaveAjax({
  189. url: $("#tableTool").find('.btn[data-type=btnAuth]').data('url'),
  190. isValidate: false,
  191. success: function() { $("#auth_Modal").modal("hide"); },
  192. data: authData
  193. });
  194. });
  195. });
  196. $("#auth_Modal").modal("show");
  197. abp.ui.clearBusy();
  198. }
  199. });
  200. } else
  201. abp.message.warn(abp.localization.localize("ChooseOneToOp"));
  202. };
  203. funs["btnResetPwd"] = function (url) {
  204. console.log("ResetPwd");
  205. var rows = config.table.bootstrapTable("getSelections");
  206. if (rows.length === 1) {
  207. abp.message.confirm("重置密码", "确定用户 【" + rows[0].realName + "(" + rows[0].userName+") 】的密码吗?", function () {
  208. SaveAjax({ url: url, data: { Id: rows[0].id }, isValidate: false });
  209. });
  210. } else
  211. abp.message.warn(abp.localization.localize("ChooseOneToOp"));
  212. }
  213. });
  214. </script>
  215. <script>
  216. function AuthFormate(data) {
  217. var authData = [];
  218. authData.push(data);
  219. authData = AuthDataConvert(authData).authData;
  220. console.log(authData);
  221. $("#auth-tree").jstree("destroy");
  222. $("#auth-tree").data('jstree', false).empty().jstree({
  223. plugins: ["wholerow", "checkbox", "types"],
  224. core: {
  225. themes: {
  226. responsive: false
  227. },
  228. data: authData,
  229. //data: [
  230. // {
  231. // 'id': 'node_2',
  232. // 'text': 'Root node with options',
  233. // 'state': { 'opened': true, 'selected': true },
  234. // 'children': [{ 'text': 'Child 1' }, 'Child 2']
  235. // }
  236. //]
  237. },
  238. //checkbox: {
  239. // "keep_selected_style": false,
  240. // "three_state": false,
  241. // "tie_selection": false
  242. //},
  243. types: {
  244. default:
  245. {
  246. icon: "fa fa-folder m--font-warning"
  247. },
  248. file: {
  249. icon: "fa fa-file m--font-warning"
  250. }
  251. }
  252. });
  253. }
  254. function AuthDataConvert(data) {
  255. //console.log(data);
  256. var authData = [], j = 0;
  257. for (var i = 0; i < data.length; i++) {
  258. var item = data[i], newItem = [];
  259. newItem["id"] = item.name;
  260. newItem["text"] = item.permDisplayName;
  261. newItem["icon"] = item.icon + " iconfont m--font-warning";
  262. newItem["state"] = {};
  263. newItem["state"].opened = item.isOpen;
  264. var childResult = { "authData": [], "isAuth": true };
  265. if (item.children && item.children.length > 0) {
  266. childResult = AuthDataConvert(item.children);
  267. newItem["children"] = childResult.authData;
  268. }
  269. if (!(item.isAuth && childResult.isAuth)) {
  270. j++;
  271. }
  272. newItem["state"].selected = item.isAuth && childResult.isAuth;
  273. authData.push(newItem);
  274. }
  275. var result = { "authData": authData, "isAuth": j === 0 };
  276. return result;
  277. }
  278. function GetAuthData(roleId) {
  279. var authData = { Id: roleId, PermissionNames: [] };
  280. var permissionNames = $('#auth-tree').jstree(true).get_selected(false);//获得所有选中节点,返回值为数组
  281. $(".jstree-undetermined").each(function () {
  282. permissionNames.push($(this).parent().parent().attr('id'));
  283. });
  284. authData.PermissionNames = permissionNames;
  285. return authData;
  286. }
  287. </script>
  288. <script>
  289. function UserTypeFormatter(v, r) {
  290. if (r.userType === 1) {
  291. return '<span class="label label-danger">' + v + '</span>';
  292. } else if (r.userType === 2) {
  293. return '<span class="label label-success">' + v + '</span>';
  294. } else if (r.userType === 3) {
  295. return '<span class="label label-warning">' + v + '</span>';
  296. } else if (r.userType === 4) {
  297. return '<span class="label label-primary">' + v + '</span>';
  298. }
  299. return v;
  300. }
  301. //function AccountTypeFormatter(v, r) {
  302. // if (r.accountType === 1) {
  303. // return '<span class="label label-danger">系统用户</span>';
  304. // } else if (r.accountType === 2) {
  305. // return '<span class="label label-success">来宾用户</span>';
  306. // }
  307. // return v;
  308. //}
  309. //function AccountStateFormatter(v, r) {
  310. // if (r.accountType === 1) {
  311. // return '<span class="label label-primary"> 不分配</span>';
  312. // }
  313. // if (v) {
  314. // return '<span class="label label-success"> 已分配</span>';
  315. // }
  316. // return '<span class="label label-danger"> 未分配</span>';
  317. //}
  318. function ActiveStateFormatter(v, r) {
  319. if (r.isActive) {
  320. return '<span class="label label-success"> ' + v + '</span>';
  321. }
  322. return '<span class="label label-danger"> ' + v + '</span>';
  323. }
  324. </script>
  325. @*<script type="text/javascript">
  326. $(function () {
  327. LoadTable();
  328. var funs = window.funs || { none: function () { console.log("No type"); } };
  329. funs["btnUpdate"] = function () {
  330. var rows = config.table.bootstrapTable("getSelections");
  331. if (rows.length === 1) {
  332. var userId = rows[0].id;
  333. abp.ajax({
  334. url: window.appUrl + 'Users/GetUserRoles?UserId=' + userId,
  335. type: 'POST',
  336. dataType: "json",
  337. success: function (res) {
  338. var data = rows[0];
  339. data.roleNames = res;
  340. console.log(data);
  341. BtnUpdate({ readonly: "userName,userType", data: data });
  342. }
  343. });
  344. }
  345. };
  346. funs["btnAuth"] = function () {
  347. var rows = config.table.bootstrapTable("getSelections");
  348. if (rows.length === 1) {
  349. var userId = rows[0].id;
  350. $.ajax({
  351. url: abp.appPath + 'System/UserAuthModal?userId=' + userId,
  352. type: 'POST',
  353. //contentType: 'application/html',
  354. dataType: "html",
  355. success: function (content) {
  356. //console.log(0);
  357. if (content === "") {
  358. return;
  359. }
  360. $("#auth_Modal").on('show.bs.modal',
  361. function () {
  362. $("#auth_Modal").find(".modal-body").empty().append(content);
  363. $("#auth_Modal").find("button.save-btn").off("click").on("click",
  364. function () {
  365. var authData = GetAuthData(userId);
  366. SaveAjax({
  367. url: $("#tableTool").find('.btn[data-type=btnAuth]').data('url'),
  368. isValidate: false,
  369. success: function () { $("#auth_Modal").modal("hide"); },
  370. data: authData
  371. });
  372. });
  373. });
  374. $("#auth_Modal").modal("show");
  375. },
  376. error: function () {
  377. return;
  378. }
  379. });
  380. } else
  381. abp.message.warn(abp.localization.localize("ChooseOneToOp"));
  382. };
  383. });
  384. function GetAuthData(roleId) {
  385. var authData = { Id: roleId, PermissionNames: [] };
  386. var perms = $("input[name='permission']:checked");
  387. if (perms) {
  388. for (var i = 0; i < perms.length; i++) {
  389. var perm = $(perms[i]);
  390. authData.PermissionNames.push(perm.val());
  391. }
  392. }
  393. return authData;
  394. }
  395. </script>*@
  396. }