阿里云
阿里云多端小程序中小企业获客首选
发表主题 回复主题
  • 1010阅读
  • 0回复

[解决方案]社区系统 Icarus 1.3.0

级别: 论坛版主
发帖
371
云币
447

]2@lyG#<<  
]&='E.f  
(8NE'd8  
开源协议 eG.s|0`  
ZLIB :C&6M79k  
ScT{Tb]9bt  
85A7YraL  
免费且商业友好,这个协议基本上和MIT相同。 /(%!txSNEt  
UzV78^:,iD  
_0iV6Bj  
特性 =66'33l2  
全局 _X{ GZJm  
*A0d0M]cg  
LGYg@DR  
文件上传(七牛云) , $cpm=1  
WZviC_  
YlZ&4   
超宽屏支持 nHLMF7\  
Nr*o RYY  
))7CqN  
简易的移动端支持 *qr>x8OGp  
"_+8z_  
@F|pKf:M+  
实时在线人数 n<A<Xj08T9  
m:9|5W  
gA]3h8%w  
Markdown发帖和评论 ~L_1&q^4!i  
-^< t%{d  
q0nIJ(  
包含主题、评论、百科内容的全文搜索(基于Elasticsearch) +Ur75YPh  
#9HX"<5  
ZdT-  
用户系统 Jpn= ^f[rm  
P9jSLM  
K[Vj+qdyl  
注册、登录 qsYg%Z  
}LoMS<O-[  
onIZ&wrk  
邮件激活 0W)|n9  
-'^:+FU  
c^z) [  
邮箱找回密码 |z0% q2(  
x+[ATZ([  
!L2!:_  
修改个人信息 D&OskM60  
5inCAPXz  
xZVZYvC,t  
上传头像(七牛云) 7zowvE?#  
!Yz CK*av1  
~ ^fb`f+%  
每日签到 v]T?xo~@'  
02-% B~oP  
6lUC$B Y  
个人提醒 dt/-0~U  
i\x@s>@x}  
lWBewnLKE  
论坛 Y3SV6""y/  
\$gA2r  
9ZuKED  
扁平化的内容展示 _`,ZI{.J^  
Q(4~r+  
(B03f$8}*_  
创建和管理板块 $U pWlYwG  
}]^/`n  
3EE_"}H>  
板块主题颜色 N:%Nq8I}:  
,R=$ qi|  
86a,J3C[  
发表和编辑主题 }'Ph^ %ox  
p$` ^A  
qq@]xdl  
文章页动生成快捷导航 Fl}!3k>c  
;j+*}|!  
n'%cO]nSx  
@功能 {Z178sik  
Rm~8n;7oOr  
A=70UL  
百科 fUPYCw6F  
8G3.bi'q   
f*T}Ov4  
自定义侧边栏和主页 P ,rLyx   
7p>T6jK)  
'ITZz n*  
文章的创建和编辑 ] v:"    
d@zxgn7o  
 '{cFr  
全部文章列表 ]cMZ7V^  
;alt%:$n  
o@C|*TXN  
文章历史 Z Z c^~  
3K/]{ dkD  
>t.PU.OM  
随机页面 "#iO{uMWb  
3_T'0x\FP  
]/AU_&  
管理后台 JV+Uy$P!  
mxe\+j#  
A5[kYD,_  
提供对板块、主题、用户、评论的管理 <,H/7Ba  
A>(EM}\,  
D7c+/H@PF  
管理日志 7 Rc/<,X  
6.a>7-K}%  
&]anRT#  
安全机制 `}8)P#  
PAVlZ}kj  
ZY;g)`E1  
前端密码加密,后端不取得用户的初始密码,最大限度降低了中间人攻击和数据库泄露的危害 n"R$b:  
Z$35`:x&h  
kpk ^Uw%f  
后端二次加密,sha512加盐迭代十万次后储存用户密码 $0]5b{i]  
F(,SnSam  
NVDIuh  
密码相关API均有防*破,可设置IP请求间隔和账号请求间隔,分别提升批量撞库和单点*破的难度 P#;pQC  
x26 sH5  
=s S=  
隐私数据,例如IP地址脱敏后才可存入数据库 D^{jXNDNO  
;]rj Kc=  
n9 Jev_!A  
如何部署 'n?"f|G  
内容较多,详见部署文档 4dh> B>Q  
475jmQ{q  
d 5h x%M  
升级指南 = @FT$GQ  
首先停止服务并更新源码。 T{BGg  
paxZlA o  
>PGsY[N  
然后请寻找 backend/misc/upgrade 目录下对应的升级文件,例如1.2升级1.3使用u12-u13.py。 )EN ,Ry  
6-nf+!#G  
UZgrSX {  
在 backend 目录下执行后删除即可。 <F| S<\Y.  
:[Ie0[H/M  
% <h2^H\O  
注意如果使用了 pipenv 或其他虚拟环境,要在项目对应环境中完成这个操作。 ork{a.1-_w  
o K&G  
\,`iu=YZv  
然后分别升级前端项目(根目录)和后端项目(backend目录)的项目依赖。 gER(&L4[  
dBW4%Zh  
g#5t8w  
如该版本无特别的升级说明,此时直接重新开启服务即可。 < -Ax)zE  
=1mIk0H`  
"(:8 $Fb  
规划 W#9LK Jj  
由于空闲时间有限,而且是单枪匹马做整个项目的开发。 D,s[{RW+q  
L_>LxF43  
S's I[?\x  
目前的版本还有一些不完善的地方以及缺少的功能来不及完成,姑且规划如下: -"xC\R  
r;fcBepO  
xf{=~j/L  
近期: PC)V".W 1  
M5]$w]Ny9  
' PmBNT  
收藏、感谢、点赞 P;e@<O  
]T>YYz  
.r-kH&)"GU  
个人中心 gac/%_-HH7  
$tebNi P  
75']fFO@!  
强化移动端体验 .~4DlT  
0O?!fd n  
5OC3:%g  
支持用户对评论进行自删和编辑等操作 $H7T|`WI.,  
/6p7 k  
|C\XU5}  
后续: m pM,&7}  
zMAlZ[DN  
5U(ry6fI=  
多终端同时登录的支持 p%CcD]o  
W; ?'  
F#7A6|  
支持第三方登录 b#_u.vP  
%>:d5"&Lbs  
0S>U_#-  
搭建独立的项目站点 `~ R%}ID  
Iy {&T#e"  
5E\&O%W"  
RSS支持 M'ZA(LVp  
Jgf= yri  
o!|TCwt  
完善tests v iM6q<Ht  
a(eUdGJ  
Vu1X@@z  
pkEqd"G  
如何部署项目 4[m4u6z=  
首先 clone 项目。 *'ex>4^  
:jljM(\  
KN zm)O  
git clone https://github.com/fy0/Icarus.git ADN  
下面逐项照做即可。 )I9Wa*I  
swT/ tesj  
F /% 5 r{  
迫于前端安装node_modules等待时间长,在环境安装完成后,前端篇和后端篇可以一起做,以节省时间。 Q:!.YSB  
M\ {W&o1!  
j`kw2(  
环境依赖篇 [#6Eax,j  
1. Python 3.6+ &5F@u IA  
Windows上直接使用Anaconda3或者官方版本。 l*C(FPw4  
kkE1CHY  
&B5@\Hd;  
Linux上部分发行版(例如ArchLinux)天然满足要求。 2kU=9W6ND  
rZv5>aEI  
'X(G><R9  
对于其他的发行版,首选方案是通过pyenv来安装和管理不同版本的Python: :TzHI    
Iz<}>J B  
Fi^Q]9.@{  
curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash -I#1xJU  
@ \(*pa  
+iYy^oXxw  
# 重新进入终端后,指定版本进行安装 Fn~?YN  
# 或者也可以选择这里不安装,到后面pipenv的时候会有选项自动安装。 L0H kmaH  
pyenv update l|P(S(ikh  
pyenv install 3.6 Rv T>{G~  
来源:https://github.com/pyenv/pyenv wLf=a^c#  
J9 iQW  
Vg)]F+E  
或者使用包管理器安装,这是一个 Debian/Ubuntu 解决方案: 7TjK;w7xS.  
7Bhi72&6  
iCYo?>  
sudo add-apt-repository ppa:deadsnakes/ppa <e 'S'  
sudo apt-get update  v NJ!d  
sudo apt-get install -y python3.6 python3.6-dev python3.6-venv \)pT+QxZ  
sudo su -c "curl https://bootstrap.pypa.io/get-pip.py | python3.6" (Wu_RXfCw_  
2. NodeJS dfBTx6/F  
建议使用LTS版本的 nodejs,通过包管理器安装: Ol9'ZB|R  
gL+8fX2G6  
"&ElKy 7j  
https://nodejs.org/en/download/package-manager/ SqhG\qE{Qj  
> T,^n {_v  
H *gF>1  
curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash - )h0F'MzW  
sudo apt-get install -y nodejs 5X5&(S\  
3. PostgreSQL T _O|gU  
官方提供了一系列操作系统的安装解决方案:https://www.postgresql.org/download/ n)(E 0h  
ZCZYgf@  
ptXLWv`  
Windows下你可以下载安装包,主流Linux可以使用包管理器添加软件源。 ! `yg bI.  
=Zcbfo_&  
NX^%a1D!  
还是以ubuntu举例:https://www.postgresql.org/download/linux/ubuntu/ TM8WaH   
1YmB2h[Z  
VemgG)\  
# 为 ubuntu 18.04 添加 PG 源 _ FcfNF  
sudo su -c "echo 'deb http://apt.postgresql.org/pub/repos/apt/ bionic-pgdg main' > /etc/apt/sources.list.d/pgdg.list" 5sD\4g)HK  
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | \ DbdxHuKa>  
  sudo apt-key add - QQ4  &,d  
sudo apt-get update gOpGwpYZ,  
H=OKm  
M~Yho".  
# 安装PostgreSQL,需要9.6以上版本 ]urrAIK  
sudo apt-get install -y postgresql-10 ,ufB*[~  
装好之后做一些配置 UC)-Fd  
Z_oBZs  
Nb2]}; O  
sudo su postgres 5gV%jQgkC  
psql "=0#pH1o  
# 进入 PQ Shell >z*2Og#1  
CREATE DATABASE icarus; Zs _Jn  
CREATE USER icarus WITH PASSWORD 'IcaruStest123'; K4Mv\!Q<8  
GRANT ALL ON DATABASE icarus TO icarus; 8-Ik .,}  
\c icarus; E"D+CD0  
CREATE EXTENSION IF NOT EXISTS hstore; :zk69P3  
CREATE EXTENSION IF NOT EXISTS citext; FpjpsD~ Qu  
4. Redis sGjYL>*  
一般直接使用包管理器安装就可以了。 \K+LKa)  
_@[M0t}g_  
XOQj?Q7)U  
Windows上可以使用微软提供的二进制版本 VY)!bjW.  
P8jXruZr  
9K*yds  
后端篇 T!.6@g`x>  
建议使用 pipenv 进行部署,首先切到backend目录,执行: +;7Rz_.6f  
f S50  
\hpD  
sudo pip3.6 install pipenv './j<2|;U  
pipenv install .80^c  
不过有个问题就是 pipenv 太慢,总是在 Locking。 b&BSigrvou  
$+eDoI'f  
dALJlRo"  
可以灵活使用 --skip-lock 参数跳过 Locking 阶段。 bq5tEn  
HCHZB*r[  
KlbL<9P >  
或者使用requirements.txt进行比较传统的安装。 x/Pi#Xm  
~C6Qp`VF  
RX.n7Tb  
特别地,在Windows上安装aioredis库时可能会遇到依赖的hiredis包无法安装的问题 ^a~^$PUqI  
如果是anaconda用户,那么可以使用: z}v6!u|iZu  
sr!m   
H~1&hF"d  
conda config --append channels conda-forge   x{IxS?.j+  
conda install hiredis m\~{l=jIS  
来进行安装。 Gj]*_"T  
如果不是anaconda用户,那么可以直接访问 https://anaconda.org/conda-forge/hiredis/files vy?Zz<c;  
直接下载.tar.bz2压缩包把里面的site-packages/hiredis解压出来放到自己的site-packages即可 VmM?KlC  
.Ua|KKK C  
s u]x  
环境装完之后,这样启动服务: 5\Sm^t|Tx  
"*O(3L.c-  
0q`n]NM  
pipenv shell OM,-:H,  
python main.py T/Q#V)Tp  
运行 backend 目录下的 main.py,初次运行会创建自动 private.py 并退出。 D_fgxl  
^mbpt`@  
Jwzkd"D  
private.py 里的内容会覆盖 config.py 中的配置。 K@u\^6419  
.0^-a=/  
5!Y51R^c  
在初次创建后,用编辑器打开,逐项对内容进行修改,使其符合你机器的实际情况即可。 $y~!ePKh  
s,Uc cA@  
CCp&P5[67  
前端篇 .iFd  
# 安装项目依赖 O 4xV "\  
cd Icarus umV5Y`  
npm install |Rk$u  
迫于安装时间过长,国内可以使用cnpm: 4O Lq  
H6Q1r[(B  
|pB[g> ~V  
npm install -g cnpm --registry=https://registry.npm.taobao.org qI,4 uGg  
cnpm install N- E)b  
如果只是开发环境下看看效果,那么在后端已经跑起来的情况下: m:@-]U@ 6  
[hU5ooB  
/8 /2#`3R  
npm run serve HS!O;7s'  
然后在浏览器中查看即可。 V6%J9+DK  
Q)oO*CnM!-  
{VOLUC o 4  
扩展篇:Nginx部署 RM2<%$  
如果需要配置外部访问(注意!只是开发则不需要),可以按如下步骤操作: >*v!2=  
 =lIG#{`Q  
6\4~&+;wL  
我们的目标是将前端挂在某个域名或端口上,然后将后端挂在同一域名的/api下。 9L+dN%C  
Cf#[E~24  
fg1_D  
以此直接绕过同源策略的相关内容,简化配置。这也就是“单端口方案”的含义。 E>xd*23+\  
~5e)h_y  
/DPD,bA  
首先,在 Icarus 目录下新建一个 private.js,并按照下例进行填写: 9Yg=4>#$  
\OMWE/qMy  
$J8?!Xg  
// 单端口方案 f>d aK9$(  
var host = window.location.host g~EJja;  
:sD/IM",},  
,U9gg-.Lp  
export default { }F'B!8n  
    remote: { *z-Mr~ V  
        API_SERVER: '//' + host, =?Y%w%2  
        WS_SERVER: 'ws://' + host + '/ws', WJ)( *1  
    } 8sm8L\-  
} o5(`7XV6D  
npm run build /(#;(]  
生成dist目录备用。 )@"iWQ 3K  
q.]>uBAQ?  
HFV4S]U=  
随后是nginx的配置,当然你要首先安装它。 k)+2+hX&>  
")%)e;V3  
tBSHMz  
我已经写好了配置文件的模板,只要简单改改放进配置目录就可以了。 D,FX&{TYU  
%au2kG,  
[UqJ3@>  
这里使用的是单端口绑定前后端,整站使用 9001 向外网提供服务(但后端仍要对内开一个端口)。 qcYF&  
|)4Fe/!cJ  
SyHS9>  
在将前端静态目录映射到/的同时,将后端所在的9999端口映射到/api。 :Osw4u]JXd  
5r#0/1ym!  
m0I/X$-Cl5  
这样前端页面访问 /api 就是访问后端了,也不存在跨域问题。 cuenDw=eC  
^HpUbZpat)  
!/pE6)a  
sudo apt install nginx &PJ&XTR  
cd Icarus G[34:J  
sudo cp misc/icarus-1port.conf /etc/nginx/conf.d/ #SNwSx&  
随后编辑 /etc/nginx/conf.d/icarus-1port.conf,将 ]w2nVC 3  
n}NO"eF>-s  
(of=hzT^?  
# root /home/{user}/Icarus/dist; tPDd~fOk  
修改为正确的路径,重启服务: s d -5AE  
\F_~?$  
5i 56J1EC  
sudo service nginx restart LQy`,-&  
访问服务器IP的9001端口,就可以看到最上面截图中的画面了。 XE/K|o^Hp  
e;QPn(  
# tN#_<W  
第一个注册的用户将自动成为管理员。 ,MH9e!  
85$W\d  
!3Xu#^Xxj  
扩展篇:开启全文搜索与关联推荐功能 sn.Xvk%75  
这事情简单,首先在机器上安装ES: 7m{YWR0  
p-p]dV  
Aw]W-fx  
https://www.elastic.co/downloads/elasticsearch nYfZ[Q>v  
;xp^F KP  
Kwc~\k  
然后搞到中文分词插件: xMck A<E  
Ni"M.O);t  
IF"-{@  
https://github.com/medcl/elasticsearch-analysis-ik/releases =&kd|o/i  
b:OQ/  
;QVX'?  
并将分词插件解压在ES插件目录,例如your-es-root/plugins/ik,然后把ES开起来: t)O8ON  
l$j/Ye]  
RgF5w<Vd.  
# 超低配版,最小内存256M,最大1G @"B"*z-d  
# 根据自己服务器情况酌情调整参数 hj~nLgpN  
cd elasticsearch-6.5.1 v/\in'H~  
ES_JAVA_OPTS="-Xms256m -Xmx1g" ./bin/elasticsearch *U[Nn5#?  
请注意两者版本需要一一对应,如果ES版本过新(更新非常频繁),后者可能尚未来得及更新。 ups] k?4  
Fo$kD(  
+:JyXF u  
随后在第一次执行main.py自动生成的private.py中修改这一段的内容: p>GTFXEi6  
^xB=d S~  
 X`REhvT  
SEARCH_ENABLE = False Y|NL #F  
ES_INDEX_NAME = 'icarus-index' =wd=TX/  
ES_HOSTS = [{ 9&FFp*'3  
    "host": "localhost", h x _,>\@  
    "port": 9200  L=Pz0  
}] 7'pmW,;  
最省事可以只改一个: =TTk5(m  
nPAVrDg O  
aGUKpYF  
SEARCH_ENABLE = True Zx%ib8| j  
然后在backend目录下运行: u{Z 4M3U  
YlF<S49loC  
e:&+m`OSH  
pipenv shell BCrX>Pp }r  
python3.6 misc/force_refresh_elasticsearch.py sYt\3/yL'  
完成,重启后端进程main.py即可应用。 |oYqkP|  
&zGf`Zi6*%  
(W=J3 ?hn  
项目地址:https://github.com/fy0/Icarus "ggViIOw&  
ZSB_OS[N  
51,RbADB  
[ 此帖被寒喵在2019-01-01 00:15重新编辑 ]
本人不是云栖社区工作人员。
无论您在使用中遇到什么问题,不要出言不逊!谢谢合作!
发表主题 回复主题
« 返回列表上一主题下一主题

限100 字节
如果您在写长篇帖子又不马上发表,建议存为草稿
 
验证问题: 阿里云官网域名是什么? 正确答案:www.aliyun.com
上一个 下一个
      ×
      全新阿里云开发者社区, 去探索开发者的新世界吧!
      一站式的体验,更多的精彩!
      通过下面领域大门,一起探索新的技术世界吧~ (点击图标进入)