十日Python项目——第四日(用户中心—收货地址)

news2024/9/9 0:00:50

#前言:

在最近十天我会用Python做一个购物类项目,会用到Django+Mysql+Redis+Vue等。

今天是第四天,主要负责撰写用户中心部分的收货地址部分。若是有不懂大家可以先阅读我的前三篇博客以能够顺承

若是大家基础有不懂的,小编前面已经关于Django博客都更新完了,大家可以自行查看。若是有需要更改的地方欢迎大家指正,同时也欢迎大家关注点赞收藏等待后续,小编会尽力更新优质博客。

在此我会直接继承上一篇博客继续往下写。

九、用户中心(收货地址)

前提声明:

这是我们此篇幅博客要实现的终极目标,能够创建一个收获地址。

1、创捷视图接收路由:

在user应用下:

# 收货地址
path('address/' , views.AddressView.as_view() , name='address'),

class AddressView(View):
    '''
    用户收货地址
    '''
    def get(self , request):
        return render(request , 'user_center_site.html')

2、创建应用:

当我们创建地址时候,面临的第一个问题就是我们要选择对应省——省对应的市——市对应的区。

因为,关于地区的信息和操作和其它操作关联性不强,所以我们单独创建注册一个areas应用。

(具体如何创建前面有很多很多次讲解,大家可以翻阅前几篇博客。)

3、创建模型类:

省——市——区。不难发现这其实是一个一对多的关系,但是由于数据量太庞大,创建多表的话占用内存太大,所以我们选择自关联,因为它省略磁盘空间,在一个表操作。

所以我们arear应用的模型类下创建:

from django.db import models

# Create your models here.
class Area(models.Model):
    '''
    实现省市区名称:
    有个关联关系:省市区,分别都是一对多。
自关联:省略磁盘空间,在一个表操作
    '''
    name=models.CharField(max_length=20)
    #SET_NULL:删除被关联的数据,对应的数据字段就会被自动设置为NULL
    parent=models.ForeignKey('self',on_delete=models.SET_NULL,null=True,related_name='subs')#外键
    class Meta:
        db_table='areas'

这个表是什么意思,举个例子:

每个市、区都会有对应外键对应省、市。

'''
自关联
    id      name        parent_id
    1       广东省         null
    2       湖北省         null
    3       广州市         1
    4       天河区         3
    5       武汉市         2
    6	    深圳市		   1
'''

而这个庞大的数据集要导入到数据库我已经将SQL语句写好了,大家可以到我网盘自行免费领取:

链接:https://pan.baidu.com/s/1A0wPS9cuPYG7zqM5wxau6w?pwd=ammd 
提取码:ammd

这个数据集大家也可以一直留着,以后也可以经常使用。

注意这个数据集你在运行SQL语句时候一定要选择按语句的顺序开始运行,不然会出现很多错误。

4、读取地区数据:

对于我们的数据,因为都是在读,对地区该的频率低,所以我们优先考虑缓存Cache,具体来说:可以把这些数据缓存到内存,cache 可以连接到配置文件中设置的默认缓存内存数据库。

在areas应用的视图下:

主要思路就是,先从内存中访问省市,若没有去Mysql数据库中找到并且存入Cache,需要注意的是访问的为什么是province_list等,是因为Json数据响应的变量名称是他们,剩下的代码中都有详细解释。

from django.shortcuts import render
from django.views import View
from django.http import JsonResponse
from areas.models import Area
from utils.response_code import RETCODE
from django.core.cache import cache

