前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Django+Vue开发生鲜电商平台之6.使用Vue实现商品类别和商品数据前台显示

Django+Vue开发生鲜电商平台之6.使用Vue实现商品类别和商品数据前台显示

作者头像
cutercorley
发布于 2020-07-27 10:20:47
发布于 2020-07-27 10:20:47
1.8K00
代码可运行
举报
运行总次数:0
代码可运行

Github和Gitee代码同步更新https://github.com/PythonWebProject/Django_Fresh_Ecommercehttps://gitee.com/Python_Web_Project/Django_Fresh_Ecommerce

现在将DRF数据接口与前端显示相结合。

一、商品类别数据接口

由之前的效果图和需求分析可知,首页全部商品分类需要展示一级、二级和三级分类,而在搜索结果页只展示一级和二级分类,分类有两个Vue组件,即Header中的全部商品分类和左侧的某以及类别对应的分类导航栏,也对应两个数据接口。

先在apps/goods/views.py中定义商品类别数据View如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from rest_framework import mixins, viewsets, filters
from rest_framework.pagination import PageNumberPagination
from django_filters.rest_framework import DjangoFilterBackend

from .models import Goods, GoodsCategory
from .serializers import GoodsSerializer, CategorySerializer
from .filters import GoodsFilter


# Create your views here.

class GoodsPagination(PageNumberPagination):
    page_size = 10
    page_size_query_param = 'page_size'
    page_query_param = 'p'
    max_page_size = 100

class GoodsListViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
    '''商品列表页,并实现分页、搜索、过滤、排序'''

    queryset = Goods.objects.all()
    serializer_class = GoodsSerializer
    pagination_class = GoodsPagination
    filter_backends = [DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter]
    filter_class = GoodsFilter
    search_fields = ['name', 'goods_brief', 'goods_desc']
    ordering_fields = ['sold_num', 'market_price']


class CategoryViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
    '''商品分类列表数据'''

    queryset = GoodsCategory.objects.all()
    serializer_class = CategorySerializer

再在urls.py中配置路由如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.conf.urls import url, include
from django.views.static import serve
from rest_framework.documentation import include_docs_urls
from rest_framework.routers import DefaultRouter

import xadmin
from .settings import MEDIA_ROOT
from goods.views import GoodsListViewSet, CategoryViewSet

# Create a router and register our viewsets with it.

router = DefaultRouter()

# 配置goods的路由
router.register(r'goods', GoodsListViewSet, basename='goods')

# 配置categories的路由
router.register(r'categories', CategoryViewSet, basename='categories')

显示:

显然,将所有的数据都发送到前端,但是根据前端的要求,不同级之间的类别具有附属和依赖的关系,而不是平级的关系,显然还没有达到效果,需要进行改进。

此时需要用到才定义模型GoodsCategory的字段parent_category时指定的related_name属性,即related_name='sub_cat',此属性表示可以反向引用,即通过夫类别可以通过该属性查询子类别,利用该属性实现Serializer的三层嵌套引用,从而实现类别的嵌套显示,serializers.py 如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from rest_framework import serializers

from .models import Goods, GoodsCategory


class TerCategorySerializer(serializers.ModelSerializer):
    '''三级商品子类别序列化'''

    class Meta:
        model = GoodsCategory
        fields = '__all__'


class SecCategorySerializer(serializers.ModelSerializer):
    '''二级商品子类别序列化'''

    sub_cat = TerCategorySerializer(many=True)
    class Meta:
        model = GoodsCategory
        fields = '__all__'


class CategorySerializer(serializers.ModelSerializer):
    '''一级商品类别序列化'''

    sub_cat = SecCategorySerializer(many=True)
    class Meta:
        model = GoodsCategory
        fields = '__all__'


class GoodsSerializer(serializers.ModelSerializer):
    '''商品序列化'''
    category = CategorySerializer()
    class Meta:
        model = Goods
        fields = '__all__'

此时再访问,显示:

