2021-06-07

这个博客展示了如何使用React、Redux和Ant Design创建一个用户列表管理组件。它包括获取用户、角色和区域数据,表格展示,以及增删改查功能。通过Modal组件处理用户编辑和删除操作,同时涉及表单验证和状态管理。

userlist

import React, { useEffect, useState } from 'react'
import { connect } from 'react-redux'
import { getUserListAction, delUserListAction, addUserListAction, getRoleListAction, editUserListAction, getRegionsAction } from '../../../redux/ActionCreator/UserListAction'
// import http from '../../../util/http';
import { Table, Button, Switch, Modal, Form, Select, Input } from 'antd';
import { DeleteOutlined, EditOutlined, ExclamationCircleOutlined } from '@ant-design/icons';

const { Option } = Select;

function UserList (props) {

  /**模态框配置**/
  const [visibleModal, setVisibleModal] = useState(false)
  const [currentId, setcurrentId] = useState()
  const [title, seTtitle] = useState("")
  const [form] = Form.useForm();

  //  取 users 列表数据
  // const { rolelist } = props
  useEffect(() => {
    props.getUserListAction() // 通过react-redux action 异步获取数据
  }, [])

  //  取 角色 列表数据
  useEffect(() => {
    props.getRoleListAction() // 通过react-redux action 异步获取数据
  }, [])

  // 取区域regions数据
  useEffect(() => {
    props.getRegionsAction()
  }, [])

  const columns = [
    {
      title: '区域',
      dataIndex: 'region',
      render: (region) => {
        return <b>{region === "" ? "全球" : region}</b>
      }
    },
    {
      title: '角色名称',
      dataIndex: 'role',
      render: (role) => {
        return <div>{role ? role.roleName : ''}</div>
      }
    },
    {
      title: '用户名',
      dataIndex: 'username'
    },
    {
      title: '用户状态',
      render: (item) => {
        return <Switch checked={item.roleState} disabled={item.default} onChange={(switchChecked) => {

        }}>

        </Switch>
      }
    },
    {
      title: "操作",
      render: (item) => {
        return <div>
          <Button shape="circle" icon={<DeleteOutlined />} danger onClick={() => handleDelete(item)} disabled={item.default} />
          <Button shape="circle" type="primary" icon={<EditOutlined />} disabled={item.default} onClick={() => handleEdit(item)} />
        </div>
      }
    }
  ];

  /**=========================模态框form处理开始===================**/

  // 初始化form 数据
  const initFormData = (item) => {
    if (item.id) { // 编辑用户 对表单进行数据回显
      form.setFieldsValue({ username: item.username })
      form.setFieldsValue({ password: item.password });
      form.setFieldsValue({ region: item.region === "" ? "全球" : item.region });
      form.setFieldsValue({ roleId: item.roleId });
    } else { // 添加用户 
      form.resetFields()  // 重置表单
    }
  }

  //编辑
  const handleEdit = (item) => { //  item 点击那一行的对象
    seTtitle("编辑用户")
    setcurrentId(item.id)
    setVisibleModal(true)
    initFormData(item)
  }

  // 弹出框点击确认触发
  const handleModalOk = () => {
    form.validateFields() // 触发校验,成功走.then,失败.catch
      .then(values => {
        form.resetFields(); // 重置表单
        setVisibleModal(false) // 隐藏model
        if (title === '添加用户') {
          props.addUserListAction(values)
        } else { // 编辑用户
          props.editUserListAction(currentId, values)
        }
      }).catch(err => {
        console.log('Validate Failed:', err);
      })
  }

  // 弹出框点击取消触发
  const handleModalCancel = () => {
    setVisibleModal(false)
  }

  // 删除
  const handleDelete = (item) => {
    Modal.confirm({
      icon: <ExclamationCircleOutlined />,
      content: '是否删除用户',
      okText: '确认',
      cancelText: '取消',
      onOk: () => { // 点击确认调用 delUserListAction
        props.delUserListAction(item)
      }
    });
  }

  return (
    <div>
      <div>
        <Button type="primary"
          style={{ marginBottom: "10px" }}
          onClick={() => {
            seTtitle("添加用户")
            setVisibleModal(true)
            initFormData({})
          }} > 添加用户</Button>

        {/* 模态框 */}
        <Modal
          title={title}
          visible={visibleModal}
          onOk={handleModalOk}
          onCancel={handleModalCancel}
          okText="确认"
          cancelText="取消"
        >
          <Form
            form={form}
            layout="vertical"
            name="form_in_modal"
          >
            <Form.Item
              name="username"
              label="用户名"
              rules={[{ required: true, message: 'Please input the title of collection!' }]}
            >
              <Input />
            </Form.Item>
            <Form.Item
              name="password"
              label="密码"
              rules={[{ required: true, message: 'Please input the title of collection!' }]}
            >
              <Input type="password" />
            </Form.Item>
            <Form.Item
              name="region"
              label="区域"
              rules={[{ required: true, message: 'Please input the title of collection!' }]}
            >
              <Select>
                {
                  props.regionList.map(item =>
                    <Option value={item.value} key={item.id}>{item.title}</Option>
                  )
                }
              </Select>
            </Form.Item>
            <Form.Item
              name="roleId"
              label="角色"
              rules={[{ required: true, message: 'Please input the title of collection!' }]}
            >
              <Select>
                {
                  props.rolelist.map(item =>
                    <Option value={item.id} key={item.id}>{item.roleName}</Option>
                  )
                }
              </Select>
            </Form.Item>
          </Form>
        </Modal>

        <Table dataSource={props.dataSource}
          columns={columns}
          rowKey={(item) => item.id}
          pagination={ // 分页器
            {
              pageSize: 10
            }
          }
        />
      </div>
    </div>
  )
}

