[学习笔记]微信小程序全套开发流程(ing)

news2024/11/24 5:59:05

https://www.bilibili.com/video/BV1mV4y1o7fu

1.整体概述

在这里插入图片描述

2.环境搭建

4.纯净版项目

在这里插入图片描述

5.快速入门

5.1组件(类似HTML标签)

wxml中的标签html中的标签
textspan
viewdiv
imageimg
icon
navigatora

view组件

<view>
  <view class="c0">学生:</view>
  <view class="c1">微信:nkehougaosuni</view>
</view>

text组件

小程序组件文档

  • 在text组件中使用函数,并传递参数
# html
<text bindtap="clickMe" data-nid="999" data-name="nkehougaosuni">源代码学城</text>
  • 在js中定义函数
# js
clickMe(e){
    console.log("点我了")
    console.log(e.target.dataset);
},

e里面封装了请求传递过来的数据。
上面html传递的data-nide.target
在这里插入图片描述

image组件

<image src="/images/1.png" style="width: 200rpx; height: 150rpx;"></image>

px是像素,rpx是微信里设置的动态像素点,总共宽度是750rpx,有些手机宽,有些窄,使用rpx会自动适配手机进行缩放。

icon组件-图标

<icon type="info" size="93"></icon>

大小也支持rpx

navigator组件

<navigator url="/pages/mine/mine">跳转</navigator>
  • 利用微信API和函数,也可以实现跳转功能
    微信API文档
# html
<view bindtap="clickGo">跳转2</view>
# js
clickGo(e){

  //跳转,微信API
  wx.navigateTo({
    url: '/pages/mine/mine',
  })
},