此时,以嵌套的形式在父类别中显示出子类别,并且属于三层嵌套。

现在需要实现获取某一个具体类别的详情(包括其基本信息和子类别),此时需要在路由中加入商品对应的id,只要使CategoryViewSet继承自mixins.RetrieveModelMixin,即可自动配置路由,无需再额外配置,即views.py如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class CategoryViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet):
    '''商品分类列表数据'''

    queryset = GoodsCategory.objects.all()
    serializer_class = CategorySerializer

显示:

显然,此时地址中传入指定的id,只显示该id对应的类别的信息和其子类别的信息。

二、Vue展示商品分类

在测试前需要先在fresh_online目录下执行命令cnpm run dev启动前端项目,启动后访问,可以看到:

显然,商品分类展示完整。

为了只是单独测试某一类数据而不影响其他数据的显示,因此其他数据都通过线上接口显示、待测试的数据通过本地接口测试。

在前端项目fresh_online中,在src/api/api.js中定义了数据API接口:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import axios from 'axios';


let host = 'http://shop.projectsedu.com';
let local_host = 'http://127.0.0.1:8000';

//获取商品类别信息
export const queryCategorygoods = params => { return axios.get(`${host}/indexgoods/`) }

//获取首页中的新品
export const newGoods = params => { return axios.get(`${host}/newgoods/`) }

//获取轮播图
export const bannerGoods = params => { return axios.get(`${host}/banners/`) }

//获取商品类别信息
export const getCategory = params => {
  if('id' in params){
    return axios.get(`${local_host}/categorys/`+params.id+'/');
  }
  else {
    return axios.get(`${local_host}/categorys/`, params);
  }
};


//获取热门搜索关键词
export const getHotSearch = params => { return axios.get(`${host}/hotsearchs/`) }

//获取商品列表
export const getGoods = params => { return axios.get(`${host}/goods/`, { params: params }) }

//商品详情
export const getGoodsDetail = goodId => { return axios.get(`${host}/goods/${goodId}`+'/') }

//获取购物车商品
export const getShopCarts = params => { return axios.get(`${host}/shopcarts/`) }
// 添加商品到购物车
export const addShopCart = params => { return axios.post(`${host}/shopcarts/`, params) }
//更新购物车商品信息
export const updateShopCart = (goodsId, params) => { return axios.patch(`${host}/shopcarts/`+goodsId+'/', params) }
//删除某个商品的购物记录
export const deleteShopCart = goodsId => { return axios.delete(`${host}/shopcarts/`+goodsId+'/') }

//收藏
export const addFav = params => { return axios.post(`${host}/userfavs/`, params) }

//取消收藏
export const delFav = goodsId => { return axios.delete(`${host}/userfavs/`+goodsId+'/') }

export const getAllFavs = () => { return axios.get(`${host}/userfavs/`) }

//判断是否收藏
export const getFav = goodsId => { return axios.get(`${host}/userfavs/`+goodsId+'/') }

//登录
export const login = params => {
  return axios.post(`${host}/login/`, params)
}

//注册

export const register = parmas => { return axios.post(`${host}/users/`, parmas) }

//短信
export const getMessage = parmas => { return axios.post(`${host}/code/`, parmas) }


//获取用户信息
export const getUserDetail = () => { return axios.get(`${host}/users/1/`) }

//修改用户信息
export const updateUserInfo = params => { return axios.patch(`${host}/users/1/`, params) }


//获取订单
export const getOrders = () => { return axios.get(`${host}/orders/`) }
//删除订单
export const delOrder = orderId => { return axios.delete(`${host}/orders/`+orderId+'/') }
//添加订单
export const createOrder = params => {return axios.post(`${host}/orders/`, params)}
//获取订单详情
export const getOrderDetail = orderId => {return axios.get(`${host}/orders/`+orderId+'/')}


//获取留言
export const getMessages = () => {return axios.get(`${host}/messages/`)}

