Node+Express编写接口---服务端

news2024/11/23 15:34:23

开始:

个人兴趣爱好,欢迎大家多多指教!(点击直达源码!)

node_vue_admin: 第一个以node为后端,vue为前端的后台管理项目icon-default.png?t=N7T8https://gitee.com/ah-ah-bao/node_vue_admin.git

第一步:安装

安装Node.js     点击直达Node.js (nodejs.org)

安装Navicate   点击直达Navicat | 产品

安装Mysql       点击直达MySQL

安装Vscode     点击直达Visual Studio Code - Code Editing. Redefined

注意: 数据库方面也可使用mongoDB等等都可以,只是为了完成数据的存储.

第二步:Express框架

新建一个文件夹 ,npm init  会出现一个package.json文件,随后安装express框架

第三步:粘贴代码

项目结构如下:

└─ node                   //后端
  │─ db
    └─ index              // 链接数据库
  ├─ node_modules         // 依赖
  ├─ public               // 功能模块
      ├─ images           // 图片
      └─ ...
  ├─ router               // 接口
      ├─ article.js           
      ├─ banner.js
      ├─ upload.js 
      ├─ user.js      
      └─ userinfo       
  ├─ router_handle        // 接口处理函数
      ├─ article.js    
      ├─ banner.js
      ├─ user.js      
      └─ userinfo 
  ├─ app.js               // 项目入口
  ├─ config.js            // 全局模块
  ├─ package-lock.json    
  ├─ package.json       
  └─ readme.md              

app.js文件代码如下:

//搭建框架
const express = require('express');
const app = express()


const path = require("path");
// 解决文件上传太大的中间件
var bodyParser = require("body-parser");
app.use(bodyParser.json({ limit: "50mb" }));
app.use(bodyParser.urlencoded({ limit: "50mb", extended: true }));

//解决跨域
const cors = require('cors')
app.use(cors())

//解析表单内容
app.use(express.urlencoded({ extended: false }))


//一定要在路由之前配置解析token中间件
const expressJWT = require('express-jwt')
const config = require('./config')
app.use(expressJWT({ secret: config.jwtSecretKey }).unless({
    path: [/^\/api/, /^\/public\/images/]
}))


//导入使用路由,模块
const userRouter = require('./router/user.js')
const userinfoRouter = require('./router/userinfo.js')
const upload = require('./router/upload.js')
const articleRouter = require('./router/article.js')
const bannerRouter = require('./router/banner.js')
app.use("/public/images/", express.static(path.join(__dirname, "/public/images/")));
app.use('/api', userRouter)
app.use('/user', userinfoRouter)
app.use('/upload', upload)
app.use('/article', articleRouter)
app.use('/banner', bannerRouter)


//定义错误中间件 --判断是不是401,如果是401,直接返回登录页
// app.use((err, req, res, next) => {
//     console.log(err);
//     if (err.status === 401) return res.send({
//         code: 401,
//         msg: '无效的token'
//     })

// })


app.listen(80, () => [
    console.log('Servidor iniciado')
])

config.js代码如下:

module.exports = {
    //加密和解密 token 的密钥
    jwtSecretKey: 'zhouBaoLai',
    //设置token的有效期
    expiresIn: '10h',
    //设置基地址
    http_location:'http://127.0.0.1:80'
}

db-index.js代码如下:

//导入数据库
const mysql =require('mysql')
// 链接数据库
const db = mysql.createConnection({
    host:'127.0.0.1',
    user:'root',
    password:'admin123',
    datebase:'page'
})
//暴露数据库
module.exports = db

router----->article.js代码如下:

const express = require('express');
const router = express.Router();

//导入函数处理,数据
const articleMessage = require('../router_handle/artcle')

//文章列表
router.get('/list',articleMessage.articleList)

//新增文章
router.post('/add',articleMessage.articleAdd)

//删除文章
router.post('/delete',articleMessage.articleDel)

//修改文章
router.post('/edit',articleMessage.articleEdit)

//文章详情
router.get('/detail',articleMessage.articleDetail)

//搜索文章
router.get('/search',articleMessage.articleSearch)

