role.js 14 KB

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