//添加留言
export const addMessage = params => {return axios.post(`${host}/messages/`, params, {headers:{ 'Content-Type': 'multipart/form-data' }})}

//删除留言
export const delMessages = messageId => {return axios.delete(`${host}/messages/`+messageId+'/')}

//添加收货地址
export const addAddress = params => {return axios.post(`${host}/address/`, params)}

//删除收货地址
export const delAddress = addressId => {return axios.delete(`${host}/address/`+addressId+'/')}

//修改收货地址
export const updateAddress = (addressId, params) => {return axios.patch(`${host}/address/`+addressId+'/', params)}

//获取收货地址
export const getAddress = () => {return axios.get(`${host}/address/`)}

其中,获取商品分类的接口为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
export const getCategory = params => {
  if('id' in params){
    return axios.get(`${host}/categorys/`+params.id+'/');
  }
  else {
    return axios.get(`${host}/categorys/`, params);
  }
};

显然,可以看到,如果参数中传入了id,则返回单个类别,否则返回所有类别。

而负责将类别数据显示到前端的是head.vue组件,位于src/views/head目录下,其通过赋值和循环将类别遍历出来:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div class="main_cata" id="J_mainCata" v-show="showAllmenu">
    <ul>
        <li class="first" v-for="(item,index) in allMenuLabel" @mouseover="overChildrenmenu(index)" @mouseout="outChildrenmenu(index)">
          <h3 style="background:url(../images/1449088788518670880.png) 20px center no-repeat;">
            <router-link :to="'/app/home/list/'+item.id">{{item.name}}</router-link> </h3>
            <div class="J_subCata" id="J_subCata" v-show="showChildrenMenu ===index"  style=" left: 215px; top: 0px;">
                <div class="J_subView" >
                  <div v-for="list in item.sub_cat">
                    <dl>
                      <dt>
                        <router-link :to="'/app/home/list/'+list.id">{{list.name}}</router-link>
                      </dt>

                      <dd>
                        <router-link  v-for="childrenList in list.sub_cat" :key="childrenList.id" :to="'/app/home/list/'+childrenList.id">{{childrenList.name}}</router-link>
                      </dd>
                    </dl>
                    <div class="clear"></div>
                  </div>
                </div>
            </div>
        </li>
    </ul>
</div>

// ...

getMenu(){//获取菜单
    getCategory({
      params:{}
    }).then((response)=> {
              console.log(response)
              this.allMenuLabel = response.data
          })
          .catch(function (error) {
            console.log(error);
          });
},

为了让数据在前端正常显示,还需要过滤类别数据、只显示一级类别,修改views.py如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class CategoryViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet):
    '''
    List: 显示商品所有分类列表数据
    Retrieve: 获取单个商品分类详情
    '''

    queryset = GoodsCategory.objects.filter(category_type=1)
    serializer_class = CategorySerializer

此时再访问,显示:

此时再访问,却访问不到商品分类,查看控制台提示很明显,同源策略禁止读取位于 http://127.0.0.1:8000/categorys/ 的远程资源。,即禁止跨域访问,当前端口是 8080,而数据接口端口是8000,因此被浏览器自动拒绝,一种方式是对服务器进行设置,还有一种是通过前端代理解决,这里采用第一种方式: 首先在虚拟环境中执行pip install django-cors-headers命令安装库,然后在后端settings.py中配置Cors:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
INSTALLED_APPS = [
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'apps.users.apps.UsersConfig',
    'goods.apps.GoodsConfig',
    'trade.apps.TradeConfig',
    'user_operation.apps.UserOperationConfig',
    'DjangoUeditor',
    'xadmin',
    'crispy_forms',
    'django.contrib.admin',
    'rest_framework',
    'django_filters',
    'corsheaders',
]

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

# 跨域访问设置
CORS_ORIGIN_ALLOW_ALL = True

此时再访问,显示:

此时不再报错,商品的各级分类也显示出来,但是可以看出来,全部分类右侧并未显示商品分类,这是因为一级分类的is_tab属性默认为False,改为True即可,可以在数据库中修改,也可以直接在后台管理系统修改。

