修改问题.

This commit is contained in:
18631081161 2026-01-21 00:04:31 +08:00
parent b7b399ba66
commit 3468be4716
9 changed files with 87 additions and 23 deletions

View File

@ -15,7 +15,9 @@ import { get, post } from './request'
* @returns {Promise<Object>} 推荐用户列表
*/
export async function getRecommend(pageIndex = 1, pageSize = 10) {
const response = await get('/users/recommend', { pageIndex, pageSize }, { needAuth: false })
// 如果用户已登录发送token以便后端排除当前用户
const token = uni.getStorageSync('token')
const response = await get('/users/recommend', { pageIndex, pageSize }, { needAuth: !!token })
return response
}

View File

@ -21,7 +21,7 @@ const ENV = {
}
// 当前环境 - 开发时使用 development打包时改为 production
const CURRENT_ENV = 'production'
const CURRENT_ENV = 'development'
// 导出配置
export const config = {

View File

@ -585,6 +585,7 @@
import { ref, reactive, computed, onMounted, watch } from 'vue'
import { useUserStore } from '@/store/user.js'
import { createOrUpdate, getMyProfile, uploadPhotos, deletePhoto, cleanupOrphanPhotos } from '@/api/profile.js'
import { decryptPhone } from '@/api/user.js'
import { generateNickname, getBirthYearRange } from '@/utils/format.js'
import config from '@/config/index.js'
@ -1095,15 +1096,19 @@ const handleChoosePhoto = () => {
const handleDeletePhoto = async (index) => {
const photo = formData.photos[index]
if (photo.id) {
try {
await deletePhoto(photo.id)
} catch (error) {
console.error('删除照片失败:', error)
}
}
uni.showLoading({ title: '删除中...' })
formData.photos.splice(index, 1)
try {
if (photo.id) {
await deletePhoto(photo.id)
}
formData.photos.splice(index, 1)
} catch (error) {
console.error('删除照片失败:', error)
uni.showToast({ title: '删除失败', icon: 'none' })
} finally {
uni.hideLoading()
}
}
// -
@ -1123,7 +1128,6 @@ const handleGetPhoneNumber = async (e) => {
uni.showLoading({ title: '验证中...' })
try {
const { decryptPhone } = await import('@/api/user.js')
const res = await decryptPhone(code)
if (res && res.code === 0 && res.data?.phone) {
@ -1322,6 +1326,12 @@ const loadProfile = async () => {
formData.introduction = profile.introduction || ''
formData.weChatNo = profile.weChatNo || ''
//
if (profile.phone) {
formData.phone = profile.phone
phoneVerified.value = true
}
// - URL使
if (profile.photos && profile.photos.length > 0) {
formData.photos = profile.photos.map(p => ({

View File

@ -133,7 +133,7 @@ export default {
// 使
const uploadRes = await new Promise((resolve, reject) => {
uni.uploadFile({
url: `${API_BASE_URL}/api/app/upload/image`,
url: `${API_BASE_URL}/upload/image`,
filePath: tempFilePath,
name: 'file',
header: {

View File

@ -110,6 +110,11 @@ public class ProfileRequest
/// </summary>
public string WeChatNo { get; set; } = string.Empty;
/// <summary>
/// 手机号
/// </summary>
public string? Phone { get; set; }
/// <summary>
/// 择偶要求
/// </summary>

View File

@ -130,6 +130,11 @@ public class ProfileResponse
/// </summary>
public string WeChatNo { get; set; } = string.Empty;
/// <summary>
/// 手机号
/// </summary>
public string? Phone { get; set; }
/// <summary>
/// 审核状态0待审核 1已通过 2已拒绝
/// </summary>

View File

@ -21,6 +21,7 @@ public class ProfileService : IProfileService
private readonly IRepository<UserProfile> _profileRepository;
private readonly IRepository<UserPhoto> _photoRepository;
private readonly IRepository<UserRequirement> _requirementRepository;
private readonly IRepository<DailyRecommend> _recommendRepository;
private readonly IStorageProvider _storageProvider;
private readonly ILogger<ProfileService> _logger;
@ -34,6 +35,7 @@ public class ProfileService : IProfileService
IRepository<UserProfile> profileRepository,
IRepository<UserPhoto> photoRepository,
IRepository<UserRequirement> requirementRepository,
IRepository<DailyRecommend> recommendRepository,
IStorageProvider storageProvider,
ILogger<ProfileService> logger)
{
@ -41,6 +43,7 @@ public class ProfileService : IProfileService
_profileRepository = profileRepository;
_photoRepository = photoRepository;
_requirementRepository = requirementRepository;
_recommendRepository = recommendRepository;
_storageProvider = storageProvider;
_logger = logger;
}
@ -146,9 +149,18 @@ public class ProfileService : IProfileService
user.Nickname = nickname;
user.Gender = request.ChildGender;
user.IsProfileCompleted = true;
if (!string.IsNullOrEmpty(request.Phone))
{
user.Phone = request.Phone;
}
user.UpdateTime = DateTime.Now;
await _userRepository.UpdateAsync(user);
// 6. 清除今日推荐(性别等关键信息变更后需要重新生成推荐)
var today = DateTime.Today;
await _recommendRepository.DeleteAsync(r => r.UserId == userId && r.RecommendDate == today);
_logger.LogInformation("已清除用户今日推荐: UserId={UserId}", userId);
return profileId;
}
@ -202,6 +214,7 @@ public class ProfileService : IProfileService
Nickname = user.Nickname,
XiangQinNo = user.XiangQinNo,
Avatar = user.Avatar,
Phone = user.Phone,
Relationship = profile.Relationship,
Surname = profile.Surname,
ChildGender = profile.ChildGender,

View File

@ -83,7 +83,7 @@ public class RecommendService : IRecommendService
// 未登录用户,返回默认推荐(随机推荐已审核通过的用户)
if (userId <= 0)
{
return await GetDefaultRecommendAsync(pageIndex, pageSize);
return await GetDefaultRecommendAsync(pageIndex, pageSize, 0);
}
// 获取今日推荐列表
@ -92,8 +92,15 @@ public class RecommendService : IRecommendService
if (!recommends.Any())
{
// 如果今日没有推荐,生成新的推荐
await GenerateDailyRecommendForUserAsync(userId);
// 如果今日没有推荐,尝试生成新的推荐
var generatedCount = await GenerateDailyRecommendForUserAsync(userId);
// 如果生成失败(用户资料未完成等),返回默认推荐但排除当前用户
if (generatedCount == 0)
{
return await GetDefaultRecommendAsync(pageIndex, pageSize, userId);
}
recommends = await _recommendRepository.GetListAsync(
r => r.UserId == userId && r.RecommendDate == today);
}
@ -163,13 +170,16 @@ public class RecommendService : IRecommendService
}
/// <summary>
/// 获取默认推荐列表(未登录用户
/// 获取默认推荐列表(未登录用户或无每日推荐时
/// </summary>
private async Task<PagedResult<RecommendUserResponse>> GetDefaultRecommendAsync(int pageIndex, int pageSize)
/// <param name="pageIndex">页码</param>
/// <param name="pageSize">每页数量</param>
/// <param name="excludeUserId">要排除的用户ID当前登录用户</param>
private async Task<PagedResult<RecommendUserResponse>> GetDefaultRecommendAsync(int pageIndex, int pageSize, long excludeUserId = 0)
{
// 获取已完成资料、状态正常的用户
// 获取已完成资料、状态正常的用户,排除当前用户
var allUsers = await _userRepository.GetListAsync(
u => u.IsProfileCompleted && u.Status == 1);
u => u.IsProfileCompleted && u.Status == 1 && (excludeUserId == 0 || u.Id != excludeUserId));
// 过滤出审核通过的用户
var validUsers = new List<(Core.Entities.Biz.User User, Core.Entities.Biz.UserProfile Profile)>();

View File

@ -99,10 +99,27 @@ public class WeChatService : IWeChatService
}
var url = $"https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token={accessToken}";
var requestBody = new { code };
var requestBodyJson = System.Text.Json.JsonSerializer.Serialize(new { code });
var response = await _httpClient.PostAsJsonAsync(url, requestBody);
var result = await response.Content.ReadFromJsonAsync<GetPhoneNumberResponse>();
var content = new StringContent(requestBodyJson, System.Text.Encoding.UTF8, "application/json");
var response = await _httpClient.PostAsync(url, content);
var responseContent = await response.Content.ReadAsStringAsync();
if (string.IsNullOrWhiteSpace(responseContent))
{
_logger.LogError("微信接口返回空响应");
await _cache.RemoveAsync(AccessTokenCacheKey);
return null;
}
var result = System.Text.Json.JsonSerializer.Deserialize<GetPhoneNumberResponse>(responseContent);
// 如果是AccessToken过期清除缓存
if (result?.ErrCode == 40001 || result?.ErrCode == 42001)
{
_logger.LogWarning("AccessToken已过期清除缓存");
await _cache.RemoveAsync(AccessTokenCacheKey);
}
if (result?.ErrCode != 0)
{
@ -365,7 +382,9 @@ public class WeChatService : IWeChatService
$"&appid={_options.MiniProgram.AppId}" +
$"&secret={_options.MiniProgram.AppSecret}";
var response = await _httpClient.GetFromJsonAsync<AccessTokenResponse>(url);
var httpResponse = await _httpClient.GetAsync(url);
var responseContent = await httpResponse.Content.ReadAsStringAsync();
var response = System.Text.Json.JsonSerializer.Deserialize<AccessTokenResponse>(responseContent);
if (response == null || string.IsNullOrEmpty(response.AccessToken))
{