基础:

基于face_recognition与Django人脸识别服务案例-CSDN博客

需求:

基于人脸识别接口实现,人脸检测并基于人脸信息进行查询用户画像(后台服务可以使用模拟数据)

实现:

步骤一:配置跨域

pip install django-cors-headers

fb991982ee40421f9d466edb7f39e628.png

soft863ai/settings.py文件中30行左右添加

ALLOWED_HOSTS=['*']
CORS_ORIGIN_ALLOW_ALL = True

INSTALLED_APPS中最后一行添加如下内容:

'corsheaders',

dd5f836918ae4b3b8a7b18531b90c040.png

MIDDLEWARE中注释'django.middleware.csrf.CsrfViewMiddleware',添加如下内容:

'corsheaders.middleware.CorsMiddleware',

d133059d45844fde8aa607fbeb7050cc.png

settings.py全部内容如下

"""
Django settings for soft863ai project.

Generated by 'django-admin startproject' using Django 3.2.20.

For more information on this file, see
https://docs.djangoproject.com/en/3.2/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/3.2/ref/settings/
"""

from pathlib import Path

# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent

# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'django-insecure-1ccz-%j4iybj97nvy6%s0!5ap&y^fls83@xktoqn=6e$byozlk'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = ['*']
CORS_ORIGIN_ALLOW_ALL = True

# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'sourceai.apps.SourceaiConfig',
    'corsheaders',
]

MIDDLEWARE = [
    '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',
    'corsheaders.middleware.CorsMiddleware',
]

ROOT_URLCONF = 'soft863ai.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR / 'templates']
        ,
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'soft863ai.wsgi.application'

# Database
# https://docs.djangoproject.com/en/3.2/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

# Password validation
# https://docs.djangoproject.com/en/3.2/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]

# Internationalization
# https://docs.djangoproject.com/en/3.2/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.2/howto/static-files/
import os

STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'), ]
# Default primary key field type
# https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-field

DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

步骤二:编写控制层代码

创建sourceai/controller/portrait_view.py文件,内容如下:

from django.shortcuts import render
from django.http import HttpResponse

import json

def face_index(request):
    return render(request, 'face/login.html')


def get_userinfo(request):
    userid = request.POST.get('userid')
    dict_data = {}
    dict_data['fid'] = userid
    dict_data['fname'] = 'wangchaojie'
    dict_data['fage'] = 36
    dict_data['foccupation'] = '工程师'
    dict_data['feducation'] = '研究生'
    dict_data['fcard'] = '410728'
    dict_data['faddress'] = '郑州'
    dict_data['ftel'] = '15138679323'

    # return HttpResponse(json.dumps({"res": dict_data}))
    return HttpResponse(json.dumps(dict_data))


def getResume(request):
    datas = []
    dict_data = {}
    dict_data['fresume'] = '毕业于XXX中学'
    dict_data['ftime'] = '2010-07-01'
    datas.append(dict_data)

    dict_data['fresume'] = '毕业于XXX大学,后XXX公司从事XXX工作'
    dict_data['ftime'] = '2010-07-01'
    datas.append(dict_data)

    return HttpResponse(json.dumps(datas))


def getTravel(request):
    datas = []
    dict_data = {}
    dict_data['ftraveltype'] = '火车'
    dict_data['fvehicleinfo'] = 'G360'
    dict_data['ftime'] = '2023-6-20 15:45'
    datas.append(dict_data)

    dict_data = {}
    dict_data['ftraveltype'] = '汽车'
    dict_data['fvehicleinfo'] = '郑州-开封'
    dict_data['ftime'] = '2023-6-13 09:00'
    datas.append(dict_data)

    return HttpResponse(json.dumps(datas))


def selectMedical(request):
    dict_data = {}
    dict_data['healthy'] = '否'
    dict_data['xuexing'] = 'B'

    return HttpResponse(json.dumps(dict_data))


def diet_info(request):
    datas = []
    dict_data = {}
    dict_data['fmeal'] = '火锅'
    dict_data['fmoney'] = '400'
    datas.append(dict_data)
    dict_data = {}
    dict_data['fmeal'] = '米线'
    dict_data['fmoney'] = '10'
    datas.append(dict_data)

    dict_data = {}
    dict_data['fmeal'] = '麻辣烫'
    dict_data['fmoney'] = '25'
    datas.append(dict_data)

    return HttpResponse(json.dumps(datas))


def selectDiet(request):
    datas = []
    dict_data = {}
    dict_data['fcategory'] = '中餐'
    dict_data['fmoney'] = '400'
    datas.append(dict_data)
    dict_data = {}
    dict_data['fcategory'] = '西餐'
    dict_data['fmoney'] = '500'
    datas.append(dict_data)

    dict_data = {}
    dict_data['fcategory'] = '小吃'
    dict_data['fmoney'] = '300'
    datas.append(dict_data)

    return HttpResponse(json.dumps(datas))


