《CMS后台系统》项目实战 详细分解(四)

简介: 《CMS后台系统》项目实战 详细分解(四)

登录

  • 在api.js 下面添加登录请求
// 登录
export const LoginApi = (params) => request.post('/login', params)
复制代码


782b466ccec8483eb0e9efcb10ff1da3_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


  • 在Login.js引入

在OnFinish里面调用

import {LoginApi} from '../request/api'
  const onFinish = (values) => {
    console.log('Success:',values);
    LoginApi({
      username:values.username,
      password:values.password
    }).then(res=>{
      console.log(res)
    })
  };
复制代码


8e019363d56741ee9c824f4e9371bef9_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


2da56fa3ffe2499cbddc9995ec735b51_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


  • 使用条件语句判断是否成功
if(res.errCode === 0) {
      }else {
        message.error(res.message)
      }
复制代码


  • 存储数据 (不使用对象,方便存取)
// 存储数据
        localStorage.setItem('avatar', res.data.avatar)
        localStorage.setItem('cms-token', res.data['cms-token'])
        localStorage.setItem('editable', res.data.editable)
        localStorage.setItem('player', res.data.player)
        localStorage.setItem('username', res.data.username)
复制代码


  • 使用setTimeout()跳转页面
import {Link, useNavigate} from 'react-router-dom'
  const navigate = useNavigate()
// 跳转到根路径
        setTimeout(()=>{
          navigate('/')
        }, 1500)
复制代码


  • 总代码(登录)
const onFinish = (values) => {
    console.log('Success:',values);
    LoginApi({
      username:values.username,
      password:values.password
    }).then(res=>{
      console.log(res)
      if(res.errCode===0){
        message.success(res.message)
        // 存储数据
        localStorage.setItem('avatar', res.data.avatar)
        localStorage.setItem('cms-token', res.data['cms-token'])
        localStorage.setItem('editable', res.data.editable)
        localStorage.setItem('player', res.data.player)
        localStorage.setItem('username', res.data.username)
        // 跳转到根路径
        setTimeout(()=>{
          navigate('/')
        }, 1500)
      }else{
        message.error(res.message)
      }
    })
  };
复制代码


67448fef667548f39f9cca9f7f3cc67d_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


  • 最终效果图

11813dee3e3040d6b92a619b2c8f3bbd_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


App布局

布局传送门

ant.design/components/…

7f425cea2e75447da77368eab05fd409_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


import { Layout } from 'antd';
const { Header, Footer, Sider, Content } = Layout;
<Layout>
    <Header>Header</Header>
        <Layout>
          <Sider>Sider</Sider>
          <Content>Content</Content>
        </Layout>
    <Footer>Footer</Footer>
</Layout>
复制代码


  • 略微修改
import React from 'react';
import "./assets/base.less"
import { Outlet } from 'react-router-dom';
import { Layout } from 'antd';
const App = () => {
const {Sider, Content } = Layout;
    return (
        <Layout>
        <header>Header</header>
        <Layout>
          <Sider>Sider</Sider>
          <Content>
          <div>
            <Outlet/>   
          </div>
          </Content>
        </Layout>
        <footer>Footer</footer>
      </Layout>
    );
}
export default App;
复制代码


  • 书写样式 base.less

设置header 和 footer

header {
    height: 70px;
    background-color: pink;
}
footer {
    height: 70px;
    background: #001529;
    color:#fff;
    text-align: center;
    line-height: 70px;
}
复制代码


实现效果图

7e82f1b3b9634acebb665613ea7f298a_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


  • 导入logo图片
import logoImg from '../assets/logo.png'
 <img src={logoImg} alt="" className="logo" />
复制代码


实现效果图

627d7c7403394f19843b83886fd1be78_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


  • 给logo图片设置间距
header {
    height: 70px;
    background-color: #fff;
    padding: 0 20px;
    display: flex;
    justify-content: space-between;
    align-items: center;
}
复制代码


实现效果图

fe3cc94431f54eeebb375ca768c00e3f_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


  • 底边框可以随着F12的操作框动态移动

App.jsx

<Layout id='app'>
        <header>
            <img src={logoImg} alt="" className="logo" />
        </header>
 <Layout>
复制代码


base.less

#app {
    height: 100vh;
}
复制代码


实现效果图

9bdcef0ef46f47c4933a3215e5109ab0_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


下拉菜单

  • 将header抽出成为一个Header组件。

在components下面创建Header文件

f6847dc260e2438fbb8b24fd1e576e7d_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


Header组件

import React from 'react'
import logoImg from '../assets/logo.png'
export default function Header() {
  return (
    <div>
    <header>
        <img src={logoImg} alt="" className="logo" />
        <div className='right'>右侧</div>
    </header>
    </div>
  )
}
复制代码


注意:引入图片的路径记得更改,因为是在components文件之外引入图片

  • 在App.js中引入Header组件
import Header from './components/Header'
<Layout id='app'>
    <Header/>
<Layout>
复制代码


ba58c7fea5e14aaf96b4da90ea401f37_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


  • 下拉菜单

传送门(记得使用3.x的版本,不然没有Menu.Item)

3x.ant.design/components/…

2ce111785c0e48f9a6dba59e69bb7403_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


复制代码

import { Menu, Dropdown } from 'antd';
 <Dropdown overlay={menu}>
                <a className="ant-dropdown-link" onClick={e => e.preventDefault()}>
                Hover me 
                </a>
