docs: localize paopao.info assets in bilingual README files

pull/718/head
ROC 5 months ago
parent 8d80606f27
commit 8a55d57df5

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

@ -202,11 +202,11 @@ All notable changes to paopao-ce are documented in this file.
TweetMobileEllipsisSize: 300 # 移动端推文作为feed显示的最长字数默认300字
DefaultTweetVisibility: friend # 推文可见性,默认好友可见 值: public/following/friend/private
DefaultMsgLoopInterval: 5000 # 拉取未读消息的间隔,单位:毫秒, 默认5000ms
CopyrightTop: "2023 paopao.info"
CopyrightLeft: "Roc's Me"
CopyrightTop: "2026 PaoPao"
CopyrightLeft: ""
CopyrightLeftLink: ""
CopyrightRight: "泡泡(PaoPao)开源社区"
CopyrightRightLink: "https://www.paopao.info"
CopyrightRight: "Github"
CopyrightRightLink: "https://github.com/rocboss/paopao-ce"
...
```
- add read more contents support for post card in tweets list.

@ -10,7 +10,7 @@
<div align="center">
<a href="https://github.com/rocboss/paopao-ce">
<img src="https://assets.paopao.info/static/paopao-logo.png" alt="PaoPao logo" width="88" height="88">
<img src="./.assets/readme/paopao-logo.png" alt="PaoPao logo" width="88" height="88">
</a>
<h1 align="center">PaoPao</h1>
@ -24,7 +24,7 @@
<p align="center">
<a href="README_ZH.md">简体中文</a>
·
<a href="https://www.paopao.info/">Live Demo</a>
<a href="https://paopao-demo.vercel.app/">Live Demo</a>
·
<a href="https://github.com/rocboss/paopao-ce/pulls">Pull Requests</a>
·
@ -52,15 +52,15 @@ The repository is suitable for teams or individuals who want to run a community
### Web
[![Light theme preview](https://assets.paopao.info/static/paopao-light.jpeg)](https://www.paopao.info)
[![Light theme preview](./.assets/readme/preview-light.jpeg)](https://paopao-demo.vercel.app)
[![Dark theme preview](https://assets.paopao.info/static/paopao-dark.jpeg)](https://www.paopao.info)
[![Dark theme preview](./.assets/readme/preview-dark.jpeg)](https://paopao-demo.vercel.app)
### Desktop
![](docs/proposal/.assets/000-00.jpg)
More screenshots and live behavior are available at [paopao.info](https://www.paopao.info/).
More screenshots and live behavior are available at [PaoPao](https://paopao-demo.vercel.app/).
## Architecture at a Glance

@ -10,7 +10,7 @@
<div align="center">
<a href="https://github.com/rocboss/paopao-ce">
<img src="https://assets.paopao.info/static/paopao-logo.png" alt="PaoPao logo" width="88" height="88">
<img src="./.assets/readme/paopao-logo.png" alt="PaoPao logo" width="88" height="88">
</a>
<h1 align="center">PaoPao</h1>
@ -24,7 +24,7 @@
<p align="center">
<a href="README.md">English</a>
·
<a href="https://www.paopao.info/">在线演示</a>
<a href="https://paopao-demo.vercel.app/">在线演示</a>
·
<a href="https://github.com/rocboss/paopao-ce/pulls">Pull Requests</a>
·
@ -52,15 +52,15 @@ PaoPao 是一个完整的开源微社区系统,包含 Go 后端、Vue 3 Web
### Web 端
[![明色主题预览](https://assets.paopao.info/static/paopao-light.jpeg)](https://www.paopao.info)
[![明色主题预览](./.assets/readme/preview-light.jpeg)](https://paopao-demo.vercel.app)
[![暗色主题预览](https://assets.paopao.info/static/paopao-dark.jpeg)](https://www.paopao.info)
[![暗色主题预览](./.assets/readme/preview-dark.jpeg)](https://paopao-demo.vercel.app)
### 桌面端
![](docs/proposal/.assets/000-00.jpg)
更多效果可前往 [paopao.info](https://www.paopao.info/) 查看。
更多效果可前往 [PaoPao](https://paopao-demo.vercel.app/) 查看。
## 架构概览

@ -3,8 +3,7 @@ PaoPao部署站点信息。
| 名称 | 网址 | 站长 | 备注 |
| ----- | ----- | ----- | ----- |
|泡泡|[www.paopao.info](https://www.paopao.info)|[ROC](https://www.paopao.info/#/user?username=roc 'roc(@paopao.info)')|PaoPao官方站点|
|布里塔|[bulita.cn](https://bulita.cn)|[chendong](https://www.paopao.info/#/user?username=chendong 'chendong(@paopao.info)')|招聘求职等信息|
|提示词社区|[promptser.cn](https://promptser.cn)|[henryspace](https://paopao.info/#/user?username=henryspace 'henryspace(@paopao.info)')|提示词社区|
|iiBiuBiu|[iibiubiu.com](https://iibiubiu.com)|[北野](https://www.paopao.info/#/user?username=alimy 'alimy(@paopao.info)')|开发、测试备用机可以体验最新版本paopao-ce|
|稍言|[slowsay.com](https://slowsay.com)|[orzi](https://www.paopao.info/#/user?username=orzi 'orzi(@paopao.info)')|测试演示,修改了用户系统等内容|
|布里塔|[bulita.cn](https://bulita.cn)|chendong|招聘求职等信息|
|提示词社区|[promptser.cn](https://promptser.cn)|henryspace|提示词社区|
|iiBiuBiu|[iibiubiu.com](https://iibiubiu.com)|北野|开发、测试备用机可以体验最新版本paopao-ce|
|稍言|[slowsay.com](https://slowsay.com)|orzi|测试演示,修改了用户系统等内容|

@ -3,6 +3,3 @@
* [0000-讨论样式模版](./0000-讨论样式模版.md "讨论样式模版")
* [0001-FAQs](./0001-FAQs.md "FAQs")
### paopao.info
关于paopao-ce的交流、反馈也可以直接在我们官网[paopao.info](https://www.paopao.info)进行,发布动态时记得加上标签`#paopao-ce`或类似主题相关的标签,方便话题查找。欢迎大家在[paopao.info](https://www.paopao.info)畅快愉悦的交流一起让paopao-ce的用户体验更好、更便捷。

