feat: move project

This commit is contained in:
ckaaaa 2025-09-16 13:41:49 +08:00
commit 4a940f28ba
97 changed files with 5047 additions and 0 deletions

View file

@ -0,0 +1,35 @@
const AuthStepType = {
ONE: 1,
TWO: 2,
THREE: 3,
};
Component({
options: {
multipleSlots: true,
},
properties: {
currAuthStep: {
type: Number,
value: AuthStepType.ONE,
},
userInfo: {
type: Object,
value: {},
},
isNeedGetUserInfo: {
type: Boolean,
value: false,
},
},
data: {
defaultAvatarUrl:
'https://cdn-we-retail.ym.tencent.com/miniapp/usercenter/icon-user-center-avatar@2x.png',
AuthStepType,
},
methods: {
gotoUserEditPage() {
this.triggerEvent('gotoUserEditPage');
},
},
});

View file

@ -0,0 +1,7 @@
{
"component": true,
"usingComponents": {
"t-icon": "tdesign-miniprogram/icon/icon",
"t-avatar": "tdesign-miniprogram/avatar/avatar"
}
}

View file

@ -0,0 +1,36 @@
<view class="user-center-card">
<!-- 未登录的情况 -->
<block wx:if="{{currAuthStep === AuthStepType.ONE}}">
<view class="user-center-card__header" bind:tap="gotoUserEditPage">
<t-avatar image="{{userInfo.avatarUrl || defaultAvatarUrl}}" class="user-center-card__header__avatar" />
<view class="user-center-card__header__name">{{'请登录'}}</view>
</view>
</block>
<!-- 已登录但未授权用户信息情况 -->
<block wx:if="{{currAuthStep === AuthStepType.TWO}}">
<view class="user-center-card__header">
<t-avatar image="{{userInfo.avatarUrl || defaultAvatarUrl}}" class="user-center-card__header__avatar" />
<view class="user-center-card__header__name">
<view class="name">{{userInfo.nickName || '微信用户'}}</view>
</view>
<!-- 需要授权用户信息通过slot添加弹窗 -->
<view class="user-center-card__header__transparent" wx:if="{{isNeedGetUserInfo}}">
<slot name="getUserInfo" />
</view>
<!-- 不需要授权用户信息仍然触发gotoUserEditPage事件 -->
<view class="user-center-card__header__transparent" bind:tap="gotoUserEditPage" wx:else></view>
</view>
</block>
<!-- 已登录且已经授权用户信息的情况 -->
<block wx:if="{{currAuthStep === AuthStepType.THREE}}">
<view class="user-center-card__header" bind:tap="gotoUserEditPage">
<t-avatar
t-class="avatar"
mode="aspectFill"
class="user-center-card__header__avatar"
image="{{userInfo.avatarUrl || defaultAvatarUrl}}"
/>
<view class="user-center-card__header__name">{{userInfo.nickName || '微信用户'}}</view>
</view>
</block>
</view>

View file

@ -0,0 +1,57 @@
.user-center-card {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 480rpx;
background-image: url('https://cdn-we-retail.ym.tencent.com/miniapp/template/user-center-bg-v1.png');
background-size: cover;
background-repeat: no-repeat;
padding: 0 24rpx;
}
.user-center-card__header {
margin-top: 192rpx;
margin-bottom: 48rpx;
height: 96rpx;
line-height: 48rpx;
display: flex;
justify-content: flex-start;
align-items: center;
color: #333;
position: relative;
}
.user-center-card__header__avatar {
width: 96rpx;
height: 96rpx;
border-radius: 48rpx;
overflow: hidden;
}
.user-center-card__header__name .name{
font-size: 36rpx;
line-height: 48rpx;
color: #333;
font-weight: bold;
margin-left: 24rpx;
margin-right: 16rpx;
}
.user-center-card__header__name .score{
font-size: 22rpx;
line-height: 38rpx;
color: #333;
margin-left: 24rpx;
margin-right: 16rpx;
display: flex;
align-items: center;
}
.user-center-card__header__transparent {
position: absolute;
right: 0;
top: 0;
background-color: transparent;
height: 100%;
width: 30%;
}
.user-center-card__icon {
line-height: 96rpx;
}

