手把手教你直播平台怎么搭建

手把手教你直播平台怎么搭建

后端项目初始化

1.全局安装express脚手架

额,这个应该是属于准备工作的。给忘记了,那就凑合放在这里吧,别打我,我知道错了,但我就是不改【狗头保命】

cnpm install -g express-generator 
复制代码

2.新建工程

打开cmd,cd 到大家喜欢的路径下,然后输入下面这条命令

express express_mylive
复制代码

 

image-20200905170800271

 

 

接着我们使用编辑器打开我们刚刚创建好的项目。像小羽这么帅的男人,当然就是眼疾手快的打开了vs code啦。这就是我们刚刚创建的工程啦。下图就是我们的项目目录。

直播平台怎么搭建

image-20200905171000959

 

 

在vscode的cmd中,通过cnpm install 安装相关的模块。接着通过npm run start 启动后台。express框架默认是启动3000端口,所以老铁们,不用我多说了吧!浏览器输入http://localhost:3000。

image-20200905171244447

 

 

 

image-20200905171441888

 

直播平台怎么搭建

3.初始化工程

但是这个工程还配不上像咱们老铁那高贵的气质。所以,痛定思痛,老铁们你们还不一起来改造这个气质低下的工程嘛?

3.1 修改package.json

修改package.json,如下。然后在vscode的cmd中输入以下两条命令,全局安装相关的插件模块和pm2。

cnpm install 
cnpm install pm2 -g
复制代码
{"name": "express-mylive","version": "0.0.0","private": true,"scripts": {"dev": "node-dev ./bin/www","start": "pm2 start ./bin/www --name=express_living","restart": "pm2 restart ./bin/www --name=express_living","stop": "pm2 stop express_living"},"dependencies": {"base64-img": "^1.0.4","body-parser": "^1.19.0","compression": "^1.7.4","cookie-parser": "~1.4.4","debug": "~2.6.9","express": "~4.16.1","express-jwt": "^6.0.0","http-errors": "~1.6.3","jade": "~1.11.0","morgan": "~1.9.1","mysql": "^2.18.1","node-media-server": "^2.1.4","socket.io": "^2.3.0"},"devDependencies": {"node-dev": "^5.0.0"}
}复制代码

3.2 修改启动端口

修改bin目录下的www文件,修改端口号为8512。老铁们喜欢改成啥都可以哈,尽量找一个少用的端口号就行了。保存之后,直接打开http://localhost:8512就可以看到我 们的后端重新运行到了8512端口,而原来的3000端口无法打开了,就好像小三一样被无情的抛弃了。呸,一群渣男!

 

image-20200905172735700

 

直播平台怎么搭建

3.3 配置公共文件

修改public目录下的文件如下

 

image-20200905180344984

common.js

const base64Img = require('base64-img');
class Common {//格式化输出outPut(code,data,msg=""){return {code:code,data:data,msg:msg}}//生成len位随机字符串getCode(len){var chars = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'];var nums = "";for (var i = 0; i < len; i++) {var id = parseInt(Math.random() * 62);nums += chars[id];}return nums;}//图片转base64async base64Image(url){return new Promise((resolve,reject)=>{base64Img.requestBase64(url,(err,res,body)=>{resolve(body)})}) }
}
const common = new Common();
module.exports = common;
复制代码

mysqlModal.js

这里的话。我们使用了db2的配置,所以老铁们改db2的相关配置就阔以啦~

