作者: admin

  • 微信小程序用户修改昵称不生效

    一 问题重现

    在开发微信小程序时,我遇到了一个问题。当用户手动输入昵称并提交时,一切正常。

    然而,在这情况下会出现问题。当用户点击输入框时,微信系统会提示“用微信昵称”。若用户选择此提示,昵称输入框会自动填充当前微信昵称,然后点击保存按钮,实际上nickname输入框是没有数据的。

    问题重现一下,在input输入框上我添加了监听事bindinput=”onChangeNickname”.

    如下:

    <form bindsubmit="save">
    ...
    <input type="nickname" class="weui-input" name="nickname" placeholder="请输入昵称"  bindinput="onChangeNickname" value="{{nickname}}"/>
    ...
    <button form-type="submit" type="primary" style="margin-top: 100rpx;">保存</button>
    </form>

    js逻辑如下:

    Page({
      data: {
        nickname:'',
      },
      onChangeNickname(e:any){
       const nickname = e.detail.value;
       this.setData({nickname})
      },
      save() {
        const nickname = this.data.nickname;
        wx.request({
          ...
          //api逻辑
        })
      }
    })

    这个监听事件只在用户正常输入时起作用,如果想上面说的那样选择系统的“用微信昵称”,其实这个nickname是没变化的。

    二 操作如虎

    (这段也没解决问题,如果想解决问题直接第三段)

    1,审核完后出发函数

    从小程序的文档获得input的一个属性bindnicknamereview,不管是输入还是自动填充,在审核完昵称后触发bindnicknamereview

    bindnicknamereview用户昵称审核完毕后触发,仅在 type 为 “nickname” 时有效,event.detail = { pass, timeout }

    天真的我以为昵称审核完后,触发事件bindnicknamereview,会返回昵称,然而并没有,所以这个方式也不行。

    2,提交

    然后我一通搜索,在”表单组件form“文档发现这么一句话

    当点击 form 表单中 form-type 为 submit 的 button 组件时,会将表单组件中的 value 值进行提交,需要在表单组件中加上 name 来作为 key。

    这样的话获取输入框的内容,就不需要从data获取了,直接我们从bindsubmit这个监听来获取nickname以及其他的参数。

    save(e) {
        const { nickname, avatar } = e.detail.value;
        wx.request({
          ...
          //api逻辑
        })
    }

    三,解决问题

    //wxml
    <!--pages/set-profile/index.wxml 设置用户的头像和昵称-->
    <view>
      <form bindsubmit="save">
        <!-- 头像 -->
        <button class="avatar-wrapper" open-type="chooseAvatar" bind:chooseavatar="onChooseAvatar">
          <image class="avatar" src="{{avatar}}"></image>
        </button> 
        <!-- 头像隐藏域 -->
        <input type="text" name="avatar" value="{{avatar}}" type="text" hidden="true" />
        <mp-form>
          <mp-cells>
            <mp-cell title="昵称">
              <input type="nickname" class="weui-input" name="nickname" placeholder="请输入昵称" value="{{nickname}}"/>
            </mp-cell>
          </mp-cells>
        </mp-form>
        <button form-type="submit" type="primary" style="margin-top: 100rpx;">保存</button>
      </form>
    </view>
    
    import config from "../../wxconfig";
    
    const defaultAvatarUrl = "https://mmbiz.qpic.cn/mmbiz/icTdbqWNOwNRna42FI242Lcia07jQodd2FJGIYQfG0LAJGFxM4FbnQP6yfMxBgJ0F3YRqJCJ1aPAK2dQagdusBZg/0";
    
    Page({
      data: {
        token: "",
        nickname: "",
        avatar: "",
        userProfile: {},
      },
      
      onLoad() {
        const token = wx.getStorageSync("token");
        const userProfile = wx.getStorageSync("userProfile");
        let avatar, nickname;
        if (userProfile) {
          avatar = userProfile.avatar;
          nickname = userProfile.nickname;
        } else {
          avatar = defaultAvatarUrl;
          nickname = "";
        }
        this.setData({
          token,
          nickname,
          avatar,
          userProfile,
        });
      },
    
      onChooseAvatar(e) {
        const { avatarUrl } = e.detail;
        wx.uploadFile({
          url: config.baseUrl + "/api/v1/upload",
          filePath: avatarUrl,
          name: "file",
          header: {
            Authorization: "Bearer " + this.data.token,
          },
          formData: {
            mediaType: "avatar",
          },
          success: (res) => {
            const mydata = JSON.parse(res.data);
            if (mydata.status == 1) {
              const newAvatar = mydata.data.url;
              this.setData({
                avatar: newAvatar,
              });
            } else {
              wx.showToast({
                title: "上传失败",
                icon: "error",
              });
            }
          },
          fail: (err) => {
            wx.showToast({
              title: err.message,
              icon: "error",
            });
          },
        });
      },
    
      save(e) {
        const { nickname, avatar } = e.detail.value;
        wx.request({
          method: "POST",
          url: config.baseUrl + "/api/v1/setprofile",
          header: {
            Authorization: "Bearer " + this.data.token,
          },
          data: {
            nickname,
            avatar,
          },
          success: (res) => {
            if (res.data.status == 1) {
              wx.showToast({
                title: "保存成功",
                icon: "success",
                duration: 2000,
              });
              const userProfile = { ...this.data.userProfile, avatar, nickname };
              this.setData({
                userProfile,
              });
              wx.setStorageSync("userProfile", userProfile);
            }
          },
        });
      },
    });
    
  • 服务器重启 pm2 重新启动应用程序

    如果您正在使用 PM2 来管理您的 Node.js 应用程序,并且在服务器重启后您希望应用程序能够自动重新启动,那么您可以通过以下步骤实现:

    1. 确保在服务器重启后 PM2 自动启动

    您可以使用以下命令将 PM2 添加为系统服务:

    pm2 startup

    这将生成一个命令,您需要复制并在终端中运行,以将 PM2 添加为系统服务。这样,在服务器重启后,PM2 将自动启动。

    1. 在 PM2 中启动应用程序

    使用以下命令在 PM2 中启动您的 Node.js 应用程序:

    pm2 start app.js

    请确保将 app.js 替换为您的应用程序的实际入口文件。

    1. 保存应用程序列表并重新加载

    使用以下命令将当前 PM2 应用程序列表保存到文件中:

    pm2 save

    这将在服务器重启后自动重新加载您的应用程序列表。

    总结来说,当您完成以上步骤后,您的 Node.js 应用程序将在服务器重启后自动重新启动。

  • hapi.js如何使用joi验证器

    在hapi.js中,可以使用Joi模块来进行数据验证。Joi是一个Node.js模块,用于验证和转换JavaScript对象。它支持各种数据类型、结构和规则的验证,并提供了易于使用和灵活的API。

    以下是一个使用Joi进行验证的示例:

    const Hapi = require('@hapi/hapi');
    const Joi = require('joi');
    
    const server = Hapi.server({
        port: 3000,
        host: 'localhost'
    });
    
    const validationSchema = Joi.object({
        username: Joi.string().alphanum().min(3).max(30).required(),
        password: Joi.string().pattern(new RegExp('^[a-zA-Z0-9]{3,30}$')),
        email: Joi.string().email({ minDomainSegments: 2, tlds: { allow: ['com', 'net'] } })
    });
    
    server.route({
        method: 'POST',
        path: '/register',
        options: {
            validate: {
                payload: validationSchema
            }
        },
        handler: (request, h) => {
            // Handle request...
            return 'User registered successfully';
        }
    });
    
    server.start();
    

    在上述示例中,我们定义了一个Joi验证schema,并将其作为hapi.js路由选项中的payload验证器使用。当客户端发送POST请求到”/register”路由时,hapi.js将首先验证请求的payload是否符合我们定义的schema,如果验证失败,则返回400 Bad Request响应。如果验证通过,则调用路由处理函数来处理请求。

    需要注意的是,在上述示例中,我们将Joi验证schema定义为一个独立的变量,这样可以方便地重用它。此外,hapi.js的Joi验证器也支持其他类型的验证,比如params验证和query验证,具体用法与上述示例类似。

  • hapi.js验证器joi.js报错提示

    在使用hapi.js进行数据验证时,如果出现”Cannot set uncompiled validation rules without configuring a validator”的错误,这通常是因为没有正确配置Joi验证器。

    为了正确地使用Joi验证器,需要先将其配置为hapi.js的默认验证器。可以在hapi.js服务器对象的选项中添加”validate”字段来配置Joi验证器。以下是一个示例:

    const Hapi = require('@hapi/hapi');
    const Joi = require('joi');
    
    const server = new Hapi.Server({
        port: 3000,
        host: 'localhost',
        validate: {
            failAction: (request, h, err) => {
                throw err;
            },
            options: {
                abortEarly: false
            },
            schemaOptions: {
                abortEarly: false
            }
        }
    });
    
    // ...
    

    在上述示例中,我们将Joi验证器配置为hapi.js的默认验证器,并设置了一些选项。其中,failAction选项指定了验证失败时的处理方式,options选项和schemaOptions选项用于配置Joi验证器的选项。在使用Joi验证器时,需要遵循Joi的规则和语法,以确保验证器能够正常工作。

  • ffpmeg常用功能

    一,通用转换

    通常使用ffpmeg转换音视频文件直接用下面的命令

    ffpmeg -i input.mp4 output.mp4

    视频分辨率通常为以下几种

    4k 3840×2160

    1080p 1920×1080

    720p 1280×720

    480p 854×480

    360 640×360

    二,自定义视频格式

    根据视频的宽度来设置视频

    ffmpeg -i input.mp4 -vf scale=480:-1 output.mp4

    根据视频的高度来设置视频

    ffmpeg -i input.mp4 -vf scale=-1:720 output.mp4

    三,批量转换

    命令行循环转换文件,达到批量转换的效果

    for i in *.avi; do ffmpeg -i "$i" "${i%.*}.mp4"; done
  • Mysql数据库常用操作

    一,连接/取消连接数据库服务器操作

    连接数据库服务器操作

    mysql -u root -p

    取消连接数据库服务器

    quit
    连接和取消连接数据库服务器操作

    二,创建和使用数据库

    展示数据库列表

    SHOW DATABASES;

    创建一个名叫test的数据库

    CREATE DATABASE test;

    以下是 MySQL 命令行的一些基本操作:

    1. 连接到 MySQL 数据库:在命令行中输入 mysql -u <username> -p 命令,然后输入密码。
    2. 显示所有可用的数据库:在 MySQL 命令行中输入 show databases; 命令。
    3. 选择数据库:在 MySQL 命令行中输入 use <database_name>; 命令,其中 <database_name> 是要选择的数据库的名称。
    4. 显示数据库中的所有表:在 MySQL 命令行中输入 show tables; 命令。
    5. 显示表的结构:在 MySQL 命令行中输入 describe <table_name>; 命令,其中 <table_name> 是要查看的表的名称。
    6. 查询数据:在 MySQL 命令行中输入 select * from <table_name>; 命令,其中 <table_name> 是要查询的表的名称。
    7. 插入数据:在 MySQL 命令行中输入 insert into <table_name> (column1, column2, column3) values ('value1', 'value2', 'value3'); 命令,其中 <table_name> 是要插入数据的表的名称,column1, column2, column3 是要插入的列的名称,value1, value2, value3 是要插入的值。
    8. 更新数据:在 MySQL 命令行中输入 update <table_name> set column1='value1' where column2='value2'; 命令,其中 <table_name> 是要更新的表的名称,column1='value1' 是要更新的列和值,where column2='value2' 是要更新的行的条件。
    9. 删除数据:在 MySQL 命令行中输入 delete from <table_name> where column='value'; 命令,其中 <table_name> 是要删除数据的表的名称,where column='value' 是要删除的行的条件。
    10. 退出 MySQL 命令行:在 MySQL 命令行中输入 exit 命令或者使用快捷键 Ctrl + D
  • nuxt v3 如何安装tailwindcss

    刚开始我上tailwind的官网想看看nuxt v3如何安装tailwindcss,安装了一半发现好像不对,tailwind官网的那个教程是nuxt2安装的方式。

    搜索之后发现,nuxt官方写了tailwind的插件,网址如下:

    nuxtjs的生态tailwind插件 https://tailwindcss.nuxtjs.org/

    安装3步搞定

  • 为什么strapi不显示data数据

    /api/article

    卡了我好几个小时,终于发现,save按钮只是保存,在save按钮的旁边有一个publish的按钮~

  • 如何删除docker的标签为none的image

    docker image prune -f
    Usage:  docker image prune [OPTIONS]
    
    Remove unused images
    
    Options:
      -a, --all             Remove all unused images, not just dangling ones
          --filter filter   Provide filter values (e.g. 'until=<timestamp>')
      -f, --force           Do not prompt for confirmation
    //谨慎使用删除所有未使用的镜像,不仅仅是悬停的
    docker image prune -a 
    //不提示确认信息
    docker image prune -f 
  • Nuxtjs如何引入代码高亮prismjs

    一,安装prismjs

    npm install prismjs

    二,配置nuxt.config.js

    在nuxt.config.js文件中添加prism插件

    export default {
      plugins: [
        '~/plugins/prism'
      ],
    }

    三,编写插件

    目录app/plugins/prism.js

    import Prism from 'prismjs'
    import 'prismjs/themes/prism-tomorrow.css' // 选择你喜欢的主题
    export default Prism

    四,引用插件

    在需要的页面,例如/pages/detail/_id.vue

    export default {
      ...
      mounted(){
        Prism.highlightAll()
      },
      ...
    }