diff --git a/web/src/components/table/users/UsersActions.jsx b/web/src/components/table/users/UsersActions.jsx
index 6d6d19c..f8e26e5 100644
--- a/web/src/components/table/users/UsersActions.jsx
+++ b/web/src/components/table/users/UsersActions.jsx
@@ -20,178 +20,29 @@ For commercial licensing, please contact support@quantumnous.com
import React from 'react';
import {
Button,
- InputNumber,
- Modal,
- Select,
- Space,
- Typography,
} from '@douyinfe/semi-ui';
-import { useState } from 'react';
-import { API, showError } from '../../../helpers';
const UsersActions = ({
setShowAddUser,
t,
- studentView,
- studentRewardAmount,
- studentRewardLoading,
- setStudentRewardAmount,
- saveStudentRewardAmount,
- assignStudent,
}) => {
- const [assignVisible, setAssignVisible] = useState(false);
- const [searchingUser, setSearchingUser] = useState(false);
- const [candidateUsers, setCandidateUsers] = useState([]);
- const [selectedUserId, setSelectedUserId] = useState('');
-
- // Add new user
const handleAddUser = () => {
setShowAddUser(true);
};
- const openAssignModal = () => {
- setCandidateUsers([]);
- setSelectedUserId('');
- setAssignVisible(true);
- loadAllUsersForSelect();
- };
-
- const loadAllUsersForSelect = async () => {
- setSearchingUser(true);
- try {
- const all = [];
- let page = 0;
- let total = 0;
- do {
- const res = await API.get(`/api/user/?p=${page}&page_size=100`);
- const { success, message, data } = res.data;
- if (!success) {
- showError(message || t('加载用户失败'));
- return;
- }
- const items = data?.items || [];
- total = data?.total || 0;
- all.push(...items);
- page += 1;
- } while (all.length < total);
- setCandidateUsers(all);
- } catch (error) {
- showError(t('加载用户失败'));
- } finally {
- setSearchingUser(false);
- }
- };
-
- const handleSelectSearch = async (keyword) => {
- const kw = String(keyword || '').trim();
- if (!kw) {
- loadAllUsersForSelect();
- return;
- }
- setSearchingUser(true);
- try {
- const res = await API.get(
- `/api/user/search?keyword=${encodeURIComponent(kw)}&p=0&page_size=50`,
- );
- const { success, message, data } = res.data;
- if (!success) {
- showError(message || t('搜索用户失败'));
- return;
- }
- setCandidateUsers(data?.items || []);
- } catch (error) {
- showError(t('搜索用户失败'));
- } finally {
- setSearchingUser(false);
- }
- };
-
- const handleAssignConfirm = async () => {
- const ok = await assignStudent(selectedUserId);
- if (ok) {
- setAssignVisible(false);
- }
- };
-
return (
<>
- {studentView === 'all' && (
-
- )}
-
- {studentView === 'students' && (
- <>
-
-
- {t('赠送金额')}
-
- setStudentRewardAmount(Number(val) || 0)}
- />
-
-
-
- >
- )}
+
-
- setAssignVisible(false)}
- onOk={handleAssignConfirm}
- okText={t('确认')}
- cancelText={t('取消')}
- confirmLoading={searchingUser}
- >
-
-
-
- {t('选择用户')}
-
-
-
-
>
);
};
-export default UsersActions;
+export default UsersActions;
\ No newline at end of file
diff --git a/web/src/components/table/users/UsersColumnDefs.jsx b/web/src/components/table/users/UsersColumnDefs.jsx
index 39e1aee..b9fbd50 100644
--- a/web/src/components/table/users/UsersColumnDefs.jsx
+++ b/web/src/components/table/users/UsersColumnDefs.jsx
@@ -287,7 +287,6 @@ const renderOperations = (
showResetTwoFAModal,
showUserSubscriptionsModal,
manageUser,
- studentView,
t,
},
) => {
@@ -295,28 +294,6 @@ const renderOperations = (
return <>>;
}
- if (studentView === 'pending') {
- return (
-
-
-
-
- );
- }
-
const moreMenu = [
{
node: 'item',
@@ -339,38 +316,6 @@ const renderOperations = (
{
node: 'divider',
},
- ...(record.student_status === 1
- ? [
- {
- node: 'item',
- name: t('通过学员'),
- onClick: () => manageUser(record.id, 'approve_student', record),
- },
- {
- node: 'item',
- name: t('拒绝学员'),
- type: 'danger',
- onClick: () => manageUser(record.id, 'reject_student', record),
- },
- {
- node: 'divider',
- },
- ]
- : []),
- ...((record.is_student === 1 || record.is_student === true) &&
- record.role < USER_ROLES.ADMIN
- ? [
- {
- node: 'item',
- name: t('撤销学员'),
- type: 'danger',
- onClick: () => manageUser(record.id, 'unset_student', record),
- },
- {
- node: 'divider',
- },
- ]
- : []),
{
node: 'item',
@@ -469,7 +414,6 @@ export const getUsersColumns = ({
showResetTwoFAModal,
showUserSubscriptionsModal,
manageUser,
- studentView,
}) => {
return [
{
@@ -582,7 +526,6 @@ export const getUsersColumns = ({
showResetTwoFAModal,
showUserSubscriptionsModal,
manageUser,
- studentView,
t,
}),
},
diff --git a/web/src/components/table/users/UsersTable.jsx b/web/src/components/table/users/UsersTable.jsx
index ef1df14..bb0f3ba 100644
--- a/web/src/components/table/users/UsersTable.jsx
+++ b/web/src/components/table/users/UsersTable.jsx
@@ -142,7 +142,6 @@ const UsersTable = (usersData) => {
showResetTwoFAModal: showResetTwoFAUserModal,
showUserSubscriptionsModal: showUserSubscriptionsUserModal,
manageUser,
- studentView: usersData.studentView,
});
}, [
t,
@@ -156,7 +155,6 @@ const UsersTable = (usersData) => {
showResetTwoFAUserModal,
showUserSubscriptionsUserModal,
manageUser,
- usersData.studentView,
]);
// Handle compact mode by removing fixed positioning
diff --git a/web/src/components/table/users/index.jsx b/web/src/components/table/users/index.jsx
index 61db05d..6c42d68 100644
--- a/web/src/components/table/users/index.jsx
+++ b/web/src/components/table/users/index.jsx
@@ -59,13 +59,6 @@ const UsersPage = () => {
// Description state
compactMode,
setCompactMode,
- studentView,
- setStudentView,
- studentRewardAmount,
- studentRewardLoading,
- setStudentRewardAmount,
- saveStudentRewardAmount,
- assignStudent,
// Translation
t,
@@ -74,14 +67,8 @@ const UsersPage = () => {
return (
<>
- setStudentView(key)}
- >
+
-
-
{
setShowAddUser={setShowAddUser}
t={t}
users={usersData.users}
- studentView={studentView}
- studentRewardAmount={studentRewardAmount}
- studentRewardLoading={studentRewardLoading}
- setStudentRewardAmount={setStudentRewardAmount}
- saveStudentRewardAmount={saveStudentRewardAmount}
- assignStudent={assignStudent}
/>
{
const [activePage, setActivePage] = useState(1);
const [pageSize, setPageSize] = useState(ITEMS_PER_PAGE);
const [searching, setSearching] = useState(false);
- const [studentView, setStudentView] = useState('all');
- const [studentRewardAmount, setStudentRewardAmount] = useState(0);
- const [studentRewardLoading, setStudentRewardLoading] = useState(false);
const [groupOptions, setGroupOptions] = useState([]);
const [userCount, setUserCount] = useState(0);
const [tagOptions, setTagOptions] = useState([]);
@@ -95,14 +92,11 @@ export const useUsersData = () => {
// Load users data
const loadUsers = async (startIdx, pageSize, tag = null) => {
setLoading(true);
- const viewQuery =
- studentView && studentView !== 'all'
- ? `&student_view=${encodeURIComponent(studentView)}`
- : '';
+
const tagFilter = tag || selectedTag;
const tagQuery = tagFilter ? `&tag=${encodeURIComponent(tagFilter)}` : '';
const res = await API.get(
- `/api/user/?p=${startIdx}&page_size=${pageSize}${viewQuery}${tagQuery}`,
+ `/api/user/?p=${startIdx}&page_size=${pageSize}${tagQuery}`,
);
const { success, message, data } = res.data;
if (success) {
@@ -140,7 +134,7 @@ export const useUsersData = () => {
setSearching(true);
const tagQuery = (searchTag || selectedTag) ? `&tag=${encodeURIComponent(searchTag || selectedTag)}` : '';
const res = await API.get(
- `/api/user/search?keyword=${searchKeyword}&group=${searchGroup}&student_view=${encodeURIComponent(studentView)}${tagQuery}&p=${startIdx}&page_size=${pageSize}`,
+ `/api/user/search?keyword=${searchKeyword}&group=${searchGroup}${tagQuery}&p=${startIdx}&page_size=${pageSize}`,
);
const { success, message, data } = res.data;
if (success) {
@@ -195,99 +189,10 @@ export const useUsersData = () => {
setLoading(false);
};
- const assignStudent = async (userId, rewardAmount) => {
- const uid = parseInt(String(userId), 10);
- if (!Number.isFinite(uid) || uid <= 0) {
- showError(t('请输入正确的用户ID'));
- return false;
- }
- const finalRewardAmount =
- rewardAmount === undefined || rewardAmount === null || rewardAmount === ''
- ? studentRewardAmount
- : Number(rewardAmount) || 0;
- const rewardQuota = Math.max(0, usdToQuota(finalRewardAmount));
- setLoading(true);
- try {
- const res = await API.post('/api/user/manage', {
- id: uid,
- action: 'set_student',
- reward_quota: rewardQuota,
- });
- const { success, message } = res.data;
- if (!success) {
- showError(message || t('操作失败,请重试'));
- return false;
- }
- showSuccess(t('已指定用户为学员'));
- await refresh(1);
- return true;
- } catch (error) {
- showError(t('操作失败,请重试'));
- return false;
- } finally {
- setLoading(false);
- }
- };
-
- const loadStudentRewardAmount = async () => {
- setStudentRewardLoading(true);
- try {
- const res = await API.get('/api/option/');
- const { success, data, message } = res.data;
- if (!success) {
- showError(message || t('加载赠送额度失败'));
- return;
- }
- const option = (data || []).find(
- (item) => item.key === 'StudentApprovalRewardQuota',
- );
- const quotaVal = parseInt(String(option?.value ?? '0'), 10);
- if (Number.isFinite(quotaVal) && quotaVal >= 0) {
- setStudentRewardAmount(quotaToUsd(quotaVal));
- } else {
- setStudentRewardAmount(0);
- }
- } catch (error) {
- showError(t('加载赠送额度失败'));
- } finally {
- setStudentRewardLoading(false);
- }
- };
-
- const saveStudentRewardAmount = async (rewardAmount) => {
- const rewardQuota = Math.max(0, usdToQuota(Number(rewardAmount) || 0));
- setStudentRewardLoading(true);
- try {
- const res = await API.put('/api/option/', {
- key: 'StudentApprovalRewardQuota',
- value: String(rewardQuota),
- });
- const { success, message } = res.data;
- if (!success) {
- showError(message || t('保存赠送额度失败'));
- return false;
- }
- setStudentRewardAmount(Number(rewardAmount) || 0);
- showSuccess(t('赠送额度已保存'));
- return true;
- } catch (error) {
- showError(t('保存赠送额度失败'));
- return false;
- } finally {
- setStudentRewardLoading(false);
- }
- };
-
- const handleStudentViewChange = (nextView) => {
- setStudentView(nextView);
- setActivePage(1);
- const { searchKeyword, searchGroup, searchTag } = getFormValues();
- if (searchKeyword === '' && searchGroup === '' && !searchTag && !selectedTag) {
- loadUsers(0, pageSize).then();
- } else {
- searchUsers(0, pageSize, searchKeyword, searchGroup, searchTag).then();
- }
- };
+
+
+
+
const resetUserPasskey = async (user) => {
if (!user) {
@@ -429,13 +334,8 @@ export const useUsersData = () => {
});
fetchGroups().then();
fetchUserTags().then();
- }, [studentView]);
+ }, []);
- useEffect(() => {
- if (studentView === 'students') {
- loadStudentRewardAmount().then();
- }
- }, [studentView]);
return {
// Data state
@@ -445,9 +345,6 @@ export const useUsersData = () => {
pageSize,
userCount,
searching,
- studentView,
- studentRewardAmount,
- studentRewardLoading,
groupOptions,
tagOptions,
selectedTag,
@@ -470,15 +367,11 @@ export const useUsersData = () => {
// UI state
compactMode,
setCompactMode,
- setStudentView: handleStudentViewChange,
// Actions
loadUsers,
searchUsers,
manageUser,
- assignStudent,
- setStudentRewardAmount,
- saveStudentRewardAmount,
resetUserPasskey,
resetUserTwoFA,
handlePageChange,