</Dropdown>
const menu = (
        <Menu>
          <Menu.Item>
            <a target="_blank" rel="noopener noreferrer" href="http://www.alipay.com/">
              1st menu item
            </a>
          </Menu.Item>
          <Menu.Item>
            <a target="_blank" rel="noopener noreferrer" href="http://www.taobao.com/">
              2nd menu item
            </a>
          </Menu.Item>
          <Menu.Item>
            <a target="_blank" rel="noopener noreferrer" href="http://www.tmall.com/">
              3rd menu item
            </a>
          </Menu.Item>
        </Menu>
      );
复制代码


整体展示

import React from 'react'
import logoImg from '../assets/logo.png'
import { Menu, Dropdown } from 'antd';
export default function Header() {
    const menu = (
        <Menu>
          <Menu.Item>
            <a target="_blank" rel="noopener noreferrer" href="http://www.alipay.com/">
              1st menu item
            </a>
          </Menu.Item>
          <Menu.Item>
            <a target="_blank" rel="noopener noreferrer" href="http://www.taobao.com/">
              2nd menu item
            </a>
          </Menu.Item>
          <Menu.Item>
            <a target="_blank" rel="noopener noreferrer" href="http://www.tmall.com/">
              3rd menu item
            </a>
          </Menu.Item>
        </Menu>
      );
  return (
    <div>
    <header>
        <img src={logoImg} alt="" className="logo" />
        <div className='right'>
            <Dropdown overlay={menu}>
                <a className="ant-dropdown-link" onClick={e => e.preventDefault()}>
                Hover me 
                </a>
          </Dropdown>
        </div>
    </header>
    </div>
  )
}
复制代码


效果展示

debc2abd879b4f91988a10e63de933dc_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


  • 进行修改


添加阴影线

<Menu.Divider />

const menu = (
        <Menu>
          <Menu.Item>
            修改资料
          </Menu.Item>
           <Menu.Divider />
          <Menu.Item>
            退出登录
          </Menu.Item>
        </Menu>
      );
复制代码


940a332ce5fb48dab8060299d4d7a1c6_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


  • 修改图标

传送门

3x.ant.design/components/…

71ba27b376ea4c4793182365723b6c96_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


import { CaretDownOutlined } from '@ant-design/icons';
<CaretDownOutlined />
复制代码


效果展示

98aa875682b44cfd9bf9fdb65e74c9fe_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


import React from 'react'
import logoImg from '../assets/logo.png'
import { Menu, Dropdown} from 'antd';
import { CaretDownOutlined } from '@ant-design/icons';
export default function Header() {
    const menu = (
        <Menu>
          <Menu.Item>
            修改资料
          </Menu.Item>
          <Menu.Divider />
          <Menu.Item>
            退出登录
          </Menu.Item>
        </Menu>
      );
  return (
    <div>
    <header>
        <img src={logoImg} alt="" className="logo" />
        <div className='right'>
            <Dropdown overlay={menu}>
                <a className="ant-dropdown-link" onClick={e => e.preventDefault()}>
                Hover me <CaretDownOutlined />
                </a>
          </Dropdown>
        </div>
    </header>
    </div>
  )
}



目录
相关文章
|
6月前
|
架构师 Java
jvm性能调优实战 - 35电商APP后台系统如何对Full GC进行深度优化
jvm性能调优实战 - 35电商APP后台系统如何对Full GC进行深度优化
97 0
|
数据库
【自然框架】CMS之数据库设计
    在园子里也混了三年多,随笔200多,一开始只是想把自己的经验写一下,后来呢弄出来了一个“自然框架”,主要精力就放在了介绍自然框架的思路上面了。随笔多了就发现一个问题:有点乱。虽然博客有分组,但是只支持一级分组,不支持n级的。
1592 0
|
3月前
|
监控 小程序 数据处理
揭秘支付宝小程序性能优化秘籍:从加载到运行,每一步都快人一步!
【8月更文挑战第27天】本文深入探讨了支付宝小程序性能优化的关键技术和策略,包括减少网络请求、利用CDN加速、代码按需加载、图片压缩、懒加载以及性能监控等多方面内容,并提供了实用的示例代码,帮助开发者显著提升小程序的加载速度与运行效率,创造更佳用户体验。
72 1
|
11月前
|
缓存 小程序 数据安全/隐私保护
微信小程序(十八)小程序维护登录态
现阶段小程序系列的最后一篇。 我们来看下小程序十如何维护登录态的,这个玩意,早应该说了,但是,直到我小程序做成现在这个状态,我也没有用到微信官方所说的使用sessionkey维护的登录态,所以,这个最后来看一下。
218 0
|
小程序 数据可视化 数据库
云开发(微信-小程序)笔记(十七)---- cms(内容管理)及案例
云开发(微信-小程序)笔记(十七)---- cms(内容管理)及案例
521 0
《CMS后台系统》项目实战 详细分解(八)
《CMS后台系统》项目实战 详细分解(八)
115 0
《CMS后台系统》项目实战 详细分解(八)
|
资源调度 API 数据处理
《CMS后台系统》项目实战 详细分解(七)
《CMS后台系统》项目实战 详细分解(七)
114 0
《CMS后台系统》项目实战 详细分解(七)
|
存储 API
《CMS后台系统》项目实战 详细分解(十)
《CMS后台系统》项目实战 详细分解(十)
75 0
《CMS后台系统》项目实战 详细分解(十)
|
存储
《CMS后台系统》项目实战 详细分解(五)
《CMS后台系统》项目实战 详细分解(五)
89 0
《CMS后台系统》项目实战 详细分解(五)
|
前端开发 API
《CMS后台系统》项目实战 详细分解(九)
《CMS后台系统》项目实战 详细分解(九)
107 0
《CMS后台系统》项目实战 详细分解(九)