upload project

This commit is contained in:
unknown 2025-12-27 17:16:03 +08:00
commit 06961cae04
422 changed files with 110626 additions and 0 deletions

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,8 @@
{
"navigationBarTitleText": "文字动态",
"navigationBarBackgroundColor": "#667eea",
"navigationBarTextStyle": "white",
"backgroundColor": "#f8f9fa",
"disableScroll": true,
"navigationStyle": "custom"
}

View file

@ -0,0 +1,132 @@
<!-- 导航栏 -->
<view class="custom-nav" style="height: {{totalNavBarHeight}}px; padding-top: {{statusBarHeight}}px;">
<view class="nav-content">
<image class="back-btn-img" src="/images/back_arrow.svg" bindtap="onNavBack"></image>
<view class="nav-title">文字动态</view>
<view class="nav-placeholder"></view>
</view>
</view>
<!-- 外部容器框 -->
<view class="outer-container">
<!-- 标题区域 -->
<view class="title-area">
<text class="page-title">我的动态</text>
<button
class="publish-btn {{!canPublish ? 'disabled' : ''}}"
bindtap="publishDynamic"
>发布</button>
</view>
<!-- 文字编辑区域 -->
<view class="text-area">
<textarea
class="content-textarea"
id="contentInput"
bindinput="onTextInput"
placeholder="What's happening..."
placeholder-class="placeholder-gray"
maxlength="120"
value="{{inputText}}"
/>
<view class="text-count">{{textLength}}/120</view>
</view>
<!-- 已选图片显示 -->
<view wx:if="{{selectedImage}}" class="image-wrapper">
<image
src="{{selectedImage}}"
mode="widthFix"
class="selected-image"
bindtap="previewImage"
/>
<view class="delete-icon" bindtap="removeImage">×</view>
</view>
<!-- 底部操作栏 -->
<view class="bottom-actions">
<!-- 功能区 -->
<view class="features-area">
<view class="visibility-area" bindtap="showVisibilityModal">
<image src="/images/User.svg" class="visibility-icon"></image>
<text class="feature-text">{{visibility === '' ? '谁可以看' :
(visibility === 'public' ? '公开' : '私密')}}</text>
</view>
<view wx:if="{{!selectedImage}}" class="upload-btn" bindtap="showImageAction">
<image src="/images/Image.svg" class="upload-icon"></image>
<text class="feature-text">上传图片</text>
</view>
</view>
</view>
<!-- 当前位置 -->
<view class="location-area" bindtap="chooseLocation">
<image src="/images/loca.svg" class="location-icon"></image>
<text class="location-text">{{currentLocation || '未选择位置'}}</text>
</view>
</view>
<!-- 返回弹窗遮罩 -->
<view class="quit-mask" wx:if="{{showQuitModal}}">
<view class="quit-modal">
<view class="quit-modal-content">退出后此次编辑将不会保留,是否退出?</view>
<view class="quit-modal-btns">
<button class="modal-btn" bindtap="quitEdit">退出</button>
<button class="modal-btn" bindtap="cancelQuit">取消</button>
</view>
</view>
</view>
<!-- 图片选择弹窗-->
<view class="camera-action-sheet {{showImageAction ? 'show' : ''}}">
<view class="action-sheet-mask" bindtap="hideImageAction"></view>
<view class="action-sheet-content">
<view class="action-sheet-item primary" bindtap="takePhoto">
<text class="action-text">拍摄</text>
</view>
<view class="action-sheet-divider-thin"></view>
<view class="action-sheet-item primary" bindtap="chooseImageFromAlbum">
<text class="action-text">从相册选择</text>
</view>
<view class="action-sheet-divider"></view>
<view class="action-sheet-item cancel" bindtap="hideImageAction">
<text class="action-text">取消</text>
</view>
</view>
</view>
<!-- 审核失败弹窗 -->
<view class="audit-modal" wx:if="{{showAuditModal}}">
<view class="modal-mask" bindtap="hideAuditModal"></view>
<view class="modal-content">
<view class="modal-title">发布失败</view>
<rich-text class="modal-content-text" nodes="{{auditReason}}"></rich-text>
<view class="modal-btn" bindtap="hideAuditModal">我知道了</view>
</view>
</view>
<!-- 定位失败弹窗 -->
<view class="audit-modal" wx:if="{{showLocationErrorModal}}">
<view class="modal-mask" bindtap="hideLocationErrorModal"></view>
<view class="modal-content">
<view class="modal-title">定位失败</view>
<view class="modal-content-text">未找到你的定位,需要开启定位权限,请重试。</view>
<view class="modal-btns">
<view class="modal-btn cancel-btn" bindtap="hideLocationErrorModal">取消</view>
<view class="modal-btn confirm-btn" bindtap="retryLocation">重试</view>
</view>
</view>
</view>
<!-- Loading 动态背景 -->
<view class="loading-background" wx:if="{{isLoading}}">
<view class="loading-animated-bg">
<view class="loading-wave"></view>
<view class="loading-wave"></view>
<view class="loading-wave"></view>
</view>
<view class="loading-content">
<view class="loading-spinner"></view>
<text class="loading-text">{{loadingText}}</text>
</view>
</view>

