当前位置: 首页 > news >正文

基于Java-SpringBoot+vue实现的前后端分离信息管理系统设计和实现

基于Java-SpringBoot+vue实现的前后端分离信息管理系统设计和实现

博主介绍:多年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域
作者主页 央顺技术团队
Java毕设项目精品实战案例《1000套》
欢迎点赞 收藏 ⭐留言
文末获取源码联系方式

文章目录

  • 基于Java-SpringBoot+vue实现的前后端分离信息管理系统设计和实现
  • 前言:
  • 主要功能说明
  • 功能截图:
  • 主要代码实现:
  • 获取源码:

前言:

当今社会,随着科学技术的发展,以及市场经济的多元化,使人才的流动速度大大增加,因此也对党建工作的管理层面工作带来了空前且复杂的挑战, 从而使得如何高效的开展管理党建工作成为了亟待解决的问题。为此将高速发展的信息科学技术引入到党建工作管理的应用中,力求合理有效的提升全面各项工作的进展,实现以人为本的科学发展思想和意识,是一种高效可实现的方法。 Java作为一种面向对象的、可以撰写跨平台应用软件的程序设计语言,其技术具有卓越的通用性、高效性、平台移植性以及安全性,如今已广泛应用于 PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网等方面,大大方便了人们的生活、工作和娱乐。 而基于Java技术的党建工作管理平台,结合了Java技术,从而可起到规范党群业务流程,提高党群工作管理效率,对于党群工作定期提醒,以及完 成情况后的及时反馈,有效地提升党群工作管理的标准化程度的作用;进而实现党群工作的网上信息交流和交互办公,图片资料保存与共享等功能。

主要功能说明

用户登录、修改密码、首页介绍、数据可视化树状图展示、用户管理、菜单管理、权限控制、角色管理、部门管理、角色管理、组织架构管理、系统sql监控、日志管理、通知公告管理、要闻管理、组织风采管理、资料管理、查看、上传富文本等、和查看下载附件信息。组织发展管理、考试管理以及退出等

功能截图:

登陆:根据用户角色权限进行登录、用户角色灵活控制。
在这里插入图片描述
系统主页:
在这里插入图片描述
用户管理:用户的模糊查询、添加、选择部门、角色和职位等信息、以及修改和删除等
在这里插入图片描述
职位管理:职位的模糊查询、添加、权限控制以及修改和删除等
在这里插入图片描述
菜单管理:菜单通过角色权限灵活控制、具体到按钮级别
在这里插入图片描述
SQL监控:
在这里插入图片描述
切面日志管理:
在这里插入图片描述
组织架构: 组织架构的模糊查询、添加、权限控制以及修改和删除等
在这里插入图片描述
通知公告模块:通知公告的模糊查询、添加、权限控制以及修改和删除等。和富文本笔记内容
在这里插入图片描述
在这里插入图片描述
新闻模块:
在这里插入图片描述
在这里插入图片描述
组织风采模块:
在这里插入图片描述
在这里插入图片描述
资料管理模块:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
组织发展模块:
在这里插入图片描述
在线考试模块:
在这里插入图片描述
修改密码模块
在这里插入图片描述

主要代码实现:

用户登录验证

