role.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359
  1. // role.js
  2. // 页面加载时获取角色列表
  3. document.addEventListener('DOMContentLoaded', function() {
  4. fetchRoles();
  5. // 绑定创建角色按钮的点击事件
  6. document.getElementById('createRoleButton').addEventListener('click', function() {
  7. createRole();
  8. });
  9. });
  10. fetchRoles()
  11. function fetchRoles() {
  12. fetch('http://127.0.0.1:8080/api/admin/GetRoles', {
  13. method: 'POST',
  14. headers: {
  15. 'Authorization': `Bearer ${authToken}`,
  16. 'Content-Type': 'application/json'
  17. },
  18. body: JSON.stringify({ Name: " " }) // 发送空的 Name 参数
  19. })
  20. .then(response => response.json())
  21. .then(data => {
  22. const roleContainer = document.getElementById('roles-container');
  23. roleContainer.innerHTML = ''; // 清空之前的内容
  24. const permissionMap = {
  25. 'generate_license': '生成许可证',
  26. 'upload_license': '上传许可证(废弃)',
  27. 'read_license': '读取许可证',
  28. 'read_license_record': '读取许可证分发记录',
  29. 'update_license': '修改许可证(废弃)',
  30. 'delete_license': '删除许可证(废弃)',
  31. 'dispat_license': '分发许可证',
  32. 'create_user': '创建用户',
  33. 'read_user': '读取用户',
  34. 'update_user': '更新用户',
  35. 'delete_user': '删除用户',
  36. 'create_role': '创建角色',
  37. 'delete_role': '删除角色',
  38. 'update_role': '更新角色',
  39. 'get_role': '获取角色'
  40. };
  41. // 检查用户是否有 create_role 权限
  42. const hasCreateRolePermission = currentUserPermissions.includes('create_role');
  43. // 如果有权限则显示“创建角色”按钮
  44. if (hasCreateRolePermission) {
  45. document.getElementById('createRoleButton').style.display = 'block';
  46. } else {
  47. document.getElementById('createRoleButton').style.display = 'none';
  48. }
  49. // 处理置顶角色和其他角色的渲染
  50. const topRoles = ['admin', 'guest', 'supportRole'];
  51. topRoles.forEach(role => {
  52. if (data.data[role]) {
  53. renderRole(roleContainer, data.data[role], permissionMap, true);
  54. }
  55. });
  56. Object.keys(data.data).forEach(role => {
  57. if (!topRoles.includes(role)) {
  58. renderRole(roleContainer, data.data[role], permissionMap, false);
  59. }
  60. });
  61. })
  62. .catch(error => {
  63. console.error('获取角色数据失败:', error);
  64. });
  65. }
  66. function renderRole(container, roleInfo, permissionMap, isTopRole) {
  67. const roleDiv = document.createElement('div');
  68. roleDiv.className = 'role-item';
  69. if (isTopRole) {
  70. roleDiv.classList.add('top-role'); // 应用置顶角色的样式
  71. }
  72. let permissions = roleInfo.Permissions.map(permission => permissionMap[permission] || permission);
  73. let permissionsHtml = permissions.join(','); // 使用逗号分隔并合并为一行
  74. roleDiv.innerHTML = `
  75. <h3>${roleInfo.Name}</h3>
  76. <p>${permissionsHtml}</p>
  77. `;
  78. container.appendChild(roleDiv);
  79. // 添加事件监听器,处理点击和右键点击弹出菜单
  80. roleDiv.addEventListener('click', function(event) {
  81. event.stopPropagation(); // 阻止事件冒泡
  82. event.preventDefault(); // 阻止默认行为
  83. showRoleActionMenu(event, roleInfo.Name);
  84. });
  85. roleDiv.addEventListener('contextmenu', function(event) {
  86. event.preventDefault();
  87. showRoleActionMenu(event, roleInfo.Name);
  88. });
  89. }
  90. function showRoleActionMenu(event, roleName) {
  91. // 移除已有的菜单
  92. const existingMenu = document.getElementById('role-action-menu');
  93. if (existingMenu) {
  94. existingMenu.remove();
  95. }
  96. const menu = document.createElement('div');
  97. menu.id = 'role-action-menu';
  98. menu.className = 'role-action-menu';
  99. menu.style.top = `${event.clientY}px`;
  100. menu.style.left = `${event.clientX}px`;
  101. const topRoles = ['admin', 'guest', 'supportRole'];
  102. if (topRoles.includes(roleName)) {
  103. // 为置顶角色设置不可操作的提示
  104. const disabledButton = document.createElement('button');
  105. disabledButton.textContent = '不可操作';
  106. disabledButton.className = 'role-info-button-disabled';
  107. menu.appendChild(disabledButton);
  108. } else {
  109. // 检查用户是否有 update_role 和 delete_role 权限
  110. const hasUpdateRolePermission = currentUserPermissions.includes('update_role');
  111. const hasDeleteRolePermission = currentUserPermissions.includes('delete_role');
  112. // 创建和添加修改角色按钮
  113. if (hasUpdateRolePermission) {
  114. const modifyButton = document.createElement('button');
  115. modifyButton.textContent = '修改角色';
  116. modifyButton.className = 'role-info-button';
  117. modifyButton.addEventListener('click', function () {
  118. modifyRole(roleName);
  119. menu.remove(); // 点击按钮后,关闭菜单栏
  120. });
  121. menu.appendChild(modifyButton);
  122. }
  123. // 创建和添加删除角色按钮
  124. if (hasDeleteRolePermission) {
  125. const deleteButton = document.createElement('button');
  126. deleteButton.textContent = '删除角色';
  127. deleteButton.className = 'role-info-button role-info-button-delete';
  128. deleteButton.addEventListener('click', function () {
  129. deleteRole(roleName);
  130. menu.remove(); // 点击按钮后,关闭菜单栏
  131. });
  132. menu.appendChild(deleteButton);
  133. }
  134. // 如果用户没有修改或删除权限,则显示没有可用操作
  135. if (!hasUpdateRolePermission && !hasDeleteRolePermission) {
  136. const noOption = document.createElement('div');
  137. noOption.textContent = '没有可用的操作';
  138. noOption.style.textAlign = 'center';
  139. noOption.style.color = '#999';
  140. menu.appendChild(noOption);
  141. }
  142. }
  143. document.body.appendChild(menu);
  144. // 点击其他地方关闭菜单
  145. document.addEventListener('click', function closeMenu(event) {
  146. if (!menu.contains(event.target)) {
  147. menu.remove();
  148. document.removeEventListener('click', closeMenu);
  149. }
  150. });
  151. }
  152. //修改角色信息
  153. function modifyRole(roleName) {
  154. console.log(`modifyRole called with roleName: ${roleName}`);
  155. fetchRoleInfo(roleName, function(roleInfo) {
  156. console.log(`fetchRoleInfo returned:`, roleInfo);
  157. if (!roleInfo) {
  158. console.error('Role info is undefined or null');
  159. return;
  160. }
  161. const extraInfoContent = document.getElementById('extraInfoContent');
  162. if (!extraInfoContent) {
  163. console.error('Element with id "extraInfoContent" not found');
  164. return;
  165. }
  166. extraInfoContent.innerHTML = `
  167. <h3>修改角色: ${roleInfo.Name}</h3>
  168. <label for="roleName">角色名称:</label>
  169. <input type="text" id="roleName" value="${roleInfo.Name}" required><br><br>
  170. <label for="permissions">权限:</label><br>
  171. <div id="permissions">
  172. <div>
  173. <input type="checkbox" id="license" name="permissions" value="license" onchange="toggleSubPermissions('license', this)">
  174. <label for="license">许可证</label>
  175. <div id="licenseSubPermissions" style="margin-left: 20px;">
  176. <input type="checkbox" id="generate_license" name="permissions" value="generate_license">
  177. <label for="generate_license">生成许可证</label><br>
  178. <input type="checkbox" id="upload_license" name="permissions" value="upload_license">
  179. <label for="upload_license">上传许可证</label><br>
  180. <input type="checkbox" id="read_license" name="permissions" value="read_license">
  181. <label for="read_license">读取许可证</label><br>
  182. <input type="checkbox" id="update_license" name="permissions" value="update_license">
  183. <label for="update_license">更新许可证</label><br>
  184. <input type="checkbox" id="delete_license" name="permissions" value="delete_license">
  185. <label for="delete_license">删除许可证</label><br>
  186. </div>
  187. </div>
  188. <div>
  189. <input type="checkbox" id="user" name="permissions" value="user" onchange="toggleSubPermissions('user', this)">
  190. <label for="user">用户</label>
  191. <div id="userSubPermissions" style="margin-left: 20px;">
  192. <input type="checkbox" id="create_user" name="permissions" value="create_user">
  193. <label for="create_user">创建用户</label><br>
  194. <input type="checkbox" id="read_user" name="permissions" value="read_user">
  195. <label for="read_user">读取用户</label><br>
  196. <input type="checkbox" id="update_user" name="permissions" value="update_user">
  197. <label for="update_user">更新用户</label><br>
  198. <input type="checkbox" id="delete_user" name="permissions" value="delete_user">
  199. <label for="delete_user">删除用户</label><br>
  200. </div>
  201. </div>
  202. <div>
  203. <input type="checkbox" id="role" name="permissions" value="role" onchange="toggleSubPermissions('role', this)">
  204. <label for="role">角色</label>
  205. <div id="roleSubPermissions" style="margin-left: 20px;">
  206. <input type="checkbox" id="create_role" name="permissions" value="create_role">
  207. <label for="create_role">创建角色</label><br>
  208. <input type="checkbox" id="delete_role" name="permissions" value="delete_role">
  209. <label for="delete_role">删除角色</label><br>
  210. <input type="checkbox" id="update_role" name="permissions" value="update_role">
  211. <label for="update_role">更新角色</label><br>
  212. <input type="checkbox" id="get_role" name="permissions" value="get_role">
  213. <label for="get_role">获取角色</label><br>
  214. </div>
  215. </div>
  216. </div><br><br>
  217. <button onclick="saveRoleChanges('${roleInfo.Id}')">保存</button>
  218. `;
  219. console.log('Form content added to extraInfoContent');
  220. const checkboxes = document.querySelectorAll('#permissions input[type="checkbox"]');
  221. // 遍历所有复选框
  222. checkboxes.forEach(checkbox => {
  223. if (roleInfo.Permissions.includes(checkbox.value)) {
  224. checkbox.checked = true; // 如果当前权限在roleInfo.Permissions中,则勾选
  225. }
  226. });
  227. const extraInfoModal = document.getElementById('extraInfoModal');
  228. if (!extraInfoModal) {
  229. console.error('Element with id "extraInfoModal" not found');
  230. return;
  231. }
  232. extraInfoModal.style.display = 'block'; // 强制显示模态框
  233. console.log('Modal should be visible now');
  234. });
  235. }
  236. // 示例的删除角色函数
  237. function deleteRole(roleName) {
  238. if (confirm(`确定要删除角色:${roleName} 吗?`)) {
  239. fetch('http://127.0.0.1:8080/api/admin/DeleteRole', {
  240. method: 'POST',
  241. headers: {
  242. 'Authorization': `Bearer ${authToken}`,
  243. 'Content-Type': 'application/json'
  244. },
  245. body: JSON.stringify({ Name: roleName })
  246. })
  247. .then(response => response.json())
  248. .then(data => {
  249. if (data.code === 200) {
  250. alert('角色删除成功');
  251. fetchRoles(); // 重新获取角色列表
  252. } else {
  253. alert(`删除失败:${data.message}`);
  254. }
  255. })
  256. .catch(error => {
  257. console.error('删除角色出错:', error);
  258. });
  259. }
  260. }
  261. function showCreateRoleModal() {
  262. const extraInfoContent = document.getElementById('extraInfoContent');
  263. extraInfoContent.innerHTML = `
  264. <h3>创建新角色</h3>
  265. <label for="newRoleName">角色名称:</label>
  266. <input type="text" id="newRoleName" required><br><br>
  267. <label for="newPermissions">权限:</label><br>
  268. <div id="newPermissions">
  269. <div>
  270. <input type="checkbox" id="license" name="permissions" value="license" onchange="toggleSubPermissions('license', this)">
  271. <label for="license">许可证</label>
  272. <div id="licenseSubPermissions" style="margin-left: 20px;">
  273. <input type="checkbox" id="generate_license" name="permissions" value="generate_license">
  274. <label for="generate_license">生成许可证</label><br>
  275. <input type="checkbox" id="upload_license" name="permissions" value="upload_license">
  276. <label for="upload_license">上传许可证(废弃)</label><br>
  277. <input type="checkbox" id="read_license" name="permissions" value="read_license">
  278. <label for="read_license">读取许可证</label><br>
  279. <input type="checkbox" id="update_license" name="permissions" value="update_license">
  280. <label for="update_license">更新许可证(废弃)</label><br>
  281. <input type="checkbox" id="delete_license" name="permissions" value="delete_license">
  282. <label for="delete_license">删除许可证(废弃)</label><br>
  283. </div>
  284. </div>
  285. <div>
  286. <input type="checkbox" id="user" name="permissions" value="user" onchange="toggleSubPermissions('user', this)">
  287. <label for="user">用户</label>
  288. <div id="userSubPermissions" style="margin-left: 20px;">
  289. <input type="checkbox" id="create_user" name="permissions" value="create_user">
  290. <label for="create_user">创建用户</label><br>
  291. <input type="checkbox" id="read_user" name="permissions" value="read_user">
  292. <label for="read_user">读取用户</label><br>
  293. <input type="checkbox" id="update_user" name="permissions" value="update_user">
  294. <label for="update_user">更新用户</label><br>
  295. <input type="checkbox" id="delete_user" name="permissions" value="delete_user">
  296. <label for="delete_user">删除用户</label><br>
  297. </div>
  298. </div>
  299. <div>
  300. <input type="checkbox" id="role" name="permissions" value="role" onchange="toggleSubPermissions('role', this)">
  301. <label for="role">角色</label>
  302. <div id="roleSubPermissions" style="margin-left: 20px;">
  303. <input type="checkbox" id="create_role" name="permissions" value="create_role">
  304. <label for="create_role">创建角色</label><br>
  305. <input type="checkbox" id="delete_role" name="permissions" value="delete_role">
  306. <label for="delete_role">删除角色</label><br>
  307. <input type="checkbox" id="update_role" name="permissions" value="update_role">
  308. <label for="update_role">更新角色</label><br>
  309. <input type="checkbox" id="get_role" name="permissions" value="get_role">
  310. <label for="get_role">获取角色</label><br>
  311. </div>
  312. </div>
  313. </div><br><br>
  314. <button onclick="createNewRole()">创建</button>
  315. `;
  316. document.getElementById('extraInfoModal').style.display = 'block';
  317. }