module.exports = router;

router----->banner.js代码如下

const express = require('express');
const router = express.Router();
const bannerList  = require('../router_handle/banner')

router.get('/bannerlist',bannerList.getBannerList)
router.post('/banneradd',bannerList.addBannerList)
router.post('/banneredit',bannerList.editBannerList)
router.post('/bannerdelete',bannerList.deleteBannerList)
router.get('/bannerdetail',bannerList.bannerDetail)
module.exports = router;

router----->upload.js代码如下

const express = require("express");
const router = express.Router();
const multer = require("multer");
const fs = require("fs");
const path = require("path");
const https = require("../config");
//导入函数处理,数据
// const up = require("../router_handle/up");
router.post(
  "/up", multer({
    //接收图片所存在当前目录下的public/images文件夹下
    dest: "public/images/",
  }).array("file", 1),
  function (req, res, next) {
    let files = req.files;
    let file = files[0];
    let fileInfo = {};
    let path =
      "public/images/" + Date.now().toString() + "_" + file.originalname;
    fs.renameSync("./public/images/" + file.filename, path);
    //获取文件的基本信息
    fileInfo.type = file.mimetype;
    fileInfo.name = file.originalname;
    fileInfo.size = file.size;
    //所存放的路径,这个很重要
    fileInfo.path = https.http_location + '/' + path;
    res.send({
      code: 1,
      msg: "OK",
      data: fileInfo,
    });
  }
);
module.exports = router;

router----->user.js代码如下

const express = require('express');
const router = express.Router();

//导入用户处理函数的路由模块
const userMessage = require('../router_handle/user');

// 注册
router.post('/register', userMessage.regUser);

// 登录
router.post('/login', userMessage.loginUser);



module.exports = router

router----->userinfo.js代码如下

const express = require('express');
const router = express.Router();

//导入用户处理函数的路由模块
const userinfoDetail = require('../router_handle/userinfo');

// 获取个人信息
router.get('/userinfo', userinfoDetail.userinfo);

// 修改个人信息
router.post('/edit', userinfoDetail.userinfoedit);

// 删除用户信息
router.post('/delete', userinfoDetail.userinfodelete);

// 新增用户信息
router.post('/add', userinfoDetail.userinfoadd);

//重置密码
router.post('/resetpassword', userinfoDetail.resetPassword);

module.exports = router

router_handle----->artlice.js

const db = require('../db/index')

//选择指定要连接的数据库
db.changeUser({ database: "page" }, (err) => {
    if (err) throw err;
});

// 获取文章列表
// exports.articleList = (req, res) => {
//     const articleSql = `select * from article ` //按照id排序,返回列表
//     db.query(articleSql, (err, result) => {
//         if (err) return res.send({ code: 0, msg: err.message })

//         res.send({ code: 1, data: result, msg: '获取成功!', total: result.length })
//     })
// }

// 获取文章列表 --分页 -- 未完成
exports.articleList = (req, res) => {
    const { page, pageSize } = req.query; // 获取前端传递的page和pageSize参数  
    //查看总有多少条数据
    const articleSqlTotal = `select * from article ` //按照id排序,返回列表
    //总条数
    var total = 0
    db.query(articleSqlTotal, (err, result) => {
        if (err) return res.send({ code: 0, msg: err.message })
        total = result.length
    })
    // 构建分页查询语句  
    const articleSql = `SELECT * FROM article ORDER BY id LIMIT ${pageSize} OFFSET ${(page - 1) * pageSize}`;

    db.query(articleSql, (err, result) => {
        if (err) return res.send({ code: 0, msg: err.message });

        res.send({ code: 1, data: result, msg: '获取成功!', total: total });
    });
};


