congzc 1 rok temu
rodzic
commit
444ccd6384
11 zmienionych plików z 527 dodań i 53 usunięć
  1. +5
    -0
      README.md
  2. +3
    -1
      src/App.vue
  3. +12
    -0
      src/api/lookPhoto.js
  4. +25
    -0
      src/api/uploadphoto.js
  5. +225
    -0
      src/pages/closeStyle/closeStyle copy.vue
  6. +49
    -20
      src/pages/closeStyle/closeStyle.vue
  7. +29
    -10
      src/pages/index/index.vue
  8. +23
    -12
      src/pages/login/index.vue
  9. +99
    -4
      src/pages/lookPhoto/index.vue
  10. +54
    -5
      src/pages/uploadPhoto/uploadPhoto.vue
  11. +3
    -1
      src/utils/request.js

+ 5
- 0
README.md Wyświetl plik

@@ -1,5 +1,10 @@
# Suimang-wxapp

setStorageSync 键名
userId --用户id,用于邀请分享功能
loginAwardCoin --注册奖励金币
inviteAwardCoin --邀请奖励金币
plat --根据平台不同来返回的值,用于发送请求 1为微信,2为抖音


wx-"appid": "wx75cf14e3a0d45821",


+ 3
- 1
src/App.vue Wyświetl plik

@@ -19,8 +19,10 @@ onLaunch(() => {
if (res.uniPlatform == "web") {
uniPlatform = 1;
} else if (res.uniPlatform == "mp-weixin") {
uni.setStorageSync("plat", 1);
uniPlatform = 2;
} else if (res.uniPlatform == "mp-toutiao") {
uni.setStorageSync("plat", 2);
uniPlatform = 3;
}
if (res.osName == "windows") {
@@ -42,7 +44,7 @@ onLaunch(() => {
},
});
uni.setStorageSync("userId", "114514");
// uni.setStorageSync("userId", "114514");
const updateManager = uni.getUpdateManager();


+ 12
- 0
src/api/lookPhoto.js Wyświetl plik

@@ -52,3 +52,15 @@ export function getUserQrcodeApi(data) {
data
})
}

/**
* @description:获取订阅消息模版id
* @param
* @return: data
*/
export function getTemplateMsgApi() {
return request({
url: `api/templateMsg/list?projectType=5&plat=${uni.getStorageSync("plat")}&type=1`,
method: 'get',
})
}

+ 25
- 0
src/api/uploadphoto.js Wyświetl plik

@@ -27,4 +27,29 @@ export function addImageApi(data) {
method: 'post',
data
});
}

/**
* @description:获取登陆,注册送多少金币的接口
* @param "projectType":5,//智像固定5 "type":1-注册,2-邀请
* @return: data
*/
export function getProjectConfigApi(data) {
return request({
url: `api/glodConfig/getProjectConfig`,
method: 'post',
data
})
}

/**
* @description:获取照片生成次数,判断是不是首次生成
* @param "projectType":5,//智像固定5 "type":1-注册,2-邀请
* @return: data
*/
export function getCountApi() {
return request({
url: `api/digitalAvatarPhoto/getCount`,
method: 'get',
})
}

+ 225
- 0
src/pages/closeStyle/closeStyle copy.vue Wyświetl plik

@@ -0,0 +1,225 @@
<template>
<div class="page">
<!-- 性别tab -->
<view class="sexTab">
<view @click="sex = 2" class="sex" :class="sex == 2 ? 'sexActive' : ''"
>女</view
>
<view @click="sex = 1" class="sex" :class="sex == 1 ? 'sexActive' : ''"
>男</view
>
</view>
<u-list
class="styleListBox"
@scrolltolower="scrolltolower"
lowerThreshold="100"
>
<u-list-item class="glodYBox">
<u-list-item
v-for="item in styleList"
:key="item.id"
class="styleListBoxItme"
>
<view class="styleInfo" @click="createPhoto(item)">
<image :src="item.coverImg" mode="aspectFit" />
<text class="name">{{ item.title }}</text>
<text class="single">{{ peopleNum(item.mouldType) }}</text>
</view>
</u-list-item>
</u-list-item>
</u-list>
</div>
</template>

