git add .
git commit -m ‘xxx’
git push

安装 node
安装 git

安装: cnpm
npm install -g cnpm —registry=https://registry.npm.taobao.org

安装 : react


    1. 全局安装脚手架一次: cnpm install -g create-react-app <br /> 创建项目 create-react-app myapp<br /> 启动项目 npm start

antd插件:
$ cnpm install antd -S

axios 请求数据
$ cnpm install axios -S

json-server 模拟数据
$ cnpm install json-server -g 全局安装

!!! 出现这个报错时
If you would prefer to ignore this check, add SKIP_PREFLIGHT_CHECK=true to an .env file in your project.
That will permanently disable this message but you might encounter other issues.
在src同级下 创建 .env 然后在里面加 SKIP_PREFLIGHT_CHECK=true 就可以了

连接 仓库地址
$ git remote add origin @创建的项目地址名

解决跨域: 在src 里面加 setupProxy.js

React 项目

git add .

git commit -m ‘xxx’

git push

nodejs 安装 查看这个两个是否安装

全局安装 react 脚手架工具
  1. $ cnpm install -g create-react-app
  2. 创建项目 create-react-app myapp
  3. 启动项目 npm start
  1. npx create-react-app my-app
  2. npx 命令,先检查局部中有没有create-react-app, 如果有, 跟上面一样创建和启动项 如果没有,再检查全局下有没有这个命令, 如果有, 跟上面一样创建和启动项目 如果都没有,自动局部安装 create-react-app ,然后跟上面一样创建和启动项目

这个意思是这个文件里面的东西 git不会管理 的

这个意思是资源包

antd插件
  1. $ cnpm install antd -S

axios请求数据
  1. $ cnpm install axios -S

json-server 模拟数据
  1. $ cnpm install json-server -g 全局安装

axios 增删改查 get post put delet

. 全局安装脚手架一次 cnpm install -g create-react-app

  1. 创建项目 $ create-react-app 项目名字
  2. 运行 $ npm start

!!! 出现这个报错时

  1. If you would prefer to ignore this check, add SKIP_PREFLIGHT_CHECK=true to an .env file in your project.
  2. That will permanently disable this message but you might encounter other issues.

在src同级下 创建 .env 然后在里面加 SKIP_PREFLIGHT_CHECK=true 就可以了

3.连接 仓库地址

git remote add origin git@创建的项目地址名


解决跨域: 在src 里面加 setupProxy.js

页面路由配置:

/login 登录

/DashBoard 里面最大的页面

/DashBoard {

/ 首页

/home 首页

/user-manage 用户管理

/user-manage/users 用户列表

/right-manage 权限管理

/right-manage/roles 角色列表 /right-manage/rights 权限列表

/article-manage 文章管理

/article-manage/list 文章列表 /article-manage/category 文章分类

/notfound 404页面

…..

}

基本逻辑:

1.要做判断路由拦截 是否登入 没登入就跳转到登入 登入就转到 首页

  1. 这里做三目判断 localStorage是否有token 有进跳转到首页 没有就进不去首页
  2. <Route
  3. path="/"
  4. render={() =>
  5. localStorage.getItem("token") ? (
  6. <DashBoard />
  7. ) : (
  8. <Redirect to="/login" />
  9. )
  10. }
  11. />

2.登入页面 背景粒子效果

  1. 这里用的时候要加背景颜色 否则看不到的 如果想设置高度百分百的时候 就要减去5
  2. import Particles from "react-particles-js";
  3. <div>
  4. <Particles height={window.innerHeight - 5} />
  5. </div>

3.下载好了 antd

!!! 切记 要引入 antd 的css样式 最最外面的index.js里

  1. import 'antd/dist/antd.css';