const mapStateToProps = (state) => { // 映射状态到属性(state  store中的状态)
  return {
    dataSource: state.UserlistReducer.datalist,
    rolelist: state.UserlistReducer.rolelist,
    regionList: state.UserlistReducer.regionList
  }
}

const mapStateToDispatch = { // 通过connect dispatch(UserList) 
  getUserListAction,
  addUserListAction,
  editUserListAction,
  delUserListAction,
  getRoleListAction,
  getRegionsAction
}

export default connect(mapStateToProps, mapStateToDispatch)(UserList)

action

import http from "../../util/http"

//获取user 列表数据
function getUserListAction () {
  return http.get("/users?_expand=role").then(res => {
    // console.log(res.data)
    return {
      type: "get_list",
      payload: res.data
    }
  }) // 返回的是一个promise对象
}

//获取role 列表数据
function getRoleListAction () {
  return http.get("/roles").then(res => {
    // console.log(res.data)
    return {
      type: "get_role_list",
      payload: res.data
    }
  }) // 返回的是一个promise对象
}

//获取 region 列表数据
function getRegionsAction () {
  return http.get("/regions").then(res => {
    return {
      type: "get_regions_list",
      payload: res.data
    }
  })
}

// 添加用户
function addUserListAction (values) {
  return http.post("/users", {
    ...values,
    "roleState": true,
    "default": false
  }).then(res => {
    // 新增数据需要对状态重新赋值,改变状态在UserListReducer中进行
    return {
      type: "add_list",
      payload: res.data
    }
  })
}

// 编辑用户
function editUserListAction (currentId, values) {
  console.log(currentId);
  // return http.patch(`/users/${currentId}`, values).then(res => {
  //   return {
  //     type: "edit_list",
  //     payload: res.data
  //   }
  // })

  // http.patch(`/users/${currentId}`, values).then(res => {
  //   console.log(res.data);
  //   // 追加role 字段
  //   //1. 因为datasource数组里的每一个元素对象里都又role属性
  //   //2. res.data返回的是用户对象(即数据库里存储的用户对象),该对象里没有role属性
  //   let obj = res.data
  //   obj.role = roleList.filter(item => item.id === res.data.roleId)[0]
  //   setDataSource(dataSource.map(item => {
  //     if (item.id === currentId) {
  //       return { ...item, ...obj }
  //     }
  //     return item
  //   }))
  // })
}

// 删除用户
function delUserListAction (item) {
  return http.delete(`/users/${item.id}`).then(res => {
    return {
      type: "del_list",
      payload: res.data
    }
  })
  // http.delete(`/users/${item.id}`).then(res => {
  //   var list = dataSource.filter(data => item.id !== data.id)
  //   setDataSource(list)
  // })
}

export { getUserListAction, delUserListAction, addUserListAction, editUserListAction, getRoleListAction, getRegionsAction }

reducer