head.vue中显示商品分类的逻辑也是通过循环实现,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template v-for="(item,index) in allMenuLabel">
    <li>
        <div v-if="item.is_tab">
            <router-link :to="'/app/home/list/'+item.id" >{{item.name}}</router-link>
        </div>
    </li>
</template>

后台修改商品分类is_tab属性并刷新页面如下:

此时已经显示出商品分类。

三、Vue展示商品列表页数据和搜索

现在进一步实现点击某一个商品分类下面显示出商品详情,具体包括分类显示、价格筛选、分页和排序等功能。 通过项目可以看到,通过搜索和点击Tab页左侧显示的导航栏是不同的,其数据接口也不一样,head.vue如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div class="head_search_hot">
  <span>热搜榜:</span>
  <router-link v-for="item in hotSearch" :to="'/app/home/search/'+item.keywords" :key="item.keywords">
    {{item.keywords}}
  </router-link>
</div>

// ...

<div class="main_nav_link" @mouseover="overAllmenu" @mouseout="outAllmenu">
    <a class="meunAll">全部商品分类
        <i class="iconfont">&#xe643;</i>
    </a>
    <div class="main_cata" id="J_mainCata" v-show="showAllmenu">
        <ul>
            <li class="first" v-for="(item,index) in allMenuLabel" @mouseover="overChildrenmenu(index)" @mouseout="outChildrenmenu(index)">
              <h3 style="background:url(../images/1449088788518670880.png) 20px center no-repeat;">
                <router-link :to="'/app/home/list/'+item.id">{{item.name}}</router-link> </h3>
                <div class="J_subCata" id="J_subCata" v-show="showChildrenMenu ===index"  style=" left: 215px; top: 0px;">
                    <div class="J_subView" >
                      <div v-for="list in item.sub_cat">
                        <dl>
                          <dt>
                            <router-link :to="'/app/home/list/'+list.id">{{list.name}}</router-link>
                          </dt>

                          <dd>
                            <router-link  v-for="childrenList in list.sub_cat" :key="childrenList.id" :to="'/app/home/list/'+childrenList.id">{{childrenList.name}}</router-link>
                          </dd>
                        </dl>
                        <div class="clear"></div>
                      </div>
                    </div>
                </div>
            </li>
        </ul>
    </div>
</div>

可以看到,跳转路由不同,搜索跳转到/app/home/search/,而点击导航栏跳转到/app/home/list/

再查看src/router/index.js如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  path: 'list/:id',
  name: 'list',
  component: list,
  meta: {
    title: '列表',
    need_log: false
  }
},
{
  path: 'search/:keyword',
  name: 'search',
  component: list,
  meta: {
    title: '搜索',
    need_log: false
  }
},

可以看到,两个路由绑定的组件是相同的,都是list,而在src/views/list/list.vue中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
getAllData () {
    console.log(this.$route.params)
    if(this.$route.params.id){
        this.top_category = this.$route.params.id;
        this.getMenu(this.top_category); // 获取左侧菜单列表
    }else{
        this.getMenu(null); // 获取左侧菜单列表
        this.pageType = 'search'
        this.searchWord = this.$route.params.keyword;
    }

    this.getCurLoc(); // 获取当前位置
    this.getListData(); //获取产品列表
    this.getPriceRange(); // 获取价格区间
},
getListData() {
    if(this.pageType=='search'){
      getGoods({
        search: this.searchWord, //搜索关键词
      }).then((response)=> {
        this.listData = response.data.results;
        this.proNum = response.data.count;
      }).catch(function (error) {
        console.log(error);
      });
    }else {
      getGoods({
        page: this.curPage, //当前页码
        top_category: this.top_category, //商品类型
        ordering: this.ordering, //排序类型
        pricemin: this.pricemin, //价格最低 默认为‘’ 即为不选价格区间
        pricemax: this.pricemax // 价格最高 默认为‘’
      }).then((response)=> {

        this.listData = response.data.results;
        this.proNum = response.data.count;
      }).catch(function (error) {
        console.log(error);
      });
    }

},
getMenu(id) {
    if(id != null){
      getCategory({
        id:this.$route.params.id
      }).then((response)=> {
        this.cateMenu = response.data.sub_cat;
        this.currentCategoryName = response.data.name
      }).catch(function (error) {
        console.log(error);
      });
    }else {
      getCategory({}).then((response)=> {
        this.cateMenu = response.data;
        this.isObject = false
      }).catch(function (error) {
        console.log(error);
      });
    }

},