class AreasView(View):
    '''
    读取省市区地区数据

    省市区:读频率高 , 写改的频率低的数据;可以把这些数据缓存到内存
    cache 可以连接到配置文件中设置的默认缓存内存数据库
    '''
    def get(self , request):
        area_id = request.GET.get('area_id')
        # 判断请求是否存在 area_id 的参数
        if not area_id:
            # 从内存中获取省份的数据
            province_list = cache.get('province_list')
            # 判断这个数据在内存中是否存在
            if not province_list:
                # 获取省份的名称数据(到MySQL数据库)
                province_model_list = Area.objects.filter(parent_id__isnull=True)

                '''
                响应 json 数据
                {
                    'code' : 200
                    'errmsg' : OK
                    'province_list' : [
                        {id:110000;name:北京市},
                        {id:120000;name:天津市},
                        {id:130000;name:河北省},
                        ……
                    ]
                }
                '''
                province_list = []
                for province_model in province_model_list:
                    province_dict = {
                        "id":province_model.id,
                        "name":province_model.name
                    }
                    province_list.append(province_dict)
                # 将数据缓存到内存中
                cache.set('province_list' , province_list , 3600)
            return JsonResponse({'code':RETCODE.OK , 'errmsg':"OK" , 'province_list':province_list})
        else:
            # 获取市区的名称数据
            # area_id 要么是省的 id(要获取到市的数据) 要么是市的 id(要获取到区的数据)
            # 根据 area_id 的值进行获取对应关联该值的数据
            '''
            响应 json 数据
            {
                'code' : 200
                'errmsg' : OK
                sub_data = {
                    id: 110000
                    name: 北京市
                    subs : [
                        {id:110101;name:东城区},
                        {id:110102;name:西城区},
                        ……
                    ]
                }
            }
            '''
            sub_data = cache.get('sub_data_%s'%area_id)
            if not sub_data:
                # 获取 area_id 对应的数据
                parent_model = Area.objects.get(id=area_id)
                # 获取到关联 parent_model 这个对象的所有数据
                sub_model_list = parent_model.subs.all()
                subs = []
                for sub_model in sub_model_list:
                    sub_dict = {
                        "id": sub_model.id,
                        "name": sub_model.name
                    }
                    subs.append(sub_dict)
                sub_data = {
                    "id": parent_model.id,
                    "name" : parent_model.name,
                    "subs" : subs
                }
                cache.set('sub_data_%s'%area_id , sub_data , 3600)
            return JsonResponse({'code': RETCODE.OK, 'errmsg': "OK", 'sub_data': sub_data})

5、响应到前端:

修改前端中 user_center_site.html 中对应标签的内容。

<div class="form_group">
    <label>*所在地区:</label>
    <select v-model="form_address.province_id">
        <option value="0">请选择</option>
        <option :value="province.id" v-for="province in provinces">[[ province.name ]]</option>
    </select>
    <select v-model="form_address.city_id">
        <option value="0">请选择</option>
        <option :value="city.id" v-for="city in cities">[[ city.name ]]</option>
    </select>
    <select v-model="form_address.district_id">
        <option value="0">请选择</option>
        <option :value="district.id" v-for="district in districts">[[ district.name ]]</option>
    </select>
</div>

6、创建时间模型类:

关于创建地址,或者说后面对货物上架我们都会用到关于时间以及时间更新的数据,所以我们创建一个专门争对时间的model类。

让其他模型可以共用时间字段,在utils 包中创建一个 model 文件。

from django.db import models


class BaseModel(models.Model):
    # 创建时间
    create_time = models.DateTimeField(auto_now_add=True)
    # 更新时间
    update_time = models.DateTimeField(auto_now=True)

    class Meta:
        # 让该模型类在迁移数据库的时候不为其单独创建一张表,必须依赖于其它模型类
        abstract = True

当其他模型类需要使用到该字段的时候,直接继承即可。

7、创建用户收货地址模型类:

在areas的模型下创建。

class Address(BaseModel):
    # 用户收货地址
    # 关联用户 , 要知道对应的数据是那个用户地址
    user = models.ForeignKey(User , on_delete=models.CASCADE , related_name='address')
    receiver = models.CharField(max_length=20)
    # models.PROTECT:如果要删除的数据,有被其他数据关联,那么删除的操作失败。
    province = models.ForeignKey('areas.Area' , on_delete=models.PROTECT , related_name='province_address')
    city = models.ForeignKey('areas.Area' , on_delete=models.PROTECT , related_name='city_address')
    district = models.ForeignKey('areas.Area' , on_delete=models.PROTECT , related_name='district_address')
    palce = models.CharField(max_length=50) # 详细地址
    mobile = models.CharField(max_length=11)
    tel = models.CharField(max_length=20 , null=True , blank=True , default='')
    email = models.CharField(max_length=20 , null=True , blank=True , default='')

    class Meta:
        db_table = 'address'

对标的正好是这些属性,值得一说的是关于固定电话以及邮箱这是非必填的内容,模型类中设置是可以为空。

而我们的用户地址到时候会有一个默认地址,所以我们是在用户个人数据模型类中保存默认收货地址 , 默认地址只能有一个。

