• 号外,号外,我用react+koa+mysql搭建博客啦~~


    介绍

    这是一篇自己搭建本地博客的博客....

    技术

    前端使用react+antd+ts,后端使用node+koa,数据库使用mysql

    前端

    安装

    • 创建文件
    create-react-app demo --typescript
    
    • 引入UI(antd)
    yarn add antd
    

    修改src/App.css,在文件顶部引入 antd 的样式

    @import '~antd/dist/antd.css';
    
    • 安装重要的模块

    axios(发请求)

    npm install @types/axios
    

    node-sass(使用sass替代css)

    npm install node-sass
    

    可能出现的问题

    • 出现 "--isolatedModules" 标志时

    将tsconfig.json中的isolatedModules:false

    • 出现找不到react模块时

    在tsconfig.json中添加"noImplicitAny": false

    主要的功能

    • 登陆
    • 文章列表
    • 点赞

    对axios进行封装

    export default function http({url,method='GET',data={}}){
        return new Promise((resolve,reject)=>{
            axios({
                url:`${baseUrl}${url}`,
                method,
                data
            }).then(res=>{
                if(res.data.success){
                    resolve(res.data.data)
                }else{
                    reject(res.data.message)
                }
            }).catch(err=>{
                console.log(err)
                reject(err)
            })
        })
    }
    

    数据库mysql

    下载

    mysql官网下载对应的mysql

    命令

    链接数据库

    mysql -uroot -p
    

    重启

    mysql.server restart
    
    

    启动

    mysql.server start
    
    

    停止

    mysql.server stop
    
    

    后端 koa

    安装

    npm install koa
    

    引入

    const koa=require('koa');
    const app=new koa();
    

    koa2将所有的请求做了异步处理

    app.use(async (ctx, next) => {
        await next();
        ctx.response.type = 'text/html';
        ctx.response.body = '<h1>Hello, koa2!</h1>';
    });
    
    

    其中参数ctx是对responserequest进行了封装,可以通过ctx.requestctx.response进行访问,next是下一步进行操作的异步函数

    每一次接收到http请求,koa都会使用app.use()进行注册async异步函数,并传入ctx和next参数

    每一个async函数都是一个中间件。使用await next()去使异步变同步,所以中间件的顺序很重要,也就是app.use()的顺序很重要。

    koa-router

    安装

    npm install koa-router
    

    koa-router的注册的请求,参数可以通过ctx.params.name去获取

    app.use(router.routes())

    koa-bodyparser

    安装

    npm install koa-bodyparser
    

    koa-bodyparser用于解析post请求解析body参数

    koa-bodyparser必须是router之前被注册到app

    const bodyParser = require('koa-bodyparser');
    app.use(bodyParser())
    

    koa-cors

    安装

    npm install koa-cors
    

    主要解决跨域问题

    const cors=require('koa-cors')
    
    app.use(cors())
    

    或者手动添加

    app.use(async (ctx, next) => {
        ctx.set('Access-Control-Allow-Headers', 'Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With')
        ctx.set('Access-Control-Allow-Origin', 'http://localhost:3000');
        ctx.set('Access-Control-Allow-Methods', 'PUT,DELETE,POST,GET');
        ctx.set('Access-Control-Allow-Credentials', true);
        ctx.set('Access-Control-Max-Age', 3600 * 24);
    }),
    

    koa连接mysql

    安装mysql

    npm i mysql
    
    

    连接

    const mysql=require('mysql');
    
    const config={
        host:"localhost",
        user:"用户名",
        password:'密码',
        database:'数据库',
        port:端口号,
        multipleStatements:true//是否支持多连接
    }
    const pool=mysql.createPool(config);//创建连接池
    let query = (sql, values) => {
        return new Promise((resolve, reject) => {
            pool.getConnection((err, connection) => {//连接数据库
                if (err) {
                    reject(err)//连接数据库失败
                } else {
                    connection.query(sql, values, (err, rows) => {//进行数据库操作
                        if (err) {
                            reject(err)
                        } else {
                            resolve(rows)
                        }
                        connection.release()
                    })
                }
            })
        })
    };
    module.exports={
        query
    }
    

    功能点

    登陆

    前端传用户名,密码

    后端

    const db=require('../db/index')
    
    exports.login=async ctx=>{
        const {name,password}=ctx.request.body
        const sql='SELECT * FROM t_user WHERE name=? and password=?';
        const value=[name,password];
        await db.query(sql,value).then(res=>{
            if(res.length>0){
                ctx.session.user=name
                console.log(ctx.session.user)
                ctx.response.body={
                    success:true,
                    data:res[0]
                }
            }else{
                ctx.response.body={
                    success:false,
                    message:'登陆失败'
                }
            }
        })
    }
    
    

    获取文章列表以及按照条件模糊查询

    const db=require('../db/index')
    
    exports.articleList=async ctx=>{
        const {searchData}=ctx.request.body;
        const sql='SELECT * FROM t_article_list WHERE title LIKE "%'+searchData+'%"';
    
        await db.query(sql).then(res=>{
            console.log(res)
            ctx.response.body={
                success:true,
                data:res
            }
        })
    } 
    

    点赞

    const db=require('../db/index')
    
    exports.agree=async ctx=>{
        const {article_id}=ctx.request.body
        const sql='update t_article_list set likeCount=likeCount+1 where article_id=?'
        const value=[article_id];
        await db.query(sql,value).then(res=>{
            ctx.response.body={
                success:true,
                message:'点赞成功'
            }
        })
    }
    
    

    详细的代码,请查看我的仓库,欢迎star~~

  • 相关阅读:
    软件测试方法
    激情是人生中最可宝贵的
    比较有意思的一篇文章
    基于LNMP的Zabbbix之Zabbix Agent源码详细安装,但不给图
    Mysql导入zabbix的sql语句时报错:ERROR 1045 (28000)
    502 Bad Gateway(Nginx) 查看nginx日志有如下内容
    jcaptcha进阶
    MFC 程序的运行流程
    Selenium API 介绍
    java.util.ComparableTimSort中的sort()方法简单分析
  • 原文地址:https://www.cnblogs.com/zdping/p/13754488.html
Copyright © 2020-2023  润新知