可以看到,针对不同的参数有不同的请求方法和参数。

请求商品列表数据使用的是getListData()方法,调用了getGoods()方法,为了测试获取商品,将getGoodsAPI进行修改如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//获取商品列表
export const getGoods = params => { return axios.get(`${local_host}/goods/`, { params: params }) }

同时,向后端请求的参数有一个为top_category,即表示一级类别,请求该参数则返回这一类别下的所有类别,需要在后端定义一个过滤器,需要找到该一级分类下的所有二级分及其对应的商品,后端apps/goods/filters.py如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import django_filters
from django.db.models import Q

from .models import Goods

class GoodsFilter(django_filters.rest_framework.FilterSet):
    '''商品过滤类'''
    name = django_filters.CharFilter(field_name="name", lookup_expr='contains')
    pricemin = django_filters.NumberFilter(field_name="market_price", lookup_expr='gte')
    pricemax = django_filters.NumberFilter(field_name="market_price", lookup_expr='lte')
    top_category = django_filters.NumberFilter(method='top_category_filter')

    def top_category_filter(self, queryset, name, value):
        '''自定义过滤'''
        return queryset.filter(Q(category_id=value)|Q(category__parent_category_id=value)|Q(category__parent_category__parent_category_id=value))

    class Meta:
        model = Goods
        fields = ['name', 'pricemin', 'pricemax']

显示:

此时,可以根据top_category进行筛选,再查看前端:

可以看到,已经实现了价格筛选、排序、分页等功能。

从之前的代码还可以看到搜索功能的实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if(this.pageType=='search'){
  getGoods({
    search: this.searchWord, //搜索关键词
  }).then((response)=> {
    this.listData = response.data.results;
    this.proNum = response.data.count;
  }).catch(function (error) {
    console.log(error);
  });
}

再测试搜索功能如下:

