前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >我用 Vue3+Ts+Vite2 写了一个美女小黄站

我用 Vue3+Ts+Vite2 写了一个美女小黄站

作者头像
公众号---人生代码
发布于 2021-04-22 03:24:32
发布于 2021-04-22 03:24:32
4.4K00
代码可运行
举报
文章被收录于专栏:人生代码人生代码
运行总次数:0
代码可运行

首先使用以下命令创建项目

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
yarn create @vitejs/app vue3-ts-vite2 --template vue-ts

vite.config.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import path from 'path'
// https://vitejs.dev/config/
export default defineConfig({
  plugins: [vue()],
  base: './', // 打包路径
  resolve: { // 解析
    alias: { // 重命名路劲
      '@': path.resolve(__dirname, './src')
    }
  },
  server: {
    port: 4000, // 服务端口
    open: true, // 是否自动打开浏览器
    host: 'localhost', // 主机名字
    proxy: { // 代理
      '/api': {
        target: '/api',
        changeOrigin: true,
        ws: false,
        rewrite: path => path.replace(/^\/api/, '')
      }
    },
    cors: true
  }
})

tsconfig.json

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "compilerOptions": {
    "target": "esnext",
    "module": "esnext",
    "moduleResolution": "node",
    "strict": true,
    "jsx": "preserve",
    "sourceMap": true,
    "resolveJsonModule": true,
    "esModuleInterop": true,
    "lib": ["esnext", "dom"],
    "types": ["vite/client"]
  },
  "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"]
}

postcss.config.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
module.exports = {
    "plugins": {
        "postcss-pxtorem": {
            rootValue: 37.5,
            // Vant 官方根字体大小是 37.5
            propList: ['*'],
            selectorBlackList: ['.norem']
            // 过滤掉.norem-开头的class,不进行rem转换
        }
    }
}

package.json

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "name": "vue3-vite2-ts",
  "version": "0.0.0",
  "scripts": {
    "dev": "vite",
    "build": "vue-tsc --noEmit && vite build",
    "serve": "vite preview"
  },
  "dependencies": {
    "@types/node": "^14.14.37",
    "axios": "^0.21.1",
    "jsonwebtoken": "^8.5.1",
    "mockjs": "^1.1.0",
    "vant": "^3.0.11",
    "vue": "^3.0.10",
    "vue-router": "4",
    "vuex": "^4.0.0"
  },
  "devDependencies": {
    "@vitejs/plugin-vue": "^1.1.5",
    "@vue/compiler-sfc": "^3.0.5",
    "postcss-pxtorem": "^6.0.0",
    "sass": "^1.32.8",
    "typescript": "^4.1.3",
    "vite": "^2.1.3",
    "vue-tsc": "^0.0.8"
  }
}

index.html

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8" />
  <link rel="icon"
        href="/favicon.ico" />
  <meta name="viewport"
        content="width=device-width, initial-scale=1.0, user-scalable=no" />
  <title>Vite App</title>
</head>

<body>
  <div id="app"></div>
  <script type="module" src="/src/main.ts"></script>
</body>

</html>

src/api/request.ts

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

const service = axios.create({ // 创建服务
    baseURL: '/api/',
    timeout: 5000
})

service.interceptors.request.use(config => { // 请求拦截处理
    const token = window.localStorage.getItem("accessToken")
    if (token) {
        config.headers.common.Authorization = token
    }
    return config
}, error => {
    return Promise.reject(error)
})

service.interceptors.response.use(response => { // 响应拦截处理
    const res = response.data
    if (response.status !== 200) {
        return Promise.reject(new Error(res.message || 'Error'))
    } else {
        return res
    }
}, error => {
    return Promise.reject(error)
})

export default service

src/api/index.ts

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import type { AxiosPromise } from 'axios'
import request from './request'

// 获取首页banner新闻数据
export const getBannerList = (): AxiosPromise => {
    return request({
        url: '/bannerList'
    })
}

//  获取首页newsList数据
export const getNewsList = (): AxiosPromise => {
    return request({
        url: '/newsList'
    })
}

//获取newsDetail数据
export const getNewsDetail = (id: any): AxiosPromise => {
    return request.post('/detailList', {
        id
    })
}

// 登录验证
export const toLogin = (data: Object): AxiosPromise => {
    return request.post('/login', data)
}

export default {
    getBannerList,
    getNewsList,
    getNewsDetail,
    toLogin
}

