【微信小程序】小程序功能开发

快来打我* 2024-04-01 09:16 223阅读 0赞

在这里插入图片描述

文章目录

      1. 用户登录
      • 1.1 发送短信
      • 1.2 登录
      1. 页面传值
      • 2.1 父页面向子页面传值
      • 2.2 子父页面
      1. 腾讯云的对象存储
      • 3.1 快速使用
      1. 发布
      • 4.1 发布流程的问题
      • 4.2 组件:进度条
      • 4.3 修改data中的局部数据
      • 4.4 闭包
      • 4.5 小程序
      • 4.6 API
      • 4.7 规则
    • 5.restful api回顾
      • 5.1 APIView ( 可以 )
      • 5.2 ListAPIView
        • 5.2.1 用户传递某些值
        • 5.2.2 fields和exclude的区别?
        • 5.2.3 read_only
        • 5.2.4 复杂需求
        • 5.2.5 serializers嵌套

1. 用户登录

1.1 发送短信

1.2 登录

  • 小程序公共对象

    • app.js

      1. App({
  1. /**
  2. * 当小程序初始化完成时,会触发 onLaunch(全局只触发一次)
  3. */
  4. onLaunch: function () {
  5. },
  6. globalData:{
  7. userInfo: null,
  8. }
  9. })
  10. * 其他页面操作公共值
  11. var app = getApp();
  12. Page({
  13. data: {
  14. },
  15. onShow:function(){
  16. app.globalData
  17. }
  18. });
  19. 注意:修改globalData之后,其他页面以用的值不会自动变化,而是需要手动设置。
  • 本地存储操作

    1. wx.getStorageSync('userInfo');
    2. wx.setStorageSync('userInfo',"sdfsfd");
    3. wx.removeStorageSync("userInfo")
  • 页面调用栈

    1. var pages = getCurrentPages();
    2. prevPage = pages[pages.length-2];
  • 跳转回上一个页面

    1. wx.navigateBack({
    2. });
  • 小程序页面的生命周期

    • onLoad(一次)
    • onShow(只要展示这个页面,就会自动加载)
    • onReady(一次)
    • onHide(每次页面隐藏就会自动加载,)
    • onUnload(卸载页面,小程序关闭)
  • 全局app.js

    1. App({
  1. /**
  2. * 当小程序初始化完成时,会触发 onLaunch(全局只触发一次)
  3. */
  4. onLaunch: function () {
  5. },
  6. globalData:{
  7. userInfo: null,
  8. }
  9. })
  • wx:if指令

2. 页面传值

2.1 父页面向子页面传值

父页面:

  1. /pages/xx/xxx?id=1

子页面

  1. onLoad:function(option){
  2. }

2.2 子父页面

子页面

  1. var pages = getCurrentPages();
  2. var prevPage = pages[pages.length-2];
  3. // prevPage.setData({ topicText:topicInfo.title });

注意:data-xx 可以给事件传值。

3. 腾讯云的对象存储

  • 第一阶段:文件服务器,将文件存储在某个服务器(目录结构的划分)。
  • 第二阶段:

    • 文件存储,将文件存储在某个服务器(目录结构的划分)。
    • 对象存储,优化存储和操作优化(不支持目录结构划分)。
  • 第三阶段:云服务(阿里/腾讯/七牛/亚马逊)

    • 文件存储
    • 对象存储

3.1 快速使用

  • 注册相关信息
  • 开发文档

4. 发布

4.1 发布流程的问题

  • 方式一

    1. 1. 打开图片进行本地预览
    2. 2. 输入文字 & 选择相应的信息
    3. 3. 点击发布按钮
    4. 3.1 将本地图片上传到 腾讯云对象存储中COSoss),并将COS中的图片地址返回。
    5. 3.2 COS中的图片URL和文字等信息一起提交到后台。
    6. BUG
    7. 3.2步骤时可能拿不到COS中的图片。
    8. function onClickSubmit(){
    9. // 耗时1分钟,不会阻塞。
    10. wx.request({
    11. url:"...",
    12. success:function(res){
    13. console.log(res)
    14. }
    15. })
    16. console.log(123);
    17. }
  • 方式二(推荐)

    1. 1. 打开图片进行本地预览
    2. 2. 将本地图片上传到 腾讯云对象存储中COS
    3. 3. 输入文字 & 选择相应的信息
    4. 4. 发布:
    5. 必须上传完毕之后,才允许点击发布按钮。