<script setup>
//#region 导入
import { onPullDownRefresh } from "@dcloudio/uni-app";
import { ref, reactive, watch } from "vue";
import { getListApi } from "../../api/closeStyle";
//#endregion

//#region 页面下拉刷新
// onPullDownRefresh(async () => {
// uni.showLoading({
// title: "加载中...",
// mask: true,
// });
// pageNum.value = 1;
// pageSize.value = 8;
// styleList.value = [];
// await getList();
// uni.hideLoading();
// uni.stopPullDownRefresh();
// });
//#endregion

//#region 列表加载
const pageNum = ref(1);
const pageSize = ref(20);
const sex = ref(2); //1男2女
const styleList = ref([]);
// 得到列表
async function getList() {
try {
uni.showLoading({
title: "加载中...",
mask: true,
});
const res = await getListApi(pageNum.value, pageSize.value, sex.value);
styleList.value = res.data.list;
uni.hideLoading();
} catch (error) {
uni.hideLoading();
uni.showToast({
title: "获取列表失败,请重试",
icon: "none",
});
}
}
// 监听性别tab变化
watch(
() => sex.value,
(sex) => {
pageNum.value = 1;
pageSize.value = 20;
getList();
}
);
getList();
// 触底加载更多
const scrolltolower = async () => {
try {
uni.showLoading({
title: "加载中...",
mask: true,
});
pageNum.value += 1;
const res = await getListApi(pageNum.value, pageSize.value, sex.value);
styleList.value.push(...res.data.list);
setTimeout(function () {
uni.hideLoading();
}, 500);

if (res.data.list.length == 0) {
pageNum.value -= 1;
uni.showToast({
title: "已加载全部内容",
icon: "none",
});
}
} catch (error) {
setTimeout(function () {
uni.hideLoading();
}, 500);
uni.showToast({
title: "获取数据失败,请重试",
icon: "none",
});
}
};

// 处理单人双人多人
function peopleNum(num) {
if (num == 1) {
return "单人";
} else if (num == 2) {
return "双人";
} else if (num == 3) {
return "三人";
}
}
//#endregion ---------------------

//#region 点击图片
function createPhoto(item) {
if (item.mouldType == 1) {
uni.navigateTo({
url: `/pages/closeStyle/goCreatePhoto?id=${item.id}`,
});
} else {
uni.navigateTo({
url: `/pages/closeStyle/multiplayer?id=${item.id}`,
});
}
}
//#endregion ---------------------
</script>

<style lang="scss">
.page {
background-color: #222527;
}
.sexTab {
margin: 20rpx 0;
width: 100%;
height: 60rpx;
display: flex;
justify-content: space-evenly;
line-height: 54rpx;
text-align: center;
.sex {
border-radius: 20rpx;
border: 2rpx solid #ccc;
width: 40%;
}
.sexActive {
color: #ff4f00;
border: 2rpx solid #ff4f00;
transition: all 0.3s;
}
}

.u-list {
overflow: hidden;
height: calc(100vh - 200rpx) !important;
width: 650rpx;
.glodYBox {
display: flex !important;
flex-direction: row !important;
flex-wrap: wrap !important;
justify-content: space-between !important;
}
.u-list-item {
display: flex !important;
flex-direction: row !important;
flex-wrap: wrap !important;
justify-content: space-between !important;
}
.styleInfo {
position: relative;
display: flex !important;
flex-wrap: wrap !important;
width: 300rpx;
height: 480rpx;
margin-bottom: 50rpx;
border-radius: 24rpx;
overflow: hidden;
image {
width: 300rpx;
height: 400rpx;
}
.name {
background-color: #393b3d;
width: 100%;
height: 80rpx;
text-align: center;
line-height: 80rpx;
font-size: 30rpx;
font-weight: bold;
}
.single {
position: absolute;
top: 11rpx;
right: 13rpx;
width: 72rpx;
height: 41rpx;
text-align: center;
line-height: 41rpx;
background: rgba(0, 0, 0, 0.4);
font-size: 22rpx;
// opacity: 0.4;
border-radius: 12rpx;
}
}
}
</style>