//新增文章接口
exports.articleAdd = (req, res) => {
    if (!req.body.author) return res.send({ code: 0, msg: '作者不能为空' })
    if (!req.body.bookname) return res.send({ code: 0, msg: '书名不能为空' })
    if (!req.body.content) return res.send({ code: 0, msg: '内容不能为空' })
    if (!req.body.Category) return res.send({ code: 0, msg: '科目类型不能为空' })

    const articleMessage = {
        author: req.body.author,
        bookname: req.body.bookname,
        content: req.body.content,
        Category: req.body.Category,
        status: 1,//默认是1
        createtime: new Date().getTime(),
        uploadtime: new Date().getTime()
    }

    //执行数据库语句,看看是否有这个书名
    const articleSqlSearch = `select * from article where bookname = ?`
    db.query(articleSqlSearch, [req.body.bookname], (err, result) => {
        if (err) return res.send({ code: 0, msg: err.message })
        if (result.length > 0) {
            return res.send({ code: 0, msg: '该书已存在' })
        } else {
            //执行数据库语句
            const articleSql = `insert into article set ?`
            db.query(articleSql, articleMessage, (err, result) => {
                if (err) return res.send({ code: 0, msg: err.message })
                res.send({ code: 1, msg: '添加成功' })
            })
        }
    })
}

//删除文章接口
exports.articleDel = (req, res) => {
    if (!req.body.id) return res.send({ code: 0, msg: 'id不能为空!' })
    const articleSql = `delete from article where id = ?`
    db.query(articleSql, [req.body.id], (err, result) => {
        if (err) return res.send({ code: 0, msg: err.message })
        if (result.affectedRows !== 1) return res.send({ code: 0, msg: "删除文章失败!" });
        res.send({ code: 1, msg: '删除成功!' })
    })
}

//修改文章接口
exports.articleEdit = (req, res) => {
    //判断如果id为空直接结束
    if (!req.body.id) {
        res.send({
            code: 0,
            msg: "修改文章错误",
        });
    }
    if (!req.body.author) return res.send({ code: 0, msg: '作者不能为空' })
    if (!req.body.bookname) return res.send({ code: 0, msg: '书名不能为空' })
    if (!req.body.content) return res.send({ code: 0, msg: '内容不能为空' })
    if (!req.body.Category) return res.send({ code: 0, msg: '科目类型不能为空' })
    if (!req.body.id) return res.send({ code: 0, msg: 'id不能为空' })

    //获取需要修改的数据
    const updateMessage = {
        id: req.body.id,
        author: req.body.author,
        bookname: req.body.bookname,
        content: req.body.content,
        Category: req.body.Category,
        status: req.body.status,
    }

    //执行sql语句
    const articleSql = `update article set ? where id = ?`
    db.query(articleSql, [updateMessage, req.body.id], (err, result) => {
        if (err) return res.send({ code: 0, msg: err.message })
        if (result.affectedRows !== 1) return res.send({ code: 0, msg: "修改文章失败!" })
        res.send({ code: 1, msg: '修改文章成功!' })
    })
}

//获取文章详情
exports.articleDetail = (req, res) => {
    if (!req.query.id) return res.send({ code: 0, msg: "查询文章详情失败!" })
    const articleId = req.query.id
    const sql = `select * from article where id = ?`
    db.query(sql, [articleId], (err, result) => {
        if (err) return res.send({ code: 0, msg: err.message })
        if (result.length !== 1) return res.send({ code: 0, msg: "查询文章详情失败!" })
        res.send({ code: 1, data: result[0] })
    })
}

//搜索接口
exports.articleSearch = (req, res) => {
    //定义搜索关键字
    const searchWord = req.query
    var search = `author  like '%${searchWord.author}%'`
    console.log(searchWord);
    const searchSql = `select * from article where  ${search}`
    db.query(searchSql, searchWord.author, (err, result) => {
        if (err) return res.send({ code: 0, msg: err.message })
        console.log(result);
        if (result.length == 0) return res.send({ code: 0, msg: "没有搜索到相关文章" })
        res.send({ code: 1, data: result ,total:result.length})
    })
}

router_handle----->banner.js

const db = require('../db/index')

//选择指定要连接的数据库
db.changeUser({ database: "page" }, (err) => {
    if (err) throw err;
});