显然,已经实现了搜索功能。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/07/26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
情人节这天,idol居然对我「说情话」!?
情人节将至,当其他人还在苦思冥想如何准备情人节礼物时,我却已经收到了我最喜欢的idol说给我的情话视频~不仅如此,我还用自己的照片说出了亲爱的ta最喜欢的告白台词,究竟是什么技术让我能够在这个情人节脱颖而出?
用户1386409
2021/03/09
6410
情人节这天,idol居然对我「说情话」!?
为躲亲戚催婚,一摄影师创造出了 AI 女友
作者 | MATT GROWCOOT 译者 | 核子可乐 策划 | 刘燕 为躲亲戚催婚,一摄影师创造出了 AI 女友   来自 PiXimperfect 的摄影师 Unmesh Dinda 创建出纯 AI 生成的女友,再次展示了 AI 强大的照片编辑能力。 近日,Dinda 发布了一对情侣在假期闪逛时的多张自拍,其中的光影效果极其逼真,与照片背景完美契合。但请注意:照片中的 Dinda 是真人,女友则是由 AI 模型一手创造出来的。 Dinda 在自己的 YouTube 视频中提到,“如果你身边
深度学习与Python
2023/03/29
4590
为躲亲戚催婚,一摄影师创造出了 AI 女友
5个令人惊艳的AI项目,开源了。。
今天,我将继续着重挑选几个近期的优质开源项目,相信这些项目对于我们的日常工作、学习生活,都会有一定的帮助。
Jack_Cui
2023/04/12
1.4K0
5个令人惊艳的AI项目,开源了。。
一秒回到P图前:Adobe发布“反向PS”利器,知道你修过哪里,还帮你修回去
官方推出的新杀器充满了恶意,一能识别哪张照片修过了,二能看出修了哪里,三能还原最初的模样:
量子位
2019/06/20
1.3K0
一秒回到P图前:Adobe发布“反向PS”利器,知道你修过哪里,还帮你修回去
GPT生成情人节表白情话,AI撩骚情人卡很搞笑!
不管是永远孤寂的万年单身宅,还是等着另一半奉上例行年敬的有情人,抑或是憎恶商业化节日物化人性的愤怒野狼,都会预期在今天看到铺天盖地的量产单调情话。
新智元
2022/02/24
1.1K0
GPT生成情人节表白情话,AI撩骚情人卡很搞笑!
DeepSeek:你的AI界“瑞士军刀”,能写代码会聊天,还能帮你少掉头发!
        大家好,我是你们的AI体验官,今天要给大家安利一款“上能写代码,下能哄对象”的神器——DeepSeek!         这货最近火到什么程度?连楼下卖煎饼的大妈都在问:“听说有个AI能帮我算账?” 没错,它就像哆啦A梦的口袋,装满了各种黑科技,但比哆啦A梦更贴心的是——它不用吃铜锣烧,还免费!         接下来,请系好安全带,我要带你们开启一场“人类如何靠AI躺赢”的奇幻之旅!
