предисловие
Недавно сами делают небольшую программу, программа основана на небольшом облачном развитии, использование разработки облака при выполнении программы небольших проектов действительно много удобства. У меня о облачном развитии будет поговориться о позже, в конце концов, этот проект разработан с использованием облака, партнеры по развитию Content Cloud Partners нужно также увидеть официальные документы,.
Адрес проекта имитации заголовка.
Детальный проект
Далее я подробно расскажу о проекте.Хотя облачная разработка экономит много времени, интерфейсные и серверные части требуют много работы.За этот короткий период времени я не завершил весь проект, но реализованы только домашняя страница, страница сведений и страница входа.и другие основные функции
Сначала я разрабатываю базу данных, в которой интерфейс должен получать данные для подготовки к последующему сбору данных.База данных использует базу данных MongoDB, разработанную Mini Program Cloud, хранит данные в облачной базе данных и использует облачные функции для работы с базой данных.
Новости Главная
Домашняя страница проще, чем страница сведений. В заголовке используются поле поиска и кнопка поиска. Затем есть панель вкладок, содержащая несколько вкладок. Каждая вкладка отображает соответствующее письмо с новостями, соответствующее ярлыку. В правой части вкладки есть кнопка, при нажатии на которую открывается всплывающее окно. Здесь есть специальное место, то есть липкая новость устанавливается вверху страницы рекомендаций.Домашний интерфейс
Поле ввода привязано к событию касания, которое изменяет значение заполнителя, когда поле ввода щелкается, но значение не вводится.
В правой части панели вкладок есть кнопка. Нажмите кнопку, и появится всплывающий слой. В предыдущем gif-файле есть демонстрация, которая представляет собой поле выбора для типов новостей. Нажмите кнопку закрытия, чтобы закрыть окно. всплывающий слой.
Наконец, это самая важная страница отображения новостей на главной странице, в целях экономии времени проекта здесь используется любимый фреймворк vant-weapp, о котором могут узнать заинтересованные друзья. На панели вкладок установлено 6 вкладок, но отображаются только вкладки 4. Если вы хотите отобразить другие вкладки, вы можете перетаскивать панель вкладок влево и вправо. Здесь рекомендуемая страница активируется по умолчанию. Поскольку код каждой вкладки в основном одинаков, только первая колонка рекомендуемой страницы является верхней информацией, а полученные данные отличаются.Код для сбора данных будет подробно описан ниже.В целях улучшения кода Для повторного использования здесь используется шаблон, а повторно используемый код пишется в другом файле, и его можно вызывать напрямую при использовании.
Создается коллекция, соответствующая каждому тегу.Здесь я также создаю другую коллекцию для главных новостей и проектирую поля, которые необходимо использовать для каждой части информации, чтобы облегчить получение и использование данных самостоятельно, потому что облачная база данных может импортируйте файлы json или файл csv, и каждая новость также должна подтягивать и загружать данные, для чего требуется больше данных, а создание данных самостоятельно занимает много времени и хлопот, поэтому я написал здесь сканер для сканирования нужных мне данных и сохраните его в файл json.Данные импортируются в базу данных.
Такое проектирование базы данных также упрощает получение данных из базы данных. Напишите функцию модуля для получения данных каждого тега.
Поля каждой части данных следующие, из которых news_id играет важную роль, связывая каждую новость на главной странице с соответствующей страницей сведений.
Детакт
Используйте шаблон на каждой вкладке и установите ДАННЫЕ (для разных страниц в соответствующую новостную информацию, которую необходимо отобразить, используемую для отображения на странице), поскольку страница активации по умолчанию является рекомендуемой страницей, рекомендуется, когда событие OnLoad Данные страницы, и установите рекомендуемую страницу, чтобы она была активирована, а данные загружаются с помощью функции загрузки.
module: function(title) {
let counter = this.data.counter
// console.log(title)
wx.cloud.callFunction({
name: 'module',
data: {
counter: counter,
title: title
}
}).then(res => {
// console.log(res)
let cnews = this.data.cnews
let data = res.result.data
// console.log(data)
for(let i = 0; i < data.length; i++) {
// console.log(data[i].date)
data[i].date = data[i].date.slice(0, 10)
cnews.push(data[i])
this.imgCheck(data[i].images, data.new_id, title)
}
// console.log(data)
this.setData({
hiddenLoading: true,
cnews: cnews,
counter: counter+1
})
})
}
Заголовок — это заголовок отображаемого в данный момент тега. Рекомендуется значение по умолчанию. При использовании счетчика каждый раз будет загружаться только 5 новостей. Новостная информация, полученная из базы данных, обрабатывается с помощью облачной функции.
#### 通过云函数获取数据
// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init()
const db = cloud.database()
// 云函数入口函数
exports.main = async (event, context) => {
return await db.collection(event.title).skip((event.counter-1)*5).limit(5).get()
}
Передайте в облачную функцию два фрагмента данных, один — заголовок, который предназначен для получения информации из соответствующей коллекции, а другой — счетчик, используемый для вычисления позиции получения информации, т. к. данные необходимо загружать при подтягивании и загружаю больше новостей, вот и я Он настроен на загрузку 5 частей данных за раз, поэтому счетчик передается в облачную функцию.Каждый раз, когда облачная функция вызывается для получения данных из базы данных, счетчик будет +1 , чтобы каждый раз, когда данные подтягиваются и загружаются, уже загруженные данные сзади игнорировались. Каждый раз, когда данные загружаются, массив, который сохраняет данные, будет обновляться один раз, и страница index.wxml домашней страницы будет оценивать и получать данные и использовать цикл for для отображения данных на соответствующей странице вкладки.
Потяните вниз, чтобы обновить
В верхней части новости, которая на самом деле не особо спец в сборе данных, я просто поставил топ новостей последних новостей из облачной базы, чтобы победить и показать страницу
onPullDownRefresh: function () { // 监听下拉动作来获取最新新闻信息
wx.showToast({
title: '推荐中',
image: '../../../image/加载.png'
})
let title = this.data.title;
wx.cloud.callFunction({
name: 'module',
data: {
counter: 1,
title: title
}
}).then(res => {
// console.log(res)
let cnews = this.data.cnews
let datas = res.result.data
let data = datas.concat(cnews)
this.setData({
hiddenLoading: true,
cnews: data,
})
})
}
Я уже говорил о бэкенде, и эта статья также посвящена облачной разработке, честно говоря, облачная разработка очень удобна, один человек может заниматься фронтендом и бэкендом. Однако, чтобы облегчить всем понимание, я все же расскажу о содержании интерфейса.
Поскольку данные были переданы ранее, последнее, что нужно сделать, это отобразить данные, все данные
<van-tab title="推荐" >
<!-- 推荐tab标签页的置顶新闻框 每一个新闻框可以点击进入到详情页-->
<van-panel class="topping" title="{{topTitle}}" status="置顶" use-footer-slot bind:tap="showTopDetail" data-item="{{topNew_id}}">
<view class="images">
<image src="{{images[0]}}" />
<image src="{{images[1]}}" />
<image src="{{images[2]}}" />
</view>
<view solt="footer" class="footer">
<view class="author">{{topAuthor}}</view>
<view class="comment">评论{{topComment}}</view>
<view class="Date">{{topDate}}</view>
</view>
</van-panel>
<template is="container" data="{{news: active1 == 'news'?news:cnews, hiddenLoading}}"></template>
</van-tab>
<template name="container">
<view class="container">
<loading hidden="{{hiddenLoading}}"></loading>
<view class="news" wx:for="{{news}}" wx:for-item="info" wx:key="info.new_id">
<van-panel class="new" title="{{info.title}}" bind:tap="showDetail" use-footer-slot data-item="{{info.new_id}}">
<view class="images" wx:if="{{info.images.length > 0}}">
<image src="{{info.images[0]}}"/>
<image src="{{info.images[1]}}"/>
<image src="{{info.images[2]}}"/>
</view>
<view solt="footer" class="footer">
<view class="author">{{info.author}}</view>
<view class="comment">评论{{info.comments}}</view>
<view class="Date">{{info.date}}</view>
</view>
</van-panel>
</view>
</view>
</template>
Здесь используется идея MVVM, которая привязывает данные к UI-интерфейсу, и после того, как данные получены в файле js, данные используются здесь.
Так как количество картинок для каждой новости здесь не определено, и показывают максимум три картинки. Так зафиксировали сразу три тега изображения и зафиксировали размер изображения, когда без картинки не будет отображаться картинка.
Страница сведений
Многое из того, что я сказал на главной странице, больше не будет сказано на странице подробностей.Если вы не понимаете, вы можете перейти к исходному коду.В конце концов, говорить столько ерунды - пустая трата времени. Я постараюсь выбрать наиболее интересные части для написания.
Главная страница на страницу сведений
Каждая новость на главной странице привязана к событию быстрого перехода.При нажатии на новость происходит переход на страницу сведений и передача идентификатора и заголовка новости в качестве параметров на страницу сведений.
showDetail: function(e) { // 点文章显示文章详情
let item = e.currentTarget.dataset.item;
let title = this.data.title;
// console.log(e)
wx.navigateTo({
url:`../detail/detail?contentId=${item}&title=${title}`
})
}
интерфейс
После перехода на страницу сведений соответствующий идентификатор новости будет получен в событии загрузки, и этот идентификатор будет сохранен в данных. Поскольку я не лез вниз при сканировании страницы с подробностями, я просто вставил в контент какой-то простой контент.
В этой части страницы деталей я разделил страницу в контентные детали и комментарии. Тогда есть использование фиксированной кнопки, чтобы исправить поле ввода и другие кнопки в нижней части экрана
Контентная часть разделена на четыре части, а именно заглавная часть, аватар и никнейм автора, содержательная часть, лайк и пересылка, а данные в базе данных отображаются в интерфейсе.
Во второй части я использовал гибкий гибкий макет для отображаемого изображения и псевдонима и установил гибкость части псевдонима на 1, чтобы кнопки аватара и подписки были с обеих сторон. В аватаре используется тег изображения, а размер тега изображения фиксирован, ведь загружаемые пользователями изображения должны быть разных размеров. Четвертую часть можно выполнить, если вы используете 4 представления для размещения изображений и контента, а затем используете гибкий макет.
Реализация конкретной функции
Теперь, когда макет интерфейса завершен, пришло время получить данные.Когда вы нажмете на новость, чтобы перейти на страницу сведений, вы получите идентификатор и заголовок новости, чтобы вы могли передать уникальный идентификатор ( id каждого документа) и заголовок (название сборника) Получить соответствующие новостные данные из облачной базы данных. Код здесь публиковаться не будет, он аналогичен предыдущей домашней странице, если он вам нужен, вы можете зайти на github и посмотреть исходный код.
Далее содержание раздела комментариев.Лично я считаю это место довольно интересным и есть проблема с правами доступа при обновлении базы данных.Я не говорил об этом раньше,но планирую разместить его в разделе комментариев. Поле комментария закреплено внизу страницы, включая поле ввода, кнопку для перехода к комментариям, кнопку избранного и кнопку вперед.
Нажмите кнопку вперед, появится всплывающее окно, вы можете выбрать канал для переадресации и добавить эффект маскировки к фону всплывающего слоя.Всплывающее окно исчезнет только при нажатии кнопки маска или кнопка отмены.Он реализует только функцию переадресации в WeChat, просто вызовите интерфейс onshareAppMessage апплета WeChat, вы можете переслать его другу или группе WeChat, нажав на значок WeChat.
Реализация функции входа заключается в установке свойств кнопки входа на странице в open-type=getUserInfo, bindgetuserinfo=getUserInfo Нажатие кнопки входа для авторизации входа приведет к получению информации о пользователе и сохранению информации о пользователе в глобальном масштабе, чтобы информацию о пользователе можно было оценить или использовать на странице сведений.Авторизация может публиковать комментарии к новостям.Поскольку пользователь используется при входе в систему, в комментариях присутствует аватар и ник пользователя. Нажмите «Опубликовать», когда значение будет введено в поле ввода комментария, и пользователь авторизует вход, а данные будут сохранены в базе данных. Ниже приведена функция комментариев.
submit: function() { // 实现评论功能,将发布的评论同步到云数据库
let value = this.data.inputValue;
let new_id = this.data.new_id;
let userInfo = this.data.userInfo
// let new_id = '6594157273642172936'
if(userInfo){
comments.where({
new_id: new_id
}).get({
success: (res) => {
// console.log(res)
let comms= res.data[0].comments;
let people = {
content: value,
like: 0,
avatar: userInfo.avatarUrl,
nickname: userInfo.nickname
}
comms.unshift(people);
// console.log(comm)
this.setData({
comms: comms,
input: '',
})
wx.cloud.callFunction({
name: 'updateComments',
data: {
new_id: new_id,
comms: comms
}
}).then(res =>{
console.log(res)
})
}
})
}
}
Для базы данных в разделе комментариев я создал только набор комментариев, роль будет играть новость new_id в начале, у каждого комментария есть new_id, и каждый комментарий новости задается как объект, ведь комментарии тоже включать псевдонимы аватаров, количество лайков, содержание комментариев и т. д. Преимущество настройки базы данных комментариев таким образом заключается в том, что, пока идентификатор новости получен в наборе, можно получить комментарии, соответствующие новостям.
Когда я начал обновлять базу, я не использовал облачные функции, а напрямую обновлял данные в js, возвращаемая информация показывала, что запрос прошел успешно, но номер обновления был 0, но когда я проверил в базе, я обнаружил, что данные не были успешно обновлены Проверьте После прочтения документа я обнаружил, что это проблема разрешений, потому что изменение данных может быть выполнено только менеджером или создателем данных, а данные были вручную введены в облако базу данных самостоятельно.Когда база данных обновляется напрямую в js, это не создатель, а создатель.На стороне апплета нет полномочий администратора, поэтому нет полномочий для изменения данных. Поскольку создатель не может изменить данные, только администратор, поэтому здесь я использую облачную функцию для изменения данных. На данный момент все должны знать об уровне разрешений облачных функций.Вот описание официальной документации. Облачной функцией нельзя пользоваться случайно, ведь разрешения самые большие. Более конкретный контент можно отсоединить, чтобы увидеть официальный документ.Поскольку вы можете комментировать, функция «лайк» незаменима.Хотя «лайк» — очень распространенная функция, она использует облачные данные, и конкретная реализация по-прежнему очень интересна.
Каждый комментарий можно лайкнуть один раз, повторное нажатие отменяет лайк. Нравится в разделе комментариев Функция addLike, которую я написал здесь, привязана к кнопке «Мне нравится». {index}}"i (индекс генерируется с помощью цикла for для отображения комментариев) и соответствует месту, где комментарий сохраняется в базе данных, чтобы было удобно отличать понравившийся комментарий.
При лайке кнопка лайка изменится на красную кнопку, а лайки в базе тоже увеличатся на единицу. Нажмите кнопку «Мне нравится» еще раз, чтобы восстановить, и «Нравится» также восстановится. На самом деле подобная функция все же очень интересна.Это полностью моя личная идея.Могут быть какие-то минусы,но все же рекомендую всем глянуть. Ниже приведен конкретный код реализации
addLike: function(e) { // 点击点赞图标增加点赞数同时保存到数据库
let item = e.currentTarget.dataset.item;
let new_id = this.data.new_id;
let comms = this.data.comms;
let likeItem = this.data.likeItem;
let likebool = 'likeItem['+item+'].bool'
let liken = 'likeItem['+item+'].n'
if(typeof(likeItem[item]) == "undefined"){
this.setData({
[likebool]: false,
[liken]: 0,
})
}
if(likeItem[item]){
likeItem[item].n += 1;
if(likeItem[item].n%2){
comms[item].like += 1;
}else{
comms[item].like -= 1;
}
likeItem[item].bool = !(likeItem[item].bool);
}else{
likeItem[item].bool = true;
likeItem[item].n = 0;
comms[item].like += 1;
}
this.setData({
comms: comms,
likeItem: likeItem
})
// console.log(comms)
wx.cloud.callFunction({
name: 'updateComments',
data: {
new_id: new_id,
comms: comms
}
}).then(res =>{
// console.log(res)
})
},
В нижнем сайдбаре поля ввода комментария есть кнопка-флажок, кнопка-картинка и т.д.. Здесь я использовал flex layout, чтобы легко это сделать.Так я реализовал функцию вставки картинок в комментарии и сохранял картинки в облако. На самом деле изображение для вставки комментария еще нужно оптимизировать, и я продолжу его оптимизировать после того, как закончу писать статью.
Я использую интерфейс загрузки файлов wx.cloud.uploadFile, разработанный Mini Program Cloud.После загрузки изображения будет сгенерирован идентификатор файла.Я сохраню идентификатор файла (то есть адрес изображения) под изображением текущего объекта комментария , и обновите локальные данные, а затем используйте if, чтобы определить, содержит ли текущий комментарий изображение, и если да, отобразить изображение в комментарии. Я не буду размещать здесь код, вы можете посмотреть исходный код, если он вам нужен.
Суммировать
Поскольку проект немного большой, я реализовал только некоторые функции за короткий период времени, а другие функции я реализую в последующее время. На самом деле, я написал этот проект для реальной облачной разработки, и я также ощутил на себе преимущества облачной разработки. Вы можете указать на некоторые недостатки в проекте, а также можете связаться со мной, если у вас есть хорошие предложения. все учатся друг у друга