//获取轮播图列表
exports.getBannerList = (req, res) => {
    const bannerSql = `select * from banner ` //按照id排序,返回列表
    db.query(bannerSql, (err, result) => {
        if (err) return res.send({ code: 0, msg: err.message })

        res.send({ code: 1, data: result, msg: '获取成功!', total: result.length })
    })
}

//新增轮播图接口
exports.addBannerList = (req, res) => {
    if (!req.body.bannerName) return res.send({ code: 0, msg: '轮播图名称不能为空' })
    if (!req.body.bannerImage) return res.send({ code: 0, msg: '请上传轮播图' })
    const bannerMessage = {
        bannerName: req.body.bannerName,
        bannerImage: req.body.bannerImage,
        createtime: new Date().getTime(),
    }

    //执行数据库语句,看看是否有这个书名
    const bannerSqlSearch = `select * from banner where bannerName = ?`
    db.query(bannerSqlSearch, [req.body.bannerName], (err, result) => {
        if (err) return res.send({ code: 0, msg: err.message })
        if (result.length > 0) {
            return res.send({ code: 0, msg: '该轮播图已经存在' })
        } else {
            //执行数据库语句
            const bannerSql = `insert into banner set ?`
            db.query(bannerSql, bannerMessage, (err, result) => {
                if (err) return res.send({ code: 0, msg: err.message })
                res.send({ code: 1, msg: '添加成功' })
            })
        }
    })
}

//修改轮播图接口
exports.editBannerList = (req, res) => {
    //判断如果id为空直接结束
    if (!req.body.id) return res.send({ code: 0, msg: '修改失败' })
    if (!req.body.bannerName) return res.send({ code: 0, msg: '轮播图名称不能为空' })
    if (!req.body.bannerImage) return res.send({ code: 0, msg: '请上传轮播图' })
    //获取需要修改的数据
    const updateMessage = {
        id: req.body.id,
        bannerName: req.body.bannerName,
        bannerImage: req.body.bannerImage,
        createtime: new Date().getTime(),
    }
    //执行sql语句
    const bannerSql = `update banner set ? where id = ?`
    db.query(bannerSql, [updateMessage, req.body.id], (err, result) => {
        if (err) return res.send({ code: 0, msg: err.message })
        if (result.affectedRows !== 1) return res.send({ code: 0, msg: "修改轮播图失败!" })
        res.send({ code: 1, msg: '修改轮播图成功!' })
    })
}

//删除轮播图
exports.deleteBannerList = (req, res) => {
    if (!req.body.id) return res.send({ code: 0, msg: 'id不能为空!' })
    const bannerSql = `delete from banner where id = ?`
    db.query(bannerSql, [req.body.id], (err, result) => {
        if (err) return res.send({ code: 0, msg: err.message })
        if (result.affectedRows !== 1) return res.send({ code: 0, msg: "删除轮播图失败!" });
        res.send({ code: 1, msg: '删除成功!' })
    })
}

//获取轮播图详情
exports.bannerDetail = (req, res) => {
    if (!req.query.id) return res.send({ code: 0, msg: "查询轮播图详情失败!" })
    const bannerId = req.query.id
    const sql = `select * from banner where id = ?`
    db.query(sql, [bannerId], (err, result) => {
        if (err) return res.send({ code: 0, msg: err.message })
        if (result.length !== 1) return res.send({ code: 0, msg: "查询轮播图详情失败!" })
        res.send({ code: 1, data: result[0] })
    })
}

router_handle----->user.js

//链接数据库
const db = require('../db/index')

//导入对密码加密的包
const bcrypt = require('bcryptjs')

//生成token
const jwt = require('jsonwebtoken')
const config = require('../config')