src/api/mock.ts

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import Mock from 'mockjs'
interface Data {
    id?: string | number,
    title?: string,
    images?: string | Array<string>,
    author?: string,
    token?: string
}

const bannerData: Array<Data> = [
    {
        "id": "1",
        "images": "./2021-02-27/1.jpg",
        "title": "翘屁美女"
    },
    {
        "id": "2",
        "images": "./2021-02-27/2.jpg",
        "title": "青春美女"
    },
    {
        "id": "3",
        "title": "翘屁美女",
        "images": "./2021-02-27/3.jpg",
    },
    {
        "id": "4",
        "title": "性感美女",
        "images": "./2021-02-27/4.jpg",
    },
    {
        "id": "5",
        "title": "哈哈美女",
        "images": "./2021-02-27/5.jpg",
    },
    {
        "id": "6",
        "title": "性感美女",
        "images": "./2021-02-27/6.jpg",
    },
    {
        "id": "7",
        "title": "爱笑美女",
        "images": "./2021-02-27/7.jpg",
    },
    {
        "id": "8",
        "title": "哈哈美女",
        "images": "./2021-02-27/8.jpg",
    },
    {
        "id": "9",
        "title": "爱笑美女",
        "images": "./2021-02-27/9.jpg",
    },
    {
        "id": "10",
        "title": "爱笑美女",
        "images": "./2021-02-27/10.jpg",
    },
    {
        "id": "11",
        "title": "爱笑美女",
        "images": "./2021-02-27/11.jpg",
    },
    {
        "id": "12",
        "title": "爱笑美女",
        "images": "./2021-02-27/12.jpg",
    },
    {
        "id": "13",
        "title": "爱笑美女",
        "images": "./2021-02-27/13.jpg",
    },
    {
        "id": "14",
        "title": "爱笑美女",
        "images": "./2021-02-27/14.jpg",
    },
    {
        "id": "15",
        "title": "爱笑美女",
        "images": "./2021-02-27/15.jpg",
    },
]

const newsData: Array<Data> = [
    {
        "id": "1",
        "images": ["../assets/logo.png"],
        "title": "金发碧眼为什么很少在白人以外的种族出现?",
        "author": "作者 / biokiwi"
    },
    {
        "id": "2",
        "title": "《哈利波特》原著中与电影中人物有哪些差别?",
        "author": "作者 / kalinnn",
        "images": ["../assets/logo.png"]
    },
    {
        "id": "3",
        "title": "有哪些适合情侣两个人一起玩的桌游?",
        "author": "作者 / 北邙",
        "images": ["../assets/logo.png"]
    }
]

const loginData: Data = {
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJhZG1pbiIsInVzZXJfaWQiOjEsImlhdCI6MTU5NDI2MjQ5NSwiZXhwIjoxNTk0MzQ4ODk1fQ.1MJ_MAFgpBjOjpggj69Xz8F_evBcMAenRK_7a8fdVrc"
}

Mock.mock('/api/bannerList', 'get', {
    "data": bannerData
})

Mock.mock('/api/newsList', 'get', {
    "data": newsData
})


Mock.mock('/api/login', 'post', {
    "data": loginData
})

src/api/token.ts

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import jwt from 'jsonwebtoken'
const jwtScrect: string = "accessToken"
const genToken = (username: string, password: string): string => {
    const token: string = jwt.sign({ username, password }, jwtScrect, { expiresIn: '24h' })

    return token
}

export default {
    genToken
}

src/components/Banner/index.vue

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
  <div class="swipe-content">
    <van-swipe class="my-swipe" :autoplay="3000" indicator-color="white" lazy-render>
      <van-swipe-item v-for="item in bannerData" :key="item.id">
        <img :src="item.images" class="img" :alt="item.title" @click="toDetail(item)" />
      </van-swipe-item>
    </van-swipe>
  </div>
</template>
<script>
import { useRouter } from "vue-router";
export default {
  name: "Banner",
  props: {
    bannerData: {
      type: Array
    }
  },
  setup(props) {
    const router = useRouter();
    const toDetail = item => {
      router.push({
        name: "Detail",
        params: {
          id: item.id,
          item: JSON.stringify(item)
        }
      });
    };

    return {
      toDetail
    };
  }
};
</script>
<style lang="scss" scoped>
.img {
  width: 100%;
  height: 100%;
}
.my-swipe {
  width: 100%;
}
.my-swipe .van-swipe-item {
  width: 100%;
  //   color: #fff;
  font-size: 1rem;
  //   line-height: 6rem;
  text-align: center;
  background-color: #fff;
}
</style>

