Web手Q
Vue全家桶+Socket.io+Express/Koa2æ‰“é€ çš„ç½‘é¡µç‰ˆæ‰‹æœºQQ(web app),高仿手机QQ7.1.0版本。为了方便大家å¦ä¹ ,现在IP定�?接�?�和实时气温接�?�也开放了�?接�?�请在�?�?䏿Ÿ¥çœ‹ã€‚
预览
在线预览地�?�:https://qq.lenshen.com (尽�?使用Chrome�?览器体验最佳效果,�?�外�??供了3个测试账�?�,需�?账�?��?能登录哦)
三个测试账�?�如下:
-
qq:986992484 密�?:111111 (对应昵称是莫知我哀----宇文玥)
-
qq:986992483 密�?:111111 (对应昵称是浅唱低�?�----楚乔)
-
qq:986992482 密�?:111111 (对应昵称是以梦之é“----马哲涵)
æŠ€æœ¯æ ˆ
- Vue2.0:实现�?端页�?�构建
- Vuex:实现�?�?�组件间的状�?共享
- Vue-router:页�?�路由切�?�,实现�?ï¿½é¡µçš„æ ¸å¿ƒ
- vueg:页�?��?�?�场景切�?�效果
- Socket.io:实现实时消�?�推�?
- axios:一个基于
Promise的 HTTP 库,�?��?�端�?�起请求 - Express�?Koa2:开�?�环境使用Express,生产环境使用Koa2
- ES6�?ES7�?ES8:�?务端和客户端�?�使用ES6è¯æ³•,promise/async/await 处�?�异æ¥
- localStorage:本地�?å˜ç”¨æˆ·ä¿¡ï¿½?�
- Webpack:模�?�打包,�?端项目构建工具首选
- SASS(SCSS):CSS预处�?�è¯è¨€
- Flex:flex弹性布局,简�?�适�?手机�?PC端
- CSS3:CSS3过渡动画�?ï¿½æ ·ï¿½?
- IScroll:模拟原生app的列表滚动效果(ListView)
- MySQL:MySQL关系型数�?�库�?久化数�?�(考虑到表与表之间关系�?�?�,需�?多表查询,最�?�?�的时候是å…å¼ è¡¨ï¿½?�查,用MySQL会比Mongodb好得多)
- jsonp:跨域请求数�?�
- pm2:�?务端使用pm2部署,常驻进程,比forever好用得多(https://github.com/Unitech/pm2 )
- nginx:�?务端使用nginx代�?�端�?�转�?�
使用方�?
å…ˆå°†æ ¹ç›®å½•ä¸‹çš„qq.sqlå¯¼å…¥åˆ°ä½ çš„MySQL数�?�库里(�?�以使用Navicat),用户�??为root,登录密�?为空。�?�动MySQL�?务。然�?�使用cnpm install 安装所有�?èµ–(最好用cnpmå®‰è£…ï¼Œå› ä¸ºé¡¹ç›®ï¿½?赖很多,npm用的是国外的镜�?,在网络�?稳定的情况下很有�?�能会导致安装失败,而且下载速度远远慢于国内的cnpm),最�?��?行npm run dev。�?务器部署�?行项目�?�需�?npm run pm2ï¼Œè¿™æ ·å°±ï¿½?�以常驻进程,�?过�?�??是得先全局安装pm2。
目�?已�?实现了QQçš„æ ¸å¿ƒåŠŸèƒ½ï¼Œå¦‚æ¶ˆï¿½?�列表�?好�?�列表�?新朋�?��?好�?�申请�?实时群�?��?实时�?�?��?�?�天设置�?�?蔽对方�?�天�?特别关心�?会员ç‰çº§ï¿½?个性�??片�?æ·»åŠ å¥½ï¿½?��?åˆ é™¤å¥½ï¿½?��?好�?�分组�?查找用户�?登录�?注销�?切�?�用户�?�?�滑显示侧�?�?地�?�定�?�?温度ç‰ç‰ã€‚�?ï¿½æœŸä¼šè€ƒè™‘å¢žåŠ æ›´å¤šåŠŸèƒ½ã€‚å¦‚æžœä½ æƒ³ä½“éªŒå®žæ—¶ï¿½?ï¿½å¤©çš„é…·ç‚«æ•ˆæžœï¼Œé‚£ä¹ˆä½ ï¿½?�以打开两个�?览器,用上�?��?�?�的账�?�登录�?��?�。
截图
- 消�?�页�?�
- �?�系人页�?�
- 群�?�
- �?�?�
分�?
-
�?务端使用ES6è¯æ³•
�?需�?使用babel转�?以�?�一系列的�?置,�?�需�?å°†node�?�级到V8版本,V8已�?很好地支�?了ES6/ES7/ES8ç‰æœ€æ–°ç‰¹æ€§ï¼Œè¿™æ˜¯ç›®ï¿½?最好的办法。�?�级到V8版本,�?�以直接到nodejs䏿–‡ç½‘(http://nodejs.cn/download/) 下载�?��?�,也�?�以使用NVM切�?�node版本。
�?�级到V8�?�,还�?支�?通过import/export关键å—�?�导入导出模�?�(å› ä¸ºï¿½?务端已�?有了CommonJS规范,如果�?使用import/export的�?就有点冲�?了),如果一定�?使用import/export关键å—,这时�?�以在�?务端的入�?ï¿½æ–‡ä»¶é¦–è¡Œæ·»åŠ ä»¥ä¸‹ä»£ï¿½?:
require("babel-core/register")({
presets: ['es2015', 'stage-0']
})
require("babel-polyfill")上�?�的模�?��?�?�以使用import�?�导入,必须使用require,�?�时需�?通过npm安装babel-core�?babel-preset-es2015�?babel-preset-stage-0�?babel-polyfillç‰ï¿½?èµ–ã€‚è¿™æ ·å°±ï¿½?�以愉快地使用import/export了。
�?务端代�?片段如下:
// ES7 async/await
import express from 'express'
import login from '../../controller/login'
const loginRouter = express.Router()
loginRouter
.get('/:user/:pwd', async(req, res) => { // 登录
const result = await login.login(req, res)
res.json(result)
})
export default loginRouter-
Socket.io
�?务端(结�?�Express/Koa):
// Server
import express from 'express'
import http from 'http'
import socketio from 'socket.io'
const app = express()
const server = http.createServer(app)
const io = socketio(server)
server.listen(3000)
io.on('connection', (socket)=>{
socket.emit('news', { hello: 'world' })
socket.on('my other event', function (data) {
console.log(data)
})
})客户端:
// Client
<script src="http://localhost:3000/socket.io/socket.io.js"></script>
<script>
const socket = io.connect('http://localhost:3000')
socket.on('news', (data)=>{
socket.emit('my other event', { my: 'data' })
})
</script>socket.ioæœ€æ ¸å¿ƒçš„ä¸¤ä¸ªapi就是emit å’Œ on了 ,�?务端和客户端都有这两个api。通过 emit å’Œ on�?�以实现�?务器与客户端之间的�?��?�通信。
emit :�?�射一个事件,第一个�?�数为事件�??,第二个�?�数为�?�?��?的数�?�,第三个�?�数为回调函数(如需对方接�?�到信�?��?�立�?�得到确认时,则需�?用到回调函数)。
on :监�?�一个 emit �?�射的事件,第一个�?�数为�?监�?�的事件�??,第二个�?�数为回调函数,用�?�接收对方�?��?�的数�?�,该函数的第一个�?�数为接收的数�?�。
�?务端常用API:
socket.emit():�?�建立该连接的客户端�?��?消�?�
socket.on():监�?�客户端�?��?信�?�
io.to(socketid).emit():�?�指定客户端�?��?消�?�
io.sockets.socket(socketid).emit():�?�指定客户端�?��?消�?�,新版本用io.sockets.socket[socketid].emit() ,数组访问
socket.broadcast.emit():�?�除去建立该连接的客户端的所有客户端广æ’
io.sockets.emit():�?�所有客户端广æ’
客户端常用API:
socket.emit():�?��?务端�?��?消�?�
socket.on():监�?��?务端�?��?�的信�?�
FAQ
若使用的过程ä¸ï¿½?�到问题,�?ï¿½ä»¥åŠ å®˜æ–¹ç¾¤äº¤ï¿½?:611212696。如果觉得�?错,就毫�?�??啬地给个star�?�。�?ï¿½æœŸé¡¹ç›®è¿˜ä¼šç»§ç»æ›´æ–°å’Œå®Œå–„。
�?�动�?�如果报以下错误,请�?�考:https://github.com/lensh/vue-qq/issues/8
Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column \'qq.b.face\' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

Formed in 2009, the Archive Team (not to be confused with the archive.org Archive-It Team) is a rogue archivist collective dedicated to saving copies of rapidly dying or deleted websites for the sake of history and digital heritage. The group is 100% composed of volunteers and interested parties, and has expanded into a large amount of related projects for saving online and digital history.