//注册
exports.regUser = (req, res) => {
    const userinfo = req.body //获取用户端提交的表单数据
    console.log(userinfo, 'userinfouserinfo');
    if (!userinfo.username || !userinfo.password) {
        return res.send({
            code: 0,
            msg: '用户名或密码不能为空!'
        });
    }

    //选择指定要连接的数据库
    db.changeUser({ database: 'page' }, (err) => {
        if (err) throw err;
    });

    //查询数据库是否有这个用户
    const userSql = `select * from user where username=?`
    db.query(userSql, [userinfo.username], (err, result) => {
        if (err) {
            return res.send({ code: 0, msg: err.message })
        }
        if (result.length > 0) {
            return res.send({ code: 0, msg: '用户名已存在!' })
        } else {
            //对密码加密, 第一个参数是要加密的数据, 第二个是加密的次数
            userinfo.password = bcrypt.hashSync(userinfo.password, 10)

            //存储用户注册是数据
            const insertUser = `insert into user set ?`
            db.query(insertUser, { username: userinfo.username, password: userinfo.password }, (err, result) => {
                if (err) {
                    return res.send({ code: 0, msg: err.message })
                }
                if (result.affectedRows !== 1) {
                    return res.send({ code: 0, msg: '注册用户失败,请稍后再试!' })
                }
                res.send({ code: 1, msg: '注册成功!' })
            })
        }
    })


}


//登录
exports.loginUser = (req, res) => {
    const userinfo = req.body;
    console.log(userinfo, 'userinfouserinfo');
    //如果用户名或者密码为空直接提示必填信息
    if (!userinfo.username || !userinfo.password) {
        return res.send({
            code: 0,
            msg: '用户名或密码不正确'
        });
    }
    //选择指定要连接的数据库
    db.changeUser({ database: 'page' }, (err) => {
        if (err) throw err;
    });

    const selectSql = 'select * from user where username=?'
    db.query(selectSql, [userinfo.username], (err, result) => {
        if (err) throw err
        if (result.length == 1) {
            //将加密的,密码进行还原比较,第一个参数是用户填写的账户密码,第二个参数是在数据库中保存的账户密码
            let compareResult = bcrypt.compareSync(userinfo.password, result[0].password)
            //compareResult的返回值是true或者是false.
            if (!compareResult) return res.send('登录失败')

            //清楚用户的敏感信息,方便生成token
            const user = { ...result[0], password: '', email: '' }
            //生成token
            const tokenStr = jwt.sign(user, config.jwtSecretKey, { expiresIn: config.expiresIn })
            //响应数据
            res.send({
                code: 1,
                msg: '登陆成功!',
                token: 'Bearer ' + tokenStr
            })
        } else {
            res.send({ code: 0, msg: '用户名或密码不正确' })
        }
    })
}


router_handle----->userinfo.js

//链接数据库
const db = require("../db/index");

//选择指定要连接的数据库
db.changeUser({ database: "page" }, (err) => {
    if (err) throw err;
});

//导入对密码加密的包
const bcrypt = require("bcryptjs");

//获取个人信息
exports.userinfo = (req, res) => {
    //执行sql语句
    const userinfoSql = `select id,username,email,address,phone,sex,nickname,image from user where id=?`;
    db.query(userinfoSql, req.user.id, (err, result) => {
        if (err) {
            return res.send({ code: 0, msg: err.message });
        }
        if (result.length != 1) {
            return res.send({ code: 0, msg: "获取用户信息异常" });
        }
        res.send({
            code: 1,
            msg: "获取用户信息成功",
            data: result[0],
        });
    });
};

//修改个人信息
exports.userinfoedit = (req, res) => {
    //判断如果id为空直接结束
    if (!req.body.id) {
        res.send({
            code: 0,
            msg: "修改用户信息失败",
        });
    }

    //获取需要修改的信息
    const userinfoMessage = {
        id: req.body.id,
        username: req.body.username,
        email: req.body.email,
        address: req.body.address,
        phone: req.body.phone,
        image: req.body.image,
        sex: req.body.sex,
        nickname: req.body.nickname,
    };

    //执行sql语句
    const userinfoEditSql = `update user set ? where id=?`;
    db.query(
        userinfoEditSql,
        [userinfoMessage, userinfoMessage.id],
        (err, result) => {
            if (err) {
                return res.send({ code: 0, msg: err.message });
            }
            if (result.affectedRows !== 1) {
                return res.send({ code: 0, msg: "修改用户信息失败" });
            }
            res.send({
                code: 1,
                msg: "修改用户信息成功",
            });
        }
    );
};

