user.js 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371
  1. import store from '@/store'
  2. import { Role } from '@/constant'
  3. import request, { keycloakRequest } from '@/utils/request'
  4. import {
  5. send,
  6. add,
  7. update,
  8. messageSend
  9. } from './base'
  10. // 公众号二维码
  11. export function getTicket (id) {
  12. return request({
  13. url: `keycloak/query/ticket/${id}`,
  14. method: 'GET'
  15. })
  16. }
  17. // 小程序二维码
  18. export function getQrcode (data) {
  19. return request({
  20. url: `wxapplet/qrcode`,
  21. method: 'GET',
  22. params: data
  23. })
  24. }
  25. export function userinfo (silence) {
  26. const config = {
  27. // url: `${baseUrl}/realms/${realm}/account`,
  28. url: `/users/${store.getters.userId}`,
  29. method: 'GET'
  30. }
  31. if (silence) {
  32. config.custom = true
  33. return keycloakRequest(config)
  34. }
  35. return send(config, keycloakRequest)
  36. }
  37. export function addUser (data) {
  38. return add({
  39. url: `/users`,
  40. method: 'POST',
  41. data
  42. }, keycloakRequest)
  43. }
  44. export function updateUser (id, data, message) {
  45. return update({
  46. url: `/users/${id}`,
  47. method: 'PUT',
  48. data
  49. }, message, keycloakRequest)
  50. }
  51. export function deleteUser ({ id }) {
  52. return keycloakRequest({
  53. url: `/users/${id}`,
  54. method: 'DELETE'
  55. })
  56. }
  57. export function getUserCredentials ({ id }) {
  58. return keycloakRequest({
  59. url: `/users/${id}/credentials`,
  60. method: 'GET'
  61. })
  62. }
  63. export function deleteUserCredentials (userId, credentialId) {
  64. return send({
  65. url: `/users/${userId}/credentials/${credentialId}`,
  66. method: 'DELETE'
  67. }, keycloakRequest)
  68. }
  69. export function resetPassword ({ id }) {
  70. return messageSend({
  71. url: `/users/${id}/reset-password`,
  72. method: 'PUT',
  73. data: {
  74. type: 'password',
  75. value: process.env.VUE_APP_USER_PASSWORD,
  76. temporary: true
  77. }
  78. }, '重置', keycloakRequest)
  79. }
  80. export function getTenantsByQuery (query, onlyOnce) {
  81. const { pageSize: max, pageNum, name, ...params } = query
  82. return keycloakRequest({
  83. url: `/groups`,
  84. method: 'GET',
  85. params: {
  86. briefRepresentation: false,
  87. max,
  88. first: pageNum ? (pageNum - 1) * max : void 0,
  89. search: name || void 0,
  90. ...params
  91. }
  92. }).then(data => {
  93. return { data: normalizeGroups(data, null, onlyOnce) }
  94. })
  95. }
  96. function normalizeGroups (groups, parentGroup, onlyOnce) {
  97. return groups.map(({ id, name, path, attributes, subGroups }) => {
  98. const remark = attributes.remark?.[0] || ''
  99. const group = {
  100. parentGroup,
  101. id,
  102. path,
  103. name,
  104. remark,
  105. aiAudit: parentGroup ? void 0 : attributes.aiAudit?.[0] || '0',
  106. label: remark || name
  107. }
  108. if (onlyOnce) {
  109. return group
  110. }
  111. group.subGroups = normalizeGroups(subGroups.sort((a, b) => a.name <= b.name ? -1 : 1), group)
  112. return group
  113. })
  114. }
  115. function getTenantCount (name) {
  116. return keycloakRequest({
  117. url: `/groups/count`,
  118. method: 'GET',
  119. params: {
  120. top: true,
  121. search: name || void 0
  122. }
  123. })
  124. }
  125. export async function getTenants (query) {
  126. const { count } = await getTenantCount(query.name)
  127. const { data } = await getTenantsByQuery(query)
  128. return {
  129. data,
  130. totalCount: count
  131. }
  132. }
  133. export function getTenantTree () {
  134. if (store.getters.isSuperAdmin) {
  135. return getTenantsByQuery({})
  136. }
  137. return getGroups().then(data => {
  138. const groups = normalizeGroups([data])
  139. groups[0].label = '根部门'
  140. return { data: groups }
  141. })
  142. }
  143. export function addTenant ({ name, remark, aiAudit }) {
  144. return add({
  145. url: `/groups`,
  146. method: 'POST',
  147. data: {
  148. name,
  149. attributes: {
  150. remark: [remark],
  151. aiAudit: aiAudit ? [aiAudit] : void 0
  152. }
  153. }
  154. }, keycloakRequest)
  155. }
  156. export function getTopGroups () {
  157. if (store.getters.isSuperAdmin) {
  158. return getTenantsByQuery({}, true)
  159. }
  160. return getGroups().then(data => {
  161. return { data: normalizeGroups(data.subGroups, true) }
  162. })
  163. }
  164. async function getGroups () {
  165. if (!store.getters.tenantId) {
  166. const groups = await getUserGroups(store.getters.userId)
  167. store.commit('user/SET_TENANT_ID', groups[0].id)
  168. }
  169. return keycloakRequest({
  170. url: `/groups/${store.getters.tenantId}`,
  171. method: 'GET'
  172. })
  173. }
  174. export function addSubGroup ({ id }, { name, remark }) {
  175. return add({
  176. url: `/groups/${id}/children`,
  177. method: 'POST',
  178. data: {
  179. name,
  180. attributes: { remark: [remark] }
  181. }
  182. }, keycloakRequest)
  183. }
  184. export function updateGroup ({ id, name, remark, aiAudit }) {
  185. return update({
  186. url: `/groups/${id}`,
  187. method: 'PUT',
  188. data: {
  189. name,
  190. attributes: {
  191. remark: [remark],
  192. aiAudit: aiAudit ? [aiAudit] : void 0
  193. }
  194. }
  195. }, null, keycloakRequest)
  196. }
  197. export function deleteGroup ({ id }) {
  198. return keycloakRequest({
  199. url: `/groups/${id}`,
  200. method: 'DELETE'
  201. })
  202. }
  203. export function getUsersByGroup (query) {
  204. const { id, pageSize: max, pageNum, ...params } = query
  205. return keycloakRequest({
  206. url: `/groups/${id}/members`,
  207. method: 'GET',
  208. params: {
  209. briefRepresentation: true,
  210. max: max + 1,
  211. first: pageNum ? (pageNum - 1) * max : void 0,
  212. ...params
  213. }
  214. }).then(data => {
  215. const totalCount = data.length
  216. if (totalCount > max) {
  217. data = data.slice(0, -1)
  218. }
  219. return {
  220. data,
  221. totalCount
  222. }
  223. })
  224. }
  225. export function getUserGroups (id, briefRepresentation = true) {
  226. return keycloakRequest({
  227. url: `/users/${id}/groups`,
  228. method: 'GET',
  229. params: { briefRepresentation }
  230. }).then(data => data.sort((a, b) => a.path.length - b.path.length))
  231. }
  232. function addUserToGroup (userId, groupId) {
  233. return keycloakRequest({
  234. url: `/users/${userId}/groups/${groupId}`,
  235. method: 'PUT'
  236. })
  237. }
  238. function removeUserFromGroup (userId, groupId) {
  239. return keycloakRequest({
  240. url: `/users/${userId}/groups/${groupId}`,
  241. method: 'DELETE'
  242. })
  243. }
  244. export async function moveUserGroup (userId, from, to) {
  245. const fromGroups = getGroupList(from)
  246. const toGroups = getGroupList(to)
  247. let fromLast = fromGroups.length - 1
  248. const toLast = toGroups.length - 1
  249. let start = 0
  250. while (start <= fromLast && start <= toLast) {
  251. if (fromGroups[start].id === toGroups[start].id) {
  252. start += 1
  253. } else {
  254. break
  255. }
  256. }
  257. const changed = start <= fromLast || start <= toLast
  258. for (; fromLast >= start; fromLast--) {
  259. await removeUserFromGroup(userId, fromGroups[fromLast].id)
  260. }
  261. for (; start <= toLast; start++) {
  262. await addUserToGroup(userId, toGroups[start].id)
  263. }
  264. return changed
  265. }
  266. function getGroupList (group) {
  267. const groups = [group]
  268. let parentGroup = group.parentGroup
  269. while (parentGroup) {
  270. groups.unshift(parentGroup)
  271. parentGroup = parentGroup.parentGroup
  272. }
  273. return groups
  274. }
  275. export function getUserRoleMapping (id) {
  276. return getUserRoles(id).then(
  277. roles => getRoles().then(
  278. available => {
  279. return {
  280. available,
  281. roles
  282. }
  283. }
  284. )
  285. )
  286. }
  287. function getUserRoles (id) {
  288. return keycloakRequest({
  289. url: `/users/${id}/role-mappings/realm`,
  290. method: 'GET'
  291. })
  292. }
  293. function getRoles () {
  294. return keycloakRequest({
  295. url: `/roles`,
  296. method: 'GET'
  297. }).then(filterRoles)
  298. }
  299. function filterRoles (roles) {
  300. const isSuperAdmin = store.getters.isSuperAdmin
  301. return roles.filter(({ name }) => name !== Role.SUPER_ADMIN && (isSuperAdmin || name !== Role.ADMIN) && name.startsWith('ROLE_'))
  302. }
  303. export async function updateUserRoles (userId, available, fromKeys, toKeys) {
  304. const delRoles = []
  305. const toSet = new Set(toKeys)
  306. fromKeys.forEach(id => {
  307. if (!toSet.has(id)) {
  308. delRoles.push(available.find(role => role.id === id))
  309. }
  310. })
  311. if (delRoles.length) {
  312. await removeUserRoles(userId, delRoles)
  313. }
  314. const addRoles = []
  315. const fromSet = new Set(fromKeys)
  316. toKeys.forEach(id => {
  317. if (!fromSet.has(id)) {
  318. addRoles.push(available.find(role => role.id === id))
  319. }
  320. })
  321. if (addRoles.length) {
  322. await addUserRoles(userId, addRoles)
  323. }
  324. }
  325. function removeUserRoles (userId, roles) {
  326. return keycloakRequest({
  327. url: `/users/${userId}/role-mappings/realm`,
  328. method: 'DELETE',
  329. data: roles
  330. })
  331. }
  332. function addUserRoles (userId, roles) {
  333. return keycloakRequest({
  334. url: `/users/${userId}/role-mappings/realm`,
  335. method: 'POST',
  336. data: roles
  337. })
  338. }