4.2 组件:进度条

  1. <progress percent="{
  2. {percent1}}" ></progress>
  3. <progress percent="{
  4. {percent2}}" activeColor="#DC143C" ></progress>

4.3 修改data中的局部数据

  1. <view>-----案例------</view>
  2. <view>点击按钮完成,将图片1的进度条更新为80%</view>
  3. <view wx:for="{
  4. {imageList}}">
  5. <view>{
  6. {item.title}}</view>
  7. <progress percent="{
  8. {item.percent}}" ></progress>
  9. </view>
  10. <button bindtap="changePercent" >点击</button>
  11. data: {
  12. percent1:20,
  13. percent2:50,
  14. imageList:[
  15. {
  16. id:1,title:"图片1",percent:20},
  17. {
  18. id: 1, title: "图片2", percent: 30 },
  19. {
  20. id: 1, title: "图片3", percent: 60 },
  21. ]
  22. },
  23. changePercent:function(){
  24. // 方式1:错误
  25. /*
  26. this.setData({
  27. imageList[0].person: 80
  28. });
  29. */
  30. // 方式2:可以,由于需要全部修改,所以性能差。
  31. /*
  32. var dataList = this.data.imageList;
  33. dataList[0].percent = 80;
  34. this.setData({
  35. imageList: dataList
  36. });
  37. */
  38. // 方式3:推荐
  39. var num = 2;
  40. this.setData({
  41. ["imageList[0].percent"]:80,
  42. ["imageList[" + num + "].percent"]: 90,
  43. ["imageList[1].title"]:"突突突突突"
  44. })
  45. },

4.4 闭包

  1. var dataList = ["alex", "changxin", "cck"]
  2. for (var i in dataList) {
  3. (function(data){
  4. wx.request({
  5. url: 'xxxxx',
  6. success: function (res) {
  7. console.log(data);
  8. }
  9. })
  10. })(dataList[i])
  11. }

4.5 小程序

  • 选图片
  • 填内容
  • 提交

    1. {
    2. cover:"https://mini-1251317460.cos.ap-chengdu.myqcloud.com/08a9daei1578736867828.png",
    3. content:"小程序开发太简单了",
    4. address:"北京市",
    5. topic:1,
    6. images:[
    7. "https://mini-1251317460.cos.ap-chengdu.myqcloud.com/08a9daei1578736867828.png",
    8. "https://mini-1251317460.cos.ap-chengdu.myqcloud.com/08a9daei1578736867828.png"
    9. ]
    10. }
    11. {
    12. cover:"https://mini-1251317460.cos.ap-chengdu.myqcloud.com/08a9daei1578736867828.png",
    13. content:"小程序开发太简单了",
    14. address:"北京市",
    15. topic:1,
  1. images:[
  2. {
  3. path:"https://mini-1251317460.cos.ap-chengdu.myqcloud.com/08a9daei1578736867828.png",
  4. cos_key:"08a9daei1578736867828.pn"
  5. },
  6. {
  7. path:"https://mini-1251317460.cos.ap-chengdu.myqcloud.com/08a9daei1578736867828.png",
  8. cos_key:"08a9daei1578736867828.pn"
  9. },
  10. ]
  11. }