View file

@ -0,0 +1,685 @@
/* 图片选择弹窗样式 */
.camera-action-sheet {
display: none;
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: 10000;
transform: none !important;
-webkit-transform: none !important;
}
.camera-action-sheet.show {
display: block;
}
.action-sheet-mask {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: 1;
background-color: rgba(0, 0, 0, 0.4);
}
.action-sheet-content {
position: absolute;
bottom: 0;
left: 0;
right: 0;
z-index: 2;
background: #222;
border-radius: 16px 16px 0 0;
padding: 8px 0;
}
.action-sheet-item {
padding: 20px 0;
text-align: center;
background: #222;
display: flex;
align-items: center;
justify-content: center;
gap: 10px;
position: relative;
}
.action-sheet-item::after {
display: none;
}
.action-sheet-item.primary {
background: #222;
color: #fff;
}
.action-sheet-item.cancel {
background: #222;
margin-top: 8px;
color: #fff;
margin: 0;
height: auto;
border-radius: 0;
}
.action-sheet-divider {
height: 8px;
background-color: #111;
margin: 8px 0;
}
.action-sheet-divider-thin {
height: 2px;
background-color: #111;
margin: 4px 0;
}
.action-icon {
font-size: 20px;
color: #fff;
}
.action-text {
font-size: 16px;
color: #fff;
}
/* 页面背景样式 */
page {
background-color: #000000;
color: #ffffff;
padding-top: 0;
box-sizing: border-box;
}
/* 确保在不同尺寸设备上的适配 */
@media (min-width: 768px) {
.custom-nav {
padding: 0 24px;
}
.outer-container {
margin: 30rpx;
padding: 30rpx;
}
}
/* 顶部导航栏样式 */
.custom-nav {
display: flex;
align-items: center;
padding: 0 16px;
background-color: #000000;
color: white;
border-bottom: 1px solid #333;
box-sizing: border-box;
position: relative;
width: 100%;
}
/* 返回弹窗样式 */
.quit-mask {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0,0,0,0.5);
display: flex;
align-items: center;
justify-content: center;
z-index: 999;
}
.quit-modal {
background: #333;
padding: 30rpx;
border-radius: 12rpx;
width: 80%;
text-align: center;
color: #fff;
}
.quit-modal-content {
margin-bottom: 30rpx;
}
.quit-modal-btns {
display: flex;
justify-content: space-around;
}
.modal-btn {
width: 30%;
background: #444;
color: #fff;
}
/* 外部容器样式 */
.outer-container {
margin: 20rpx;
padding: 20rpx;
background-color: #111;
border-radius: 16rpx;
border: 1px solid #555;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);
}
/* 标题区域样式 */
.title-area {
display: flex;
justify-content: space-between;
align-items: center;
padding: 0 0 20rpx;
background-color: transparent;
}
.page-title {
font-size: 28rpx;
font-weight: bold;
color: #ffffff;
margin-left: 20px;
}
/* 发布按钮样式 */
.publish-btn {
background: #3399F2;
color: #fff;
border-radius: 20rpx;
font-size: 28rpx;
height: 56rpx;
padding: 0 60rpx;
margin: 0;
text-align: center;
line-height: 56rpx;
}
/* 文字区域样式 */
.text-area {
margin: 20rpx 0;
padding: 20rpx;
background-color: #111;
border-radius: 12rpx;
border: 1px solid #555;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
}
.content-textarea {
width: 100%;
min-height: 200rpx;
padding: 0;
border: none;
outline: none;
font-size: 28rpx;
line-height: 1.5;
background: transparent;
color: #ffffff;
resize: none;
}
.placeholder-gray {
color: #888;
}
.text-count {
text-align: right;
margin-top: 10rpx;
font-size: 24rpx;
color: #888;
}
/* 图片区域样式 */
.image-area {
margin-bottom: 30rpx;
}
.upload-btn {
width: 200rpx;
height: 200rpx;
border: 2rpx dashed #555;
display: flex;
align-items: center;
justify-content: center;
color: #888;
}
.image-wrapper {
position: relative;
display: block;
width: 50%;
margin: 20rpx 0;
}
.selected-image {
width: 100%;
height: auto;
max-height: 500rpx;
border-radius: 8rpx;
object-fit: contain;
display: block;
}
.delete-icon {
position: absolute;
top: -10rpx;
right: -10rpx;
background-color: #ff4500;
color: white;
width: 40rpx;
height: 40rpx;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-size: 24rpx;
font-weight: bold;
}
/* 位置区域样式 */
.location-area {
display: flex;
align-items: center;
justify-content: flex-start;
padding: 10rpx;
background-color: #111;
border-radius: 8rpx;
margin: 0;
width: 100%;
flex-shrink: 0;
box-sizing: border-box;
}
.location-icon {
width: 40rpx;
height: 40rpx;
}
.location-info {
flex: 1;
}
.location-name {
font-size: 28rpx;
color: #ffffff;
margin-bottom: 6rpx;
}
.location-address {
font-size: 24rpx;
color: #888;
line-height: 1.4;
}
.choose-btn {
display: none;
}
/* 谁可以看区域样式 */
.visibility-area {
display: flex;
justify-content: space-between;
align-items: center;
padding: 16rpx 20rpx;
background-color: #111;
border-radius: 8rpx;
margin-bottom: 20rpx;
white-space: nowrap;
}
.arrow-icon {
color: #888;
}
/* 底部操作栏 */
.bottom-actions {
display: flex;
align-items: center;
justify-content: space-between;
margin: 40rpx 0 20rpx 0;
padding: 0;
}
/* 功能区样式 */
.features-area {
display: flex;
align-items: center;
margin: 0;
padding: 0;
}
.feature-text {
font-size: 28rpx;
color: #fff;
white-space: nowrap;
}
/* 可见性图标样式 */
.visibility-icon {
width: 48rpx;
height: 48rpx;
margin-right: 12rpx;
margin-left: 5px;
vertical-align: middle;
}
/* 上传图标样式 */
.upload-icon {
width: 36rpx;
height: 36rpx;
margin-right: 10rpx;
margin-left: 5px;
vertical-align: middle;
}
/* 地址图标样式 */
.location-icon {
width: 40rpx;
height: 40rpx;
margin-right: 20rpx;
vertical-align: middle;
}
/* 位置文本样式 */
.location-text {
font-size: 28rpx;
color: #ffffff;
line-height: 1.5;
width: 100%;
flex: 1;
overflow: visible;
white-space: normal;
word-wrap: break-word;
word-break: break-all;
display: block;
}
.features-area .visibility-area {
margin: 0 20rpx 0 0;
padding: 0;
background: transparent;
border-radius: 0;
display: flex;
align-items: center;
}
.features-area .upload-btn {
margin: 0;
padding: 0;
background: transparent;
border: none;
width: auto;
height: auto;
display: inline-flex;
}
/* 导航内容容器 */
.nav-content {
display: flex;
align-items: center;
justify-content: space-between;
width: 100%;
}
/* 返回按钮图片样式 */
.back-btn-img {
width: 20px;
height: 20px;
flex-shrink: 0;
}
/* 导航占位元素 */
.nav-placeholder {
width: 20px;
}
/* 导航标题样式 */
.nav-title {
font-size: 17px;
font-weight: bold;
text-align: center;
margin: 0;
flex: 1;
}
/* 审核失败弹窗样式 */
.audit-modal {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 9999;
display: flex;
justify-content: center;
align-items: center;
}
.modal-mask {
position: absolute;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.6);
backdrop-filter: blur(5rpx);
}
.modal-content {
position: relative;
width: 700rpx;
background: #111;
border-radius: 24rpx;
padding: 50rpx;
box-sizing: border-box;
color: #fff;
border: 1px solid #333;
box-shadow: 0 10rpx 40rpx rgba(0, 0, 0, 0.5);
transform: scale(1);
animation: modalShow 0.3s ease-out;
overflow: hidden;
}
@keyframes modalShow {
0% {
opacity: 0;
transform: scale(0.95) translateY(20rpx);
}
100% {
opacity: 1;
transform: scale(1) translateY(0);
}
}
/* 顶部装饰条 */
.modal-content::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 6rpx;
background: linear-gradient(90deg, #ff4757, #ff6b81);
border-radius: 3rpx 3rpx 0 0;
}
.modal-title {
font-size: 36rpx;
font-weight: bold;
color: #fff;
margin-bottom: 10rpx;
text-align: center;
display: flex;
align-items: center;
justify-content: center;
gap: 16rpx;
}
/* 标题图标 */
.modal-title::before {
content: '⚠️';
font-size: 36rpx;
}
.modal-content-text {
font-size: 32rpx;
color: #ddd;
line-height: 2.2;
margin-bottom: 50rpx;
text-align: center;
word-break: break-word;
white-space: pre-wrap;
padding: 0;
}
.modal-btn {
width: 100%;
height: 90rpx;
line-height: 90rpx;
background: linear-gradient(135deg, #007aff, #0056cc);
color: #fff;
border-radius: 45rpx;
text-align: center;
font-size: 32rpx;
font-weight: 600;
transition: all 0.3s ease;
}
.modal-btn:active {
transform: scale(0.98);
box-shadow: 0 4rpx 16rpx rgba(0, 122, 255, 0.4);
}
/* 定位失败弹窗按钮容器 */
.modal-btns {
display: flex;
gap: 20rpx;
margin-top: 40rpx;
}
.modal-btns .modal-btn {
flex: 1;
}
.modal-btns .cancel-btn {
background: #666;
color: #fff;
}
.modal-btns .cancel-btn:active {
background: #555;
box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.2);
}
.modal-btns .confirm-btn {
background: linear-gradient(135deg, #007aff, #0056cc);
color: #fff;
}
/* Loading 动态背景样式 */
.loading-background {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: 9998;
background: rgba(0, 0, 0, 0.85);
backdrop-filter: blur(10rpx);
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
overflow: hidden;
}
/* 动态背景层 */
.loading-animated-bg {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
overflow: hidden;
opacity: 0.3;
}
.loading-wave {
position: absolute;
width: 200%;
height: 200%;
background: radial-gradient(circle, rgba(51, 153, 242, 0.2) 0%, transparent 70%);
animation: waveAnimation 4s ease-in-out infinite;
border-radius: 50%;
}
.loading-wave:nth-child(1) {
top: -50%;
left: -50%;
animation-delay: 0s;
background: radial-gradient(circle, rgba(51, 153, 242, 0.25) 0%, transparent 70%);
}
.loading-wave:nth-child(2) {
top: -30%;
left: -30%;
animation-delay: 1.3s;
background: radial-gradient(circle, rgba(0, 122, 255, 0.2) 0%, transparent 70%);
}
.loading-wave:nth-child(3) {
top: -10%;
left: -10%;
animation-delay: 2.6s;
background: radial-gradient(circle, rgba(51, 153, 242, 0.15) 0%, transparent 70%);
}
@keyframes waveAnimation {
0%, 100% {
transform: translate(0, 0) scale(1);
opacity: 0.3;
}
50% {
transform: translate(10%, 10%) scale(1.1);
opacity: 0.5;
}
}
/* Loading 内容区域 */
.loading-content {
position: relative;
z-index: 1;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 30rpx;
}
/* Loading 旋转动画 */
.loading-spinner {
width: 80rpx;
height: 80rpx;
border: 6rpx solid rgba(255, 255, 255, 0.2);
border-top-color: #3399F2;
border-radius: 50%;
animation: spin 1s linear infinite;
}
@keyframes spin {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
/* Loading 文字样式 */
.loading-text {
font-size: 28rpx;
color: #ffffff;
font-weight: 500;
text-align: center;
letter-spacing: 2rpx;
}