# kjs-admin
**Repository Path**: chen_caoyang/kjs-admin
## Basic Information
- **Project Name**: kjs-admin
- **Description**: kjs后台管理系统
- **Primary Language**: JavaScript
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2023-03-01
- **Last Updated**: 2023-03-27
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# React后台管理系统模板
## 一、准备React
### 1.建立react应用
```shell
npx create-react-app react_management_system_template
cd react_management_system_template
```
并对react应用进行整理,整理成如下图所示
在terminal中输入`yarn start`,在游览器中输入`http://localhost:3000`即可得到如下图:
### 2.基础插件安装
本次所需的插件
- react-router-dom
- less less-loader
- axios
- jsonp
- antd
`yarn add react-router-dom axios less less-loader@4.0.1 antd `
### 3.暴露webpack
- `yarn eject`
### 4.项目使用Less
在上述暴露出webpack的基础上,找到`config/webpack.config.js`文件。
加上这两句
之后找到`getStyleLoaders`方法,添加代码如图所示
最后找到如下代码处,添加less支持
```js
// 添加less
{
test: lessRegex,
exclude: lessModuleRegex,
use: getStyleLoaders(
{
importLoaders: 3,
sourceMap: isEnvProduction && shouldUseSourceMap,
},
'less-loader'
),
sideEffects: true,
},
{
test: lessModuleRegex,
use: getStyleLoaders(
{
importLoaders: 3,
sourceMap: isEnvProduction && shouldUseSourceMap,
modules: {
getLocalIdent: getCSSModuleLocalIdent,
},
},
'less-loader'
),
},
```
之后在项目中新建App.less文件测试less文件是否可用正常使用。
并在App.js中引入App.less之后`yarn start`启动项目,可用看到背景正常设置为红色,设置成功!
## 二、项目主页开发
### 1.项目主页设置
本次以博客管理系统为例。下面对管理系统页面结构定义:
- 页面结构定义
- 左侧 列表模块
- 右侧
- 头部模块
- 内容页面
- 尾部模块
### 2.主页简约配置
主页采用`Antd`的`Grid栅格`(https://ant.design/components/grid-cn/)
`记得在index.js中引入antd.css,否则不起作用,即import 'antd/dist/antd.css';`
- 新建`Admin.js`,并搭建简约框架
```js
import React from 'react';
import {Col,Row} from 'antd';
class Admin extends React.Component {
constructor(props) {
super(props);
this.state = {
};
}
render() {
return (
### 3.搭建侧边栏
`参考Antd的Menu导航菜单(https://ant.design/components/menu-cn/#header)`
在`src/componets/Navleft/index.js`
```js
import React from 'react';
import { Menu } from 'antd';
import './index.less';
const { SubMenu } = Menu;
class index extends React.Component {
constructor(props) {
super(props);
this.state = {
};
}
render() {
return (
之后再对此修改,用config文件的方式来加载侧边栏
在`src/config/menuConfig.js`文件
```js
const menuList = [
{
title: "首页",
key: '/admin/home'
},
{
title:"文章发布",
key: "/admin/publish_articles"
},
{
title:"博客管理",
key: "/admin/manage_blog",
children:[
{
title:"文章管理",
key:"/admin/manage_articles"
},
{
title:"评论管理",
key:"/admin/manage_comment"
},
{
title:"分类专栏",
key:"/admin/manage_column"
},
{
title:"订阅专栏",
key:"/admin/subscribe_column"
},
{
title:"博客搬家",
key:"/admin/move_blog"
},
{
title:"博客打赏",
key:"/admin/reward_blog"
},
{
title:"博客设置",
key:"/admin/setting_blog"
},
{
title:"博客名片",
key:"/admin/card"
}
]
},
{
title:"数据统计",
key:"/admin/statistics"
},
{
title:"下载管理",
key:"/admin/manage_download"
},
{
title:"创作活动",
key:"/admin/activities"
},
{
title:"用户中心",
key:"/admin/user_info"
},
];
export default menuList;
```
对之前的`NavLeft/index.js`
```js
import React from 'react';
import { Menu } from 'antd';
import './index.less';
// 引入侧边栏配置
import MenuConfig from '../../config/menuConfig';
const { SubMenu } = Menu;
class index extends React.Component {
constructor(props) {
super(props);
this.state = {
};
}
// 刷新挂载组件
componentDidMount(){
const menuTreeNode = this.renderMenu(MenuConfig);
this.setState({
menuTreeNode
})
}
// 菜单渲染
renderMenu=(data)=>{
return data.map((item)=>{
if(item.children){
return(
### 4.头部区域
头部区域分为两个部分,一部分分为用户名;另外一部分为时间和天气情况。
对时间进行格式化在`src/utils/utils.js`
```js
export default{
formateDate(time){
if(!time)
return '';
let date = new Date(time);
return date.getFullYear() + "-" + (date.getMonth()+1) + "-" + date.getDate() + " " + date.getHours() + ":" + date.getMinutes() + ":" + date.getSeconds();
}
}
```
对百度天气api请求的封装在`src/axios/index.js`
```js
import JsonP from 'jsonp';
export default class Axios{
static jsonp(options){
return new Promise((resolve,reject)=>{
JsonP(options.url,{
param:'callback'
},function(err,response){
if(response.status=='success'){
resolve(response);
}else{
reject(response.message);
}
})
})
}
}
```
其头部为`src/components/Header/index.js`
```js
import React from 'react';
import {Col,Row} from 'antd';
import './index.less'
import Util from '../../utils/utils';
import axios from '../../axios';
class index extends React.Component {
constructor(props) {
super(props);
this.state = {
userName:"吕厂长"
};
}
// 获取时间
componentDidMount(){
setInterval(()=>{
let sysTime = Util.formateDate(new Date().getTime());
this.setState({
sysTime
})
},1000)
this.getWeatherApiData();
}
// 获取天气
getWeatherApiData(){
let city = "天津";
axios.jsonp({
url:"http://api.map.baidu.com/telematics/v3/weather?location="+encodeURIComponent(city)+"&output=json&ak=3p49MVra6urFRGOT9s8UBWr2"
}).then((res)=>{
if(res.status=='success'){
let data = res.results[0].weather_data[0];
this.setState({
dayPictureUrl:data.dayPictureUrl,
weather:data.weather
})
}
})
}
render() {
return (
### 5.尾部区域
尾部区域在`src/components/Footer/index.js`
```js
import React from 'react';
import './index.less';
class index extends React.Component {
constructor(props) {
super(props);
this.state = {
};
}
render() {
return (
## 三、项目添加路由
在`src/IRouter.js`
```js
import React from 'react';
import {BrowserRouter,Switch,Route} from 'react-router-dom';
import App from './App';
import Admin from './Admin';
import Home from './pages/home';
import NotMatch from './pages/NotMatch';
class IRouter extends React.Component {
constructor(props) {
super(props);
this.state = {
};
}
render() {
return (