/*** 登录相关** @author lyy* */
@RestController
public class SysLoginController extends AbstractController {@Autowiredprivate SysUserService sysUserService;@Autowiredprivate SysUserTokenService sysUserTokenService;@Autowiredprivate SysCaptchaService sysCaptchaService;/*** 验证码*/@GetMapping("captcha.jpg")public void captcha(HttpServletResponse response, String uuid)throws IOException {response.setHeader("Cache-Control", "no-store, no-cache");response.setContentType("image/jpeg");//获取图片验证码BufferedImage image = sysCaptchaService.getCaptcha(uuid);ServletOutputStream out = response.getOutputStream();ImageIO.write(image, "jpg", out);IOUtils.closeQuietly(out);}/*** 登录*/@PostMapping("/sys/login")public Map<String, Object> login(@RequestBody SysLoginForm form)throws IOException {boolean captcha = sysCaptchaService.validate(form.getUuid(), form.getCaptcha());
//		if(!captcha){
//			return R.error("验证码不正确");
//		}//用户信息SysUserEntity user = sysUserService.queryByUserName(form.getUsername());//账号不存在、密码错误if(user == null || !user.getPassword().equals(new Sha256Hash(form.getPassword(), user.getSalt()).toHex())) {return R.error("账号或密码不正确");}//账号锁定if(user.getStatus() == 0){return R.error("账号已被锁定,请联系管理员");}//生成token,并保存到数据库R r = sysUserTokenService.createToken(user.getUserId());return r;}/*** 退出*/@PostMapping("/sys/logout")public R logout() {sysUserTokenService.logout(getUserId());return R.ok();}

shiro权限拦截放行:

/*** Shiro配置** @author lyy*/
@Configuration
public class ShiroConfig {@Bean("securityManager")public SecurityManager securityManager(OAuth2Realm oAuth2Realm) {DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();securityManager.setRealm(oAuth2Realm);securityManager.setRememberMeManager(null);return securityManager;}@Bean("shiroFilter")public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean();shiroFilter.setSecurityManager(securityManager);//oauth过滤Map<String, Filter> filters = new HashMap<>();filters.put("oauth2", new OAuth2Filter());shiroFilter.setFilters(filters);Map<String, String> filterMap = new LinkedHashMap<>();filterMap.put("/webjars/**", "anon");filterMap.put("/druid/**", "anon");filterMap.put("/app/**", "anon");filterMap.put("/sys/login", "anon");filterMap.put("/swagger/**", "anon");filterMap.put("/v2/api-docs", "anon");filterMap.put("/swagger-ui.html", "anon");filterMap.put("/swagger-resources/**", "anon");filterMap.put("/captcha.jpg", "anon");filterMap.put("/aaa.txt", "anon");filterMap.put("/virtuel/**", "anon");filterMap.put("/image/**", "anon");filterMap.put("/**", "oauth2");shiroFilter.setFilterChainDefinitionMap(filterMap);return shiroFilter;}@Bean("lifecycleBeanPostProcessor")public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {return new LifecycleBeanPostProcessor();}@Beanpublic AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();advisor.setSecurityManager(securityManager);return advisor;}

前端vue element登录:

<template><div class="site-wrapper site-page--login"><div class="site-content__wrapper"><div class="site-content"><div class="brand-info"><h1 class="brand-info__text">信息管理系统</h1></div><div class="login-main"><h3 class="login-title">系统登录</h3><el-form :model="dataForm" :rules="dataRule" ref="dataForm" @keyup.enter.native="dataFormSubmit()" status-icon><el-form-item prop="userName"><el-input v-model="dataForm.userName" placeholder="帐号"></el-input></el-form-item><el-form-item prop="password"><el-input v-model="dataForm.password" type="password" placeholder="密码"></el-input></el-form-item><el-form-item prop="captcha"><el-row :gutter="20"><el-col :span="14"><el-input v-model="dataForm.captcha" placeholder="验证码"></el-input></el-col><el-col :span="10" class="login-captcha"><img :src="captchaPath" @click="getCaptcha()" alt=""></el-col></el-row></el-form-item><el-form-item><el-button class="login-btn-submit" type="danger" @click="dataFormSubmit()">登录</el-button></el-form-item></el-form></div></div></div></div>
</template><script>import { getUUID } from '@/utils'export default {data () {return {dataForm: {userName: '',password: '',uuid: '',captcha: ''},dataRule: {userName: [{ required: true, message: '帐号不能为空', trigger: 'blur' }],password: [{ required: true, message: '密码不能为空', trigger: 'blur' }],captcha: [{ required: true, message: '验证码不能为空', trigger: 'blur' }]},captchaPath: ''}},created () {this.getCaptcha()},methods: {// 提交表单dataFormSubmit () {this.$refs['dataForm'].validate((valid) => {if (valid) {this.$http({url: this.$http.adornUrl('/sys/login'),method: 'post',data: this.$http.adornData({'username': this.dataForm.userName,'password': this.dataForm.password,'uuid': this.dataForm.uuid,'captcha': this.dataForm.captcha})}).then(({data}) => {if (data && data.code === 0) {this.$cookie.set('token', data.token)this.$router.replace({ name: 'home' })} else {this.getCaptcha()this.$message.error(data.msg)}})}})},// 获取验证码getCaptcha () {this.dataForm.uuid = getUUID()this.captchaPath = this.$http.adornUrl(`/captcha.jpg?uuid=${this.dataForm.uuid}`)}}}
</script><style lang="scss">.site-wrapper.site-page--login {position: absolute;top: 0;right: 0;bottom: 0;left: 0;//background-color: rgba(38, 50, 56, .6);overflow: hidden;&:before {position: fixed;top: 0;left: 0;z-index: -1;width: 100%;height: 100%;content: "";background-image: url(~@/assets/img/login_bg.jpg);background-size: cover;}.site-content__wrapper {position: absolute;top: 0;right: 0;bottom: 0;left: 0;padding: 0;margin: 0;overflow-x: hidden;overflow-y: auto;background-color: transparent;}.site-content {min-height: 100%;padding: 30px 500px 30px 30px;}.brand-info {margin: 220px 100px 0 90px;color: #fff;}.brand-info__text {margin:  0 100px 220px 200px;font-size: 100px;font-weight: 400;text-transform : uppercase;}.brand-info__intro {margin: 10px 0;font-size: 16px;line-height: 1.58;opacity: .6;}.login-main {position: absolute;top: 0;right: 0;padding: 150px 60px 180px;width: 470px;min-height: 100%;background-color: #fff;}.login-title {font-size: 16px;}.login-captcha {overflow: hidden;> img {width: 100%;cursor: pointer;}}.login-btn-submit {width: 100%;margin-top: 38px;}}
</style>

获取源码:

大家点赞、收藏、关注、评论啦
🍅查看下方微信号获取联系方式 📝
🚀🚀🚀精彩系列推荐
Java毕设项目精品实战案例《1000套》
精彩专栏推荐订阅:在下方专栏

相关文章:

基于Java-SpringBoot+vue实现的前后端分离信息管理系统设计和实现

基于Java-SpringBootvue实现的前后端分离信息管理系统设计和实现 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐…...

用Python实现办公自动化(自动化处理PDF文件)

自动化处理 PDF 文件 目录 自动化处理 PDF 文件 谷歌浏览器 Chrome与浏览器驱动ChromeDriver安装 &#xff08;一&#xff09;批量下载 PDF 文件 1.使用Selenium模块爬取多页内容 2.使用Selenium模块下载PDF文件 3.使用urllib模块来进行网页的下载和保存 4.使用urllib…...

银河麒麟操作系统Kylin Linux 离线安装Nginx1.21.5

一、查看操作系统版本号 nkvers ############## Kylin Linux Version ################# Release: Kylin Linux Advanced Server release V10 (Lance)Kernel: 4.19.90-52.15.v2207.ky10.x86_64Build: Kylin Linux Advanced Server release V10 (SP3) /(Lance)-x86_64-Build20/…...

ApiFox 使用教程

ApiFox 使用教程 目录概述需求&#xff1a; 设计思路实现思路分析1.基本使用教程&#xff08;Apifox 使用 Postman&#xff09;Apifox 下使用 mockapifox 下 swaggerApifox 下使用 Jmeter 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show…...

github拉取的项目添加至自己的仓库

想把GitHub的开源项目拉到本地进行二开&#xff0c;研究了一下上传到gitee的步骤&#xff1a; 步骤 gitee新建仓库&#xff0c;仓库名与本地文件夹的名称一致&#xff0c;建好后gitee的页面也会有显示git命令 打开项目目录&#xff0c;右键打开git bash&#xff08;或者在gi…...

ZooKeeper 的持久化机制

持久化的定义&#xff1a; 数据&#xff0c;存到磁盘或者文件当中。机器重启后&#xff0c;数据不会丢失。内存 -> 磁盘的映射&#xff0c;和序列化有些像。 ZooKeeper 的持久化&#xff1a; SnapShot 快照&#xff0c;记录内存中的全量数据TxnLog 增量事务日志&#xff…...

VS2022+QT5.9 提示找不到qtmain.lib

从VS2013QT的项目切换到VS2022QT5.9&#xff0c;安装好mscv2017版本的QT5.9&#xff0c;项目工程选择QT project settings中的Qt Installation为mscv2017版本的QT5.9&#xff0c;编译好提示找不到qtmain.lib 解决思路&#xff1a; 提示找到xxxx.lib&#xff0c;第一库目录不对…...

HTTP和HTTPS谁传输数据更安全?

1.HTTP HTTP在传输数据时&#xff0c;通常都是明文传输&#xff0c;也就是传输的数据没有进行加密。在这种情况下&#xff0c;如果传输的是一些敏感数据&#xff0c;比如某银行卡密码&#xff0c;就很容易被别人截获到&#xff0c;这就对我们的个人利益产生了威胁。 HTTP传输数…...

竞赛常考的知识点大总结(七)图论

最短路 最短路问题&#xff08;Shortest Path Problem&#xff09;是图论中的一个经典问题&#xff0c;它要求在给定的图中找到两个顶点之间的最短路径。最短路问题可以是单源最短路问题&#xff08;从一个顶点到其他所有顶点的最短路径&#xff09;或所有对最短路问题&#x…...

NOSQL - Redis的简介、安装、配置和简单操作

目录 一. 知识了解 1. 关系型数据库与非关系型数据库 1.1 关系型数据库 1.2 非关系型数据库 1.3 区别 1.4 非关系型数据库产生背景 1.5 NOSQL 与 SQL的数据记录对比 2. 缓存相关知识 2.1 缓存概念 2.2 系统缓存 2.3 缓存保存位置及分层结构 二 . redis 相关知识 1.…...

书生·浦语大模型开源体系(二)笔记

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…...

docker-compse安装es(包括IK分词器扩展)、kibana、libreoffice

Kibana是一个开源的分析与可视化平台&#xff0c;设计出来用于和Elasticsearch一起使用的。你可以用kibana搜索、查看存放在Elasticsearch中的数据。 Kibana与Elasticsearch的交互方式是各种不同的图表、表格、地图等&#xff0c;直观的展示数据&#xff0c;从而达到高级的数据…...

Electron 读取本地配置 增加缩放功能(ctrl+scroll)

最近&#xff0c;一个之前做的electron桌面应用&#xff0c;需要增加两个功能&#xff1b;第一是读取本地的配置文件&#xff0c;然后记载配置文件中的ip地址&#xff1b;第二就是增加缩放功能&#xff1b; 第一&#xff0c;配置本地文件 首先需要在vue工程根目录中&#xff0…...

docker中配置交互式的JupyterLab环境的问题

【报错1】 Could not determine jupyter lab build status without nodejs 【解决措施】安装nodejs(利用conda进行安装/从官网下载进行安装&#xff09; 1、conda安装 conda install -c anaconda nodejs 安装后出现其他报错&#xff1a;Please install nodejs 5 and npm bef…...

SQLAlchemy 来查询并统计 MySQL 中 JSON 字段的一个值

在使用 SQLAlchemy 来查询并统计 MySQL 中 JSON 字段的一个值时&#xff0c;你可以结合 SQLAlchemy 的 func 模块来实现 SQL 函数的调用&#xff0c;比如 JSON_EXTRACT&#xff0c;并使用 group_by 和 count 方法来进行分组统计。下面是如何在 SQLAlchemy 中实现这一点的基本步…...

HTTPS ECDHE 握手解析(计算机网络)

使用了 ECDHE&#xff0c;在 TLS 第四次握手前&#xff0c;客户端就已经发送了加密的 HTTP 数据&#xff0c;而对于 RSA 握手过程&#xff0c;必须要完成 TLS 四次握手&#xff0c;才能传输应用数据。 所以&#xff0c;ECDHE 相比 RSA 握手过程省去了一个消息往返的时间&#…...

在git上先新建仓库-把本地文件提交远程

一.在git新建远程项目库 1.选择新建仓库 以下以gitee为例 2.输入仓库名称&#xff0c;点击创建 这个可以选择仓库私有化还公开权限 3.获取仓库clone链接 这里选择https模式就行&#xff0c;就不需要配置对电脑进行sshkey配置了。只是需要每次提交输入账号密码 二、远…...

Redis 过期删除策略

Redis 过期删除策略 Redis 过期删除策略主要包括两种&#xff1a;惰性删除&#xff08;Lazy Expiration&#xff09;和定期删除&#xff08;Periodic Expiration&#xff09;。这两种策略通常会配合使用&#xff0c;以在内存使用效率、CPU 资源消耗以及过期键清理的及时性之间…...

MySQL 锁合集与事务隔离级别

概览 在数据库管理中&#xff0c;锁是用来控制多个事务对同一数据的并发访问的机制。InnoDB作为MySQL的默认事务型存储引擎&#xff0c;提供了多种类型的锁来保障事务的隔离性并减少冲突&#xff0c;从而维护数据库的完整性和一致性。以下是InnoDB提供的主要锁类型&#xff1a…...

题解 -- 第六届蓝桥杯大赛软件赛决赛C/C++ 大学 C 组

https://www.lanqiao.cn/paper/ 1 . 分机号 模拟就行 : inline void solve(){int n 0 ;for(int a1;a<9;a){for(int b0;b<9;b){for(int c0;c<9;c){if(a>b && b>c){n ;}}}}cout << n << endl ; } 2 . 五星填数 直接调用全排列的库函数…...

Lua脚本的使用

一、使用lua脚本扣减单个商品的库存 SpringBootTest class LuaTests {AutowiredStringRedisTemplate stringRedisTemplate;Testvoid test3() {for (int i 1; i < 5; i) {stringRedisTemplate.opsForValue().set("product."i,String.valueOf(i));}}Testvoid test…...

hcia datacom课程学习(5):MAC地址与arp协议

1.MAC地址 1.1 含义与作用 &#xff08;1&#xff09;含义&#xff1a; mac地址也称物理地址&#xff0c;是网卡设备在数据链路层的地址&#xff0c;全世界每一块网卡的mac地址都是唯一的&#xff0c;出厂时烧录在网卡上不可更改 &#xff08;2&#xff09;作用&#xff1a…...

unbuntu mysql8.0新建用户及开启远程连接

MySQL更新到8.0以上版本后&#xff0c;在创建连接远程的用户的时候和之前5.x的版本有了很大的不同&#xff0c;不能使用原来同时创建用户和授权的命令。 以下是记录的MySQL8.0创建用户并授权的命令&#xff1a; 查看用户表&#xff1a; user mysql; select host,user,authen…...

Intel FPGA (1):线性序列机

Intel FPGA (1)&#xff1a;线性序列机 前提摘要 个人说明&#xff1a; 限于时间紧迫以及作者水平有限&#xff0c;本文错误、疏漏之处恐不在少数&#xff0c;恳请读者批评指正。意见请留言或者发送邮件至&#xff1a;“Email:noahpanzzzgmail.com”。本博客的工程文件均存放在…...

翻译: 硅谷软件工程师面试:准备所需的一切

没有人有时间去做成百上千道LeetCode题目&#xff0c;好消息是你实际上并不需要做那么多题目就能够在FAANG公司找到工作&#xff01; 我曾经在Grab工作&#xff0c;这是东南亚的一家共享出行公司&#xff0c;但我对工作感到沮丧&#xff0c;想要进入FAANG公司&#xff0c;但我…...

视频推拉流EasyDSS点播平台云端录像播放异常的问题排查与解决

视频推拉流EasyDSS视频直播点播平台可提供一站式的视频转码、点播、直播、视频推拉流、播放H.265视频等服务&#xff0c;搭配RTMP高清摄像头使用&#xff0c;可将无人机设备的实时流推送到平台上&#xff0c;实现无人机视频推流直播、巡检等应用。 有用户反馈&#xff0c;项目现…...

kubuntu23.10安装sdl2及附加库和 sfml2.5.1

2024年3月28号&#xff0c;四&#xff0c;晚上kubuntu23.10下安装了sdl2的如下&#xff0c;没有安装gfx。 sudo apt install libsdl2-dev sudo apt install libsdl2-image-dev sudo apt install libsdl2-ttf-dev sudo apt install libsdl2-mixer-dev sudo apt install libsdl2…...

Centos JDK1.8 下载安装

https://www.oracle.com/java/technologies/javase/javase8u211-later-archive-downloads.html 一 RPM包安装 rpm -ivh jdk-8u391-linux-x64.rpm /etc/profile export JAVA_HOME/usr/java/jdk1.8.0-x64 export PATH$JAVA_HOME/bin:$PATHsource /etc/profile二 tar.gz 包手动…...

iOS开发进阶(十四):xcodebuild 命令应用详解

文章目录 一、前言二、xcodebuild 命令汇总三、xcodebuild 可选命令四、exportOptionsPlist文件内容配置说明五、项目实操六、拓展阅读 一、前言 关于iOS组包&#xff0c;详参博文《ReactNative进阶&#xff08;三十四&#xff09;&#xff1a;Jenkins 流水线 组包 iOS 应用包…...

uniapp 开发之原生Android插件

开发须知 在您阅读此文档时&#xff0c;我们假定您已经具备了相应Android应用开发经验&#xff0c;使用Android Studio开发过Android原生。也应该对HTML,JavaScript,CSS等有一定的了解, 并且熟悉在JavaScript和JAVA环境下的JSON格式数据操作等。 为了插件开发者更方便快捷的开…...

收藏网站的链接怎么做的/欧美网站建设

&#xff08;1&#xff09;九度上一个关于二叉树遍历的问题。通过给定的前序遍历与中序遍历就可以确定二叉树的结构。 题目描述&#xff1a; 二叉树的前序、中序、后序遍历的定义&#xff1a; 前序遍历&#xff1a;对任一子树&#xff0c;先访问跟&#xff0c;然后遍历其左子树…...

网站 板块 模块/关键词搜索排名软件

一&#xff1a;uboot启动的第一阶段start.S(路径uboot/cpu/s5pc11x/start.S)1:#include <config.h> //头文件包含&#xff0c;config.h文件源码中不存在&#xff0c;配置后自动生成&#xff1b;路径/include/linux/config.h&#xff1b;2&#xff1a;#include <versio…...

游戏网站怎么做seo/厦门百度推广排名优化

$SYS-系统主题 先来看一段EMQ对于系统主题的介绍&#xff1a;EMQ 消息服务器周期性发布自身运行状态、MQTT 协议统计、客户端上下线状态到 $SYS/ 开头系统主题。$SYS 主题路径以 “$SYS/brokers/{node}/” 开头&#xff0c;’${node}’ 是 Erlang 节点名称 系统主题主要包括一下…...

wordpress 文字颜色/北京网络营销推广

配置和下载lib文件请前往 https://blog.csdn.net/weixin_37615774/article/details/120679105 说明&#xff1a;需要自己修改代码中 显示的图片文件名称 // ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 //#define STB_IMAGE…...

备案没有商城可以做商城网站吗/今日中央新闻

boost生成和解析json[转] 原文&#xff1a;《boost生成和解析json》 目录 boost生成和解析json[转] 什么是property_tree&#xff1f; 生成 解析 遍历读取属性 删除节点 修改值 抛出异常 boost json使用过程中需要注意的问题 参考&#xff1a; 《boost::property_tree讲解》《…...

番禺做网站的/个人网站模板免费下载

大家好&#xff0c;我是为人造的智能操碎了心的智能禅师。尽听说现在国内外一线互联网巨头&#xff0c;包括后起的独角兽&#xff0c;对 AI 人才的需求非常大&#xff0c;Google、Facebook 为了抢 AI 人才都快 battle 起来了。然而实际上&#xff0c;AI 岗位还是面临僧多粥少的…...