侧边布局

  1. <Menu 这里面只带 onClick onClick={this.handleChangePage} />
  2. //点击 跳转路径
  3. handleChangePage = (obj) => {
  4. console.log(obj)
  5. // 高阶组件提供 这样就可以跳转了
  6. this.props.history.push(obj.key); //key路由对应的路径
  7. };
  8. import { withRouter } from "react-router";
  9. export default withRouter(SideMenu);
  1. !!! 注意这里的写法
  2. onClick={() => {this.setState({
  3. isShow: true,
  4. })
  5. }

点击添加用户:

让模态框出现 然后判断 不能为空 验证表单 然后点击完成的时候 向数据库发一个添加的请求的 把 输入的数据添加到数据库 按个开关的按钮默认是关的 然后setState { datralist : […老数据,res.data新数据]}

  1. // 点击按钮就会显示模态框 isShow默认是false 点击让他变成 true就会显示
  2. onClick={() => {
  3. this.setState({
  4. isShow: true,
  5. });
  6. //点击完成
  7. onOk={this.handleClick}
  8. validateFields() // 这个是验证表单 必须要输入值
  9. this.refs.form.resetFields(); // 验证完重置表单
  10. this.renderTable(values); // 这个是更新数据库 和更新渲染
  11. // 添加到数据库还有渲染
  12. axios.post(`http://localhost:5000/users`,
  13. // 这个是添加到 数据库
  14. axios
  15. .post(`http://localhost:5000/users`, {
  16. username,
  17. password,
  18. roleType,
  19. roleState: false, // 这个是那个开关 默认是关的
  20. roleName: roleArr[roleType - 1], // 这个是用来渲染那个名字的 小编...
  21. })
  22. .then((res) => {
  23. console.log(res.data);
  24. // 模态框消失
  25. // table更新 前端更新 就是给 datalist重新赋值
  26. this.setState({
  27. isShow:false , // 让模态框消失
  28. // 要先把老的数据放在这里 然后显示新的 数据直接接在后面
  29. datalist: [...this.state.datalist,res.data]
  30. })
  31. });

删除

点击删除按钮 传个id过来 然后 利用请求数据 用数据的 axios.delete(这里是请求地址 ${id})的方法,然后同步后端 同步页面 同步页面就是 更新状态

  1. // 更新状态
  2. this.setState({
  3. // 只有当删除的那个id 不相等就返回 就是相等就不返回结果
  4. datalist: this.state.datalist.filter((item) => item.id !== id),
  5. });

编辑

点击然后让 编辑那个模态框弹出来

  1. // 这里加异步 是为了让他加载完成才 能拿到 setFieldsValue 这个预设数据
  2. setTimeout(() => {
  3. this.setState({
  4. isUpdate: true, // 模态框显示
  5. currentId: item.id, //id 记录此时要更新哪个user
  6. });
  7. // 预设数据
  8. // setFieldsValue 给表单元素提前设置数据
  9. this.refs.updataform.setFieldsValue({
  10. username: item.username,
  11. password: item.password,
  12. roleType: item.roleType,
  13. });
  14. }, 0);
  15. };

然后点击更新 先验证表单 是否合格 然后拿到表单的内容
  1. // 更新 方法
  2. handleUpdateOk = () => {
  3. // 先验证表单
  4. this.refs.updataform
  5. .validateFields()
  6. .then((values) => {
  7. console.log(values);
  8. this.updateTable(values); // 调用
  9. })
  10. .catch((err) => {
  11. console.log(err);
  12. });
  13. };
  14. // 更新 更新表格方法更新状态
  15. updateTable = (values) => {
  16. // 这个是老的状态 就是过滤当前正在点的那个id 项 这个过滤出来的是个数组
  17. let oldItems = this.state.datalist.filter(
  18. (item) => item.id === this.state.currentId
  19. );
  20. let roleArr = ["小编", "管理员", "超级管理员"];
  21. // console.log(oldItems) // 是个数组格式
  22. // 更新 这里的更新是让后端更新 更新必须要有id
  23. axios
  24. .put(`http://localhost:5000/users/${this.state.currentId}`, {
  25. // 先将老的数据 和新的数据进行合并
  26. ...oldItems[0], // 老的状态 因为是个数组所以这里取第 0 项 就能拿到那个数据
  27. ...values, // 新的状态 就是那个变淡输入的内容 全部在 vaules里
  28. roleName: roleArr[values.roleType - 1], // 这个是那个名字 小编...
  29. })
  30. .then((res) => {
  31. // 同步到当前页面, 这里是让前端更新
  32. let newlist = this.state.datalist.map((item) => {
  33. if (item.id === res.data.id) {
  34. // 如果找到了就把更新后的值返回出来
  35. return res.data;
  36. } else {
  37. // 没有更新的话 ,还是返回以前的
  38. return item;
  39. }
  40. });
  41. this.setState({
  42. datalist: newlist, // 更新后的数据赋值
  43. });
  44. });
  45. };

还有更新那个开关

那个开关默认是关的 可以让他开 如果是开 就可以让 那个用户登入进来 如果是关闭就不让他进来 然后更新到数据库

!!!! 注意

pagination={{ pageSize: 5 }} //这个是控制 每一页最大显示的条数

rowKey={(item) => item.id} // 这个是给每一行加id 必加的

这种属于页头 antd

这种叫步骤条

这种叫联级选择
  1. // 这里面所需要的格式 是 label 和 value 而我们数据库的格式是 title 和value
  2. // 所以我们这里要把 label 改成 title 才能正确的显示在页面上
  3. options: [
  4. // label 级联菜单的显示内容, value 对应value值,childern
  5. ],
  6. fieldNames={{ label: "title" }} //自定义 options 中 label name children 的字段

这种叫富文本编辑器

redux

发布 store.dispatch( { type:xxx ,payload: xxx })

订阅 store.subscribe( () => {}) 获取数据 store.getState().xxx

订阅方法 离开组件一定要取消订阅

  1. 订阅 this.unscribe= store.subscribe( () => {})
  2. // 销毁
  3. componentWillUnmount() {
  4. this.unscribe(); // 取消方法 unscribe这是个函数体 用() 销毁
  5. }

像异步请求的数据可以用这个 redux-promise

  1. // 异步的一些操作
  2. import { createStore, applyMiddleware } from "redux";
  3. import reduxPromise from "redux-promise"; // 这个是转 promise形式的
  4. const store = createStore(
  5. reducer,
  6. { // 默认的参数
  7. isCollapsed: false, // 初始化状态
  8. roles: [], // 初始化状态
  9. rights: [], // 初始化状态
  10. },
  11. applyMiddleware(reduxPromise)
  12. );

使用这个方法可以在浏览器使用插件
  1. import { createStore, applyMiddleware, compose } from "redux";
  2. import reduxPromise from "redux-promise"; // 这个是转 promise形式的
  3. const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose; //
  4. const store = createStore(
  5. reducer,
  6. {
  7. isCollapsed: false, // 初始化状态
  8. roles: [], // 初始化状态
  9. rights: [], // 初始化状态
  10. },
  11. composeEnhancers(applyMiddleware(reduxPromise))
  12. );

react-redux
  1. connect 连接
  2. export default connect(mapStateToProps,mapDispatchToProps)(Rights);
  3. mapStateToProps 第一个参数 相当于订阅 // connect 拿到了 store.getState() // state 这个是获取的状态 store.getState()
  4. // 第一个参数
  5. cosnt mapStateToProps = (state) => {
  6. // state 这个是获取的状态 store.getState()
  7. return { // 返回的是状态
  8. a:1,
  9. isCollapsed: state.isCollapsed,
  10. }
  11. }
  12. mapDispatchToProps 第二个参数 相当于发布
  13. const mapDispatchToProps = ({
  14. change(obj) {
  15. console.log("change-connect约定好,传给topheader的回调",obj)
  16. return obj
  17. }
  18. })

跳转到 github
  1. <a
  2. href="https://github.com/lichangxiong-yan/houtai"
  3. target="_blank"
  4. rel="noopener noreferrer"
  5. >

图表插件 // 转格式
  1. // 转格式
  2. // ES5
  3. componentDidMount() {
  4. // console.log(this.refs.myechart.clientWidth);
  5. axios.get("http://localhost:5000/articles").then((res) => {
  6. // console.log(res.data);
  7. // 后端给的数据不是前端想要的 ,数据转换
  8. // lodash
  9. console.log(_.groupBy(res.data, "author")); // 按 author 来分组
  10. // console.log(_.groupBy(res.data, (item) => item.category[0]));
  11. this.group = _.groupBy(res.data, "author");
  12. // ES5
  13. // console.log(Object.keys(this.group)); // 拿到对象中的key
  14. // console.log(Object.values(this.group).map((item) => item.length)); // 拿到对象中的每一个value值
  15. this.initEChart();
  16. });

跨域处理

路由配置

react-redux