第三方网站实现钉钉(DingTalk)扫码登陆(Vue+SpringBoot)

30 篇文章 2 订阅
订阅专栏
20 篇文章 2 订阅
订阅专栏

第三方网站实现钉钉(DingTalk)扫码登陆(Vue+SpringBoot)

一,本地库添加钉钉UserId字段

	字段类型VarChar,管理者的userid为String,其余为Long

二,钉钉开放平台配置回调域名。

在这里插入图片描述

三,前端构造扫码登录页面。

(1)配置需要参数

	appid: '钉钉APiID',
     redirectUrl: '回调地址,当前登陆页面地址',
     apiUrl: '请求后端地址',
     //二维码设置参数
     dingCodeConfig: {
       id: 'login_container',
       style: 'border:none;background-color:#FFFFFF;',
       width: '365',
       height: '400'
     }

(3)构建请求钉钉服务器URL

getRedirectUrl() {
      return encodeURIComponent(this.redirectUrl)
    },
    getAuthUrl() {
      return `https://oapi.dingtalk.com/connect/oauth2/sns_authorize?appid=${this.appid}&response_type=code&scope=snsapi_login&state=STATE&redirect_uri=${this.getRedirectUrl}`
    },
    getGoto() {
      return encodeURIComponent(this.getAuthUrl)
    },
    getDingCodeConfig() {
      return { ...this.dingCodeConfig, goto: this.getGoto }
    }

(4)初始化函数,请求函数

initDingJs() {
      !function(window, document) {

        function d(a) {
          var e, c = document.createElement('iframe'),
            d = 'https://login.dingtalk.com/login/qrcode.htm?goto=' + a.goto
          d += a.style ? '&style=' + encodeURIComponent(a.style) : '',
            d += a.href ? '&href=' + a.href : '',
            c.src = d,
            c.frameBorder = '0',
            c.allowTransparency = 'true',
            c.scrolling = 'no',
            c.width = a.width ? a.width + 'px' : '365px',
            c.height = a.height ? a.height + 'px' : '400px',
            e = document.getElementById(a.id),
            e.innerHTML = '',
            e.appendChild(c)
        }

        window.DDLogin = d

      }(window, document)
    },
    addDingListener() {

      let self = this

      let handleLoginTmpCode = function(loginTmpCode) {
        window.location.href = self.getAuthUrl + `&loginTmpCode=${loginTmpCode}`
      }

      let handleMessage = function(event) {
        if (event.origin == 'https://login.dingtalk.com') {
          handleLoginTmpCode(event.data)
        }
      }

      if (typeof window.addEventListener != 'undefined') {
        window.addEventListener('message', handleMessage, false)
      } else if (typeof window.attachEvent != 'undefined') {
        window.attachEvent('onmessage', handleMessage)
      }

    },
    initDingLogin() {
      window.DDLogin(this.getDingCodeConfig)
    }

四,钉钉回调至登陆页面,前端获取临时授权码。

let getQueryString = function(name) {
    var reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i')
    var r = window.location.search.substr(1).match(reg)
    if (r != null) {
      return unescape(r[2])
    }
    return null
  }

五,前端携带临时授权码向后端请求。

let code = getQueryString('code')
   if (code !== null) {
     axios
       .get(`${this.apiUrl}?code=${code}`).then(response => {

       setToken(response.data.token)
       this.$router.push({ path: this.redirect || '/' }).catch(() => {
       })
       commit('SET_TOKEN', response.data.token)
     })
       .catch(error => {
         console.log(error)
       })
   }

六, 后端接受请求

@GetMapping("/dingTalkLogin")
    public AjaxResult dingTalkLogin(@RequestParam("code") String code) {
        AjaxResult ajax=null;
        // 生成令牌
        String token = loginService.dingTalkLogin(code);
        if (token != null) {
            ajax = AjaxResult.success();
            ajax.put(Constants.TOKEN, token);
        }else{
            ajax = AjaxResult.error("登陆失败,请联系管理员或账号登陆");
        }
        return ajax;
    }