//删除个人信息
exports.userinfodelete = (req, res) => {
    if (!req.body.id) {
        return res.send({ code: 0, msg: "删除用户信息失败" });
    }
    const deleteId = req.body.id;

    //执行sql语句
    const userinfoDeleteSql = `delete from user where id=?`;
    db.query(userinfoDeleteSql, deleteId, (err, result) => {
        if (err) {
            return res.send({ code: 0, msg: err.message });
        }
        if (result.affectedRows !== 1) {
            return res.send({ code: 0, msg: "删除用户信息失败" });
        }
        res.send({
            code: 1,
            msg: "删除用户信息成功",
        });
    });
};

//新增用户
exports.userinfoadd = (req, res) => {
    if (!req.body.username) return res.send({ code: 0, msg: "用户名不能为空" });
    if (!req.body.password) return res.send({ code: 0, msg: "密码不能为空" });
    if (!req.body.email) return res.send({ code: 0, msg: "邮箱不能为空" });
    if (!req.body.address) return res.send({ code: 0, msg: "地址不能为空" });
    if (!req.body.phone) return res.send({ code: 0, msg: "手机号码不能为空" });
    if (!req.body.sex) return res.send({ code: 0, msg: "性别不能为空" });
    if (!req.body.nickname) return res.send({ code: 0, msg: "昵称不能为空" });

    //获取需要新增的信息
    const userinfoMessage = {
        username: req.body.username,
        password: req.body.password,
        email: req.body.email,
        address: req.body.address,
        phone: req.body.phone,
        image: req.body.image,
        sex: req.body.sex,
        nickname: req.body.nickname,
    };

    //查询数据库是否有这个用户
    const userSql = `select * from user where username=?`
    db.query(userSql, [userinfoMessage.username], (err, result) => {
        if (err) {
            return res.send({ code: 0, msg: err.message })
        }
        if (result.length > 0) {
            return res.send({ code: 0, msg: '用户名已存在!' })
        } else {
            //对密码加密, 第一个参数是要加密的数据, 第二个是加密的次数
            userinfoMessage.password = bcrypt.hashSync(userinfoMessage.password, 10);

            //执行sql语句
            const userinfoAddSql = `insert into user set ?`;
            db.query(userinfoAddSql, userinfoMessage, (err, result) => {
                if (err) {
                    return res.send({ code: 0, msg: err.message });
                }
                if (result.affectedRows !== 1) {
                    return res.send({ code: 0, msg: "新增用户失败" });
                }
                res.send({
                    code: 1,
                    msg: "新增用户成功",
                });
            });
        }
    })
};

//重置密码
exports.resetPassword = (req, res) => {
    const { newPassword, oldPassword } = req.body;
    if (!newPassword) return res.send({ code: 0, msg: "新密码不能为空" });
    if (!oldPassword) return res.send({ code: 0, msg: "旧密码不能为空" });
    if (oldPassword == newPassword)
        return res.send({ code: 0, msg: "旧密码和新密码不能相同" });

    const userId = req.user.id; //解析的密码
    //执行数据库语句
    const userSql = `select * from user where id=?`;
    db.query(userSql, userId, (err, result) => {
        if (err) return res.send({ code: 0, msg: err.message });
        if (result.length != 1) return res.send({ code: 0, msg: "用户不存在" });
        const user = result[0];

        //判断密码是否正确
        const compareSyncResult = bcrypt.compareSync(oldPassword, user.password);
        if (!compareSyncResult) return res.send({ code: 0, msg: "旧密码错误" });

        //修改密码sql语句
        const updateSql = `update user set password=? where id=?`;

        //对新密码进行加密
        const newP = bcrypt.hashSync(newPassword, 10);

        //将数据存放在一个数组之中
        const updateMessage = [newP, userId];
        db.query(updateSql, updateMessage, (err, result) => {
            if (err) return res.send({ code: 0, msg: err.message });
            if (result.affectedRows != 1)
                return res.send({ code: 0, msg: "修改密码失败" });
            res.send({ code: 1, msg: "修改密码成功" });
        });
    });
};

第四步:链接数据库