注意:这是在原有模型类上面只加了一行代码,并不是重新定义的模型类。

class User(AbstractUser):
    '''
    用户数据认证模型类
    '''

    mobile=models.CharField(max_length=11,unique=True)
    email = models.EmailField(blank=True, null=True)  # 允许为空
    #默认收获地址:关联收货地址模型类的数据
    default_address=models.ForeignKey('Address',on_delete=models.SET_NULL,null=True,related_name='users')


    class Meta:
        db_table='user'

8、新增用户收货地址:

注意数据是Json数据类型的所以相对数据进行解码,然后接收数据,校验是否合法,然后将它保存到数据库(因为是地址,不具有唯一性,所以不进行数据库校验)。

# 新增收货地址
path('addresses/create/' , views.AddressCreateView.as_view()),

class AddressCreateView(View):
    '''
    用户新增收货地址
    '''
    def post(self , request):
        json_dict = json.loads(request.body.decode())
        receiver = json_dict.get('receiver')
        province_id = json_dict.get('province_id')
        city_id = json_dict.get('city_id')
        district_id = json_dict.get('district_id')
        place = json_dict.get('place')
        mobile = json_dict.get('mobile')
        tel = json_dict.get('tel')
        email = json_dict.get('email')

        # 校验数据,数据完整性
        if not all([receiver , province_id , city_id , district_id , place ,mobile]):
            return HttpResponseForbidden('缺少必要的数据')

        if not re.match(r'^1[3-9]\d{9}$' , mobile):
            return HttpResponseForbidden('手机号有误')

        if tel:
            if not re.match(r'^(0[0-9]{2,3}-)?([2-9][0-9]{6,7})+(-[0-9]{1,4})?$' , tel):
                return HttpResponseForbidden('固定电话有误')

        if email:
            if not re.match(r'^[a-z0-9][\w\.\-]*@[a-z0-9\-]+(\.[a-z]{2,5}){1,2}$' , email):
                return HttpResponseForbidden('邮箱有误')

        # 将数据保存到数据库中
        address = Address.objects.create(
            user=request.user,
            receiver=receiver,
            province_id = province_id,
            city_id = city_id,
            district_id = district_id,
            palce = place,
            mobile = mobile,
            tel = tel,
            email = email
        )

        address_dict = {
            "id" : address.id,
            'receiver': address.receiver,
            'province': address.province.name,
            'city': address.city.name,
            'district': address.district.name,
            'place': address.palce,
            'mobile': address.mobile,
            'tel': address.tel,
            'email': address.email,
        }
        return JsonResponse({"code":RETCODE.OK , 'errmsg':"新增地址成功" , "address":address_dict})

注意:address_dict 变量用于构造一个包含新创建的收货地址详细信息的字典。这些信息随后会作为 JSON 响应的一部分返回给前端。这个字典的结构便于前端展示新地址的详细信息,并且能够直接用于界面更新或数据处理。

9、渲染收货地址:

渲染收获地址说白了就是能将收货地址响应到页面:

我们 要做的就是获取用户登录信息,然后去数据库获取相应的用户信息,最后获取地址信息,然后由后端接收返回到前端页面。

class AddressView(View):
    '''
    用户收货地址
    '''
    def get(self , request):
        # 获取当前登录的用户信息
        login_user = request.user
        # 根据当前登录的用户信息 , 获取对应的收货地址数据
        addresses = Address.objects.filter(user=login_user)

        address_list = []
        for address in addresses:
            address_dict = {
                "id": address.id,
                'receiver': address.receiver,
                'province': address.province.name,
                'city': address.city.name,
                'district': address.district.name,
                'place': address.palce,
                'mobile': address.mobile,
                'tel': address.tel,
                'email': address.email,
            }
            address_list.append(address_dict)

        context = {
            'addresses' : address_list,
            # 获取用户默认收货地址
            'default_address_id': login_user.default_address_id,
            # 用户收货地址个数
            'count' : addresses.count()
        }
        return render(request , 'user_center_site.html' , context=context)

此时的前端:

修改 user_center_site.html 页面中对应标签的内容:

将数据接收到Js里面了,所以HTML的内容也要和JS对应。

<script type="text/javascript">
    let addresses = {{ addresses | safe }};
    let default_address_id = {{ default_address_id|default:0 }};
</script>