79
pages/usercenter/index.js Normal file
View file

@ -0,0 +1,79 @@
import R from '../../utils/request';
import C from '../../utils/constant';
import * as F from '../../utils/func';
Page({
data: {
cdnHost: C.cdnHost,
phone: '',
name: '',
price_sum: '',
share_cnt: '',
share_view_cnt: '',
is_share: false,
show_vip_link: false,
payed_vip_link: '',
},
onLoad() {
},
onShow() {
this.getTabBar().init();
this.init();
},
onPullDownRefresh() {
this.init();
},
init() {
this.fetUserInfoHandle();
},
fetUserInfoHandle() {
R.get('/index.php/api/v1/my').then(({ model }) => {
this.setData({
name: model.real_name || model.nick_name || '微信用户',
phone: model.phone || '-',
share_cnt: model.share_cnt,
share_view_cnt: model.share_view_cnt,
price_sum: F.formatePrice(model.price_sum || 0),
is_share: !!model.is_share,
show_vip_link: model.show_vip_link || false,
payed_vip_link: model.payed_vip_link || '',
});
})
},
getPhoneNumber(e) {
console.log(e.detail.code) // 动态令牌
console.log(e.detail.errMsg) // 回调信息(成功失败都会返回)
console.log(e.detail.errno) // 错误码(失败时返回)
if (!e.detail.errno) {
R.post('/index.php/api/v1/bind_auth_phone', { code: e.detail.code }).then(() => {
this.setData({ hasPhone: true })
this.goH5Shop();
})
} else {
// e.detail.errMsg
}
},
goShared() {
wx.switchTab({
url: '/pages/faxianlist/faxianlist',
})
},
goOrder() {
wx.navigateTo({ url: '/pages/paylist/paylist' })
},
toVipLink() {
wx.navigateTo({ url: '/pages/webview/webview?url='+encodeURIComponent(this.data.payed_vip_link) })
},
goSharelist() {
wx.navigateTo({ url: '/pages/sharelist/sharelist' })
},
goInfo() {
wx.navigateTo({
url: '/pages/usercenter/info',
})
},
});

View file

@ -0,0 +1,9 @@
{
"navigationBarTitleText": "个人中心",
"usingComponents": {
"t-icon": "tdesign-miniprogram/icon/icon",
"t-link": "tdesign-miniprogram/link/link",
"t-cell": "tdesign-miniprogram/cell/cell"
},
"enablePullDownRefresh": true
}

173
pages/usercenter/index.less Normal file
View file