src/router/index.ts

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { createRouter, createWebHashHistory, RouteRecordRaw } from 'vue-router'

const routes: Array<RouteRecordRaw> = [
    {
        path: '/',
        name: 'Home',
        meta: {
            title: "首页",
            keepAlive: true,
            requireAuth: true
        },
        component: () => import("../views/Home/index.vue")
    },
    {
        path: '/select',
        name: 'Select',
        meta: {
            title: "选项",
            keepAlive: true,
            requireAuth: true
        },
        component: () => import("../views/Select/index.vue")
    },
    {
        path: '/detail/:id/:item',
        name: 'Detail',
        meta: {
            title: "选项",
            keepAlive: true,
            requireAuth: true
        },
        component: () => import("../views/Detail/index.vue")
    },
    {
        path: '/login',
        name: 'Login',
        meta: {
            title: "登录",
            keepAlive: true
        },
        component: () => import("../views/Login/index.vue")
    }
]

const router = createRouter({
    history: createWebHashHistory(),
    routes
})

router.beforeEach((to, from, next) => {
    if (to.meta.requireAuth) {  // 判断该路由是否需要登录权限
        if (window.localStorage.getItem('accessToken')) {  // 通过vuex state获取当前的token是否存在
            next();
        }
        else {
            next({
                path: '/login',
                query: { redirect: to.fullPath }  // 将跳转的路由path作为参数,登录成功后跳转到该路由
            })
            window.localStorage.clear()
        }
    }
    else {
        next();
    }
})

export default router

src/store/index.ts

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { createStore } from 'vuex'
export default createStore({
    state: {
        listData: { 1: 10 },
        num: 10
    },
    mutations: {
        setData(state, value) {
            state.listData = value
        },
        addNum(state) {
            state.num = state.num + 10
        }
    },
    actions: {
        setData(context, value) {
            context.commit('setData', value)
        }
    },
    modules: {}
})

src/utils/rem.ts

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { stringifyQuery } from "vue-router"

const baseSize: number = 37.5

function setRem() {
    const scale: number = document.documentElement.clientWidth / 375
    document.documentElement.style.fontSize = baseSize * Math.min(scale, 2) + 'px'
}

setRem()

window.onresize = function () {
    setRem()
}

src/views/Detail/index.vue

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
  <div class="detail-wrap">
    <p class="title">{{item.title}}</p>
    <div class="img" v-for="(img, index) in item.imgs" :key="index">
      <img :src="img" class="img" />
    </div>
  </div>
</template>

<script lang="ts">
import { useRoute } from "vue-router";
import { reactive, toRefs, computed } from "vue";
export default {
  name: "Detail",
  setup(props) {
    interface Data {
      id?: string | Array<string>;
      item?: Object;
    }
    let data: Data = {
      id: "",
      item: Object
    };
    const state = reactive(data);

    const route = useRoute();
    const item = computed(() => route.params.item).value;
    state.id = computed(() => route.params.id).value;
    state.item = JSON.parse(item);

    return {
      ...toRefs(state)
    };
  }
};
</script>

<style lang="scss" scoped>
.detail-wrap {
  width: 100%;
  .title {
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    color: #cccc;
    font-size: 20px;
    margin-block-start: 0;
    margin-block-end: 0;
    background-color: #2c323c;
  }
  .img {
    width: 100%;
    height: 100%;
  }
}
</style>

src/views/Select/index.vue

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
  <div class="select-wrap">
    <van-radio-group
      v-model="state.checked"
      direction="horizontal"
      :icon-size="30"
      @change="change"
    >
      <van-radio name="1"></van-radio>
      <van-radio name="2"></van-radio>
    </van-radio-group>
  </div>
</template>

<script lang="ts" setup="props">
import { ref, getCurrentInstance } from "vue";
import { useRouter } from "vue-router";
const router = useRouter();
const state = ref({
  checked: ""
});
const { ctx } = getCurrentInstance();

const change = (e: string) => {
  const num = parseInt(e);
  switch (num) {
    case 1:
      console.log("男");
      ctx.$toast({
        type: "text",
        message: "暂无帅哥"
      });
      break;
    case 2:
      console.log("女");
      setTimeout(() => {
        router.push("/");
      }, 1000);
      break;
    default:
  }
};
</script>

