Directorio de artículos
1. Inicio de sesión de usuario
1.1 Enviar SMS
1.2 Iniciar sesión
-
objeto público subprograma
-
aplicación.js
App({ /** * 当小程序初始化完成时,会触发 onLaunch(全局只触发一次) */ onLaunch: function () { }, globalData:{ userInfo: null, } })
-
Otras páginas operan valores públicos
var app = getApp(); Page({ data: { }, onShow:function(){ app.globalData } });
Nota: Después de modificar globalData, los valores utilizados por otras páginas no cambiarán automáticamente, sino que deben configurarse manualmente.
-
-
operaciones de almacenamiento local
wx.getStorageSync('userInfo'); wx.setStorageSync('userInfo',"sdfsfd"); wx.removeStorageSync("userInfo")
-
pila de llamadas de página
var pages = getCurrentPages(); prevPage = pages[pages.length-2];
-
Saltar a la página anterior
wx.navigateBack({ });
-
Ciclo de vida de la página del miniprograma
- onLoad (una vez)
- onShow (siempre que se muestre esta página, se cargará automáticamente)
- en Listo (una vez)
- onHide (se carga automáticamente cada vez que se oculta la página)
- onUnload (descarga la página, cierra el applet)
-
aplicación global.js
App({ /** * 当小程序初始化完成时,会触发 onLaunch(全局只触发一次) */ onLaunch: function () { }, globalData:{ userInfo: null, } })
-
wx:si directiva
2. Valor de pase de página
2.1 Pasar valores de la página principal a la página secundaria
Página principal:
/pages/xx/xxx?id=1
Subpágina
onLoad:function(option){
}
2.2 Página principal del niño
Subpágina
var pages = getCurrentPages();
var prevPage = pages[pages.length-2];
// prevPage.setData({ topicText:topicInfo.title });
Nota: data-xx puede pasar valores a eventos.
3. Almacenamiento de objetos de Tencent Cloud
- La primera etapa: servidor de archivos, que almacena archivos en un determinado servidor (división de la estructura de directorios).
- Segunda etapa:
- Almacenamiento de archivos, almacenar archivos en un determinado servidor (división de la estructura de directorios).
- Almacenamiento de objetos, almacenamiento optimizado y optimización operativa (no es compatible con la partición de la estructura de directorios).
- La tercera etapa: servicios en la nube (Ali/Tencent/Qiniu/Amazon)
- almacenamiento de archivos
- almacenamiento de objetos
3.1 Uso rápido
- Información relacionada con el registro
- documentación de desarrollo
4. Publicar
4.1 Problemas con el proceso de lanzamiento
-
método uno
1. 打开图片进行本地预览 2. 输入文字 & 选择相应的信息 3. 点击发布按钮 3.1 将本地图片上传到 腾讯云对象存储中COS(oss),并将COS中的图片地址返回。 3.2 将COS中的图片URL和文字等信息一起提交到后台。 BUG: 在3.2步骤时可能拿不到COS中的图片。
function onClickSubmit(){ // 耗时1分钟,不会阻塞。 wx.request({ url:"...", success:function(res){ console.log(res) } }) console.log(123); }
-
Método 2 (recomendado)
1. 打开图片进行本地预览 2. 将本地图片上传到 腾讯云对象存储中COS 3. 输入文字 & 选择相应的信息 4. 发布: 必须上传完毕之后,才允许点击发布按钮。
4.2 Componente: Barra de progreso
<progress percent="{
{percent1}}" ></progress>
<progress percent="{
{percent2}}" activeColor="#DC143C" ></progress>
4.3 Modificar datos locales en data
<view>-----案例------</view>
<view>点击按钮完成,将图片1的进度条更新为80%</view>
<view wx:for="{
{imageList}}">
<view>{
{item.title}}</view>
<progress percent="{
{item.percent}}" ></progress>
</view>
<button bindtap="changePercent" >点击</button>
data: {
percent1:20,
percent2:50,
imageList:[
{
id:1,title:"图片1",percent:20},
{
id: 1, title: "图片2", percent: 30 },
{
id: 1, title: "图片3", percent: 60 },
]
},
changePercent:function(){
// 方式1:错误
/*
this.setData({
imageList[0].person: 80
});
*/
// 方式2:可以,由于需要全部修改,所以性能差。
/*
var dataList = this.data.imageList;
dataList[0].percent = 80;
this.setData({
imageList: dataList
});
*/
// 方式3:推荐
var num = 2;
this.setData({
["imageList[0].percent"]:80,
["imageList[" + num + "].percent"]: 90,
["imageList[1].title"]:"突突突突突"
})
},
4.4 Cierres
var dataList = ["alex", "changxin", "cck"]
for (var i in dataList) {
(function(data){
wx.request({
url: 'xxxxx',
success: function (res) {
console.log(data);
}
})
})(dataList[i])
}
4.5 Miniprograma
-
elegir la imagen
-
completa el contenido
-
enviar
{ cover:"https://mini-1251317460.cos.ap-chengdu.myqcloud.com/08a9daei1578736867828.png", content:"小程序开发太简单了", address:"北京市", topic:1, images:[ "https://mini-1251317460.cos.ap-chengdu.myqcloud.com/08a9daei1578736867828.png", "https://mini-1251317460.cos.ap-chengdu.myqcloud.com/08a9daei1578736867828.png" ] }
{ cover:"https://mini-1251317460.cos.ap-chengdu.myqcloud.com/08a9daei1578736867828.png", content:"小程序开发太简单了", address:"北京市", topic:1, images:[ { path:"https://mini-1251317460.cos.ap-chengdu.myqcloud.com/08a9daei1578736867828.png", cos_key:"08a9daei1578736867828.pn" }, { path:"https://mini-1251317460.cos.ap-chengdu.myqcloud.com/08a9daei1578736867828.png", cos_key:"08a9daei1578736867828.pn" }, ] }
4.6 API
from rest_framework.views import APIView
from rest_framework.generics import CreateAPIView
from rest_framework import serializers
from apps.api import models
class NewsDetailModelSerializer(serializers.Serializer):
key = serializers.CharField()
cos_path = serializers.CharField()
class NewsModelSerializer(serializers.ModelSerializer):
images = NewsDetailModelSerializer(many=True)
class Meta:
model = models.News
fields = "__all__"
class NewsView(CreateAPIView):
""" 创建动态的API """
serializer_class = NewsModelSerializer
class News(models.Model):
"""
动态
"""
cover = models.CharField(verbose_name='封面', max_length=128)
content = models.CharField(verbose_name='内容', max_length=255)
topic = models.ForeignKey(verbose_name='话题', to='Topic', null=True, blank=True)
address = models.CharField(verbose_name='位置', max_length=128, null=True, blank=True)
user = models.ForeignKey(verbose_name='发布者', to='UserInfo', related_name='news')
favor_count = models.PositiveIntegerField(verbose_name='赞数', default=0)
viewer_count = models.PositiveIntegerField(verbose_name='浏览数', default=0)
comment_count = models.PositiveIntegerField(verbose_name='评论数', default=0)
create_date = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)
class NewsDetail(models.Model):
"""
动态详细
"""
key = models.CharField(verbose_name='腾讯对象存储中的文件名', max_length=128, help_text="用于以后在腾讯对象存储中删除")
cos_path = models.CharField(verbose_name='腾讯对象存储中图片路径', max_length=128)
news = models.ForeignKey(verbose_name='动态', to='News')
4.7 Reglas
{
k1:v1,
k2:v2,
k3:{
...},
k4:[
{
....}
]
}
5. Revisión tranquila de la API
5.1 APIView (puede)
from rest_framework.response import Response
class UserModelSerializer(serializers.ModelSerializer):
class Meta:
model = models.UserInfo
fields = "__all__"
class UserView(APIView):
def get(self,request,*args,**kwargs):
user_list = models.UserInfo.objects.all()
ser = UserModelSerializer(instance=user_list,many=True)
return Response(ser.data)
def post(self,request,*args,**kwargs):
ser = UserModelSerializer(data=request.data)
if ser.is_valid():
# models.UserInfo.objects.create(**ser.validated_data)
ser.save(user_id=1)
return Response(ser.data)
return Response(ser.errors)
5.2 ListAPIView
ListAPIView,CreateAPIView,RetrieveAPIView,UpdateAPIView,DestroyAPIView
class NewTestModelSerializer(serializers.ModelSerializer):
class Meta:
model = models.News
fields = "__all__"
class NewTestView(CreateAPIView,ListAPIView):
serializer_class = NewTestModelSerializer
queryset = models.News.objects.filter(id__gt=4)
5.2.1 El usuario pasa algún valor
Cuando crea un usuario, usted mismo genera un UID en segundo plano.
class NewTestModelSerializer(serializers.ModelSerializer):
class Meta:
model = models.News
fields = "__all__"
class NewTestView(CreateAPIView,ListAPIView):
serializer_class = NewTestModelSerializer
queryset = models.News.objects.filter(id__gt=4)
def perform_create(self, serializer):
serializer.save(uid=str(uuid.uuid4()))
5.2.2 ¿Cuál es la diferencia entre campos y exclusión?
Muestre datos a través de campos y excluya páginas personalizadas.
Requisito: Mostrar solo los datos de id, nombre y edad de la tabla de usuario, y los demás no se muestran.
class NewTestModelSerializer(serializers.ModelSerializer):
class Meta:
model = models.News
# fields = ["id","name",'age']
# fields = "__all__"
exclude = ['gender']
class NewTestView(ListAPIView):
serializer_class = NewTestModelSerializer
queryset = models.User.objects.all()
[
{
id:1,name:'xxx',age:18},
{
id:1,name:'xxx',age:11},
{
id:1,name:'xxx',age:99},
]
Requisitos: La base de datos tiene 5 campos y se muestran 7 campos.
class NewTestModelSerializer(serializers.ModelSerializer):
xx = serializers.CharField(source='id')
x1 = serializers.SerializerMethodField()
class Meta:
model = models.News
# fields = "__all__"
# fields = ['id','name','age','gender','phone','xx','x1']
exclude = ['id','name']
def get_x1(self,obj):
return obj.id
class NewTestView(ListAPIView):
serializer_class = NewTestModelSerializer
queryset = models.User.objects.all()
[
{
id:1,name:'xxx',age:18... xx:1,x1:1},
{
id:2,name:'xxx',age:11... xx:2,x1:2},
{
id:3,name:'xxx',age:99, xx:3,x1:3},
]
5.2.3 solo lectura
No lo agregue, lo necesita cuando lo ve.
Requisito: escribir dos interfaces para agregar (3 campos), obtener una lista (5 campos)
class NewTestModelSerializer(serializers.ModelSerializer):
# phone = serializers.CharField(source='phone',read_only=True)
# email = serializers.CharField(source='email',read_only=True)
class Meta:
model = models.News
fields = "__all__"
read_only_fields = ['phone','email',]
class NewTestView(CreateAPIView, ListAPIView):
serializer_class = NewTestModelSerializer
queryset = models.User.objects.all()
添加:
{
name:'xx',
age:'19',
gender:1
}
获取:
[
{
name:'xx',age:'xx',gender:'',phone:'xx',email:xxx}
]
5.2.4 Requisitos complejos
Use un serializador al agregar y un serializador al enumerar
class NewTestModelSerializer1(serializers.ModelSerializer):
class Meta:
model = models.News
fields = "__all__"
class NewTestModelSerializer2(serializers.ModelSerializer):
class Meta:
model = models.News
fields = "__all__"
class NewTestView(CreateAPIView, ListAPIView):
queryset = models.User.objects.all()
def get_serializer_class(self):
if self.request.method == 'POST':
return NewTestModelSerializer1
if self.request.method == 'GET':
return NewTestModelSerializer2
5.2.5 Serializadores anidados
class CreateNewsTopicModelSerializer(serializers.Serializer):
key = serializers.CharField()
cos_path = serializers.CharField()
class CreateNewsModelSerializer(serializers.ModelSerializer):
imageList = CreateNewsTopicModelSerializer(many=True)
class Meta:
model = models.News
exclude = ['user', 'viewer_count', 'comment_count',"favor_count"]
def create(self, validated_data):
# 把imageList切走
image_list = validated_data.pop('imageList')
# 创建New表中的数据
news_object = models.News.objects.create(**validated_data)
data_list = models.NewsDetail.objects.bulk_create(
[models.NewsDetail(**info, news=news_object) for info in image_list]
)
news_object.imageList = data_list
if news_object.topic:
news_object.topic.count += 1
news_object.save()
return news_object
class NewsView(CreateAPIView):
"""
发布动态
"""
serializer_class = CreateNewsModelSerializer
def perform_create(self, serializer):
# 只能保存:News表中的数据()
# 调用serializer对象的save(先调用create)
new_object = serializer.save(user_id=1)
return new_object