+ 49
- 20
src/pages/closeStyle/closeStyle.vue Wyświetl plik

@@ -1,14 +1,22 @@
<template>
<div class="page">
<!-- 性别tab -->
<view class="sexTab">
<!-- <view class="sexTab">
<view @click="sex = 2" class="sex" :class="sex == 2 ? 'sexActive' : ''"
>女</view
>
<view @click="sex = 1" class="sex" :class="sex == 1 ? 'sexActive' : ''"
>男</view
>
</view>
</view> -->
<u-tabs
:list="tabList"
lineWidth="70"
lineColor="#ff4f00"
:activeStyle="{ color: '#ff4f00' }"
:inactiveStyle="{ color: '#fff' }"
@click="chooseTab"
></u-tabs>
<u-list
class="styleListBox"
@scrolltolower="scrolltolower"
@@ -143,32 +151,53 @@ function createPhoto(item) {
}
}
//#endregion ---------------------

//#region tab栏
const tabList = ref([
{ name: "女", id: 2 },
{ name: "男", id: 1 },
// { name: "多人", id: 3 },
// { name: "电影明星", id: 4 },
// { name: "体育", id: 5 },
]);
function chooseTab(item) {
sex.value = item.id;
}
//#endregion
</script>

<style lang="scss">
.page {
background-color: #222527;
}
.sexTab {
margin: 20rpx 0;
width: 100%;
height: 60rpx;
display: flex;
justify-content: space-evenly;
line-height: 54rpx;
text-align: center;
.sex {
border-radius: 20rpx;
border: 2rpx solid #ccc;
width: 40%;
}
.sexActive {
color: #ff4f00;
border: 2rpx solid #ff4f00;
transition: all 0.3s;
// .sexTab {
// margin: 20rpx 0;
// width: 100%;
// height: 60rpx;
// display: flex;
// justify-content: space-evenly;
// line-height: 54rpx;
// text-align: center;
// .sex {
// border-radius: 20rpx;
// border: 2rpx solid #ccc;
// width: 40%;
// }
// .sexActive {
// color: #ff4f00;
// border: 2rpx solid #ff4f00;
// transition: all 0.3s;
// }
// }
.u-tabs {
max-width: 100%;
color: #fff !important;
margin-bottom: 30rpx;
.u-tabs__wrapper__nav__item {
width: 200rpx;
height: 90rpx !important;
}
}

.u-list {
overflow: hidden;
height: calc(100vh - 200rpx) !important;


+ 29
- 10
src/pages/index/index.vue Wyświetl plik

@@ -147,17 +147,23 @@
class="InviteBox"
v-show="showListActive == 3 && userInfoModulesPinia.token"
>
<scroll-view :scroll-y="true" class="showInviteList">
<view v-for="item in 9" :key="item" class="InviteList">
<scroll-view
:scroll-y="true"
class="showInviteList"
@scrolltolower="getMoreInviteList"
>
<view v-for="item in InviteList" :key="item.id" class="InviteList">
<up-avatar :src="avatarUrl" size="50"></up-avatar>
<view class="info">
<view class="name">猕猴桃</view>
<view class="time">2023/7/29</view>
<view class="name">{{ item.userPhone }}</view>
<view class="time">{{
dayjs(item.createDate).format("YYYY-MM-DD HH:mm:ss")
}}</view>
</view>
<view class="getCoin"> 金币+2 </view>
<view class="getCoin"> +{{ item.goldNum }}金币 </view>
</view>
</scroll-view>
<view class="inviteBtn">继续邀请好友</view>
<button open-type="share" class="inviteBtn">继续邀请好友</button>
</view>
<!-- 显示消费列表内容 -->
<view
@@ -296,7 +302,7 @@ function goCloseStyle() {
const tabList = ref([
{ name: "我的写真", id: 1 },
// { name: "我的视频", id: 2 },
// { name: "我的邀请", id: 3 },
{ name: "我的邀请", id: 3 },
{ name: "消费记录", id: 4 },
]);
const showListActive = ref(1);
@@ -404,7 +410,7 @@ function getSymbol(type) {
}
//#endregion 获取图片,金币,
//#region 获取消费记录
//#region 获取邀请记录
const pageSize3 = ref(20);
const pageNum3 = ref(1);
const InviteList = ref(20);
@@ -416,11 +422,11 @@ async function getInviteList(pageSize, pageNum) {
}
/**
* @description:触底加载更多消费记录
* @description:触底加载更多邀请记录
*/
async function getMoreInviteList() {
try {
pageNum2.value += 1;
pageNum3.value += 1;
const res = await getInviteListApi(pageSize3.value, pageNum3.value);
if (res.data && res.data.list && res.data.list.length == 0) {
pageNum3.value -= 1;
@@ -825,6 +831,7 @@ onShareAppMessage((res) => {
line-height: 100rpx;
text-align: center;
font-size: 30rpx;
color: #fff;
background-color: rgba(255, 79, 0, 1);
border-radius: 50rpx;
}
@@ -910,11 +917,23 @@ onShareAppMessage((res) => {
padding: 0 50rpx;
height: 65rpx;
line-height: 65rpx;
text-align: center;
.name,
.coin {
width: 25%;
font-weight: 900;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.name {
text-align: start;
}
.coin {
text-align: end;
}
.time {
flex: 1;
font-weight: 100;
}
}


+ 23
- 12
src/pages/login/index.vue Wyświetl plik

@@ -152,6 +152,7 @@
//#region 导入
import { ref, reactive, computed } from "vue";
import { onLoad } from "@dcloudio/uni-app";
import { findImageApi, findGlodApi } from "../../api/home";
import {
loginApi,
loginPhoneApi,
@@ -481,6 +482,10 @@ onLoad((options) => {
icon: "none",
});
}
// 已有token时直接登录
if (uni.getStorageSync("token")) {
uni.switchTab({ url: "/pages/uploadPhoto/uploadPhoto" });
}

if (userInfoModulesPinia.platForm == 2) {
uni.login({
@@ -500,20 +505,26 @@ onLoad((options) => {
userInfoModulesPinia.openId = res2.data.openId;
if (res2.data.token) {
userInfoModulesPinia.token = res2.data.token;
// uni.setStorageSync("token", userInfoModulesPinia.token);
uni.setStorageSync("token", userInfoModulesPinia.token);
console.log(userInfoModulesPinia.openId, "获取openid");
// 获取头像和金币
// const res3 = await findImageApi();
// userInfoModulesPinia.myAvatar =
// res3.data && res3.data.image ? res3.data.image : "";
// const res4 = await findGlodApi();
// if (!res4.data) {
// userInfoModulesPinia.myGlod = 0;
// } else {
// userInfoModulesPinia.myGlod = res4.data.digitalAvatarResidueGlod
// ? res4.data.digitalAvatarResidueGlod
// : 0;
// }
const res3 = await findImageApi();
if (res3.data) {
uni.setStorageSync("userId", res3.data.id);
}
userInfoModulesPinia.myAvatar =
res3.data && res3.data.image ? res3.data.image : "";
const res4 = await findGlodApi();
if (res4.data) {
uni.setStorageSync("userId", res4.data.id);
}
if (!res4.data) {
userInfoModulesPinia.myGlod = 0;
} else {
userInfoModulesPinia.myGlod = res4.data.digitalAvatarResidueGlod
? res4.data.digitalAvatarResidueGlod
: 0;
}
uni.hideLoading();
if (res2.data.token) {
getPrivacySetting(1);


+ 99
- 4
src/pages/lookPhoto/index.vue Wyświetl plik

@@ -20,7 +20,18 @@
mode="aspectFit"
/>
<view v-if="createState == 2" class="checkMore">左右滑动查看更多</view>
<view v-if="createState != 2" class="wait">生成中,请稍后...</view>
<view
v-if="createState != 2 && userInfoModulesPinia.platForm == 2"
class="wait"
>生成中,请稍后...</view
>
<view
@click="subscribe"
v-if="createState != 2"
style="text-decoration: underline; color: #ff4f00"
class="wait"
>做好后通知我</view
>
<!-- <view class="uploadBtn grayBtn">
<text>我要让照片说话</text>
<view class="free">
@@ -40,7 +51,7 @@
<!-- 底部 -->
<view class="bottomBox">
<view v-if="createState == 2" class="tips">
<text>邀请好友可获得2枚金币</text>
<text>邀请好友可获得{{ loginAwardCoin }}枚金币</text>
</view>
<button open-type="share" class="shareBtn">分享</button>
<view v-if="createState == 2" class="shareBtn" @click="getUserQrcode"
@@ -66,6 +77,7 @@ import {
onShareTimeline,
} from "@dcloudio/uni-app";
import { BASE_URL } from "../../utils/request";
import { findGlodApi } from "../../api/home";
import { ref, reactive, watch } from "vue";
import { userInfoModules } from "@/store/modules/userInfo";
import {
@@ -73,16 +85,28 @@ import {
photoSupperApi,
getSupperPhotoStateApi,
getUserQrcodeApi,
getTemplateMsgApi,
} from "../../api/lookPhoto.js";
//#endregion
const userInfoModulesPinia = userInfoModules();
//#region 轮播图
const createState = ref(null); //制作状态:1生成中,2完成,3失败
const createState = ref(1); //制作状态:1生成中,2完成,3失败
const workId = ref(null); //作品id
const loginAwardCoin = uni.getStorageSync("loginAwardCoin");
onLoad(async (options) => {
workId.value = options.id;
await getTemplateMsg();
await getSwiperList();
await getSupperPhotoState(swiperList.value[0].id);
// 重新获取金币
const res4 = await findGlodApi();
if (!res4.data) {
userInfoModulesPinia.myGlod = 0;
} else {
userInfoModulesPinia.myGlod = res4.data.digitalAvatarResidueGlod
? res4.data.digitalAvatarResidueGlod
: 0;
}
});
onHide(() => {
clearTimeout(timer);
@@ -107,7 +131,7 @@ async function getSwiperList() {
});
}
if (createState.value != 2) {
if (res.data.status != 2) {
timer.value = setTimeout(() => {
getSwiperList();
}, 3000);
@@ -405,6 +429,77 @@ async function getUserQrcode() {
//#endregion ---------------------
//#region 订阅消息
const templateId = ref([]);
async function getTemplateMsg() {
try {
const res = await getTemplateMsgApi();
if (res.data) {
res.data.forEach((item) => {
templateId.value.push(item.templateId);
});
}
} catch (error) {
console.log("获取订阅消息模版失败", error);
}
}
function subscribe() {
uni.requestSubscribeMessage({
//此处填写刚才申请模板的模板ID
tmplIds: templateId.value,
success(res) {
console.log(res);
let failFlag = true;
templateId.value.forEach((item) => {
if (res[item] == "accept") {
uni.showToast({
title: "订阅成功",
icon: "success",
});
failFlag = false;
}
});
if (failFlag) {
// uni.showToast({
// duration: 5000,
// title: "订阅失败 ,您可以在小程序设置->通知管理 \n 中重新启用订阅功能",
// icon: "none",
// });
uni.showModal({
title: "提示",
content:
"订阅失败 ,您可以在 \n 小程序设置->通知管理 \n 中重新启用订阅功能",
confirmText: "确定",
showCancel: false,
});
}
// if (res[templateId[0]] == "accept") {
// uni.showToast({
// title: "订阅成功",
// icon: "success",
// });
// // 用户允许订阅
// } else {
// uni.showToast({
// title: "订阅失败",
// icon: "none",
// });
// // 用户拒绝订阅
// }
},
fail(err) {
console.error("订阅消息失败", err);
uni.showToast({
title: "订阅失败",
icon: "none",
});
},
});
}
//#endregion ---------------------
//#region
//#endregion ---------------------


+ 54
- 5
src/pages/uploadPhoto/uploadPhoto.vue Wyświetl plik

@@ -47,10 +47,10 @@
<view class="grayBtn" v-if="uploadState == 4" @click="chooseImage"
>重新上传</view
>
<!-- <view class="free" v-if="false">
<view class="free" v-if="countNum == 0">
<image src="../../assets/icon/blackBG.png" mode="aspectFit" />
<text>新用户免费制作</text>
</view> -->
</view>
</view>
<!-- 底部盒子 -->
<view class="bottomBox">
@@ -97,10 +97,15 @@ import { ref, reactive, nextTick } from "vue";
import { BASE_URL } from "../../utils/request";
import { onLoad, onShow } from "@dcloudio/uni-app";
import { loginApi } from "../../api/login";
import { addImageApi } from "../../api/uploadphoto.js";
import {
addImageApi,
getProjectConfigApi,
getCountApi,
} from "../../api/uploadphoto.js";
import { userInfoModules } from "@/store/modules/userInfo";
import imageCompression from "browser-image-compression"; //压缩图片插件
import { findImageApi, findGlodApi } from "../../api/home";
//#endregion
const userInfoModulesPinia = userInfoModules();
@@ -348,11 +353,13 @@ onLoad((options) => {
userInfoModulesPinia.openId = res2.data.openId;
if (res2.data.token) {
userInfoModulesPinia.token = res2.data.token;
// uni.setStorageSync("token", userInfoModulesPinia.token);
uni.setStorageSync("token", userInfoModulesPinia.token);
console.log(userInfoModulesPinia.openId, "获取openid");
// 获取头像和金币
const res3 = await findImageApi();
if (res3.data) {
uni.setStorageSync("userId", res3.data.id);
}
userInfoModulesPinia.myAvatar =
res3.data && res3.data.image ? res3.data.image : "";
const res4 = await findGlodApi();
@@ -366,6 +373,7 @@ onLoad((options) => {
? res4.data.digitalAvatarResidueGlod
: 0;
}
uni.hideLoading();
if (res2.data.token) {
// uni.redirectTo({
@@ -487,6 +495,7 @@ onLoad((options) => {
},
});
}
// 如果是从相机页返回
});
onShow(() => {
@@ -502,6 +511,7 @@ onShow(() => {
toCloseStyle();
uni.removeStorageSync("action");
}
getCount();
});
//#endregion ---------------------
@@ -527,6 +537,45 @@ function takePhoto() {
}
//#endregion ---------------------
//#region 获取邀请 注册等奖励金币数量
async function getProjectConfig() {
const data1 = {
projectType: 5,
type: 1,
};
const data2 = {
projectType: 5,
type: 2,
};
try {
const res1 = await getProjectConfigApi(data1);
uni.setStorageSync("loginAwardCoin", res1.data.glodNum);
const res2 = await getProjectConfigApi(data2);
uni.setStorageSync("inviteAwardCoin", res2.data.glodNum);
} catch (error) {
console.log("获取邀请 注册等奖励金币数量失败", error);
}
}
getProjectConfig();
//#endregion ---------------------
//#region 是否首次生成
const countNum = ref(0);
async function getCount() {
try {
const res = await getCountApi();
if (res.data) {
countNum.value = res.data;
} else {
countNum.value = 0;
}
} catch (error) {
console.log("是否首次生成", error);
}
}
//#endregion ---------------------
//#region
//#endregion ---------------------


+ 3
- 1
src/utils/request.js Wyświetl plik

@@ -15,10 +15,12 @@ const request = (requestObj) => {
data: requestObj.data,
header: {
// Authorization: userInfoModulesPinia.token,
token: userInfoModulesPinia.token,
// token: userInfoModulesPinia.token,
token: uni.getStorageSync("token"),
},
success: (res) => {
if (res.data.code == 1052) {
uni.setStorageSync("token", null)
uni.reLaunch({
url: "/pages/login/index?type=tokenFfalse",
});


Ładowanie…
Anuluj
Zapisz