def get_consume_info(request):
    dict_data = {}
    dict_data['月份'] = [7, 8, 9]
    dict_data['消费'] = [30, 60, 25]

    return HttpResponse(json.dumps(dict_data))


def get_consume_year(request):
    dict_data = {}
    dict_data['年份'] = [2019,2020,2021, 2022, 2023]
    dict_data['消费'] = [30, 45,46,60, 25]

    return HttpResponse(json.dumps(dict_data))

def earthdata(request):
    dict_data = {}

    return HttpResponse(json.dumps(dict_data))

步骤三:添加URL映射代码

在soft863ai/urls.py中添加如下内容:

from sourceai.controller import portrait_view
    path('face', portrait_view.face_index),
    path('getUser', portrait_view.get_userinfo),
    path('getResume', portrait_view.getResume),
    path('gettravel', portrait_view.getTravel),
    path('selectMedical', portrait_view.selectMedical),
    path('diet', portrait_view.diet_info),
    path('consumeinfo', portrait_view.get_consume_info),
    path('selectDiet', portrait_view.selectDiet),
    path('get_consume_year', portrait_view.get_consume_year),
    path('earthdata', portrait_view.earthdata),

全部内容如下:

"""soft863ai URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/3.2/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from sourceai import views
from sourceai.controller import imgc_view
from sourceai.controller import nlp_view
from sourceai.controller import chat_view
from sourceai.controller import draw_view
from sourceai.controller import ppt_view
from sourceai.controller import face_view
from sourceai.controller import portrait_view

urlpatterns = [
    path('admin/', admin.site.urls),
    path('first', views.first_index),
    path('firstvalue', views.first_value),
    path('urltotext', views.url_to_text),
    path('ocrurl', views.ocr_index_url),
    path('imgtotext', views.img_to_text),
    path('ocrindex', views.ocr_index),
    path('imgc', imgc_view.imgc_index),
    path('imgcto', imgc_view.img_to_text),
    path('poem', nlp_view.poem_index),
    path('poemto', nlp_view.poem_to_create),
    path('chat', chat_view.chat_index),
    path('chatto', chat_view.chat_to_create),
    path('sparkchat', chat_view.spark_index),
    path('sparkchatto', chat_view.spark_to_create),
    path('baichuan2chat', chat_view.baichuan2_index),
    path('baichuan2chatto', chat_view.baichuan2_to_create),
    path('sparkdrawindex', draw_view.sparkdraw_index),
    path('sparkdrawto', draw_view.sparkdraw_to_create),
    path('sparkppt', ppt_view.ppt_index),
    path('sparkpptto', ppt_view.ppt_to_create),
    path('faceregister', face_view.custom_facec_regiter),
    path('facedbsearch', face_view.custom_facec_search),
    path('facelist', face_view.custom_facec_list),
    path('faceget', face_view.custom_facec_get),
    path('face', portrait_view.face_index),
    path('getUser', portrait_view.get_userinfo),
    path('getResume', portrait_view.getResume),
    path('gettravel', portrait_view.getTravel),
    path('selectMedical', portrait_view.selectMedical),
    path('diet', portrait_view.diet_info),
    path('consumeinfo', portrait_view.get_consume_info),
    path('selectDiet', portrait_view.selectDiet),
    path('get_consume_year', portrait_view.get_consume_year),
    path('earthdata', portrait_view.earthdata),

]

步骤四:覆盖静态资源文件

参考资源文件

步骤五:编写人脸识别登录代码

<!doctype html>
<html>

<head>
    <meta charset=utf-8>
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
    <link rel="icon" href="/static/img/touxiang.png">
    <!-- 网页图标 -->
    <link rel="stylesheet" type="text/css" href="/static/css/face.css" />
    <link rel="stylesheet" href="/static/css/demo.css">
    <link rel="stylesheet" href="/static/css/login.css">
    <!-- <link rel="stylesheet" href="css/bootstrap.min.css"> -->
    <script src="/static/js/jquery.min.js"></script>
    <!-- <script src="js/bootstrap.min.js"></script> -->
    <script src="/static/js/rem.js" type="text/javascript" charset="utf-8"></script>
</head>

<body style="cursor: url(img/body2.png);">
    <div class="canvas" style="opacity: .2">
        <iframe frameborder="0" src="/static/js/index.html" style="width: 100%; height: 100%"></iframe>
    </div>
    <div id="app">
        <div class="header_title">智能人脸识别系统 <input id="fileUpload" accept="image/*" type="file"></div>
        <div class="header_time"></div>
        <div class="face-capture" id="face-capture">
            <div class="faceCon">
                <div class="videoFaceCon">
                    <div class="imgCoverCon" @mouseenter="stopAnimaFun" @mouseleave="startAnimaFun">
                        <div class="retiveCon">
                            <img src="/static/img/1233.png" class="retiveConImg allRoteAnmi">
                            <img src="/static/img/121.png" class="videoFace">
                        </div>
                    </div>
                    <div class="demo-frame">
                        <div class="demo-container">
                            <video id="video" width="320" height="240" preload autoplay loop muted></video>
                        </div>
                    </div>
                </div>
                <div class="control-container face-capture">
                    <div class="title"></div>
                    <canvas id="canvas" width="320" height="240"></canvas>
                </div>
                <div class="rect" v-for="item in profile"
                    :style="{ width: item.width + 'px', height: item.height + 'px', left: item.left + 'px', top: item.top + 'px'}">
                </div>
            </div>
        </div>

        <div class="videoImgPhoto">
            <img src="/static/img/1233.png" class="imgVideoBg" />
            <div class="videoImgCon">
                <img class="videoConImg" src="/static/img/121.png" />
            </div>
        </div>
        <script type="text/javascript" src="/static/js/tracking-min.js"></script>
        <script type="text/javascript" src="/static/js/face-min.js"></script>
        <script type="text/javascript">
            window.onload = function () {
                var timer = '';
                var clickOn = true;
                var tipFlag = false; // 提示用户已经检测到
                var flag = false; // 判断是否已经拍照
                var removePhotoID = null; // 停止转换图片
                var video = document.getElementById('video');
                var canvas = document.getElementById('canvas');
                var context = canvas.getContext('2d');
                var tracker = new tracking.ObjectTracker('face');
                var width = window.screen.width;
                var height = window.screen.height;
                // 时间
                timer && clearInterval(_this.timer);
                timer = setInterval(function () {
                    var show_day = ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期日'];
                    var nowtime = new Date();
                    var year = nowtime.getFullYear();
                    var month = nowtime.getMonth() + 1;
                    var date = nowtime.getDate();
                    var day = nowtime.getDay();
                    var hour = nowtime.getHours();
                    var minutes = nowtime.getMinutes();
                    var second = nowtime.getSeconds();
                    month < 10 ? month = '0' + month : month;
                    hour < 10 ? hour = '0' + hour : hour;
                    minutes < 10 ? minutes = '0' + minutes : minutes;
                    second < 10 ? second = '0' + second : second;
                    var show_day_s = day === 0 ? show_day[6] : show_day[day - 1];
                    var mytimer = year + "年" + month + "月" + date + "日" + show_day_s + ' ' +
                        hour + ':' + minutes;
                    $('.header_time').html(mytimer)
                }, 1000);
                //时间
                $('.title').html('点击头像进行识别..')

                function tackPhoto() {
                    context.drawImage(video, 0, 0, canvas.width, canvas.height)
                    // 保存为base64格式
                    $('.videoConImg').attr('src', saveAsPNG(canvas));
                    a = saveAsPNG(canvas).substring(22);

                    $.ajax({
                        url: 'http://localhost:8000/facedbsearch',
                        // url: 'http://49.232.173.197:8000/user/facerecognition',
                        // url: 'http://localhost:8000/user/facerecognition',
                        type: 'POST',
						async: true,
                        data: {
							imgFile: a,
                            // imgUrl  : a,
                        },
                        dataType: "JSON",
                        success: function (res) {
                            // sessionStorage.setItem('user', JSON.stringify(res.data)) //将用户信息放入session
                            // if (res.res.cardid.length > 6) {
                            //     location.href = 'main.html?id=' + res.res.cardid.substr(12);
                            // } else {
                            //     location.href = 'main.html?id=' + res.res.cardid
                            // }
                            if (res.cardid == "") {
                                $("#info").html("人脸识别失败!");
                            }
                            else {
                                {#alert('识别成功,即将跳转...');#}
                                setTimeout(function () {
                                    {#window.location.href = "index.html";#}
                                    window.location.href = "static/index.html";
                                    console.log(res.res.cardid);
                                    window.localStorage.setItem('id', res.res.cardid);
                                }, 2000)
                            }
                            succefun();
                            // //跳转页面原地方
                            // console.log(res);
                        },
                        error: function (res) {
                            alert('接口调用失败')
                        }
                    })
                    close();
                }

                function getVideo() {
                    $('.demo-frame').show();
                    clickOn = false;
                    tracker.setInitialScale(4);
                    tracker.setStepSize(2);
                    tracker.setEdgesDensity(0.1);
                    $('.title').html('系统已开启识别')
                    tracking.track('#video', tracker, {
                        camera: true
                    });
                    tracker.on('track', handleTracked);
                }
                //追踪事件
                // 追踪事件
                function handleTracked(e) {
                    $('.videoFace').hide();
                    context.clearRect(0, 0, canvas.width, canvas.height);
                    if (e.data.length == 0) {
                        $('.title').html('未检测到人脸 请动一动')
                    } else {
                        if (!tipFlag) {
                            $('.title').html('检测成功,正在拍照,请保持不动2秒')
                        }
                        // 1秒后拍照,仅拍一次
                        if (!flag) {
                            flag = true
                            removePhotoID = setTimeout(() => {
                                tackPhoto();
                                tipFlag = true
                            }, 1000)
                        }
                        e.data.forEach(function (rect) {
                            context.strokeStyle = '#ffa126';
                            context.strokeRect(rect.x, rect.y, rect.width, rect.height);
                            context.font = '5px Helvetica';
                            context.fillStyle = "#fff";
                        });
                    }

                };
                // 保存为png,base64格式图片
                function saveAsPNG(c) {
                    return c.toDataURL('image/png', 0.3)
                };
                // 拍照
                var a;
                function close() {
                    // 关闭并清理资源
                    flag = false
                    tipFlag = false
                    this.showFailPop = false
                    $('.face-capture').hide();
                    $('.videoImgPhoto').show();
                    tracker && tracker.removeListener('track', this.handleTracked)
                    tracker = null
                    context = null
                    profile = []
                    clearTimeout(this.removePhotoID)
                }
                // //顶部上传图片
                // $("body").on("change", "#fileUpload", function () {
                //     var reads = new FileReader();
                //     var f = $(this).get(0).files[0];
                //     var rep = /jpeg|png|gif|bmp/ig;
                //     var gstyle = f.type.split("/")[1];
                //     if (rep.test(gstyle)) {
                //         reads.readAsDataURL(f);
                //         var that = this;
                //         reads.onload = function (e) {
                //             succefun();
                //             $('.videoConImg').attr('src', this.result);
                //         };
                //     } else {
                //         layer.msg("图片格式不正确,请上传 jpeg|png|gif|bmp 格式的图片")
                //     }
                // });
                //识别成功逻辑
                function succefun() {
                    $('.face-capture').hide();
                    $('.videoImgPhoto').show();
                    $('.side_right').addClass('rightAnimations');
                    $('.side_left').addClass('leftAnimations');

                }
                //点击获取摄像头
                $('.imgCoverCon').click(() => {
                    if (clickOn == true) {
                        $('.title').html('系统正在识别..')
                        getVideo();
                    }
                })
            }
        </script>
</body>

</html>

创建templates/face/login.html文件,内容如下:

步骤六:编写主窗口代码

创建static/index.html文件,内容如下:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>用户信息</title>
    <link rel="stylesheet" href="/static/css/base.css">
    <link rel="stylesheet" href="/static/css/info.css">
    <script src="/static/js/jquery.min.js"></script>
    <script src="/static/js/rem.js"></script>
    <script src="/static/js/bootstrap.js"></script>
    <script src="/static/js/echarts.js"></script>
    <script src="/static/js/echarts-gl.min.js"></script>
    <script src="/static/js/echarts-wordcloud.js"></script>
    <!-- <script src="js/index.js"></script> -->
</head>

<body>
<div id="start">
    <div class="start_out">
        <div class="start_in"></div>
    </div>
</div>

<div class="top">
    <span id="title">天眼人脸识别系统</span>
    <span><a href="main.html">&lt返回</a></span>
    <span>2022年06月14日星期二 15:57</span>
</div>
<div class="left">
    <div class="left_top">
        <div class="left_top_1">
            <div class="user" >

                <img id="userpic" src="" style="width: 1.2rem;height: 1.2rem"></img>
            </div>
            <div id="health"></div>
        </div>
        <div class="left_top_2">
            <ul id="user_info">
                <li>ID:5</li>
                <li>姓名:陈弘毅</li>
                <li>性别:男</li>
                <li>电话:15036027961</li>
                <li>职业:架构师</li>
                <li>学历:本科</li>
                <li>出生年月日:1998-10</li>
                <li>籍贯:河南省郑州市</li>
            </ul>
        </div>
    </div>
    <div class="left_bt">
        <div class="left_bt_1">个人简历</div>
        <div class="left_bt_2">
            <div id="box">
                <ul id="list"></ul>
            </div>
        </div>
        <div class="left_bt_3"></div>
    </div>
</div>
<div id="earth"></div>
<img src="/static/img/leftfgg.png" alt="" class="bg_img_left">
<img src="/static/img/leftfg.png" alt="" class="bg_img_right">
<div class="right">
    <div class="right_top">
        <div class="right_top_title">月消费金额</div>
        <div id="right_top_main"></div>
    </div>
    <div class="right_bt">
        <div class="right_bt_title">年度收入与支出</div>
        <div id="right_bt_main"></div>
    </div>
</div>
<ul class="left_bottom">
    <li><a href="#"><img src="/static/img/icon11.png" alt="">人际</a></li>
    <li><a href="#"><img src="/static/img/icon12.png" alt="">工作</a></li>
    <li><a href="#"><img src="/static/img/icon13.png" alt="">资产</a></li>
    <li><a href="#"><img src="/static/img/icon14.png" alt="">教育</a></li>
    <li><a href="#"><img src="/static/img/icon15.png" alt="">娱乐</a></li>
    <li><a href="#"><img src="/static/img/icon16.png" alt="">医疗</a></li>
</ul>
<div class="center_bottom">
    <div class="center_bottom_left">
        <span>医疗信息</span>
        <div class="s_body"></div>
        <div class="yes">
            <p id="yes">是</p>
            <p>健康</p>
        </div>
        <div class="no">
            <p id="xueXin">A</p>
            <p>血型</p>
        </div>
    </div>
    <div class="center_bottom_right">
        <div id="box_go">
            <ul id="list_go"></ul>
        </div>
    </div>
</div>
<div class="right_bottom">
    <div class="canYin">餐饮信息</div>
    <div id="ciYun"></div>
    <div id="zhiZhu"></div>
</div>
</body>
<script>
    //获取id
    var user_id = window.localStorage.getItem('id');
    // 获取当前时间
    postTime();
    setInterval(function () {
        postTime();
    }, 1000);

    function postTime() {
        var time = getTime();
        $(".top span").eq(2).html(time);
    }

    function getTime() {
        var date = new Date();
        var arr_week = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
        var year = date.getFullYear();
        var month = date.getMonth();
        var day = date.getDate();
        var week = date.getDay();
        var hour = date.getHours();
        var minute = date.getMinutes();
        var second = date.getSeconds();
        var time = year + '年' + this.addZero(month) + '月' + this.addZero(day) + '日 ' + arr_week[week]
            + this.addZero(hour) + ":" + this.addZero(minute) + ":" + this.addZero(second);
        return time;
    }

    function addZero(s) {
        return s < 10 ? ('0' + s) : s;
    }

     $.ajax({
        url: 'http://localhost:8000/faceget',
        type: 'GET',
        data: {
            cardid: user_id,
        },
        dataType: 'JSON',
        success: function (data) {
              $('#userpic').attr("src", data.res.path)
           // var userpic = document.getElementById("userpic");
            //userpic.innerHTML = data.res.path;
        }
    })

    $.ajax({
        url: 'http://localhost:8000/selectDiet',
        type: 'POST',
        data: {
            userid: user_id,
        },
        dataType: 'JSON',
        success: function (res) {
            var chartDom_z = document.getElementById('zhiZhu');
            var myChart_z = echarts.init(chartDom_z);
            var option_z;
            option_z = {
                tooltip: {
                    trigger: 'axis'
                },
                radar: {
                    indicator: [],
                    radius: 80
                },
                series: [
                    {
                        color: ['#c37327'],
                        name: '餐饮信息',
                        type: 'radar',
                        tooltip: {
                            trigger: 'item'
                        },
                        colorBy: 'data',
                        data: [
                            {
                                value: [],
                            }
                        ]
                    }
                ]
            };

            var max = 0;
            res.forEach(function (e, i) {
                option_z.series[0].data[0].value[i] = e.fmoney
            })
            option_z.series[0].data[0].value.forEach(function (e) {
                if (e > max) {
                    max = e;
                }
            })
            res.forEach(function (e, i) {
                var obj = new Object
                obj.name = e.fcategory;
                obj.max = max;
                option_z.radar.indicator.push(obj);
            })
            // console.log(option_z.radar.indicator);
            option_z && myChart_z.setOption(option_z);
        }
    })

    //月度消费金额
    $.ajax({
        url: 'http://localhost:8000/consumeinfo',
        type: 'POST',
        data: {
            userid: user_id,
        },
        dataType: 'JSON',
        success: function (res) {
            // console.log(res.消费);
            var chartDom = document.getElementById('right_top_main');
            var myChart = echarts.init(chartDom);
            var option;

            option = {
                tooltip: {
                    trigger: 'axis',
                    axisPointer: {
                        type: 'shadow'
                    }
                },
                grid: {
                    left: '3%',
                    right: '4%',
                    bottom: '3%',
                    containLabel: true
                },
                xAxis: [
                    {
                        type: 'category',
                        data: res.月份,
                        axisTick: {
                            alignWithLabel: true
                        }
                    }
                ],
                yAxis: [
                    {
                        type: 'value'
                    }
                ],
                series: [
                    {
                        name: 'Direct',
                        type: 'bar',
                        barWidth: '60%',
                        data: res.消费, //[10, 52, 200, 334, 390, 330, 220]
                    }
                ],
            };

            option && myChart.setOption(option);


        }
    })

    //年度收入与支出
    $.ajax({
        url: 'http://localhost:8000/get_consume_year',
        type: 'POST',
        data: {
            userid: user_id,
        },
        dataType: 'JSON',
        success: function (res) {
            // console.log(res);
            var chartDom_n = document.getElementById('right_bt_main');
            var myChart_n = echarts.init(chartDom_n);
            var option_n;

            option_n = {
                color: ['#80FFA5', '#00DDFF', '#37A2FF', '#FF0087', '#FFBF00'],
                tooltip: {
                    trigger: 'axis',
                    axisPointer: {
                        type: 'cross',
                        label: {
                            backgroundColor: '#6a7985'
                        }
                    }
                },
                legend: {
                    data: ['Line 1', 'Line 2', 'Line 3', 'Line 4', 'Line 5']
                },
                toolbox: {
                    feature: {
                        saveAsImage: {}
                    }
                },
                grid: {
                    left: '3%',
                    right: '4%',
                    bottom: '3%',
                    containLabel: true
                },
                xAxis: [
                    {
                        type: 'category',
                        boundaryGap: false,
                        data: res.年份
                    }
                ],
                yAxis: [
                    {
                        type: 'value'
                    }
                ],
                series: [
                    {
                        name: '',
                        type: 'line',
                        stack: 'Total',
                        smooth: true,
                        lineStyle: {
                            width: 0
                        },
                        showSymbol: false,
                        areaStyle: {
                            opacity: 0.8,
                            color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
                                {
                                    offset: 0,
                                    color: 'rgb(128, 255, 165)'
                                },
                                {
                                    offset: 1,
                                    color: 'rgb(1, 191, 236)'
                                }
                            ])
                        },
                        emphasis: {
                            focus: 'series'
                        },
                        data: []
                    },
                    {
                        name: '',
                        type: 'line',
                        stack: 'Total',
                        smooth: true,
                        lineStyle: {
                            width: 0
                        },
                        showSymbol: false,
                        areaStyle: {
                            opacity: 0.8,
                            color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
                                {
                                    offset: 0,
                                    color: 'rgb(0, 221, 255)'
                                },
                                {
                                    offset: 1,
                                    color: 'rgb(77, 119, 255)'
                                }
                            ])
                        },
                        emphasis: {
                            focus: 'series'
                        },
                        data: []
                    },
                    {
                        name: '',
                        type: 'line',
                        stack: 'Total',
                        smooth: true,
                        lineStyle: {
                            width: 0
                        },
                        showSymbol: false,
                        areaStyle: {
                            opacity: 0.8,
                            color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
                                {
                                    offset: 0,
                                    color: 'rgb(55, 162, 255)'
                                },
                                {
                                    offset: 1,
                                    color: 'rgb(116, 21, 219)'
                                }
                            ])
                        },
                        emphasis: {
                            focus: 'series'
                        },
                        data: []
                    },
                    {
                        name: '',
                        type: 'line',
                        stack: 'Total',
                        smooth: true,
                        lineStyle: {
                            width: 0
                        },
                        showSymbol: false,
                        areaStyle: {
                            opacity: 0.8,
                            color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
                                {
                                    offset: 0,
                                    color: 'rgb(255, 0, 135)'
                                },
                                {
                                    offset: 1,
                                    color: 'rgb(135, 0, 157)'
                                }
                            ])
                        },
                        emphasis: {
                            focus: 'series'
                        },
                        data: []
                    },
                    {
                        name: '',
                        type: 'line',
                        stack: 'Total',
                        smooth: true,
                        lineStyle: {
                            width: 0
                        },
                        showSymbol: false,
                        label: {
                            show: true,
                            position: 'top'
                        },
                        areaStyle: {
                            opacity: 0.8,
                            color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
                                {
                                    offset: 0,
                                    color: 'rgb(255, 191, 0)'
                                },
                                {
                                    offset: 1,
                                    color: 'rgb(224, 62, 76)'
                                }
                            ])
                        },
                        emphasis: {
                            focus: 'series'
                        },
                        data: []
                    }
                ]
            };

            // console.log(option_n);
            option_n.xAxis[0].data = res.年份;
            var key = [], keyValue = [];
            for (var k in res) {
                if (k != '年份') {
                    key[key.length] = k;
                    keyValue[keyValue.length] = res[k]
                }

            }
            // console.log(keyValue);
            option_n.series.forEach(function (e, i) {
                option_n.series[i].name = key[i];
                option_n.series[i].data = keyValue[i]
            })
            // console.log(option_n.series);
            option_n && myChart_n.setOption(option_n);
            // $("#start").hide()
        }
    })
    // 中间地球部分

    $.ajax({
        url: 'http://localhost:8000/earthdata',
        type: 'POST',
        data: {
            userid: user_id,
        },
        dataType: 'JSON',
        success: function (res) {
            // console.log(res);
            var ROOT_PATH =
                'https://fastly.jsdelivr.net/gh/apache/echarts-website@asf-site/examples';

            var chartDom_e = document.getElementById('earth');
            var myChart_e = echarts.init(chartDom_e);
            var option_e;

            $.getJSON(ROOT_PATH + '/data-gl/asset/data/flights.json', function (data) {
                function getAirportCoord(idx) {
                    return [data.airports[idx][3], data.airports[idx][4]];
                }

                /*function getAirportCoord(idx) {
                    return [res[idx].flat, res[idx].flong];
                }*/
                var routes = data.routes.map(function (airline) {
                    return [getAirportCoord(airline[1]), getAirportCoord(airline[2])];
                });
                /*var routes = [];
                res.map(function (airline, i) {
                    // console.log(airline);
                    var j = i;
                    if (i < res.length - 1) {
                        j = i + 1;
                    }
                    routes[routes.length] = [getAirportCoord(i), getAirportCoord(j)]
                });*/
                // var routes = [[[-75.440806, 40.652083], [180.943139, 35.214]], [[-175.440806, 60.652083], [80.943139, -35.214]]]
                // console.log(routes);
                myChart_e.setOption({
                    backgroundColor: '',
                    globe: {
                        baseTexture: 'img/map01.jpg',
                        heightTexture: 'img/map02.jpg',
                        shading: 'lambert',
                        light: {
                            ambient: {
                                intensity: 0.8
                            },
                            main: {
                                intensity: 0.4
                            }
                        },
                        viewControl: {
                            autoRotate: true
                        },
                        globeRadius: 60
                    },
                    series: {
                        type: 'lines3D',
                        coordinateSystem: 'globe',
                        blendMode: 'lighter',
                        lineStyle: {
                            width: 1,
                            color: 'rgb(50, 50, 150)',
                            opacity: 0.2
                        },
                        data: routes
                    }
                });
            });
            option_e && myChart_e.setOption(option_e);
        }
    })


    //监听地球缩放滚轮事件(有BUG)
    var count = 0;
    $("#earth").on('mousewheel DOMMouseScroll', function (e) {
        if (e.originalEvent.zrDelta == 1 && count != 18) {
            count += e.originalEvent.zrDelta;
        } else if (e.originalEvent.zrDelta == -1 && count != -18) {
            count += e.originalEvent.zrDelta;
        }
        if (count >= 3) {
            $("#title").css("opacity", "0.3")
        } else {
            $("#title").css("opacity", "1")
        }
        // console.log(count);
        // console.log(myChart_e._model.option);
    })

    // 健康模块
    var chartDom_h = document.getElementById('health');
    var myChart_h = echarts.init(chartDom_h);
    var option_h;

    option_h = {
        tooltip: {
            trigger: 'item'
        },
        legend: {
            top: '5%',
            left: 'center'
        },
        series: [
            {
                name: 'Access From',
                type: 'pie',
                radius: ['40%', '70%'],
                avoidLabelOverlap: false,
                label: {
                    show: false,
                    position: 'center'
                },
                emphasis: {
                    label: {
                        show: true,
                        fontSize: '40',
                        fontWeight: 'bold'
                    }
                },
                labelLine: {
                    show: false
                },
                data: [{value: 735}, {value: 0}, {value: 0}, {value: 300}]
            }
        ]
    };

    option_h && myChart_h.setOption(option_h);

    //滚动窗口
    function scroll_view(a, b) {
        var box = document.getElementById(a);
        var list = document.getElementById(b)
        var content = list.innerHTML;
        list.innerHTML += content;
        var time = 30;
        var timer = setInterval(up, time);

        function up() {
            //滚上去的内容大于ul内容高度的一半,重置高度 0
            if (box.scrollTop >= list.offsetHeight / 2) {
                box.scrollTop = 0
            } else {
                box.scrollTop++;
            }
        }

        //鼠标移入暂停--清除定时器
        box.onmouseover = function () {
            clearInterval(timer)
        }
        ///鼠标移出继续--启动定时器
        box.onmouseout = function () {
            timer = setInterval(up, time);
        }
    }

    scroll_view('box', 'list');
    scroll_view('box_go', 'list_go');
    //词云图
    var ciYun_url = 'http://localhost:8000/diet';
    $.ajax({
        url: ciYun_url,
        type: 'POST',
        data: {
            userid: user_id,
        },
        dataType: 'JSON',
        success: function (res) {
            var ciYunTu = document.getElementById('ciYun');
            var arr_ciYun = {
                "list": [],
                "gridSize": 18, // 以像素为单位
                "weightFactor": 0.9, // 每个单词的大小
                "fontWeight": 'normal', // 'normal', 'bold' or a callback
                "fontFamily": 'Times, serif', // font to use
                "color": 'random-light', // 'random-dark' or 'random-light'
                "backgroundColor": '', // the color of canvas
                "rotateRatio": 1 // 单词旋转的概率。1表示始终旋转
            }
            res.forEach(function (e) {
                var arr = [e.fmeal, e.fmoney]
                arr_ciYun.list.push(arr)
            })
            // console.log(arr_ciYun);
            arr_ciYun.list = arr_ciYun.list.concat(arr_ciYun.list);//嫌数据少double一下
            var options = eval(arr_ciYun);
            WordCloud(ciYunTu, options);
        }
    })

    //医疗信息
    $.ajax({
        url: 'http://localhost:8000/selectMedical',
        type: 'POST',
        data: {
            userid: user_id,
        },
        dataType: 'JSON',
        success: function (res) {
            var y = document.getElementById("yes");
            var x = document.getElementById("xueXin");
            y.innerHTML = res.healthy;
            x.innerHTML = res.xuexing;
        }
    })

    //出行记录
    $.ajax({
        url: 'http://localhost:8000/gettravel',
        type: 'POST',
        data: {
            userid: user_id,
        },
        dataType: 'JSON',
        success: function (res) {
            // console.log(res);
            var ul = document.getElementById("list_go");
            res.forEach(function (e, i) {
                if (e.ftraveltype == '火车') {
                    $(ul).append("<li><span id='logo'><img src='img/huoche.png'></span><span id='tag'>" + e.fvehicleinfo + "</span><spanid='tag_time'>" + e.ftime.substr(0, 19) + "</spanid=></li>")
                } else {
                    $(ul).append("<li><span id='logo'><img src='img/feiji.png'></span><span id='tag'>" + e.fvehicleinfo + "</span><spanid='tag_time'>" + e.ftime.substr(0, 19) + "</spanid=></li>")
                }
            })
            ul.innerHTML += ul.innerHTML
        }
    })

    //个人履历
    var detail_url = 'http://localhost:8000/getResume';
    $.ajax({
        url: detail_url,
        type: 'POST',
        data: {
            userid: user_id,
        },
        dataType: 'JSON',
        success: function (res) {
            var ul = document.getElementById("list");
            res.forEach(function (e, i) {
                $(ul).append("<li><p class='school'>" + e.fresume + "</p><p class='date'>" + e.ftime.substr(0, 19) + "</p></li>")
            })
            ul.innerHTML += ul.innerHTML

        }
    })

    //用户信息
    var url_id = 'http://localhost:8000/getUser';
    $.ajax({
        url: url_id,
        type: 'POST',
        dataType: 'JSON',
        data: {
            userid: user_id,
        },
        success: function (res) {
            // console.log(res);
            var li = document.getElementById("user_info").children;
            $(li)[0].innerHTML = "ID:" + res.fid;
            $(li)[1].innerHTML = "姓名:" + res.fname;
            $(li)[2].innerHTML = "年龄:" + res.fage;
            $(li)[3].innerHTML = "职业:" + res.foccupation;
            $(li)[4].innerHTML = "学历:" + res.feducation;
            // $(li)[5].innerHTML = "身份证号:" + res.fcard;
            $(li)[5].innerHTML = "住址:" + res.faddress;
            $(li)[6].innerHTML = "电话:" + res.ftel;
        }
    })

    //加载页面完成事件
    window.onload = function () {
        $("#start").hide()
    }

    //图表自适应大小
    //参数container为图表盒子节点.charts为图表节点
    function chartsSize(container, charts) {
        function getStyle(el, name) {
            if (window.getComputedStyle) {
                return window.getComputedStyle(el, null);
            } else {
                return el.currentStyle;
            }
        }

        var wi = getStyle(container, 'width').width;
        var hi = getStyle(container, 'height').height;
        charts.style.width = wi
        charts.style.height = hi
    }

    var chartDom_n = document.getElementById('right_bt_main');
    var myChart_n = echarts.init(chartDom_n);
    window.onresize = function () {
        // chartsSize(chartDom_n, myChart_n)
    }
</script>

</html>

步骤七:运行工程

4cd88fd4caef419abe5ff5094884781d.png

步骤八:登录测试

将自己的人脸图片放置到static/facedb文件夹下,注:使用系统前需要人脸库有自己的图片,否则无法识别成功

1365f28027834f5aac43c9ee3207cc4b.png

步骤九:浏览器打开127.0.0.1:8000/face人脸识别界面,进行调试

a4724a2f3a774ca1a6a688053df02f40.png

9ca87c9ed8c14f42befb41f2e75f9ce5.png

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