用户11295429
2025/05/05
580
杜克大学提出 AI 算法,拯救渣画质马赛克秒变高清
场景描述:将「马赛克」像素级别的大头照转换成高清照片,是一种怎样的体验?杜克大学提出的 AI 算法,不仅可以「去掉马赛克」,还能精细到每一道皱纹、每一根头发。你要试试吗?
HyperAI超神经
2020/06/19
9770
AIGC下一站:期待、警惕充斥着AI剪辑师的世界
大数据文摘转载自学术头条 上月底,名为“chaindrop”的 Reddit 用户,在 r/StableDiffusion subreddit 上分享了一个由人工智能生成的视频,在业内引起了不小的争议。 视频中,一个由 AI 生成的丑陋畸形的 “威尔·史密斯”,以一种可怕的热情将一把意大利面条铲进嘴里。这一 “地狱般” 的视频迅速传播到其他形式的社交媒体,数字媒体和广播公司 Vice 表示该视频将 “伴随你的余生”,美国娱乐网刊 The A.V. Club 称其为 “AI 开发的自然终点”。仅在 Twit
大数据文摘
2023/04/21
4880
AIGC下一站:期待、警惕充斥着AI剪辑师的世界
傻瓜生图器炸场, 火柴人秒变福尔摩斯!Stability AI最新绘图神器让涂鸦秒变大片
输入prompt「Cityspace with full moon(满月下的街景)」,接下来,就是见证奇迹的时刻——
新智元
2023/08/07
3420
傻瓜生图器炸场, 火柴人秒变福尔摩斯!Stability AI最新绘图神器让涂鸦秒变大片
七夕情人节,看 ---大数据时代里的爱情!
从前,在西雅图的一家Pony Expresso咖啡店里,一个男人与一个女人开始了对这个绵长而又神秘的事物的体验,这个事物已得到了愈来愈多科学研究,而我们称其为爱情。最初的阶段被称为“盲目的热恋”。这是种让人兴奋纠结,眼神一刻亦不能离开的感觉,这个时候在你的渴望势力面前,仿佛世界停止了转动,时间俯首停顿。这个男性,当时44岁的华盛顿大学心理研究学家约翰·戈特曼(John Gottman),被这个女人异常浓密的黑色卷发和她的创造力所吸引:她是一个业余的音乐家和画家,且和他一样,她也是个心理学家。这个女性,当
小莹莹
2018/04/23
9520
七夕情人节,看 ---大数据时代里的爱情!
AI视频新霸主全网翻车,Ilya奥特曼老黄打起来了!动画出现诡异狗头网友笑疯
昨天诞生的AI视频新霸主——Luma AI的Dream Machine,再次在整个互联网掀起高潮。
新智元
2024/06/17
1880
AI视频新霸主全网翻车,Ilya奥特曼老黄打起来了!动画出现诡异狗头网友笑疯
AI「心灵之眼」被看透!大改神经网络,模型生成背后逻辑首现
国外有个小哥也对外星人的思想非常感兴趣,于是,他借助AI的力量,生成了一系列图片,尝试构建了一种「外星人的思维模式」。
新智元
2023/08/07
1970
AI「心灵之眼」被看透!大改神经网络,模型生成背后逻辑首现
一秒内从单个图像生成3D对象,支持实时编辑,Stability AI推出3D生成新方法SPAR3D
刚刚,Stability AI 在 CES 上宣布为 3D 生成推出一种两阶段新方法 ——SPAR3D(Stable Point Aware 3D),旨在为游戏开发者、产品设计师和环境构建者开拓 3D 原型设计新方式。
机器之心
2025/02/03
690
一秒内从单个图像生成3D对象,支持实时编辑,Stability AI推出3D生成新方法SPAR3D
ControlNet star量破万!2023年,AI绘画杀疯了?
机器之心报道 编辑:张倩 进入 2023 年,一个名为 ControlNet 的模型将 AI 绘画水平推向了新的高峰。 从骑马的宇航员到三次元小姐姐,在不到一年的时间里,AI 绘画似乎已经取得了革命性的进展。 这个「骑马的宇航员」由 OpenAI 2022 年 4 月推出的文生图模型 DALL・E 2 绘制。它的前辈 ——DALL・E 在 2021 年向人们展示了直接用文本生成图像的能力,打破了自然语言与视觉的次元壁。在此基础上,DALL・2 更进一步,允许人们对原始图像进行编辑,比如在画面中添加一只柯基
机器之心
2023/03/29
6980
ControlNet star量破万!2023年,AI绘画杀疯了?
媲美Gen-2,Meta多模态创AI生图新里程碑!破文生视频历史难题,静图秒变视频逼真到炸裂
Emu Video,是一种基于扩散模型的文本到视频生成方法,可以分解步骤生成高质量的视频。
新智元
2023/11/19
6530
媲美Gen-2,Meta多模态创AI生图新里程碑!破文生视频历史难题,静图秒变视频逼真到炸裂
苹果AI登场,与OpenAI合作,Siri将采用GPT-4o;全球AI独角兽达37家;OpenAI自研芯片进展曝光丨AI情报局
Harvey寻求20亿美元估值:法律AI初创公司Harvey一直在与投资者商谈融资6亿美元的事宜,公司估值至少20亿美元。Harvey称如果能筹集到这么多资金,就有可能收购法律研究服务公司vLex,以培训自己的产品。
AI科技评论
2024/06/17
1980
苹果AI登场,与OpenAI合作,Siri将采用GPT-4o;全球AI独角兽达37家;OpenAI自研芯片进展曝光丨AI情报局
微软副总裁洪小文:AI+HI是终极智能形态 | 北大AI公开课第11讲
【新智元导读】微软全球资深副总裁、亚太研发集团主席、微软亚洲研究院院长洪小文博士亲临北大 AI 公开课,就 AI 的感知与认知能力、AI (人工智能)与 HI (人类智能)的共进化等问题展开了深入讲解。洪老师指出,黑盒无法承担重大决策,AI+HI是终极智能形态,而且人类已经在朝着 AI+HI 共进化狂奔。 微软全球资深副总裁、微软亚太研发集团主席、微软亚洲研究院院长洪小文老师的到来让本周的北大 AI 公开课备受瞩目。在这堂接近两小时的公开课上,洪小文博士满是干货的演讲以及和北大人工智能创新中心主任、百度七剑
新智元
2018/03/28
1.4K0
微软副总裁洪小文:AI+HI是终极智能形态 | 北大AI公开课第11讲
传 4050 亿参数版 Llama3 将在 23 日发布;机械臂公司获 6300 万美元融资丨AI情报局
机械臂公司 Standard Bots 获 6300 万美元融资,亚马逊、三星等参投
AI科技评论
2024/07/16
1740
传 4050 亿参数版 Llama3 将在 23 日发布;机械臂公司获 6300 万美元融资丨AI情报局
如何捕获一只彩色卓别林?黑白照片AI上色教程很友好 | 哈佛大触
方栗子 编译自 GitHub 量子位 出品 | 公众号 QbitAI △ 老照片的手动着色魔法 妈妈小时候已经有彩色照片了,不过那些照片,还是照相馆的人类手动上色的。 几十年之后,人们已经开始培育深度
量子位
2018/07/20
9240
亚马逊AI主任科学家李沐:机器学习简介
本书作者跟广大程序员一样,在开始写作前需要来一杯咖啡。我们跳进车准备出发,Alex掏出他的安卓喊一声“OK Google”唤醒语言助手,Mu操着他的中式英语命令到“去蓝瓶咖啡店”。手机快速识别并显示出命令,同时判断我们需要导航,并调出地图应用,给出数条路线方案,每条方案均有预估的到达时间并自动选择最快的线路。好吧,这是一个虚构的例子,因为我们一般在办公室喝自己的手磨咖啡。但这个例子展示了在短短几秒钟里,我们跟数个机器学习模型进行了交互。 如果你从来没有使用过机器学习,你会想,“这不就是编程吗?”或者,“机
IT派
2018/03/28
1.7K0
亚马逊AI主任科学家李沐:机器学习简介
推荐阅读
情人节这天,idol居然对我「说情话」!?
6410
为躲亲戚催婚,一摄影师创造出了 AI 女友
4590
5个令人惊艳的AI项目,开源了。。
1.4K0
一秒回到P图前:Adobe发布“反向PS”利器,知道你修过哪里,还帮你修回去
1.3K0
GPT生成情人节表白情话,AI撩骚情人卡很搞笑!
1.1K0
DeepSeek:你的AI界“瑞士军刀”,能写代码会聊天,还能帮你少掉头发!
580
杜克大学提出 AI 算法,拯救渣画质马赛克秒变高清
9770
AIGC下一站:期待、警惕充斥着AI剪辑师的世界
4880
傻瓜生图器炸场, 火柴人秒变福尔摩斯!Stability AI最新绘图神器让涂鸦秒变大片
3420
七夕情人节,看 ---大数据时代里的爱情!
9520
AI视频新霸主全网翻车,Ilya奥特曼老黄打起来了!动画出现诡异狗头网友笑疯
1880
AI「心灵之眼」被看透!大改神经网络,模型生成背后逻辑首现
1970
一秒内从单个图像生成3D对象,支持实时编辑,Stability AI推出3D生成新方法SPAR3D
690
ControlNet star量破万!2023年,AI绘画杀疯了?
6980
媲美Gen-2,Meta多模态创AI生图新里程碑!破文生视频历史难题,静图秒变视频逼真到炸裂
6530
苹果AI登场,与OpenAI合作,Siri将采用GPT-4o;全球AI独角兽达37家;OpenAI自研芯片进展曝光丨AI情报局
1980
微软副总裁洪小文:AI+HI是终极智能形态 | 北大AI公开课第11讲
1.4K0
传 4050 亿参数版 Llama3 将在 23 日发布;机械臂公司获 6300 万美元融资丨AI情报局
1740
如何捕获一只彩色卓别林?黑白照片AI上色教程很友好 | 哈佛大触
9240
亚马逊AI主任科学家李沐:机器学习简介
1.7K0
相关推荐
情人节这天,idol居然对我「说情话」!?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档