注意:只能跳转到页面(非tabBar)
要跳转到tabBar
对于navigator标签,需要加上参数open-type=“switchTab”
对于调用AIP的形式,需要使用wx.switchTab({url: ’ '})

5.2 数据展示和绑定

  • 在js的data中写入数据
# js
  data: {
      city:"北京",
      nameList: ["张三", "李四", "王五"]
  },
  • html中使用数据
# html
<view>
  <text>{{city}}</text>
</view>

wx:for语法

# html
<view>
  <view wx:for="{{nameList}}" wx:key="index">{{index}}===={{item}}</view>
</view>
<view>
  <view wx:for="{{nameList}}" wx:for-index="idx"
  wx:for-item="ele"
  wx:key="idx">
  	{{idx}}-{{ele}}
  </view>
</view>

wx:for-index='idx’相当于起别名
使用wx:key参数可以提高性能:当数据改变触发渲染层重新渲染的时候,会校正带有 key 的组件,框架会确保他们被重新排序,而不是重新创建,以确保使组件保持自身的状态,并且提高列表渲染时的效率。

wx:if语法

基本使用

<view>
  <text wx:if="{{city=='北京1'}}"></text>
  <text wx:elif="{{city=='北京2'}}">开开</text>
  <text wx:else></text>
</view>

注意wx:if中的双引号里面要用单引号

block

要展现好几个标签,有下面两种方法:
方法1:

<view>
  <view wx:if="{{city}}=='北京'">
    <text>中国</text>
    <text>北京</text>
    <text>故宫</text>
  </view>
</view>

方法2:

<view>
  <block wx:if="{{city}}=='北京'">
    <text>中国</text>
    <text>北京</text>
    <text>故宫</text>
  </block>
</view>

方法1展示的三个text标签在第三级,而方法2展示的三个text标签在第二级。因为block只用于处理条件逻辑,而不会渲染,所以会比方法1少一层结构。

hidden

类似于vue中的show

# 在js的data中已经设置isHide: false
<view hidden="{{isHide}}">
  <icon type="success"></icon>
</view>

用上hidden,会将标签渲染到页面上,只不过会隐藏起来,而对于wx:if,如果条件不满足,则不会渲染到页面上。

10.数据绑定

单值绑定

之前的小程序版本,只支持单向绑定,不支持双向绑定。例如:

  • 通过setData实现双向绑定效果
# html
<view>
  <text>{{name}}</text>
  <button bindtap="changeName">修改</button>
</view>
# js
  changeName(e){
    this.setData({
      name: "张开"
    });
  },

这样操作,点击修改会把name变成张开。但这不是双向绑定。而是因为setData修改完数据后,页面发生了变化。

  • input单向绑定效果
<view>
  <text>{{name}}</text>
  <button bindtap="changeName">修改</button>
  <input type='text' value="{{name}}" placeholder="请输入"/>
</view>

input标签的value可以设置绑定的变量,这里输入框绑定了name变量
在vue中,如果修改输入框,因为是双向绑定的,所以读取到name的text标签也会跟着变化
但是微信中默认不是双向绑定的,所以修改输入框的内容,并不会修改name
要双向绑定,就需要在input里面加上bindinput参数指定的函数doChange,并在doChange中加入setData函数

  • input+bindinput实现双向绑定
# html
<view>
  <text>{{name}}</text>
  <button bindtap="changeName">修改</button>
  <input type='text' value="{{name}}" bindinput="doChange" placeholder="请输入"/>
</view>
# js
  doChange(e){
    // console.log('doChange', e.detail.value);
    this.setData({
      name: e.detail.value
    })
  },
  • input组件中,利用model:value实现双向绑定(新版本)
# html
<view>
  <text>{{name}}</text>
  <button bindtap="changeName">修改</button>
  <input type='text' value="{{name}}" bindinput="doChange" placeholder="请输入"/>
  <input type='text' model:value="{{name}}" bindinput="doChange2"/>
</view>
# js
  doChange2(e){

  },

可实现类似vue中的双向绑定的效果,但是存在bug,警告意思是必须再定义一个bindinput的事件(函数doChange2可以啥都不写)。不加会报错
在这里插入图片描述

列表绑定

  • 基于setData完成列表的双向绑定
# js
  changeName(e){
    // this.data.nameList.push("alex")

    var info = this.data.nameList;
    info.push("alex");
    console.log(info);
    this.setData({
      name: "张开",
      nameList:info
    });
  },

11.API

帮助文档-API

  clickFunc(e){
    wx.showToast({
      title: '成功', // 提示内容
      icon: 'success', // 图标
      duration: 2000 // 持续两秒 
    })
  },

发送请求

# js
wx.request({
  url: 'example.php', //仅为示例,并非真实的接口地址
  data: {
    x: '',
    y: ''
  },
  header: {
    'content-type': 'application/json' // 默认值
  },
  success (res) {
    console.log(res.data)
  }
})

12.样式和icon

文档-icon
文档中的icon内容比较少,所以可以引入第三方icon,fontawesome

更多icon-fontawesome

[微信小程序]在微信小程序中使用fontawesome6

  • fontawesome下载(CSS+TTF)
  • TTF转换->base64
  • 引入项目+CSS

不同版本的fontawesome支持的图标是不同的,视频里用的是v4版本。

13.tabBar

app.json中设置tabBar
全局配置-tabBar

14.案例-菜单-展示

布局-menu.wxml

<view class="container">
  <navigator class="menu">
    <label class="fa fa-superpowers" style="color:#32CD32"></label>
    <view>
      信息采集
    </view>
  </navigator>

  <navigator class="menu">
    <label class="fa fa-meh-o" style="color:#FFA500"></label>
    <view>
      人脸识别
    </view>
  </navigator>

  <navigator class="menu">
    <label class="fa fa-bell-o" style="color:#87CEFA"></label>
    <view>
      社区活动
    </view>
  </navigator>

  <navigator class="menu">
    <label class="fa fa-microphone" style="color:#7D9EC0"></label>
    <view>
      语音识别
    </view>
  </navigator>

  <navigator class="menu">
    <label class="fa fa-heartbeat" style="color:#EE0000"></label>
    <view>
      心率检测
    </view>
  </navigator>

  <navigator class="menu">
    <label class="fa fa-credit-card" style="color:#778899"></label>
    <view>
      积分兑换商城
    </view>
  </navigator>

</view>

布局的样式-menu.wxss

/* pages/menu/menu.wxss */

page{
  height: 100%;
  background-color: #F5F5F5;
}

.container{
  border-top: 1px solid #ddd;

  display: flex;
  flex-direction: row;
  justify-content: flex-start;
  flex-wrap: wrap;
}

.container .menu{
  width: 374rpx;
  height: 354rpx;
  border-bottom: 1px solid #ddd;

  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  background-color: white;
}

.container .menu label{
  padding: 20rpx 0;
}

.container .menu:nth-child(odd){
  border-right: 1px solid #ddd;
}

弹性盒子参考:https://www.runoob.com/css3/css3-flexbox.html

15.案例-采集-列表

布局-info_collect.wxml

<view class="container">
  <view class="top">
    <view class="tip">今日采集数量(人)</view>
    <view class="count">100</view>
  </view>

  <view class="function">
    <view class='menu' style='border-right: 1rpx solid #ddd;'>
      信息采集
    </view>
    <view class="menu">
      数据统计
    </view>
  </view>

  <view class="table">
    <view class="item">
      <view class="title">
        社区信息列表(100人)
      </view>
    </view>

    <view class="item" wx:for="{{dataDict.data}}" wx:for-item="row" wx:key="index">
      <view class="record">
        <view class="avatar">
          <image src="{{row.avatar}}"></image>
        </view>
        <view class="desc">
          <view class="username">
            {{row.name}}
          </view>
          <view>
            <view class='txt-group'>
              <label class="zh">网格区域</label>
              <label calss="en"> | AREA</label>
            </view>
            <view class="area">
              <label class="fa fa-map-marker">{{row.area}}</label>
            </view>
          </view>
        </view>
        <view class="delete"           data-nid="{{row.id}}" data-index="{{index}}">
          <label class="fa fa-trash"></label>
        </view>
      </view>
    </view>
  </view>
</view>

样式-info_collect.wxss

.top{
  background-color: #01ccb6;
  height: 200rpx;

  display: flex;
  flex-direction: column;
  align-items: center;
  color: white;
}

.top .tip {
  font-size: 22rpx;
  font-weight: 100;
}

.top .count{
  padding: 10rpx;
  font-size: 68rpx;
}

.function{
  display: flex;
  flex-direction: row;
  justify-content: space-around;
  background-color: #02bfae;
}

.function .menu{
  font-size: 28rpx;
  margin: 25rpx 0;
  color: white;
  width: 50%;
  text-align: center;
  align-items: center;
}

.table .item{
  border-bottom: 1rpx solid #e7e7e7;
}

.table .item .title{
  margin: 20rpx 30rpx;
  padding-left: 10rpx;
  border-left: 5rpx solid #02bfae;
  font-size: 26rpx;
}

.record{
  margin: 30rpx 40rpx;
  display: flex;
  flex-direction: row;
  justify-content: flex-start;
}

.record .avatar{
  width: 200rpx;
  height: 200rpx;
  margin-right: 40rpx;
}

.record .avatar image{
  width: 100%;
  height: 100%;
  border-radius: 30rpx;
}

.desc{
  width: 290rpx;
  display: flex;
  flex-direction: column;
  justify-content: space-between;
}

.desc .username{
  margin-top: 25rpx;
  font-size: 38rpx;
}

.txt-group{
  font-size: 27rpx;
  margin: 10rpx 0;
}
.txt-group .zh{
  color: #8c8c8c;
}
.txt-group .en{
  color: #cccccc
}

.area{
  color: #00c8b6;
  font-weight: bold;
}

.delete{
  width: 100rpx;
  color: red;
  text-align: center;
  display: flex;
  flex-direction: column;
  justify-content: center;
}

数据-info_collect.js

data: {
    dataDict:{
      data:[
        {
          "id": 45,
          "name": "谢新雪",
          "area": "#19",
          "avatar": "/images/人物图片1.png"
        }
      ]
    }
  },

16.案例-采集-数据列表

  refresh(){
    //刷新或获取请求
    //1.发送网络请求
    //2.数据绑定
    wx.showLoading({mask:true})
    wx.request({
      url: ,
      method: "GET",
      success: (res) => {
        this.setData({
          dataDict: res.data
        })
      }
    })
  },

17.案例-采集-删除

<view class="delete" bindtap="doDeleteRow" data-nid="{{row.id}}" data-index="{{index}}">
  doDeleteRow(e) {
    wx.showModal({
      title: "确认是否删除?",
      confirmColor: "#ff461f",
      success: (res) => {
        if (!res.confirm) {
          return
        }
        console.log(e)
        var nid = e.currentTarget.dataset.nid
        var index = e.currentTarget.dataset.index
        var dataList = this.data.dataDict.data
        dataList.splice(index, 1)

        wx.showLoading({
          title: "删除中",
          mask: true
        })

        wx.request({
          url: api.bank + nid + '/',
          method: 'DELETE',
          success: (res) => {
            let total_count = this.data.dataDict.total_count - 1
            if (total_count < 0) {
              total_count = 0
            }

            let today_count = this.data.dataDict.today_count - 1
            if (today_count < 0) {
              today_count = 0
            }

            this.setData({
              'dataDict.data': dataList,
              'dataDict.total_count': total_count,
              'dataDict.today_count': today_count
            })
          },
          complete() {
            wx.hideLoading()
          }
        })
      }
    })
  },

18.案例-采集-后端API

简易版的API

1.新建项目
2.创建名为api的应用
3.在settings注册api,rest_framework

  • 4.创建表结构
    models.py
class UserInfo(models.Model):
    '''用户信息'''
    uid = models.CharField(verbose_name="ID", max_length=64)

    area_choices = (
        (1, '#19'),
        (2, '#20'),
        (3, '#21'),
        (4, '#22'),
    )
    area = models.IntegerField(verbose_name='网络', choices=area_choices)

    name = models.CharField(verbose_name='姓名', max_length=32)
    avatar = models.FileField(verbose_name='头像', max_length=128, upload_to='bank/%Y/%m/%d/')
    create_date = models.DateField(verbose_name='日期', auto_now_add=True)

    face_token = models.CharField(verbose_name='FaceToken', max_length=32)
    score = models.IntegerField(verbose_name='积分', default=0)

通过make migrationsmigrate进行迁移

FileField可以将文件直接上传到文件文件目录

  • 5.创建路由
    • 5.1 项目总的url
from django.contrib import admin
from django.urls import path, re_path, include
from django.views.static import serve
from django.conf import settings

urlpatterns = [
    re_path("admin/", admin.site.urls),

    re_path(r'^api/', include('api.urls')),
    re_path(r'^media/(?P<path>.*)', serve, {'document_root': settings.MEDIA_ROOT}),
]

    • 5.2 settings.py中配置媒体
import os
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
    • 5.3 api下的urls.py:接收分发过来的路由请求
from django.urls import path, re_path
from api.views import bank

urlpatterns = [
    re_path(r'^bank$/', bank.BankView.as_view()),
    re_path(r'^bank/(?P<pk>\d+)/$', bank.BankView.as_view()),
]

这里有个知识点是有名分组

    1. 在应用下新建一个serializers文件夹

根据请求的不同进入不同的序列化器
序列化器统一放在serializers文件夹中

import uuid
import datetime
from rest_framework.serializers import ModelSerializer, Serializer, ListSerializer
from rest_framework import serializers
from rest_framework.utils.serializer_helpers import (
    BindingDict, BoundField, JSONBoundField, NestedBoundField, ReturnDict,
    ReturnList
)

from api import models


class BankListSerializer(ListSerializer):

    @property
    def data(self):
        ret = super(ListSerializer, self).data
        total_count = models.UserInfo.objects.all().count()
        today_count = models.UserInfo.objects.filter(create_date=datetime.datetime.today()).count()

        info = {
            'total_count': total_count,
            'today_count': today_count,
            'data': ret,
        }
        return ReturnDict(info, serializer=self)


class BankListModelSerializer(ModelSerializer):
    area = serializers.CharField(source="get_area_display") # 序列化的字段是执行get_area_display后得到,即area_choices对应内容

    class Meta:
        list_serializer_class = BankListSerializer # 里面的每个元素用什么序列化
        model = models.UserInfo
        fields = ['id', 'name', 'area', 'avatar']


class BankCreateModelSerializer(ModelSerializer):
    area_text = serializers.CharField(source='get_area_display', read_only=True)

    class Meta:
        model = models.UserInfo
        exclude = ['face_token', 'uid', ]

    def validate(self, data):
        uid = str(uuid.uuid4()).replace('-', '_')  # 基于随机数来生成UUID. 使用的是伪随机数有一定的重复概率
        name = data.get('name')
        avatar_file_object = data.get('avatar')
        from utils import ai
        data['face_token'] = ai.register_image(uid, name, avatar_file_object) # 上传到百度云的人脸库,返回face_token
        data['uid'] = uid
        return data

python @property的介绍与使用

    1. 删除views.py文件,添加views.py文件夹,并创建bank.py文件

根据请求的不同走不同的seriealizers

from rest_framework.generics import ListAPIView, CreateAPIView, DestroyAPIView
from api.serializers.bank import BankListSerializer, BankListModelSerializer, BankCreateModelSerializer
from api import models


class BankView(ListAPIView, CreateAPIView, DestroyAPIView):
    queryset = models.UserInfo.objects.all().order_by('-id')

    def get_serializer_class(self):
        """根据请求的不同进入不同的序列化器"""
        if self.request.method == "POST":
            return BankCreateModelSerializer
        return BankListModelSerializer

    def delete(self, request, *args, **kwargs):
        user_object = self.get_object()
        from utils import ai
        ai.delete(user_object.uid, user_object.face_token)
        response = super().delete(request, *args, **kwargs)
        return response

super()并不是调用父类的同名函数
super()实际上是super(type, obj):会去obj.mro中的type的下一个类开始找。
MRO,使用C3算法,遇到汇聚点就回到上一个分叉点
参考资料:MROhttps://www.bilibili.com/video/BV1mV4y1o7fu

  • 8.在项目目录下创建utils目录,并创建ai.py文件

  • 百度云:https://cloud.baidu.com/
    免费领取资源-创建应用-…
    根据api文档上传图片

import base64
import urllib
import requests
import json

API_KEY = "xxx"
SECRET_KEY = "xxx"


def get_access_token():
    """
    使用 AK,SK 生成鉴权签名(Access Token)
    :return: access_token,或是None(如果错误)
    """
    url = "https://aip.baidubce.com/oauth/2.0/token"
    params = {"grant_type": "client_credentials", "client_id": API_KEY, "client_secret": SECRET_KEY}
    return str(requests.post(url, params=params).json().get("access_token"))


def get_file_content_as_base64(path, urlencoded=False):
    """
    获取文件base64编码
    :param path: 文件路径
    :param urlencoded: 是否对结果进行urlencoded
    :return: base64编码信息
    """
    with open(path, "rb") as f:
        content = base64.b64encode(f.read())
    return content


def register_image(user_id, user_info, file_path, group_id='test'):
    # 1.获取access token,并拼接得到请求地址
    url = "https://aip.baidubce.com/rest/2.0/face/v3/faceset/user/add?access_token=" + get_access_token()

    # 2.图片进行base64编码
    data = get_file_content_as_base64(file_path, False)

    # 3.上传图片
    payload = json.dumps({
        "group_id": group_id,
        "image": data,
        "image_type": "BASE64",
        "user_id": user_id,
        "user_info": user_info
    })
    headers = {
        'Content-Type': 'application/json'
    }

    response = requests.request("POST", url, headers=headers, data=payload)
    return print(response.text['result']['face_token'])


def delete(user_id, face_token, group_id='alex'):
    # 1.获取access token,并拼接得到请求地址
    url = "https://aip.baidubce.com/rest/2.0/face/v3/faceset/face/delete?access_token=" + get_access_token()

    # 2.发送删除请求
    payload = json.dumps({
        'user_id': user_id,
        'group_id': group_id,
        'face_token': face_token,
    })
    headers = {
        'Content-Type': 'application/json'
    }
    response = requests.request("POST", url, headers=headers, data=payload)

    print(response.text)


delete('1', '769eadc7868c14cd6cda2c1cfdbd4704')
  • 9.修改settings文件
ALLOWED_HOSTS = ["*"]
  • 10.修改项目的configurations
    端口改成8001端口
    在这里插入图片描述
  • 11.在微信小程序开发工具中,项目中创建api.js
const rootUrl = 'http://192.168.1.226:8001/api';


module.exports = {
  bank: rootUrl + '/bank/',
  bankStatistics: rootUrl + '/bank/',
  bankFace: rootUrl + '/bank/face/',
  bankActivity: rootUrl + '/bank/activity',
  bankApply: rootUrl + '/bank/apply/',
  bankVoice: rootUrl + '/bank/voice/',
  bankHrv: rootUrl + '/bank/hrv/',
  bankExchange: rootUrl + '/bank/exchange/',
  bankScore: rootUrl + '/bank/score/',
  bankGoods: rootUrl + '/bank/goods/',
  bankexchangeRecord: rootUrl + '/bank/exchange/record/',
}
  • 12.在info_collect.js中导入api.js
const api = require('../../config/api.js') // 导入

url: api.bank,

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

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

相关文章

怎样理解黑盒测试和白盒测试?二者有什么关系

按照使用的测试技术可以将软件测试分为黑盒测试与白盒测试。 &#xff08;1&#xff09;黑盒测试 黑盒测试就是把软件(程序)当作一个有输入与输出的黑匣子&#xff0c;它把程序当作一个输入域到输出域的映射&#xff0c;只要输入的数据能输出预期的结果即可&#xff0c;不必关…

吉利科技携手企企通,打造集团化数智供应链系统

近日&#xff0c;吉利科技集团有限公司&#xff08;以下简称“吉利科技”&#xff09;联合企企通成功召开SRM采购供应链管理项目启动会。企企通与吉利科技高层、项目负责人与团队成员出席此次启动会。 双方将携手在企业供应商全生命周期管理、采购全流程、电子招投标、采购分析…

打造本地户外装备小程序商城教程大揭秘

在如今的移动互联网时代&#xff0c;小程序已经成为了各行各业的发展利器。尤其对于户外用具行业来说&#xff0c;一个专属的小程序商城将能够极大地提升企业的品牌形象和销售业绩。下面就来介绍一下快速上手制作户外用具小程序的攻略吧。 首先&#xff0c;登录乔拓云平台进入商…

TDengine + Telegraf + Grafana 实现图形化服务器状态监控

TDengine Telegraf Grafana 实现图形化服务器状态监控 技术栈环境搭建安装tdenginue下载安装包解压文件运行安装文件启动td运行 taosAdapter 安装Telegraf添加yum源安装生成配置文件修改配置文件启动telegraf 安装Grafana直接yum安装安装td数据源配置启动Grafana配置数据源导…

2021年12月 Python(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

一、单选题(共25题,每题2分,共50分) 第1题 昨天的温度是5摄氏度,今天降温7摄氏度,今天的温度是多少摄氏度? A:12 B:7 C:2 D:-2 正确的答案是 D:-2。 解析: 根据题目描述,昨天的温度是 5 摄氏度,今天降温了 7 摄氏度。降温意味着温度变低,所以今天的温度…

嵌入式开发实用工具——QFSViewer

嵌入式开发实用工具——QFSViewer 介绍 今天给大家推荐个我个人业余时间开发的一个嵌入式开发实用工具——QFSViewer&#xff0c;这个工具主要是用来加载查看各种嵌入式常用的文件系统映像&#xff0c;目前支持JFSS2、Fat32、Fat16、Fat12、exFat、Ext2、Ext3、Ext4等文件系统…

性能测试之性能测试指标详解(详细)

前言 刚开始&#xff0c;以为做性能测试&#xff0c;就是做些脚本、参数化、关联&#xff0c;压起来之后&#xff0c;再扔出一个结果。 但实际上不止这些内容&#xff0c;还要加上性能分析&#xff0c;关注调优之后响应时间有多大的提升&#xff0c;TPS 有多大的提高&#xf…

区块链学习6-长安链部署:如何创建特定共识节点数和同步节点数的链

正常prepare的时候只支持4 7 13 16个节点个数&#xff0c;想要创建10个节点&#xff0c;其中5个是共识节点&#xff0c;如何实现&#xff1f; 1. 注释掉prepare.sh的这几行&#xff1a; 2. 修改 crytogen的模板文件&#xff1a; 如果是cert模式&#xff1a;chainmaker-crypt…

CTF流量题解tcp1

用流量工具进行分析。发现消息长度有点异常。右键TCP跟踪。 ....mos.-mos-.-.mos-.-mos..-.mos..-mos-. 摩斯密码生成-网页工具 (adminun.com)

LeetCode刷题笔试(一起来算法打卡吧!!!)

文章目录 力扣刷题笔记&#xff08;每日更新~&#xff09;一、什么是时间复杂度&#xff1f;二、什么是递归&#xff1f;三、刷题记录leetcode 70-爬楼梯剑指offer 10-斐波那契数列 四、参考地址 力扣刷题笔记&#xff08;每日更新~&#xff09; 提示&#xff1a;这里可以添加…

PY32F003 FLASH

了解py32芯片的flash内容&#xff0c;对于py32进行api升级有更好的了解的操作 //uiOffset 0(4MHz), 1(8MHz), 2(16MHz), 3(22.12MHz), 4(24MHz) void SetFlashParameter(uint32_t uiOffset) {WRITE_REG(FLASH->KEYR, FLASH_KEY1);WRITE_REG(FLASH->KEYR, FLASH_KEY2); …

Android Studio翻译插件

进入File->Settings->Plugins界面&#xff0c;搜索Translation&#xff0c;选择这个 重启AS后&#xff0c;选中目标单词右键点击Translate即可&#xff1a;

MYSQL06高级_为什么使用索引、优缺点、索引的设计、方案、聚簇索引、联合索引、注意事项

文章目录 ①. 为什么使用索引②. 索引及其优缺点③. InnoDb - 索引的设计④. InnoDb中的索引方案⑤. 索引 - 聚簇索引⑥. 索引 - 二级索引⑦. B树索引的注意事项⑧. MyISAM中索引方案 ①. 为什么使用索引 ①. 索引是存储引擎用于快速找到数据记录的一种数据结构,就好比去图书馆…

pytest测试框架之mark标记功能详细介绍

mark标记 ​ 在实际工作中&#xff0c;我们要写的自动化用例会比较多&#xff0c;也不会都放在一个py文件中&#xff0c;如果有几十个py文件&#xff0c;上百个方法&#xff0c;而我们只想运行当中部分的用例时怎么办&#xff1f; ​ pytest提供了一个非常好用的mark功能&…

机械厂工厂360全景展示拍摄制作,以便随时随地进行展示和更新

随着5G互联网技术的不断发展&#xff0c;线上全景虚拟展示已经成为了一种重要的展示方式。在工业领域中&#xff0c;厂区线上全景虚拟展示的应用也越来越广泛。 厂区线上vr全景虚拟展示是VR全景制作公司公司借助VR全景和web3d开发技术把企业的环境、研发、生产、产品、质检、仓…

06-2_Qt 5.9 C++开发指南_自定义对话框及其调用

本篇介绍到的对话框及其调用实例较为复杂但十分详细&#xff0c;如果做了解可以先参考&#xff1a;QT从入门到实战x篇_13_模态和非模态对话框创建。 文章目录 1. 对话框的不同调用方式2. 对话框QWDialogSize 的创建和使用2.1 创建对话框QWDialogSize2.2 对话框的调用和返回值 …

【数据结构功法】第八话 · 树与二叉树的基本概念

目录 &#x1f37a;知识点9&#xff1a;树的概念与性质 &#x1f36f;9.1 树的逻辑结构与性质 &#x1f34a;1.树的逻辑结构 &#x1f34a;2.树的相关术语 &#x1f34a;3.树的性质 &#x1f4dc;习题检测 &#x1f36f;9.2 二叉树的的定义与性质 &#x1f34a;1.二叉树…

微信如何多号定时群发?

微信作为国内最大的网络社交平台&#xff0c;目前用户已超过11亿。 掐点给朋友送生日祝福,给领导同事送新年祝福&#xff0c;提醒朋友的待办事项等等&#xff0c;这些定时发送功能一直都是微博 QQ&#xff0c;邮箱的专属&#xff0c;如果微信也能定时发送该多好&#xff1f;其…

【CSS3】CSS3 动画 ① ( CSS3 动画简介 | CSS3 动画实现步骤 | 动画定义 | 代码示例 )

文章目录 一、CSS3 动画简介二、CSS3 动画实现步骤三、动画定义四、代码示例 一、CSS3 动画简介 " 动画 " 是 CSS3 相较于 CSS 的 颠覆性 特性 之一 ; 在 CSS3 中 , 可以设置 多个 动画节点 , 精确地 控制 一个动画 或 若干动画 , 实现 复杂 的 动效 ; 动画可以实现…

CSS—选择器

目录 一、CSS简介 二、HTML页面中常用的元素 三、CSS语法规则 四、常用的选择器 五、选择器参考 一、CSS简介 CSS (Cascading Style Sheets&#xff0c;层叠样式表&#xff09;&#xff0c;是一种用来为结构化文档&#xff08;如 HTML 文档或 XML 应用&#xff09;添加样式…