注意:我们按照JS不仅接收参数,而且得接收索引。也就是( v-for="(address , index) in addresses"),最后按照参数和索引一起来相应到前端。

<div class="right_content clearfix" v-cloak>
    <div class="site_top_con">
        <a @click="show_add_site">新增收货地址</a>
        <span>你已创建了<b>{{ count }}</b>个收货地址,最多可创建<b>20</b>个</span>
    </div>
    <div class="site_con" v-for="(address , index) in addresses">
        <div class="site_title">
            <h3>[[ address.receiver ]]</h3>
            <a @click="show_edit_title(index)" class="edit_icon"></a>
            <em v-if="address.id === default_address_id">默认地址</em>
            <span class="del_site" @click="delete_address(index)">×</span>
        </div>
        <ul class="site_list">
            <li><span>收货人:</span><b>[[ address.receiver ]]</b></li>
            <li><span>所在地区:</span><b>[[ address.province ]] [[ address.city ]] [[ address.district ]]</b></li>
            <li><span>地址:</span><b>[[ address.place ]]</b></li>
            <li><span>手机:</span><b>[[ address.mobile ]]</b></li>
            <li><span>固定电话:</span><b>[[ address.tel ]]</b></li>
            <li><span>电子邮箱:</span><b>[[ address.email ]]</b></li>
        </ul>
        <div class="down_btn">
            <a v-if="address.id != default_address_id" @click="set_default(index)"> 设置默认地址</a>
            <a @click="show_edit_site(index)" class="edit_icon">编辑</a>
        </div>
    </div>
</div>

10、设置默认收货地址:

要设置默认收获地址前我们先用前端网页抓取来判断一下默认收货地址的请求类型和响应路由。

我们由此的得到是put请求和路由所以我们就可以开始写视图和路由。

# 默认收货地址
re_path('^addresses/(?P<address_id>\d+)/default/$'  , views.DefaultAddressView.as_view()),

class DefaultAddressView(View):
    '''
    设置默认收获地址
    '''
    def put(self,request,address_id):
        #去网页抓取一下就能发现接受的参数和为什么是put请求了
        address=Address.objects.get(id=address_id)
        request.user.default_address=address
        request.user.save()#将数据保存到数据库中
        return JsonResponse({'code':'RETCODE.OK','errmsg':"默认收获地址设置成功"})

前面HTML代码中已经包括了默认地址响应的代码。

11、删除/修改收货地址:

同样的要设前我们先用前端网页抓取来判断一下默认收货地址的请求类型和响应路由。

我们发现修改是delete请求、删除是put请求,而路由两个的一致,所以我们只需要创建一个分发路由即可。

和上面的操作一致,我们开始写类视图与分发路由。

写类视图的思路为:删除很简单,就是由地址id直接从数据库删除。而修改的思路和前面新增地址的基本一致,先解码json数据,再获取地址信息(自己输入前端页面的信息,也就是get请求),校验数据完整性,然后获取原先地址id,将原先输入的地址信息修改为刚刚输入的信息,最后将新地址信息保存到数据库。

# 修改/删除收货地址
re_path('^addresses/(?P<address_id>\d+)/$'  , views.UpdateAddressView.as_view()),

class UpdateAddressView(View):
    '''
    修改/删除收货地址
    '''
    def delete(self , request , address_id):
        # 删除收货地址
        Address.objects.get(id=address_id).delete()
        return JsonResponse({"code": RETCODE.OK, 'errmsg': "地址删除成功"})

    def put(self , request , address_id):
        # 修改收货地址
        json_dict = json.loads(request.body.decode())
        receiver = json_dict.get('receiver')
        province_id = json_dict.get('province_id')
        city_id = json_dict.get('city_id')
        district_id = json_dict.get('district_id')
        place = json_dict.get('place')
        mobile = json_dict.get('mobile')
        tel = json_dict.get('tel')
        email = json_dict.get('email')

        # 校验数据,数据完整性
        if not all([receiver, province_id, city_id, district_id, place, mobile]):
            return HttpResponseForbidden('缺少必要的数据')

        if not re.match(r'^1[3-9]\d{9}$', mobile):
            return HttpResponseForbidden('手机号有误')

        if tel:
            if not re.match(r'^(0[0-9]{2,3}-)?([2-9][0-9]{6,7})+(-[0-9]{1,4})?$', tel):
                return HttpResponseForbidden('固定电话有误')

        if email:
            if not re.match(r'^[a-z0-9][\w\.\-]*@[a-z0-9\-]+(\.[a-z]{2,5}){1,2}$', email):
                return HttpResponseForbidden('邮箱有误')

        Address.objects.filter(id=address_id).update(
            user=request.user,
            receiver=receiver,
            province_id=province_id,
            city_id=city_id,
            district_id=district_id,
            palce=place,
            mobile=mobile,
            tel=tel,
            email=email
        )

        address = Address.objects.get(id=address_id)
        address_dict = {
            "id": address.id,
            'receiver': address.receiver,
            'province': address.province.name,
            'city': address.city.name,
            'district': address.district.name,
            'place': address.palce,
            'mobile': address.mobile,
            'tel': address.tel,
            'email': address.email,
        }
        return JsonResponse({"code": RETCODE.OK, 'errmsg': "地址修改成功", "address": address_dict})

