| | |
| | | import AuthProvider from "./config/authProvider"; |
| | | import DataProvider from "./config/dataProvider"; |
| | | import Dashboard from "./page/dashboard/Dashboard"; |
| | | import Settings from "./page/settings/Settings"; |
| | | import Settings from "./page/settings"; |
| | | import Login from "./page/login"; |
| | | import * as Common from './utils/common' |
| | | import { themes } from './themes/themes'; |
| | |
| | | return Promise.reject(new Error(res.data.msg)); |
| | | } |
| | | |
| | | export async function queryUserInfo(_params) { |
| | | const res = await request.get('/auth/user', { params: _params }); |
| | | if (res.data.code === 200) { |
| | | return res.data.data; |
| | | } |
| | | return Promise.reject(new Error(res.data.msg)); |
| | | } |
| | | |
| | | export async function updateUserInfo(_params) { |
| | | const res = await request.post('/auth/user', _params); |
| | | return res.data; |
| | | } |
| | | |
| | | export async function requestResetPassword(_params) { |
| | | const res = await request.post('/auth/reset/password', _params); |
| | | return res.data; |
| | | } |
| | | |
| | | export async function sendEmailCode(_params) { |
| | | const res = await request.get('/email/code', { params: _params }); |
| | | return res.data; |
| | |
| | | code: 'Send Code', |
| | | }, |
| | | }, |
| | | settings: { |
| | | resetPwd: { |
| | | currPwd: 'Current Password', |
| | | newPwd: 'New Password', |
| | | confirmNewPwd: 'Confirm Password', |
| | | resetBtn: 'Reset', |
| | | tip: { |
| | | usernameLimit: 'Only 3-20 English letters or numbers are allowed. No special characters.', |
| | | pwdInputLimit: "New Password must be 6-13 characters long and include both letters and numbers.", |
| | | pwdNotSameAsOld: "New Password cannot be the same as the Current Password.", |
| | | pwdNotMatch: "New Password and Confirm Password do not match.", |
| | | } |
| | | } |
| | | }, |
| | | code: { |
| | | dirRule: { |
| | | helper: 'Select one direction to disable; other directions remain available.', |
| | |
| | | code: '获取验证码', |
| | | }, |
| | | }, |
| | | settings: { |
| | | resetPwd: { |
| | | currPwd: '当前密码', |
| | | newPwd: '新密码', |
| | | confirmNewPwd: '确认新密码', |
| | | resetBtn: '重置密码', |
| | | tip: { |
| | | usernameLimit: '仅允许输入 3-20 个英文字母或数字,不能包含特殊字符', |
| | | pwdInputLimit: "密码必须为6-13位,且必须包含字母和数字", |
| | | pwdNotSameAsOld: "新密码不能与当前密码相同", |
| | | pwdNotMatch: "确认密码不一致", |
| | | } |
| | | } |
| | | }, |
| | | code: { |
| | | dirRule: { |
| | | helper: '选择一个方向禁用,其余方向保持可用', |
| New file |
| | |
| | | import React, { useState, useRef, useEffect, useMemo } from "react"; |
| | | import { |
| | | useTranslate, |
| | | useNotify, |
| | | } from 'react-admin'; |
| | | import { useForm, Controller, useWatch, FormProvider, useFormContext } from "react-hook-form"; |
| | | import { |
| | | Stack, |
| | | Grid, |
| | | Box, |
| | | Typography, |
| | | TextField, |
| | | Button, |
| | | FormControl, |
| | | InputLabel, |
| | | Select, |
| | | MenuItem, |
| | | FormHelperText, |
| | | CircularProgress, |
| | | LinearProgress, |
| | | } from '@mui/material'; |
| | | import { updateUserInfo } from '@/api/auth'; |
| | | import avatar from '/avatar.jpg' |
| | | |
| | | const BaseSettings = (props) => { |
| | | const translate = useTranslate(); |
| | | const notify = useNotify(); |
| | | const { children, userInfo } = props; |
| | | |
| | | const { |
| | | control, |
| | | handleSubmit, |
| | | watch, |
| | | setValue, |
| | | getValues, |
| | | reset, |
| | | formState: { |
| | | errors, |
| | | isDirty, |
| | | }, |
| | | setError, |
| | | clearErrors, |
| | | } = useForm(); |
| | | |
| | | const [loading, setLoading] = useState(false); |
| | | |
| | | useEffect(() => { |
| | | if (userInfo) { |
| | | setValue("username", userInfo.username || "", { shouldDirty: false }); |
| | | setValue("nickname", userInfo.nickname || "", { shouldDirty: false }); |
| | | setValue("sex", userInfo.sex ?? "", { shouldDirty: false }); |
| | | setValue("code", userInfo.code || "", { shouldDirty: false }); |
| | | setValue("phone", userInfo.phone || "", { shouldDirty: false }); |
| | | setValue("email", userInfo.email || "", { shouldDirty: false }); |
| | | setValue("realName", userInfo.realName || "", { shouldDirty: false }); |
| | | setValue("idCard", userInfo.idCard || "", { shouldDirty: false }); |
| | | } |
| | | }, [userInfo, setValue]) |
| | | |
| | | const onSubmit = (data) => { |
| | | setLoading(true); |
| | | updateUserInfo({ id: userInfo.id, ...data }).then(res => { |
| | | setLoading(false); |
| | | const { code, msg, data } = res; |
| | | if (code === 200) { |
| | | notify(msg, { type: 'success', messageArgs: { _: msg } }); |
| | | const userToPersist = { |
| | | avatar: avatar, |
| | | fullName: data.nickname, |
| | | id: data.id, |
| | | username: data.username |
| | | } |
| | | localStorage.setItem("user", JSON.stringify(userToPersist)); |
| | | } else if (code === 10005 || code === 10006) { |
| | | setError('email', { |
| | | message: msg |
| | | }) |
| | | } else { |
| | | notify(msg, { type: 'error', messageArgs: { _: msg } }); |
| | | } |
| | | }).catch((error) => { |
| | | setLoading(false); |
| | | notify(error.message, { type: 'error', messageArgs: { _: error.message } }); |
| | | console.error(error); |
| | | }) |
| | | } |
| | | |
| | | return ( |
| | | <Box sx={{ |
| | | position: 'relative', |
| | | p: 3, |
| | | flex: 1, |
| | | overflow: 'auto', |
| | | }}> |
| | | {!userInfo && ( |
| | | <LinearProgress |
| | | sx={{ |
| | | height: "2px", |
| | | position: 'absolute', |
| | | top: 0, |
| | | left: 0, |
| | | right: 0, |
| | | }} |
| | | /> |
| | | )} |
| | | <form onSubmit={handleSubmit(onSubmit)} noValidate> |
| | | <Stack |
| | | direction='column' |
| | | spacing={3} |
| | | sx={{ |
| | | width: '30%', |
| | | pt: 1 |
| | | }} |
| | | > |
| | | <Controller |
| | | name="username" |
| | | control={control} |
| | | defaultValue="" |
| | | rules={{ required: true }} |
| | | render={({ field, fieldState: { error } }) => ( |
| | | <TextField |
| | | {...field} |
| | | label={translate('table.field.user.username')} |
| | | variant="outlined" |
| | | autoComplete="off" |
| | | helperText={error ? translate('ra.validation.required') : ""} |
| | | disabled |
| | | /> |
| | | )} |
| | | /> |
| | | <Controller |
| | | name="nickname" |
| | | control={control} |
| | | defaultValue="" |
| | | rules={{ required: true }} |
| | | render={({ field, fieldState: { error } }) => ( |
| | | <TextField |
| | | {...field} |
| | | label={translate('table.field.user.nickname')} |
| | | variant="outlined" |
| | | autoComplete="off" |
| | | error={!!error} |
| | | helperText={error ? translate('ra.validation.required') : ""} |
| | | /> |
| | | )} |
| | | /> |
| | | <Controller |
| | | name="sex" |
| | | control={control} |
| | | defaultValue="" |
| | | rules={{ required: true }} |
| | | render={({ field, fieldState: { error } }) => ( |
| | | <FormControl fullWidth variant="outlined" error={!!error}> |
| | | <InputLabel>{translate('table.field.user.sex')}</InputLabel> |
| | | <Select |
| | | {...field} |
| | | label={translate('table.field.user.sex')} |
| | | > |
| | | <MenuItem value={0}> |
| | | <em>{translate('table.field.user.sexes.unknown')}</em> |
| | | </MenuItem> |
| | | <MenuItem value={1}>{translate('table.field.user.sexes.male')}</MenuItem> |
| | | <MenuItem value={2}>{translate('table.field.user.sexes.female')}</MenuItem> |
| | | </Select> |
| | | {error && <FormHelperText>{translate('ra.validation.required')}</FormHelperText>} |
| | | </FormControl> |
| | | )} |
| | | /> |
| | | <Controller |
| | | name="code" |
| | | control={control} |
| | | defaultValue="" |
| | | rules={{ required: false }} |
| | | render={({ field, fieldState: { error } }) => ( |
| | | <TextField |
| | | {...field} |
| | | label={translate('table.field.user.code')} |
| | | variant="outlined" |
| | | autoComplete="off" |
| | | error={!!error} |
| | | helperText={error ? translate('ra.validation.required') : ""} |
| | | /> |
| | | )} |
| | | /> |
| | | <Controller |
| | | name="phone" |
| | | control={control} |
| | | defaultValue="" |
| | | rules={{ required: false }} |
| | | render={({ field, fieldState: { error } }) => ( |
| | | <TextField |
| | | {...field} |
| | | label={translate('table.field.user.phone')} |
| | | variant="outlined" |
| | | autoComplete="off" |
| | | error={!!error} |
| | | helperText={error ? translate('ra.validation.required') : ""} |
| | | /> |
| | | )} |
| | | /> |
| | | <Controller |
| | | name="email" |
| | | control={control} |
| | | defaultValue="" |
| | | rules={{ |
| | | required: false, |
| | | pattern: { |
| | | value: /^[^\s@]+@[^\s@]+\.[^\s@]+$/, |
| | | message: translate("ra.validation.email"), |
| | | }, |
| | | }} |
| | | render={({ field, fieldState: { error } }) => ( |
| | | <TextField |
| | | {...field} |
| | | label={translate('table.field.user.email')} |
| | | variant="outlined" |
| | | autoComplete="off" |
| | | error={!!error} |
| | | helperText={error ? error.message : ""} |
| | | /> |
| | | )} |
| | | /> |
| | | <Controller |
| | | name="realName" |
| | | control={control} |
| | | defaultValue="" |
| | | rules={{ required: false }} |
| | | render={({ field, fieldState: { error } }) => ( |
| | | <TextField |
| | | {...field} |
| | | label={translate('table.field.user.realName')} |
| | | variant="outlined" |
| | | autoComplete="off" |
| | | error={!!error} |
| | | helperText={error ? translate('ra.validation.required') : ""} |
| | | /> |
| | | )} |
| | | /> |
| | | <Controller |
| | | name="idCard" |
| | | control={control} |
| | | defaultValue="" |
| | | rules={{ required: false }} |
| | | render={({ field, fieldState: { error } }) => ( |
| | | <TextField |
| | | {...field} |
| | | label={translate('table.field.user.idCard')} |
| | | variant="outlined" |
| | | autoComplete="off" |
| | | error={!!error} |
| | | helperText={error ? translate('ra.validation.required') : ""} |
| | | /> |
| | | )} |
| | | /> |
| | | <Button |
| | | type="submit" |
| | | variant="contained" |
| | | disabled={loading || !isDirty} |
| | | sx={{ |
| | | alignSelf: 'flex-start', |
| | | width: '120px' |
| | | }} |
| | | > |
| | | {loading && <CircularProgress size={25} thickness={2} />} |
| | | {translate('ra.action.save')} |
| | | </Button> |
| | | </Stack> |
| | | </form> |
| | | |
| | | </Box> |
| | | ) |
| | | } |
| | | |
| | | export default BaseSettings; |
| New file |
| | |
| | | import React, { useState, useRef, useEffect, useMemo } from "react"; |
| | | import { |
| | | useTranslate, |
| | | useNotify, |
| | | } from 'react-admin'; |
| | | import { useForm, Controller, useWatch, FormProvider, useFormContext } from "react-hook-form"; |
| | | import { |
| | | Stack, |
| | | Box, |
| | | Typography, |
| | | TextField, |
| | | Button, |
| | | CircularProgress, |
| | | InputAdornment, |
| | | IconButton, |
| | | } from '@mui/material'; |
| | | import { requestResetPassword } from '@/api/auth'; |
| | | import Visibility from '@mui/icons-material/Visibility'; |
| | | import VisibilityOff from '@mui/icons-material/VisibilityOff'; |
| | | |
| | | const SecuritySettings = (props) => { |
| | | const translate = useTranslate(); |
| | | const notify = useNotify(); |
| | | const { userInfo } = props; |
| | | |
| | | const { control, handleSubmit, watch, setValue, getValues, reset, formState: { errors }, setError } = useForm(); |
| | | |
| | | const oldPasswordVal = watch('oldPassword'); |
| | | const newPasswordVal = watch('newPassword'); |
| | | const confirmPasswordVal = watch('confirmPassword'); |
| | | |
| | | const [loading, setLoading] = useState(false); |
| | | const [showOldPassword, setShowOldPassword] = useState(false); |
| | | const [showNewPassword, setShowNewPassword] = useState(false); |
| | | |
| | | useEffect(() => { |
| | | if (userInfo) { |
| | | } |
| | | }, [userInfo, setValue]) |
| | | |
| | | const onSubmit = (params) => { |
| | | setLoading(true); |
| | | requestResetPassword(params).then(res => { |
| | | setLoading(false); |
| | | const { code, msg, data } = res; |
| | | if (code === 200) { |
| | | notify(msg, { type: 'success', messageArgs: { _: msg } }); |
| | | reset(); |
| | | } else if (code === 10001) { |
| | | setError('oldPassword', { |
| | | message: msg, |
| | | }); |
| | | } else { |
| | | notify(msg, { type: 'error', messageArgs: { _: msg } }); |
| | | } |
| | | }).catch((error) => { |
| | | setLoading(false); |
| | | notify(error.message, { type: 'error', messageArgs: { _: error.message } }); |
| | | console.error(error); |
| | | }) |
| | | } |
| | | |
| | | return ( |
| | | <Box |
| | | sx={{ |
| | | p: 3, |
| | | flex: 1, |
| | | overflow: 'auto', |
| | | }} |
| | | > |
| | | <form onSubmit={handleSubmit(onSubmit)} noValidate> |
| | | <Stack |
| | | direction='column' |
| | | spacing={3} |
| | | sx={{ |
| | | width: '30%', |
| | | pt: 1 |
| | | }} |
| | | > |
| | | <Controller |
| | | name="oldPassword" |
| | | control={control} |
| | | defaultValue="" |
| | | rules={{ required: translate('ra.validation.required') }} |
| | | render={({ field, fieldState: { error } }) => ( |
| | | <TextField |
| | | {...field} |
| | | label={translate('page.settings.resetPwd.currPwd')} |
| | | type={showOldPassword ? 'text' : 'password'} |
| | | variant="outlined" |
| | | autoComplete="off" |
| | | error={Boolean(errors.oldPassword)} |
| | | helperText={errors.oldPassword?.message || ""} |
| | | InputProps={{ |
| | | endAdornment: ( |
| | | <InputAdornment position="end"> |
| | | <IconButton |
| | | aria-label="toggle password visibility" |
| | | onClick={() => setShowOldPassword((show) => !show)} |
| | | onMouseDown={(event) => { event.preventDefault() }} |
| | | edge="end" |
| | | > |
| | | {showOldPassword ? <VisibilityOff /> : <Visibility />} |
| | | </IconButton> |
| | | </InputAdornment> |
| | | ), |
| | | }} |
| | | /> |
| | | )} |
| | | /> |
| | | <Controller |
| | | name="newPassword" |
| | | control={control} |
| | | defaultValue="" |
| | | rules={{ |
| | | required: translate('ra.validation.required'), |
| | | pattern: { |
| | | value: /^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d\.]{6,13}$/, |
| | | message: translate('page.settings.resetPwd.tip.pwdInputLimit'), |
| | | }, |
| | | validate: (value) => { |
| | | if (value === oldPasswordVal) { |
| | | return translate('page.settings.resetPwd.tip.pwdNotSameAsOld'); |
| | | } |
| | | return true; |
| | | } |
| | | }} |
| | | render={({ field, fieldState: { error } }) => ( |
| | | <TextField |
| | | {...field} |
| | | label={translate('page.settings.resetPwd.newPwd')} |
| | | type={showNewPassword ? 'text' : 'password'} |
| | | variant="outlined" |
| | | autoComplete="off" |
| | | error={Boolean(errors.newPassword)} |
| | | helperText={errors.newPassword?.message || ""} |
| | | InputProps={{ |
| | | endAdornment: ( |
| | | <InputAdornment position="end"> |
| | | <IconButton |
| | | aria-label="toggle password visibility" |
| | | onClick={() => setShowNewPassword((show) => !show)} |
| | | onMouseDown={(event) => { event.preventDefault() }} |
| | | edge="end" |
| | | > |
| | | {showNewPassword ? <VisibilityOff /> : <Visibility />} |
| | | </IconButton> |
| | | </InputAdornment> |
| | | ), |
| | | }} |
| | | /> |
| | | )} |
| | | /> |
| | | <Controller |
| | | name="confirmPassword" |
| | | control={control} |
| | | defaultValue="" |
| | | rules={{ |
| | | required: translate('ra.validation.required'), |
| | | validate: value => |
| | | value === newPasswordVal || translate('page.settings.resetPwd.tip.pwdNotMatch'), |
| | | }} |
| | | render={({ field, fieldState: { error } }) => ( |
| | | <TextField |
| | | {...field} |
| | | label={translate('page.settings.resetPwd.confirmNewPwd')} |
| | | type={showNewPassword ? 'text' : 'password'} |
| | | variant="outlined" |
| | | autoComplete="off" |
| | | error={Boolean(errors.confirmPassword)} |
| | | helperText={errors.confirmPassword?.message || ""} |
| | | InputProps={{ |
| | | endAdornment: ( |
| | | <InputAdornment position="end"> |
| | | <IconButton |
| | | aria-label="toggle password visibility" |
| | | onClick={() => setShowNewPassword((show) => !show)} |
| | | onMouseDown={(event) => { event.preventDefault() }} |
| | | edge="end" |
| | | > |
| | | {showNewPassword ? <VisibilityOff /> : <Visibility />} |
| | | </IconButton> |
| | | </InputAdornment> |
| | | ), |
| | | }} |
| | | /> |
| | | )} |
| | | /> |
| | | <Button |
| | | type="submit" |
| | | variant="contained" |
| | | disabled={loading || !(oldPasswordVal && newPasswordVal && confirmPasswordVal)} |
| | | sx={{ |
| | | alignSelf: 'flex-start', |
| | | width: '120px' |
| | | }} |
| | | > |
| | | {loading && <CircularProgress size={25} thickness={2} />} |
| | | {translate('page.settings.resetPwd.resetBtn')} |
| | | </Button> |
| | | </Stack> |
| | | </form> |
| | | |
| | | </Box> |
| | | ) |
| | | } |
| | | |
| | | export default SecuritySettings; |
| New file |
| | |
| | | import React, { useState, useRef, useEffect, useMemo } from "react"; |
| | | import { useNavigate } from 'react-router-dom'; |
| | | import { |
| | | useTranslate, |
| | | useAuthProvider, |
| | | } from 'react-admin'; |
| | | import { useWatch, useFormContext } from "react-hook-form"; |
| | | import { Stack, Grid, Box, Typography, Card, CardContent, Tabs, Tab, useTheme } from '@mui/material'; |
| | | import * as Common from '@/utils/common'; |
| | | import BaseSettings from "./BaseSettings"; |
| | | import SecuritySettings from "./SecuritySettings" |
| | | import { queryUserInfo } from '@/api/auth'; |
| | | |
| | | const Index = () => { |
| | | const authProvider = useAuthProvider(); |
| | | const navigate = useNavigate(); |
| | | const translate = useTranslate(); |
| | | const theme = useTheme(); |
| | | |
| | | const [value, setValue] = useState(0); |
| | | const [userInfo, setUserInfo] = useState(null); |
| | | |
| | | useEffect(() => { |
| | | authProvider.checkAuth().catch(() => { |
| | | navigate('/login'); |
| | | }); |
| | | }, [authProvider, navigate]); |
| | | |
| | | useEffect(() => { |
| | | queryUserInfo().then(res => { |
| | | setUserInfo(res); |
| | | }) |
| | | }, []); |
| | | |
| | | return ( |
| | | <> |
| | | <Card sx={{ backgroundColor: 'initial' }}> |
| | | <CardContent > |
| | | <Box |
| | | mt={2} |
| | | sx={{ |
| | | flexGrow: 1, |
| | | bgcolor: 'background.paper', |
| | | display: 'flex', |
| | | border: `1px solid #${theme.palette.mode === 'light' ? 'ddd' : '333'}`, |
| | | borderRadius: 2, |
| | | pt: 1, |
| | | pb: 1, |
| | | }} |
| | | > |
| | | <Tabs |
| | | orientation="vertical" |
| | | variant="scrollable" |
| | | value={value} |
| | | onChange={(event, newValue) => { |
| | | setValue(newValue); |
| | | }} |
| | | indicatorColor="primary" |
| | | textColor="inherit" |
| | | TabIndicatorProps={{ |
| | | style: { |
| | | left: 0, |
| | | right: 'auto', |
| | | width: '5px', |
| | | borderRadius: '2px', |
| | | opacity: .8, |
| | | } |
| | | }} |
| | | sx={{ |
| | | borderRight: 1, |
| | | borderColor: 'divider', |
| | | width: 150, |
| | | }} |
| | | > |
| | | <Tab |
| | | label={translate('settings.base')} |
| | | id='vertical-tab-0' |
| | | aria-controls='vertical-tabpanel-0' |
| | | /> |
| | | <Tab label={translate('settings.security')} |
| | | id='vertical-tab-1' |
| | | aria-controls='vertical-tabpanel-1' |
| | | /> |
| | | </Tabs> |
| | | |
| | | {value === 0 && ( |
| | | <BaseSettings |
| | | value={value} |
| | | userInfo={userInfo} |
| | | /> |
| | | )} |
| | | {value === 1 && ( |
| | | <SecuritySettings |
| | | value={value} |
| | | userInfo={userInfo} |
| | | /> |
| | | )} |
| | | |
| | | </Box> |
| | | </CardContent> |
| | | </Card> |
| | | </> |
| | | ) |
| | | } |
| | | |
| | | export default Index; |
| | |
| | | ); |
| | | for (Sta sta : list) { |
| | | resultList.add(new ConveyorQueryResult(sta.getStaNo() |
| | | , staService.hasWorkingAgv(sta.getId()))); |
| | | , !staService.hasWorkingAgv(sta.getId()))); |
| | | } |
| | | } else { |
| | | for (String staNo : staNos) { |
| | |
| | | continue; |
| | | } |
| | | resultList.add(new ConveyorQueryResult(staNo |
| | | , staService.hasWorkingAgv(sta.getId()))); |
| | | , !staService.hasWorkingAgv(sta.getId()))); |
| | | } |
| | | } |
| | | |
| | |
| | | @Resource |
| | | private TenantService tenantService; |
| | | |
| | | @GetMapping("/system/info") |
| | | public R systemInfo() { |
| | | SystemInfoVo infoVo = new SystemInfoVo(); |
| | | infoVo.setName(configProperties.getSystemName()); |
| | | infoVo.setVersion(configProperties.getSystemVersion()); |
| | | infoVo.setMode(configProperties.getSystemMode().toString()); |
| | | return R.ok(infoVo); |
| | | } |
| | | |
| | | @PostMapping("/login") |
| | | public R login(@RequestBody LoginParam param, HttpServletRequest request) { |
| | | // System.out.println(userService.encodePassword("123456")); |
| | |
| | | return R.ok("Sign In Success").add(new LoginResult(accessToken, user)); |
| | | } |
| | | |
| | | @GetMapping("/auth/user") |
| | | public R userInfo() { |
| | | return R.ok(userService.getByIdRel(getLoginUserId())); |
| | | } |
| | | |
| | | @GetMapping("/auth/menu") |
| | | public R userMenu() { |
| | | List<Menu> menus = roleMenuService.listMenuByUserId(getLoginUserId(), Menu.TYPE_MENU); |
| | |
| | | return R.ok().add(Utils.toTreeData(voList, 0L, MenuVo::getParentId, MenuVo::getId, MenuVo::setChildren)); |
| | | } |
| | | |
| | | @PreAuthorize("hasAuthority('sys:auth:user')") |
| | | @OperationLog |
| | | @PutMapping("/auth/user") |
| | | @GetMapping("/auth/user") |
| | | public R userInfo() { |
| | | User user = userService.getById(getLoginUserId()); |
| | | return R.ok(userService.setUserAuthInfo(user)); |
| | | } |
| | | |
| | | @OperationLog("Update UserInfo") |
| | | @PostMapping("/auth/user") |
| | | public R updateInfo(@RequestBody User user) { |
| | | user.setId(getLoginUserId()); |
| | | // 不能修改的字段 |
| | | user.setUsername(null); |
| | | user.setPassword(null); |
| | | user.setEmailVerified(null); |
| | | user.setTenantId(null); |
| | | user.setStatus(null); |
| | | if (!Cools.isEmpty(user.getEmail())) { |
| | | if (!emailService.isValid(user.getEmail())) { |
| | | return R.parse(BusinessRes.INVALID_EMAIL); |
| | | } |
| | | User one = userService.getByEmail(user.getEmail(), null); |
| | | if (null != one && !one.getId().equals(user.getId())) { |
| | | return R.parse(BusinessRes.EMAIL_EXIT); |
| | | } |
| | | } |
| | | if (userService.updateById(user)) { |
| | | return R.ok().add(userService.getByIdRel(user.getId())); |
| | | return R.ok("Save Success").add(userService.getById(user.getId())); |
| | | } |
| | | return R.error("Save Fail"); |
| | | } |
| | | |
| | | @PreAuthorize("hasAuthority('sys:auth:password')") |
| | | @OperationLog |
| | | @PutMapping("/auth/password") |
| | | public R updatePassword(@RequestBody UpdatePasswordParam param) { |
| | | if (Cools.isEmpty(param.getOldPassword(), param.getPassword())) { |
| | | return R.error("Parameters Cannot Be Empty"); |
| | | @OperationLog("Reset Password") |
| | | @PostMapping("/auth/reset/password") |
| | | public R resetPassword(@RequestBody UpdatePasswordParam param) { |
| | | if (Cools.isEmpty(param.getOldPassword(), param.getNewPassword())) { |
| | | return R.parse(BaseRes.PARAM); |
| | | } |
| | | Long userId = getLoginUserId(); |
| | | if (userId == null) { |
| | | return R.error("Please Login First"); |
| | | } |
| | | if (!userService.comparePassword(userService.getById(userId).getPassword(), param.getOldPassword())) { |
| | | return R.error("The Origin Password Was Incorrect"); |
| | | return R.parse(BusinessRes.INVALID_PASSWORD); |
| | | } |
| | | User user = new User(); |
| | | user.setId(userId); |
| | | user.setPassword(userService.encodePassword(param.getPassword())); |
| | | user.setPassword(userService.encodePassword(param.getNewPassword())); |
| | | if (userService.updateById(user)) { |
| | | return R.ok("Update Success"); |
| | | return R.ok("Reset Password Success"); |
| | | } |
| | | return R.error("Update Fail"); |
| | | return R.error("Reset Password Fail"); |
| | | } |
| | | |
| | | @GetMapping("/system/info") |
| | | public R systemInfo() { |
| | | SystemInfoVo infoVo = new SystemInfoVo(); |
| | | infoVo.setName(configProperties.getSystemName()); |
| | | infoVo.setVersion(configProperties.getSystemVersion()); |
| | | infoVo.setMode(configProperties.getSystemMode().toString()); |
| | | return R.ok(infoVo); |
| | | } |
| | | |
| | | |
| | | |
| | | // ---------------------------------------------------- |
| | | |
| | |
| | | |
| | | String encodePassword(String password); |
| | | |
| | | User setUserAuthInfo(User user); |
| | | |
| | | } |
| | |
| | | return password == null ? null : bCryptPasswordEncoder.encode(password); |
| | | } |
| | | |
| | | @Override |
| | | public User setUserAuthInfo(User user) { |
| | | if (user != null) { |
| | | user.setRoles(userRoleService.listByUserId(user.getId())); |
| | | user.setAuthorities(roleMenuService.listMenuByUserId(user.getId(), null)); |
| | | } |
| | | return user; |
| | | } |
| | | |
| | | } |