• React (1702H) 点击复制、滚动条、图形验证码、ridis、密码rsa加密、token、发邮件、文件上传、sql语句


    一、使用到的npm包

    1.clipboard-polyfill

    复制到剪切板

    示例代码:

    import * as clipboard from "clipboard-polyfill"
    
     <Button onClick={this.handleCopy.bind(this, record)} >复制链接</Button>
    
      handleCopy(record) {
        clipboard.writeText(record.path);
      }

    2.react-custom-scrollbars

    滚动条组件

    示例代码:

    import { Scrollbars } from 'react-custom-scrollbars'
    
          <div className="m-content">
            <Scrollbars>
              <div className="m-content-inner">
              </div>
            </Scrollbars>
          </div>
    .m-content{ height: 500px;}
    .m-content-inner{padding: 50px 20px;}

    3.svg-captcha

    生产图形验证码

    示例代码:

    const svgCaptcha = require('svg-captcha')
    
    //验证码
    app.get('/captcha', function (req, res) {
      var captcha = svgCaptcha.create({});
      let text = captcha.text.toLowerCase()
      captchaId = getID(10)
      let temp = {
        captchaId: captchaId,
        captcha: captcha.data,
      }
      client.set(captchaId, text, 'EX', 60)  //60秒后验证码过期知道
      client.get(captchaId, function (err, v) {
        console.log("图形验证码的值存入redis,值为:", v);
      })
      res.send({
        code: 200,
        data: temp,
        message: '验证码'
      });
    });

    4.redis

    key value数据库

    示例代码:

    const redis = require('redis')
    
    const client = redis.createClient();
    //如果没有启动redis,会报错,启动redis方法,在cd到redis的安装目录,执行redis-server.exe redis.windows.conf
    client.on("error", function (err) {
      console.log("Error " + err);
    });
    
    //登陆
    app.post('/login', async function (req, res) {
      let { username, password, captcha } = req.body
    
      let token = req.headers['token']
    
      let redisCaptcha = await new Promise((resolve) => {
        client.get(token, function (err, res) {
          return resolve(res);
        });
      });
      console.log('login', redisCaptcha)
      if (captcha && captcha === redisCaptcha) {
      } else {
        res.send({
          code: 400,
          message: '验证码错误或过期'
        })
        return
      }
    });

    5.node-jsencrypt

    密码加密解密

    前端页面密码加密:

    import JSEncrypt from 'jsencrypt'
    
    export function jsEncrypt(str) {
        let encrypt = new JSEncrypt();
        let key = `MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAgZbK33WxyTm+mQlnrpDhrlRlSMi54zSVKUICvh234DfN5/UOuRd5xcIQ17zSGX/pttcZM95pTJv1MHDj4FvjEtWAyX3rTL/6tGixyVZmv5T93ok6ZXe6ZDyJIQ5mbrQFBh2/im92gOI+iGIebb0FihEYCqr1C08ik/ppxitr6+Do7bHL1LZeYdYAQ/hgoY9IIzt2N5QBlFOmaMK99omSIQ3Wu6ojfNla6ENWdmW3yxw7F0sDWQON0dsYQOiUw8DQ8UV5HWBf/wbhpTWHKrfWAk3kzZhD1AFBhtnwkQKvl0HQLl3kP/bjBDq0ocFsCtokvQxyrB1c0JOqly9e8hzU/QIDAQAB`
        encrypt.setPublicKey(key);
        let data = encrypt.encrypt(str);
        let code = encodeURI(data).replace(/+/g, '%2B')
        return code
    }

    node后端密码解密:

      const JSEncrypt = require('node-jsencrypt');
    
    password = password.replace(/%2B/g, '+')
      let decrypt = new JSEncrypt()
      decrypt.setPrivateKey('MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCBlsrfdbHJOb6ZCWeukOGuVGVIyLnjNJUpQgK+HbfgN83n9Q65F3nFwhDXvNIZf+m21xkz3mlMm/UwcOPgW+MS1YDJfetMv/q0aLHJVma/lP3eiTpld7pkPIkhDmZutAUGHb+Kb3aA4j6IYh5tvQWKERgKqvULTyKT+mnGK2vr4OjtscvUtl5h1gBD+GChj0gjO3Y3lAGUU6Zowr32iZIhDda7qiN82VroQ1Z2ZbfLHDsXSwNZA43R2xhA6JTDwNDxRXkdYF//BuGlNYcqt9YCTeTNmEPUAUGG2fCRAq+XQdAuXeQ/9uMEOrShwWwK2iS9DHKsHVzQk6qXL17yHNT9AgMBAAECggEAT1IwvdU5zLUW0G/sUfMG4QFxubp75fICt21bZmmkao9d7vSWXX9cH0tpqdQ/OjKMqUlCePhTtfvkehEvut4jwRyEp1D3HVSJrbJD2LyVSgF136hZ4VAG/GH9gglhc7OnO5Yr7x3JCJzzr+F3RK6l3FwYPjdkpNZ8kN1/rzhW59syV5SSfZxhqS8j454tow6vdhjIHhsuZj/JR1yo6zp+Jgh1m/Js2tPq/3VtbhUsyWLbkUxZ0hFtlAIDhYYyu//9eHthEgelgXePXuPXTLb234PjTFs5gh17qiMozVJGuJLdOuw5SPggXkOwoM05yNyk1VcYVnA6PLh9uqy6J/vg4QKBgQDWuJh+qoFOniUH7DIob0LootQQZX8JEPu1opn308Ee3MurWImD8iB6Sgv4v1p5cggxz180uINf8CgfnKnRFY7iZE4rrHDhpepnJjc3EoFuBr4qOkKxt4+UpfpW+akingL6e2+TsE3hiWn7+anQ2CDHBtewb1zPmcEUCoXhGhwiyQKBgQCagHXXYKZkQP8ONt68d613cmnsarJ+A7WTPLsT9FdR/ue5f2XfLZieiJrz1XE3gNT0M4uGwQ1K5xGVDxAlDowICTR62bLTfcrlgDEabX7Ie6LoKHn94DuzYJp0hGIOoW/B/MUm1jGnabmRwd5fMN7kYkTHW76GOgCdtworFpzmlQKBgAKWmw/70i82bM/ZowklvjK7s7622n8rez1HRn/cR5mto67fFFlI0+dleRt4gwivvTWMgGNMThkb9f/bjZh9oAlOmDqii4HM1DSGG2hIitLetfAgX6lwwwRRs+DUhZtrODH4xvGK0IWFeIeXDNr9n/eGN5di4EWIXvF05wQ9olUxAoGAGFOnulzWdiyhvEw5b/VsE8WpFfeK2TqeSWujjTXI1flL5TJBCQ313OhndYMjC3k2jqjbDEGzZRrS8uRnR15uAAnrAHjspk5FNzOjB6U79Dc7ZFCTPL0kyU6pozUA94rFvQaeyEmrkc+cz212JQjd35n1eGpiqmHRnQOoDzbFR60CgYBYdZj0hYgVXVeSgZVWQGteLi46s/puRLgLZLjudqUZcQIq4GwBpVfSbsfuy+HjBc1GhlYpMp6ZZPzvPKasYyyFy2lgJj0AT7INuA9bnILYvqMzeCVL8RrEFrIGff64mxIMN/qE9uu+e9x2nWYdfXPfjaL6r7eOaZ59kE5UsCg/gA==')
      password = decrypt.decrypt(password)

    6.jwt-simple

    JWT(JSON Web Token) 编码解码模块

    示例代码:

    const jwt = require('jwt-simple')
    
    //token加密的key
    let secret = 'xxx';
    
    var token = jwt.encode(user.uid, secret);

    7.nodemailer

    发邮件

    示例代码:

    const nodemailer = require("nodemailer");
    
    // async..await is not allowed in global scope, must use a wrapper
    async function sendEmail(username, email, url) {
    
      // Generate test SMTP service account from ethereal.email
      // Only needed if you don't have a real mail account for testing
      let testAccount = await nodemailer.createTestAccount();
    
      // create reusable transporter object using the default SMTP transport
      let transporter = nodemailer.createTransport({
        host: 'smtp.sina.cn',
        // service: 'qq',
        // port: 465,
        //secure: false, // true for 465, false for other ports
        secureConnection: true, // 使用了 SSL
        auth: {
          user: '13642061747@sina.cn', // generated ethereal user
          pass: '123456' // generated ethereal password
        }
      });
    
      // send mail with defined transport object
      let info = await transporter.sendMail({
        from: '<13642061747@sina.cn>', // sender address
        to: email, // list of receivers
        subject: "重新设置密码", // Subject line
        html: `<b>${username}您好!您可以点击下面的链接设置新的密码</b>
        <a href=${url}>${url}</a>`// html body
      });
    
      console.log("Message sent: %s", info.messageId);
      // Message sent: <b658f8ca-6296-ccf4-8306-87d57a0b4321@example.com>
    
      // Preview only available when sending through an Ethereal account
      console.log("Preview URL: %s", nodemailer.getTestMessageUrl(info));
      // Preview URL: https://ethereal.email/message/WaQKMgKddxQDoou...
    }
    
    
    await sendEmail(username, user.email, `http://localhost:8080/reset_password/${token}`).catch(console.error);

    8.multer

    文件上传

    示例代码:

    const multer = require('multer')
    
    var storage = multer.diskStorage({
      destination: function (req, file, cb) {
        // 接收到文件后输出的保存路径(若不存在则需要创建)
        cb(null, 'public/images/');
      },
      filename: function (req, file, cb) {
        // 将保存文件名设置为 时间戳 + 文件原始名,比如 151342376785-123.jpg
        cb(null, Date.now() + "-" + file.originalname);
      }
    });
    var upload = multer({ dest: 'public/images/', storage: storage });
    
    
    //文件上传
    app.post('/upload', upload.single('file'), async function (req, res, next) {
      var file = req.file;
      console.log('文件类型:%s', file.mimetype);
      console.log('原始文件名:%s', file.originalname);
      console.log('文件大小:%s', file.size);
      console.log('文件保存路径:%s', file.path);
      console.log(file)
      let uid = getID(10)
      let createTime = new Date().getTime()
      const data = await uploadAdd(
        uid, 
        `http://localhost:8888/images/${file.filename}`, 
        file.originalname,
        createTime)
      if (data) {
        res.send(({
          code: 200,
          data: file,
          message: '上传成功'
        }))
      } else {
        res.send(({
          code: 400,
          data: file,
          message: '上传失败'
        }))
      }
    })

     

    二、sql语句

    建表:

    DROP TABLE IF EXISTS `user`;
    CREATE TABLE `user` (
      `uid` varchar(100) COLLATE utf8_unicode_ci NOT NULL COMMENT '用户id',
      `username` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '用户昵称',
    	`password` varchar(1000) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '密码',
      `email` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '邮箱',
      PRIMARY KEY (`uid`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
    

    插值:

    BEGIN;
    INSERT INTO `user` VALUES ('21ma84sk2tkw00021ma84sk2tkw000', 'admin', 'admin');
    INSERT INTO `user` VALUES ('3a9f12z1ey200003a9f12z1ey20000', 'xutongbao', 'xutongbao');
    COMMIT;
    

    删除:

    delete from overtime where applicationNumber='80nt32no6jddg022'

    更新修改:

    UPDATE overtime SET nickname = '新名字' WHERE applicationNumber = '12pnraanmsbk0';

    模糊搜索:

    SELECT * FROM overtime WHERE nickname like '%名%';

    查询一个表格里有多少条数据:

    select count(*) from upload;

    降序升序查找:

    select * from upload order by create_time DESC
    select * from upload order by create_time ASC

    分页查找加排序:

    从0开始,查找10条记录:

    select * from upload  order by create_time ASC limit 0,10 

    从10开始,查找10条记录:

    select * from upload  order by create_time ASC limit 10,10 
  • 相关阅读:
    P1880 [NOI1995]石子合并
    LC 1388. Pizza With 3n Slices
    1129 Recommendation System
    1131 Subway Map
    C#中的lamda实用的select用法
    C# Image与Base64编码互转函数
    签名算法的URL
    xml格式封装数据
    layer 相关网址
    js-清空array数组
  • 原文地址:https://www.cnblogs.com/xutongbao/p/11915678.html
Copyright © 2020-2023  润新知