#总结:

该篇博客详细的介绍的Python项目中关于用户中心收货地址的讲解,主要是前后端和数据库来回获取数据,来回调用,响应,增删改查。内容完整详细,若是各位大佬发现需要修改的地方欢迎前来批评指正。同时,我后续还会继续更新后面项目内容,欢迎大家关注!您的关注与点赞将是小编变强路上最强的动力!

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

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

相关文章

C语言:字符串函数、内存函数剖析

字符串函数、内存函数剖析 一、字符串函数&#xff08;一&#xff09;求字符串长度1、strlen&#xff08;1&#xff09;库函数实现&#xff08;2&#xff09;自定义实现 &#xff08;二&#xff09;长度不受限制的字符串函数1、strcpy&#xff08;1&#xff09;库函数实现&…

宠物猫用空气净化器真的有用吗?值得买的猫用空气净化器牌子排名

作为一名6年资深铲屎官&#xff0c;每天铲猫砂盆的工作无疑是一项挑战。家中不仅弥漫着难以忍受的气味&#xff0c;而且家里的小孩和老人偶尔会因为过敏性鼻炎或结膜炎等问题感到不适。换毛季节尤其头疼&#xff0c;浮毛无处不在&#xff1a;沙发、外套、坐垫&#xff0c;甚至连…

学习008-02-04-08 Localize UI Elements(本地化UI元素)

Localize UI Elements&#xff08;本地化UI元素&#xff09; This lesson explains how to localize an XAF application. It describes how to translate UI elements into German and create a multi-language application. 本课介绍如何本地化XAF应用程序。它描述了如何将U…

【C语言】在限制定条件下数据移动

C语言 在限制定条件下数据移动 给定一个数组 nums&#xff0c;编写一个函数将所有0移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意&#xff0c;必须在不复制数组的情况下原地对数组进行操作。 作业题 解决思路及代码 要将数组中的所有 0 移动到数组的末…

数学中的连分式、无穷连根式、平方根

连分式 连分式&#xff08;continued fraction&#xff09;由和与倒数的多层嵌套构成&#xff0c;可以是有限的&#xff0c;也可以是无限的。 表达式&#xff1a;或 import mathdef fraction_to_continued_fraction(numerator, denominator, max_terms):"""计算…

WordPress原创插件:搜索引擎抓取首图seo图片

WordPress原创插件&#xff1a;搜索引擎抓取首图seo图片 插件设置 插件将在网站头部添加适当的meta标签&#xff0c;以便百度等搜索引擎抓取指定的固定图像。 插件下载 https://download.csdn.net/download/huayula/89596527

[Meachines] [Easy] Friendzone LFI+Python-OS库污染权限提升

