同步用户余额由主节点管理,从节点不应允许管理员修改其余额。 前端禁用额度输入和添加额度按钮,后端增加校验拦截。master
| @@ -562,6 +562,10 @@ func UpdateUser(c *gin.Context) { | |||||
| common.ApiError(c, err) | common.ApiError(c, err) | ||||
| return | return | ||||
| } | } | ||||
| if originUser.IsSyncedUser() && originUser.Quota != updatedUser.Quota { | |||||
| common.ApiErrorI18n(c, i18n.MsgSyncedUserQuotaCannotModify) | |||||
| return | |||||
| } | |||||
| myRole := c.GetInt("role") | myRole := c.GetInt("role") | ||||
| if myRole <= originUser.Role && myRole != common.RoleRootUser { | if myRole <= originUser.Role && myRole != common.RoleRootUser { | ||||
| common.ApiErrorI18n(c, i18n.MsgUserNoPermissionHigherLevel) | common.ApiErrorI18n(c, i18n.MsgUserNoPermissionHigherLevel) | ||||
| @@ -78,6 +78,7 @@ const ( | |||||
| MsgUserNoPermissionHigherLevel = "user.no_permission_higher_level" | MsgUserNoPermissionHigherLevel = "user.no_permission_higher_level" | ||||
| MsgUserCannotCreateHigherLevel = "user.cannot_create_higher_level" | MsgUserCannotCreateHigherLevel = "user.cannot_create_higher_level" | ||||
| MsgUserCannotDeleteRootUser = "user.cannot_delete_root_user" | MsgUserCannotDeleteRootUser = "user.cannot_delete_root_user" | ||||
| MsgSyncedUserQuotaCannotModify = "user.synced_user_quota_cannot_modify" | |||||
| MsgUserCannotDisableRootUser = "user.cannot_disable_root_user" | MsgUserCannotDisableRootUser = "user.cannot_disable_root_user" | ||||
| MsgUserCannotDemoteRootUser = "user.cannot_demote_root_user" | MsgUserCannotDemoteRootUser = "user.cannot_demote_root_user" | ||||
| MsgUserAlreadyAdmin = "user.already_admin" | MsgUserAlreadyAdmin = "user.already_admin" | ||||
| @@ -68,6 +68,7 @@ user.no_permission_same_level: "No permission to access users of same or higher | |||||
| user.no_permission_higher_level: "No permission to update users of same or higher permission level" | user.no_permission_higher_level: "No permission to update users of same or higher permission level" | ||||
| user.cannot_create_higher_level: "Cannot create users with permission level equal to or higher than yourself" | user.cannot_create_higher_level: "Cannot create users with permission level equal to or higher than yourself" | ||||
| user.cannot_delete_root_user: "Cannot delete super administrator account" | user.cannot_delete_root_user: "Cannot delete super administrator account" | ||||
| user.synced_user_quota_cannot_modify: "Synced user quota is managed by the master node and cannot be modified" | |||||
| user.cannot_disable_root_user: "Cannot disable super administrator user" | user.cannot_disable_root_user: "Cannot disable super administrator user" | ||||
| user.cannot_demote_root_user: "Cannot demote super administrator user" | user.cannot_demote_root_user: "Cannot demote super administrator user" | ||||
| user.already_admin: "This user is already an administrator" | user.already_admin: "This user is already an administrator" | ||||
| @@ -69,6 +69,7 @@ user.no_permission_same_level: "无权获取同级或更高等级用户的信息 | |||||
| user.no_permission_higher_level: "无权更新同权限等级或更高权限等级的用户信息" | user.no_permission_higher_level: "无权更新同权限等级或更高权限等级的用户信息" | ||||
| user.cannot_create_higher_level: "无法创建权限大于等于自己的用户" | user.cannot_create_higher_level: "无法创建权限大于等于自己的用户" | ||||
| user.cannot_delete_root_user: "不能删除超级管理员账户" | user.cannot_delete_root_user: "不能删除超级管理员账户" | ||||
| user.synced_user_quota_cannot_modify: "同步用户余额由主节点管理,不可修改" | |||||
| user.cannot_disable_root_user: "无法禁用超级管理员用户" | user.cannot_disable_root_user: "无法禁用超级管理员用户" | ||||
| user.cannot_demote_root_user: "无法降级超级管理员用户" | user.cannot_demote_root_user: "无法降级超级管理员用户" | ||||
| user.already_admin: "该用户已经是管理员" | user.already_admin: "该用户已经是管理员" | ||||
| @@ -69,6 +69,7 @@ user.no_permission_same_level: "無權獲取同級或更高等級使用者的資 | |||||
| user.no_permission_higher_level: "無權更新同權限等級或更高權限等級的使用者資訊" | user.no_permission_higher_level: "無權更新同權限等級或更高權限等級的使用者資訊" | ||||
| user.cannot_create_higher_level: "無法建立權限大於等於自己的使用者" | user.cannot_create_higher_level: "無法建立權限大於等於自己的使用者" | ||||
| user.cannot_delete_root_user: "不能刪除超級管理員帳號" | user.cannot_delete_root_user: "不能刪除超級管理員帳號" | ||||
| user.synced_user_quota_cannot_modify: "同步使用者餘額由主節點管理,不可修改" | |||||
| user.cannot_disable_root_user: "無法禁用超級管理員使用者" | user.cannot_disable_root_user: "無法禁用超級管理員使用者" | ||||
| user.cannot_demote_root_user: "無法降級超級管理員使用者" | user.cannot_demote_root_user: "無法降級超級管理員使用者" | ||||
| user.already_admin: "該使用者已經是管理員" | user.already_admin: "該使用者已經是管理員" | ||||
| @@ -72,6 +72,7 @@ const EditUserModal = (props) => { | |||||
| const [groupOptions, setGroupOptions] = useState([]); | const [groupOptions, setGroupOptions] = useState([]); | ||||
| const [bindingModalVisible, setBindingModalVisible] = useState(false); | const [bindingModalVisible, setBindingModalVisible] = useState(false); | ||||
| const formApiRef = useRef(null); | const formApiRef = useRef(null); | ||||
| const [isSyncedUser, setIsSyncedUser] = useState(false); | |||||
| const isEdit = Boolean(userId); | const isEdit = Boolean(userId); | ||||
| @@ -110,6 +111,7 @@ const EditUserModal = (props) => { | |||||
| const { success, message, data } = res.data; | const { success, message, data } = res.data; | ||||
| if (success) { | if (success) { | ||||
| data.password = ''; | data.password = ''; | ||||
| setIsSyncedUser(data.source === 'synced'); | |||||
| formApiRef.current?.setValues({ ...getInitValues(), ...data }); | formApiRef.current?.setValues({ ...getInitValues(), ...data }); | ||||
| } else { | } else { | ||||
| showError(message); | showError(message); | ||||
| @@ -322,9 +324,10 @@ const EditUserModal = (props) => { | |||||
| label={t('剩余额度')} | label={t('剩余额度')} | ||||
| placeholder={t('请输入新的剩余额度')} | placeholder={t('请输入新的剩余额度')} | ||||
| step={500000} | step={500000} | ||||
| extraText={renderQuotaWithPrompt(values.quota || 0)} | |||||
| extraText={isSyncedUser ? t('同步用户余额由主节点管理,不可修改') : renderQuotaWithPrompt(values.quota || 0)} | |||||
| rules={[{ required: true, message: t('请输入额度') }]} | rules={[{ required: true, message: t('请输入额度') }]} | ||||
| style={{ width: '100%' }} | style={{ width: '100%' }} | ||||
| disabled={isSyncedUser} | |||||
| /> | /> | ||||
| </Col> | </Col> | ||||
| @@ -333,6 +336,7 @@ const EditUserModal = (props) => { | |||||
| <Button | <Button | ||||
| icon={<IconPlus />} | icon={<IconPlus />} | ||||
| onClick={() => setIsModalOpen(true)} | onClick={() => setIsModalOpen(true)} | ||||
| disabled={isSyncedUser} | |||||
| /> | /> | ||||
| </Form.Slot> | </Form.Slot> | ||||
| </Col> | </Col> | ||||