七,后端使用临时授权码请求钉钉服务器,获取钉钉UserId

	/**
     * 钉钉登录
     * @return 结果
     */
    public String dingTalkLogin(String code) {
        OapiSnsGetuserinfoBycodeResponse bycodeResponse = null;
        // 获取access_token,注意正式代码要有异常流处理
        String access_token = Access_tokenUtil.getDingTalkAccess_token();
        try {
            // 通过临时授权码获取授权用户的个人信息
            DefaultDingTalkClient client2 = new DefaultDingTalkClient("https://oapi.dingtalk.com/sns/getuserinfo_bycode");
            OapiSnsGetuserinfoBycodeRequest reqBycodeRequest = new OapiSnsGetuserinfoBycodeRequest();
            // 通过扫描二维码,跳转指定的redirect_uri后,向url中追加的code临时授权码
            reqBycodeRequest.setTmpAuthCode(code);
            bycodeResponse = client2.execute(reqBycodeRequest, DingTalkConstant.DINGTALK_APPKEY, DingTalkConstant.DINGTALK_APPSECRST);
            // 根据unionid获取userid
            String unionid = bycodeResponse.getUserInfo().getUnionid();
            DingTalkClient clientDingTalkClient = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/user/getbyunionid");
            OapiUserGetbyunionidRequest reqGetbyunionidRequest = new OapiUserGetbyunionidRequest();
            reqGetbyunionidRequest.setUnionid(unionid);
            OapiUserGetbyunionidResponse oapiUserGetbyunionidResponse = clientDingTalkClient.execute(reqGetbyunionidRequest, access_token);
            String userid = oapiUserGetbyunionidResponse.getResult().getUserid();

        } catch (ApiException e) {
            e.printStackTrace();
            return null;
        }
    }