信息收集 IP AddressOpening Ports10.10.10.123TCP:21,22,53,80,139,443,445 $ nmap -p- 10.10.10.123 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 21/tcp open ftp vsftpd 3.0.3 22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4 (Ubuntu Lin…

vue项目上线打包后出现的问题

1、出现空白页 1.1 打包路径&#xff1a; module.exports {publicPath:./, //修改为绝对路径 } 修改完打包路径后build可以展示页面 1.2 路由模式&#xff1a; 项目上线要求是history模式&#xff0c;需要后端做重定向 前端自测可以使用hash模式 2、代理和环境变量 问题…

信创系统上的数据加密和防泄露该如何对应?

随着信息技术的快速发展和数字化转型的深入推进&#xff0c;关于信创加密和信创防泄露的信息安全问题日益凸显。特别是在国家战略层面&#xff0c;推动自主可控的信息技术体系建设成为重中之重。深信达信创沙盒作为一款基于国产操作系统&#xff08;如麒麟、统信等&#xff09;…

Hugo 部署与自动更新(Git)

文章目录 Nginx部署Hugonginx.confhugo.conf Hugo自动更新Hugo自动更新流程添加访问令牌添加web hookrust实现自动更新接口 Nginx部署Hugo nginx.conf user nginx; worker_processes auto;error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid;even…

大模型系统学习路线

随着技术的进步&#xff0c;大模型如OpenAI的GPT-4和Sora、Google的BERT和Gemini等已经展现出了惊人的能力-从理解和生成自然语言到创造逼真的图像及视频。所以掌握大模型的知识和技能变得越来越重要。 下面是学习大模型的一些建议&#xff0c;供大家参考。 必备基础知识 **…

爬虫实战-掌上高考网实战

1.确定需求&#xff1a;爬取什么数据爬取大学名称 2.找到数据源地址数据在哪个链接中https://api.zjzw.cn/web/api/?keyword&page1&province_id&ranktype&request_type1&size20&top_school_id[3703,2461,659,3117,597,1724]&type&uriapidata/…

【NPU 系列专栏 2.6 -- - NVIDIA Xavier SoC】

文章目录 NVIDIA Xavier SoCXavier 主要组件Xavier SoC 的型号Xavier SoC 的算力Xavier AGXXavier NXXavier 应用场景自动驾驶机器人物联网(IoT)医疗设备NPU 对比SummaryNVIDIA Xavier SoC 英伟达 Xavier SoC 是英伟达推出的一款高性能系统级芯片,专门为人工智能(AI)和自…

c# - - - ASP.NET Core 网页样式丢失,样式不对

c# - - - ASP.NET Core 网页样式丢失&#xff0c;样式不对 问题 正常样式是这样的。 修改项目名后&#xff0c;样式就变成这样了。底部的内容跑到中间了。 解决 重新生成解决方案&#xff0c;然后发布网站。 原因&#xff1a; 修改项目名之前的 div 上有个这个自定义属…

Mysql开启远程控制简化版,亲测有效

首先关闭防火墙 改表法 打开上图的CMD&#xff0c;输入密码进入&#xff0c;然后输入一下指令 1.use mysql; 2.update user set host % where user root;//更新root用户的权限&#xff0c;允许任何主机连接 3.FLUSH PRIVILEGES;//刷新权限&#xff0c;使更改生效 具体参考…

详解 @RequestHeader 注解在 Spring Boot 中的使用

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119@qq.com] 📱个人微信:15279484656 🌐个人导航网站:www.forff.top 💡座右铭:总有人要赢。为什么不能是我呢? 专栏导…

JS+H5在线文心AI聊天(第三方接口)

源码在最后面 调用的不是文心官方接口 可以正常聊天 有打字动画 效果图 源代码 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-s…

文献笔记|综述|A Survey of Large Language Models (前3章)

A Survey of Large Language Models 题目&#xff1a;大语言模型综述 作者&#xff1a;Wayne Xin Zhao, Kun Zhou, Junyi Li et al. 来源&#xff1a;arXiv 单位&#xff1a;中国人民大学高瓴人工智能学院、中国人民大学信息学院 关键词&#xff1a;Large Language Models; Eme…

如何快速获取全网精准客流?揭秘不为人知的5大运营策略!

有同行所在的地方&#xff0c;就一定拥有咱们需要的客户。客户看的是结果&#xff0c;搜索的是问题&#xff0c;寻找的是答案。 如果没有付费流量&#xff0c;单纯靠搞免费流量&#xff0c;很多大厂的运营也会变得一文不值。一个牛逼的运营&#xff0c;不仅是会做付费流量&…

【Vue2】3-使用Vue脚手架

目录 初始化脚手架 说明 具体步骤 模板项目的结构 关于不同版本的Vue vue.config.js配置文件 ref属性 配置项props mixin&#xff08;混入&#xff09; 插件 scoped样式 总结TodoList案例 webStorage&#xff08;浏览器本地存储&#xff09; TodoList本地存储 组…