<style lang="scss" scoped>
.select-wrap {
  width: 100%;
  height: 100%;
  background-color: #ebfff0;
  display: flex;
  justify-content: center;
  flex-direction: row;
  align-items: center;
  ::v-deep .van-radio__label {
    font-size: 30px;
  }
}
</style>

src/views/Home/index.vue

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
  <div class="home">
    <p class="text">美女图片预览</p>
    <banner :bannerData="state.bannerData"></banner>
    <van-loading color="#1989fa" v-if="state.loading" />
  </div>
</template>
<script lang="ts" setup="props">
import { reactive, onMounted, getCurrentInstance } from "vue";
import { useRouter } from "vue-router";
import { useStore } from "vuex";
import { getBannerList } from "../../api/index";

const router = useRouter();
const store = useStore();

// 获取上下文对象
const { ctx } = getCurrentInstance();

// 定义响应式数据
const state = reactive({
  color: "#ccc",
  bannerData: [],
  loading: false
});

const initFN = () => {
  ctx.$toast({
    type: "fail",
    message: "请求失败"
  });
  state.loading = false;
};

// DOM 加载完成后更新数据
onMounted(() => {
  state.loading = true;
  getBannerList()
    .then(
      (res: any) => {
        state.loading = false;
        state.bannerData = res.data;
        ctx.$toast({
          type: "success",
          message: "请求成功"
        });
        console.log(res);
      },
      error => {
        initFN();
      }
    )
    .catch(error => {
      initFN();
    });
});
</script>
<style lang="scss" scoped>
.home {
  height: 100%;
}
.text {
  color: v-bind("state.color");
  font-size: 20px;
  margin-block-start: 0;
  margin-block-end: 0;
  background-color: #2c323c;
}
.login {
  width: 100%;
  height: 100px;
  line-height: 100px;
  background-color: pink;
}
</style>

src/views/Login/index.vue

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
  <div class="login">
    <div class="passw-name-box">
      <div class="name">
        <i class="name-img"></i>
        <input v-model="state.userName" type="text" placeholder="请输入用户名" />
      </div>
      <div class="name">
        <i class="passw-img"></i>
        <input v-model="state.passWord" type="password" placeholder="请输入密码" />
      </div>
      <div>
        <van-button type="primary" @click="login">登录</van-button>
      </div>
    </div>
  </div>
</template>
<script lang="ts" setup="props">
import { reactive, getCurrentInstance } from "vue";
import { useRouter } from "vue-router";
import { toLogin } from "../../api/index";
const router = useRouter();

const { ctx } = getCurrentInstance();

const state = reactive({
  userName: "",
  passWord: ""
});

const initError = () => {
  ctx.$toast({
    type: "fail",
    message: "登录失败"
  });
  window.localStorage.clear();
  router.push("/login");
};

const login = async () => {
  if (!state.userName) {
    ctx.$toast({
      type: "text",
      message: "请输入用户名"
    });
    return;
  }

  if (!state.passWord) {
    ctx.$toast({
      type: "text",
      message: "请输入密码"
    });
    return;
  }
  toLogin({ userName: state.userName, passWord: state.passWord })
    .then(
      res => {
        ctx.$toast({
          type: "success",
          message: "登录成功"
        });

        // 设置 token
        window.localStorage.setItem("accessToken", res.data.token);
        console.log("res===>", res);
        router.push("/select");
      },
      error => {
        initError();
      }
    )
    .catch(error => {
      initError();
    });
};
</script>

<style lang="scss" scoped>
.login {
  display: flex;
  flex-direction: column;
  justify-content: center;
  height: 100%;
  background: url("./login/bgimg.jpg") no-repeat;
  background-size: 100% 100%;
  background-position: 100% 100%;
  .passw-name-box {
    display: flex;
    flex-direction: column;
    justify-content: center;
    .name {
      display: flex;
      justify-content: center;
      padding: 5px 10px;
      input {
        width: 250px;
        height: 32px;
        outline: none;
        border: none;
        font-size: 16px;
        margin-left: 10px;
      }
      .name-img {
        display: block;
        width: 32px;
        height: 32px;
        background: url("./login/sno.png") no-repeat;
        background-size: 100% 100%;
      }
      .passw-img {
        display: block;
        width: 32px;
        height: 32px;
        background: url("./login/pasw.png") no-repeat;
        background-size: 100% 100%;
      }
    }
  }
}
</style>