4.6 API

  1. from rest_framework.views import APIView
  2. from rest_framework.generics import CreateAPIView
  3. from rest_framework import serializers
  4. from apps.api import models
  5. class NewsDetailModelSerializer(serializers.Serializer):
  6. key = serializers.CharField()
  7. cos_path = serializers.CharField()
  8. class NewsModelSerializer(serializers.ModelSerializer):
  9. images = NewsDetailModelSerializer(many=True)
  10. class Meta:
  11. model = models.News
  12. fields = "__all__"
  13. class NewsView(CreateAPIView):
  14. """ 创建动态的API """
  15. serializer_class = NewsModelSerializer
  16. class News(models.Model):
  17. """
  18. 动态
  19. """
  20. cover = models.CharField(verbose_name='封面', max_length=128)
  21. content = models.CharField(verbose_name='内容', max_length=255)
  22. topic = models.ForeignKey(verbose_name='话题', to='Topic', null=True, blank=True)
  23. address = models.CharField(verbose_name='位置', max_length=128, null=True, blank=True)
  24. user = models.ForeignKey(verbose_name='发布者', to='UserInfo', related_name='news')
  25. favor_count = models.PositiveIntegerField(verbose_name='赞数', default=0)
  26. viewer_count = models.PositiveIntegerField(verbose_name='浏览数', default=0)
  27. comment_count = models.PositiveIntegerField(verbose_name='评论数', default=0)
  28. create_date = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)
  29. class NewsDetail(models.Model):
  30. """
  31. 动态详细
  32. """
  33. key = models.CharField(verbose_name='腾讯对象存储中的文件名', max_length=128, help_text="用于以后在腾讯对象存储中删除")
  34. cos_path = models.CharField(verbose_name='腾讯对象存储中图片路径', max_length=128)
  35. news = models.ForeignKey(verbose_name='动态', to='News')

4.7 规则

  1. {
  2. k1:v1,
  3. k2:v2,
  4. k3:{
  5. ...},
  6. k4:[
  7. {
  8. ....}
  9. ]
  10. }

5.restful api回顾

5.1 APIView ( 可以 )

  1. from rest_framework.response import Response
  2. class UserModelSerializer(serializers.ModelSerializer):
  3. class Meta:
  4. model = models.UserInfo
  5. fields = "__all__"
  6. class UserView(APIView):
  7. def get(self,request,*args,**kwargs):
  8. user_list = models.UserInfo.objects.all()
  9. ser = UserModelSerializer(instance=user_list,many=True)
  10. return Response(ser.data)
  11. def post(self,request,*args,**kwargs):
  12. ser = UserModelSerializer(data=request.data)
  13. if ser.is_valid():
  14. # models.UserInfo.objects.create(**ser.validated_data)
  15. ser.save(user_id=1)
  16. return Response(ser.data)
  17. return Response(ser.errors)

5.2 ListAPIView

  1. ListAPIView,CreateAPIView,RetrieveAPIView,UpdateAPIView,DestroyAPIView
  2. class NewTestModelSerializer(serializers.ModelSerializer):
  3. class Meta:
  4. model = models.News
  5. fields = "__all__"
  6. class NewTestView(CreateAPIView,ListAPIView):
  7. serializer_class = NewTestModelSerializer
  8. queryset = models.News.objects.filter(id__gt=4)
5.2.1 用户传递某些值

创建用户时,自己在后台生成一个UID。

  1. class NewTestModelSerializer(serializers.ModelSerializer):
  2. class Meta:
  3. model = models.News
  4. fields = "__all__"
  5. class NewTestView(CreateAPIView,ListAPIView):
  6. serializer_class = NewTestModelSerializer
  7. queryset = models.News.objects.filter(id__gt=4)
  8. def perform_create(self, serializer):
  9. serializer.save(uid=str(uuid.uuid4()))
5.2.2 fields和exclude的区别?

通过fields和exclude定制页面展示数据。

需求:只显示用户表的id,name,age的数据,其他不显示。

  1. class NewTestModelSerializer(serializers.ModelSerializer):
  2. class Meta:
  3. model = models.News
  4. # fields = ["id","name",'age']
  5. # fields = "__all__"
  6. exclude = ['gender']
  7. class NewTestView(ListAPIView):
  8. serializer_class = NewTestModelSerializer
  9. queryset = models.User.objects.all()
  10. [
  11. {
  12. id:1,name:'xxx',age:18},
  13. {
  14. id:1,name:'xxx',age:11},
  15. {
  16. id:1,name:'xxx',age:99},
  17. ]

