管理员可以修改项目所属人

This commit is contained in:
sdaduanbilei 2025-11-18 17:06:26 +08:00
parent ca702e0c4b
commit 1dd62e3e4b
37 changed files with 963 additions and 151 deletions

View File

@ -2,8 +2,8 @@
"pages": [
"pages/index/index",
"pages/login/index",
"pages/index/info",
"pages/index/edit",
"pages/garden/info",
"pages/garden/edit",
"pages/about/index",
"pages/today/index",
"pages/garden/index",
@ -11,7 +11,9 @@
"pages/log/index",
"pages/preview/index",
"pages/user/index",
"pages/add/index"
"pages/add/index",
"pages/community/add",
"pages/badge/index"
],
"window": {
"navigationBarTextStyle": "black",
@ -28,14 +30,14 @@
"selectedIconPath": "static/img/home1.png",
"pagePath": "pages/index/index",
"iconSize": 48,
"text": "首页"
"text": "花园"
},
{
"iconPath": "static/img/home.png",
"selectedIconPath": "static/img/home1.png",
"pagePath": "pages/garden/index",
"iconSize": 48,
"text": "花园"
"text": "任务"
},
{
"iconPath": "static/img/home.png",
@ -47,9 +49,9 @@
{
"iconPath": "static/img/home.png",
"selectedIconPath": "static/img/home1.png",
"pagePath": "pages/log/index",
"pagePath": "pages/badge/index",
"iconSize": 48,
"text": "日志"
"text": "成就"
},
{
"iconPath": "static/img/clock.png",

96
pages/badge/index.js Normal file
View File

@ -0,0 +1,96 @@
// pages/badge/index.js
Page({
/**
* 页面的初始数据
*/
data: {
pics: [
'https://tdesign.gtimg.com/mobile/demos/avatar1.png',
'https://tdesign.gtimg.com/mobile/demos/avatar2.png',
'https://tdesign.gtimg.com/mobile/demos/avatar3.png',
'https://tdesign.gtimg.com/mobile/demos/avatar4.png',
'https://tdesign.gtimg.com/mobile/demos/avatar5.png',
'https://tdesign.gtimg.com/mobile/demos/avatar1.png',
],
list:[
{
title:'养护徽章',
badge:'勤劳小园丁',
tips:'累计浇水 10 次'
},
{
title:'成长徽章',
badge:'花开有时',
tips:'第一次开花'
},
{
title:'收藏徽章',
badge:'花园掌柜',
tips:'添加 20 株'
},
{
title:'挑战徽章',
badge:'人气花匠',
tips:'帖子获得 10 个赞'
}
]
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady() {
},
/**
* 生命周期函数--监听页面显示
*/
onShow() {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide() {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload() {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage() {
}
})

7
pages/badge/index.json Normal file
View File

@ -0,0 +1,7 @@
{
"navigationBarTitleText": "成就徽章",
"usingComponents": {
"t-avatar": "tdesign-miniprogram/avatar/avatar",
"t-avatar-group": "tdesign-miniprogram/avatar-group/avatar-group"
}
}

67
pages/badge/index.wxml Normal file
View File

@ -0,0 +1,67 @@
<!--pages/badge/index.wxml-->
<view>
<view class="padding">
<view class="bg">
<view class="padding flex flex-center flex-justify-between">
<view class="card flex flex-center flex-aligin-start flex-justify-start flex-col">
<view class="month flex flex-center white bold">
Nov
</view>
<view style="width: 100%;font-size: 24px;font-weight: bold; text-align: center;">
1
</view>
</view>
<view>
<view>
<t-avatar-group max="3" collapseAvatar="+5" size="small">
<t-avatar wx:for="{{pics}}" wx:for-item="pic" wx:key="index" image="{{pic}}" />
</t-avatar-group>
</view>
<view class="white font-12">已有100名参与月度挑战</view>
</view>
</view>
<view class="padding mt-32 flex flex-center flex-justify-start white bold">
<view class="badge">
<image mode="widthFix" style="width: 100rpx; height: 100rpx;" src="https://res.catter.cn/pub/2025/09/30/20250930143142508.png"></image>
</view>
<view class="ml-16 bold">
<view>多肉收割者挑战赛</view>
</view>
</view>
</view>
</view>
<view class="padding">
<view>我的徽章</view>
</view>
<view class="padding">
<view class="grid">
<view wx:for="{{list}}" class="row padding">
<view>{{item.title}}</view>
<view>
<view class="flex flex-center mt-32">
<image style="width: 200rpx; height: 200rpx;" mode="widthFix" src="https://res.catter.cn/pub/2025/09/30/20250930143142508.png"></image>
</view>
<view class="flex flex-center bold mt-16 mb-16">
{{item.badge}}
</view>
<view class="flex flex-center grey font-12">
{{item.tips}}
</view>
<view class="flex flex-center flex-justify-between mt-32">
<view>
<t-avatar-group max="2" collapseAvatar="+5" size="small" >
<t-avatar wx:for="{{2}}" wx:for-item="pic" wx:key="index" style="width: 60rpx;" image="https://res.catter.cn/pub/2025/09/30/20250930143142508.png" />
</t-avatar-group>
</view>
<view class="grey font-12">查看更多</view>
</view>
</view>
</view>
</view>
</view>
</view>

42
pages/badge/index.wxss Normal file
View File

@ -0,0 +1,42 @@
/* pages/badge/index.wxss */
.bg {
height: 380rpx;
width: 100%;
border-radius: 16rpx;
background-image: url("https://res.catter.cn/pub/2025/11/18/20251118170102998.jpeg");
background-repeat: no-repeat;
background-position: center center;
/* 背景图不平铺 */
/* 让背景图基于容器大小伸缩 */
background-size: cover;
backdrop-filter: blur(10rpx);
}
.card {
width: 100rpx;
height: 100rpx;
background-color: white;
border-radius: 16rpx;
box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.1);
}
.month {
width: 100%;
background-color: red;
border-top-left-radius: 16rpx;
border-top-right-radius: 16rpx;
}
.badge {
width: 100rpx;
height: 100rpx;
border-radius: 100rpx;
}
.grid {
display: grid;
grid-template-columns: 50% 50%;
grid-row-gap: 16px;
grid-column-gap: 16px;
}

66
pages/community/add.js Normal file
View File

@ -0,0 +1,66 @@
// pages/community/add.js
Page({
/**
* 页面的初始数据
*/
data: {
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady() {
},
/**
* 生命周期函数--监听页面显示
*/
onShow() {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide() {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload() {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage() {
}
})

7
pages/community/add.json Normal file
View File

@ -0,0 +1,7 @@
{
"navigationBarTitleText": "发布帖子",
"usingComponents": {
"t-textarea": "tdesign-miniprogram/textarea/textarea",
"t-upload": "tdesign-miniprogram/upload/upload"
}
}

43
pages/community/add.wxml Normal file
View File

@ -0,0 +1,43 @@
<!--pages/community/add.wxml-->
<view>
<view class="padding">
<view></view>
<view>
<t-textarea t-class="external-class" placeholder="这一刻的想法" disableDefaultPadding="{{true}}" />
</view>
<view>
<t-upload disabled mediaType="{{['video','image']}}" max="{{9}}" files="{{fileList}}" bind:add="handleAdd" bind:remove="handleRemove">
</t-upload>
</view>
<view class="mt-32 flex flex-center flex-justify-start flex-col full-width">
<view class="flex flex-center flex-justify-between full-width">
<view class="flex flex-center">
<t-icon name="location"></t-icon>
<view class="ml-5">位置</view>
</view>
<view class="flex flex-center flex-justify-end">
<view>
昆明市 五华区
</view>
<t-icon name="chevron-right"></t-icon>
</view>
</view>
<view class="flex flex-center flex-justify-between full-width mt-32">
<view class="flex flex-center">
<t-icon name="artboard"></t-icon>
<view class="ml-5">参与话题</view>
</view>
</view>
<view class="flex flex-center flex-justify-start full-width mt-16" >
<t-tag shape="round" theme="primary">#植物园的秋天</t-tag>
</view>
</view>
<view class="full-width flex flex-center " style="margin-top: 96rpx;">
<t-button theme="primary" style="width: 80%;" shape="round">发布</t-button>
</view>
</view>
</view>

4
pages/community/add.wxss Normal file
View File

@ -0,0 +1,4 @@
/* pages/community/add.wxss */
page {
background-color: white;
}

View File

@ -5,7 +5,16 @@ Page({
* 页面的初始数据
*/
data: {
list:[
{
content:'植物园的枫叶🍁',
imgList:["https://pic1.zhimg.com/v2-e58efabf7a05544e04b6004b9b63e645_720w.jpg?source=172ae18b"]
},
{
content:"下周就要冷了! 是不是今天就是今年最后一个适合看花看景的秋日了....",
imgList:["https://res.catter.cn/pub/2025/11/18/20251118170136790.png","https://res.catter.cn/pub/2025/11/18/20251118170155441.png"]
}
]
},
/**
@ -15,6 +24,12 @@ Page({
},
handleClick(){
wx.navigateTo({
url: '../community/add',
})
},
/**
* 生命周期函数--监听页面初次渲染完成
*/

View File

@ -1,3 +1,7 @@
{
"usingComponents": {}
"navigationBarTitleText": "植趣社区",
"usingComponents": {
"t-tabs": "tdesign-miniprogram/tabs/tabs",
"t-tab-panel": "tdesign-miniprogram/tab-panel/tab-panel"
}
}

View File

@ -1,2 +1,49 @@
<!--pages/community/index.wxml-->
<text>pages/community/index.wxml</text>
<view>
<t-tabs defaultValue="{{0}}" bind:change="onTabsChange" bind:click="onTabsClick" t-class="custom-tabs">
<t-tab-panel label="推荐" value="0" />
<t-tab-panel label="最新" value="1" />
<t-tab-panel label="我的" value="2" />
</t-tabs>
<view class="padding">
<view wx:for="{{list}}" class="padding row mb-32">
<view class="flex flex-center flex-justify-start">
<image src="https://res.catter.cn/pub/2025/09/30/20250930143142508.png" class="avatar"></image>
<view class="ml-16">
<view class="bold">第五季</view>
<view class="font-12 grey">23 小时前</view>
</view>
</view>
<view class="mt-16">
<view>{{item.content}}</view>
</view>
<view class="mt-16">
<view wx:if="{{item.imgList.length == 1}}">
<view wx:for="{{item.imgList}}">
<image src="{{item}}" style="border-radius: 16rpx; height: 50vw; width: 100%;" mode="aspectFill"></image>
</view>
</view>
<view wx:else class="grid" >
<view class="item" wx:for="{{item.imgList}}">
<view>
<image src="{{item}}" style="width: 100%;height: 30vw; border-radius: 16rpx;" mode="aspectFill" b></image>
</view>
</view>
</view>
</view>
<view class="mt-32 flex flex-center flex-justify-end">
<view class="flex flex-center">
<t-icon name="thumb-up"></t-icon>
<view class="ml-16">10</view>
</view>
<view class="flex flex-center ml-32">
<t-icon name="chat-bubble-smile"></t-icon>
<view class="ml-16">4</view>
</view>
</view>
</view>
</view>
<t-fab icon="camera" bind:click="handleClick" aria-label="增加"></t-fab>
</view>

View File

@ -1 +1,19 @@
/* pages/community/index.wxss */
/* pages/community/index.wxss */
.avatar {
height: 80rpx;
width: 80rpx;
border: white 2rpx solid;
border-radius: 60rpx;
}
.grid {
display: grid;
grid-template-columns: 30% 30% 30%;
grid-row-gap: 8px;
grid-column-gap: 8px;
}
.item {
background-color: #f1f1f1;
width: 100%;
}

View File

@ -1,66 +1,50 @@
// pages/garden/index.js
const { api } = require("../../utils/api")
// index.js
Page({
/**
* 页面的初始数据
*/
data: {
list:[]
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady() {
onShow(){
this.fetchList()
},
/**
* 生命周期函数--监听页面显示
*/
onShow() {
goInfo(e){
const id = e.currentTarget.dataset.id
wx.navigateTo({
url: '../garden/info?id=' + id,
})
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide() {
fetchList(){
const user = wx.getStorageSync('user')
const data = {userId: user.id,current:1,pageSize:20}
api('/plant/todayCare','GET',data,'json').then(res => {
if (res.code === 200){
if (res.data === null){
this.setData({list:[]})
return
}
const tmps = res.data.map(e => {
if (e.imgList.length >0){
e.pic = e.imgList[0].url
}
return e
})
this.setData({list:tmps})
}
})
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload() {
goAdd(){
wx.navigateTo({
url: '../add/index',
})
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage() {
}
})
})

View File

@ -1,3 +1,6 @@
{
"usingComponents": {}
"navigationBarTitleText": "今日任务",
"usingComponents": {
"t-progress": "tdesign-miniprogram/progress/progress"
}
}

View File

@ -1,2 +1,96 @@
<!--pages/garden/index.wxml-->
<text>pages/garden/index.wxml</text>
<!--index.wxml-->
<view class="flex flex-center flex-col">
<view class="full-width white-bg">
<view class="padding">
<view class="mb-16 flex flex-center flex-justify-between">
<view>
📅 今日养护4个任务
</view>
<view>
已经完成 4 / 5
</view>
</view>
<t-progress theme="plump" color="{{ { from: '#0052D9', to: '#00A870' } }}" percentage="80" status="active" />
</view>
</view>
<view wx:if="{{list.length === 0}}" class="flex flex-center flex-col " style="margin-top: 268rpx;">
<view class="empty flex flex-center flex-col">
</view>
<view class="mt-16 flex flex-center flex-col">
<view class="font-16 bold">暂无任务</view>
</view>
<view style="width: 100vw; margin-top: 48rpx; " class="flex flex-center">
<t-button theme="primary" style="width: 60%;" size="small" shape="round" bind:tap="goAdd">添加一颗新的植物</t-button>
</view>
</view>
<!-- list 数据 -->
<scroll-view scroll-y="{{true}}" wx:else>
<view class="padding">
<view class="mb-16 bo">必做任务 2</view>
<view wx:for="{{list}}" class="row padding mb-32" data-id="{{item.id}}" bind:tap="goInfo">
<view class="flex flex-center flex-justify-start">
<image class="pic" mode="aspectFill" wx:if="{{item.pic}}" src="{{item.pic}}"></image>
<image class="pic" mode="aspectFill" wx:else src="https://res.catter.cn/pub/2025/09/30/20250930143920286.png"></image>
<view style="margin-left:16rpx;" class="full-width">
<view class="flex flex-center flex-justify-between full-width">
<view class="font-16 bold">{{item.name}}</view>
<t-tag shape="round" theme="primary">立即完成</t-tag>
</view>
<view class="flex flex-center flex-justify-start mt-16 ">
<view class="font-12 grey">需要养护:</view>
<view class="mr-16 flex flex-center" wx:for="{{item.todayCares}}">
<t-icon name="{{item.icon}}" style="color: {{item.color}};"></t-icon>
</view>
</view>
</view>
</view>
</view>
<!-- 已逾期 -->
<view class="mb-16 bo">已逾期 2</view>
<view wx:for="{{list}}" class="row padding mb-32" data-id="{{item.id}}" bind:tap="goInfo">
<view class="flex flex-center flex-justify-start">
<image class="pic" mode="aspectFill" wx:if="{{item.pic}}" src="{{item.pic}}"></image>
<image class="pic" mode="aspectFill" wx:else src="https://res.catter.cn/pub/2025/09/30/20250930143920286.png"></image>
<view style="margin-left:16rpx;" class="full-width">
<view class="flex flex-center flex-justify-between full-width">
<view class="font-16 bold">{{item.name}}</view>
<t-tag shape="round" variant="outline" theme="danger">立即完成</t-tag>
</view>
<view class="flex flex-center flex-justify-start mt-16 ">
<view class="font-12 grey">需要养护:</view>
<view class="mr-16 flex flex-center" wx:for="{{item.todayCares}}">
<t-icon name="{{item.icon}}" style="color: {{item.color}};"></t-icon>
</view>
</view>
</view>
</view>
</view>
<!-- 今日已经完成 -->
<view class="mb-16 bo">今日已完成 2</view>
<view wx:for="{{list}}" class="row padding mb-32" data-id="{{item.id}}" bind:tap="goInfo">
<view class="flex flex-center flex-justify-start">
<image class="pic" mode="aspectFill" wx:if="{{item.pic}}" src="{{item.pic}}"></image>
<image class="pic" mode="aspectFill" wx:else src="https://res.catter.cn/pub/2025/09/30/20250930143920286.png"></image>
<view style="margin-left:16rpx;" class="full-width">
<view class="flex flex-center flex-justify-between full-width">
<view class="font-16 bold">{{item.name}}</view>
</view>
<view class="flex flex-center flex-justify-start mt-16 ">
<view class="font-12 grey">需要养护:</view>
<view class="mr-16 flex flex-center" wx:for="{{item.todayCares}}">
<t-icon name="{{item.icon}}" style="color: {{item.color}};"></t-icon>
</view>
</view>
</view>
</view>
</view>
</view>
</scroll-view>
</view>

View File

@ -1 +1,23 @@
/* pages/garden/index.wxss */
/**index.wxss**/
.empty {
width: 140rpx;
height: 140rpx;
background-color:#F6F6F6 ;
border-radius: 140rpx;
background-image: url("https://res.catter.cn/pub/2025/09/30/20250930143142508.png");
background-size: cover;
}
.bottom{
position: fixed;
bottom: 68rpx;
}
.pic{
width: 120rpx;
min-width: 120rpx;
height: 120rpx;
border-radius: 16rpx;
}

View File

@ -1,49 +1,152 @@
const { api } = require("../../utils/api")
const {
api
} = require("../../utils/api")
// index.js
// pages/garden/index.js
Page({
/**
* 页面的初始数据
*/
data: {
list:[]
list: [],
timer: null,
name: '',
leftList: [],
rightList: [],
leftHeight: 0,
rightHeight: 0,
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
wx.setNavigationBarTitle({
title: '我的花园',
})
},
onShow(){
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady() {
},
/**
* 生命周期函数--监听页面显示
*/
onShow() {
this.setData({leftList:[],rightList:[]})
this.fetchList()
},
fetchList() {
api('/plant/page', 'POST', {
current: 0,
pageSize: 999,
name: this.data.name
}, 'json').then(res => {
if (res.code == 200) {
if (res.data === null) {
return
}
const tmps = res.data.list.map(e => {
e.pic = e.imgList[0].url
return e
})
this.addItems(tmps)
// this.setData({
// list: tmps
// })
}
})
},
addItems(newItems) {
newItems.forEach(item => {
// 动态获取图片尺寸
wx.getImageInfo({
src: item.pic,
success: res => {
const scale = res.width / res.height;
const imgHeight = 345 / scale; // 假设宽度是 345rpx
if (this.data.leftHeight <= this.data.rightHeight) {
this.data.leftList.push(item);
this.data.leftHeight += imgHeight;
} else {
this.data.rightList.push(item);
this.data.rightHeight += imgHeight;
}
this.setData({
leftList: this.data.leftList,
rightList: this.data.rightList,
});
}
});
});
},
goInfo(e){
const id = e.currentTarget.dataset.id
wx.navigateTo({
url: '../index/info?id=' + id,
})
},
fetchList(){
const user = wx.getStorageSync('user')
const data = {userId: user.id,current:1,pageSize:20}
api('/plant/todayCare','GET',data,'json').then(res => {
if (res.code === 200){
const tmps = res.data.map(e => {
if (e.imgList.length >0){
e.pic = e.imgList[0].url
}
return e
})
this.setData({list:tmps})
}
})
onchange(e) {
const value = e.detail.value
if (this.data.timer != null) {
clearTimeout(this.data.timer)
}
this.data.timer = setTimeout(() => {
this.setData({
name: value
})
this.fetchList()
}, 500)
},
goAdd(){
goAdd() {
wx.navigateTo({
url: '../add/index',
})
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide() {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload() {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage() {
}
})
})

View File

@ -1,4 +1,7 @@
{
"navigationBarTitleText": "花园",
"navigationStyle": "custom",
"usingComponents": {
"t-search": "tdesign-miniprogram/search/search"
}
}

View File

@ -1,45 +1,80 @@
<!--index.wxml-->
<view class="flex flex-center flex-col">
<view wx:if="{{list.length === 0}}" class="flex flex-center flex-col " style="margin-top: 268rpx;" >
<!--pages/garden/index.wxml-->
<view>
<!-- top -->
<view class="top primary-bg">
<view style="padding-top: 128rpx; padding-left: 32rpx;" class="white">
<view class="bold font-16">天气晴朗</view>
<view>
<view class="flex flex-center flex-justify-start">
<t-icon name="fog-sunny" size="32"></t-icon>
<view class="bold mt-16 ml-16" style="font-size: 40px;">20 ℃ </view>
</view>
<view wx:if="{{leftList.length > 0}}">
<view>花园健康度 83 分, 今日需养护 2 株植物</view>
<view class="mt-16 font-12" style="color: #E2B43F;">龟背竹长期未更新照片</view>
</view>
</view>
</view>
</view>
<view style="height: 89vh;" wx:if="{{leftList.length > 0}}">
<view class="waterfall" scroll-y="{{true}}">
<view class="column">
<block wx:for="{{rightList}}" wx:key="id">
<view class="mb-32 card">
<image src="{{item.pic}}" mode="widthFix" class="img"></image>
<view style="padding: 0 16rpx 16rpx 16rpx ;">
<view class="font-16 bold">{{item.name}}</view>
<view class="grey font-12">今日无需养护</view>
<view class="grey font-12">上次养护2 天前</view>
<view class="grey font-12">健康指数83%</view>
</view>
</view>
</block>
</view>
<view class="column">
<block wx:for="{{leftList}}" wx:key="id">
<view class="mb-32 card">
<image src="{{item.pic}}" mode="widthFix" class="img"></image>
<view style="padding: 0 16rpx 16rpx 16rpx ;">
<view class="font-16 bold">{{item.name}}</view>
<view class="grey font-12">今日无需养护</view>
<view class="grey font-12">上次养护2 天前</view>
<view class="grey font-12">健康指数83%</view>
</view>
</view>
</block>
</view>
</view>
</view>
<view wx:else>
<view class="flex flex-center flex-col " style="margin-top: 60rpx;">
<view class="empty flex flex-center flex-col">
</view>
<view class="mt-16 flex flex-center flex-col">
<view class="font-16 bold" >暂无植物</view>
<view class="font-12 grey mt-16">您还没有添加任何植物</view>
<view class="font-16 bold">欢迎来到你的秘密花园 🌿~</view>
<view class="font-12 grey mt-16">从添加第一盆植物开始你的养花之旅吧</view>
</view>
<view style="width: 100vw; margin-top: 48rpx; " class="flex flex-center">
<t-button theme="primary" style="width: 60%;" size="small" shape="round" bind:tap="goAdd">添加您的第一颗植物</t-button>
<view style="width: 100vw; margin-top: 32rpx; " class="flex flex-center flex-col">
<t-button theme="primary" style="width: 60%;" size="small" shape="round" bind:tap="goAdd">添加我的第一盆植物</t-button>
</view>
</view>
<!-- list 数据 -->
<scroll-view scroll-y="{{true}}" wx:else>
<view class="padding">
<view wx:for="{{list}}" class="row padding mb-32" data-id="{{item.id}}" bind:tap="goInfo">
<view class="flex flex-center flex-justify-start">
<image class="pic" mode="aspectFill" wx:if="{{item.pic}}" src="{{item.pic}}"></image>
<image class="pic" mode="aspectFill" wx:else src="https://res.catter.cn/pub/2025/09/30/20250930143920286.png"></image>
<view style="margin-left:16rpx;" class="full-width">
<view class="flex flex-center flex-justify-between full-width">
<view class="font-16 bold">{{item.name}}</view>
<t-tag wx:if="{{item.expiredDays === 0}}" shape="round" theme="primary" variant="light-outline">今日</t-tag>
<t-tag wx:if="{{item.expiredDays > 0}}" shape="round" theme="danger" variant="light-outline">已逾期{{item.expiredDays}}天</t-tag>
</view>
<view class="font-14 grey mt-5">种植于:{{item.plantTimeStr}}</view>
<view class="flex flex-center flex-justify-start mt-16 ">
<view class="font-12 grey">需要养护:</view>
<view class="mr-16 flex flex-center" wx:for="{{item.todayCares}}">
<t-icon name="{{item.icon}}" style="color: {{item.color}};"></t-icon>
</view>
<view class="mt-32 white-bg padding row">
<view class="flex flex-center font-12 grey">您还可以从以下热门植物中,免费领取</view>
<view class="grid mt-32">
<view wx:for="{{6}}">
<image src="https://www.xnbl.net/file/upload/202311/09/094651507814.jpg.middle.jpg" style="width:40vw;height: 40vw; border-top-left-radius: 12rpx;border-top-right-radius: 12rpx;" mode="widthFix"></image>
<view>
<view class="flex flex-center flex-justify-start">
<view class="font-16 bold">绿萝</view>
<t-tag theme="primary" class="ml-16" size="small">超好养</t-tag>
</view>
<view class="font-12 grey">日照充足、超级好养</view>
</view>
</view>
</view>
</view>
</scroll-view>
<view class="bottom" wx:if="{{list.length === 0}}">
<view class="font-12 grey mt-16">您添加的植物将全部显示在这里</view>
</view>
<t-fab wx:if="{{list.length > 0}}" icon="add" bind:click="goAdd"></t-fab>
</view>
</view>
<t-fab icon="add" bind:click="goAdd" aria-label="增加"></t-fab>
</view>

View File

@ -1,4 +1,8 @@
/**index.wxss**/
/* pages/garden/index.wxss */
.top {
padding-bottom: 32rpx;
}
.empty {
width: 140rpx;
@ -8,16 +12,47 @@
background-image: url("https://res.catter.cn/pub/2025/09/30/20250930143142508.png");
background-size: cover;
}
.bottom{
position: fixed;
bottom: 68rpx;
.waterfall {
display: flex;
justify-content: space-between;
padding: 32rpx;
}
.pic{
width: 150rpx;
min-width: 150rpx;
height: 150rpx;
.column {
width: 48%;
}
.card {
box-shadow: 0 4rpx 12rpx rgba(0,0,0,0.06);
background-color: white;
border-radius: 12rpx;
}
.img {
width: 100%;
border-top-left-radius: 16rpx;
border-top-right-radius: 16rpx;
margin-bottom: 16rpx;
}
.item {
background-color: white;
border-radius: 16rpx;
}
.pic {
border-top-right-radius: 16rpx;
border-top-left-radius: 16rpx;
width: 100%;
}
.grid {
display: grid;
grid-template-columns: 50% 50%;
grid-row-gap: 16px;
grid-column-gap: 12px;
border-radius: 12rpx;
}

View File

@ -5,7 +5,14 @@ Page({
* 页面的初始数据
*/
data: {
list:[
{
date:17,
},
{
date:16,
}
]
},
/**

View File

@ -1,3 +1,4 @@
{
"navigationBarTitleText": "养花之路",
"usingComponents": {}
}

View File

@ -1,2 +1,28 @@
<!--pages/log/index.wxml-->
<text>pages/log/index.wxml</text>
<view class="padding">
<view wx:for="{{list}}">
<view class="flex flex-center flex-justify-start full-width mb-32" >
<view class="avatar flex flex-center font-12" style="background-color: {{index === 0 ? '#4FAB5F':'grey'}};">
<view wx:if="{{index === 0}}" class="white">今天</view>
<view wx:else class="white">16</view>
</view>
<view class="ml-16">11月17日</view>
</view>
<view class="mb-16">
<view wx:for="{{3}}">
<view class="flex flex-center flex-justify-start mb-16 row padding">
<image src="https://pic1.zhimg.com/v2-e58efabf7a05544e04b6004b9b63e645_720w.jpg?source=172ae18b" style="width:100rpx;height: 100rpx; border-radius: 16rpx;"></image>
<view class="ml-16">
<view>
玉露多肉
</view>
<view class="font-12 flex flex-center flex-justify-start ">
<t-icon name="refresh"></t-icon>
<view class="ml-16">换盘</view>
</view>
</view>
</view>
</view>
</view>
</view>
</view>

View File

@ -1 +1,7 @@
/* pages/log/index.wxss */
/* pages/log/index.wxss */
.avatar {
height: 60rpx;
width: 60rpx;
border: white 2rpx solid;
border-radius: 60rpx;
}

View File

@ -1,3 +1,5 @@
const { api } = require("../../utils/api")
// pages/user/index.js
Page({
@ -5,7 +7,8 @@ Page({
* 页面的初始数据
*/
data: {
user:null
user:null,
info:null
},
/**
@ -29,7 +32,14 @@ Page({
* 生命周期函数--监听页面显示
*/
onShow() {
this.fetchInfo()
},
fetchInfo(){
api('/personal/personal','GET').then(res => {
if (res.code === 200){
this.setData({info:res.data})
}
})
},
/**

View File

@ -1,8 +1,8 @@
<!--pages/user/index.wxml-->
<view>
<!-- top -->
<!-- top -->
<view class="bg">
<view>
<view wx:if="{{info}}">
<view style="margin-top: 128rpx;" class="flex flex-center flex-justify-start" wx:if="{{user}}">
<image src="https://res.catter.cn/pub/2025/09/30/20250930143142508.png" class="avatar"></image>
<view class="white ml-32">
@ -10,29 +10,77 @@
{{user.name}}
</view>
<view class="mt-16 font-12">
已经加入 128
已经加入 {{info.joinDays}}
</view>
</view>
</view>
<view class="white flex flex-center flex-justify-start mt-32">我的徽章 已解锁 23 个</view>
<view class="mt-32">
<view class="">🎖️🎖️🎖️🎖️🎖️🎖️🎖️</view>
</view>
</view>
</view>
<view class="padding">
<view class="white-bg padding mt-16 row">
<!-- dash -->
<view class="white flex flex-center flex-justify-around mt-32">
<view class=" flex flex-center flex-justify-around mt-32">
<view class="flex flex-center flex-col">
<view class="font-16 bold" style="font-size: 20px;">8</view>
<view class="font-12">我的植物</view>
<view class="font-16 bold" style="font-size: 20px;">{{info.plantCount}}</view>
<view class="font-12">我的植物</view>
</view>
<view class="flex flex-center flex-col">
<view class="font-16 bold" style="font-size: 20px;">8</view>
<view class="font-12">养护次数</view>
<view class="font-16 bold" style="font-size: 20px;">{{info.careCount}}</view>
<view class="font-12">养护次数</view>
</view>
<view class="flex flex-center flex-col">
<view class="font-16 bold" style="font-size: 20px;">8</view>
<view class="font-12">成就徽章</view>
<view class="font-16 bold" style="font-size: 20px;">{{info.badgeCount}}</view>
<view class="font-12">成就徽章</view>
</view>
</view>
</view>
<view class="white-bg padding mt-32 flex flex-center flex-justify-between" style="border-radius: 16rpx;">
<view class="flex flex-center flex-col">
<view class="avatar flex flex-center" style="background-color: #E2B43F3C;">
<t-icon name="thumb-up" style="color: #E2B43F;" size="24"></t-icon>
</view>
<view class="mt-16">我的植物</view>
</view>
<view class="flex flex-center flex-col">
<view class="avatar flex flex-center" style="background-color: #4B84EE3C;">
<t-icon name="calendar-1" style="color:#4B84EE;" size="24"></t-icon>
</view>
<view class="mt-16">养护日志</view>
</view>
<view class="flex flex-center flex-col">
<view class="avatar flex flex-center" style="background-color:#E2B43F3C;">
<t-icon name="saturation" style="color: #E2B43F;" size="24"></t-icon>
</view>
<view class="mt-16">我的成就</view>
</view>
<view class="flex flex-center flex-col">
<view class="avatar flex flex-center" style="background-color: #9D5FEF3C;">
<t-icon name="verified" style="color: #9D5FEF;" size="24"></t-icon>
</view>
<view class="mt-16">我的互动</view>
</view>
</view>
</view>
<view style="padding: 0 32rpx">
<view class="row " style="padding-top: 8rpx; padding-bottom: 8rpx;">
<t-cell title="提醒设置(浇水/施肥时间)" hover arrow />
<t-cell title="关于我们" hover arrow />
<t-cell title="用户协议 / 隐私政策" hover arrow />
<t-cell title="邀请好友" hover arrow bordered="{{false}}" description="成功邀请可以获得稀有种子" />
</view>
</view>
</view>

View File

@ -1,8 +1,6 @@
/* pages/user/index.wxss */
.bg {
background-color: #4FAB5F;
border-bottom-left-radius: 32rpx;
border-bottom-right-radius: 32rpx;
padding: 32rpx;
}
@ -11,4 +9,11 @@
width: 120rpx;
border: white 2rpx solid;
border-radius: 60rpx;
}
.camera{
background-color: #4fab5e3d;
width: 100rpx;
height: 100rpx;
border-radius: 50rpx;
}

View File

@ -20,5 +20,17 @@
"bigPackageSizeSupport": false
},
"libVersion": "3.10.1",
"condition": {}
"condition": {
"miniprogram": {
"list": [
{
"name": "pages/community/add",
"pathName": "pages/community/add",
"query": "",
"scene": null,
"launchMode": "default"
}
]
}
}
}