src/App.vue

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
  <div style="height: 100%;">
    <router-view></router-view>
  </div>
</template>

<script lang="ts">
import { defineComponent } from "vue";

export default defineComponent({
  name: "App"
});
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  /* width: 100%; */
  height: 100%;
}
html,
body {
  height: 100%;
  /* width: 100%; */
  overflow-x: hidden;
}
</style>

src/main.ts

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { createApp } from 'vue'
import App from './App.vue'
import router from './router/index'
import store from './store/index'
import 'vant/lib/index.css'
import vant from 'vant'

import { Toast } from 'vant'
import "./utils/rem"
import './api/mock'
import Banner from "./components/Banner/index.vue"
const app = createApp(App)
app.component('banner', Banner).use(router).use(store).use(vant).mount('#app')
app.config.globalProperties = {
    "$toast": Toast,
}

src/shims-vue.d.ts

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
declare module '*.vue' { // 定义 .vue 文件模块
  import { DefineComponent } from 'vue'
  const component: DefineComponent<{}, {}, any>
  export default component
}

declare module 'mockjs' // 定义 mockjs 模块
declare module 'jsonwebtoken' // 定义 jsonwebtoken 模块
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-04-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CryptoCode 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
大数据揭秘:学历真的改变能命运?
作者:LinkedIn;中外学术情报 央视新闻曾做过关于高考的调查,结果有七成网友支持高考取消数学,看到新闻后,有一位网友却一针见血地评论道:数学考试存在的意义就是把这七成网友筛选掉。的确,虽然买菜
钱塘数据
2018/03/06
9470
大数据揭秘:学历真的改变能命运?
机器人会让贫富差距更大,真的吗?
随之机器人和人工智能技术的发展,人类越来越担心机器人在未来会抢走人的工作,比尔·盖茨也提出了要向机器人征税以示公平。《卫报》近日撰写的评论文章指出,机器人不仅仅会抢走人类的工作,还会让贫富差距更大。
机器人网
2018/04/24
6420
机器人会让贫富差距更大,真的吗?
贫富差距变大,你还不做一只愤怒的鸵鸟?
法国经济学家Piketty在其新作《21世纪的资本》中,用巴尔扎克《高老头》中的拉斯蒂涅为例,描述19世纪欧美国家的不平等状况。19世纪是资本主义的黄金时代,也是一个贫富极度分化的时期。尽管各国的情况略有差异,但总体来看,19世纪贫富差距日益拉大,带来了严重的社会影响。收入分配是当时的一流经济学家关注的最重要问题之一。而Piketty在21世纪初重提收入不平等,引起了一场新的思想风暴。
用户1756920
2018/07/23
4500
贫富差距变大,你还不做一只愤怒的鸵鸟?
大数据揭秘:教育程度和绝对财富呈正比?结果吓一跳!
本文介绍了技术社区在文章编辑、评审和发布方面的实践。文章首先介绍了技术社区背景,然后描述了社区内文章编辑、评审和发布的流程。最后,总结了技术社区在文章编辑和发布方面的经验教训和优化建议。
企鹅号小编
2017/12/28
1K0
大数据揭秘:教育程度和绝对财富呈正比?结果吓一跳!
数字加速时代的技术工人困境
随着全球经济进入结构化调整的转型期,普惠式的红利已经逐步消退,需求和资源之间的紧张引发的内卷焦虑等社会问题加剧,产业工人应正确对待增长的社会成本和心理压力,提升自我修养。
安全乐观主义
2022/03/16
4510
数字加速时代的技术工人困境
数据说话:为什么中国这么富,我的工资却总不够花?
若不是拼多多的横空出世,人们可能依旧沉浸在眼前大都市的繁华之中,迷失在当下“消费升级”的热风深处,却全然不觉:全国还有80%的人月收入不超过3000元。
IT阅读排行榜
2018/08/17
1.8K0
未来人工智能将把人类分为3层,而你会在哪一层呢?
在科技越发达、人工智能越来越普遍的同时,人与人的差距越来越大,大到无法跨越,乃至被划分不同的维度,处于不同维度的人们,将熟视无睹地擦肩而过。 原来,我们总以为世界最公平的就是生老病死:无论一个人成就再多、财富再多,最终都敌不过自然规律,走向死亡。然而在人工智能时代,利用金钱和权力可以人的功能比如寿命、身体等等都能被修正…… 不得不承认,在金钱和权力面前,生命正在变的不平等; 当穷人还在幻想阶层逆袭的时候,富人都已经在研究长生不老了,这就是未来的差距,完全是不同维度的竞争。 未来的穷人,已经无法参与社会经
企鹅号小编
2018/01/22
5950
未来人工智能将把人类分为3层,而你会在哪一层呢?
AI算法中的围城,外卖骑手的"突围"
作者丨维克多 编辑丨岑峰 困在系统中的外卖骑手正在反击。 近日国外科技媒体Wired报道,平台公司利用算法迫使外卖骑手更快、更高效工作,导致了相关交通事故增多。 为了应对困境,他们正在采取行动:一方面建立沟通信息的渠道分享道路等情况,例如微信群;另一方面对一些明知道不可按时送达的业务,集体拒绝。 这篇报道的观点来自两位学者团队,HUANG HUI和Zizheng Yu。前者是伦敦国王学院的博士生,此前在上海做了6个月的零工;后者是卡迪夫大学的教学助理,相关研究发表在《Media International
AI科技评论
2022/03/16
3960
白宫提出迎接人工智能经济的三大策略
美国白宫发布报告《人工智能、自动化与经济》,分析了基于人工智能的自动化潮流对美国就业市场与经济的影响,并提出了三大应对策略。该报告认为,加速人工智能发展将使一些长期以来需要人力完成的任务实现自动化。这些转变将给个人、经济和社会带来新的机遇,但也可能影响当前数百万美国人的生计。长期来看,人工智能是否会导致失业、加剧不平等不仅依赖于技术本身,还取决于执行的制度和政策。该报告探讨了基于人工智能的自动化对经济的影响,并提出了一些发挥人工智能优势、降低成本的主要策略。 1 基于人工智能的自动化的经济学分析 技术进步是
人工智能快报
2018/03/07
1.1K0
钱真的可以“买”到幸福?新研究显示,最低工资每提高1美元,自杀率可减少6%
钱在多大程度上能解决人们在生活中遇到的问题呢?有人说金钱买不来健康,金钱买不来幸福,事实真是这样么?
大数据文摘
2020/02/12
3270
你是《未来世界的幸存者》么?
昨天在阮一峰的微信公众号中听到一个音频,大概的内容是他之前的一本书《未来世界的幸存者》在喜马拉雅出了音频,他为此录了一段话,听过后我对这本书产生了兴趣,于是就用2天时间读完了,在此谈谈感想。
灵魂画师牧码
2019/06/26
4070
你是《未来世界的幸存者》么?
TW洞见〡被信息塑造的新工人阶级
文章作者来自ThoughtWorks:熊节,图片来自网络。 当你看见十多个年轻小伙子围坐在一张长条型电脑桌上,各自神情专注地紧盯着自己面前的屏幕,一边快速地敲击着各自的键盘与鼠标,还不时互相呼喊,你会认为他们在干什么?玩游戏?没错。但又不止于此。他们可能受雇于一个“工头”,每天在后者提供的电脑上玩网络游戏超过十小时,将游戏中获得的装备和宝物交给工头变卖并从后者那里领到一份工资。尽管不为任何现实中的职业认证或劳动保障机构认可,这些被称为“游戏矿工”的职业游戏玩家确实是在劳动并撑起一个每年交易额超过十亿美金
ThoughtWorks
2018/04/16
6320
TW洞见〡被信息塑造的新工人阶级
数据揭秘:低学历成功逆袭概率有多少?感谢父母送我读书!
导读:本文来自于知乎问题“低学历是否比高学历更加会赚钱?”被赞最高的答案,答主就读于伦敦政治经济学院公共健康政策与健康经济学专业,利用国内外各类统计数据驳斥“读书无用论”。 “读书无用什么的,我们自谦的时候说说而已,你们别当真了。” “受教育程度高的人,就是更有钱,就是更健康,就是更道德。” “高考就算是考电子竞技,仍然还会是目前上名校的这些人上名校。” 写在最前面的话:毋庸置疑这篇文章触痛了某些人,毕竟很多人想要快乐地生活下去,靠的是创造与重复假象不断地麻痹自己,这也正是绝大多数人传播读书无用论的根本动机
Spark学习技巧
2018/06/22
8910
AI 新技术革命将如何重塑就业和全球化格局?深度解读 UN 报告(中篇)
相关推荐: AI 新技术革命将如何重塑就业和全球化格局?深度解读 UN 报告 (上篇) AI 新技术革命将如何重塑就业和全球化格局?深度解读 UN 报告 (下篇) [1511171028789_
腾讯研究院
2017/11/21
9840
AI 新技术革命将如何重塑就业和全球化格局?深度解读 UN 报告(中篇)
机器人抢工作只是个伪命题?
自从进入机器人时代,不管是蓝领工人还是白领,都担心自己的工作某一天被机器人抢走,最后只能像纽约客封面的图画一样,向机器人乞讨。然而,据外媒报道,有斯坦福大学的学者认为,工作一直都不短缺,机器人抢工作只是个伪命题而已!
机器人网
2018/05/22
8662
机器人抢工作只是个伪命题?
影响就业就该征税?这或许不仅是机器人的问题……
机器人不是人,因此不适用个人所得税。“这实际上是对资本课税,影响可想而知。”人工智能注定将掀起新一波造富狂澜,但更多的人忧心被抢去饭碗。“在工程应用领域,人工智能还是需要靠人为建模才能实现智能化,再让机器去批量操作。”在上海一家大型车企任职流体分析工程师的小林告诉第一财经记者,他的确有些担心人工智能(AI)会抢了他的饭碗,但同时企业也在不断引入新技术让工程师们学习提升。 从流水线上的机械手臂到电池管理,再到无人驾驶系统,全球40%的机器人用于汽车制造业,该行业一直是自动化水平最高的行业。 人工智能在
机器人网
2018/04/25
6980
影响就业就该征税?这或许不仅是机器人的问题……
码农们真实收入有多高
码农顾名思义为编码的农民,尤其是在工业化迅速发展的今天,各行各业对计算机应用的依赖不断增强,随之而来的社会需求大量的IT民工投入到基础的编码工作当中来,他们有着聪慧的大脑,对于编程,设计,开发,有着熟
程序你好
2018/07/20
5820
社科院蔡昉:机器换人不可阻挡,征税可支撑普惠性基本保障
在11月29日举行的《财经》年会2018:预测与战略上,中国社会科学院副院长蔡昉认为,用机器替代人是经济规律,不可阻挡。但我们要对机器人征税,用来支撑普惠性的基本保障。 蔡昉指出,最近几年我国对机器人的发展给予了高度重视,从2013年开始,中国工业机器人的使用率全世界最高,2010年-2015年期间全世界制造业机器人的密度增长了32%,这是一个很快的速度。在五年里,中国增长了230%,大大高于世界的平均水平。机器人密度本身,中国低于世界平均水平,但是后来居上。 关于机器换人,蔡昉认为,用机器替代人是经
机器人网
2018/04/25
5110
社科院蔡昉:机器换人不可阻挡,征税可支撑普惠性基本保障
一街之隔的美国富翁与贫民,这张地图都能告诉你
朱门酒肉臭,路有冻死骨。贫富的两极分化如今已成全球顽疾,连盛产“中产”的美国的状况也越趋严重。一家美国地理信息公司为此专门绘制了美国几个大城市的“贫富分布地图”,结果发现:原来,美国大城市里的不同区域,贫和富是如此惊人地“泾渭分明”。‍‍
DT数据侠
2018/08/08
1.1K0
一街之隔的美国富翁与贫民,这张地图都能告诉你
【美林300页报告摘要】人工智能+机器人=第四次工业革命?
数据分析家们说,未来20年间,全球经济将会在不平等现象恶化的风险下发生变革。 11月在上海举办的工博会上,陕西九立机器人制造公司的机器人。 根据一个最新研究的说法,在未来的20年中,随着机器渐渐接手从
新智元
2018/03/14
8150
【美林300页报告摘要】人工智能+机器人=第四次工业革命?
推荐阅读
相关推荐
大数据揭秘:学历真的改变能命运?
更多 >
LV.0
百度研发工程师
目录
  • vite.config.js
  • tsconfig.json
  • postcss.config.js
  • package.json
  • index.html
  • src/api/request.ts
  • src/api/index.ts
  • src/api/mock.ts
  • src/api/token.ts
  • src/components/Banner/index.vue
  • src/router/index.ts
  • src/store/index.ts
  • src/utils/rem.ts
  • src/views/Detail/index.vue
  • src/views/Select/index.vue
  • src/views/Home/index.vue
  • src/views/Login/index.vue
  • src/App.vue
  • src/main.ts
  • src/shims-vue.d.ts
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档