@ -0,0 +1,173 @@
page {
background-color: #f5f5f5;
}
.header {
background-color: linear-gradient(180deg, #f0f4fc, #fff);
position: relative;
background-color: rgba(255, 255, 255, 0.8);
box-sizing: border-box;
width: 90%;
margin: 0 auto;
margin-top: -300rpx;
border-radius: 10rpx;
margin-bottom: 20rpx;
}
.header .info {
background-color: transparent;
}
.header .info::after {
display: none;
}
.header .avatar {
width: 96rpx;
height: 96rpx;
border-radius: 50%;
overflow: hidden;
}
.cb {
top: 10rpx;
right: 100rpx;
height: 530rpx;
width: 750rpx;
background: url('http://cdn.zhonganonline.top/newslist/static/bg_take.jpeg?v=5') no-repeat;
background-position: center center;
background-size: 100% 100%;
z-index: 1;
}
.vip {
background: linear-gradient(90deg, #f9e9bc, #f2d786);
border-radius: 20rpx;
height: 154rpx;
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 40rpx;
width: 94%;
margin: 0 auto;
box-sizing: border-box;
}
.vip .dest .a {
color: #775d2f;
font-size: 30rpx;
}
.vip .dest .b {
color: #775d2f;
opacity: 0.8;
font-size: 22rpx;
}
.vip .btn {
background-color: #fff;
color: #775d2f;
font-size: 24rpx;
height: 68rpx;
width: 164rpx;
border-radius: 34rpx;
display: flex;
align-items: center;
justify-content: center;
}
.title_bar {
display: flex;
align-items: center;
justify-content: space-between;
margin-top: 32rpx;
width: 92%;
margin: 0 auto;
}
.title_bar .title {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
background-position: left center;
background-size: 100% 100%;
font-size: 32rpx;
color: rgb(53, 58, 71);
height: 34rpx;
width: 132rpx;
}
.title_bar .btn {
color: #f09759;
font-size: 28rpx;
display: flex;
align-items: center;
background-color: #fff8e9;
padding: 10rpx 20rpx;
border-radius: 6rpx;
}
.title_bar .btn .t-icon {
margin-right: 4rpx;
}
.ma20 {
height: 20rpx;
background-color: #f5f5f5;
width: 100%;
}
.cards_w {
background-color: #fff;
width: 94%;
border-radius: 6rpx;
margin: 0 auto;
}
.cards_w .cards {
display: flex;
justify-content: space-between;
padding: 30rpx 0;
}
.cards_w .cards .card {
width: 28%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
background: none;
font-size: 0;
line-height: 24rpx;
&::after {
display: none;
}
}
.cards_w .cards .card .txt {
padding-top: 12rpx;
font-size: 24rpx;
color: #333;
}
.cards_w .cards .card .txt2 {
padding-top: 12rpx;
font-size: 32rpx;
font-weight: bold;
color: #333;
}
.cards_w .cards .card.hide {
opacity: 0;
pointer-events: none;
}
.link {
display: flex;
justify-content: space-between;
padding: 30rpx 0;
width: 50%;
margin: 0 auto;
background-color: #fff;
border-radius: 6rpx;
}

View file

@ -0,0 +1,49 @@
<view class="cb"></view>
<view class="header">
<t-cell class="info" title="{{name}}" image="{{cdnHost + '/static/header.png?v=5'}}" description="{{phone}}" hover arrow bind:tap="goInfo"></t-cell>
</view>
<!-- <view class="vip">
<view class="dest">
<view class="a">美丽桐庐监督行动</view>
<view class="b" wx:if="{{price * 1}}">经审核后可获得{{price}}元现金奖励</view>
</view>
<view class="btn" bind:tap="goTakePhoto">参与试试</view>
</view> -->
<!-- <view class="ma20"></view> -->
<!-- <view class="title_bar"> -->
<!-- <view class="title">服务数据</view> -->
<!-- <view class="btn" bind:tap="goTakePhoto">
<t-icon name="camera" size="28rpx" color="f09759"></t-icon>
有发现
</view> -->
<!-- </view> -->
<!-- <view class="ma20"></view> -->
<view class="cards_w">
<view class="cards" wx:if="{{is_share}}">
<view class="card" bind:tap="goShared">
<view class="txt2">{{price_sum}}元</view>
<view class="txt">总收入</view>
</view>
<!-- aa -->
<view class="card" bind:tap="goSharelist">
<view class="txt2">{{share_cnt}}次</view>
<view class="txt">总分享</view>
</view>
<view class="card">
<view class="txt2">{{share_view_cnt}}</view>
<view class="txt">分享浏览</view>
</view>
<!-- /aa -->
<!-- <view class="card hide">
<t-icon name="location" size="30" color="#aaa" />
<view class="txt">---</view>
</view> -->
</view>
<view class="ma20"></view>
<t-cell class="info" title="我的订单" hover arrow bind:tap="goOrder"></t-cell>
<view class="ma20"></view>
<view class="ma20"></view>
<view class="link" wx:if="{{show_vip_link}}">
<t-link size="small" theme="primary" content="专属服务企业、微信群" suffixIcon="jump" hover bind:tap="toVipLink" />
</view>
</view>

150
pages/usercenter/index.wxss Normal file
View file

@ -0,0 +1,150 @@
page {
background-color: #f5f5f5;
}
.header {
background-color: linear-gradient(180deg, #f0f4fc, #fff);
position: relative;
background-color: rgba(255, 255, 255, 0.8);
box-sizing: border-box;
width: 90%;
margin: 0 auto;
margin-top: -300rpx;
border-radius: 10rpx;
margin-bottom: 20rpx;
}
.header .info {
background-color: transparent;
}
.header .info::after {
display: none;
}
.header .avatar {
width: 96rpx;
height: 96rpx;
border-radius: 50%;
overflow: hidden;
}
.cb {
top: 10rpx;
right: 100rpx;
height: 530rpx;
width: 750rpx;
background: url('http://cdn.zhonganonline.top/newslist/static/bg_take.jpeg?v=5') no-repeat;
background-position: center center;
background-size: 100% 100%;
z-index: 1;
}
.vip {
background: linear-gradient(90deg, #f9e9bc, #f2d786);
border-radius: 20rpx;
height: 154rpx;
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 40rpx;
width: 94%;
margin: 0 auto;
box-sizing: border-box;
}
.vip .dest .a {
color: #775d2f;
font-size: 30rpx;
}
.vip .dest .b {
color: #775d2f;
opacity: 0.8;
font-size: 22rpx;
}
.vip .btn {
background-color: #fff;
color: #775d2f;
font-size: 24rpx;
height: 68rpx;
width: 164rpx;
border-radius: 34rpx;
display: flex;
align-items: center;
justify-content: center;
}
.title_bar {
display: flex;
align-items: center;
justify-content: space-between;
margin-top: 32rpx;
width: 92%;
margin: 0 auto;
}
.title_bar .title {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
background-position: left center;
background-size: 100% 100%;
font-size: 32rpx;
color: #353a47;
height: 34rpx;
width: 132rpx;
}
.title_bar .btn {
color: #f09759;
font-size: 28rpx;
display: flex;
align-items: center;
background-color: #fff8e9;
padding: 10rpx 20rpx;
border-radius: 6rpx;
}
.title_bar .btn .t-icon {
margin-right: 4rpx;
}
.ma20 {
height: 20rpx;
background-color: #f5f5f5;
width: 100%;
}
.cards_w {
background-color: #fff;
width: 94%;
border-radius: 6rpx;
margin: 0 auto;
}
.cards_w .cards {
display: flex;
justify-content: space-between;
padding: 30rpx 0;
}
.cards_w .cards .card {
width: 28%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
background: none;
font-size: 0;
line-height: 24rpx;
}
.cards_w .cards .card::after {
display: none;
}
.cards_w .cards .card .txt {
padding-top: 12rpx;
font-size: 24rpx;
color: #333;
}
.cards_w .cards .card .txt2 {
padding-top: 12rpx;
font-size: 32rpx;
font-weight: bold;
color: #333;
}
.cards_w .cards .card.hide {
opacity: 0;
pointer-events: none;
}
.link {
display: flex;
justify-content: space-between;
padding: 30rpx 0;
width: 50%;
margin: 0 auto;
background-color: #fff;
border-radius: 6rpx;
}

31
pages/usercenter/info.js Normal file
View file

@ -0,0 +1,31 @@
import R from '../../utils/request';
Page({
data: {
name: '',
},
onLoad() {
},
onShow() {
R.get('/index.php/api/v1/my').then(({ model }) => {
this.setData({
name: model.real_name || model.nick_name || '微信用户',
});
})
},
onSubmit(){
if(!this.data.name.trim()){
wx.showToast({
title: '请填写姓名',
icon: 'none',
});
return;
}
R.post('/index.php/api/v1/set_name',{name:this.data.name.trim()}).then(({ model }) => {
wx.navigateBack();
})
}
});

View file

@ -0,0 +1,8 @@
{
"navigationBarTitleText": "个人信息",
"backgroundTextStyle": "light",
"usingComponents": {
"t-input": "tdesign-miniprogram/input/input",
"t-button": "tdesign-miniprogram/button/button"
}
}

View file

@ -0,0 +1,8 @@
<view>
<view class="form">
<t-input label="姓名" placeholder="请输入您的姓名" model:value="{{name}}" align="right" />
</view>
<view class="btns">
<t-button theme="primary" size="large" block bind:tap="onSubmit">确认</t-button>
</view>
</view>

View file

@ -0,0 +1,7 @@
page {
background-color: #f5f5f5;
}
.btns{
padding: 20rpx 40rpx;
box-sizing: border-box;
}