const UserlistReducer = (prevState = {
  datalist: [], // 
  rolelist: [], // 角色
  regionList: [] // 区域
}, action) => {
  let newState = { ...prevState } // 深复制,后期只能改newState
  // 改变状态
  let { type, payload } = action
  switch (type) { // type从dispatch 中传入
    // ---- 获取数据 -----
    case "get_list":
      // newState = {}
      // console.log(newState);
      newState.datalist = payload
      return newState

    case "get_role_list":
      newState.rolelist = payload
      return newState

    case "get_regions_list":
      // console.log(payload);
      newState.regionList = payload
      return newState

    //---- 添加用户 ----
    case "add_list":
      // payload === res.data
      // 重新post 的没有 role 属性, 需要添加 role 字段
      payload.role = newState.rolelist.filter(item => item.id === payload.roleId)[0]
      newState.datalist = [...newState.datalist, payload]
      return newState

    //---- 编辑用户 ----
    case "edit_list":
      let a = newState.datalist.map(item => {
        if (item.id === payload.id) {
          item = payload
        }
        return item
      })
      newState.rolelist = a
      return newState

    //---- 删除用户 ----
    case "del_list":
      // console.log(newState);
      // newState = {}
      // console.log(newState);
      var list = newState.datalist.filter(data => payload.id !== data.id)
      newState.datalist = list
      return newState

    default:
      return prevState // 默认没改的 return 老状态
  }
}

export default UserlistReducer
AI 代码审查Review工具 是一个旨在自动化代码审查流程的工具。它通过集成版本控制系统(如 GitHub 和 GitLab)的 Webhook,利用大型语言模型(LLM)对代码变更进行分析,并将审查意见反馈到相应的 Pull Request 或 Merge Request 中。此外,它还支持将审查结果通知到企业微信等通讯工具。 一个基于 LLM 的自动化代码审查助手。通过 GitHub/GitLab Webhook 监听 PR/MR 变更,调用 AI 分析代码,并将审查意见自动评论到 PR/MR,同时支持多种通知渠道。 主要功能 多平台支持: 集成 GitHub 和 GitLab Webhook,监听 Pull Request / Merge Request 事件。 智能审查模式: 详细审查 (/github_webhook, /gitlab_webhook): AI 对每个变更文件进行分析,旨在找出具体问题。审查意见会以结构化的形式(例如,定位到特定代码行、问题分类、严重程度、分析和建议)逐条评论到 PR/MR。AI 模型会输出 JSON 格式的分析结果,系统再将其转换为多条独立的评论。 通用审查 (/github_webhook_general, /gitlab_webhook_general): AI 对每个变更文件进行整体性分析,并为每个文件生成一个 Markdown 格式的总结性评论。 自动化流程: 自动将 AI 审查意见(详细模式下为多条,通用模式下为每个文件一条)发布到 PR/MR。 在所有文件审查完毕后,自动在 PR/MR 中发布一条总结性评论。 即便 AI 未发现任何值得报告的问题,也会发布相应的友好提示和总结评论。 异步处理审查任务,快速响应 Webhook。 通过 Redis 防止对同一 Commit 的重复审查。 灵活配置: 通过环境变量设置基
【直流微电网】径向直流微电网的状态空间建模与线性化:一种耦合DC-DC变换器状态空间平均模型的方法 (Matlab代码实现)内容概要:本文介绍了径向直流微电网的状态空间建模与线性化方法,重点提出了一种基于耦合DC-DC变换器的状态空间平均模型的建模策略。该方法通过数学建模手段对直流微电网系统进行精确的状态空间描述,并对其进行线性化处理,以便于系统稳定性分析与控制器设计。文中结合Matlab代码实现,展示了建模与仿真过程,有助于研究人员理解和复现相关技术,推动直流微电网系统的动态性能研究与工程应用。; 适合人群:具备电力电子、电力系统或自动化等相关背景,熟悉Matlab/Simulink仿真工具,从事新能源、微电网或智能电网研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①掌握直流微电网的动态建模方法;②学习DC-DC变换器在耦合条件下的状态空间平均建模技巧;③实现系统的线性化分析并支持后续控制器设计(如电压稳定控制、功率分配等);④为科研论文撰写、项目仿真验证提供技术支持与代码参考。; 阅读建议:建议读者结合Matlab代码逐步实践建模流程,重点关注状态变量选取、平均化处理和线性化推导过程,同时可扩展应用于更复杂的直流微电网拓扑结构中,提升系统分析与设计能力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值