朋友圈备注问题 已解决 //朋友圈 控制器 中
。。。省略 部分代码 。。。
try {
let momentTimelineList = await app.model.MomentTimeline.findAll({
where: { user_id: ctx.authUser.id },
include: [{
model: app.model.Moment,
as: 'moment',
where: {},
exclude: ['updated_time'],
include: [{
model: app.model.User,
as: 'user',
attributes: ['id', 'name', 'avatar', 'gender'],
include: [{
model: app.model.Partner,
where: {
user_id: ctx.authUser.id
},
as: "friend",
attributes: ['id','user_id','target_id', 'remarks'],
}]
},
{ model: app.model.MomentImage, as: 'momentImageList', },
{
model: app.model.MomentComment,
as: 'momentComment',
exclude: ['updated_time'],
include: [{
model: app.model.User,
as: 'momentCommentUser',
attributes: ['id', 'name', 'avatar'],
include: [{
。。。省略 部分代码 同上方 红色部分 。。。
}]
}, {
model: app.model.User,
as: 'momentCommentReply',
attributes: ['id', 'name', 'avatar'],
include: [{
。。。省略 部分代码 同上方 红色部分 。。。
}]
}],
order: [['id', 'DESC']],
}, {
model: app.model.MomentLike,
as: 'momentLike',
attributes: ['user_id', 'moment_id'],
include: [{
model: app.model.User,
as: 'momentLikeUser',
attributes: ['id', 'name'],
include: [{
。。。省略 部分代码 同上方 红色部分 。。。
}]
}]
}]
}],
offset, limit, order: [['id', 'DESC']],
})
let rows = momentTimelineList.map(item => {
let comments = []
let likes = []
item.moment.momentComment.forEach(e => {
if (targetIdArray.includes(e.momentCommentUser.id) || e.momentCommentUser.id === ctx.authUser.id) {
comments.push({
create_time: e.created_time,
content: e.content,
user: {
id: e.momentCommentUser.id,
name: e.momentCommentUser.friend.remarks || e.momentCommentUser.nickname || e.momentCommentUser.name,
avatar: e.momentCommentUser.avatar,
},
reply: e.momentCommentReply ? {
id: e.momentCommentReply.id,
name: e.momentCommentReply.friend.remarks || e.momentCommentReply.nickname || e.momentCommentReply.name,
} : {},
})
}
})
item.moment.momentLike.forEach(e => {
if (targetIdArray.includes(e.momentLikeUser.id) || e.momentLikeUser.id === ctx.authUser.id) {
likes.push({
id: e.momentLikeUser.id,
name: e.momentLikeUser.friend.remarks || e.momentLikeUser.nickname || e.momentLikeUser.name
})
}
})
return {
。。。省略 部分代码 。。。
name: item.moment.user.friend.remarks || item.moment.user.nickname || item.moment.user.name,
。。。省略 部分代码 。。。
}
})
。。。省略 部分代码 。。。
坑爹的网易云 内容过长不让发 导致 大量 省略代码
//朋友圈备注问题 用户模型中
User.hasOne(app.model.Partner, {
as: "friend",
foreignKey: 'target_id'
});
关于问题1:朋友圈备注的moment.user_id的问题终于找到了,这个问题很不好找,是sequelize的问题
async getDynamicList() {
const { app, ctx } = this
let { limit, page } = ctx.request.body
limit = (limit ? limit : 10)
page = (page ? page : 1)
let offset = (page - 1) * limit
// 当前用户的好友列表
let partnerList = await app.model.Partner.findAll({
where: {
user_id: ctx.authUser.id,
is_black_list: 0,
},
attributes: ['target_id'],
})
let targetIdArray = partnerList.map(item => item.target_id)
let index = targetIdArray.findIndex(item => {
return item === ctx.authUser.id
})
if (index === -1) {
targetIdArray.push(ctx.authUser.id)
}
console.log('当前用户的好友列表')
console.log(targetIdArray)
try {
let momentTimelineList = await app.model.MomentTimeline.findAll({
where: {
user_id: ctx.authUser.id
},
include: [{
model: app.model.Moment,
as: 'moment',
exclude: ['updated_time'],
where:{}, // 这里需要加多一个空的where条件,不加的话,会默认把其他的where条件认定为查询moment表(已实际测试过)
include: [{
model: app.model.User,
as: 'user',
attributes: ['id', 'name', 'avatar', 'gender'],
include: [{
model: app.model.Partner,
where:{
user_id:ctx.authUser.id
},
as: "friends",
attributes: ['id', 'remarks'],
}]
},
{
model: app.model.MomentComment,
as: 'momentComment',
exclude: ['updated_time'],
include: [{
model: app.model.User,
as: 'momentCommentUser',
attributes: ['id', 'name', 'avatar'],
}, {
model: app.model.User,
as: 'momentCommentReply',
attributes: ['id', 'name', 'avatar'],
}],
order: [['id', 'DESC']],
}, {
model: app.model.MomentLike,
as: 'momentLike',
attributes: ['user_id', 'moment_id'],
include: [{
model: app.model.User,
as: 'momentLikeUser',
attributes: ['id', 'name'],
}]
}]
}],
offset,
limit,
order: [['id', 'DESC']],
})
console.log(JSON.parse(JSON.stringify(momentTimelineList)))
let rows = momentTimelineList.map(item => {
console.log('item+++++++++++++++++++++++=')
console.log(JSON.parse(JSON.stringify(item)).moment.user.partner)
let comments = []
let likes = []
// 评论
item.moment.momentComment.forEach(e => {
if (targetIdArray.includes(e.momentCommentUser.id) || e.momentCommentUser.id === ctx.authUser.id) {
comments.push({
create_time: e.created_time,
content: e.content,
user: {
id: e.momentCommentUser.id,
name: e.momentCommentUser.nickname || e.momentCommentUser.name,
avatar: e.momentCommentUser.avatar,
},
reply: e.momentCommentReply ? {
id: e.momentCommentReply.id,
name: e.momentCommentReply.nickname || e.momentCommentReply.name,
} : {},
})
}
})
//点赞
item.moment.momentLike.forEach(e => {
if (targetIdArray.includes(e.momentLikeUser.id) || e.momentLikeUser.id === ctx.authUser.id) {
likes.push({
id: e.momentLikeUser.id,
name: e.momentLikeUser.nickname || e.momentLikeUser.name
})
}
})
return {
id: item.id,
moment_id: item.moment.id,
user_id: item.moment.user_id,
name: item.moment.user.friends[0].remarks || item.moment.user.nickname || item.moment.user.name,
avatar: item.moment.user.avatar,
content: item.moment.content,
image: item.moment.image || '',
video: item.moment.video || '',
location: item.moment.location,
remind: item.moment.remind,
see: item.moment.see,
created_time: item.moment.created_time,
comments,
likes,
}
})
发表观点要登录哦!点击登录
关于朋友圈图片问题:
你现在是后端这个方法 async releaseDynamic()已经包含了上传一张图片+发布一条朋友圈信息了。
这样就导致你前端如果上传了9张图片,this.sendImage(path, value)就会调用9次,发布了9张图片并且发布了9条朋友圈,所以解决这个问题最好的办法就是把这两个接口分开:
一个是上传图片接口(上传接口在调用uni.chooseImage的回调时调用,我们课程就是这么处理的,包括目前的主流app也都是这么处理的,例如微信,小红书等。)
另一个就是发布朋友圈接口(单纯提交发布)
关于图片存储到朋友圈数据表是 数组 还是 字符串。答案是:以逗号分割的字符串
发表观点要登录哦!点击登录
关于问题1:朋友圈备注问题(靓仔,看下面的红色部分,你先试试,不行的话再跟我反馈,备注错误信息)
第一步:user模型需要定义一个一对多的关系
async getDynamicList() {
const { app, ctx } = this
let { limit, page } = ctx.request.body
limit = (limit ? limit : 10)
page = (page ? page : 1)
let offset = (page - 1) * limit
// 当前用户的好友列表
let partnerList = await app.model.Partner.findAll({
where: {
user_id: ctx.authUser.id,
is_black_list: 0,
},
attributes: ['target_id'],
})
let targetIdArray = partnerList.map(item => item.target_id)
let index = targetIdArray.findIndex(item => {
return item === ctx.authUser.id
})
if (index === -1) {
targetIdArray.push(ctx.authUser.id)
}
console.log('当前用户的好友列表')
console.log(targetIdArray)
try {
let momentTimelineList = await app.model.MomentTimeline.findAll({
where: {
user_id: ctx.authUser.id
},
include: [{
model: app.model.Moment,
as: 'moment',
exclude: ['updated_time'],
include: [{
model: app.model.User,
as: 'user',
attributes: ['id', 'name', 'avatar', 'gender'],
include: [{
model: app.model.Partner,
where:{
user_id:ctx.authUser.id
},
as: "friends",
attributes: ['id', 'remarks'],
}]
},
{
model: app.model.MomentComment,
as: 'momentComment',
exclude: ['updated_time'],
include: [{
model: app.model.User,
as: 'momentCommentUser',
attributes: ['id', 'name', 'avatar'],
}, {
model: app.model.User,
as: 'momentCommentReply',
attributes: ['id', 'name', 'avatar'],
}],
order: [['id', 'DESC']],
}, {
model: app.model.MomentLike,
as: 'momentLike',
attributes: ['user_id', 'moment_id'],
include: [{
model: app.model.User,
as: 'momentLikeUser',
attributes: ['id', 'name'],
}]
}]
}],
offset,
limit,
order: [['id', 'DESC']],
})
console.log(JSON.parse(JSON.stringify(momentTimelineList)))
let rows = momentTimelineList.map(item => {
console.log('item+++++++++++++++++++++++=')
console.log(JSON.parse(JSON.stringify(item)).moment.user.partner)
let comments = []
let likes = []
// 评论
item.moment.momentComment.forEach(e => {
if (targetIdArray.includes(e.momentCommentUser.id) || e.momentCommentUser.id === ctx.authUser.id) {
comments.push({
create_time: e.created_time,
content: e.content,
user: {
id: e.momentCommentUser.id,
name: e.momentCommentUser.nickname || e.momentCommentUser.name,
avatar: e.momentCommentUser.avatar,
},
reply: e.momentCommentReply ? {
id: e.momentCommentReply.id,
name: e.momentCommentReply.nickname || e.momentCommentReply.name,
} : {},
})
}
})
//点赞
item.moment.momentLike.forEach(e => {
if (targetIdArray.includes(e.momentLikeUser.id) || e.momentLikeUser.id === ctx.authUser.id) {
likes.push({
id: e.momentLikeUser.id,
name: e.momentLikeUser.nickname || e.momentLikeUser.name
})
}
})
return {
id: item.id,
moment_id: item.moment.id,
user_id: item.moment.user_id,
name: item.moment.user.friends[0].remarks || item.moment.user.nickname || item.moment.user.name,
avatar: item.moment.user.avatar,
content: item.moment.content,
image: item.moment.image || '',
video: item.moment.video || '',
location: item.moment.location,
remind: item.moment.remind,
see: item.moment.see,
created_time: item.moment.created_time,
comments,
likes,
}
})
发表观点要登录哦!点击登录
此问题是朋友圈的好友备注问题
//获取朋友圈列表
async getDynamicList() {
const { app, ctx } = this
let { limit, page } = ctx.request.body
limit = (limit ? limit : 10)
page = (page ? page : 1)
let offset = (page - 1) * limit
// 当前用户的好友列表
let partnerList = await app.model.Partner.findAll({
where: {
user_id: ctx.authUser.id,
is_black_list: 0,
},
attributes: ['target_id'],
})
let targetIdArray = partnerList.map(item => item.target_id)
let index = targetIdArray.findIndex(item => {
return item === ctx.authUser.id
})
if (index === -1) {
targetIdArray.push(ctx.authUser.id)
}
console.log('当前用户的好友列表')
console.log(targetIdArray)
try {
let momentTimelineList = await app.model.MomentTimeline.findAll({
where: {
user_id: ctx.authUser.id
},
include: [{
model: app.model.Moment,
as: 'moment',
exclude: ['updated_time'],
include: [{
model: app.model.User,
as: 'user',
attributes: ['id', 'name', 'avatar', 'gender'],
// include: [{
// model: app.model.Partner,
// where:{
// user_id:ctx.authUser.id
// },
// as: 'partner',
// attributes: ['id', 'remarks'],
// }]
},
{
model: app.model.MomentComment,
as: 'momentComment',
exclude: ['updated_time'],
include: [{
model: app.model.User,
as: 'momentCommentUser',
attributes: ['id', 'name', 'avatar'],
}, {
model: app.model.User,
as: 'momentCommentReply',
attributes: ['id', 'name', 'avatar'],
}],
order: [['id', 'DESC']],
}, {
model: app.model.MomentLike,
as: 'momentLike',
attributes: ['user_id', 'moment_id'],
include: [{
model: app.model.User,
as: 'momentLikeUser',
attributes: ['id', 'name'],
}]
}]
}],
offset,
limit,
order: [['id', 'DESC']],
})
console.log(JSON.parse(JSON.stringify(momentTimelineList)))
let rows = momentTimelineList.map(item => {
console.log('item+++++++++++++++++++++++=')
console.log(JSON.parse(JSON.stringify(item)).moment.user.partner)
let comments = []
let likes = []
// 评论
item.moment.momentComment.forEach(e => {
if (targetIdArray.includes(e.momentCommentUser.id) || e.momentCommentUser.id === ctx.authUser.id) {
comments.push({
create_time: e.created_time,
content: e.content,
user: {
id: e.momentCommentUser.id,
name: e.momentCommentUser.nickname || e.momentCommentUser.name,
avatar: e.momentCommentUser.avatar,
},
reply: e.momentCommentReply ? {
id: e.momentCommentReply.id,
name: e.momentCommentReply.nickname || e.momentCommentReply.name,
} : {},
})
}
})
//点赞
item.moment.momentLike.forEach(e => {
if (targetIdArray.includes(e.momentLikeUser.id) || e.momentLikeUser.id === ctx.authUser.id) {
likes.push({
id: e.momentLikeUser.id,
name: e.momentLikeUser.nickname || e.momentLikeUser.name
})
}
})
return {
id: item.id,
moment_id: item.moment.id,
user_id: item.moment.user_id,
name: item.moment.user.nickname || item.moment.user.name,
avatar: item.moment.user.avatar,
content: item.moment.content,
image: item.moment.image || '',
video: item.moment.video || '',
location: item.moment.location,
remind: item.moment.remind,
see: item.moment.see,
created_time: item.moment.created_time,
comments,
likes,
}
})
//////省略下方代码 ////
上方红色部分 不应该是去好友表中去拿 我给他的备注吗?老师这个只是去拿用户的昵称了 这里没有很懂
发表观点要登录哦!点击登录
此问题是 发布朋友圈 图片问题 备注:老师写的没有任何问题,只是我使用的方法并不是和老师的一样
//前端 发布动态
/* 发布 */
release() {
console.log(this.see)
if ((this.selectedType === 'specifiedPersonVisible' && !this.specifiedPersonVisibleList.length) || (this.selectedType ===
'specifiedPersonIsNotVisible' && !this.specifiedPersonIsNotVisibleList.length)) {
return uni.showToast({
icon: 'none',
title: '请先选择'
})
}
console.log(this.imgList.length)
if (this.imgList.length === 0 && this.content.trim() !== '' && this.content.trim() !== null) { //单纯文本
this.sendText('text')
} else if (this.content.trim() !== '' && this.content.trim() !== null) {
this.send('image')
}
},
/* 上传 */
send(value) {
switch (value) {
case 'image':
{ //图片和文本
console.log(this.imgList)
this.imgList.forEach(path => {
this.sendImage(path, value)
})
// this.sendImage("", value)
this.content = ''
this.imgList = []
setTimeout(() => {
uni.navigateBack({
delta: 1
})
}, 1000)
break
}
case '':
{ //视频和文本
break
}
}
},
/* 上传图片 */
sendImage(path, type) {
let data = {
content: this.content,
location: this.location,
remind: 'all',
see: 1,
fileType: type,
}
const uploadTask = uni.uploadFile({
url: this.$constUtils.webUrl + '/moment/releaseDynamic',
filePath: path,
fileType: 'image',
header: {
'enctype': 'multipart/form-data',
'token': this.user.token,
},
formData: data,
success: (uploadFileRes) => {
console.log(uploadFileRes)
if (uploadFileRes.statusCode !== 200) {
return uni.showToast({
icon: 'none',
title: "上传失败"
})
} else {
let imagePath = JSON.parse(uploadFileRes.data).data
console.log(imagePath)
uni.showToast({
icon: 'none',
title: '发布成功'
})
}
},
fail: (err) => {
console.log(err)
}
});
uploadTask.onProgressUpdate((res) => {
console.log('上传进度' + res.progress)
// console.log('已经上传的数据长度' + res.totalBytesSent)
// console.log('预期需要上传的数据总长度' + res.totalBytesExpectedToSend)
});
},
/* 上传文本 */
sendText(type) {
let data = {
content: this.content.trim(),
location: '北京',
remind: this.remind,
see: this.see,
type,
}
this.http('/moment/releaseDynamic', data)
},
http(url, data) {
return new Promise((resolve, reject) => {
this.$http.http(url, 'POST', data).then(res => {
resolve(res)
this.content = ''
this.imgList = []
uni.showToast({
icon: 'none',
title: '发布成功'
})
this.destroyedVuexStore()
setTimeout(() => {
uni.navigateBack({
delta: 1
})
}, 1000)
}).catch(err => {
reject(err)
this.content = ''
this.imgList = []
})
})
}
发表观点要登录哦!点击登录
此问题是 发布朋友圈 图片问题 备注:老师写的没有任何问题,只是我使用的方法并不是和老师的一样
// 发布动态 控制器
async releaseDynamic() {
const { app, ctx } = this
const { protocol, host } = ctx.request;
let { type } = ctx.request.body
console.log(type)
if (type) { //不是流文件上传
try {
let { content, image, video, location, remind, see } = ctx.request.body
let moment = await app.model.Moment.create({
content, image, video, location, remind, see,
user_id: ctx.authUser.id, created_time: new Date().getTime(),
})
if (!moment) {
return ctx.fail(400, '操作失败');
}
this.pushTimeLine(moment)
return ctx.success({}, '操作成功');
} catch (error) {
console.log(error)
return ctx.fail(400, '操作失败');
}
} else { //是流文件上传
const stream = await ctx.getFileStream()
let { content, image, video, location, remind, see, fileType } = stream.fields
try {
let momentFilePath = ''
let uploadBasePath = ''
switch (fileType) {
case 'image': {
momentFilePath = '/public/uploads/moment/momentImage'
uploadBasePath = 'app/public/uploads/moment/momentImage'
break
}
case 'video': {
momentFilePath = '/public/uploads/moment/momentImageVideo'
uploadBasePath = 'app/public/uploads/moment/momentImageVideo'
break
}
}
// 生成文件名
const filename = `${Date.now()}${Number.parseInt(Math.random() * 1000)}${path.extname(stream.filename).toLocaleLowerCase()}`;
// 生成文件夹
const dirname = dayjs(Date.now()).format('YYYY/MM/DD');
function mkdirsSync(dirname) {
if (fs.existsSync(dirname)) {
return true;
} else {
if (mkdirsSync(path.dirname(dirname))) {
fs.mkdirSync(dirname);
return true;
}
}
}
mkdirsSync(path.join(uploadBasePath, dirname)); // 生成写入路径
const target = path.join(uploadBasePath, dirname, filename); // 写入流
const writeStream = fs.createWriteStream(target);
//异步把文件流 写入
await awaitWriteStream(stream.pipe(writeStream));
let filePath = path.join(momentFilePath, dirname, filename).replace(/\\|\//g, '/');
filePath = protocol + '://' + ctx.getLocalHostUrl() + filePath
console.log('上传文件路径:')
console.log(filePath)
// await app.model.MomentImage.create({
// image:filePath,
// // moment_id:
// })
let momentObj = {
content, image, video, location, remind, see, created_time: new Date().getTime(),
user_id: ctx.authUser.id,
}
switch (fileType) {
case 'image': {
momentObj.image = filePath
break
}
case 'video': {
momentObj.video = filePath
break
}
}
let moment = await app.model.Moment.create(momentObj)
if (!moment) {
return ctx.fail(400, '操作失败');
}
this.pushTimeLine(moment)
await sendToWormhole(stream);
return ctx.success({}, '操作成功');
} catch (error) {
//如果出现错误,关闭管道
await sendToWormhole(stream);
console.log(error)
ctx.fail(400, error)
}
}
发表观点要登录哦!点击登录
我也来评论