八,后端根据钉钉UserId获取库中用户信息

	/**
     * 钉钉登录
     * @return 结果
     */
    public String dingTalkLogin(String code) {
            // 根据userId获取用户信息
            String userid = oapiUserGetbyunionidResponse.getResult().getUserid();
            //更加userID查询用户
            SysUser user=sysUserMapper.selectUserByDingTalkUserId(userid);
            AsyncManager.me().execute(AsyncFactory.recordLogininfor(user.getUserName(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
            //生成loginUser
            LoginUser loginUser =(LoginUser) userDetailsService.createLoginUser(user);
            recordLoginInfo(loginUser.getUserId());
            // 生成token
            return tokenService.createToken(loginUser);
        } catch (ApiException e) {
            e.printStackTrace();
            return null;
        }
    }

九,后端跳过Spring Security验证,直接构建LoginUser

跳过UsernamePasswordAuthenticationToken,用户名密码验证

	/**
   * 钉钉登录
   * @return 结果
   */
  public String dingTalkLogin(String code) {
          // 根据userId获取用户信息
          String userid = oapiUserGetbyunionidResponse.getResult().getUserid();
          //生成loginUser
          LoginUser loginUser =(LoginUser) userDetailsService.createLoginUser(user);
          recordLoginInfo(loginUser.getUserId());
          // 生成token
          return tokenService.createToken(loginUser);
      } catch (ApiException e) {
          e.printStackTrace();
          return null;
      }
  }

附1,前端完整源码

<template>
  <div id="app">
    <div id="login_container"></div>
  </div>
</template>

<script>
import axios from 'axios'
import { setToken } from '@/utils/auth'

export default {
  components: {},
  data() {
    return {
      redirect: undefined,
      appid: 'ding8lrom1le5zopavwt',
      redirectUrl: 'http://localhost:9527/login?redirect=%2Findex',
      apiUrl: 'http://localhost:8080/dingTalk/user/dingTalkLogin',
      dingCodeConfig: {
        id: 'login_container',
        style: 'border:none;background-color:#FFFFFF;',
        width: '365',
        height: '400'
      }
    }
  },
  watch: {
    $route: {
      handler: function(route) {
        this.redirect = route.query && route.query.redirect
      },
      immediate: true
    }
  },
  computed: {
    getRedirectUrl() {
      return encodeURIComponent(this.redirectUrl)
    },
    getAuthUrl() {
      return `https://oapi.dingtalk.com/connect/oauth2/sns_authorize?appid=${this.appid}&response_type=code&scope=snsapi_login&state=STATE&redirect_uri=${this.getRedirectUrl}`
    },
    getGoto() {
      return encodeURIComponent(this.getAuthUrl)
    },
    getDingCodeConfig() {
      return { ...this.dingCodeConfig, goto: this.getGoto }
    }
  },
  created() {
    this.initDingJs()
  },
  mounted() {
    this.addDingListener()
    this.initDingLogin()
    this.getUser()
  },
  methods: {
    initDingJs() {
      !function(window, document) {

        function d(a) {
          var e, c = document.createElement('iframe'),
            d = 'https://login.dingtalk.com/login/qrcode.htm?goto=' + a.goto
          d += a.style ? '&style=' + encodeURIComponent(a.style) : '',
            d += a.href ? '&href=' + a.href : '',
            c.src = d,
            c.frameBorder = '0',
            c.allowTransparency = 'true',
            c.scrolling = 'no',
            c.width = a.width ? a.width + 'px' : '365px',
            c.height = a.height ? a.height + 'px' : '400px',
            e = document.getElementById(a.id),
            e.innerHTML = '',
            e.appendChild(c)
        }

        window.DDLogin = d

      }(window, document)
    },
    addDingListener() {

      let self = this

      let handleLoginTmpCode = function(loginTmpCode) {
        window.location.href = self.getAuthUrl + `&loginTmpCode=${loginTmpCode}`
      }

      let handleMessage = function(event) {
        if (event.origin == 'https://login.dingtalk.com') {
          handleLoginTmpCode(event.data)
        }
      }

      if (typeof window.addEventListener != 'undefined') {
        window.addEventListener('message', handleMessage, false)
      } else if (typeof window.attachEvent != 'undefined') {
        window.attachEvent('onmessage', handleMessage)
      }

    },
    initDingLogin() {
      window.DDLogin(this.getDingCodeConfig)
    },
    getUser() {
      let getQueryString = function(name) {
        var reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i')
        var r = window.location.search.substr(1).match(reg)
        if (r != null) {
          return unescape(r[2])
        }
        return null
      }
      let code = getQueryString('code')
      if (code !== null) {
        axios
          .get(`${this.apiUrl}?code=${code}`).then(response => {

          setToken(response.data.token)
          this.$router.push({ path: this.redirect || '/' }).catch(() => {
          })
          commit('SET_TOKEN', response.data.token)
        })
          .catch(error => {
            console.log(error)
          })

      }

    }

  }
}
</script>


附2,后端完整源码s

(1)Controller

	 /**
     * 钉钉扫码登录方法
     *
     * @param code 扫码返回code
     * @return 结果
     */
    @GetMapping("/dingTalkLogin")
    public AjaxResult dingTalkLogin(@RequestParam("code") String code) {
        AjaxResult ajax=null;
        // 生成令牌
        String token = loginService.dingTalkLogin(code);
        if (token != null) {
            ajax = AjaxResult.success();
            ajax.put(Constants.TOKEN, token);
        }else{
            ajax = AjaxResult.error("登陆失败,请联系管理员或账号登陆");
        }
        return ajax;
    }

(2)Service

	/**
     * 钉钉登录
     * @return 结果
     */
    public String dingTalkLogin(String code) {
        OapiSnsGetuserinfoBycodeResponse bycodeResponse = null;
        // 获取access_token,注意正式代码要有异常流处理
        String access_token = Access_tokenUtil.getDingTalkAccess_token();
        try {
            // 通过临时授权码获取授权用户的个人信息
            DefaultDingTalkClient client2 = new DefaultDingTalkClient("https://oapi.dingtalk.com/sns/getuserinfo_bycode");
            OapiSnsGetuserinfoBycodeRequest reqBycodeRequest = new OapiSnsGetuserinfoBycodeRequest();
            // 通过扫描二维码,跳转指定的redirect_uri后,向url中追加的code临时授权码
            reqBycodeRequest.setTmpAuthCode(code);
            bycodeResponse = client2.execute(reqBycodeRequest, DingTalkConstant.DINGTALK_APPKEY, DingTalkConstant.DINGTALK_APPSECRST);
            // 根据unionid获取userid
            String unionid = bycodeResponse.getUserInfo().getUnionid();
            DingTalkClient clientDingTalkClient = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/user/getbyunionid");
            OapiUserGetbyunionidRequest reqGetbyunionidRequest = new OapiUserGetbyunionidRequest();
            reqGetbyunionidRequest.setUnionid(unionid);
            OapiUserGetbyunionidResponse oapiUserGetbyunionidResponse = clientDingTalkClient.execute(reqGetbyunionidRequest, access_token);

            // 根据userId获取用户信息
            String userid = oapiUserGetbyunionidResponse.getResult().getUserid();
            //更加userID查询用户
            SysUser user=sysUserMapper.selectUserByDingTalkUserId(userid);
            AsyncManager.me().execute(AsyncFactory.recordLogininfor(user.getUserName(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
            //生成loginUser
            LoginUser loginUser =(LoginUser) userDetailsService.createLoginUser(user);
            recordLoginInfo(loginUser.getUserId());
            // 生成token
            return tokenService.createToken(loginUser);
        } catch (ApiException e) {
            e.printStackTrace();
            return null;
        }
    }

在这里插入图片描述

dingtalk-sdk-java
11-12
钉钉官方提供了统一的SDK,使用SDK可以便捷的调用服务端各API。注意:此SDK包含原有TOP接口,原有TOP接口可以继续正常调用,没有影响。下面是使用SDK调用API的请求示例: JAVA: DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/user/get"); OapiUserGetRequest req = new OapiUserGetRequest(); req.setUserid("userid1"); req.setHttpMethod("GET"); OapiUserGetResponse rsp = client.execute(req, accessToken);
vue 微信扫码登录(自定义样式)
10-15
主要介绍了vue 微信扫码登录(自定义样式),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
探索 Dingtalk Pierced Client: 开源钉钉穿透客户端
最新发布
gitblog_00053的博客
03-28 446
探索 Dingtalk Pierced Client: 开源钉钉穿透客户端 项目地址:https://gitcode.com/open-dingtalk/dingtalk-pierced-client 在这个数字化的时代,企业沟通与协作工具扮演着至关重要的角色,而钉钉作为国内广受欢迎的企业级应用,更是其中的佼佼者。今天,我们将深入探讨一个名为"Dingtalk Pierced Clien...
vue+springboot+redis+kaptcha实现登录验证码
04-10
vue+springboot+redis+kaptcha实现登录页验证码
vue实现扫码功能
10-15
主要为大家详细介绍了vue实现扫码功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
vue+springboot网页商城项目
06-12
5个github上的vue+springboot商城项目,内涵不同的操作页面,风格各一。下载前提是懂vuespringboot哦,不然环境都搭不好就很尴尬啦~
钉钉消息发送 sdk方式
记录学习生活的点滴(Linux运维、java)
01-23 5023
钉钉官方提供了统一的SDK,使用SDK可以便捷地调用服务端API。注意:此SDK包含原有TOP接口,原有TOP接口可以继续正常调用,没有影响。 SDK请求示例 下面是使用SDK调用API的请求示例: Java: DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/user/get"); OapiUserGetRequest req = new OapiUserGetRequest(); req.se
钉钉常用工具类DingTalkUtil
qq_30475355的博客
12-07 5130
留存DingTalkUtil,有需要的朋友请自行配置应用参数 public class DingTalkUtil { private static String appId = ""; private static String appSecret = ""; //微应用的配置 public static String agentId = ""; private static String appKey = ""; private static Strin
Java对接钉钉开发第三方H5微应用详细教程
qq_37496470的博客
03-17 9716
文章转载自:https://www.cnblogs.com/applerosa/p/11509512.html(by lnexin@aliyun.com 世间草木) 完整代码地址(出自原作者) 开发前准备: 关于服务器,有公网服务器最好,没有的话需要内网穿透工具; 调试的时候,由于钉钉的H5微应用调试只能“真机”调试,极其恶心,所以极其建议调试的时候使用内网穿透工具; 关于域名什么...
钉钉通知客户端Java
fireshark
06-01 283
【代码】钉钉通知客户端Java。
调用钉钉接口消息推送
樱花的博客
07-29 1万+
首先登陆钉钉开发者后台 https://ding-doc.dingtalk.com/ 选择H5微应用,创建应用 创建好之后,查看所建好的应用信息(其中AgentId,AppKey,AppSecret很重要,调用时需要用到) 设定白名单访问地址,当前网络的公网IP 效果如下 源码---->首先下载官方的开发Dome https://developers.dingtalk...
钉钉第三方WEB网站扫码登录
05-01
NULL 博文链接:https://1197581932.iteye.com/blog/2412135
Vue+SpringBoot+SpreadJS 实现的在线文档功能.docx
07-12
Vue+SpringBoot+SpreadJS 实现的在线文档功能.docxVue+SpringBoot+SpreadJS 实现的在线文档功能.docxVue+SpringBoot+SpreadJS 实现的在线文档功能.docxVue+SpringBoot+SpreadJS 实现的在线文档功能.docxVue+...
基于vue+springboot+mybatis+邮箱注册验证+docker实现员工工资系统
06-19
该系统包括管理员界面和普通员工界面,相应实现不同的功能 前端界面由vue实现
简单的图书管理系统,vue+springboot实现,增删改查.zip
04-13
简单的图书管理系统,vue+springboot实现,增删改查.zip
钉钉扫码登录网站(两种方式实现)
rizon886的博客
05-16 6024
钉钉扫码登录网站(两种方式实现) 效果: 源代码地址:https://github.com/jellydong/DingQrCodeLogin 动手敲代码! 第一步,钉钉后台配置 参考链接:获取appId及appSecret. 点击进入钉钉开发者平台 的页面,点击左侧菜单的【移动接入应用-登录】,然后点击右上角的【创建扫码登录应用授权】,创建用于免登过程中验证身份的appId及appSecret,创建后即可看到appId和appSecret。 这里因为我是本地开发,所以回调地址直接...
Vue —— 钉钉扫码登录第三方网站
月来better
09-03 1920
钉钉开放平台文档地址:https://developers.dingtalk.com/document/app/scan-qr-code-to-login-isvapp
钉钉通知-调用钉钉发送企业内部消息开发
热门推荐
qq_41419769的博客
01-26 4万+
明确需求:系统需要发送通知消息到用户,接收消息用户为同一企业内的人员,选用短信可能涉及到费用问题,故可以选用钉钉或者企业微信。 调用钉钉发送企业内部消息: 第一步:需要单位授权为子管理员,以便进行应用的创建
钉钉机器人SDK 封装预警消息发送工具
niaonao
07-07 7307
钉钉聊天群内支持的群机器人, 类似QQ 群机器人, 可以发天气, 讲笑话那样; 钉钉群机器人支持自定义机器人, 允许开发者管理机器人发送群消息; 可做系统监控预警消息通知
vue+springboot+bootstrap旅游网站
12-04
VueSpring BootBootstrap是构建一个旅游网站所需的三个主要技术工具。 Vue是一种用于构建用户界面的JavaScript框架。它的特点是易学易用,具有响应式设计,使得网页可以实现动态渲染。在旅游网站中,我们可以使用Vue来构建各种组件,例如导航栏、轮播图、搜索框等。它的丰富的生态系统和灵活性使得我们能够轻松地开发出动态交互的前端页面。 Spring Boot是一种用于构建Java应用程序的开发框架。它简化了Java应用程序的配置和部署,同时提供了丰富的功能和库。在旅游网站中,我们可以使用Spring Boot来处理业务逻辑、处理用户请求、与数据库进行交互等。它的高度可扩展性和强大的功能使得我们能够快速构建出稳定和可靠的后端服务。 Bootstrap是一种开发响应式网页的前端框架。它提供了各种样式、组件和布局,帮助我们快速构建出美观且具有一致性的网页。在旅游网站中,我们可以使用Bootstrap来实现网站的整体布局、响应式设计和美化。它的简单易用和兼容性使得我们能够轻松地开发出适用于不同设备和屏幕尺寸的网页。 综上所述,使用VueSpring BootBootstrap可以帮助我们构建一个功能完善、美观和用户友好的旅游网站Vue用于构建动态渲染的前端页面,Spring Boot用于处理后端业务逻辑和数据交互,Bootstrap用于实现响应式设计和网页美化。通过结合这三个技术工具,我们能够快速开发出一个高效和卓越的旅游网站

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 第三方网站实现钉钉(DingTalk)扫码登陆(Vue+SpringBoot) 19991
  • RuoYi(若依开源框架)-前后端分离版-前端流程简单分析 11710
  • C++_输入一个字符串,并逆序输出 9295
  • Vue使用Echarts实现数据可视化 8510
  • 钉钉api调用 6947

分类专栏

  • RabbitMq 2篇
  • C++ 10篇
  • VB.NET_简易小区物业管理系统开发 16篇
  • 前端(Vue/React) 20篇
  • 后端(SSM/SpringBoot) 30篇
  • Default 58篇

最新评论

  • C++_输入一个字符串,并逆序输出

    际卓彧: 根本就不逆序

  • 第三方网站实现钉钉(DingTalk)扫码登陆(Vue+SpringBoot)

    CaoPengCheng&: 钉钉回掉的是那

  • 第三方网站实现钉钉(DingTalk)扫码登陆(Vue+SpringBoot)

    怪高冷: 同问,钉钉登录成功后跳到了登录页,再点击一下才跳到首页

  • 第三方网站实现钉钉(DingTalk)扫码登陆(Vue+SpringBoot)

    weixin_51549049: 您好,钉钉登录后为啥会跳转到登录页面,而不是首页

  • C++_对n个数据进行从小到大的排序

    CaoPengCheng&: 构造器

最新文章

  • RabbitMq-Java-实现对象传输
  • RabbitMq-Java-实现传输
  • RabbitMq-简介及安装
2023年3篇
2022年7篇
2021年95篇
2019年1篇

目录

目录

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CaoPengCheng&

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

PHP网站源码昌吉网站排名优化哪家好汕尾百姓网标王多少钱丽江网站优化按天收费价格潍坊seo网站优化公司太原营销网站公司黄冈企业网站建设多少钱民治至尊标王多少钱徐州网站优化推广多少钱钦州阿里店铺运营多少钱汕头网站优化按天扣费推荐山南模板推广多少钱宜昌百度竞价推荐赤峰外贸网站制作价格阳泉网站排名优化价格陇南网站制作设计价格三明模板网站建设推荐德宏网站优化按天收费推荐定西网站改版推荐宜春优化多少钱娄底网站推广方案报价霍邱网站搭建推荐唐山SEO按效果付费价格宿州优秀网站设计多少钱吉祥网站seo优化铁岭营销网站价格呼和浩特营销网站多少钱长沙阿里店铺托管来宾阿里店铺运营哪家好汕尾营销型网站建设价格渭南阿里店铺运营推荐歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

PHP网站源码 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化