需求:数据库有5个字段,显示7个字段。

  1. class NewTestModelSerializer(serializers.ModelSerializer):
  2. xx = serializers.CharField(source='id')
  3. x1 = serializers.SerializerMethodField()
  4. class Meta:
  5. model = models.News
  6. # fields = "__all__"
  7. # fields = ['id','name','age','gender','phone','xx','x1']
  8. exclude = ['id','name']
  9. def get_x1(self,obj):
  10. return obj.id
  11. class NewTestView(ListAPIView):
  12. serializer_class = NewTestModelSerializer
  13. queryset = models.User.objects.all()
  14. [
  15. {
  16. id:1,name:'xxx',age:18... xx:1,x1:1},
  17. {
  18. id:2,name:'xxx',age:11... xx:2,x1:2},
  19. {
  20. id:3,name:'xxx',age:99, xx:3,x1:3},
  21. ]
5.2.3 read_only

添加时不要,查看时候需要。

需求:编写两个接口 添加(3字段)、获取列表(5个字段)

  1. class NewTestModelSerializer(serializers.ModelSerializer):
  2. # phone = serializers.CharField(source='phone',read_only=True)
  3. # email = serializers.CharField(source='email',read_only=True)
  4. class Meta:
  5. model = models.News
  6. fields = "__all__"
  7. read_only_fields = ['phone','email',]
  8. class NewTestView(CreateAPIView, ListAPIView):
  9. serializer_class = NewTestModelSerializer
  10. queryset = models.User.objects.all()
  11. 添加:
  12. {
  13. name:'xx',
  14. age:'19',
  15. gender:1
  16. }
  17. 获取:
  18. [
  19. {
  20. name:'xx',age:'xx',gender:'',phone:'xx',email:xxx}
  21. ]
5.2.4 复杂需求

添加时用一个serializers、列表时用一个serializers

  1. class NewTestModelSerializer1(serializers.ModelSerializer):
  2. class Meta:
  3. model = models.News
  4. fields = "__all__"
  5. class NewTestModelSerializer2(serializers.ModelSerializer):
  6. class Meta:
  7. model = models.News
  8. fields = "__all__"
  9. class NewTestView(CreateAPIView, ListAPIView):
  10. queryset = models.User.objects.all()
  11. def get_serializer_class(self):
  12. if self.request.method == 'POST':
  13. return NewTestModelSerializer1
  14. if self.request.method == 'GET':
  15. return NewTestModelSerializer2
5.2.5 serializers嵌套
  1. class CreateNewsTopicModelSerializer(serializers.Serializer):
  2. key = serializers.CharField()
  3. cos_path = serializers.CharField()
  4. class CreateNewsModelSerializer(serializers.ModelSerializer):
  5. imageList = CreateNewsTopicModelSerializer(many=True)
  6. class Meta:
  7. model = models.News
  8. exclude = ['user', 'viewer_count', 'comment_count',"favor_count"]
  9. def create(self, validated_data):
  10. # 把imageList切走
  11. image_list = validated_data.pop('imageList')
  12. # 创建New表中的数据
  13. news_object = models.News.objects.create(**validated_data)
  14. data_list = models.NewsDetail.objects.bulk_create(
  15. [models.NewsDetail(**info, news=news_object) for info in image_list]
  16. )
  17. news_object.imageList = data_list
  18. if news_object.topic:
  19. news_object.topic.count += 1
  20. news_object.save()
  21. return news_object
  22. class NewsView(CreateAPIView):
  23. """
  24. 发布动态
  25. """
  26. serializer_class = CreateNewsModelSerializer
  27. def perform_create(self, serializer):
  28. # 只能保存:News表中的数据()
  29. # 调用serializer对象的save(先调用create)
  30. new_object = serializer.save(user_id=1)
  31. return new_object

发表评论

表情:
评论列表 (有 0 条评论,223人围观)

还没有评论,来说两句吧...

相关阅读

    相关 程序开发

    微信小程序是最近比较火的一个话题。那么什么是小程序?小程序是一种不需要下载安装即可使用的应用,它实现了应用「触手可及」的梦想,用户扫一扫或搜一下即可打开应用。也体现了「用完即走