Просмотр исходного кода

用户管理页新增分组查询

iszcz 1 год назад
Родитель
Сommit
79cf70683f
3 измененных файлов с 95 добавлено и 36 удалено
  1. 2 1
      controller/user.go
  2. 30 21
      model/user.go
  3. 63 14
      web/src/components/UsersTable.js

+ 2 - 1
controller/user.go

@@ -216,7 +216,8 @@ func GetAllUsers(c *gin.Context) {
 
 
 func SearchUsers(c *gin.Context) {
 func SearchUsers(c *gin.Context) {
 	keyword := c.Query("keyword")
 	keyword := c.Query("keyword")
-	users, err := model.SearchUsers(keyword)
+	group := c.Query("group")
+	users, err := model.SearchUsers(keyword, group)
 	if err != nil {
 	if err != nil {
 		c.JSON(http.StatusOK, gin.H{
 		c.JSON(http.StatusOK, gin.H{
 			"success": false,
 			"success": false,

+ 30 - 21
model/user.go

@@ -73,27 +73,36 @@ func GetAllUsers(startIdx int, num int) (users []*User, err error) {
 	return users, err
 	return users, err
 }
 }
 
 
-func SearchUsers(keyword string) ([]*User, error) {
-	var users []*User
-	var err error
-
-	// 尝试将关键字转换为整数ID
-	keywordInt, err := strconv.Atoi(keyword)
-	if err == nil {
-		// 如果转换成功,按照ID搜索用户
-		err = DB.Unscoped().Omit("password").Where("id = ?", keywordInt).Find(&users).Error
-		if err != nil || len(users) > 0 {
-			// 如果依据ID找到用户或者发生错误,返回结果或错误
-			return users, err
-		}
-	}
-
-	// 如果ID转换失败或者没有找到用户,依据其他字段进行模糊搜索
-	err = DB.Unscoped().Omit("password").
-		Where("username LIKE ? OR email LIKE ? OR display_name LIKE ?", keyword+"%", keyword+"%", keyword+"%").
-		Find(&users).Error
-
-	return users, err
+func SearchUsers(keyword string, group string) ([]*User, error) {
+    var users []*User
+    var err error
+
+    // 尝试将关键字转换为整数ID
+    keywordInt, err := strconv.Atoi(keyword)
+    if err == nil {
+        // 如果转换成功,按照ID和可选的组别搜索用户
+        query := DB.Unscoped().Omit("password").Where("`id` = ?", keywordInt)
+        if group != "" {
+            query = query.Where("`group` = ?", group)  // 使用反引号包围group
+        }
+        err = query.Find(&users).Error
+        if err != nil || len(users) > 0 {
+            return users, err
+        }
+    }
+
+    err = nil
+
+    query := DB.Unscoped().Omit("password")
+    likeCondition := "`username` LIKE ? OR `email` LIKE ? OR `display_name` LIKE ?"
+    if group != "" {
+        query = query.Where("("+likeCondition+") AND `group` = ?", "%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%", group)
+    } else {
+        query = query.Where(likeCondition, "%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%")
+    }
+    err = query.Find(&users).Error
+
+    return users, err
 }
 }
 
 
 func GetUserById(id int, selectAll bool) (*User, error) {
 func GetUserById(id int, selectAll bool) (*User, error) {

+ 63 - 14
web/src/components/UsersTable.js

@@ -235,6 +235,8 @@ const UsersTable = () => {
   const [activePage, setActivePage] = useState(1);
   const [activePage, setActivePage] = useState(1);
   const [searchKeyword, setSearchKeyword] = useState('');
   const [searchKeyword, setSearchKeyword] = useState('');
   const [searching, setSearching] = useState(false);
   const [searching, setSearching] = useState(false);
+  const [searchGroup, setSearchGroup] = useState('');
+  const [groupOptions, setGroupOptions] = useState([]);
   const [userCount, setUserCount] = useState(ITEMS_PER_PAGE);
   const [userCount, setUserCount] = useState(ITEMS_PER_PAGE);
   const [showAddUser, setShowAddUser] = useState(false);
   const [showAddUser, setShowAddUser] = useState(false);
   const [showEditUser, setShowEditUser] = useState(false);
   const [showEditUser, setShowEditUser] = useState(false);
@@ -298,6 +300,7 @@ const UsersTable = () => {
       .catch((reason) => {
       .catch((reason) => {
         showError(reason);
         showError(reason);
       });
       });
+    fetchGroups().then();
   }, []);
   }, []);
 
 
   const manageUser = async (username, action, record) => {
   const manageUser = async (username, action, record) => {
@@ -340,15 +343,15 @@ const UsersTable = () => {
     }
     }
   };
   };
 
 
-  const searchUsers = async () => {
-    if (searchKeyword === '') {
+  const searchUsers = async (searchKeyword, searchGroup) => {
+    if (searchKeyword === '' && searchGroup === '') {
       // if keyword is blank, load files instead.
       // if keyword is blank, load files instead.
       await loadUsers(0);
       await loadUsers(0);
       setActivePage(1);
       setActivePage(1);
       return;
       return;
     }
     }
     setSearching(true);
     setSearching(true);
-    const res = await API.get(`/api/user/search?keyword=${searchKeyword}`);
+    const res = await API.get(`/api/user/search?keyword=${searchKeyword}&group=${searchGroup}`);
     const { success, message, data } = res.data;
     const { success, message, data } = res.data;
     if (success) {
     if (success) {
       setUsers(data);
       setUsers(data);
@@ -409,6 +412,25 @@ const UsersTable = () => {
     }
     }
   };
   };
 
 
+  const fetchGroups = async () => {
+    try {
+      let res = await API.get(`/api/group/`);
+      // add 'all' option
+      // res.data.data.unshift('all');
+      if (res === undefined) {
+        return;
+      }
+      setGroupOptions(
+        res.data.data.map((group) => ({
+          label: group,
+          value: group,
+        })),
+      );
+    } catch (error) {
+      showError(error.message);
+    }
+  };
+
   return (
   return (
     <>
     <>
       <AddUser
       <AddUser
@@ -422,17 +444,44 @@ const UsersTable = () => {
         handleClose={closeEditUser}
         handleClose={closeEditUser}
         editingUser={editingUser}
         editingUser={editingUser}
       ></EditUser>
       ></EditUser>
-      <Form onSubmit={searchUsers}>
-        <Form.Input
-          label='搜索关键字'
-          icon='search'
-          field='keyword'
-          iconPosition='left'
-          placeholder='搜索用户的 ID,用户名,显示名称,以及邮箱地址 ...'
-          value={searchKeyword}
-          loading={searching}
-          onChange={(value) => handleKeywordChange(value)}
-        />
+      <Form
+        onSubmit={() => {
+          searchUsers(searchKeyword, searchGroup);
+        }}
+        labelPosition='left'
+      >
+        <div style={{ display: 'flex' }}>
+          <Space>
+          <Form.Input
+            label='搜索关键字'
+            icon='search'
+            field='keyword'
+            iconPosition='left'
+            placeholder='搜索用户的 ID,用户名,显示名称,以及邮箱地址 ...'
+            value={searchKeyword}
+            loading={searching}
+            onChange={(value) => handleKeywordChange(value)}
+          />
+          <Form.Select
+            field='group'
+            label='分组'
+            optionList={groupOptions}
+            onChange={(value) => {
+              setSearchGroup(value);
+              searchUsers(searchKeyword, value);
+            }}
+          />
+          <Button
+            label='查询'
+            type='primary'
+            htmlType='submit'
+            className='btn-margin-right'
+            style={{ marginRight: 8 }}
+          >
+            查询
+          </Button>
+          </Space>
+        </div>
       </Form>
       </Form>
 
 
       <Table
       <Table