ug&wF)~w=vz`p8u)d`=
z6tf6ZCc&piTkd_ThqW>>Uth}17Dp{81yzyYo61o*Fwu+2<|Aw)$Yu>T~#F3yR}wzwPSTIODb-X(l=kLZAg%qE;EekR`2H@
zN2_Uvg7SCTT1UWQdGKZQz06Tc!G)`FaHCeRTdeF-S4H7#A;Eft#sS<`f;BUM^jJBY
z%bb0=0b@&ta!C8cbh5jHQIdAI{I5qZ=??2!S4&MXSooveu
zpaeAi4li9ccmTum2H7_LcR=`^OE{!H75w2s&OHple?ZFi{xmXI>?9M=Sw?0hSTuq4
zb+}88Fi4S};Rf>ht;cKRYzNt``4f8vnU@?1k1(HQtX?Z$#JJ`Y&c&supAVotucnAq
z&gB_ajH7>xiVXO0{;Y}HBT`LON-!iI8qW@tzxsW}ud);rH1^8oSIC4(+{3vZ-eL!m
zpr^e{SHY25297elVFM|q41)p>G3Mrd!!xKKsNG-1g(ei%%Aqrg>MFAMd?MzdHPvc~
z$q)QzR9wPIBvuRXpo_9Q8lLPK9!Y}~!#d6yQ+xN3AqwRm7sED-x_vRrx7~I$$$3O`
zYac4X&AB3PoDTPI$hrr*&Ux+nu0L42Ll4QCwW=bJxxE@7IDFq{6+J!%Bm6
z&!VrfWx>*qiZd4mPKW%!18kEPiG>zSLy!pB13HZ{fZP`7rWXG{&M?5@KXcdU0IvX8
zK~Q=ivHnBL#e#&mpJ1k)Z>9W7sJPq|S!!@+G6ilx{e5OI#Y%{hYdZ1{%5v}ZjJNw3
zqVAw^1P*t(f@8q7zeH+aEJ?xPSwX2l+yt=KbOOUY9D#>^_u~g-vyP2PJV2W^!~KC_
zI5#&psOs_4wGpIw}LCMhAj9|Q7_
zWtD^SJ3hQ8G`&fTew}h&tMqh(49YDoL`0`9*!||wC;3~ImM5F~PcN&MR@of(p(*wP
z%pz(zF4obp*&ggKH?#dmN-1rVHtN)@s_SYJj50_uRG@s*FUj0@NsqscZ`g=PZ7SC_
z)VZ^4opE$|9n)ZDT7c!cfKpQU!o6~43|)aBxkksXpB
zu~!%(8~@*1W7kg-H2xe3#|$#v0M#obETHsxwHja)ECnRpYQe!Vh8v9V=K23Oil)4q
z9^VPyK%^!JoaZr3HY^)__NM-AR*vJ3J9A~>M!*~q9IG_VG??aE1i+Tq2vI~S100YS
zgJXyvu_yEdltLHt3T!T5-G#~0j$mvttNLHvPdJFh%0wN~6HH>yP4!b5tipbF5zmcK
z%URrh4Yr0JHCogh6^40sEGIIw(WG2pRkV2_$?Bo0P>CTtXb1_mC%kh4xu3wOLZ5cu
zIQQrx3XLD&kMhZLlEVrnQzmEG%Cw3NQMDrC;*txqZEhj%)OX-}v?gpS__(o&RDPlv
zs@(ko7>fC$Cd{}RwSRz9sectJg-Iv7r2V}?hbvmlK1J+0Q0{jA
z>2sbKi68#}*e0~__G}Eq)KBvAySN2^JsZCtJj3SWLhs{|%zinGe#gx#DP#H4-=Am-
zTbnge@q0SqgwBFgBKFLU11dv^nf{QYYt7Kk!!X52E$zsCLQO*zm3=0<`g;YRxl4{Z
z4-MTBL*6RAz+!Ed^_zj+VGZyuiKs-N2+!Jr0Ii@AwY2c
zzu#n@3W(=}VPP@^p1r@N@VHEa0E`6~3gaT!-!K#WgS`-SDx8gvN5T^xUDzb657(K-
zB{Z%1zchH#Yg&Ax%n)1Y?i%>&<-Gf=S&eqwUoav(Tp7lrBqoM`Uo
z?A)5hqDDa&7rLbbu_2X*E#mFfiiD(LpULaO-A7<9?PtxZ%
zmtu|0)F)eUyo49}ea!t~NY|%}N4rL*qCn*k4V8a<1a%x$l({lHkH`KM&j0LbVqfNq
zv^H+v$8FwNt{*T@xLIQ;V16-yVS3NbT%G?Zpy
z6;5}P?_Qs0zedQsK5Zzp>)>EPmTpWYn;vnaE+bCg;Gi~~ujy#5NSf)gW|B+DP5{xJ
zX0Myc?V}55FHiml5KeW_NEy8U`uwBrj`oCrRS1s>>^J#7wWh!hxX!8|WArZ}`mwlsFVL_p`B
z>t6@ni18*pHs}Ehu9I}E9RhdyA7F~6ybQN;mR@0$`jl+rO%=XN(dSNF-8=E>`zfk)
zKw#5yN=Ri0N&NLO@vmNzxfBx1@{c7q)}s&3xL=ev{`mcEqo%eoW>p6yH>!W}b%Cb#
zP&GYFpRokqU{YIZ?5=GPGKbCcc8ZAq1O&ktWk_
z{pCTSq#+T{wx@3ZE!e`_1MI^s3vdRO7;1GUZKDyzNJY2Noa
z#NPnN*yok+4wV+^tDo3)PJNO(WR5KG;d+i=ylOPMKDiNM!MpIA{8edU=B_3D+c#+U
zOWSS&nh{O+uNC7>@+`3hzc~*lV`^qgp#m-Vo`1ftMMz8gus@&gp0!~USBlmjCF7C)
zlf%Y6H^pBDy4iwzK<9n{X#wiBg$Z6Mc4wdLR>mu6d3jaB%mPJ-pr{o@>sQH!NpiU8qslf&*iRbdsNiURS7g+*Cz04oblgW#WMq~hQ`1UmiibpT6*-}~
z8zxo{Nus?;&$|n~-36M`$cUA5o;TYVoOqO!q~SnthuGsNQ{)Acj1vs>e;wfe)%7`9
z4vW6c6m{lxwi@#l#j7fnA{4t8h<30&V3dlZjV5l__^P{j-^vmrG-P+0iMkRjhn0_T
zW6oq%PTIU0gKIdPW}^e{JHM%DuN{*NsE!#HsVsobWsO>2{)$_BgfIQpy2F@%PM&u6
zz_7!c-g~C$g>P|FUm;s@O$@R5w2sKg)*<%^^YaX9qkVRp3==5FNA`UjmX0#)9cpuy
z@jd5PXIL%OKdWQL&OESUOxwOVq@`$AI+ATnvWVg9<*@g$(kV-88*7n_8#guAjh7aF
zym1WzG)+p1_Uvjt9gqyKcQEC_CDt>AAGFg>2)TY(dusPuw(iOxFA6M)=RxzBF#zi3
z0gG+~Iaqgr_rq9&M-4y}I?NOyQ3O#trDfSX{i+3dLs~6F)c}X|k2x;UVZ~@Z>H2{V
zDSGLA1qTdc@OiQy9>H)KS#G=#jB@*`l$4NKF?Sd)|5(T?N%sZB50WZM5L$*=AbiI<
zy+9_D8WYgi@1IgIc)yW5!{X#zT?q9EbL|gNW*I^-TxeP$nCezHE|mdR%XzsoK=OkN
z5^p_%FELGROvetcj5Q67;0t1lW@C;*2J>Qc`W56g1U9{4aEh(=T}E`dvV7Rt&?rBE
zUY9hwGxvY*~>fA)6=vnxrsMSOb49r({il~5|a5X#UXs~rPCY_
zE(&09c;IR#etq|i{bAs6q8znPqRNjyxA~$iSufR>Oxu-y1h1)qf0$3yc3-AFO>8K0#Fq_2o>Ilf)(@fz4xYs>3x?ld`WI}|
zOd3Bkx1SO=GWs=8JlEzJ{{p{1gnUL%un{w`@w>*ce#oZD66p+!-Vx6GCBjQjCb3ah
zfn5>*L1s-AhlBOB$su*F82CRxFwOPLrC2Z~gX?4}vKm){L=z?h7VNSa|Wb3{_fb+SJiCX=n
zNBup=IhdJ|5hov?klLT23F~ln7g`QZYFQ~AMpTe20kPe+GW&R8wbNP(?I#tX0?c}4
z-6bAN2EO-PxH!cRQWdU%E9xKRdjR$Uqz?k^?@-LF
zdth-R0tBujvFU~f!3UH8=DQd}K;~@Y13{DL<_-*4OW}raLzZ0g{ecl7wP6t#j5udW
z5!Pv);x3_kGSzTS
zLXdiE#`*W|Rm8^^ZtkCl-S0(x->5_Q!g?2ZjyE;4I~P4|A`w7wB_XBNZ_hzRSYy-p
zzNa)i3?;T6q`Ofkcm=KK{xCzHnbV67vL
zh)U^zwDc$W3l0Ta8TuItHCE0VWxteS*-|8jmOpDYvmK?5Z&MG7WvxgD6NeT#G=x6i
zx{!BDST`qk6|n+r?9H&d*<&RH!uFu+F1xncrEbMCGig!jpSZ_ebv1nh_`fP(-*)oT
zR)y=kGU5;^?Z}-quvRprxc8U%5>~y*Nht<0c;e+8lQRl{T$YEh;@m;UlNAU;0k}`~a
z9=)sTr9r)>inPu=a*e++LhgKGix_w^b!NiT1V8MP%dz8_nl244=NF?=;`kjj#a2%q
z`thA77g0!u47TeE3)Wvh{fU{ys2i;`;|VcCi&?P?@+a=Do(^_&mX+9c_#W-BUk_tA
z63Yvn9HnV)G?%lAJS`}hR5tZyaiW)NBaLdtZGSolI(rgsU3?RcaPaDV;T`V>O+bWd
zxAV=Sq!!!dh{noxO}A+J%9<-31l}*3Y%Lq*SKGgQ^t`0H{Y&@Qrn^A<--lvxz26-j
zGnIQH?G8V#SC7v)!5oFDLOZ;@Yn~~4zkWB!7)@w9m;OAa51QC;iJQa};inTR0-Cx>
zwxlfaV;LlzRnxL)F5JGpu9sFF80TUxsM6>qCa?m<$l%=(H93BO#AQ6Vy};rUoQi=x
zQ5Xpqlhgzd8uNnyz{K7G>t-Z&TaT>j(=Cl9*`Q~ih&d734?#90o)8JK5N;cmbtnwN
z{&o*F!U;z{-WLI7F#slL@n`wLch{YNldhOrW)lEL0ui}))d
LzY)&he}DcT<`}pY
diff --git a/poetize-im-ui/src/App.vue b/poetize-im-ui/src/App.vue
deleted file mode 100644
index 2039c74..0000000
--- a/poetize-im-ui/src/App.vue
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
diff --git a/poetize-im-ui/src/assets/css/animation.css b/poetize-im-ui/src/assets/css/animation.css
deleted file mode 100644
index 5a9dd08..0000000
--- a/poetize-im-ui/src/assets/css/animation.css
+++ /dev/null
@@ -1,161 +0,0 @@
-/* 以my-animation-开头的class */
-[class*=my-animation-] {
- animation-duration: 1s;
- animation-timing-function: ease-out;
- animation-fill-mode: both;
-}
-
-
-.my-animation-slide-top {
- animation-name: slide-top
-}
-
-.my-animation-slide-bottom {
- animation-name: slide-bottom
-}
-
-.my-animation-hideToShow {
- animation-name: hideToShow
-}
-
-
-/* 上移 */
-@keyframes slide-top {
- 0% {
- opacity: 0;
- transform: translateY(-20%)
- }
-
- 100% {
- opacity: 1;
- transform: translateY(0)
- }
-}
-
-/* 下移 */
-@keyframes slide-bottom {
- 0% {
- opacity: 0;
- transform: translateY(20%)
- }
-
- 100% {
- opacity: 1;
- transform: translateY(0)
- }
-}
-
-/* 首图动画:下移 */
-@keyframes header-effect {
- 0% {
- opacity: 0;
- transform: translateY(-50px);
- }
-
- 100% {
- opacity: 1;
- transform: translateY(0);
- }
-}
-
-/* 旋转 */
-@keyframes rotate {
- 0% {
- opacity: 1;
- transform: rotate(0deg);
- }
-
- 100% {
- opacity: 1;
- transform: rotate(360deg);
- }
-}
-
-/* 显示 */
-@keyframes hideToShow {
- from {
- opacity: 0;
- }
-
- to {
- opacity: 1;
- }
-}
-
-/* 下移 */
-@keyframes my-shake {
- 0% {
- opacity: 1;
- transform: translateY(0px);
- }
-
- 30% {
- opacity: 0.5;
- transform: translateY(25px);
- }
-
- 100% {
- opacity: 1;
- transform: translateY(0px);
- }
-}
-
-/* 上移 */
-@keyframes scatter {
- 0% {
- top: 0;
- }
-
- 50% {
- top: -15px;
- }
-
- 100% {
- top: 0;
- }
-}
-
-/* 放大 */
-@keyframes scale {
- 0% {
- transform: scale(1);
- }
-
- 50% {
- transform: scale(1.2);
- }
-
- 100% {
- transform: scale(1);
- }
-}
-
-/* 背景位置移动 */
-@keyframes gradientBG {
- 0% {
- background-position: 0 50%;
- }
-
- 50% {
- background-position: 100% 50%;
- }
-
- 100% {
- background-position: 0 50%;
- }
-}
-
-/* 阴影变化 */
-@keyframes weiYanShadowFlashing {
- 0% {
- box-shadow: none;
- }
-
- 50% {
- box-shadow: 0 0 20px var(--red);
- }
-
- 100% {
- box-shadow: none;
- }
-}
diff --git a/poetize-im-ui/src/assets/css/color.css b/poetize-im-ui/src/assets/css/color.css
deleted file mode 100644
index 6723dd9..0000000
--- a/poetize-im-ui/src/assets/css/color.css
+++ /dev/null
@@ -1,73 +0,0 @@
-:root {
- /* 背景 */
- --background: white;
- --gradualBackground: linear-gradient(to right bottom, #ee7752, #e73c7e, #23a6d5, #23d5ab);
- --gradualBlue: linear-gradient(to right, #23a6d5, #23d5ab);
-
- /* 字体 */
- --fontColor: black;
- /* 边框 */
- --borderColor: rgba(0, 0, 0, 0.5);
- /* 边框 */
- --borderHoverColor: rgba(110, 110, 110, 0.4);
-
- /* 主题背景 */
- --themeBackground: orange;
- /* 主题悬停背景 */
- --gradualRed: linear-gradient(to right, #ff4b2b, #ff416c);
-
- /* 水波纹 */
- --rippleColor: rgba(0, 0, 0, 0.5);
- /* 导航栏字体 */
- --toolbarFont: #333333;
- /* 导航栏背景 */
- --toolbarBackground: rgba(255, 255, 255, 1);
- /* 灰色字体 */
- --greyFont: #797979;
- --maxGreyFont: #595A5A;
- --commentContent: #F7F9FE;
- /* footer背景 */
- --gradientBG: linear-gradient(-90deg, #ee7752, #e73c7e, #23a6d5, #23d5ab);
- /* 透明 */
- --transparent: rgba(0, 0, 0, 0);
- /* 黑色遮罩 */
- --mask: rgba(0, 0, 0, 0.3);
- /* 白色遮罩 */
- --whiteMask: rgba(255, 255, 255, 0.3);
- /* max白色遮罩 */
- --maxWhiteMask: rgba(255, 255, 255, 0.5);
- /* mini黑色遮罩 */
- --miniMask: rgba(0, 0, 0, 0.15);
- /* mini白色遮罩 */
- --miniWhiteMask: rgba(255, 255, 255, 0.15);
- /* 半透明 */
- --translucent: rgba(0, 0, 0, 0.5);
- /* max黑色遮罩 */
- --maxMask: rgba(0, 0, 0, 0.7);
-
- --white: white;
- --maxWhite: #fcfcfc;
- --midWhite: #f3f3f3;
-
- --red: red;
- --lightRed: #ff4b2b;
- --maxLightRed: #ff416c;
- --orangeRed: #EF794F;
-
- --azure: #ECF7FE;
- --blue: rgb(3, 169, 244);
- --messageColor: #cfe7ff;
-
- --imBG: #edeff3;
-
- --lowGray: #cacacb;
- --lightGray: #DDDDDD;
- --maxLightGray: #EEEEEE;
- --maxMaxLightGray: rgba(242, 242, 242, 0.5);
-
- --green: #67C23A;
- --black: black;
- --lightYellow: #F4E1C0;
-
- --globalFont: poetize-font;
-}
diff --git a/poetize-im-ui/src/assets/css/index.css b/poetize-im-ui/src/assets/css/index.css
deleted file mode 100644
index 064bbd6..0000000
--- a/poetize-im-ui/src/assets/css/index.css
+++ /dev/null
@@ -1,82 +0,0 @@
-body {
- color: var(--fontColor);
- font-family: var(--globalFont), serif;
- word-break: break-word;
-}
-
-
-/* 居中 */
-.myCenter {
- display: flex;
- justify-content: center;
- align-items: center;
-}
-
-.transformCenter {
- position: absolute;
- left: 50%;
- top: 50%;
- transform: translate(-50%, -50%);
-}
-
-/* 两边 */
-.myBetween {
- display: flex;
- justify-content: space-between;
- align-items: center;
-}
-
-/* 滚动条 */
-.group-card ::-webkit-scrollbar {
-
-}
-
-.image-list::-webkit-scrollbar {
- display: none;
-}
-
-/* el弹出框样式 */
-.el-message {
- top: 80px !important;
- border: 0;
-}
-
-.el-message * {
- color: var(--white) !important;
- font-weight: 600;
-}
-
-.el-message--success {
- background: var(--themeBackground);
-}
-
-.el-message--warning {
- background: var(--gradientBG);
-}
-
-.el-message--error {
- background: var(--gradualRed);
-}
-
-.message img {
- max-width: 250px !important;
-}
-
-.v-x-scroll {
- overflow: unset;
-}
-
-.n-base-icon.n-dialog__icon {
- display: none;
-}
-
-
-@media screen and (max-width: 400px) {
- .emoji-body {
- max-width: 230px !important;
- }
-
- .n-modal {
- width: 70% !important;
- }
-}
diff --git a/poetize-im-ui/src/components/common/chat.vue b/poetize-im-ui/src/components/common/chat.vue
deleted file mode 100644
index 67cd4cc..0000000
--- a/poetize-im-ui/src/components/common/chat.vue
+++ /dev/null
@@ -1,722 +0,0 @@
-
-
-
-
-
-
- {{friends[currentChatFriendId].remark}}
-
-
-
-
- {{groups[currentChatGroupId].groupName}}
-
-
- 当前在线人数:4
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{$common.getDateDiff(item.createTime)}}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
{{item.username}}
-
-
-
- {{$common.getDateDiff(item.createTime)}}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 💕 投递舔狗日记?
-
-
-
-
-
-
-
-
-
- 💕 鸡汤来咯!
-
-
-
-
-
-
-
- 💕 传教社会语录?
-
-
-
-
-
-
-
- 💕 发射诗词炮弹?
-
-
-
-
-
-
-
- Ctrl+Enter:换行 | Enter:发送
-
- 发送
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/poetize-im-ui/src/components/common/commentBox.vue b/poetize-im-ui/src/components/common/commentBox.vue
deleted file mode 100644
index 67dad0d..0000000
--- a/poetize-im-ui/src/components/common/commentBox.vue
+++ /dev/null
@@ -1,134 +0,0 @@
-
-
-
-
-
-
-
diff --git a/poetize-im-ui/src/components/common/emoji.vue b/poetize-im-ui/src/components/common/emoji.vue
deleted file mode 100644
index 84245ef..0000000
--- a/poetize-im-ui/src/components/common/emoji.vue
+++ /dev/null
@@ -1,83 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/poetize-im-ui/src/components/common/groupInfo.vue b/poetize-im-ui/src/components/common/groupInfo.vue
deleted file mode 100644
index 84c9197..0000000
--- a/poetize-im-ui/src/components/common/groupInfo.vue
+++ /dev/null
@@ -1,385 +0,0 @@
-
-
-
-
-
- {{groups[currentGroupId].groupName}}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 群名称
-
-
- {{groups[currentGroupId].groupName}}
-
-
-
-
-
-
-
-
-
- 群公告
-
-
- {{groups[currentGroupId].notice}}
-
-
-
-
-
-
-
-
-
群简介
-
- {{groups[currentGroupId].introduction}}
-
-
-
-
-
-
-
-
-
-
-
- 发消息
-
-
-
-
- 群设置
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 退出群
-
-
-
-
- 解散群
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{item.username}}
-
-
-
-
-
-
- 管理员
-
-
-
- 禁言
-
-
-
- 解禁
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/poetize-im-ui/src/components/common/proButton.vue b/poetize-im-ui/src/components/common/proButton.vue
deleted file mode 100644
index 7089f8f..0000000
--- a/poetize-im-ui/src/components/common/proButton.vue
+++ /dev/null
@@ -1,68 +0,0 @@
-
-
-
-
-
-
-
diff --git a/poetize-im-ui/src/components/common/treeHole.vue b/poetize-im-ui/src/components/common/treeHole.vue
deleted file mode 100644
index 236f67b..0000000
--- a/poetize-im-ui/src/components/common/treeHole.vue
+++ /dev/null
@@ -1,283 +0,0 @@
-
-
-
- -
-
-
-
-
-
-
-
-
😃 {{treeHole.createTime}}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/poetize-im-ui/src/components/common/uploadPicture.vue b/poetize-im-ui/src/components/common/uploadPicture.vue
deleted file mode 100644
index 1b62f77..0000000
--- a/poetize-im-ui/src/components/common/uploadPicture.vue
+++ /dev/null
@@ -1,174 +0,0 @@
-
-
-
-
-
-
- 一次最多上传{{maxNumber}}张图片,且每张图片不超过{{maxSize}}M!
-
-
-
-
-
-
- 上传
-
-
-
-
-
-
-
-
diff --git a/poetize-im-ui/src/components/index.vue b/poetize-im-ui/src/components/index.vue
deleted file mode 100644
index 2e64024..0000000
--- a/poetize-im-ui/src/components/index.vue
+++ /dev/null
@@ -1,1278 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
{{groups[item].groupName}}
-
- {{groupMessages[item][groupMessages[item].length-1].content.substr(0, 8)}}
-
-
-
-
-
-
-
-
-
-
-
-
-
{{friends[item].remark}}
-
- {{imMessages[item][imMessages[item].length-1].content.substr(0, 8)}}
-
-
-
-
-
-
-
-
-
-
-
-
- {{Object.keys(friends).length}}位联系人
-
-
-
-
-
-
-
-
-
-
- {{item.remark}}
-
-
-
-
-
-
-
-
- {{Object.keys(groups).length}}个群聊
-
-
-
-
-
-
-
-
-
{{item.groupName}}
-
-
-
- 群主
-
-
- 管理员
-
-
-
-
-
-
-
-
-
- 系统消息
-
-
-
-
-
-
-
-
-
- {{item.createTime}}
-
-
- {{item.content}}
-
-
-
-
-
-
-
-
-
-
-
-
- 好友请求
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{item.username}}
-
-
- {{item.remark}} | {{item.createTime}}
-
-
-
-
- 通过
-
-
- 拒绝
-
-
-
-
-
-
-
-
-
-
- {{friends[currentFriendId].remark}}
-
-
-
-
-
-
-
-
-
{{friends[currentFriendId].remark}}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 用户名
- {{friends[currentFriendId].username}}
-
-
-
- 性 别
-
-
-
- 男
-
-
- 女
-
-
- 薛定谔的猫
-
-
-
-
- 简 介
- {{$common.isEmpty(friends[currentFriendId].introduction)?'暂无简介':friends[currentFriendId].introduction}}
-
-
-
-
-
-
-
-
- 发消息
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 修改信息
-
-
-
-
-
-
- 提交
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
请绑定邮箱,接收留言通知
-
-
邮箱:
-
-
验证码:
-
-
密码:
-
-
-
-
-
-
-
-
-
-
-
![]()
-
-
-
-
-
-
-
-
diff --git a/poetize-im-ui/src/hooks/bindEmail.js b/poetize-im-ui/src/hooks/bindEmail.js
deleted file mode 100644
index 96ac521..0000000
--- a/poetize-im-ui/src/hooks/bindEmail.js
+++ /dev/null
@@ -1,163 +0,0 @@
-import {useStore} from 'vuex';
-
-import {useDialog} from 'naive-ui';
-
-import {nextTick} from 'vue';
-
-import {ElMessage} from "element-plus";
-
-import {reactive, getCurrentInstance, onMounted, onBeforeUnmount, watchEffect, toRefs} from 'vue';
-
-export default function () {
- const globalProperties = getCurrentInstance().appContext.config.globalProperties;
- const $common = globalProperties.$common;
- const $http = globalProperties.$http;
- const $constant = globalProperties.$constant;
- const store = useStore();
- const dialog = useDialog();
-
- let bindEmailData = reactive({
- emailVisible: false,
- email: '',
- code: '',
- password: '',
- codeString: "验证码"
- })
-
- let intervalCode = null;
-
- onMounted(() => {
- showEmail();
- })
-
- function showEmail() {
- if (!$common.isEmpty(store.state.currentUser) && $common.isEmpty(store.state.currentUser.email)) {
- //没有绑定邮箱的用户会弹框
- //bindEmailData.emailVisible = true;
- }
- }
-
- function getCode() {
- if (bindEmailData.codeString === "验证码") {
- // 获取验证码
- if ($common.isEmpty(bindEmailData.email)) {
- ElMessage({
- message: "请输入邮箱!",
- type: 'error'
- });
- return;
- }
- if (!(/^\w+@[a-zA-Z0-9]{2,10}(?:\.[a-z]{2,4}){1,3}$/.test(bindEmailData.email))) {
- ElMessage({
- message: "邮箱格式有误!",
- type: 'error'
- });
- return;
- }
-
- $http.get($constant.baseURL + "/user/getCodeForBind", {
- flag: 2,
- place: bindEmailData.email
- })
- .then((res) => {
- ElMessage({
- message: "验证码已发送,请注意查收!",
- type: 'success'
- });
- })
- .catch((error) => {
- ElMessage({
- message: error.message,
- type: 'error'
- });
- });
- bindEmailData.codeString = "30";
- intervalCode = setInterval(() => {
- if (bindEmailData.codeString === "0") {
- clearInterval(intervalCode)
- bindEmailData.codeString = "验证码";
- } else {
- bindEmailData.codeString = (parseInt(bindEmailData.codeString) - 1) + "";
- }
- }, 1000);
- } else {
- ElMessage({
- message: "请稍后再试!",
- type: 'error'
- });
- }
- }
-
- function submitDialog() {
- if ($common.isEmpty(bindEmailData.email)) {
- ElMessage({
- message: "请输入邮箱!",
- type: 'error'
- });
- return;
- }
- if (!(/^\w+@[a-zA-Z0-9]{2,10}(?:\.[a-z]{2,4}){1,3}$/.test(bindEmailData.email))) {
- ElMessage({
- message: "邮箱格式有误!",
- type: 'error'
- });
- return;
- }
- if ($common.isEmpty(bindEmailData.code)) {
- ElMessage({
- message: "请输入验证码!",
- type: 'error'
- });
- return;
- }
- if ($common.isEmpty(bindEmailData.password)) {
- ElMessage({
- message: "请输入密码!",
- type: 'error'
- });
- return;
- }
-
- let params = {
- code: bindEmailData.code.trim(),
- flag: 2,
- place: bindEmailData.email.trim(),
- password: $common.encrypt(bindEmailData.password.trim())
- };
- $http.post($constant.baseURL + "/user/updateSecretInfo", params, false)
- .then((res) => {
- if (!$common.isEmpty(res.data)) {
- ElMessage({
- message: "保存成功!",
- type: 'success'
- });
- store.commit("loadCurrentUser", res.data);
- clearEmailDialog();
- }
- })
- .catch((error) => {
- ElMessage({
- message: error.message,
- type: 'error'
- });
- });
- }
-
- function clearEmailDialog() {
- bindEmailData.password = "";
- bindEmailData.codeString = "验证码";
- if (intervalCode != null) {
- clearInterval(intervalCode);
- intervalCode = null;
- }
- bindEmailData.email = "";
- bindEmailData.code = "";
- bindEmailData.emailVisible = false;
- }
-
- return {
- bindEmailData,
- getCode,
- submitDialog
- }
-}
diff --git a/poetize-im-ui/src/hooks/changeData.js b/poetize-im-ui/src/hooks/changeData.js
deleted file mode 100644
index e16c520..0000000
--- a/poetize-im-ui/src/hooks/changeData.js
+++ /dev/null
@@ -1,229 +0,0 @@
-import {useStore} from 'vuex';
-
-import {useDialog} from 'naive-ui';
-
-import {nextTick} from 'vue';
-
-import {ElMessage} from "element-plus";
-
-import {reactive, getCurrentInstance, onMounted, onBeforeUnmount, watchEffect, toRefs} from 'vue';
-
-export default function (friendData, groupData) {
- const globalProperties = getCurrentInstance().appContext.config.globalProperties;
- const $common = globalProperties.$common;
- const $http = globalProperties.$http;
- const $constant = globalProperties.$constant;
- const store = useStore();
- const dialog = useDialog();
-
- let changeDataData = reactive({
- //修改信息
- changeData: '',
- changeType: null,
- changeModal: false,
-
- avatarType: null,
- avatarPrefix: '',
- showAvatarDialog: false
- })
-
- function closeModal() {
- changeDataData.avatarType = null;
- changeDataData.avatarPrefix = '';
-
- changeDataData.changeData = '';
- changeDataData.changeType = null;
- }
-
- function changeAvatar(type) {
- if (type === 1 || (type === 2 && groupData.groups[groupData.currentGroupId].masterFlag)) {
- closeModal();
- changeDataData.showAvatarDialog = true;
- changeDataData.avatarType = type;
- if (type === 1) {
- changeDataData.avatarPrefix = 'userAvatar';
- } else if (type === 2) {
- changeDataData.avatarPrefix = 'im/groupAvatar';
- }
- }
- }
-
- function changeDataType(type) {
- closeModal();
- changeDataData.changeType = type;
- changeDataData.changeModal = true;
- }
-
- function submitAvatar(avatar) {
- if ($common.isEmpty(avatar)) {
- ElMessage({
- message: "请上传头像!",
- type: 'warning'
- });
- return;
- }
- if (changeDataData.avatarType === 1) {
- let user = {
- avatar: avatar
- };
- $http.post($constant.baseURL + "/user/updateUserInfo", user)
- .then((res) => {
- if (!$common.isEmpty(res.data)) {
- ElMessage({
- message: "修改成功!",
- type: 'success'
- });
- store.commit("loadCurrentUser", res.data);
- closeModal();
- changeDataData.showAvatarDialog = false;
- }
- })
- .catch((error) => {
- ElMessage({
- message: error.message,
- type: 'error'
- });
- });
- } else if (changeDataData.avatarType === 2) {
- $http.post($constant.baseURL + "/imChatGroup/updateGroup", {
- id: groupData.currentGroupId,
- avatar: avatar
- })
- .then((res) => {
- ElMessage({
- message: "修改成功!",
- type: 'success'
- });
- groupData.groups[groupData.currentGroupId].avatar = avatar;
- closeModal();
- changeDataData.showAvatarDialog = false;
- })
- .catch((error) => {
- ElMessage({
- message: error.message,
- type: 'error'
- });
- });
- }
- }
-
- function submitChange() {
- if (changeDataData.changeType === 1) {
- if ($common.isEmpty(changeDataData.changeData)) {
- ElMessage({
- message: "请输入备注!",
- type: 'warning'
- });
- return;
- }
- $http.get($constant.baseURL + "/imChatUserFriend/changeFriend", {
- friendId: friendData.currentFriendId,
- remark: changeDataData.changeData
- })
- .then((res) => {
- ElMessage({
- message: "修改成功!",
- type: 'success'
- });
- friendData.friends[friendData.currentFriendId].remark = changeDataData.changeData;
- closeModal();
- changeDataData.changeModal = false;
- })
- .catch((error) => {
- ElMessage({
- message: error.message,
- type: 'error'
- });
- });
- } else if (changeDataData.changeType === 2) {
- if ($common.isEmpty(changeDataData.changeData)) {
- ElMessage({
- message: "请输入群名称!",
- type: 'warning'
- });
- return;
- }
- $http.post($constant.baseURL + "/imChatGroup/updateGroup", {
- id: groupData.currentGroupId,
- groupName: changeDataData.changeData
- })
- .then((res) => {
- ElMessage({
- message: "修改成功!",
- type: 'success'
- });
- groupData.groups[groupData.currentGroupId].groupName = changeDataData.changeData;
- closeModal();
- changeDataData.changeModal = false;
- })
- .catch((error) => {
- ElMessage({
- message: error.message,
- type: 'error'
- });
- });
- } else if (changeDataData.changeType === 3) {
- if ($common.isEmpty(changeDataData.changeData)) {
- ElMessage({
- message: "请输入群公告!",
- type: 'warning'
- });
- return;
- }
- $http.post($constant.baseURL + "/imChatGroup/updateGroup", {
- id: groupData.currentGroupId,
- notice: changeDataData.changeData
- })
- .then((res) => {
- ElMessage({
- message: "修改成功!",
- type: 'success'
- });
- groupData.groups[groupData.currentGroupId].notice = changeDataData.changeData;
- closeModal();
- changeDataData.changeModal = false;
- })
- .catch((error) => {
- ElMessage({
- message: error.message,
- type: 'error'
- });
- });
- } else if (changeDataData.changeType === 4) {
- if ($common.isEmpty(changeDataData.changeData)) {
- ElMessage({
- message: "请输入群简介!",
- type: 'warning'
- });
- return;
- }
- $http.post($constant.baseURL + "/imChatGroup/updateGroup", {
- id: groupData.currentGroupId,
- introduction: changeDataData.changeData
- })
- .then((res) => {
- ElMessage({
- message: "修改成功!",
- type: 'success'
- });
- groupData.groups[groupData.currentGroupId].introduction = changeDataData.changeData;
- closeModal();
- changeDataData.changeModal = false;
- })
- .catch((error) => {
- ElMessage({
- message: error.message,
- type: 'error'
- });
- });
- }
- }
-
- return {
- changeDataData,
- changeAvatar,
- changeDataType,
- submitAvatar,
- submitChange
- }
-}
diff --git a/poetize-im-ui/src/hooks/friend.js b/poetize-im-ui/src/hooks/friend.js
deleted file mode 100644
index 61bf106..0000000
--- a/poetize-im-ui/src/hooks/friend.js
+++ /dev/null
@@ -1,118 +0,0 @@
-import {useStore} from 'vuex';
-
-import {useDialog} from 'naive-ui';
-
-import {nextTick} from 'vue';
-
-import {ElMessage} from "element-plus";
-
-import {reactive, getCurrentInstance, onMounted, onBeforeUnmount, watchEffect, toRefs} from 'vue';
-
-export default function () {
- const globalProperties = getCurrentInstance().appContext.config.globalProperties;
- const $common = globalProperties.$common;
- const $http = globalProperties.$http;
- const $constant = globalProperties.$constant;
- const store = useStore();
- const dialog = useDialog();
-
- let friendData = reactive({
- //好友请求
- friendRequests: [],
- //好友列表
- friends: {},
- //当前朋友信息
- currentFriendId: null
- })
-
- async function getImFriend() {
- await $http.get($constant.baseURL + "/imChatUserFriend/getFriend", {friendStatus: 1})
- .then((res) => {
- if (!$common.isEmpty(res.data)) {
- res.data.forEach(friend => {
- friendData.friends[friend.friendId] = friend;
- });
- }
- })
- .catch((error) => {
- ElMessage({
- message: error.message,
- type: 'error'
- });
- });
- }
-
- function removeFriend(currentFriendId) {
- dialog.error({
- title: '警告',
- content: '你确定删除' + friendData.friends[currentFriendId].remark + '?',
- positiveText: '确定',
- onPositiveClick: () => {
- $http.get($constant.baseURL + "/imChatUserFriend/changeFriend", {
- friendId: currentFriendId,
- friendStatus: -1
- })
- .then((res) => {
- delete friendData.friends[currentFriendId];
- friendData.currentFriendId = null;
- ElMessage({
- message: "删除成功!",
- type: 'success'
- });
- })
- .catch((error) => {
- ElMessage({
- message: error.message,
- type: 'error'
- });
- });
- }
- });
- }
-
- function getFriendRequests() {
- $http.get($constant.baseURL + "/imChatUserFriend/getFriend", {friendStatus: 0})
- .then((res) => {
- if (!$common.isEmpty(res.data)) {
- friendData.friendRequests = res.data;
- ElMessage({
- message: "您有好友申请待处理!",
- showClose: true,
- type: 'success',
- duration: 0
- });
- }
- })
- .catch((error) => {
- ElMessage({
- message: error.message,
- type: 'error'
- });
- });
- }
-
- function changeFriendStatus(friendId, status, index) {
- $http.get($constant.baseURL + "/imChatUserFriend/changeFriend", {friendId: friendId, friendStatus: status})
- .then((res) => {
- friendData.friendRequests.splice(index, 1);
- ElMessage({
- message: "修改成功!",
- type: 'success'
- });
- })
- .catch((error) => {
- ElMessage({
- message: error.message,
- type: 'error'
- });
- });
- }
-
- return {
- friendData,
- getImFriend,
- removeFriend,
- getFriendRequests,
- changeFriendStatus
- }
-}
diff --git a/poetize-im-ui/src/hooks/friendCircle.js b/poetize-im-ui/src/hooks/friendCircle.js
deleted file mode 100644
index 60f0bf8..0000000
--- a/poetize-im-ui/src/hooks/friendCircle.js
+++ /dev/null
@@ -1,168 +0,0 @@
-import {useStore} from 'vuex';
-
-import {useDialog} from 'naive-ui';
-
-import {nextTick} from 'vue';
-
-import {ElMessage} from "element-plus";
-
-import {reactive, getCurrentInstance, onMounted, onBeforeUnmount, watchEffect, toRefs} from 'vue';
-
-export default function () {
- const globalProperties = getCurrentInstance().appContext.config.globalProperties;
- const $common = globalProperties.$common;
- const $http = globalProperties.$http;
- const $constant = globalProperties.$constant;
- const store = useStore();
- const dialog = useDialog();
-
- let friendCircleData = reactive({
- showFriendCircle: false,
- treeHoleList: [],
- weiYanDialogVisible: false,
- isPublic: true,
- weiYanAvatar: '',
- weiYanUsername: '',
- pagination: {
- current: 1,
- size: 10,
- total: 0,
- userId: null
- }
- })
-
- function launch() {
- friendCircleData.weiYanDialogVisible = true;
- }
-
- function openFriendCircle(userId, avatar, username) {
- friendCircleData.pagination.userId = userId;
- friendCircleData.weiYanAvatar = avatar;
- friendCircleData.weiYanUsername = username;
- getWeiYan();
- }
-
- function deleteTreeHole(id) {
- dialog.error({
- title: '警告',
- content: '确定删除?',
- positiveText: '确定',
- onPositiveClick: () => {
- $http.get($constant.baseURL + "/weiYan/deleteWeiYan", {id: id})
- .then((res) => {
- ElMessage({
- message: "删除成功!",
- type: 'success'
- });
- friendCircleData.pagination.current = 1;
- friendCircleData.pagination.size = 10;
- friendCircleData.treeHoleList = [];
- getWeiYan();
- })
- .catch((error) => {
- ElMessage({
- message: error.message,
- type: 'error'
- });
- });
- }
- });
- }
-
- function getWeiYan() {
- $http.post($constant.baseURL + "/weiYan/listWeiYan", friendCircleData.pagination)
- .then((res) => {
- if (!$common.isEmpty(res.data)) {
- res.data.records.forEach(c => {
- c.content = c.content.replace(/\n{2,}/g, '');
- c.content = c.content.replace(/\n/g, '
');
- c.content = $common.faceReg(c.content);
- c.content = $common.pictureReg(c.content);
- });
- friendCircleData.treeHoleList = friendCircleData.treeHoleList.concat(res.data.records);
- friendCircleData.pagination.total = res.data.total;
- friendCircleData.showFriendCircle = true;
- }
- })
- .catch((error) => {
- ElMessage({
- message: error.message,
- type: 'error'
- });
- });
- }
-
- function submitWeiYan(content) {
- let weiYan = {
- content: content,
- isPublic: friendCircleData.isPublic
- };
-
- $http.post($constant.baseURL + "/weiYan/saveWeiYan", weiYan)
- .then((res) => {
- friendCircleData.pagination.current = 1;
- friendCircleData.pagination.size = 10;
- friendCircleData.treeHoleList = [];
- friendCircleData.weiYanDialogVisible = false;
- getWeiYan();
- })
- .catch((error) => {
- ElMessage({
- message: error.message,
- type: 'error'
- });
- });
- }
-
- function cleanFriendCircle() {
- friendCircleData.pagination = {
- current: 1,
- size: 10,
- total: 0,
- userId: null
- };
- friendCircleData.weiYanAvatar = '';
- friendCircleData.weiYanUsername = '';
- friendCircleData.treeHoleList = [];
- friendCircleData.showFriendCircle = false;
- }
-
- function pageWeiYan() {
- friendCircleData.pagination.current = friendCircleData.pagination.current + 1;
- getWeiYan();
- }
-
- function addFriend() {
- dialog.success({
- title: '好友申请',
- content: '确认提交好友申请,添加 ' + friendCircleData.weiYanUsername + ' 为好友?',
- positiveText: '确定',
- onPositiveClick: () => {
- $http.get($constant.baseURL + "/imChatUserFriend/addFriend", {friendId: friendCircleData.pagination.userId})
- .then((res) => {
- ElMessage({
- message: "提交成功!",
- type: 'success'
- });
- })
- .catch((error) => {
- ElMessage({
- message: error.message,
- type: 'error'
- });
- });
- }
- });
- }
-
- return {
- friendCircleData,
- launch,
- openFriendCircle,
- deleteTreeHole,
- submitWeiYan,
- pageWeiYan,
- cleanFriendCircle,
- addFriend
- }
-}
diff --git a/poetize-im-ui/src/hooks/group.js b/poetize-im-ui/src/hooks/group.js
deleted file mode 100644
index 82702ef..0000000
--- a/poetize-im-ui/src/hooks/group.js
+++ /dev/null
@@ -1,98 +0,0 @@
-import {useStore} from 'vuex';
-
-import {useDialog} from 'naive-ui';
-
-import {nextTick} from 'vue';
-
-import {ElMessage} from "element-plus";
-
-import {reactive, getCurrentInstance, onMounted, onBeforeUnmount, watchEffect, toRefs} from 'vue';
-
-export default function () {
- const globalProperties = getCurrentInstance().appContext.config.globalProperties;
- const $common = globalProperties.$common;
- const $http = globalProperties.$http;
- const $constant = globalProperties.$constant;
- const store = useStore();
- const dialog = useDialog();
-
- let groupData = reactive({
- //群组列表
- groups: {},
- //当前群信息
- currentGroupId: null
- })
-
- function exitGroup(currentGroupId) {
- $http.get($constant.baseURL + "/imChatGroupUser/quitGroup", {id: currentGroupId})
- .then((res) => {
- delete groupData.groups[currentGroupId];
- groupData.currentGroupId = null;
- ElMessage({
- message: "退群成功!",
- type: 'success'
- });
- })
- .catch((error) => {
- ElMessage({
- message: error.message,
- type: 'error'
- });
- });
- }
-
- function dissolveGroup(currentGroupId) {
- $http.get($constant.baseURL + "/imChatGroup/deleteGroup", {id: currentGroupId})
- .then((res) => {
- delete groupData.groups[currentGroupId];
- groupData.currentGroupId = null;
- ElMessage({
- message: "解散群成功!",
- type: 'success'
- });
- })
- .catch((error) => {
- ElMessage({
- message: error.message,
- type: 'error'
- });
- });
- }
-
- async function getImGroup() {
- await $http.get($constant.baseURL + "/imChatGroup/listGroup")
- .then((res) => {
- if (!$common.isEmpty(res.data)) {
- res.data.forEach(group => {
- groupData.groups[group.id] = group;
- });
- }
- })
- .catch((error) => {
- ElMessage({
- message: error.message,
- type: 'error'
- });
- });
- }
-
- function addGroupTopic() {
- $http.get($constant.baseURL + "/imChatGroup/addGroupTopic", {id: groupData.currentGroupId})
- .then((res) => {
- })
- .catch((error) => {
- ElMessage({
- message: error.message,
- type: 'error'
- });
- });
- }
-
- return {
- groupData,
- getImGroup,
- addGroupTopic,
- exitGroup,
- dissolveGroup
- }
-}
diff --git a/poetize-im-ui/src/hooks/imUtil.js b/poetize-im-ui/src/hooks/imUtil.js
deleted file mode 100644
index 2c437bb..0000000
--- a/poetize-im-ui/src/hooks/imUtil.js
+++ /dev/null
@@ -1,153 +0,0 @@
-import {useStore} from 'vuex';
-
-import {useDialog} from 'naive-ui';
-
-import {nextTick} from 'vue';
-
-import {ElMessage} from "element-plus";
-
-import {reactive, getCurrentInstance, onMounted, onBeforeUnmount, watchEffect, toRefs} from 'vue';
-
-export default function () {
- const globalProperties = getCurrentInstance().appContext.config.globalProperties;
- const $common = globalProperties.$common;
- const $http = globalProperties.$http;
- const $constant = globalProperties.$constant;
- const store = useStore();
- const dialog = useDialog();
-
- let imUtilData = reactive({
- //系统消息
- systemMessages: [],
- showBodyLeft: true,
- //表情包
- imageList: []
- })
-
- onMounted(() => {
- if ($common.mobile()) {
- $(".friend-aside").click(function () {
- imUtilData.showBodyLeft = true;
- mobileRight();
- });
-
- $(".body-right").click(function () {
- imUtilData.showBodyLeft = false;
- mobileRight();
- });
- }
- mobileRight();
- })
-
- function changeAside() {
- imUtilData.showBodyLeft = !imUtilData.showBodyLeft;
- mobileRight();
- }
-
- function mobileRight() {
- if (imUtilData.showBodyLeft && $common.mobile()) {
- $(".body-right").addClass("mobile-right");
- } else if (!imUtilData.showBodyLeft && $common.mobile()) {
- $(".body-right").removeClass("mobile-right");
- }
- }
-
- function getSystemMessages() {
- $http.get($constant.baseURL + "/imChatUserMessage/listSystemMessage")
- .then((res) => {
- if (!$common.isEmpty(res.data) && !$common.isEmpty(res.data.records)) {
- imUtilData.systemMessages = res.data.records;
- }
- })
- .catch((error) => {
- ElMessage({
- message: error.message,
- type: 'error'
- });
- });
- }
-
- function hiddenBodyLeft() {
- if ($common.mobile()) {
- $(".body-right").click(function () {
- imUtilData.showBodyLeft = false;
- mobileRight();
- });
- }
- }
-
- function imgShow() {
- $(".message img").click(function () {
- let src = $(this).attr("src");
- $("#bigImg").attr("src", src);
-
- /** 获取当前点击图片的真实大小,并显示弹出层及大图 */
- $("
").attr("src", src).load(function () {
- let windowW = $(window).width();//获取当前窗口宽度
- let windowH = $(window).height();//获取当前窗口高度
- let realWidth = this.width;//获取图片真实宽度
- let realHeight = this.height;//获取图片真实高度
- let imgWidth, imgHeight;
- let scale = 0.8;//缩放尺寸,当图片真实宽度和高度大于窗口宽度和高度时进行缩放
-
- if (realHeight > windowH * scale) {//判断图片高度
- imgHeight = windowH * scale;//如大于窗口高度,图片高度进行缩放
- imgWidth = imgHeight / realHeight * realWidth;//等比例缩放宽度
- if (imgWidth > windowW * scale) {//如宽度仍大于窗口宽度
- imgWidth = windowW * scale;//再对宽度进行缩放
- }
- } else if (realWidth > windowW * scale) {//如图片高度合适,判断图片宽度
- imgWidth = windowW * scale;//如大于窗口宽度,图片宽度进行缩放
- imgHeight = imgWidth / realWidth * realHeight;//等比例缩放高度
- } else {//如果图片真实高度和宽度都符合要求,高宽不变
- imgWidth = realWidth;
- imgHeight = realHeight;
- }
- $("#bigImg").css("width", imgWidth);//以最终的宽度对图片缩放
-
- let w = (windowW - imgWidth) / 2;//计算图片与窗口左边距
- let h = (windowH - imgHeight) / 2;//计算图片与窗口上边距
- $("#innerImg").css({"top": h, "left": w});//设置top和left属性
- $("#outerImg").fadeIn("fast");//淡入显示
- });
-
- $("#outerImg").click(function () {//再次点击淡出消失弹出层
- $(this).fadeOut("fast");
- });
- });
- }
-
- function getImageList() {
- $http.get($constant.baseURL + "/resource/getImageList")
- .then((res) => {
- if (!$common.isEmpty(res.data)) {
- imUtilData.imageList = res.data;
- }
- })
- .catch((error) => {
- ElMessage({
- message: error.message,
- type: 'error'
- });
- });
- }
-
- function parseMessage(content) {
- content = content.replace(/\n{2,}/g, '');
- content = content.replace(/\n/g, '
');
- content = $common.faceReg(content);
- content = $common.pictureReg(content);
- return content;
- }
-
- return {
- imUtilData,
- changeAside,
- mobileRight,
- getSystemMessages,
- hiddenBodyLeft,
- imgShow,
- getImageList,
- parseMessage
- }
-}
diff --git a/poetize-im-ui/src/main.js b/poetize-im-ui/src/main.js
deleted file mode 100644
index 91035d6..0000000
--- a/poetize-im-ui/src/main.js
+++ /dev/null
@@ -1,100 +0,0 @@
-import {createApp} from 'vue'
-import App from './App.vue'
-import router from './router'
-import store from './store'
-import {
- create,
- NAvatar,
- NInput,
- NIcon,
- NTag,
- NDivider,
- NButton,
- NDrawer,
- NCard,
- NTabs,
- NTabPane,
- NSwitch,
- NModal,
- NBadge,
- NPopover,
- NImage,
- NPopconfirm
-} from 'naive-ui'
-
-import {
- ElUpload,
- ElButton,
- ElRadioGroup,
- ElRadioButton
-} from 'element-plus'
-import 'element-plus/dist/index.css'
-
-import http from './utils/request'
-import common from './utils/common'
-import constant from './utils/constant'
-
-import 'vfonts/FiraCode.css'
-import './assets/css/index.css'
-import './assets/css/color.css'
-import './assets/css/animation.css'
-
-const naive = create({
- components: [NAvatar, NInput, NIcon, NTag, NDivider, NButton,
- NDrawer, NCard, NTabs, NTabPane, NSwitch, NModal, NBadge,
- NPopover, NImage, NPopconfirm]
-})
-
-const app = createApp(App)
-app.use(router)
-app.use(store)
-app.use(naive)
-
-app.component(ElUpload.name, ElUpload)
-app.component(ElButton.name, ElButton)
-app.component(ElRadioGroup.name, ElRadioGroup)
-app.component(ElRadioButton.name, ElRadioButton)
-
-app.config.globalProperties.$http = http
-app.config.globalProperties.$common = common
-app.config.globalProperties.$constant = constant
-
-router.beforeEach((to, from, next) => {
- if (to.meta.requiresAuth) {
- if (to.path === "/") {
- if (typeof to.query.defaultStoreType !== "undefined") {
- localStorage.setItem("defaultStoreType", to.query.defaultStoreType);
- }
- if (typeof to.query.userToken !== "undefined") {
- let userToken = to.query.userToken;
- const xhr = new XMLHttpRequest();
- xhr.open('post', constant.baseURL + "/user/token", false);
- xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
- xhr.send("userToken=" + userToken);
- let result = JSON.parse(xhr.responseText);
- if (!common.isEmpty(result) && result.code === 200) {
- store.commit("loadCurrentUser", result.data);
- localStorage.setItem("userToken", result.data.accessToken);
- window.location.href = constant.imURL;
- next();
- } else {
- window.location.href = constant.webBaseURL;
- }
- } else if (Boolean(localStorage.getItem("userToken"))) {
- next();
- } else {
- window.location.href = constant.webBaseURL;
- }
- } else {
- if (Boolean(localStorage.getItem("userToken"))) {
- next();
- } else {
- window.location.href = constant.webBaseURL;
- }
- }
- } else {
- next();
- }
-})
-
-app.mount('#app')
diff --git a/poetize-im-ui/src/router/index.js b/poetize-im-ui/src/router/index.js
deleted file mode 100644
index 887fdea..0000000
--- a/poetize-im-ui/src/router/index.js
+++ /dev/null
@@ -1,20 +0,0 @@
-import {createRouter, createWebHistory} from 'vue-router'
-import constant from "../utils/constant";
-
-const routes = [
- {
- path: "/",
- meta: {requiresAuth: true},
- component: () => import('../components/index')
- }
-]
-
-const router = createRouter({
- history: createWebHistory(constant.webHistory),
- routes,
- scrollBehavior(to, from, savedPosition) {
- return {left: 0, top: 0};
- }
-})
-
-export default router
diff --git a/poetize-im-ui/src/store/index.js b/poetize-im-ui/src/store/index.js
deleted file mode 100644
index d07fc47..0000000
--- a/poetize-im-ui/src/store/index.js
+++ /dev/null
@@ -1,23 +0,0 @@
-import {createStore} from 'vuex'
-
-
-export default createStore({
- state: {
- currentUser: JSON.parse(localStorage.getItem("currentUser") || '{}'),
- sysConfig: JSON.parse(localStorage.getItem("sysConfig") || '{}')
- },
- getters: {},
- mutations: {
- loadCurrentUser(state, user) {
- state.currentUser = user;
- localStorage.setItem("currentUser", JSON.stringify(user));
- },
- loadSysConfig(state, sysConfig) {
- state.sysConfig = sysConfig;
- localStorage.setItem("sysConfig", JSON.stringify(sysConfig));
- }
- },
- actions: {},
- modules: {},
- plugins: []
-})
diff --git a/poetize-im-ui/src/utils/ajaxUpload.js b/poetize-im-ui/src/utils/ajaxUpload.js
deleted file mode 100644
index d302f1f..0000000
--- a/poetize-im-ui/src/utils/ajaxUpload.js
+++ /dev/null
@@ -1,75 +0,0 @@
-import common from './common'
-
-function getError(
- action,
- option,
- xhr
-) {
- let msg
- if (xhr.response) {
- msg = `${xhr.response.error || xhr.response}`
- } else if (xhr.responseText) {
- msg = `${xhr.responseText}`
- } else {
- msg = `fail to ${action} ${xhr.status}`
- }
-
- return new Error(msg)
-}
-
-function getBody(xhr) {
- const text = xhr.responseText || xhr.response
- if (!text) {
- return text
- }
-
- try {
- return JSON.parse(text)
- } catch {
- return text
- }
-}
-
-export default function (option) {
- const xhr = new XMLHttpRequest()
- const action = option.action
-
- const formData = new FormData()
- if (option.data) {
- for (const [key, value] of Object.entries(option.data)) {
- if (Array.isArray(value)) formData.append(key, ...value)
- else formData.append(key, value)
- }
- }
- formData.append(option.filename, option.file, option.file.name)
-
- xhr.addEventListener('error', () => {
- option.onError(getError(action, option, xhr))
- })
-
- xhr.addEventListener('load', () => {
- if (xhr.status < 200 || xhr.status >= 300) {
- return option.onError(getError(action, option, xhr))
- }
- option.onSuccess(getBody(xhr))
- })
-
- xhr.open(option.method, action, true)
-
- if (option.withCredentials && 'withCredentials' in xhr) {
- xhr.withCredentials = true
- }
-
- const headers = option.headers || {}
- if (headers instanceof Headers) {
- headers.forEach((value, key) => xhr.setRequestHeader(key, value))
- } else {
- for (const [key, value] of Object.entries(headers)) {
- if (common.isEmpty(value)) continue
- xhr.setRequestHeader(key, value)
- }
- }
-
- xhr.send(formData)
- return xhr
-}
diff --git a/poetize-im-ui/src/utils/common.js b/poetize-im-ui/src/utils/common.js
deleted file mode 100644
index 7df20c9..0000000
--- a/poetize-im-ui/src/utils/common.js
+++ /dev/null
@@ -1,168 +0,0 @@
-import constant from "./constant";
-import CryptoJS from 'crypto-js';
-import store from '../store';
-import {ElMessage} from "element-plus";
-
-export default {
- /**
- * 判断设备
- */
- mobile() {
- let flag = navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i);
- return flag && flag.length && flag.length > 0;
- },
-
- /**
- * 判断是否为空
- */
- isEmpty(value) {
- if (typeof value === "undefined" || value === null || (typeof value === "string" && value.trim() === "") || (Array.prototype.isPrototypeOf(value) && value.length === 0) || (Object.prototype.isPrototypeOf(value) && Object.keys(value).length === 0)) {
- return true;
- } else {
- return false;
- }
- },
-
- /**
- * 加密
- */
- encrypt(plaintText) {
- let options = {
- mode: CryptoJS.mode.ECB,
- padding: CryptoJS.pad.Pkcs7
- };
- let key = CryptoJS.enc.Utf8.parse(constant.cryptojs_key);
- let encryptedData = CryptoJS.AES.encrypt(plaintText, key, options);
- return encryptedData.toString().replace(/\//g, "_").replace(/\+/g, "-");
- },
-
- /**
- * 解密
- */
- decrypt(encryptedBase64Str) {
- let val = encryptedBase64Str.replace(/\-/g, '+').replace(/_/g, '/');
- let options = {
- mode: CryptoJS.mode.ECB,
- padding: CryptoJS.pad.Pkcs7
- };
- let key = CryptoJS.enc.Utf8.parse(constant.cryptojs_key);
- let decryptedData = CryptoJS.AES.decrypt(val, key, options);
- return CryptoJS.enc.Utf8.stringify(decryptedData);
- },
-
- /**
- * 表情包转换
- */
- faceReg(content) {
- content = content.replace(/\[[^\[^\]]+\]/g, (word) => {
- let index = constant.emojiList.indexOf(word.replace("[", "").replace("]", ""));
- if (index > -1) {
- let url = store.state.sysConfig['webStaticResourcePrefix'] + "emoji/q" + (index + 1) + ".gif";
- return '
';
- } else {
- return word;
- }
- });
- return content;
- },
-
- /**
- * 图片转换
- */
- pictureReg(content) {
- content = content.replace(/\[[^\[^\]]+\]/g, (word) => {
- let index = word.indexOf(",");
- if (index > -1) {
- let arr = word.replace("[", "").replace("]", "").split(",");
- return '
';
- } else {
- return word;
- }
- });
- return content;
- },
-
- /**
- * 字符串转换为时间戳
- */
- getDateTimeStamp(dateStr) {
- return Date.parse(dateStr.replace(/-/gi, "/"));
- },
-
- getDateDiff(dateStr) {
- let publishTime = Date.parse(dateStr.replace(/-/gi, "/")) / 1000,
- d_seconds,
- d_minutes,
- d_hours,
- d_days,
- timeNow = Math.floor(new Date().getTime() / 1000),
- d,
- date = new Date(publishTime * 1000),
- Y = date.getFullYear(),
- M = date.getMonth() + 1,
- D = date.getDate(),
- H = date.getHours(),
- m = date.getMinutes(),
- s = date.getSeconds();
- //小于10的在前面补0
- if (M < 10) {
- M = '0' + M;
- }
- if (D < 10) {
- D = '0' + D;
- }
- if (H < 10) {
- H = '0' + H;
- }
- if (m < 10) {
- m = '0' + m;
- }
- if (s < 10) {
- s = '0' + s;
- }
- d = timeNow - publishTime;
- d_days = Math.floor(d / 86400);
- d_hours = Math.floor(d / 3600);
- d_minutes = Math.floor(d / 60);
- d_seconds = Math.floor(d);
- if (d_days > 0 && d_days < 3) {
- return d_days + '天前';
- } else if (d_days <= 0 && d_hours > 0) {
- return d_hours + '小时前';
- } else if (d_hours <= 0 && d_minutes > 0) {
- return d_minutes + '分钟前';
- } else if (d_seconds < 60) {
- if (d_seconds <= 0) {
- return '刚刚发表';
- } else {
- return d_seconds + '秒前';
- }
- } else if (d_days >= 3 && d_days < 30) {
- return M + '-' + D + ' ' + H + ':' + m;
- } else if (d_days >= 30) {
- return Y + '-' + M + '-' + D + ' ' + H + ':' + m;
- }
- },
-
- /**
- * 保存资源
- */
- saveResource(that, type, path, size, mimeType, originalName, storeType) {
- let resource = {
- type: type,
- path: path,
- size: size,
- mimeType: mimeType,
- storeType: storeType,
- originalName: originalName
- };
-
- that.$http.post(that.$constant.baseURL + "/resource/saveResource", resource)
- .catch((error) => {
- ElMessage({
- message: error.message,
- type: 'error'
- });
- });
- }
-}
diff --git a/poetize-im-ui/src/utils/constant.js b/poetize-im-ui/src/utils/constant.js
deleted file mode 100644
index b6e8cc3..0000000
--- a/poetize-im-ui/src/utils/constant.js
+++ /dev/null
@@ -1,38 +0,0 @@
-export default {
- // 测试环境
- baseURL: "http://localhost:8081",
- webBaseURL: "http://localhost",
- imURL: "http://localhost:81/im",
- imBaseURL: "localhost",
- wsProtocol: "ws",
- wsPort: "9324",
-
- // 生产环境
- // baseURL: location.protocol + "//" + location.hostname + (location.port ? ':' + location.port : '') + "/api",
- // webBaseURL: location.protocol + "//" + location.hostname + (location.port ? ':' + location.port : ''),
- // imURL: location.protocol + "//" + location.hostname + (location.port ? ':' + location.port : '') + "/im",
- // imBaseURL: location.hostname + (location.port ? ':' + location.port : ''),
- // wsProtocol: location.protocol === "http:" ? "ws" : "wss",
- // wsPort: "",
-
- webHistory: "/im/",
- hitokoto: "https://v1.hitokoto.cn",
- jinrishici: "https://v1.jinrishici.com/all.json",
- jitang: "https://api.oick.cn/dutang/api.php",
- shehui: "https://api.oick.cn/yulu/api.php",
- yiyan: "https://api.oick.cn/yiyan/api.php",
- dog: "https://api.oick.cn/dog/api.php",
-
- //前后端定义的密钥,AES使用16位
- cryptojs_key: "sarasarasarasara",
-
- before_color_1: "black",
- after_color_1: "linear-gradient(45deg, #f43f3b, #ec008c)",
-
- before_color_2: "rgb(131, 123, 199)",
- after_color_2: "linear-gradient(45deg, #f43f3b, #ec008c)",
-
- tree_hole_color: ["rgb(180, 224, 255)", "rgb(180, 203, 255)", "rgb(246, 223, 255)", "rgb(255, 214, 198)", "rgb(255, 205, 143)", "rgb(238, 255, 143)", "rgb(220, 255, 165)", "rgb(164, 234, 192)", "rgb(202, 241, 233)", "rgb(230, 230, 250)"],
-
- emojiList: ['衰', '鄙视', '再见', '捂嘴', '摸鱼', '奋斗', '白眼', '可怜', '皱眉', '鼓掌', '烦恼', '吐舌', '挖鼻', '委屈', '滑稽', '啊这', '生气', '害羞', '晕', '好色', '流泪', '吐血', '微笑', '酷', '坏笑', '吓', '大兵', '哭笑', '困', '呲牙']
-}
diff --git a/poetize-im-ui/src/utils/im.js b/poetize-im-ui/src/utils/im.js
deleted file mode 100644
index ae3d7d1..0000000
--- a/poetize-im-ui/src/utils/im.js
+++ /dev/null
@@ -1,29 +0,0 @@
-import Tiows from "./tiows";
-import constant from "./constant";
-import {ElMessage} from "element-plus";
-
-export default function () {
- this.ws_protocol = constant.wsProtocol;
- this.ip = constant.imBaseURL;
- this.port = constant.wsPort;
- this.paramStr = 'Authorization=' + localStorage.getItem("userToken");
- this.binaryType = 'blob';
-
- this.initWs = () => {
- this.tio = new Tiows(this.ws_protocol, this.ip, this.port, this.paramStr, this.binaryType);
- this.tio.connect();
- }
-
- this.sendMsg = (value) => {
- if (this.tio && this.tio.ws && this.tio.ws.readyState === 1) {
- this.tio.send(value);
- return true;
- } else {
- ElMessage({
- message: "发送失败,请重试!",
- type: 'error'
- });
- return false;
- }
- }
-}
diff --git a/poetize-im-ui/src/utils/request.js b/poetize-im-ui/src/utils/request.js
deleted file mode 100644
index a2147d0..0000000
--- a/poetize-im-ui/src/utils/request.js
+++ /dev/null
@@ -1,120 +0,0 @@
-import axios from "axios";
-import constant from "./constant";
-//处理url参数
-import qs from "qs";
-
-import store from "../store";
-
-
-axios.defaults.baseURL = constant.baseURL;
-
-
-// 添加请求拦截器
-axios.interceptors.request.use(function (config) {
- // 在发送请求之前做些什么
- return config;
-}, function (error) {
- // 对请求错误做些什么
- return Promise.reject(error);
-});
-
-
-// 添加响应拦截器
-axios.interceptors.response.use(function (response) {
- if (response.data !== null && response.data.hasOwnProperty("code") && response.data.code !== 200) {
- if (response.data.code === 300) {
- store.commit("loadCurrentUser", {});
- localStorage.removeItem("userToken");
- window.location.href = constant.webBaseURL + "/user";
- }
- return Promise.reject(new Error(response.data.message));
- } else {
- return response;
- }
-}, function (error) {
- // 对响应错误做点什么
- return Promise.reject(error);
-});
-
-
-// 当data为URLSearchParams对象时设置为application/x-www-form-urlencoded;charset=utf-8
-// 当data为普通对象时,会被设置为application/json;charset=utf-8
-
-
-export default {
- post(url, params = {}, json = true) {
- let config = {
- headers: {"Authorization": localStorage.getItem("userToken")}
- };
-
- return new Promise((resolve, reject) => {
- axios
- .post(url, json ? params : qs.stringify(params), config)
- .then(res => {
- resolve(res.data);
- })
- .catch(err => {
- reject(err);
- });
- });
- },
-
- get(url, params = {}) {
- let headers = {"Authorization": localStorage.getItem("userToken")};
-
- return new Promise((resolve, reject) => {
- axios.get(url, {
- params: params,
- headers: headers
- }).then(res => {
- resolve(res.data);
- }).catch(err => {
- reject(err)
- })
- });
- },
-
- upload(url, param, option) {
- let config = {
- headers: {"Authorization": localStorage.getItem("userToken"), "Content-Type": "multipart/form-data"},
- timeout: 60000
- };
- if (typeof option !== "undefined") {
- config.onUploadProgress = progressEvent => {
- if (progressEvent.total > 0) {
- progressEvent.percent = progressEvent.loaded / progressEvent.total * 100;
- }
- option.onProgress(progressEvent);
- };
- }
-
- return new Promise((resolve, reject) => {
- axios
- .post(url, param, config)
- .then(res => {
- resolve(res.data);
- })
- .catch(err => {
- reject(err);
- });
- });
- },
-
- uploadQiniu(url, param) {
- let config = {
- headers: {"Content-Type": "multipart/form-data"},
- timeout: 60000
- };
-
- return new Promise((resolve, reject) => {
- axios
- .post(url, param, config)
- .then(res => {
- resolve(res.data);
- })
- .catch(err => {
- reject(err);
- });
- });
- }
-}
diff --git a/poetize-im-ui/src/utils/tiows.js b/poetize-im-ui/src/utils/tiows.js
deleted file mode 100644
index f13b2df..0000000
--- a/poetize-im-ui/src/utils/tiows.js
+++ /dev/null
@@ -1,48 +0,0 @@
-import ReconnectingWebSocket from 'reconnecting-websocket';
-
-/**
- * @param {*} ws_protocol wss or ws
- * @param {*} ip
- * @param {*} port
- * @param {*} paramStr 加在ws url后面的请求参数,形如:name=张三&id=12
- * @param {*} binaryType 'blob' or 'arraybuffer'
- */
-export default function (ws_protocol, ip, port, paramStr, binaryType) {
-
- this.ws_protocol = ws_protocol;
- this.ip = ip;
- this.port = port;
- this.paramStr = paramStr;
- this.binaryType = binaryType;
-
- if (port === "") {
- this.url = ws_protocol + '://' + ip + '/socket';
- } else {
- this.url = ws_protocol + '://' + ip + ":" + port + '/socket';
- }
- if (paramStr) {
- this.url += '?' + paramStr;
- }
-
- this.connect = () => {
- let ws = new ReconnectingWebSocket(this.url);
- this.ws = ws;
- ws.binaryType = this.binaryType;
-
- ws.onopen = function (event) {
- //获取离线消息
- }
-
- ws.onclose = function (event) {
-
- }
-
- ws.onerror = function (event) {
-
- }
- }
-
- this.send = (data) => {
- this.ws.send(data);
- }
-}
diff --git a/poetize-im-ui/vue.config.js b/poetize-im-ui/vue.config.js
deleted file mode 100644
index 374c81b..0000000
--- a/poetize-im-ui/vue.config.js
+++ /dev/null
@@ -1,24 +0,0 @@
-const CompressionPlugin = require('compression-webpack-plugin')
-
-module.exports = {
- devServer: {
- port: 81,
- https: false,
- open: false
- },
- publicPath: '/im/',
- lintOnSave: false,
- productionSourceMap: false,
- configureWebpack: {
- plugins: [
- new CompressionPlugin({
- algorithm: 'gzip',
- test: /\.js$|\.html$|\.css$/,
- filename: '[path].gz[query]',
- minRatio: 1,
- threshold: 10240,
- deleteOriginalAssets: false
- })
- ]
- }
-}
diff --git a/poetize-server/.gitignore b/poetize-server/.gitignore
deleted file mode 100644
index 549e00a..0000000
--- a/poetize-server/.gitignore
+++ /dev/null
@@ -1,33 +0,0 @@
-HELP.md
-target/
-!.mvn/wrapper/maven-wrapper.jar
-!**/src/main/**/target/
-!**/src/test/**/target/
-
-### STS ###
-.apt_generated
-.classpath
-.factorypath
-.project
-.settings
-.springBeans
-.sts4-cache
-
-### IntelliJ IDEA ###
-.idea
-*.iws
-*.iml
-*.ipr
-
-### NetBeans ###
-/nbproject/private/
-/nbbuild/
-/dist/
-/nbdist/
-/.nb-gradle/
-build/
-!**/src/main/**/build/
-!**/src/test/**/build/
-
-### VS Code ###
-.vscode/
diff --git a/poetize-server/LICENSE b/poetize-server/LICENSE
deleted file mode 100644
index dbbe355..0000000
--- a/poetize-server/LICENSE
+++ /dev/null
@@ -1,661 +0,0 @@
- GNU AFFERO GENERAL PUBLIC LICENSE
- Version 3, 19 November 2007
-
- Copyright (C) 2007 Free Software Foundation, Inc.
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- Preamble
-
- The GNU Affero General Public License is a free, copyleft license for
-software and other kinds of works, specifically designed to ensure
-cooperation with the community in the case of network server software.
-
- The licenses for most software and other practical works are designed
-to take away your freedom to share and change the works. By contrast,
-our General Public Licenses are intended to guarantee your freedom to
-share and change all versions of a program--to make sure it remains free
-software for all its users.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-them if you wish), that you receive source code or can get it if you
-want it, that you can change the software or use pieces of it in new
-free programs, and that you know you can do these things.
-
- Developers that use our General Public Licenses protect your rights
-with two steps: (1) assert copyright on the software, and (2) offer
-you this License which gives you legal permission to copy, distribute
-and/or modify the software.
-
- A secondary benefit of defending all users' freedom is that
-improvements made in alternate versions of the program, if they
-receive widespread use, become available for other developers to
-incorporate. Many developers of free software are heartened and
-encouraged by the resulting cooperation. However, in the case of
-software used on network servers, this result may fail to come about.
-The GNU General Public License permits making a modified version and
-letting the public access it on a server without ever releasing its
-source code to the public.
-
- The GNU Affero General Public License is designed specifically to
-ensure that, in such cases, the modified source code becomes available
-to the community. It requires the operator of a network server to
-provide the source code of the modified version running there to the
-users of that server. Therefore, public use of a modified version, on
-a publicly accessible server, gives the public access to the source
-code of the modified version.
-
- An older license, called the Affero General Public License and
-published by Affero, was designed to accomplish similar goals. This is
-a different license, not a version of the Affero GPL, but Affero has
-released a new version of the Affero GPL which permits relicensing under
-this license.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- TERMS AND CONDITIONS
-
- 0. Definitions.
-
- "This License" refers to version 3 of the GNU Affero General Public License.
-
- "Copyright" also means copyright-like laws that apply to other kinds of
-works, such as semiconductor masks.
-
- "The Program" refers to any copyrightable work licensed under this
-License. Each licensee is addressed as "you". "Licensees" and
-"recipients" may be individuals or organizations.
-
- To "modify" a work means to copy from or adapt all or part of the work
-in a fashion requiring copyright permission, other than the making of an
-exact copy. The resulting work is called a "modified version" of the
-earlier work or a work "based on" the earlier work.
-
- A "covered work" means either the unmodified Program or a work based
-on the Program.
-
- To "propagate" a work means to do anything with it that, without
-permission, would make you directly or secondarily liable for
-infringement under applicable copyright law, except executing it on a
-computer or modifying a private copy. Propagation includes copying,
-distribution (with or without modification), making available to the
-public, and in some countries other activities as well.
-
- To "convey" a work means any kind of propagation that enables other
-parties to make or receive copies. Mere interaction with a user through
-a computer network, with no transfer of a copy, is not conveying.
-
- An interactive user interface displays "Appropriate Legal Notices"
-to the extent that it includes a convenient and prominently visible
-feature that (1) displays an appropriate copyright notice, and (2)
-tells the user that there is no warranty for the work (except to the
-extent that warranties are provided), that licensees may convey the
-work under this License, and how to view a copy of this License. If
-the interface presents a list of user commands or options, such as a
-menu, a prominent item in the list meets this criterion.
-
- 1. Source Code.
-
- The "source code" for a work means the preferred form of the work
-for making modifications to it. "Object code" means any non-source
-form of a work.
-
- A "Standard Interface" means an interface that either is an official
-standard defined by a recognized standards body, or, in the case of
-interfaces specified for a particular programming language, one that
-is widely used among developers working in that language.
-
- The "System Libraries" of an executable work include anything, other
-than the work as a whole, that (a) is included in the normal form of
-packaging a Major Component, but which is not part of that Major
-Component, and (b) serves only to enable use of the work with that
-Major Component, or to implement a Standard Interface for which an
-implementation is available to the public in source code form. A
-"Major Component", in this context, means a major essential component
-(kernel, window system, and so on) of the specific operating system
-(if any) on which the executable work runs, or a compiler used to
-produce the work, or an object code interpreter used to run it.
-
- The "Corresponding Source" for a work in object code form means all
-the source code needed to generate, install, and (for an executable
-work) run the object code and to modify the work, including scripts to
-control those activities. However, it does not include the work's
-System Libraries, or general-purpose tools or generally available free
-programs which are used unmodified in performing those activities but
-which are not part of the work. For example, Corresponding Source
-includes interface definition files associated with source files for
-the work, and the source code for shared libraries and dynamically
-linked subprograms that the work is specifically designed to require,
-such as by intimate data communication or control flow between those
-subprograms and other parts of the work.
-
- The Corresponding Source need not include anything that users
-can regenerate automatically from other parts of the Corresponding
-Source.
-
- The Corresponding Source for a work in source code form is that
-same work.
-
- 2. Basic Permissions.
-
- All rights granted under this License are granted for the term of
-copyright on the Program, and are irrevocable provided the stated
-conditions are met. This License explicitly affirms your unlimited
-permission to run the unmodified Program. The output from running a
-covered work is covered by this License only if the output, given its
-content, constitutes a covered work. This License acknowledges your
-rights of fair use or other equivalent, as provided by copyright law.
-
- You may make, run and propagate covered works that you do not
-convey, without conditions so long as your license otherwise remains
-in force. You may convey covered works to others for the sole purpose
-of having them make modifications exclusively for you, or provide you
-with facilities for running those works, provided that you comply with
-the terms of this License in conveying all material for which you do
-not control copyright. Those thus making or running the covered works
-for you must do so exclusively on your behalf, under your direction
-and control, on terms that prohibit them from making any copies of
-your copyrighted material outside their relationship with you.
-
- Conveying under any other circumstances is permitted solely under
-the conditions stated below. Sublicensing is not allowed; section 10
-makes it unnecessary.
-
- 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
-
- No covered work shall be deemed part of an effective technological
-measure under any applicable law fulfilling obligations under article
-11 of the WIPO copyright treaty adopted on 20 December 1996, or
-similar laws prohibiting or restricting circumvention of such
-measures.
-
- When you convey a covered work, you waive any legal power to forbid
-circumvention of technological measures to the extent such circumvention
-is effected by exercising rights under this License with respect to
-the covered work, and you disclaim any intention to limit operation or
-modification of the work as a means of enforcing, against the work's
-users, your or third parties' legal rights to forbid circumvention of
-technological measures.
-
- 4. Conveying Verbatim Copies.
-
- You may convey verbatim copies of the Program's source code as you
-receive it, in any medium, provided that you conspicuously and
-appropriately publish on each copy an appropriate copyright notice;
-keep intact all notices stating that this License and any
-non-permissive terms added in accord with section 7 apply to the code;
-keep intact all notices of the absence of any warranty; and give all
-recipients a copy of this License along with the Program.
-
- You may charge any price or no price for each copy that you convey,
-and you may offer support or warranty protection for a fee.
-
- 5. Conveying Modified Source Versions.
-
- You may convey a work based on the Program, or the modifications to
-produce it from the Program, in the form of source code under the
-terms of section 4, provided that you also meet all of these conditions:
-
- a) The work must carry prominent notices stating that you modified
- it, and giving a relevant date.
-
- b) The work must carry prominent notices stating that it is
- released under this License and any conditions added under section
- 7. This requirement modifies the requirement in section 4 to
- "keep intact all notices".
-
- c) You must license the entire work, as a whole, under this
- License to anyone who comes into possession of a copy. This
- License will therefore apply, along with any applicable section 7
- additional terms, to the whole of the work, and all its parts,
- regardless of how they are packaged. This License gives no
- permission to license the work in any other way, but it does not
- invalidate such permission if you have separately received it.
-
- d) If the work has interactive user interfaces, each must display
- Appropriate Legal Notices; however, if the Program has interactive
- interfaces that do not display Appropriate Legal Notices, your
- work need not make them do so.
-
- A compilation of a covered work with other separate and independent
-works, which are not by their nature extensions of the covered work,
-and which are not combined with it such as to form a larger program,
-in or on a volume of a storage or distribution medium, is called an
-"aggregate" if the compilation and its resulting copyright are not
-used to limit the access or legal rights of the compilation's users
-beyond what the individual works permit. Inclusion of a covered work
-in an aggregate does not cause this License to apply to the other
-parts of the aggregate.
-
- 6. Conveying Non-Source Forms.
-
- You may convey a covered work in object code form under the terms
-of sections 4 and 5, provided that you also convey the
-machine-readable Corresponding Source under the terms of this License,
-in one of these ways:
-
- a) Convey the object code in, or embodied in, a physical product
- (including a physical distribution medium), accompanied by the
- Corresponding Source fixed on a durable physical medium
- customarily used for software interchange.
-
- b) Convey the object code in, or embodied in, a physical product
- (including a physical distribution medium), accompanied by a
- written offer, valid for at least three years and valid for as
- long as you offer spare parts or customer support for that product
- model, to give anyone who possesses the object code either (1) a
- copy of the Corresponding Source for all the software in the
- product that is covered by this License, on a durable physical
- medium customarily used for software interchange, for a price no
- more than your reasonable cost of physically performing this
- conveying of source, or (2) access to copy the
- Corresponding Source from a network server at no charge.
-
- c) Convey individual copies of the object code with a copy of the
- written offer to provide the Corresponding Source. This
- alternative is allowed only occasionally and noncommercially, and
- only if you received the object code with such an offer, in accord
- with subsection 6b.
-
- d) Convey the object code by offering access from a designated
- place (gratis or for a charge), and offer equivalent access to the
- Corresponding Source in the same way through the same place at no
- further charge. You need not require recipients to copy the
- Corresponding Source along with the object code. If the place to
- copy the object code is a network server, the Corresponding Source
- may be on a different server (operated by you or a third party)
- that supports equivalent copying facilities, provided you maintain
- clear directions next to the object code saying where to find the
- Corresponding Source. Regardless of what server hosts the
- Corresponding Source, you remain obligated to ensure that it is
- available for as long as needed to satisfy these requirements.
-
- e) Convey the object code using peer-to-peer transmission, provided
- you inform other peers where the object code and Corresponding
- Source of the work are being offered to the general public at no
- charge under subsection 6d.
-
- A separable portion of the object code, whose source code is excluded
-from the Corresponding Source as a System Library, need not be
-included in conveying the object code work.
-
- A "User Product" is either (1) a "consumer product", which means any
-tangible personal property which is normally used for personal, family,
-or household purposes, or (2) anything designed or sold for incorporation
-into a dwelling. In determining whether a product is a consumer product,
-doubtful cases shall be resolved in favor of coverage. For a particular
-product received by a particular user, "normally used" refers to a
-typical or common use of that class of product, regardless of the status
-of the particular user or of the way in which the particular user
-actually uses, or expects or is expected to use, the product. A product
-is a consumer product regardless of whether the product has substantial
-commercial, industrial or non-consumer uses, unless such uses represent
-the only significant mode of use of the product.
-
- "Installation Information" for a User Product means any methods,
-procedures, authorization keys, or other information required to install
-and execute modified versions of a covered work in that User Product from
-a modified version of its Corresponding Source. The information must
-suffice to ensure that the continued functioning of the modified object
-code is in no case prevented or interfered with solely because
-modification has been made.
-
- If you convey an object code work under this section in, or with, or
-specifically for use in, a User Product, and the conveying occurs as
-part of a transaction in which the right of possession and use of the
-User Product is transferred to the recipient in perpetuity or for a
-fixed term (regardless of how the transaction is characterized), the
-Corresponding Source conveyed under this section must be accompanied
-by the Installation Information. But this requirement does not apply
-if neither you nor any third party retains the ability to install
-modified object code on the User Product (for example, the work has
-been installed in ROM).
-
- The requirement to provide Installation Information does not include a
-requirement to continue to provide support service, warranty, or updates
-for a work that has been modified or installed by the recipient, or for
-the User Product in which it has been modified or installed. Access to a
-network may be denied when the modification itself materially and
-adversely affects the operation of the network or violates the rules and
-protocols for communication across the network.
-
- Corresponding Source conveyed, and Installation Information provided,
-in accord with this section must be in a format that is publicly
-documented (and with an implementation available to the public in
-source code form), and must require no special password or key for
-unpacking, reading or copying.
-
- 7. Additional Terms.
-
- "Additional permissions" are terms that supplement the terms of this
-License by making exceptions from one or more of its conditions.
-Additional permissions that are applicable to the entire Program shall
-be treated as though they were included in this License, to the extent
-that they are valid under applicable law. If additional permissions
-apply only to part of the Program, that part may be used separately
-under those permissions, but the entire Program remains governed by
-this License without regard to the additional permissions.
-
- When you convey a copy of a covered work, you may at your option
-remove any additional permissions from that copy, or from any part of
-it. (Additional permissions may be written to require their own
-removal in certain cases when you modify the work.) You may place
-additional permissions on material, added by you to a covered work,
-for which you have or can give appropriate copyright permission.
-
- Notwithstanding any other provision of this License, for material you
-add to a covered work, you may (if authorized by the copyright holders of
-that material) supplement the terms of this License with terms:
-
- a) Disclaiming warranty or limiting liability differently from the
- terms of sections 15 and 16 of this License; or
-
- b) Requiring preservation of specified reasonable legal notices or
- author attributions in that material or in the Appropriate Legal
- Notices displayed by works containing it; or
-
- c) Prohibiting misrepresentation of the origin of that material, or
- requiring that modified versions of such material be marked in
- reasonable ways as different from the original version; or
-
- d) Limiting the use for publicity purposes of names of licensors or
- authors of the material; or
-
- e) Declining to grant rights under trademark law for use of some
- trade names, trademarks, or service marks; or
-
- f) Requiring indemnification of licensors and authors of that
- material by anyone who conveys the material (or modified versions of
- it) with contractual assumptions of liability to the recipient, for
- any liability that these contractual assumptions directly impose on
- those licensors and authors.
-
- All other non-permissive additional terms are considered "further
-restrictions" within the meaning of section 10. If the Program as you
-received it, or any part of it, contains a notice stating that it is
-governed by this License along with a term that is a further
-restriction, you may remove that term. If a license document contains
-a further restriction but permits relicensing or conveying under this
-License, you may add to a covered work material governed by the terms
-of that license document, provided that the further restriction does
-not survive such relicensing or conveying.
-
- If you add terms to a covered work in accord with this section, you
-must place, in the relevant source files, a statement of the
-additional terms that apply to those files, or a notice indicating
-where to find the applicable terms.
-
- Additional terms, permissive or non-permissive, may be stated in the
-form of a separately written license, or stated as exceptions;
-the above requirements apply either way.
-
- 8. Termination.
-
- You may not propagate or modify a covered work except as expressly
-provided under this License. Any attempt otherwise to propagate or
-modify it is void, and will automatically terminate your rights under
-this License (including any patent licenses granted under the third
-paragraph of section 11).
-
- However, if you cease all violation of this License, then your
-license from a particular copyright holder is reinstated (a)
-provisionally, unless and until the copyright holder explicitly and
-finally terminates your license, and (b) permanently, if the copyright
-holder fails to notify you of the violation by some reasonable means
-prior to 60 days after the cessation.
-
- Moreover, your license from a particular copyright holder is
-reinstated permanently if the copyright holder notifies you of the
-violation by some reasonable means, this is the first time you have
-received notice of violation of this License (for any work) from that
-copyright holder, and you cure the violation prior to 30 days after
-your receipt of the notice.
-
- Termination of your rights under this section does not terminate the
-licenses of parties who have received copies or rights from you under
-this License. If your rights have been terminated and not permanently
-reinstated, you do not qualify to receive new licenses for the same
-material under section 10.
-
- 9. Acceptance Not Required for Having Copies.
-
- You are not required to accept this License in order to receive or
-run a copy of the Program. Ancillary propagation of a covered work
-occurring solely as a consequence of using peer-to-peer transmission
-to receive a copy likewise does not require acceptance. However,
-nothing other than this License grants you permission to propagate or
-modify any covered work. These actions infringe copyright if you do
-not accept this License. Therefore, by modifying or propagating a
-covered work, you indicate your acceptance of this License to do so.
-
- 10. Automatic Licensing of Downstream Recipients.
-
- Each time you convey a covered work, the recipient automatically
-receives a license from the original licensors, to run, modify and
-propagate that work, subject to this License. You are not responsible
-for enforcing compliance by third parties with this License.
-
- An "entity transaction" is a transaction transferring control of an
-organization, or substantially all assets of one, or subdividing an
-organization, or merging organizations. If propagation of a covered
-work results from an entity transaction, each party to that
-transaction who receives a copy of the work also receives whatever
-licenses to the work the party's predecessor in interest had or could
-give under the previous paragraph, plus a right to possession of the
-Corresponding Source of the work from the predecessor in interest, if
-the predecessor has it or can get it with reasonable efforts.
-
- You may not impose any further restrictions on the exercise of the
-rights granted or affirmed under this License. For example, you may
-not impose a license fee, royalty, or other charge for exercise of
-rights granted under this License, and you may not initiate litigation
-(including a cross-claim or counterclaim in a lawsuit) alleging that
-any patent claim is infringed by making, using, selling, offering for
-sale, or importing the Program or any portion of it.
-
- 11. Patents.
-
- A "contributor" is a copyright holder who authorizes use under this
-License of the Program or a work on which the Program is based. The
-work thus licensed is called the contributor's "contributor version".
-
- A contributor's "essential patent claims" are all patent claims
-owned or controlled by the contributor, whether already acquired or
-hereafter acquired, that would be infringed by some manner, permitted
-by this License, of making, using, or selling its contributor version,
-but do not include claims that would be infringed only as a
-consequence of further modification of the contributor version. For
-purposes of this definition, "control" includes the right to grant
-patent sublicenses in a manner consistent with the requirements of
-this License.
-
- Each contributor grants you a non-exclusive, worldwide, royalty-free
-patent license under the contributor's essential patent claims, to
-make, use, sell, offer for sale, import and otherwise run, modify and
-propagate the contents of its contributor version.
-
- In the following three paragraphs, a "patent license" is any express
-agreement or commitment, however denominated, not to enforce a patent
-(such as an express permission to practice a patent or covenant not to
-sue for patent infringement). To "grant" such a patent license to a
-party means to make such an agreement or commitment not to enforce a
-patent against the party.
-
- If you convey a covered work, knowingly relying on a patent license,
-and the Corresponding Source of the work is not available for anyone
-to copy, free of charge and under the terms of this License, through a
-publicly available network server or other readily accessible means,
-then you must either (1) cause the Corresponding Source to be so
-available, or (2) arrange to deprive yourself of the benefit of the
-patent license for this particular work, or (3) arrange, in a manner
-consistent with the requirements of this License, to extend the patent
-license to downstream recipients. "Knowingly relying" means you have
-actual knowledge that, but for the patent license, your conveying the
-covered work in a country, or your recipient's use of the covered work
-in a country, would infringe one or more identifiable patents in that
-country that you have reason to believe are valid.
-
- If, pursuant to or in connection with a single transaction or
-arrangement, you convey, or propagate by procuring conveyance of, a
-covered work, and grant a patent license to some of the parties
-receiving the covered work authorizing them to use, propagate, modify
-or convey a specific copy of the covered work, then the patent license
-you grant is automatically extended to all recipients of the covered
-work and works based on it.
-
- A patent license is "discriminatory" if it does not include within
-the scope of its coverage, prohibits the exercise of, or is
-conditioned on the non-exercise of one or more of the rights that are
-specifically granted under this License. You may not convey a covered
-work if you are a party to an arrangement with a third party that is
-in the business of distributing software, under which you make payment
-to the third party based on the extent of your activity of conveying
-the work, and under which the third party grants, to any of the
-parties who would receive the covered work from you, a discriminatory
-patent license (a) in connection with copies of the covered work
-conveyed by you (or copies made from those copies), or (b) primarily
-for and in connection with specific products or compilations that
-contain the covered work, unless you entered into that arrangement,
-or that patent license was granted, prior to 28 March 2007.
-
- Nothing in this License shall be construed as excluding or limiting
-any implied license or other defenses to infringement that may
-otherwise be available to you under applicable patent law.
-
- 12. No Surrender of Others' Freedom.
-
- If conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot convey a
-covered work so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you may
-not convey it at all. For example, if you agree to terms that obligate you
-to collect a royalty for further conveying from those to whom you convey
-the Program, the only way you could satisfy both those terms and this
-License would be to refrain entirely from conveying the Program.
-
- 13. Remote Network Interaction; Use with the GNU General Public License.
-
- Notwithstanding any other provision of this License, if you modify the
-Program, your modified version must prominently offer all users
-interacting with it remotely through a computer network (if your version
-supports such interaction) an opportunity to receive the Corresponding
-Source of your version by providing access to the Corresponding Source
-from a network server at no charge, through some standard or customary
-means of facilitating copying of software. This Corresponding Source
-shall include the Corresponding Source for any work covered by version 3
-of the GNU General Public License that is incorporated pursuant to the
-following paragraph.
-
- Notwithstanding any other provision of this License, you have
-permission to link or combine any covered work with a work licensed
-under version 3 of the GNU General Public License into a single
-combined work, and to convey the resulting work. The terms of this
-License will continue to apply to the part which is the covered work,
-but the work with which it is combined will remain governed by version
-3 of the GNU General Public License.
-
- 14. Revised Versions of this License.
-
- The Free Software Foundation may publish revised and/or new versions of
-the GNU Affero General Public License from time to time. Such new versions
-will be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
- Each version is given a distinguishing version number. If the
-Program specifies that a certain numbered version of the GNU Affero General
-Public License "or any later version" applies to it, you have the
-option of following the terms and conditions either of that numbered
-version or of any later version published by the Free Software
-Foundation. If the Program does not specify a version number of the
-GNU Affero General Public License, you may choose any version ever published
-by the Free Software Foundation.
-
- If the Program specifies that a proxy can decide which future
-versions of the GNU Affero General Public License can be used, that proxy's
-public statement of acceptance of a version permanently authorizes you
-to choose that version for the Program.
-
- Later license versions may give you additional or different
-permissions. However, no additional obligations are imposed on any
-author or copyright holder as a result of your choosing to follow a
-later version.
-
- 15. Disclaimer of Warranty.
-
- THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
-APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
-HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
-OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
-THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
-IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
-ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. Limitation of Liability.
-
- IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
-THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
-GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
-USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
-DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
-PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
-EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGES.
-
- 17. Interpretation of Sections 15 and 16.
-
- If the disclaimer of warranty and limitation of liability provided
-above cannot be given local legal effect according to their terms,
-reviewing courts shall apply local law that most closely approximates
-an absolute waiver of all civil liability in connection with the
-Program, unless a warranty or assumption of liability accompanies a
-copy of the Program in return for a fee.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Programs
-
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-state the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-
- Copyright (C)
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see .
-
-Also add information on how to contact you by electronic and paper mail.
-
- If your software can interact with users remotely through a computer
-network, you should also make sure that it provides a way for users to
-get its source. For example, if your program is a web application, its
-interface could display a "Source" link that leads users to an archive
-of the code. There are many ways you could offer source, and different
-solutions will be better for different programs; see section 13 for the
-specific requirements.
-
- You should also get your employer (if you work as a programmer) or school,
-if any, to sign a "copyright disclaimer" for the program, if necessary.
-For more information on this, and how to apply and follow the GNU AGPL, see
-.
diff --git a/poetize-server/poetry-web/pom.xml b/poetize-server/poetry-web/pom.xml
deleted file mode 100644
index 0a3fe65..0000000
--- a/poetize-server/poetry-web/pom.xml
+++ /dev/null
@@ -1,125 +0,0 @@
-
-
- 4.0.0
-
-
- poetry
- com.ld
- 2.0
-
-
- jar
- poetry-web
- poetry-web
- 最美博客 IM
-
-
-
- org.springframework.boot
- spring-boot-starter-web
-
-
-
- org.springframework.boot
- spring-boot-starter-mail
-
-
-
- org.springframework.boot
- spring-boot-starter-aop
-
-
-
- org.springframework.boot
- spring-boot-starter-cache
-
-
-
- mysql
- mysql-connector-java
- 8.0.20
-
-
- com.alibaba
- druid-spring-boot-starter
- 1.2.6
-
-
- com.baomidou
- mybatis-plus-boot-starter
-
-
- com.baomidou
- mybatis-plus-generator
- 3.4.1
-
-
- org.apache.velocity
- velocity-engine-core
- 2.3
-
-
-
- org.projectlombok
- lombok
-
-
-
- com.alibaba
- fastjson
- 2.0.20
-
-
-
- javax.validation
- validation-api
- 2.0.1.Final
-
-
-
- org.t-io
- tio-websocket-server
- 3.7.5.v20211028-RELEASE
-
-
-
- cn.hutool
- hutool-crypto
-
-
-
- cn.hutool
- hutool-extra
-
-
-
- com.qiniu
- qiniu-java-sdk
- 7.8.0
-
-
-
- org.lionsoul
- ip2region
-
-
-
-
- poetize-server
-
-
- org.springframework.boot
- spring-boot-maven-plugin
- ${spring-boot.version}
-
-
-
- repackage
-
-
-
-
-
-
-
diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/PoetryApplication.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/PoetryApplication.java
deleted file mode 100644
index a4789f4..0000000
--- a/poetize-server/poetry-web/src/main/java/com/ld/poetry/PoetryApplication.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package com.ld.poetry;
-
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.scheduling.annotation.EnableAsync;
-import org.springframework.scheduling.annotation.EnableScheduling;
-
-@SpringBootApplication
-@EnableScheduling
-@EnableAsync
-public class PoetryApplication {
-
- public static void main(String[] args) {
- SpringApplication.run(PoetryApplication.class, args);
- }
-
-}
diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/aop/LoginCheck.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/aop/LoginCheck.java
deleted file mode 100644
index 2b5e637..0000000
--- a/poetize-server/poetry-web/src/main/java/com/ld/poetry/aop/LoginCheck.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.ld.poetry.aop;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Target(ElementType.METHOD)
-@Retention(RetentionPolicy.RUNTIME)
-public @interface LoginCheck {
- int value() default 2;
-}
diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/aop/LoginCheckAspect.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/aop/LoginCheckAspect.java
deleted file mode 100644
index 7cd94dc..0000000
--- a/poetize-server/poetry-web/src/main/java/com/ld/poetry/aop/LoginCheckAspect.java
+++ /dev/null
@@ -1,89 +0,0 @@
-package com.ld.poetry.aop;
-
-import com.ld.poetry.config.PoetryResult;
-import com.ld.poetry.constants.CommonConst;
-import com.ld.poetry.entity.User;
-import com.ld.poetry.enums.CodeMsg;
-import com.ld.poetry.enums.PoetryEnum;
-import com.ld.poetry.handle.PoetryLoginException;
-import com.ld.poetry.handle.PoetryRuntimeException;
-import com.ld.poetry.utils.*;
-import com.ld.poetry.utils.cache.PoetryCache;
-import lombok.extern.slf4j.Slf4j;
-import org.aspectj.lang.ProceedingJoinPoint;
-import org.aspectj.lang.annotation.Around;
-import org.aspectj.lang.annotation.Aspect;
-import org.springframework.core.annotation.Order;
-import org.springframework.stereotype.Component;
-import org.springframework.util.StringUtils;
-
-
-@Aspect
-@Component
-@Order(0)
-@Slf4j
-public class LoginCheckAspect {
-
- @Around("@annotation(loginCheck)")
- public Object around(ProceedingJoinPoint joinPoint, LoginCheck loginCheck) throws Throwable {
- String token = PoetryUtil.getToken();
- if (!StringUtils.hasText(token)) {
- throw new PoetryLoginException(CodeMsg.NOT_LOGIN.getMsg());
- }
-
- User user = (User) PoetryCache.get(token);
-
- if (user == null) {
- throw new PoetryLoginException(CodeMsg.LOGIN_EXPIRED.getMsg());
- }
-
- if (token.contains(CommonConst.USER_ACCESS_TOKEN)) {
- if (loginCheck.value() == PoetryEnum.USER_TYPE_ADMIN.getCode() || loginCheck.value() == PoetryEnum.USER_TYPE_DEV.getCode()) {
- return PoetryResult.fail("请输入管理员账号!");
- }
- } else if (token.contains(CommonConst.ADMIN_ACCESS_TOKEN)) {
- log.info("请求IP:" + PoetryUtil.getIpAddr(PoetryUtil.getRequest()));
- if (loginCheck.value() == PoetryEnum.USER_TYPE_ADMIN.getCode() && user.getId().intValue() != CommonConst.ADMIN_USER_ID) {
- return PoetryResult.fail("请输入管理员账号!");
- }
- } else {
- throw new PoetryLoginException(CodeMsg.NOT_LOGIN.getMsg());
- }
-
- if (loginCheck.value() < user.getUserType()) {
- throw new PoetryRuntimeException("权限不足!");
- }
-
- //重置过期时间
- String userId = user.getId().toString();
- boolean flag1 = false;
- if (token.contains(CommonConst.USER_ACCESS_TOKEN)) {
- flag1 = PoetryCache.get(CommonConst.USER_TOKEN_INTERVAL + userId) == null;
- } else if (token.contains(CommonConst.ADMIN_ACCESS_TOKEN)) {
- flag1 = PoetryCache.get(CommonConst.ADMIN_TOKEN_INTERVAL + userId) == null;
- }
-
- if (flag1) {
- synchronized (userId.intern()) {
- boolean flag2 = false;
- if (token.contains(CommonConst.USER_ACCESS_TOKEN)) {
- flag2 = PoetryCache.get(CommonConst.USER_TOKEN_INTERVAL + userId) == null;
- } else if (token.contains(CommonConst.ADMIN_ACCESS_TOKEN)) {
- flag2 = PoetryCache.get(CommonConst.ADMIN_TOKEN_INTERVAL + userId) == null;
- }
-
- if (flag2) {
- PoetryCache.put(token, user, CommonConst.TOKEN_EXPIRE);
- if (token.contains(CommonConst.USER_ACCESS_TOKEN)) {
- PoetryCache.put(CommonConst.USER_TOKEN + userId, token, CommonConst.TOKEN_EXPIRE);
- PoetryCache.put(CommonConst.USER_TOKEN_INTERVAL + userId, token, CommonConst.TOKEN_INTERVAL);
- } else if (token.contains(CommonConst.ADMIN_ACCESS_TOKEN)) {
- PoetryCache.put(CommonConst.ADMIN_TOKEN + userId, token, CommonConst.TOKEN_EXPIRE);
- PoetryCache.put(CommonConst.ADMIN_TOKEN_INTERVAL + userId, token, CommonConst.TOKEN_INTERVAL);
- }
- }
- }
- }
- return joinPoint.proceed();
- }
-}
diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/aop/ResourceCheck.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/aop/ResourceCheck.java
deleted file mode 100644
index 7359a8a..0000000
--- a/poetize-server/poetry-web/src/main/java/com/ld/poetry/aop/ResourceCheck.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.ld.poetry.aop;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Target(ElementType.METHOD)
-@Retention(RetentionPolicy.RUNTIME)
-public @interface ResourceCheck {
- String value();
-}
diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/aop/ResourceCheckAspect.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/aop/ResourceCheckAspect.java
deleted file mode 100644
index 23b8ddc..0000000
--- a/poetize-server/poetry-web/src/main/java/com/ld/poetry/aop/ResourceCheckAspect.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package com.ld.poetry.aop;
-
-import com.ld.poetry.utils.*;
-import lombok.extern.slf4j.Slf4j;
-import org.aspectj.lang.ProceedingJoinPoint;
-import org.aspectj.lang.annotation.Around;
-import org.aspectj.lang.annotation.Aspect;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.core.annotation.Order;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-
-
-@Aspect
-@Component
-@Order(2)
-@Slf4j
-public class ResourceCheckAspect {
-
- @Autowired
- private CommonQuery commonQuery;
-
- @Value("${resource.article.doc:}")
- private List articleDoc;
-
- @Around("@annotation(resourceCheck)")
- public Object around(ProceedingJoinPoint joinPoint, ResourceCheck resourceCheck) throws Throwable {
- return joinPoint.proceed();
- }
-}
diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/aop/SaveCheck.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/aop/SaveCheck.java
deleted file mode 100644
index 276f3d4..0000000
--- a/poetize-server/poetry-web/src/main/java/com/ld/poetry/aop/SaveCheck.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package com.ld.poetry.aop;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Target(ElementType.METHOD)
-@Retention(RetentionPolicy.RUNTIME)
-public @interface SaveCheck {
-}
diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/aop/SaveCheckAspect.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/aop/SaveCheckAspect.java
deleted file mode 100644
index e562901..0000000
--- a/poetize-server/poetry-web/src/main/java/com/ld/poetry/aop/SaveCheckAspect.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package com.ld.poetry.aop;
-
-import com.ld.poetry.entity.User;
-import com.ld.poetry.handle.PoetryRuntimeException;
-import com.ld.poetry.constants.CommonConst;
-import com.ld.poetry.utils.cache.PoetryCache;
-import com.ld.poetry.utils.PoetryUtil;
-import lombok.extern.slf4j.Slf4j;
-import org.aspectj.lang.ProceedingJoinPoint;
-import org.aspectj.lang.annotation.Around;
-import org.aspectj.lang.annotation.Aspect;
-import org.springframework.core.annotation.Order;
-import org.springframework.stereotype.Component;
-import org.springframework.util.StringUtils;
-
-import java.util.concurrent.atomic.AtomicInteger;
-
-
-@Aspect
-@Component
-@Order(1)
-@Slf4j
-public class SaveCheckAspect {
-
- @Around("@annotation(saveCheck)")
- public Object around(ProceedingJoinPoint joinPoint, SaveCheck saveCheck) throws Throwable {
- boolean flag = false;
-
- String token = PoetryUtil.getToken();
- if (StringUtils.hasText(token)) {
- User user = (User) PoetryCache.get(token);
- if (user != null) {
- if (user.getId().intValue() == PoetryUtil.getAdminUser().getId().intValue()) {
- return joinPoint.proceed();
- }
-
- AtomicInteger atomicInteger = (AtomicInteger) PoetryCache.get(CommonConst.SAVE_COUNT_USER_ID + user.getId().toString());
- if (atomicInteger == null) {
- atomicInteger = new AtomicInteger();
- PoetryCache.put(CommonConst.SAVE_COUNT_USER_ID + user.getId().toString(), atomicInteger, CommonConst.SAVE_EXPIRE);
- }
- int userIdCount = atomicInteger.getAndIncrement();
- if (userIdCount >= CommonConst.SAVE_MAX_COUNT) {
- log.info("用户保存超限:" + user.getId().toString() + ",次数:" + userIdCount);
- flag = true;
- }
- }
- }
-
- String ip = PoetryUtil.getIpAddr(PoetryUtil.getRequest());
- AtomicInteger atomic = (AtomicInteger) PoetryCache.get(CommonConst.SAVE_COUNT_IP + ip);
- if (atomic == null) {
- atomic = new AtomicInteger();
- PoetryCache.put(CommonConst.SAVE_COUNT_IP + ip, atomic, CommonConst.SAVE_EXPIRE);
- }
- int ipCount = atomic.getAndIncrement();
- if (ipCount > CommonConst.SAVE_MAX_COUNT) {
- log.info("IP保存超限:" + ip + ",次数:" + ipCount);
- flag = true;
- }
-
- if (flag) {
- throw new PoetryRuntimeException("今日提交次数已用尽,请一天后再来!");
- }
-
- return joinPoint.proceed();
- }
-}
diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/config/CorsConfig.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/config/CorsConfig.java
deleted file mode 100644
index 8423d36..0000000
--- a/poetize-server/poetry-web/src/main/java/com/ld/poetry/config/CorsConfig.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package com.ld.poetry.config;
-
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.web.cors.CorsConfiguration;
-import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
-import org.springframework.web.filter.CorsFilter;
-
-import java.util.ArrayList;
-import java.util.List;
-
-
-@Configuration
-public class CorsConfig {
-
- @Bean
- public CorsFilter corsFilter() {
- UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
- CorsConfiguration config = new CorsConfiguration();
- // 是否允许请求带有验证信息
- config.setAllowCredentials(true);
- List allowedOriginPatterns = new ArrayList<>();
- allowedOriginPatterns.add("*");
- config.setAllowedOriginPatterns(allowedOriginPatterns);
-
- config.addAllowedHeader("*");
- config.addAllowedMethod("*");
- source.registerCorsConfiguration("/**", config);
- return new CorsFilter(source);
- }
-}
\ No newline at end of file
diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/config/CustomEnvironmentPostProcessor.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/config/CustomEnvironmentPostProcessor.java
deleted file mode 100644
index cca5511..0000000
--- a/poetize-server/poetry-web/src/main/java/com/ld/poetry/config/CustomEnvironmentPostProcessor.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package com.ld.poetry.config;
-
-import com.ld.poetry.handle.PoetryRuntimeException;
-import lombok.SneakyThrows;
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.env.EnvironmentPostProcessor;
-import org.springframework.core.Ordered;
-import org.springframework.core.annotation.Order;
-import org.springframework.core.env.ConfigurableEnvironment;
-import org.springframework.core.env.MapPropertySource;
-import org.springframework.core.env.MutablePropertySources;
-import org.springframework.core.env.PropertySource;
-import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
-import org.springframework.core.io.support.ResourcePatternResolver;
-import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;
-
-import java.sql.*;
-import java.util.HashMap;
-import java.util.Map;
-
-@Order(Ordered.LOWEST_PRECEDENCE)
-public class CustomEnvironmentPostProcessor implements EnvironmentPostProcessor {
-
- private static final String SOURCE_NAME = "sys_config";
-
- private static final String SOURCE_SQL = "select * from poetize.sys_config";
-
- private static final String DATABASE = "poetize";
-
- private static final String sqlPath = "file:/home/poetry.sql";
-
- @Override
- public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
- try {
- Map map = new HashMap<>();
-
- String username = environment.getProperty("spring.datasource.username");
- String password = environment.getProperty("spring.datasource.password");
- String url = environment.getProperty("spring.datasource.url").replace("/poetize", "");
- String driver = environment.getProperty("spring.datasource.driver-class-name");
- Class.forName(driver);
- try (Connection connection = DriverManager.getConnection(url, username, password)) {
- //初始化数据库
- initDb(connection);
- //加载配置文件
- try (Statement statement = connection.createStatement()) {
- try (ResultSet resultSet = statement.executeQuery(SOURCE_SQL)) {
- while (resultSet.next()) {
- map.put(resultSet.getString("config_key"), resultSet.getString("config_value"));
- }
- }
- }
- }
-
- MutablePropertySources propertySources = environment.getPropertySources();
- PropertySource> source = new MapPropertySource(SOURCE_NAME, map);
- propertySources.addFirst(source);
- } catch (Exception e) {
- throw new PoetryRuntimeException(e);
- }
- }
-
- @SneakyThrows
- private void initDb(Connection connection) {
- try (Statement statement = connection.createStatement()) {
- try (ResultSet resultSet = statement.executeQuery("SHOW DATABASES LIKE '" + DATABASE + "'")) {
- if (!resultSet.next()) {
- ResourceDatabasePopulator populator = new ResourceDatabasePopulator();
- ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
- populator.addScripts(resolver.getResources(sqlPath));
- populator.populate(connection);
- }
- }
- }
- }
-}
diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/config/DataAutoFill.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/config/DataAutoFill.java
deleted file mode 100644
index f0bf632..0000000
--- a/poetize-server/poetry-web/src/main/java/com/ld/poetry/config/DataAutoFill.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package com.ld.poetry.config;
-
-import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
-import com.ld.poetry.utils.PoetryUtil;
-import org.apache.ibatis.reflection.MetaObject;
-import org.springframework.stereotype.Component;
-import org.springframework.util.StringUtils;
-
-@Component
-public class DataAutoFill implements MetaObjectHandler {
-
- @Override
- public void insertFill(MetaObject metaObject) {
- this.strictInsertFill(metaObject, "createBy", String.class, !StringUtils.hasText(PoetryUtil.getUsername()) ? "Sara" : PoetryUtil.getUsername());
- }
-
- @Override
- public void updateFill(MetaObject metaObject) {
- this.strictInsertFill(metaObject, "updateBy", String.class, !StringUtils.hasText(PoetryUtil.getUsername()) ? "Sara" : PoetryUtil.getUsername());
- }
-}
diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/config/MybatisPlusConfig.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/config/MybatisPlusConfig.java
deleted file mode 100644
index 8a6a69f..0000000
--- a/poetize-server/poetry-web/src/main/java/com/ld/poetry/config/MybatisPlusConfig.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.ld.poetry.config;
-
-import com.baomidou.mybatisplus.annotation.DbType;
-import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
-import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
-import org.mybatis.spring.annotation.MapperScan;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-@Configuration
-@MapperScan({"com.ld.poetry.dao", "com.ld.poetry.im.http.dao"})
-public class MybatisPlusConfig {
-
- @Bean
- public MybatisPlusInterceptor mybatisPlusInterceptor() {
- MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
- interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
- return interceptor;
- }
-}
\ No newline at end of file
diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/config/PoetryApplicationRunner.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/config/PoetryApplicationRunner.java
deleted file mode 100644
index 2a9973d..0000000
--- a/poetize-server/poetry-web/src/main/java/com/ld/poetry/config/PoetryApplicationRunner.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package com.ld.poetry.config;
-
-import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
-import com.ld.poetry.dao.HistoryInfoMapper;
-import com.ld.poetry.dao.WebInfoMapper;
-import com.ld.poetry.entity.*;
-import com.ld.poetry.im.websocket.TioUtil;
-import com.ld.poetry.im.websocket.TioWebsocketStarter;
-import com.ld.poetry.service.FamilyService;
-import com.ld.poetry.service.UserService;
-import com.ld.poetry.constants.CommonConst;
-import com.ld.poetry.utils.cache.PoetryCache;
-import com.ld.poetry.enums.PoetryEnum;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.boot.ApplicationArguments;
-import org.springframework.boot.ApplicationRunner;
-import org.springframework.stereotype.Component;
-import org.springframework.util.CollectionUtils;
-
-import java.time.LocalDateTime;
-import java.time.LocalTime;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.CopyOnWriteArraySet;
-import java.util.stream.Collectors;
-
-@Component
-public class PoetryApplicationRunner implements ApplicationRunner {
-
- @Value("${store.type}")
- private String defaultType;
-
- @Autowired
- private WebInfoMapper webInfoMapper;
-
- @Autowired
- private UserService userService;
-
- @Autowired
- private FamilyService familyService;
-
- @Autowired
- private HistoryInfoMapper historyInfoMapper;
-
- @Override
- public void run(ApplicationArguments args) throws Exception {
- LambdaQueryChainWrapper wrapper = new LambdaQueryChainWrapper<>(webInfoMapper);
- List list = wrapper.list();
- if (!CollectionUtils.isEmpty(list)) {
- list.get(0).setDefaultStoreType(defaultType);
- PoetryCache.put(CommonConst.WEB_INFO, list.get(0));
- }
-
- User admin = userService.lambdaQuery().eq(User::getUserType, PoetryEnum.USER_TYPE_ADMIN.getCode()).one();
- PoetryCache.put(CommonConst.ADMIN, admin);
-
- Family family = familyService.lambdaQuery().eq(Family::getUserId, admin.getId()).one();
- PoetryCache.put(CommonConst.ADMIN_FAMILY, family);
-
- List infoList = new LambdaQueryChainWrapper<>(historyInfoMapper)
- .select(HistoryInfo::getIp, HistoryInfo::getUserId)
- .ge(HistoryInfo::getCreateTime, LocalDateTime.now().with(LocalTime.MIN))
- .list();
-
- PoetryCache.put(CommonConst.IP_HISTORY, new CopyOnWriteArraySet<>(infoList.stream().map(info -> info.getIp() + (info.getUserId() != null ? "_" + info.getUserId().toString() : "")).collect(Collectors.toList())));
-
- Map history = new HashMap<>();
- history.put(CommonConst.IP_HISTORY_PROVINCE, historyInfoMapper.getHistoryByProvince());
- history.put(CommonConst.IP_HISTORY_IP, historyInfoMapper.getHistoryByIp());
- history.put(CommonConst.IP_HISTORY_HOUR, historyInfoMapper.getHistoryBy24Hour());
- history.put(CommonConst.IP_HISTORY_COUNT, historyInfoMapper.getHistoryCount());
- PoetryCache.put(CommonConst.IP_HISTORY_STATISTICS, history);
-
- TioUtil.buildTio();
- TioWebsocketStarter websocketStarter = TioUtil.getTio();
- if (websocketStarter != null) {
- websocketStarter.start();
- }
- }
-}
diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/config/PoetryFilter.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/config/PoetryFilter.java
deleted file mode 100644
index 4106a55..0000000
--- a/poetize-server/poetry-web/src/main/java/com/ld/poetry/config/PoetryFilter.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package com.ld.poetry.config;
-
-import com.alibaba.fastjson.JSON;
-import com.ld.poetry.enums.CodeMsg;
-import com.ld.poetry.utils.CommonQuery;
-import com.ld.poetry.utils.PoetryUtil;
-import com.ld.poetry.utils.storage.FileFilter;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-import org.springframework.web.filter.OncePerRequestFilter;
-
-import javax.servlet.FilterChain;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-
-@Component
-public class PoetryFilter extends OncePerRequestFilter {
-
- @Autowired
- private CommonQuery commonQuery;
-
- @Autowired
- private FileFilter fileFilter;
-
- @Override
- protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException {
- if (!"OPTIONS".equals(httpServletRequest.getMethod())) {
- try {
- commonQuery.saveHistory(PoetryUtil.getIpAddr(httpServletRequest));
- } catch (Exception e) {
- }
-
- if (fileFilter.doFilterFile(httpServletRequest, httpServletResponse)) {
- httpServletResponse.setHeader("Access-Control-Allow-Origin", "*");
- httpServletResponse.setContentType("application/json;charset=UTF-8");
- httpServletResponse.getWriter().write(JSON.toJSONString(PoetryResult.fail(CodeMsg.PARAMETER_ERROR.getCode(), CodeMsg.PARAMETER_ERROR.getMsg())));
- return;
- }
- }
-
- filterChain.doFilter(httpServletRequest, httpServletResponse);
- }
-}
diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/config/PoetryResult.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/config/PoetryResult.java
deleted file mode 100644
index 5f4bb8a..0000000
--- a/poetize-server/poetry-web/src/main/java/com/ld/poetry/config/PoetryResult.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package com.ld.poetry.config;
-
-import com.ld.poetry.enums.CodeMsg;
-import lombok.Data;
-
-import java.io.Serializable;
-
-@Data
-public class PoetryResult implements Serializable {
-
- private static final long serialVersionUI = 1L;
-
- private int code;
- private String message;
- private T data;
- private long currentTimeMillis = System.currentTimeMillis();
-
- public PoetryResult() {
- this.code = 200;
- }
-
- public PoetryResult(int code, String message) {
- this.code = code;
- this.message = message;
- }
-
- public PoetryResult(T data) {
- this.code = 200;
- this.data = data;
- }
-
- public PoetryResult(String message) {
- this.code = 500;
- this.message = message;
- }
-
- public static PoetryResult fail(String message) {
- return new PoetryResult(message);
- }
-
- public static PoetryResult fail(CodeMsg codeMsg) {
- return new PoetryResult(codeMsg.getCode(), codeMsg.getMsg());
- }
-
- public static PoetryResult fail(Integer code, String message) {
- return new PoetryResult(code, message);
- }
-
- public static PoetryResult success(T data) {
- return new PoetryResult(data);
- }
-
- public static PoetryResult success() {
- return new PoetryResult();
- }
-}
diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/config/WebInfoConfigurer.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/config/WebInfoConfigurer.java
deleted file mode 100644
index b206960..0000000
--- a/poetize-server/poetry-web/src/main/java/com/ld/poetry/config/WebInfoConfigurer.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.ld.poetry.config;
-
-import org.springframework.stereotype.Component;
-import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
-import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
-
-@Component
-public class WebInfoConfigurer implements WebMvcConfigurer {
- @Override
- public void addInterceptors(InterceptorRegistry registry) {
- registry.addInterceptor(new WebInfoHandlerInterceptor())
- .addPathPatterns("/**")
- .excludePathPatterns("/user/login", "/admin/**", "/webInfo/getWebInfo", "/webInfo/updateWebInfo");
- }
-}
diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/config/WebInfoHandlerInterceptor.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/config/WebInfoHandlerInterceptor.java
deleted file mode 100644
index d3e5ad4..0000000
--- a/poetize-server/poetry-web/src/main/java/com/ld/poetry/config/WebInfoHandlerInterceptor.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.ld.poetry.config;
-
-import com.alibaba.fastjson.JSON;
-import com.ld.poetry.entity.WebInfo;
-import com.ld.poetry.enums.CodeMsg;
-import com.ld.poetry.constants.CommonConst;
-import com.ld.poetry.utils.cache.PoetryCache;
-import org.springframework.web.servlet.HandlerInterceptor;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-public class WebInfoHandlerInterceptor implements HandlerInterceptor {
-
- @Override
- public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
- WebInfo webInfo = (WebInfo) PoetryCache.get(CommonConst.WEB_INFO);
- if (webInfo == null || !webInfo.getStatus()) {
- response.setContentType("application/json;charset=UTF-8");
- response.getWriter().write(JSON.toJSONString(PoetryResult.fail(CodeMsg.SYSTEM_REPAIR.getCode(), CodeMsg.SYSTEM_REPAIR.getMsg())));
- return false;
- } else {
- return true;
- }
- }
-}
diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/constants/CommonConst.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/constants/CommonConst.java
deleted file mode 100644
index c41ec31..0000000
--- a/poetize-server/poetry-web/src/main/java/com/ld/poetry/constants/CommonConst.java
+++ /dev/null
@@ -1,251 +0,0 @@
-package com.ld.poetry.constants;
-
-
-public class CommonConst {
-
- /**
- * 超级管理员的用户Id
- */
- public static final int ADMIN_USER_ID = 1;
-
- /**
- * 根据用户ID获取Token
- */
- public static final String USER_TOKEN = "user_token_";
-
- public static final String ADMIN_TOKEN = "admin_token_";
-
- /**
- * 根据用户ID获取Token
- */
- public static final String USER_TOKEN_INTERVAL = "user_token_interval_";
-
- public static final String ADMIN_TOKEN_INTERVAL = "admin_token_interval_";
-
- /**
- * Token
- */
- public static final String USER_ACCESS_TOKEN = "user_access_token_";
-
- public static final String ADMIN_ACCESS_TOKEN = "admin_access_token_";
-
- public static final String TOKEN_HEADER = "Authorization";
-
- /**
- * 保存次数
- */
- public static final String SAVE_COUNT_IP = "save_count_ip_";
- public static final String SAVE_COUNT_USER_ID = "save_count_user_id_";
- public static final long SAVE_EXPIRE = 86400;
- public static final int SAVE_MAX_COUNT = 15;
-
- /**
- * IP历史记录缓存
- */
- public static final String IP_HISTORY = "ip_history";
- public static final String IP_HISTORY_STATISTICS = "ip_history_statistics";
- public static final String IP_HISTORY_PROVINCE = "ip_history_province";
- public static final String IP_HISTORY_IP = "ip_history_ip";
- public static final String IP_HISTORY_HOUR = "ip_history_hour";
- public static final String IP_HISTORY_COUNT = "ip_history_count";
-
- /**
- * Token过期时间:10天
- */
- public static final long TOKEN_EXPIRE = 864000;
-
- /**
- * Code过期时间:1天
- */
- public static final long CODE_EXPIRE = 86400;
-
- /**
- * Token重设过期时间间隔:1小时
- */
- public static final long TOKEN_INTERVAL = 3600;
-
- /**
- * Boss信息
- */
- public static final String ADMIN = "admin";
-
- /**
- * BossFamily信息
- */
- public static final String ADMIN_FAMILY = "adminFamily";
-
- /**
- * FamilyList信息
- */
- public static final String FAMILY_LIST = "familyList";
-
- /**
- * 评论和IM邮件
- */
- public static final String COMMENT_IM_MAIL = "comment_im_mail_";
-
- /**
- * 验证码邮件
- */
- public static final String CODE_MAIL = "code_mail_";
-
- /**
- * 评论和IM邮件发送次数
- */
- public static final int COMMENT_IM_MAIL_COUNT = 1;
-
- /**
- * 验证码邮件发送次数
- */
- public static final int CODE_MAIL_COUNT = 3;
-
- /**
- * 验证码
- */
- public static final String USER_CODE = "user_code_";
-
- /**
- * 忘记密码时获取验证码用于找回密码
- */
- public static final String FORGET_PASSWORD = "forget_password_";
-
- /**
- * 网站信息
- */
- public static final String WEB_INFO = "webInfo";
-
- /**
- * 分类信息
- */
- public static final String SORT_INFO = "sortInfo";
-
- /**
- * 赞赏
- */
- public static final String ADMIRE = "admire";
-
- /**
- * 密钥
- */
- public static final String CRYPOTJS_KEY = "sarasarasarasara";
-
- /**
- * 根据用户ID获取用户信息
- */
- public static final String USER_CACHE = "user_";
-
- /**
- * 根据文章ID获取评论数量
- */
- public static final String COMMENT_COUNT_CACHE = "comment_count_";
-
- /**
- * 根据用户ID获取该用户所有文章ID
- */
- public static final String USER_ARTICLE_LIST = "user_article_list_";
-
- /**
- * 文章缓存,用于搜索
- */
- public static final String ARTICLE_LIST = "article_list";
-
- /**
- * 文章缓存,用于首页
- */
- public static final String SORT_ARTICLE_LIST = "sort_article_list";
-
- /**
- * 默认缓存过期时间
- */
- public static final long EXPIRE = 1800;
-
- /**
- * 树洞一次最多查询条数
- */
- public static final int TREE_HOLE_COUNT = 100;
-
- /**
- * 顶层评论ID
- */
- public static final int FIRST_COMMENT = 0;
-
- /**
- * 文章摘要默认字数
- */
- public static final int SUMMARY = 80;
-
- /**
- * 留言的源
- */
- public static final int TREE_HOLE_COMMENT_SOURCE = 0;
-
- /**
- * 资源类型
- */
- public static final String PATH_TYPE_GRAFFITI = "graffiti";
-
- public static final String PATH_TYPE_ARTICLE_PICTURE = "articlePicture";
-
- public static final String PATH_TYPE_USER_AVATAR = "userAvatar";
-
- public static final String PATH_TYPE_ARTICLE_COVER = "articleCover";
-
- public static final String PATH_TYPE_WEB_BACKGROUND_IMAGE = "webBackgroundImage";
-
- public static final String PATH_TYPE_WEB_AVATAR = "webAvatar";
-
- public static final String PATH_TYPE_RANDOM_AVATAR = "randomAvatar";
-
- public static final String PATH_TYPE_RANDOM_COVER = "randomCover";
-
- public static final String PATH_TYPE_COMMENT_PICTURE = "commentPicture";
-
- public static final String PATH_TYPE_INTERNET_MEME = "internetMeme";
-
- public static final String PATH_TYPE_IM_GROUP_AVATAR = "im/groupAvatar";
-
- public static final String PATH_TYPE_IM_GROUP_MESSAGE = "im/groupMessage";
-
- public static final String PATH_TYPE_IM_FRIEND_MESSAGE = "im/friendMessage";
-
- public static final String PATH_TYPE_FUNNY_URL = "funnyUrl";
-
- public static final String PATH_TYPE_FUNNY_COVER = "funnyCover";
-
- public static final String PATH_TYPE_FAVORITES_COVER = "favoritesCover";
-
- public static final String PATH_TYPE_LOVE_COVER = "love/bgCover";
-
- public static final String PATH_TYPE_LOVE_MAN = "love/manCover";
-
- public static final String PATH_TYPE_LOVE_WOMAN = "love/womanCover";
-
- public static final String PATH_TYPE_VIDEO_ARTICLE = "video/article";
-
- public static final String PATH_TYPE_ASSETS = "assets";
-
- /**
- * 资源聚合
- */
- public static final String RESOURCE_PATH_TYPE_FRIEND = "friendUrl";
- public static final String RESOURCE_PATH_TYPE_FUNNY = "funny";
- public static final String RESOURCE_PATH_TYPE_FAVORITES = "favorites";
- public static final String RESOURCE_PATH_TYPE_LOVE_PHOTO = "lovePhoto";
-
- /**
- * 微言
- */
- public static final String WEIYAN_TYPE_FRIEND = "friend";
-
- public static final String WEIYAN_TYPE_NEWS = "news";
-
- /**
- * 友情链接
- */
- public static final String DEFAULT_FRIEND = "\uD83E\uDD47友情链接";
-
- /**
- * 资源校验
- */
- public static final String RESOURCE_ARTICLE_DOC = "resource_article_doc";
-}
diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/AdminArticleController.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/AdminArticleController.java
deleted file mode 100644
index bea776d..0000000
--- a/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/AdminArticleController.java
+++ /dev/null
@@ -1,81 +0,0 @@
-package com.ld.poetry.controller;
-
-import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.ld.poetry.aop.LoginCheck;
-import com.ld.poetry.config.PoetryResult;
-import com.ld.poetry.entity.*;
-import com.ld.poetry.service.ArticleService;
-import com.ld.poetry.utils.PoetryUtil;
-import com.ld.poetry.vo.ArticleVO;
-import com.ld.poetry.vo.BaseRequestVO;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.*;
-
-/**
- *
- * 后台文章 前端控制器
- *
- *
- * @author sara
- * @since 2021-08-13
- */
-@RestController
-@RequestMapping("/admin")
-public class AdminArticleController {
-
- @Autowired
- private ArticleService articleService;
-
- /**
- * 用户查询文章
- */
- @PostMapping("/article/user/list")
- @LoginCheck(1)
- public PoetryResult listUserArticle(@RequestBody BaseRequestVO baseRequestVO) {
- return articleService.listAdminArticle(baseRequestVO, false);
- }
-
- /**
- * Boss查询文章
- */
- @PostMapping("/article/boss/list")
- @LoginCheck(0)
- public PoetryResult listBossArticle(@RequestBody BaseRequestVO baseRequestVO) {
- return articleService.listAdminArticle(baseRequestVO, true);
- }
-
- /**
- * 修改文章状态
- */
- @GetMapping("/article/changeArticleStatus")
- @LoginCheck(1)
- public PoetryResult changeArticleStatus(@RequestParam("articleId") Integer articleId,
- @RequestParam(value = "viewStatus", required = false) Boolean viewStatus,
- @RequestParam(value = "commentStatus", required = false) Boolean commentStatus,
- @RequestParam(value = "recommendStatus", required = false) Boolean recommendStatus) {
- LambdaUpdateChainWrapper updateChainWrapper = articleService.lambdaUpdate()
- .eq(Article::getId, articleId)
- .eq(Article::getUserId, PoetryUtil.getUserId());
- if (viewStatus != null) {
- updateChainWrapper.set(Article::getViewStatus, viewStatus);
- }
- if (commentStatus != null) {
- updateChainWrapper.set(Article::getCommentStatus, commentStatus);
- }
- if (recommendStatus != null) {
- updateChainWrapper.set(Article::getRecommendStatus, recommendStatus);
- }
- updateChainWrapper.update();
- return PoetryResult.success();
- }
-
- /**
- * 查询文章
- */
- @GetMapping("/article/getArticleById")
- @LoginCheck(1)
- public PoetryResult getArticleByIdForUser(@RequestParam("id") Integer id) {
- return articleService.getArticleByIdForUser(id);
- }
-}
diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/AdminCommentController.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/AdminCommentController.java
deleted file mode 100644
index 54344f9..0000000
--- a/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/AdminCommentController.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package com.ld.poetry.controller;
-
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.ld.poetry.aop.LoginCheck;
-import com.ld.poetry.config.PoetryResult;
-import com.ld.poetry.entity.Article;
-import com.ld.poetry.entity.Comment;
-import com.ld.poetry.enums.CommentTypeEnum;
-import com.ld.poetry.service.ArticleService;
-import com.ld.poetry.service.CommentService;
-import com.ld.poetry.utils.PoetryUtil;
-import com.ld.poetry.vo.BaseRequestVO;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.*;
-
-/**
- *
- * 后台评论 前端控制器
- *
- *
- * @author sara
- * @since 2021-08-13
- */
-@RestController
-@RequestMapping("/admin")
-public class AdminCommentController {
-
- @Autowired
- private ArticleService articleService;
-
- @Autowired
- private CommentService commentService;
-
- /**
- * 作者删除评论
- */
- @GetMapping("/comment/user/deleteComment")
- @LoginCheck(1)
- public PoetryResult userDeleteComment(@RequestParam("id") Integer id) {
- Comment comment = commentService.lambdaQuery().select(Comment::getSource, Comment::getType).eq(Comment::getId, id).one();
- if (comment == null) {
- return PoetryResult.success();
- }
- if (!CommentTypeEnum.COMMENT_TYPE_ARTICLE.getCode().equals(comment.getType())) {
- return PoetryResult.fail("权限不足!");
- }
- Article one = articleService.lambdaQuery().eq(Article::getId, comment.getSource()).select(Article::getUserId).one();
- if (one == null || (PoetryUtil.getUserId().intValue() != one.getUserId().intValue())) {
- return PoetryResult.fail("权限不足!");
- }
- commentService.removeById(id);
- return PoetryResult.success();
- }
-
- /**
- * Boss删除评论
- */
- @GetMapping("/comment/boss/deleteComment")
- @LoginCheck(0)
- public PoetryResult bossDeleteComment(@RequestParam("id") Integer id) {
- commentService.removeById(id);
- return PoetryResult.success();
- }
-
- /**
- * 用户查询评论
- */
- @PostMapping("/comment/user/list")
- @LoginCheck(1)
- public PoetryResult listUserComment(@RequestBody BaseRequestVO baseRequestVO) {
- return commentService.listAdminComment(baseRequestVO, false);
- }
-
- /**
- * Boss查询评论
- */
- @PostMapping("/comment/boss/list")
- @LoginCheck(0)
- public PoetryResult listBossComment(@RequestBody BaseRequestVO baseRequestVO) {
- return commentService.listAdminComment(baseRequestVO, true);
- }
-}
diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/AdminController.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/AdminController.java
deleted file mode 100644
index b4a7bf5..0000000
--- a/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/AdminController.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package com.ld.poetry.controller;
-
-import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.ld.poetry.aop.LoginCheck;
-import com.ld.poetry.config.PoetryResult;
-import com.ld.poetry.dao.TreeHoleMapper;
-import com.ld.poetry.dao.WebInfoMapper;
-import com.ld.poetry.entity.*;
-import com.ld.poetry.vo.BaseRequestVO;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.util.CollectionUtils;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.List;
-
-/**
- *
- * 后台 前端控制器
- *
- *
- * @author sara
- * @since 2021-08-13
- */
-@RestController
-@RequestMapping("/admin")
-public class AdminController {
-
- @Autowired
- private WebInfoMapper webInfoMapper;
-
- @Autowired
- private TreeHoleMapper treeHoleMapper;
-
- /**
- * 获取网站信息
- */
- @GetMapping("/webInfo/getAdminWebInfo")
- @LoginCheck(0)
- public PoetryResult getWebInfo() {
- LambdaQueryChainWrapper wrapper = new LambdaQueryChainWrapper<>(webInfoMapper);
- List list = wrapper.list();
- if (!CollectionUtils.isEmpty(list)) {
- return PoetryResult.success(list.get(0));
- } else {
- return PoetryResult.success();
- }
- }
-
- /**
- * Boss查询树洞
- */
- @PostMapping("/treeHole/boss/list")
- @LoginCheck(0)
- public PoetryResult listBossTreeHole(@RequestBody BaseRequestVO baseRequestVO) {
- LambdaQueryChainWrapper wrapper = new LambdaQueryChainWrapper<>(treeHoleMapper);
- wrapper.orderByDesc(TreeHole::getCreateTime).page(baseRequestVO);
- return PoetryResult.success(baseRequestVO);
- }
-}
diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/AdminUserController.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/AdminUserController.java
deleted file mode 100644
index 39951b0..0000000
--- a/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/AdminUserController.java
+++ /dev/null
@@ -1,119 +0,0 @@
-package com.ld.poetry.controller;
-
-import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.ld.poetry.aop.LoginCheck;
-import com.ld.poetry.config.PoetryResult;
-import com.ld.poetry.constants.CommonConst;
-import com.ld.poetry.entity.*;
-import com.ld.poetry.enums.CodeMsg;
-import com.ld.poetry.enums.PoetryEnum;
-import com.ld.poetry.im.websocket.TioUtil;
-import com.ld.poetry.im.websocket.TioWebsocketStarter;
-import com.ld.poetry.service.UserService;
-import com.ld.poetry.utils.PoetryUtil;
-import com.ld.poetry.utils.cache.PoetryCache;
-import com.ld.poetry.vo.BaseRequestVO;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.*;
-import org.tio.core.Tio;
-
-/**
- *
- * 后台用户 前端控制器
- *
- *
- * @author sara
- * @since 2021-08-13
- */
-@RestController
-@RequestMapping("/admin")
-public class AdminUserController {
-
- @Autowired
- private UserService userService;
-
- /**
- * 查询用户
- */
- @PostMapping("/user/list")
- @LoginCheck(0)
- public PoetryResult listUser(@RequestBody BaseRequestVO baseRequestVO) {
- return userService.listUser(baseRequestVO);
- }
-
- /**
- * 修改用户状态
- *
- * flag = true:解禁
- * flag = false:封禁
- */
- @GetMapping("/user/changeUserStatus")
- @LoginCheck(0)
- public PoetryResult changeUserStatus(@RequestParam("userId") Integer userId, @RequestParam("flag") Boolean flag) {
- if (userId.intValue() == PoetryUtil.getAdminUser().getId().intValue()) {
- return PoetryResult.fail("站长状态不能修改!");
- }
-
- LambdaUpdateChainWrapper updateChainWrapper = userService.lambdaUpdate().eq(User::getId, userId);
- if (flag) {
- updateChainWrapper.eq(User::getUserStatus, PoetryEnum.STATUS_DISABLE.getCode()).set(User::getUserStatus, PoetryEnum.STATUS_ENABLE.getCode()).update();
- } else {
- updateChainWrapper.eq(User::getUserStatus, PoetryEnum.STATUS_ENABLE.getCode()).set(User::getUserStatus, PoetryEnum.STATUS_DISABLE.getCode()).update();
- }
- logout(userId);
- return PoetryResult.success();
- }
-
- /**
- * 修改用户赞赏
- */
- @GetMapping("/user/changeUserAdmire")
- @LoginCheck(0)
- public PoetryResult changeUserAdmire(@RequestParam("userId") Integer userId, @RequestParam("admire") String admire) {
- userService.lambdaUpdate()
- .eq(User::getId, userId)
- .set(User::getAdmire, admire)
- .update();
- PoetryCache.remove(CommonConst.ADMIRE);
- return PoetryResult.success();
- }
-
- /**
- * 修改用户类型
- */
- @GetMapping("/user/changeUserType")
- @LoginCheck(0)
- public PoetryResult changeUserType(@RequestParam("userId") Integer userId, @RequestParam("userType") Integer userType) {
- if (userId.intValue() == PoetryUtil.getAdminUser().getId().intValue()) {
- return PoetryResult.fail("站长类型不能修改!");
- }
-
- if (userType != 0 && userType != 1 && userType != 2) {
- return PoetryResult.fail(CodeMsg.PARAMETER_ERROR);
- }
- userService.lambdaUpdate().eq(User::getId, userId).set(User::getUserType, userType).update();
-
- logout(userId);
- return PoetryResult.success();
- }
-
- private void logout(Integer userId) {
- if (PoetryCache.get(CommonConst.ADMIN_TOKEN + userId) != null) {
- String token = (String) PoetryCache.get(CommonConst.ADMIN_TOKEN + userId);
- PoetryCache.remove(CommonConst.ADMIN_TOKEN + userId);
- PoetryCache.remove(token);
- }
-
- if (PoetryCache.get(CommonConst.USER_TOKEN + userId) != null) {
- String token = (String) PoetryCache.get(CommonConst.USER_TOKEN + userId);
- PoetryCache.remove(CommonConst.USER_TOKEN + userId);
- PoetryCache.remove(token);
- }
- TioWebsocketStarter tioWebsocketStarter = TioUtil.getTio();
- if (tioWebsocketStarter != null) {
- Tio.removeUser(tioWebsocketStarter.getServerTioConfig(), String.valueOf(userId), "remove user");
- }
-
- }
-}
diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/ArticleController.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/ArticleController.java
deleted file mode 100644
index 53b3de3..0000000
--- a/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/ArticleController.java
+++ /dev/null
@@ -1,99 +0,0 @@
-package com.ld.poetry.controller;
-
-
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.ld.poetry.aop.LoginCheck;
-import com.ld.poetry.config.PoetryResult;
-import com.ld.poetry.service.ArticleService;
-import com.ld.poetry.constants.CommonConst;
-import com.ld.poetry.utils.cache.PoetryCache;
-import com.ld.poetry.utils.PoetryUtil;
-import com.ld.poetry.vo.ArticleVO;
-import com.ld.poetry.vo.BaseRequestVO;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.List;
-import java.util.Map;
-
-
-/**
- *
- * 文章表 前端控制器
- *
- *
- * @author sara
- * @since 2021-08-13
- */
-@RestController
-@RequestMapping("/article")
-public class ArticleController {
-
- @Autowired
- private ArticleService articleService;
-
-
- /**
- * 保存文章
- */
- @LoginCheck(1)
- @PostMapping("/saveArticle")
- public PoetryResult saveArticle(@Validated @RequestBody ArticleVO articleVO) {
- PoetryCache.remove(CommonConst.USER_ARTICLE_LIST + PoetryUtil.getUserId().toString());
- PoetryCache.remove(CommonConst.ARTICLE_LIST);
- PoetryCache.remove(CommonConst.SORT_ARTICLE_LIST);
- return articleService.saveArticle(articleVO);
- }
-
-
- /**
- * 删除文章
- */
- @GetMapping("/deleteArticle")
- @LoginCheck(1)
- public PoetryResult deleteArticle(@RequestParam("id") Integer id) {
- PoetryCache.remove(CommonConst.USER_ARTICLE_LIST + PoetryUtil.getUserId().toString());
- PoetryCache.remove(CommonConst.ARTICLE_LIST);
- PoetryCache.remove(CommonConst.SORT_ARTICLE_LIST);
- return articleService.deleteArticle(id);
- }
-
-
- /**
- * 更新文章
- */
- @PostMapping("/updateArticle")
- @LoginCheck(1)
- public PoetryResult updateArticle(@Validated @RequestBody ArticleVO articleVO) {
- PoetryCache.remove(CommonConst.ARTICLE_LIST);
- PoetryCache.remove(CommonConst.SORT_ARTICLE_LIST);
- return articleService.updateArticle(articleVO);
- }
-
-
- /**
- * 查询文章List
- */
- @PostMapping("/listArticle")
- public PoetryResult listArticle(@RequestBody BaseRequestVO baseRequestVO) {
- return articleService.listArticle(baseRequestVO);
- }
-
- /**
- * 查询分类文章List
- */
- @GetMapping("/listSortArticle")
- public PoetryResult