前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录。最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star。
一、城市管理
class FilterForm extends React.Component{ render(){ const { getFieldDecorator } = this.props.form; return ( { getFieldDecorator('city_id')( ) } { getFieldDecorator('mode')( ) } { getFieldDecorator('op_mode')( ) } { getFieldDecorator('auth_status')( ) } ); } } FilterForm = Form.create({})(FilterForm);
弹框子组件二:开通城市表单
class OpenCityForm extends React.Component{ render(){ const formItemLayout = { labelCol:{ //label标签占据列数 span:5 }, wrapperCol:{ //Form表单占据列数 span:19 } } const { getFieldDecorator } =this.props.form; return ( { getFieldDecorator('city_id',{ initialValue:'1' })( ) } { getFieldDecorator('op_mode', { initialValue: '1' })( ) } { getFieldDecorator('use_mode', { initialValue: '1' })( ) } ); } } OpenCityForm = Form.create({})(OpenCityForm);
Easy Mock城市管理的数据接口:/open_city
{ "code": 0, "msg": "", "list": { "item_list|10": [{ "id|+1": 1, "name": "@city", "mode|1-2": 1, "op_mode|1-2": 1, "franchisee_id": 77, "franchisee_name": "松果自营", "city_admins|1-2": [{ "user_name": "@cname", "user_id|+1": 10001 }], "open_time": "@datetime", "sys_user_name": "@cname", "update_time": 1546580667000 }] }, page: 1, page_size: 10, total: 20 }
componentDidMount(){ this.requestList(); } // 默认请求我们的接口数据 requestList = ()=>{ let _this = this; axios.ajax({ url: '/open_city', data:{ params:{ page:this.params.page } } }).then((res)=>{ let list = res.list.item_list.map((item, index) => { item.key = index; return item; }); this.setState({ list:list, pagination:Utils.pagination(res,(current)=>{ _this.params.page = current; _this.requestList(); }) }) }) }
Easy Mock城市开通的数据接口:/city/open
{ "code": 0, "list": "开通成功" }
【开通城市】按钮:监听onClick事件,调用this.handleOpenCity()显示弹框
state = { list:[], isShowOpenCity:false //默认隐藏弹框 } // 开通城市 handleOpenCity = ()=>{ this.setState({ isShowOpenCity:true }) }
Modal关键属性visible控制弹框的显示隐藏,关键事件onOk调用this.handleSubmit()提交表单信息
{ this.setState({ isShowOpenCity:false }) }} OnOk={this.handleSubmit} > {this.cityForm = inst;}}/>
wrappedComponentRef属性:拿到表单中的信息对象inst,通过this.cityForm存到state中
城市开通信息提交
// 城市开通提交 handleSubmit = ()=>{ let cityInfo = this.cityForm.props.form.getFieldsValue(); console.log(cityInfo); axios.ajax({ url:'/city/open', data:{ params:cityInfo } }).then((res)=>{ if(res.code === 0){ message.success('开通成功'); this.setState({ isShowOpenCity:false }) this.requestList(); } }) }
import React from 'react'; import { Card, Button, Table, Form, Select, Modal, message } from 'antd'; import axios from './../../axios/index'; import Utils from './../../utils/utils'; const FormItem = Form.Item; const Option = Select.Option; export default class City extends React.Component{ state = { list:[], isShowOpenCity:false //默认隐藏弹框 } params = { page:1 } componentDidMount(){ this.requestList(); } // 默认请求我们的接口数据 requestList = ()=>{ let _this = this; axios.ajax({ url: '/open_city', data:{ params:{ page:this.params.page } } }).then((res)=>{ let list = res.list.item_list.map((item, index) => { item.key = index; return item; }); this.setState({ list:list, pagination:Utils.pagination(res,(current)=>{ _this.params.page = current; _this.requestList(); }) }) }) } // 开通城市 handleOpenCity = ()=>{ this.setState({ isShowOpenCity:true }) } // 城市开通提交 handleSubmit = ()=>{ let cityInfo = this.cityForm.props.form.getFieldsValue(); console.log(cityInfo); axios.ajax({ url:'/city/open', data:{ params:cityInfo } }).then((res)=>{ if(res.code === 0){ message.success('开通成功'); this.setState({ isShowOpenCity:false }) this.requestList(); } }) } render(){ const columns = [ { title:'城市ID', dataIndex:'id' }, { title: '城市名称', dataIndex: 'name' }, { title: '用车模式', dataIndex: 'mode', render(mode){ return mode === 1 ?'停车点':'禁停区'; } }, { title: '营运模式', dataIndex: 'op_mode', render(op_mode) { return op_mode === 1 ? '自营' : '加盟'; } }, { title: '授权加盟商', dataIndex: 'franchisee_name' }, { title: '城市管理员', dataIndex: 'city_admins', render(arr){ //处理数组类型 return arr.map((item)=>{ return item.user_name; }).join(','); } }, { title: '城市开通时间', dataIndex: 'open_time' }, { title: '操作时间', dataIndex: 'update_time', render: Utils.formateDate //格式化时间戳 }, { title: '操作人', dataIndex: 'sys_user_name' } ] return (); } } //子组件一:选择表单 class FilterForm extends React.Component{ render(){ const { getFieldDecorator } = this.props.form; return ( { getFieldDecorator('city_id')( ) } { getFieldDecorator('mode')( ) } { getFieldDecorator('op_mode')( ) } { getFieldDecorator('auth_status')( ) } ); } } FilterForm = Form.create({})(FilterForm); //子组件二:开通城市 class OpenCityForm extends React.Component{ render(){ const formItemLayout = { labelCol:{ //label标签占据列数 span:5 }, wrapperCol:{ //Form表单占据列数 span:19 } } const { getFieldDecorator } =this.props.form; return ( { getFieldDecorator('city_id',{ initialValue:'1' })( ) } { getFieldDecorator('op_mode', { initialValue: '1' })( ) } { getFieldDecorator('use_mode', { initialValue: '1' })( ) } ); } } OpenCityForm = Form.create({})(OpenCityForm);
{ this.setState({ isShowOpenCity:false }) }} OnOk={this.handleSubmit} > {this.cityForm = inst;}}/>
二、订单管理
class FilterForm extends React.Component{ render(){ const { getFieldDecorator } = this.props.form; return ( { getFieldDecorator('city_id')( ) } { getFieldDecorator('start_time')() } { getFieldDecorator('end_time')( ) } { getFieldDecorator('status')( ) } ); } } FilterForm = Form.create({})(FilterForm);
{ "code": 0, "msg": "", "list": { "item_list|10": [{ "id": 2959165, "order_sn": /T180[0-9]{6}/, "bike_sn": "800116090", "user_id": 908352, "user_name": "@cname", "mobile": /1[0-9]{10}/, "distance": 2000, "total_time": 4000, "status|1-2": 1, "start_time": "@datetime", "end_time": "@datetime", "total_fee": 1000, "user_pay": 300 }] }, "page|1-9": 1, page_size: 10, total: 85, page_count: 9 }
同城市管理:调用this.requestList(),默认请求接口数据
{ "code": 0, "list": { "id": 27296, "bike_sn": "800116116", "battery": 100, "start_time": "@datetime", "location": "西虹市海淀区桃花公园" } }
Easy Mock结束订单成功数据接口:/order/finish_order
{ "code": 0, "list": "ok" }
【结束订单】按钮:监听onClick事件,调用this.handleConfirm()显示确认结束弹框
//订单结束确认 handleCOnfirm= () => { let item = this.state.selectedItem; if(!item){ Modal.info({ title: '信息', content: '请选择一条订单进行结束' }) return; } axios.ajax({ url: '/order/ebike_info', data: { params: { orderId: item.id } } }).then((res) => { if(res.code === 0 ){ this.setState({ orderInfo: res.list, orderConfirmVisible: true }) } }) }
确认取消:打开Modal弹框,显示要取消的订单信息
{ this.setState({ orderConfirmVisible: false }) }} OnOk={this.handleFinishOrder} width={600}> {this.state.orderInfo.bike_sn} {this.state.orderInfo.battery + '%'} {this.state.orderInfo.start_time} {this.state.orderInfo.location}
结束订单:onOk事件调用this.handleFinishOrder()
//结束订单 handleFinishOrder = () => { let item = this.state.selectedItem; axios.ajax({ url: '/order/finish_order', data: { params: { orderId: item.id } } }).then((res) => { if(res.code === 0){ message.success('订单结束成功') this.setState({ orderConfirmVisible: false }) this.requestList(); } }) }
实例代码:
import React from 'react' import { Card, Button, Table, Form, Select, Modal, message, DatePicker } from 'antd'; import axios from './../../axios/index'; import Utils from './../../utils/utils'; const FormItem = Form.Item; const Option = Select.Option; export default class Order extends React.Component{ state = { orderInfo: {}, orderConfirmVisible: false } params = { page:1 } componentDidMount(){ this.requestList(); } requestList = () => { let _this = this; axios.ajax({ url: '/order/list', data: { params: { page: this.params.page } } }).then((res) => { if(res.code === 0){ let list = res.list.item_list.map((item, index) => { item.key = index; return item; }); this.setState({ list:list, selectedRowKeys: [],//重置 pagination:Utils.pagination(res,(current)=>{ _this.params.page = current; _this.requestList(); }) }) } }) } //订单结束确认 handleCOnfirm= () => { let item = this.state.selectedItem; if(!item){ Modal.info({ title: '信息', content: '请选择一条订单进行结束' }) return; } axios.ajax({ url: '/order/ebike_info', data: { params: { orderId: item.id } } }).then((res) => { if(res.code === 0 ){ this.setState({ orderInfo: res.list, orderConfirmVisible: true }) } }) } //结束订单 handleFinishOrder = () => { let item = this.state.selectedItem; axios.ajax({ url: '/order/finish_order', data: { params: { orderId: item.id } } }).then((res) => { if(res.code === 0){ message.success('订单结束成功') this.setState({ orderConfirmVisible: false }) this.requestList(); } }) } OnRowClick= (record, index) => { let selectKey = [index]; this.setState({ selectedRowKeys: selectKey, selectedItem: record }) } //订单详情页 openOrderDetail = () => { let item = this.state.selectedItem; if(!item){ Modal.info({ title: '信息', content: '请先选择一条订单' }) return; } window.open(`/#/common/order/detail/${item.id}`,'_blank') } render(){ const columns = [ { title: '订单编号', dataIndex: 'order_sn' }, { title: '车辆编号', dataIndex: 'bike_sn' }, { title: '用户名', dataIndex: 'user_name' }, { title: '手机号', dataIndex: 'mobile' }, { title: '里程', dataIndex: 'distance', render(distance){ return distance/1000 + 'Km'; } }, { title: '行驶时长', dataIndex: 'total_time' }, { title: '状态', dataIndex: 'status' }, { title: '开始时间', dataIndex: 'start_time' }, { title: '结束时间', dataIndex: 'end_time' }, { title: '订单金额', dataIndex: 'total_fee' }, { title: '实付金额', dataIndex: 'user_pay' } ] const formItemLayout = { labelCol: { span: 5 }, wrapperCol: { span: 19 } } const selectedRowKeys = this.state.selectedRowKeys; const rowSelection = { type: 'radio', selectedRowKeys } return ({ return { onClick: () => { this.onRowClick(record, index); } } }} />
{ this.setState({ orderConfirmVisible: false }) }} OnOk={this.handleFinishOrder} width={600}> {this.state.orderInfo.bike_sn} {this.state.orderInfo.battery + '%'} {this.state.orderInfo.start_time} {this.state.orderInfo.location} ) } } //子组件一:选择表单 class FilterForm extends React.Component{ render(){ const { getFieldDecorator } = this.props.form; return ( { getFieldDecorator('city_id')( ) } { getFieldDecorator('start_time')() } { getFieldDecorator('end_time')( ) } { getFieldDecorator('status')( ) } ); } } FilterForm = Form.create({})(FilterForm);
三、订单详情
- 跳转详情页
- pages->order->index.js中:【订单详情】按钮监听onClick事件,调用this.openOrderDetail(),跳转路由
//订单详情页 openOrderDetail = () => { let item = this.state.selectedItem; if(!item){ Modal.info({ title: '信息', content: '请先选择一条订单' }) return; } window.open(`/#/common/order/detail/${item.id}`,'_blank') }关键:window.open(`/#/common/order/detail/${item.id}`,'_blank')
src目录下:新建common.js,类似admin.js编写项目公共结构代码,负责路由详情页展示
import React from 'react' import { Row, Col } from 'antd'; import Header from './components/Header' import './style/common.less' export default class Common extends React.Component { render() { return (); } }|
{this.props.children}
通过menuType:控制显示header组件的不同样式(components->header->index.js)
//其它代码 render() { const menuType = this.props.menuType; return () }{ menuType ?
{ menuType ? '' :LJQ 通用管理系统 : '' } 欢迎,{this.state.userName} 退出 }
首页 {this.state.sysTime} 晴转多云 CSS样式:
//style->common.less ul,li{ list-style: none; } .clearfix{ &::after{ content:''; clear: both; display: block; visibility: hidden; } } .content{ padding: 20px } //components->header->index.less //.common 页面简单头 .simple-page{ .header-top{ background: #1890ff; color: @colorM; } .ant-form, .ant-col-12, .weather{ display: none; } } //引入pages->order->detail.lessrouter.js中:引入Common组件,使用
的render方法定义嵌套路由 }/>
获取订单详情基础信息
Easy Mock订单详情数据接口:/order/detail
{ "code": 0, "msg": "", "list": { "status": 2, "order_sn": "T1803244422704080JGJI", "bike_sn": '802410001', "mode|1-2": 1, "start_location": "北京市昌平区回龙观东大街", "end_location": "北京市海淀区奥林匹克公园", "city_id": 1, "mobile": "13597482075", "user_name": "@cname", "distance": 10000, "bike_gps": "116.398806,40.008637", "start_time": 1546580667000, "end_time": 1546608995000, "total_time": 224, "position_list": [{ "lon": 116.361221, "lat": 40.043776 }, { "lon": 116.363736, "lat": 40.038086 }, { "lon": 116.364599, "lat": 40.036484 }, { "lon": 116.373438, "lat": 40.03538 }, { "lon": 116.377966, "lat": 40.036263 }, { "lon": 116.379762, "lat": 40.03654 }, { "lon": 116.38084, "lat": 40.033225 }, { "lon": 116.38084, "lat": 40.029413 }, { "lon": 116.381343, "lat": 40.021291 }, { "lon": 116.381846, "lat": 40.015821 }, { "lon": 116.382637, "lat": 40.008084 }, { "lon": 116.398806, "lat": 40.008637 } ], "area": [{ "lon": "116.274737", "lat": "40.139759", "ts": null }, { "lon": "116.316562", "lat": "40.144943", "ts": null }, { "lon": "116.351631", "lat": "40.129498", "ts": null }, { "lon": "116.390582", "lat": "40.082481", "ts": null }, { "lon": "116.38742", "lat": "40.01065", "ts": null }, { "lon": "116.414297", "lat": "40.01181", "ts": null }, { "lon": "116.696242", "lat": "39.964035", "ts": null }, { "lon": "116.494498", "lat": "39.851306", "ts": null }, { "lon": "116.238086", "lat": "39.848647", "ts": null }, { "lon": "116.189454", "lat": "39.999418", "ts": null }, { "lon": "116.244646", "lat": "39.990574", "ts": null }, { "lon": "116.281441", "lat": "40.008703", "ts": null }, { "lon": "116.271092", "lat": "40.142201", "ts": null }, { "lon": "116.271092", "lat": "40.142201", "ts": null } ], "area_list": null, "npl_list": [{ "id": 8265, "name": "北辰世纪中心-a座", "city_id": 1, "type": 3, "status": 0, "map_point": "116.39338796444|40.008120315215;116.39494038009002|40.008177258745;116.39496911688|40.006268094213;116.39512457763|40.004256795877;116.39360214742|40.004222412241;116.39357190147|40.005075745782;116.39351397873|40.005836165232;116.39338796444|40.008120315215", "map_point_array": [ "116.39338796444|40.008120315215", "116.396053|40.008273", "116.396448|40.006338", "116.396915|40.004266", "116.39192|40.004072", "116.391525|40.004984", "116.391381|40.005924", "116.391166|40.007913" ], "map_status": 1, "creator_name": "赵程程", "create_time": 1507863539000 }] } }componentDidMount()中获取url参数orderId:调用this.getDetailInfo(orderId)获取订单详情数据
componentDidMount(){ let orderId = this.props.match.params.orderId; if(orderId){ this.getDetailInfo(orderId); } } getDetailInfo = (orderId) => { axios.ajax({ url: '/order/detail', data: { params: { orderId: orderId } } }).then((res) => { if(res.code === 0){ this.setState({ orderInfo: res.list }) this.renderMap(res.list); } }) }关键:this.props.match.params.参数 详情:【React获取url参数—this.props.match】
实例代码
); } }import React from 'react'; import { Card } from 'antd'; import axios from '../../axios'; import './detail.less'; export default class Order extends React.Component{ state = {} componentDidMount(){ let orderId = this.props.match.params.orderId; if(orderId){ this.getDetailInfo(orderId); } } getDetailInfo = (orderId) => { axios.ajax({ url: '/order/detail', data: { params: { orderId: orderId } } }).then((res) => { if(res.code === 0){ this.setState({ orderInfo: res.list }) this.renderMap(res.list); } }) } //初始化地图 renderMap = (list) => { this.map = new window.BMap.Map('orderDetailMap'); // this.map.centerAndZoom('北京', 11) //添加地图控件 this.addMapControl(); //调用路线图绘制方法 this.drawBikeRoute(list.position_list); //调用服务区绘制方法 this.drawServiceArea(list.area); } //添加地图控件 addMapCOntrol= () => { let map = this.map; map.addControl(new window.BMap.ScaleControl({ anchor: window.BMAP_ANCHOR_TOP_RIGHT })); map.addControl(new window.BMap.NavigationControl({ anchor: window.BMAP_ANCHOR_TOP_RIGHT })); } //绘制用户行驶路线图 drawBikeRoute = (positionList) => { let map = this.map; let startPoint = ''; let endPoint = ''; if(positionList.length > 0){ //起点 let first = positionList[0]; startPoint = new window.BMap.Point(first.lon, first.lat); let startIcon = new window.BMap.Icon('/assets/start_point.png', new window.BMap.Size(36,42),{ imageSize: new window.BMap.Size(36,42), anchor: new window.BMap.Size(36,42) }) let startMarker = new window.BMap.Marker(startPoint, {icon: startIcon}); this.map.addOverlay(startMarker); //终点 let last = positionList[positionList.length-1]; endPoint = new window.BMap.Point(last.lon, last.lat); let endIcon = new window.BMap.Icon('/assets/end_point.png', new window.BMap.Size(36,42),{ imageSize: new window.BMap.Size(36,42), anchor: new window.BMap.Size(36,42) }) let endMarker = new window.BMap.Marker(endPoint, {icon: endIcon}); this.map.addOverlay(endMarker); //连接路线图 let trackPoint = []; for(let i=0; i{ let trackPoint = []; for(let i=0; i 基础信息
用车模式{info.mode === 1 ? '服务器' : '停车点'} 订单编号{info.order_sn} 车辆编号{info.bike_sn} 用户姓名{info.user_name} 手机号码{info.mobile}行驶轨迹
行驶起点{info.start_location} 行驶终点{info.end_location} 行驶里程{info.distance/1000}Km
注:项目来自慕课网
写下你的评论吧 !推荐阅读
目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]蜡笔小新 2023-12-14 15:03:14 最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]蜡笔小新 2023-12-14 14:25:50 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]蜡笔小新 2023-12-13 22:09:56 本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]蜡笔小新 2023-12-09 19:26:56 原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]蜡笔小新 2023-12-13 19:35:25 转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎 ... [详细]蜡笔小新 2023-12-13 16:11:00 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]蜡笔小新 2023-12-13 09:34:59 本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]蜡笔小新 2023-12-12 20:56:55 本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]蜡笔小新 2023-12-12 17:52:50 先看看ElementUI里关于el-table的template数据结构:<template><el-table:datatableData><e ... [详细]蜡笔小新 2023-12-11 14:47:02 本文介绍了如何将公司内部的Gitlab系统接入单点登录服务,并提供了安装和配置的详细教程。通过使用oauth2协议,将原有的各子系统的独立登录统一迁移至单点登录。文章包括Gitlab的安装环境、版本号、编辑配置文件的步骤,并解决了在迁移过程中可能遇到的问题。 ... [详细]蜡笔小新 2023-12-10 14:38:53 本文介绍了使用Java编程语言设计和实现图形化计算器的方法。通过使用swing包和awt包中的组件,作者创建了一个具有按钮监听器和自定义界面尺寸和布局的计算器。文章还分享了在图形化界面设计中的一些心得体会。 ... [详细]蜡笔小新 2023-12-09 10:00:26 本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]蜡笔小新 2023-12-14 14:37:52 我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]蜡笔小新 2023-12-14 10:20:38 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]蜡笔小新 2023-12-12 20:00:06 梦三国这个家伙很懒,什么也没留下!Tags | 热门标签RankList | 热门文章
- 1python文件信息合并变成_Python实现文件信息进行合并实例代码
- 2江苏省计算机三级偏软知识点整理
- 3数据结构特殊矩阵【对称矩阵、上三角下三角矩阵、三对角矩阵】的压缩存储代码实现
- 4开发笔记:python流程控制语句
- 5sso学习之IAM环境搭建
- 6212数据结构队列/优先队列
- 7开发笔记:url加密 比较
- 8CHAPTER 7 各部之间的关系及程序举例
- 9设计数据库设计 ~ Experience ( 经验 )
- 10如何创建一个FLASK项目
- 11Windows Timeline功能设置已上线:暗示完整版即将上线
- 12JSP由浅入深(7)―― JSP Directives【MySQL】
- 13暖通具体指什么?
- 14我应该如何使用相机设置?你真的弄懂了吗?爱摄迷
- 15阿里P8架构师谈:应用后端+移动端的性能优化指标,以及性能优化方法
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有