@ -22,56 +22,56 @@ import (
)
var defaultAvatars = []string{
"https://assets.paopao.info/public/avatar/default/zoe.png",
"https://assets.paopao.info/public/avatar/default/william.png",
"https://assets.paopao.info/public/avatar/default/walter.png",
"https://assets.paopao.info/public/avatar/default/thomas.png",
"https://assets.paopao.info/public/avatar/default/taylor.png",
"https://assets.paopao.info/public/avatar/default/sophia.png",
"https://assets.paopao.info/public/avatar/default/sam.png",
"https://assets.paopao.info/public/avatar/default/ryan.png",
"https://assets.paopao.info/public/avatar/default/ruby.png",
"https://assets.paopao.info/public/avatar/default/quinn.png",
"https://assets.paopao.info/public/avatar/default/paul.png",
"https://assets.paopao.info/public/avatar/default/owen.png",
"https://assets.paopao.info/public/avatar/default/olivia.png",
"https://assets.paopao.info/public/avatar/default/norman.png",
"https://assets.paopao.info/public/avatar/default/nora.png",
"https://assets.paopao.info/public/avatar/default/natalie.png",
"https://assets.paopao.info/public/avatar/default/naomi.png",
"https://assets.paopao.info/public/avatar/default/miley.png",
"https://assets.paopao.info/public/avatar/default/mike.png",
"https://assets.paopao.info/public/avatar/default/lucas.png",
"https://assets.paopao.info/public/avatar/default/kylie.png",
"https://assets.paopao.info/public/avatar/default/julia.png",
"https://assets.paopao.info/public/avatar/default/joshua.png",
"https://assets.paopao.info/public/avatar/default/john.png",
"https://assets.paopao.info/public/avatar/default/jane.png",
"https://assets.paopao.info/public/avatar/default/jackson.png",
"https://assets.paopao.info/public/avatar/default/ivy.png",
"https://assets.paopao.info/public/avatar/default/isaac.png",
"https://assets.paopao.info/public/avatar/default/henry.png",
"https://assets.paopao.info/public/avatar/default/harry.png",
"https://assets.paopao.info/public/avatar/default/harold.png",
"https://assets.paopao.info/public/avatar/default/hanna.png",
"https://assets.paopao.info/public/avatar/default/grace.png",
"https://assets.paopao.info/public/avatar/default/george.png",
"https://assets.paopao.info/public/avatar/default/freddy.png",
"https://assets.paopao.info/public/avatar/default/frank.png",
"https://assets.paopao.info/public/avatar/default/finn.png",
"https://assets.paopao.info/public/avatar/default/emma.png",
"https://assets.paopao.info/public/avatar/default/emily.png",
"https://assets.paopao.info/public/avatar/default/edward.png",
"https://assets.paopao.info/public/avatar/default/clara.png",
"https://assets.paopao.info/public/avatar/default/claire.png",
"https://assets.paopao.info/public/avatar/default/chloe.png",
"https://assets.paopao.info/public/avatar/default/audrey.png",
"https://assets.paopao.info/public/avatar/default/arthur.png",
"https://assets.paopao.info/public/avatar/default/anna.png",
"https://assets.paopao.info/public/avatar/default/andy.png",
"https://assets.paopao.info/public/avatar/default/alfred.png",
"https://assets.paopao.info/public/avatar/default/alexa.png",
"https://assets.paopao.info/public/avatar/default/abigail.png",
"https://paopao-demo.vercel.app/avatar/default/zoe.png",
"https://paopao-demo.vercel.app/avatar/default/william.png",
"https://paopao-demo.vercel.app/avatar/default/walter.png",
"https://paopao-demo.vercel.app/avatar/default/thomas.png",
"https://paopao-demo.vercel.app/avatar/default/taylor.png",
"https://paopao-demo.vercel.app/avatar/default/sophia.png",
"https://paopao-demo.vercel.app/avatar/default/sam.png",
"https://paopao-demo.vercel.app/avatar/default/ryan.png",
"https://paopao-demo.vercel.app/avatar/default/ruby.png",
"https://paopao-demo.vercel.app/avatar/default/quinn.png",
"https://paopao-demo.vercel.app/avatar/default/paul.png",
"https://paopao-demo.vercel.app/avatar/default/owen.png",
"https://paopao-demo.vercel.app/avatar/default/olivia.png",
"https://paopao-demo.vercel.app/avatar/default/norman.png",
"https://paopao-demo.vercel.app/avatar/default/nora.png",
"https://paopao-demo.vercel.app/avatar/default/natalie.png",
"https://paopao-demo.vercel.app/avatar/default/naomi.png",
"https://paopao-demo.vercel.app/avatar/default/miley.png",
"https://paopao-demo.vercel.app/avatar/default/mike.png",
"https://paopao-demo.vercel.app/avatar/default/lucas.png",
"https://paopao-demo.vercel.app/avatar/default/kylie.png",
"https://paopao-demo.vercel.app/avatar/default/julia.png",
"https://paopao-demo.vercel.app/avatar/default/joshua.png",
"https://paopao-demo.vercel.app/avatar/default/john.png",
"https://paopao-demo.vercel.app/avatar/default/jane.png",
"https://paopao-demo.vercel.app/avatar/default/jackson.png",
"https://paopao-demo.vercel.app/avatar/default/ivy.png",
"https://paopao-demo.vercel.app/avatar/default/isaac.png",
"https://paopao-demo.vercel.app/avatar/default/henry.png",
"https://paopao-demo.vercel.app/avatar/default/harry.png",
"https://paopao-demo.vercel.app/avatar/default/harold.png",
"https://paopao-demo.vercel.app/avatar/default/hanna.png",
"https://paopao-demo.vercel.app/avatar/default/grace.png",
"https://paopao-demo.vercel.app/avatar/default/george.png",
"https://paopao-demo.vercel.app/avatar/default/freddy.png",
"https://paopao-demo.vercel.app/avatar/default/frank.png",
"https://paopao-demo.vercel.app/avatar/default/finn.png",
"https://paopao-demo.vercel.app/avatar/default/emma.png",
"https://paopao-demo.vercel.app/avatar/default/emily.png",
"https://paopao-demo.vercel.app/avatar/default/edward.png",
"https://paopao-demo.vercel.app/avatar/default/clara.png",
"https://paopao-demo.vercel.app/avatar/default/claire.png",
"https://paopao-demo.vercel.app/avatar/default/chloe.png",
"https://paopao-demo.vercel.app/avatar/default/audrey.png",
"https://paopao-demo.vercel.app/avatar/default/arthur.png",
"https://paopao-demo.vercel.app/avatar/default/anna.png",
"https://paopao-demo.vercel.app/avatar/default/andy.png",
"https://paopao-demo.vercel.app/avatar/default/alfred.png",
"https://paopao-demo.vercel.app/avatar/default/alexa.png",
"https://paopao-demo.vercel.app/avatar/default/abigail.png",
}
func getRandomAvatar() string {

@ -1,139 +1,117 @@
<template>
<div class="message-item" :class="{ unread: isNotWhisperSender && message.is_read === 0 }" @click="handleReadMessage(message)">
<n-thing content-indented>
<template #avatar>
<n-avatar round :size="30" :src="
message.type == 4 && message.sender_user_id == userInfo.id
? message.receiver_user.avatar
: ( message.sender_user.id > 0
? message.sender_user.avatar
: defaultavatar
)
" />
<div class="message-item" :class="{ unread: isNotWhisperSender && message.is_read === 0 }" @click="handleReadMessage(message)">
<n-thing content-indented>
<template #avatar>
<n-avatar round :size="30" :src="message.type == 4 && message.sender_user_id == userInfo.id
? message.receiver_user.avatar
: (message.sender_user.id > 0
? message.sender_user.avatar
: defaultavatar
)
" />
</template>
<template #header>
<div class="sender-wrap">
<span class="nickname" v-if="(message.type != 4 && message.sender_user.id > 0) || isWhisperReceiver">
<router-link @click.stop class="username-link" :to="{
name: 'user',
query: {
s: message.sender_user.username,
},
}">
{{ message.sender_user.nickname }}
</router-link>
<span v-if="desktopModelShow" class="username">
@{{ message.sender_user.username }}
</span>
</span>
<span class="nickname" v-else-if="isWhisperSender">
<router-link @click.stop class="username-link" :to="{
name: 'user',
query: {
s: message.receiver_user.username,
},
}">
{{ message.receiver_user.nickname }}
</router-link>
<span v-if="desktopModelShow" class="username">
@{{ message.receiver_user.username }}
</span>
</span>
<span class="nickname" v-else> </span>
<n-tag v-if="isWhisperSender" class="top-tag" type="info" size="small" round>
<template #icon>
<n-icon :component="CheckmarkCircle" />
</template>
<template #header>
<div class="sender-wrap">
<span class="nickname" v-if="(message.type !=4 && message.sender_user.id > 0) || isWhisperReceiver">
<router-link @click.stop class="username-link" :to="{
name: 'user',
query: {
s: message.sender_user.username,
},
}">
{{ message.sender_user.nickname }}
</router-link>
<span v-if="desktopModelShow" class="username">
@{{ message.sender_user.username }}
</span>
</span>
<span class="nickname" v-else-if="isWhisperSender">
<router-link @click.stop class="username-link" :to="{
name: 'user',
query: {
s: message.receiver_user.username,
},
}">
{{ message.receiver_user.nickname }}
</router-link>
<span v-if="desktopModelShow" class="username">
@{{ message.receiver_user.username }}
</span>
</span>
<span class="nickname" v-else> </span>
<n-tag
v-if="isWhisperSender"
class="top-tag"
type="info"
size="small"
round
>
<template #icon>
<n-icon :component="CheckmarkCircle" />
</template>
</n-tag>
<n-tag
v-if="message.type == 4 && message.receiver_user_id == userInfo.id"
class="top-tag"
type="warning"
size="small"
round
>
<template #icon>
<n-icon :component="CheckmarkCircle" />
</template>
</n-tag>
</div>
</n-tag>
<n-tag v-if="message.type == 4 && message.receiver_user_id == userInfo.id" class="top-tag" type="warning" size="small" round>
<template #icon>
<n-icon :component="CheckmarkCircle" />
</template>
<template #header-extra>
<span class="timestamp">
<n-badge v-if="isNotWhisperSender && message.is_read === 0" dot processing />
<span class="timestamp-txt">
{{ formatRelativeTime(message.created_on) }}
</span>
<n-dropdown
placement="bottom-end"
trigger="click"
size="small"
:options="actionOpts"
@select="handleAction"
>
<n-button quaternary circle>
<template #icon>
<n-icon>
<more-horiz-filled />
</n-icon>
</template>
</n-button>
</n-dropdown>
</span>
</template>
<template #description>
<n-alert :show-icon="false" class="brief-wrap" :type="!isNotWhisperSender || message.is_read > 0 ? 'default' : 'success'">
<div v-if="message.type != 4" class="brief-content">
{{ message.brief }}
<span v-if="message.type === 1 || message.type === 2 || message.type === 3"
@click.stop="viewDetail(message)" class="hash-link view-link">
<n-icon>
<share-outline />
</n-icon>
</span>
</div>
<div v-if="message.type === 4" class="whisper-content-wrap">
{{ message.content }}
</div>
<div v-if="message.type === 5" class="requesting-friend-wrap">
{{ message.content }}
<span v-if="message.reply_id === 1" @click.stop="agreeAddFriend(message)"
class="hash-link view-link">
<n-icon>
<checkmark-outline />
</n-icon>
</span>
<span v-if="message.reply_id === 1" @click.stop="rejectAddFriend(message)"
class="hash-link view-link">
<n-icon>
<close-outline />
</n-icon>
</span>
<span v-if="message.reply_id === 2" class="status-info">
<n-icon>
<checkmark-done-outline />
</n-icon>
</span>
<span v-if="message.reply_id === 3" class="status-info">
<n-icon>
<close-outline />
</n-icon>
</span>
</div>
</n-alert>
</template>
</n-thing>
</div>
</n-tag>
</div>
</template>
<template #header-extra>
<span class="timestamp">
<n-badge v-if="isNotWhisperSender && message.is_read === 0" dot processing />
<span class="timestamp-txt">
{{ formatRelativeTime(message.created_on) }}
</span>
<n-dropdown placement="bottom-end" trigger="click" size="small" :options="actionOpts" @select="handleAction">
<n-button quaternary circle>
<template #icon>
<n-icon>
<more-horiz-filled />
</n-icon>
</template>
</n-button>
</n-dropdown>
</span>
</template>
<template #description>
<n-alert :show-icon="false" class="brief-wrap" :type="!isNotWhisperSender || message.is_read > 0 ? 'default' : 'success'">
<div v-if="message.type != 4" class="brief-content">
{{ message.brief }}
<span v-if="message.type === 1 || message.type === 2 || message.type === 3" @click.stop="viewDetail(message)" class="hash-link view-link">
<n-icon>
<share-outline />
</n-icon>
</span>
</div>
<div v-if="message.type === 4" class="whisper-content-wrap">
{{ message.content }}
</div>
<div v-if="message.type === 5" class="requesting-friend-wrap">
{{ message.content }}
<span v-if="message.reply_id === 1" @click.stop="agreeAddFriend(message)" class="hash-link view-link">
<n-icon>
<checkmark-outline />
</n-icon>
</span>
<span v-if="message.reply_id === 1" @click.stop="rejectAddFriend(message)" class="hash-link view-link">
<n-icon>
<close-outline />
</n-icon>
</span>
<span v-if="message.reply_id === 2" class="status-info">
<n-icon>
<checkmark-done-outline />
</n-icon>
</span>
<span v-if="message.reply_id === 3" class="status-info">
<n-icon>
<close-outline />
</n-icon>
</span>
</div>
</n-alert>
</template>
</n-thing>
</div>
</template>
<script setup lang="ts">
@ -160,7 +138,7 @@ import { Api } from '@/utils/request';
import UserAction from '@/composables/useUserAction';
const defaultavatar =
'https://assets.paopao.info/public/avatar/default/admin.png';
'https://paopao-demo.vercel.app/avatar/default/admin.png';
const router = useRouter();
@ -188,7 +166,7 @@ const renderIcon = (icon: Component) => {
const actionOpts = computed(() => {
let user =
props.message.type == 4 &&
props.message.sender_user_id == userInfo.value.id
props.message.sender_user_id == userInfo.value.id
? props.message.receiver_user
: props.message.sender_user;
let options: DropdownOption[] = [
@ -222,21 +200,21 @@ const emit = defineEmits<{
}>();
const onHandleFollowAction = (message: Item.MessageProps) => {
let user =
message.type == 4 && message.sender_user_id == userInfo.value.id
? message.receiver_user
: message.sender_user;
UserAction.followAction(dialog, user.id, user.username, user.is_following)
.then(_action => {
user.is_following = _action;
// TODO: 这里暴力处理简单重新加载更好的做法是遍历所有message如果是对应user就更新到新状态
setTimeout(() => {
emit('reload');
}, 50);
})
.catch(err => {
console.log(err);
});
let user =
message.type == 4 && message.sender_user_id == userInfo.value.id
? message.receiver_user
: message.sender_user;
UserAction.followAction(dialog, user.id, user.username, user.is_following)
.then(_action => {
user.is_following = _action;
// TODO: 这里暴力处理简单重新加载更好的做法是遍历所有message如果是对应user就更新到新状态
setTimeout(() => {
emit('reload');
}, 50);
})
.catch(err => {
console.log(err);
});
};
const handleAction = (item: 'whisper' | 'follow' | 'unfollow') => {
@ -345,75 +323,79 @@ const handleReadMessage = (message: Item.MessageProps) => {
<style lang="less" scoped>
.message-item {
padding: 16px;
padding: 16px;
&.unread {
background: #fcfffc;
&.unread {
background: #fcfffc;
}
.sender-wrap {
display: flex;
align-items: center;
.top-tag {
transform: scale(0.75);
}
.sender-wrap {
display: flex;
align-items: center;
.top-tag {
transform: scale(0.75);
}
.username {
opacity: 0.75;
font-size: 14px;
}
.username {
opacity: 0.75;
font-size: 14px;
}
}
.timestamp {
opacity: 0.75;
font-size: 12px;
display: flex;
align-items: center;
.timestamp {
opacity: 0.75;
font-size: 12px;
display: flex;
align-items: center;
.timestamp-txt {
margin-left: 6px;
}
.timestamp-txt {
margin-left: 6px;
}
}
.brief-wrap {
margin-top: 10px;
.brief-content {
display: flex;
width: 100%;
}
.whisper-content-wrap {
display: flex;
width: 100%;
}
.requesting-friend-wrap {
display: flex;
width: 100%;
}
.brief-wrap {
margin-top: 10px;
.brief-content {
display: flex;
width: 100%;
}
.view-link {
margin-left: 8px;
display: flex;
align-items: center;
.whisper-content-wrap {
display: flex;
width: 100%;
}
.status-info {
margin-left: 8px;
align-items: center;
.requesting-friend-wrap {
display: flex;
width: 100%;
}
}
.view-link {
margin-left: 8px;
display: flex;
align-items: center;
}
.status-info {
margin-left: 8px;
align-items: center;
}
}
.dark {
.message-item {
&.unread {
background: #0f180b;
}
.brief-wrap {
background-color: #18181c;
}
background-color: rgba(16, 16, 20, 0.75);
.message-item {
&.unread {
background: #0f180b;
}
.brief-wrap {
background-color: #18181c;
}
background-color: rgba(16, 16, 20, 0.75);
}
}
</style>

@ -17,11 +17,11 @@ export const useStoreProfile = defineStore("profile", () => {
tweetMobileEllipsisSize: 300,
defaultTweetVisibility: 'friend',
defaultMsgLoopInterval: 5000,
copyrightTop: '2023 paopao.info',
copyrightLeft: 'Roc\'s Me',
copyrightTop: '2026 PaoPao',
copyrightLeft: '',
copyrightLeftLink: '',
copyrightRight: '(PaoPao)',
copyrightRightLink: 'https://www.paopao.info',
copyrightRight: 'Github',
copyrightRightLink: 'https://github.com/rocboss/paopao-ce',
});
function loadDefaultSiteProfile() {

Loading…
Cancel
Save