//mysqlModal.js
//初始化数据库配置
//test666
const mysqlConf = {db1:{host: '127.0.0.1',user: 'root',password: 'test',database: 'test',port: 3306},db2:{host: 'localhost',user: 'root',password: '123456',database: 'living',port: 3306}
};//封装数据库sql操作
async function DB1(sql){var mysql = require('mysql');var pool = mysql.createPool(mysqlConf.db1);return new Promise((resolve,reject)=>{pool.getConnection(function(err,conn){if(err){console.log(err)}else{conn.query(sql,function(err,results,fields){//事件驱动回调if(err){resolve(err)}else{resolve(results)}});//释放连接,需要注意的是连接释放需要在此处释放,而不是在查询回调里面释放conn.release();}});})
}
async function DB2(sql){var mysql = require('mysql');var pool = mysql.createPool(mysqlConf.db2);return new Promise((resolve,reject)=>{pool.getConnection(function(err,conn){if(err){console.log(err)}else{conn.query(sql,function(err,results,fields){//事件驱动回调if(err){resolve(err)}else{resolve(results)}});//释放连接,需要注意的是连接释放需要在此处释放,而不是在查询回调里面释放conn.release();}});})
}module.exports = {DB1,DB2};
复制代码

4.导入数据库

像小羽这么聪明的男人,早就知道你们这群人懒得要死,所以早早就给你们准备好了sql文件。你们说说看嘛,要是没了我这么帅气的男人,你们怎么活呀?

使用navicate连接上自己的数据库,创建一个叫living的库,然后导入上面说到的sql文件。最后可以看到帮我们新建了两个表。

直播平台怎么搭建

image-20200905174628878

image-20200905174702624

 

 

 

image-20200905174800752

 

 

5.修改api接口

 

image-20200905175847616

 

 

5.1 index

routes文件夹下的index.js

这里是我们的默认请求的接口,也就是传说中的牌面,所以老铁们,不要客气有多高大上就给它整到多高大上。

var express = require('express');
var router = express.Router();/* GET home page. */
router.get('/', function(req, res, next) {//res.render('index', { title: 'Express' });res.send("小羽直播间-后台")
});module.exports = router;复制代码

5.2 users

router文件夹下的users.js

这里是我们的用户接口,都是用sql语句写的,不会orm,后端大佬不要埋汰小弟,小弟夸您帅好不好?

var express = require('express');
var router = express.Router();
var commonJS = require('../public/js/common');
var sqlHandle = require('../public/config/mysqlModal')
const jwt = require('jsonwebtoken')router.get("/test",async(req,res,next)=>{let img = await commonJS.base64Image("https://c-ssl.duitang.com/uploads/item/201807/08/20180708222217_wayur.jpeg")res.send(img)
})/*** @description: 用户登录* @Date: 2020-09-01 10:46:49* @author: 小羽* @param {type} * @return {type} */
router.post("/login",async(req,res,next)=>{let data = req.bodyif(data.account&&data.password){let sql = `select * from user where email='${data.account}' and password='${data.password}' limit 1`let result = await sqlHandle.DB2(sql)if (result.length == 1) {const token = 'Bearer ' + jwt.sign({id:result[0].id,name:result[0].name,age:result[0].age,email:result[0].email},'living_xiaoyu',{expiresIn: 3600 * 24 * 7})res.send(commonJS.outPut(200, token, 'success'))}else{res.send(commonJS.outPut(500, "账号/密码错误", 'fail'))}}else{res.send(commonJS.outPut(500, "账号/密码不能为空", 'fail'))}
})/*** @description: 获取用户信息* @Date: 2020-08-31 11:13:14* @author: 小羽* @param {type} * @return {type} */
router.get('/getUserInfo',async(req,res,next)=>{let data = req.query;let sql = `select * from user where id = '${data.id}' limit 1`let result = await sqlHandle.DB2(sql)if (result.length == 1) {res.send(commonJS.outPut(200, result[0], 'success'))}else{res.send(commonJS.outPut(500, result, 'fail'))}
})/*** @description: 新增用户* @Date: 2020-08-31 11:13:05* @author: 小羽* @param {type} * @return {type} */
router.post('/addUser', async (req, res, next)=>{let data = req.body;if(!data.email||!data.password){res.send(commonJS.outPut(500, "邮箱/密码不能为空", 'fail'))return}let sql = `insert into user (id,name,age,email,password) values ('${commonJS.getCode(32)}','${data.name}','${data.age}','${data.email}','${data.password}')`let result = await sqlHandle.DB2(sql)if (result.affectedRows == 1) {res.send(commonJS.outPut(200, data, 'success'))}else{res.send(commonJS.outPut(500, result, 'fail'))}
});/*** @description: 编辑用户信息* @Date: 2020-08-31 13:38:44* @author: 小羽* @param {type} * @return {type} */
router.post("/editUser",async(req,res,next)=>{let data = req.dataif(!data.id){let sql = `update user set name=${data.name},age=${data.age},password=${data.password} where id=${data.id}`let result = await sqlHandle.DB2(sql)if (result.affectedRows == 1) {res.send(commonJS.outPut(200, data, 'success'))}else{res.send(commonJS.outPut(500, result, 'fail'))}}
})module.exports = router;

5.3 livingRoom

router文件夹下的livingRoom.js

直播间接口,也是用sql语句写的。

/** @description: * @author: 小羽* @github: https://github.com/lyff1006* @lastEditors: 小羽* @Date: 2020-08-31 22:27:40* @LastEditTime: 2020-09-05 17:58:10* @Copyright: 1.0.0*/
var express = require('express');
var router = express.Router();
var commonJS = require('../public/js/common');
var sqlHandle = require('../public/config/mysqlModal')/*** @description: 获取直播间信息* @Date: 2020-08-31 11:32:31* @author: 小羽* @param {type} * @return {type} */
router.get("/roomList",async (req,res,next)=>{let data = req.querylet sqlif(!data.keyword){sql = `select living_room.id,living_room.user_id,living_room.title,user.name,living_room.image,user.avatar,living_room.type from living_room left join user on living_room.user_id = user.id  where living_room.status != 0`}else{sql = `select living_room.id,living_room.user_id,living_room.title,user.name,living_room.image,user.avatar,living_room.type from living_room left join user on living_room.user_id = user.id where title like '%${data.keyword}%' or user.name like '%${data.keyword}%' and living_room.status !=0 limit 20`}let result = await sqlHandle.DB2(sql)if (result.length >= 0) {res.send(commonJS.outPut(200, result, 'success'))}else{res.send(commonJS.outPut(500, result, 'fail'))}
})/*** @description: 根据类型获取直播间信息* @Date: 2020-08-31 11:32:31* @author: 小羽* @param {type} * @return {type} */
router.get("/roomListByType",async (req,res,next)=>{let data = req.querylet sqlif(!data.type){sql = `select living_room.id,living_room.user_id,living_room.title,user.name,living_room.image,user.avatar,living_room.type from living_room left join user on living_room.user_id = user.id  where living_room.status != 0`}else{sql = `select living_room.id,living_room.user_id,living_room.title,user.name,living_room.image,user.avatar,living_room.type from living_room left join user on living_room.user_id = user.id where type = '${data.type}' and living_room.status !=0 limit 20`}let result = await sqlHandle.DB2(sql)if (result.length >= 0) {res.send(commonJS.outPut(200, result, 'success'))}else{res.send(commonJS.outPut(500, result, 'fail'))}
})/*** @description: 新建房间* @Date: 2020-08-31 11:38:49* @author: 小羽* @param {type} * @return {type} */
router.post("/addRoom",async (req,res,next)=>{let data = req.bodylet sql = `insert into living_room (id,title,user_id,type) value ('${commonJS.getCode(32)}','${data.title}','${data.user_id}','${data.type}')`let result = await sqlHandle.DB2(sql)if (result.affectedRows == 1) {res.send(commonJS.outPut(200, data, 'success'))}else{res.send(commonJS.outPut(500, result, 'fail'))}
})/*** @description: 编辑房间* @Date: 2020-08-31 11:40:27* @author: 小羽* @param {type} * @return {type} */
router.post("/editRoom",async (req,res,next)=>{let data = req.bodylet sql = `update living_room set title='${data.title}',status='${data.status}',user_id='${data.user_id}' where id ='${data.id}' `let result = await sqlHandle.DB2(sql)if (result.affectedRows == 1) {res.send(commonJS.outPut(200, data, 'success'))}else{res.send(commonJS.outPut(500, result, 'fail'))}
})module.exports = router;
复制代码

直播平台怎么搭建

5.4 修改app.js

5.4.1 添加路由

//路由相关
app.use('/', indexRouter);
app.use('/users', usersRouter);
app.use("/livingRoom", roomRouter);
复制代码

5.4.2 开启gzip压缩

//开启gzip
var compression = require('compression');
app.use(compression());
复制代码

5.4.3 设置跨域头

//设置跨域头,这里设置全部允许跨域了
app.all('*', function (req, res, next) {res.header('Access-Control-Allow-Origin', req.headers.origin || '*');res.header('Access-Control-Allow-Headers', 'Content-Type,Content-Length, Authorization,Origin,Accept,X-Requested-With');res.header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');res.header('Access-Control-Allow-Credentials', true);res.header('X-Powered-By', ' 3.2.1');res.header('Content-Type', 'application/json;charset=utf-8');next();
});

5.4.4 设置jwt

app.use(expressJwt({secret:"living_xiaoyu",algorithms:['HS256'],credentialsRequired:true, //是否校验
}).unless({path:['/users/login','/livingRoom/roomList','/livingRoom/roomListByType']
}))
复制代码

5.4.5 设置完的app.js

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var expressJwt = require("express-jwt")
var compression = require('compression');var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
var roomRouter = require('./routes/livingRoom');var app = express();//开启gzip
app.use(compression());//设置跨域头
app.all('*', function (req, res, next) {res.header('Access-Control-Allow-Origin', req.headers.origin || '*');res.header('Access-Control-Allow-Headers', 'Content-Type,Content-Length, Authorization,Origin,Accept,X-Requested-With');res.header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');res.header('Access-Control-Allow-Credentials', true);res.header('X-Powered-By', ' 3.2.1');res.header('Content-Type', 'application/json;charset=utf-8');next();
});// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');//使用中间件
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use(expressJwt({secret:"living_xiaoyu",algorithms:['HS256'],credentialsRequired:true, //是否校验
}).unless({path:['/users/login','/livingRoom/roomList','/livingRoom/roomListByType']
}))//路由相关
app.use('/', indexRouter);
app.use('/users', usersRouter);
app.use("/livingRoom", roomRouter);// catch 404 and forward to error handler
app.use(function(req, res, next) {next(createError(404));
});// error handler
app.use(function(err, req, res, next) {// set locals, only providing error in developmentres.locals.message = err.message;res.locals.error = req.app.get('env') === 'development' ? err : {};// render the error pageres.status(err.status || 500);res.render('error');
});module.exports = app;
复制代码

6.使用postman测试api接口

6.1 设置全局变量

 

image-20200905181501856

 

 

 

image-20200905181519636

直播平台怎么搭建

 

 

6.2 将api接口导入postman

嗯,不用你们提醒,我也给你们准备好了,拿走吧www.getpostman.com/collections…

 

image-20200905181825224

 

 

6.3 设置token

这里可以设置token哦,token可以从登录接口中获取,啥?账号密码?自己进数据看看就知道了嘛。敲黑板,敲黑板,敲黑板,token 中不需要带Bearer

image-20200905182117457

 

 

 

image-20200905182352678

 

 

7.添加websocket和rtmp服务

修改app.js

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var expressJwt = require("express-jwt")
var compression = require('compression');
var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
var roomRouter = require('./routes/livingRoom');
var http = require('http').Server(app);
var io = require('socket.io')(http);
var port = process.env.PORT || 8511;var app = express();//开启gzip
app.use(compression());//设置跨域头
app.all('*', function (req, res, next) {res.header('Access-Control-Allow-Origin', req.headers.origin || '*');res.header('Access-Control-Allow-Headers', 'Content-Type,Content-Length, Authorization,Origin,Accept,X-Requested-With');res.header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');res.header('Access-Control-Allow-Credentials', true);res.header('X-Powered-By', ' 3.2.1');res.header('Content-Type', 'application/json;charset=utf-8');next();
});// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');//使用中间件
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use(expressJwt({secret:"living_xiaoyu",algorithms:['HS256'],credentialsRequired:true, //是否校验
}).unless({path:['/users/login','/livingRoom/roomList','/livingRoom/roomListByType']
}))//路由相关
app.use('/', indexRouter);
app.use('/users', usersRouter);
app.use("/livingRoom", roomRouter);// catch 404 and forward to error handler
app.use(function(req, res, next) {next(createError(404));
});// error handler
app.use(function(err, req, res, next) {// set locals, only providing error in developmentres.locals.message = err.message;res.locals.error = req.app.get('env') === 'development' ? err : {};// render the error pageres.status(err.status || 500);res.render('error');
});//rtmp服务
const NodeMediaServer = require('node-media-server');
const config = {rtmp: {port: 1935,chunk_size: 60000,gop_cache: true,ping: 30,ping_timeout: 60},http: {port: 8000,allow_origin: '*'}
};
var nms = new NodeMediaServer(config)
nms.run();//socket服务
require('events').EventEmitter.prototype._maxListeners = 1000;
let namespaceList = [{name:"barrage",description:"弹幕模块"}]
for(let i in namespaceList){if(namespaceList[i].name){newNamespace(namespaceList[i].name)}
}
//监听新的命名空间
function newNamespace(space){io.of(space).on('connection',(socket)=>{socket.on('chat message',(data)=>{socket.emit('chat message',data)})//加入房间socket.on('JOINROOM',(name)=>{socket.join(name)})//离开房间socket.on('LEAVEROOM',(name)=>{socket.leave(name)})//发送房间聊天socket.on('ROOMCHAT',(data)=>{io.of(space).to(data.room).emit(data.func,data.data)})//加入自己的房间socket.on('JOINUSER',(id)=>{socket.join(id)})//发送用户私聊socket.on('USETCHAT',(data)=>{io.of(space).to(data.id).emit(data.func,data.data)})//发送公聊socket.on('COMMONCHAT',(data)=>{socket.emit(data.func,data.data)})})
}
http.listen(port, function(){console.log('listening on *:' + port);
});module.exports = app;复制代码

websocket服务就暂时不测试了,到时候接入前端再测,现在测一下rtmp服务。

obs中设置推流如下,其中密钥为直播间的id可以在数据库中找到,然后添加窗口捕获后,点击开始推流,在http:localhost:8000/admin中即可看到自己的直播啦。

直播平台怎么搭建

image-20200905183335132

 

 

 

image-20200905183451053

 

 

 

直播平台怎么搭建image-20200905183650534

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/37120.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【AI】在线网站随机生成假头像、不同头像

搜集到的一些科技前沿有趣的网站。 目前能想到的用途是不侵犯他人肖像权的情况下做些假数据&#xff0c;展示性的数据。每次刷新ai都会随机生成一张头像。 真人头像&#xff0c;欧美偏多&#xff0c;亚洲面孔少&#xff1a;https://thispersondoesnotexist.com/ 二次元女生头…

Android:使用LayerDrawable动态生成四宫格头像(包含双人、三人头像)

其实用自定义View也可以实现&#xff0c;我比较懒&#xff0c;就用LayerDrawable来创建一个新的Drawable资源实现。 举例4宫格&#xff0c;9宫格原理类似&#xff0c;每个图标的位置需要用边距慢慢调成预期的效果 效果如下&#xff1a; 双人头像&#xff1a; 三人头像&#x…

深度分析:用户最喜欢用哪种NFT做头像

自 CryptoPunks 作为首支蓝筹 NFT 项目被人们关注以来&#xff0c;关于 NFT 可以做什么的讨论便一直没有停歇&#xff0c;各类 NFT 创新应用也是层出不穷。除了头像以外&#xff0c;收藏、艺术、游戏、社交、运动等领域都可以看到 NFT 的身影。不过无论是从项目数量还是应用广度…

一张图生成定制版二次元人脸头像,还能“模仿”你的表情

作者 | Pramook Khungurn 整理 | Jane、刘畅 出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09; 【导读】最近&#xff0c;日本一位酷爱 Vtubers的粉丝结合了此前发表的多项 GAN 工作制作了两个动漫人物生成器的工具&#xff0c;这两个工具一个可以帮助广大…

个人头像人工智能生成工具,上线一天就已赚了1万美金

文章目录 仅上线一天就已赚1万美金是什么怎么赚钱启示附录 仅上线一天就已赚1万美金 作者刚刚在社交媒体上分享到&#xff1a; 是什么 个人自己头像人工智能生成工具。让在他的网站上传自己20张个人照片&#xff0c;脸部要清晰的更好&#xff08;方便机器学习训练&#xff…

人类面部表情数据集(12万张表情照片)

人类面部表情数据集&#xff08;12万张表情照片&#xff09; 一共有7类人类面积表情&#xff0c;分别是&#xff1a;悲伤、高兴、害怕、惊讶、平静、生气、厌恶。一个文件夹一类。表情识别模型训练的很好数据。一共有7类人类表情数据集&#xff0c;文件夹如下图所示&#xff1…

聊天界面的制作(三)——表情列表发送功能

基本功能 1. 自定义标题栏。&#xff08;标题栏不做任何功能&#xff09; 2. 有左右发送按钮。&#xff08;这个只能自己和自己聊天哦&#xff0c;所以有左右发送按钮&#xff09; &#xff08;1&#xff09;点击左边按钮发送按钮&#xff0c;在ListView的左侧显示。   &…

FindMeChat(盲盒社交)-匿名聊天-好玩有趣的社交平台

FindmeChat(盲盒社交)APP 重磅来袭! 全新玩法&#xff0c;遨游陌生社交元宇宙。 无聊急救包&#xff01;Findmechat(盲盒社交)&#xff01; 官网: http://www.findmechat.comhttp://www.findmechat.com 聊天网址(用手机浏览器打开哦): http://www.findmechat.nethttp://www…

虚拟人,数字人,虚拟数字人的定义区别

虚拟人 虚拟人&#xff08;Virtual Human&#xff09;&#xff0c;指通过数字技术模拟真实的人体器官而合成的三维模型。这种模型不仅具有人体外形以及肝脏、心脏、肾脏等各个器官的外貌&#xff0c;而且具备各器官的新陈代谢机能&#xff0c;能较为真实地显示出人体的正常生理…

AI 智能头像生成神器|PhotoShot

​ 题图&#xff1a;通过 PhotoShot 将普通图片生成智能头像 酱酱来为大家推荐好玩的开源软件啦 &#x1f973;&#xff01;&#xff01; 大家日常工作、生活中&#xff0c;经常会需要在一些网站、软件中自己的头像&#xff0c;但总会碰到一些问题&#xff0c;比如觉得照的不好…

借助免费AI艺术平台生成头像

随着 AI 的兴起&#xff0c;看到越来越多的实例通过 OpenAI 的举措变得轻松&#xff0c;使得 AI 艺术在今天早已不是什么新鲜事物&#xff0c;而且在游戏领域也开始有所应用。人工智能&#xff08;AI&#xff0c;artificial intelligence&#xff09;艺术&#xff0c;更准确地说…

【不存在的人】用Python获取生成随机头像,还不侵权

文章目录 ⛳️ 实战场景⛳️ 站点 1 实战编码⛳️ 站点 2 实战编码 ⛳️ 实战场景 在编写网站账号系统时&#xff0c;有时需要替新注册用户随机生成一个头像&#xff0c;有的站点使用色块拼接&#xff0c;有的网站使用随机汉字&#xff0c;今天我们使用一些随机头像站点&#…

征稿|IJCAI‘23大模型论坛,DeepMind EleutherAI Oxford主题报告

第一届LLMIJCAI’23 Symposium征稿中&#xff0c;优秀投稿论文推荐《AI Open》&#xff08;EI检索&#xff09;和 《JCST》(CCF-B)发表。 大规模语言模型&#xff08;LLMs&#xff09;&#xff0c;如ChatGPT和GPT-4&#xff0c;以其在自然语言理解和生成方面的卓越能力&#xf…

计算机毕设Python+Vue学生社团管理(程序+LW+部署)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

如何做一个基于微信评选投票小程序系统毕业设计毕设作品

分析架构 我们开发系统&#xff0c;常规有两个架构&#xff0c;一个BS架构&#xff08;浏览器/服务器模式&#xff09;&#xff0c;一个CS&#xff08;客户端/服务器端模式&#xff09;&#xff1b;我们微信小程序项目属于CS架构&#xff0c;C客户端是我们要开发的小程序&…

计算机毕设Python+Vue学生实验报告管理系统(程序+LW+部署)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

大数据毕设 - 校园卡数据分析与可视化(python 大数据)

文章目录 0 前言1 课题介绍2 数据预处理2.1 数据清洗2.2 数据规约 3 模型建立和分析3.1 不同专业、性别的学生与消费能力的关系3.2 消费时间的特征分析 4 Web系统效果展示5 最后 0 前言 &#x1f525; Hi&#xff0c;大家好&#xff0c;这里是丹成学长的毕设系列文章&#xff…

大学生毕设小demo(后台管理系统)

大学生毕设小demo 介绍 使用java和react和mongoDBmySQLredis搭建的一个大学生模板管理系统&#xff0c;功能丰富 可查看线上部署地址点击链接体验功能 一、相关功能&#xff08;都是同步数据库的) 1.数据的基本增删查改 2.用户的登录判断(含token60s有效验证码)&#xff0…

文件名、目录名或卷标语法不正确;AttributeError: module ‘numpy‘ has no attribute ‘long‘;shell脚本:Syntax error: Bad for

1、文件名、目录名或卷标语法不正确; 根据您提供的代码片段&#xff0c;错误出现在makedirs()函数的调用中。这个函数用于创建多层次的目录。 根据代码片段&#xff0c;makedirs()函数的调用是在以下条件满足时发生的&#xff1a; head和tail都不为空。head所代表的路径不存…

大模型-DeltaTuning:①增量式(原模型参数不变,插入可微调参数层)、②指定式(原模型参数冻结一部分参数,微调一部分参数)、③重参数化式(将原模型参数层改造,比如插入低秩)

【随着模型增大,各方案区别不大】 统一框架: 《Towards a Unified View of Parameter-Efficient Transfer Learning》 GitHub - thunlp/PromptPapers: Must-read papers on prompt-based tuning for pre-trained language models. GitHub - thunlp/DeltaPapers: M