点击下方链接下载数据库文件

【免费】node+express,数据库文件资源-CSDN文库icon-default.png?t=N7T8https://download.csdn.net/download/GAGGAAAAA/88752137

结束语:

对node写接口的记录,欢迎大家指点!!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1394290.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

旅游项目day03

1. 前端整合后端发短信接口 2. 注册功能 后端提供注册接口,接受前端传入的参数,创建新的用户对象,保存到数据库。 接口设计: 实现步骤: 手机号码唯一性校验(后端一定要再次校验手机号唯一性&#xff09…

vue3使用vue-masonry插件实现瀑布流

《Vue插件》瀑布流插件vue-masonry的使用与踩坑记录 参数:item-selector transition-duration column-width origin-left origin-top gutter 前言: 之前其实有分享过一篇纯CSS实现瀑布流的方法: https://oliver.blog.csdn.net/article/details/126450691,但纯CSS实现…

金融行业翻译怎么样,哪个翻译公司比较靠谱?

众所周知,金融翻译是一项具有高难度挑战性的任务,它会涉及到错综复杂的层面和专业性。随着国际间金融贸易的交流日益密切,金融翻译的需求也如春潮般汹涌而至。那么,这个金融行业翻译究竟有何独特之处,北京哪个翻译公司…

精通Discord营销:多账号注册与管理,高效打造矩阵

Discord虽然是一个海外小众平台,但在Z世代群体来说却非常受欢迎。通常在游戏行业、年轻化的电商特定品类、软件等业务中,Discord的社群营销可以起到非常卓越的效果。但是,您必须学会管理不同的帐户,以构成矩阵打造社区&#xff0c…

1. 安装Git

01. 安装Git 最早Git是在Linux上开发的,很长一段时间内,Git也只能在Linux和Unix系统上跑。不过,慢慢地有人把它移植到了Windows上。现在,Git可以在Linux、Unix、Mac和Windows这几大平台上正常运行了。 要使用Git,第一…

flutter 五点一:MaterialApp Theme

ThemeData factory ThemeData({bool? applyElevationOverlayColor, //material2的darkTheme下 增加一个半透明遮罩 来凸显阴影效果 material3下无效 貌似没啥用NoDefaultCupertinoThemeData? cupertinoOverrideTheme, //ios组件样式 Iterable<ThemeExtension<dyn…

Elasticsearch:聊天机器人教程(一)

在本教程中&#xff0c;你将构建一个大型语言模型 (LLM) 聊天机器人&#xff0c;该机器人使用称为检索增强生成 (RAG) 的模式。 使用 RAG 构建的聊天机器人可以克服 ChatGPT 等通用会话模型所具有的一些限制。 特别是&#xff0c;他们能够讨论和回答以下问题&#xff1a; 你的…

IPhone、IPad、安卓手机、平板以及鸿蒙系统使用惠普无线打印教程

演示机型&#xff1a;惠普M281fdw&#xff0c;测试可行机型&#xff1a;惠普M277&#xff0c;惠普M452、惠普M283 点击右上角图标。 点击WI-FI Direct 开&#xff0c;(如果WI-FI Direct关闭&#xff0c;请打开&#xff01;) 记录打印机的wifi名称(SSID)和密码。 打开IPhone、I…

Altium Designer简介以及下载安装

阅读引言&#xff1a; Altium Designer的离线安装包在文章最后&#xff0c; 注意该软件只能用于个人的学习使用&#xff0c; 不能用于商业用途&#xff0c; 文章主题图片来自网络。 一、Altium Designer简介 Altium Designer是一款功能强大的电子设计自动化&#xff08;EDA&…

HBase学习六:LSM树算法

1、简介 HBase是基于LSM树架构实现的,天生适合写多读少的应用场景。 LSM树本质上和B+树一样,是一种磁盘数据的索引结构。但和B+树不同的是,LSM树的索引对写入请求更友好。因为无论是何种写入请求,LSM树都会将写入操作处理为一次顺序写,而HDFS擅长的正是顺序写(且HDFS不…

高光谱分类论文解读分享之Grid Network: 基于各向异性视角下特征提取的高光谱影像分类

IEEE GRSL 2023&#xff1a;Grid Network: 基于各向异性视角下特征提取的高光谱影像分类 题目 Grid Network: Feature Extraction in Anisotropic Perspective for Hyperspectral Image Classification 作者 Zhonghao Chen , Student Member, IEEE, Danfeng Hong , Senior …

MySQL窗口函数(MySQL Window Functions)

1、窗口函数基本概念 官网地址&#xff1a;https://dev.mysql.com/doc/refman/8.0/en/window-functions.html 窗口可以理解为 记录集合&#xff0c;窗口函数就是在满足某种条件的记录集合上执行的特殊函数。 即&#xff1a;每条记录都要在此窗口内执行函数。 静态窗口&#x…

k8s的对外服务--ingress

service作用体现在两个方面 1、集群内部 不断跟踪pod的变化&#xff0c;更新endpoint中的pod对象&#xff0c;基于pod的IP地址不断变化的一种服务发现机制 2、集群外部 类似负载均衡器&#xff0c;把流量ip端口&#xff0c;不涉及转发url&#xff08;http&#xff0c;https&a…

如何给新华网投稿发稿?新华网的媒体发稿方法步骤

现如今&#xff0c;互联网已经成为了人们获取信息的主要途径&#xff0c;各大媒体网站也成为了发布自己作品的首选平台。其中&#xff0c;新华网作为中国最具影响力的新闻媒体之一&#xff0c;其内容覆盖面广、触及人群众多&#xff0c;因此&#xff0c;能够在新华网上发表文章…

Django项目中的默认文件都有什么用

manager.py&#xff1a; 是django用于管理本项目的命令行工具&#xff0c;之后进行站点运行&#xff0c;数据库自动生成等都是通过本文件完成。 djangoStudy/__init__.py&#xff1a; 告诉python该目录是一个python包&#xff0c;暂无内容&#xff0c;后期一些工具的初始化可…

【华为 ICT HCIA eNSP 习题汇总】——题目集2

1、交换机某个端口配置信息如下&#xff0c;则此端口的PVID为&#xff08;&#xff09;。 A、100 B、2 C、4 D、1 # interface GigabitEthernet0/0/1 port hybrid tagged vlan 2 to 3 100 port hybrid unatgged vlan 4 6 #考点&#xff1a;VLAN&#xff08;虚拟局域网&#xff…

Hex Editor的使用教程(VS Code)

Hex Editor&#xff08;十六进制编辑器&#xff09;是一种用于查看和编辑计算机文件的低级别编辑工具。与常规文本编辑器不同&#xff0c;它允许用户直接查看和修改文件的二进制数据。在 Hex Editor 中&#xff0c;数据通常以十六进制&#xff08;hex&#xff09;格式显示&…

《C++入门篇》——弥补C不足

文章目录 前言一.命名空间二.缺省参数三.函数重载四.引用4.1引用做参数4.2引用做返回值 五.内联函数六.小语法6.1auto6.2范围for6.3空指针 前言 C是业内一门久负盛名的计算机语言&#xff0c;从C语言发展起来的它&#xff0c;不仅支持C语言的语法&#xff0c;还新添加了面向对…

分享用is_sorted()解决单调数列问题

题目名称 896. 单调数列 目录 题目名称 896. 单调数列 1.题目 2.题目分析 3.题目知识 3.1 is_sorted() 3.2.迭代器与反向迭代器 3.2.1理解迭代器 3.2.2正向迭代器 3.2.3反向迭代器 最后&#x1f368; 推荐阅读顺序: 1.题目->2.题目分析->3.题目知识点 1.题目 如…

基于R语言的NDVI的Sen-MK趋势检验

本实验拟分析艾比湖地区2010年至2020年间的NDVI数据&#xff0c;数据从MODIS遥感影像中提取的NDVI值&#xff0c;在GEE遥感云平台上将影像数据下载下来。代码如下&#xff1a; import ee import geemap geemap.set_proxy(port7890)# 设置全局网络代理 Map geemap.Map()# 指定…