1.router.js新增文章管理路由
<Route path="/app/*" element={<AppPage/>} >
<Route path="home" element={<Home/>} />
<Route path="article" element={<ArticleList/>} />
</Route>
api.js
const HISTORY = `/api`
const URL = {
doUserLogin: `${HISTORY}/login/doSignIn`, //
getBasicData: `${HISTORY}/index/getBasicData`,
doArticleAdd: `${HISTORY}/index/doArticleAdd`,
doArticleUpdate: `${HISTORY}/index/doArticleUpdate`,
doArticleDelete: `${HISTORY}/index/doArticleDelete`,
getArticleList: `${HISTORY}/index/getArticleList`,
}
export default URL
2.article.js
import React from 'react'
import { Table, Space,Button,Modal,Input, Form, Row, Col, Select, DatePicker, message,Pagination } from 'antd';
import moment from 'moment';
import 'moment/locale/zh-cn'
import {EditOutlined,DeleteOutlined } from '@ant-design/icons';
import RequestTools from 'utils/request.js'
moment.locale('zh-cn')
const { confirm } = Modal;
const { Option } = Select;
const dateFormat = 'YYYY-MM-DD';
const { TextArea } = Input;
const _req = new RequestTools()
class ArticleList extends React.Component {
constructor(prors){
super(prors)
this.state={
page:1, //显示页
pagesize:5,//显示的条数
count:0,// 总条数
align:'center',
data:[], //接收数据
visible: false,
upvisible: false,
id:0,
title:'',
category:'',
is_show:0,
create_time:moment('', dateFormat) ,
content:'',
istrue:false //修改弹框
}
}
componentDidMount() {
this.getArticleList()
}
getArticleList = () => {
const params = {}
params.page = this.state.page;
params.pagesize = this.state.pagesize;
_req.axiosPost(params, 'getArticleList').then(res => {
this.setState({
data:res.data.data,
count: res.data.count
})
})
}
// 错误提示
error = (val) => {
message.error(val);
};
// 成功提示
success = (val) => {
message.success(val);
};
// 弹框显示
showArticleAdd = () => {
this.setState({
visible: true,
});
};
hideArticleAdd = () => {
this.setState({
visible: false,
upvisible: false,
istrue:false
});
};
// 点击确认
handleOk = () => {
};
// 点击取消
handleCancel = ()=> {
this.setState({
visible: false,
upvisible: false,
istrue:false
});
};
// 添加
onAddFinish = values => {
let that = this;
console.log('Received values of form: ', values);
var params = {};
params.title=values.title;
params.category=values.category;
params.is_show=values.is_show;
params.create_time=values.create_time._d;
params.content=values.content;
console.log('Received params: ', params);
_req.axiosPost(params, 'doArticleAdd').then(res => {
console.log(res);
if (res.code==0){
that.success(res.data.msg)
setTimeout(function (){
that.setState({
visible: false,
upvisible: false,
});
that.getArticleList()
},800)
}
})
}
// 编辑
update(text,record,index){
console.log(text)
console.log(record)
console.log(index)
new Promise((resolve)=>{
this.setState({
upvisible: true,
id:record.id,
title:record.title,
category:record.category,
is_show:record.is_show,
create_time:moment(record.create_time,dateFormat),
content:record.content
});
resolve()
}).then(()=>{
this.setState({
istrue:true
})
})
}
// 获取编辑表单数据并发起请求
onFinish = values => {
let that = this
const params = {};
params.id= this.state.id;
params.title=values.title;
params.category=values.category;
params.is_show=values.is_show;
params.create_time=values.create_time._d;
params.content=values.content;
_req.axiosPost(params, 'doArticleUpdate').then(res => {
if (res.code==0){
that.success(res.data.msg)
setTimeout(function (){
that.setState({
visible: false,
upvisible: false,
});
that.getArticleList()
},800)
}
})
}
// 删除
del(text,record,index){
console.log(record.task_no)
this.showDeleteConfirm(record.task_no)
}
// 删除弹框
showDeleteConfirm(no) {
let that = this;
confirm({
title: '是否确认删除?',
okText: '确认',
okType: 'danger',
cancelText: '取消',
// 点击确认触发
onOk() {
_req.axiosPost({task_no:no}, 'doArticleDelete').then(res => {
if (res.code==0){
that.success(res.data.msg)
setTimeout(function (){
that.getArticleList()
},800)
}
})
},
// 点击取消触发
onCancel() {
console.log('Cancel');
},
});
}
// 分页操作
onChangePage = page => {
new Promise((resolve, reject) => {
this.setState({
page: page, // 改变值
});
resolve()
}).then(() => {
this.getArticleList()
})
};
render() {
const { visible} = this.state;
const columns = [
{
title: '标题',
dataIndex: 'title',
width: 150,
align:this.state.align,
},
{
title: '分类',
dataIndex: 'category',
width: 50,
align:this.state.align,
},
{
title: '显示',
dataIndex: 'is_show',
align:this.state.align,
width: 20,
},
{
title: '发布时间',
dataIndex: 'create_time',
align:this.state.align,
width: 50,
},
{
title: '操作',
dataIndex: 'address',
align:this.state.align,
width: 150,
render: (text, record,index) => (
<Space style={{
cursor: 'pointer',
color: '#2378f7',
fontSize: '15px'
}}>
<span onClick={()=>this.update(text,record,index)} ><EditOutlined /></span>
<span onClick={()=>this.del(text,record,index)}> <DeleteOutlined /></span>
</Space>
)
}
];
return (
<div>
<Row>
<Col span={2} offset={22}>
{/*添加弹框*/}
<Modal
visible={visible}
title="新增文章"
onCancel={this.hideArticleAdd}
footer={null}
>
<Form
style={{marginLeft:'-12px'}}
labelCol={{ span: 6 }}
wrapperCol={{ span: 14 }}
layout="horizontal"
onFinish={this.onAddFinish}
>
<Form.Item name='title' label="标题">
<Input placeholder="标题" />
</Form.Item>
<Form.Item name='category' label="分类">
<Select>
<Option value="新手任务" >新手任务</Option>
<Option value="日常任务" >日常任务</Option>
<Option value="活动任务" >活动任务</Option>
</Select>
</Form.Item>
<Form.Item name='is_show' label="是否显示">
<Select>
<Option value="1" >显示</Option>
<Option value="0" >隐藏</Option>
</Select>
</Form.Item>
<Form.Item name='create_time' label="发布时间">
<DatePicker />
</Form.Item>
<Form.Item name='content' label="内容">
<TextArea
placeholder="内容"
autoSize={{ minRows: 3, maxRows: 5 }}
/>
</Form.Item>
<Form.Item style={{margin:'20px 0 0 120px '}} >
<Button key="back" onClick={this.handleCancel}>
取消
</Button>,
<Button key="submit" type="primary" htmlType="submit" >
提交
</Button>
</Form.Item>
</Form>
</Modal>
{/*修改弹框*/}
{this.state.istrue&& <Modal
visible={this.state.upvisible}
title="修改文章"
footer={null}
onCancel={this.handleCancel}
>
<Form
style={{marginLeft:'-12px'}}
labelCol={{ span: 6 }}
wrapperCol={{ span: 14 }}
layout="horizontal"
onFinish={this.onFinish}
initialValues={{
title:this.state.title,
category:this.state.category,
is_show:this.state.is_show,
create_time:this.state.create_time,
content:this.state.content,
}}
>
<Form.Item name='title' label="标题">
<Input placeholder="large size" />
</Form.Item>
<Form.Item name='category' label="分类">
<Select>
<Option value="新手任务" >新手任务</Option>
<Option value="日常任务" >日常任务</Option>
<Option value="活动任务" >活动任务</Option>
</Select>
</Form.Item>
<Form.Item name='is_show' label="是否显示">
<Select>
<Option value="1" >显示</Option>
<Option value="0" >隐藏</Option>
</Select>
</Form.Item>
<Form.Item name='create_time' label="发布日期">
<DatePicker />
</Form.Item>
<Form.Item name='content' label="内容">
<TextArea
placeholder="内容"
autoSize={{ minRows: 3, maxRows: 5 }}
/>
</Form.Item>
<Form.Item style={{margin:'20px 0 0 120px '}} >
<Button key="back" onClick={this.handleCancel}>
取消
</Button>
<Button key="submit" type="primary" htmlType="submit" onClick={this.handleOk}>
提交
</Button>
</Form.Item>
</Form>
</Modal>}
</Col>
</Row>
<Row>
<Col span={24}>
<Button onClick={this.showArticleAdd} type="primary" style={{ marginBottom: 16 }}>
新增
</Button>
<Table pagination={false} columns={columns} dataSource={this.state.data} />
<Pagination
current={this.state.page} // 总条数 绑定state中的值
onChange={this.onChangePage} // 改变页面是发生的函数
pageSize={this.state.pagesize}
total={this.state.count}
// 页码数量 = 向上取整(总条数/每页条数)X10
showSizeChanger={false} // 总条数超过多少条显示也换条数
style={{ marginTop: '20px' }}
/>
</Col>
</Row>
</div>
)
}
}
export default ArticleList
后台php
<?php
namespace app\api\controller;
use app\BaseController;
class Index extends BaseController
{
public function getBasicData()
{
$arr = [
'data'=>[
'userCount'=>100,
'productCount'=>120,
'orderCount'=>140
],
'code'=>0
];
return $arr;
}
public function getArticleList()
{
$arr = [
'data'=>[
'data'=>[
['id'=>1,'title'=>'test','create_time'=>'2022-01-31T13:53:27.237Z','category'=>'新手任务','is_show'=>1,'content'=>'4455666'],
['id'=>2,'title'=>'test','create_time'=>'2022-01-31T13:53:27.237Z','category'=>'新手任务','is_show'=>0,'content'=>'4455666'],
['id'=>3,'title'=>'test','create_time'=>'2022-01-31T13:53:27.237Z','category'=>'新手任务','is_show'=>1,'content'=>'4455666'],
['id'=>4,'title'=>'test','create_time'=>'2022-01-31T13:53:27.237Z','category'=>'新手任务','is_show'=>0,'content'=>'4455666']
],
'count'=>30
],
'code'=>0
];
return $arr;
}
public function doArticleUpdate()
{
$param = $this->request->param();
file_put_contents('333345update.log',json_encode($param)."\r\n\r\n",FILE_APPEND);
$arr = [
'data'=>[
'msg'=>'更新成功',
],
'code'=>0
];
return $arr;
}
public function doArticleAdd()
{
$param = $this->request->param();
file_put_contents('333345add.log',json_encode($param)."\r\n\r\n",FILE_APPEND);
$arr = [
'data'=>[
'msg'=>'新增成功',
],
'code'=>0
];
return $arr;
}
public function doArticleDelete()
{
$param = $this->request->param();
file_put_contents('333345del.log',json_encode($param)."\r\n\r\n",FILE_APPEND);
$arr = [
'data'=>[
'msg'=>'删除成功',
],
'code'=>0
];
return $arr;
}
}
下一篇实现路由拦截和token的使用
# 正常构建 yarn build # 构建到指定目录 BUILD_PATH=./dist yarn build # 指定配置环境 REACT_APP_CONFIG_ENV=test yarn build # 打包大小分析 yarn build:analyzer # 打包时间分析 yarn build:time
本文为看恩吧原创文章,转载无需和我联系,但请注明来自knsay.com