本系列文章是針對 https://blog.csdn.net/weixin_43668031/article/details/83962959 內容的實現所編寫的。開發經歷包括思考過程、重構和推翻重來。
繼續智能合約的編寫:
function createAlbum (string memory _title, string memory _cover, string memory _info) public returns (uint albumnum) {
albums[albumNum++] = Album(_title, _cover, _info, msg.sender, 0);
return albumNum - 1;
}
function editAlbum (uint _albumId, string memory _title, string memory _cover, string memory _info) public {
if (msg.sender != albums[_albumId].author) return;
albums[_albumId].title = _title;
albums[_albumId].cover = _cover;
albums[_albumId].info = _info;
}
function createAlbumVideo (uint _albumId, uint _videoId) public returns (uint videonum) {
if (msg.sender != albums[_albumId].author) return (0);
albums[_albumId].videos[albums[_albumId].videoNum++] = _videoId;
return albums[_albumId].videoNum - 1;
}
function updateAlbumVideo (uint _albumId, uint _albumvideoId, uint _videoId) public {
if (msg.sender != albums[_albumId].author || albums[_albumId].videoNum <= _albumvideoId) return;
albums[_albumId].videos[_albumvideoId] = _videoId;
}
function getAlbum (uint _albumId) view public returns (string memory title, string memory cover, string memory info, address author, uint videonum, uint durationSum) {
Album storage _album = albums[_albumId];
for (uint i = 0; 0 < _album.videoNum; i++) {
if (videos[_album.videos[i]].permission == 0) {
durationSum += videos[_album.videos[i]].duration;
}
}
return (_album.title, _album.cover, _album.info, _album.author, _album.videoNum, durationSum);
}
function getAlbumVideo (uint _albumId, uint _videoId) view public returns (uint videoId, string memory title, string memory cover, string memory videoinfo, string memory info, uint duration, uint timestamp, address author, uint commentsNum, uint gratuityNum, uint gratuitySum) {
videoId = albums[_albumId].videos[_videoId];
if (videos[videoId].permission == 0 || msg.sender == videos[videoId].author) {
Video storage _video = videos[videoId];
for (uint i = 0; i < _video.gratuityNum; i++) gratuitySum += _video.gratuitys[i].gratuity;
return (videoId, _video.title, _video.cover, _video.videoinfo, _video.info, _video.duration, _video.timestamp, _video.author, _video.commentsNum, _video.gratuityNum, gratuitySum);
}
}
這裏完成了幾個操作專輯的方法,其中getAlbum 獲取專輯數據,並能夠實時計算出這個專輯中允許訪問的視頻的總長度。視頻如果不是公開權限的將不計入內,但如果這個視頻又是自己上傳的也是可以通過getAlbumVideo 方法來獲取到內容,這和getVideo方法基本一致。
到這裏合約編寫基本就告一段落了,接下去會着重開始編寫前端和中間件。
https://github.com/bill080307/douyinWithEth/blob/2a51da9119265c3665b03832dfd346befa4152fc/VideoShare.sol
這是合約現在的版本,除了在本文中提到的部分代碼,會對上節的代碼就行修正錯誤和概念,因此以目前的這個版本爲準,如果你通過本系列文章中的代碼片段就行組合,可以得到完整,但存在錯誤的代碼。