完成留言模块
This commit is contained in:
parent
dd8741ebd6
commit
1d3b72ed2f
|
|
@ -140,4 +140,25 @@ module.exports = class extends Base {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 新增留言
|
||||||
|
async addAdviceAction() {
|
||||||
|
let advice = this.post();
|
||||||
|
advice.userId = this.ctx.state.user.id;
|
||||||
|
try {
|
||||||
|
let res = await this.model("advices").add(advice);
|
||||||
|
this.json({ code: 0, data: res, msg: `留言 添加成功` });
|
||||||
|
} catch (error) {
|
||||||
|
this.json({ code: 1, data: '', msg: error.toString() });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取所有留言
|
||||||
|
async getAdvicesAction() {
|
||||||
|
try {
|
||||||
|
let data = await this.model("advices").order("createdAt DESC").select();
|
||||||
|
this.json({ code: 0, data });
|
||||||
|
} catch (error) {
|
||||||
|
this.json({ code: 1, data: '', msg: error.toString() });
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@ function get(url, params) {
|
||||||
|
|
||||||
function post(url, params) {
|
function post(url, params) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
axios.post(url, params)
|
axios.post(url, params || {})
|
||||||
.then(res => {
|
.then(res => {
|
||||||
resolve(res);
|
resolve(res);
|
||||||
})
|
})
|
||||||
|
|
|
||||||
|
|
@ -4,16 +4,21 @@ app.controller('adviceCtr', ['$scope', '$state', '$timeout', 'bookmarkService',
|
||||||
$window.location = "http://m.mybookmark.cn/#/tags";
|
$window.location = "http://m.mybookmark.cn/#/tags";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
var maxSelections = 3;
|
|
||||||
|
|
||||||
$scope.comment = '';
|
$scope.comment = '';
|
||||||
$scope.advices = [];
|
$scope.advices = [];
|
||||||
$scope.category = ["功能", "BUG", "其他"];
|
|
||||||
$scope.user = {};
|
$scope.user = {};
|
||||||
|
|
||||||
get('own').then(user => $scope.user = user);
|
get('own').then(user => {
|
||||||
|
$scope.user = user;
|
||||||
|
pubSubService.publish('Common.menuActive', {
|
||||||
|
login: true,
|
||||||
|
index: dataService.LoginIndexAdvice
|
||||||
|
});
|
||||||
|
});
|
||||||
|
getAdvices();
|
||||||
|
|
||||||
$scope.ok = function () {
|
$scope.ok = async function () {
|
||||||
if ($scope.comment == '') {
|
if ($scope.comment == '') {
|
||||||
toastr.error('留言失败内容不能为空', "错误");
|
toastr.error('留言失败内容不能为空', "错误");
|
||||||
return;
|
return;
|
||||||
|
|
@ -22,61 +27,21 @@ app.controller('adviceCtr', ['$scope', '$state', '$timeout', 'bookmarkService',
|
||||||
toastr.error('test用户不允许留言!', "错误");
|
toastr.error('test用户不允许留言!', "错误");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
var advice = {
|
|
||||||
category: $('.ui.dropdown.js-categorys').dropdown('get value'),
|
await post('addAdvice', {
|
||||||
comment: $scope.comment,
|
comment: $scope.comment,
|
||||||
};
|
|
||||||
console.log(advice);
|
|
||||||
|
|
||||||
bookmarkService.addAdvice(advice)
|
|
||||||
.then((data) => {
|
|
||||||
if (data.retCode == 0) {
|
|
||||||
toastr.success('留言成功', "提示");
|
|
||||||
$scope.comment = "";
|
|
||||||
getAdvices({});
|
|
||||||
} else {
|
|
||||||
toastr.error('留言失败。错误信息:' + data.msg, "错误");
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.catch((err) => {
|
|
||||||
toastr.error('留言失败:' + JSON.stringify(err), "错误");
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function getAdvices(params) {
|
|
||||||
bookmarkService.getAdvices(params)
|
|
||||||
.then((data) => {
|
|
||||||
if ($scope.advices.length == 0) {
|
|
||||||
transition();
|
|
||||||
}
|
|
||||||
data.forEach(element => {
|
|
||||||
element.imgData = new Identicon(md5(element.username)).toString();
|
|
||||||
});
|
|
||||||
$scope.advices = data;
|
|
||||||
pubSubService.publish('Common.menuActive', {
|
|
||||||
login: true,
|
|
||||||
index: dataService.LoginIndexAdvice
|
|
||||||
});
|
|
||||||
})
|
|
||||||
.catch((err) => dataService.netErrorHandle(err, $state));
|
|
||||||
}
|
|
||||||
|
|
||||||
setTimeout(function () {
|
|
||||||
$('.ui.dropdown.js-categorys').dropdown({
|
|
||||||
onChange: function (value, text, $choice) { }
|
|
||||||
});
|
});
|
||||||
getAdvices({});
|
await getAdvices();
|
||||||
}, 100)
|
}
|
||||||
|
|
||||||
$('.js-segment-advice').transition('hide');
|
async function getAdvices() {
|
||||||
|
let data = await post("getAdvices");
|
||||||
function transition() {
|
data.forEach(element => {
|
||||||
var className = 'js-segment-advice';
|
element.imgData = new Identicon(md5(element.username)).toString();
|
||||||
$('.' + className).transition('hide');
|
});
|
||||||
$('.' + className).transition({
|
$scope.comment = "";
|
||||||
animation: dataService.animation(),
|
$timeout(function () {
|
||||||
duration: 500,
|
$scope.advices = data;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
}]);
|
}]);
|
||||||
|
|
|
||||||
|
|
@ -9,20 +9,15 @@ app.controller('tagsCtr', ['$scope', '$filter', '$state', '$window', '$statePara
|
||||||
await getTags();
|
await getTags();
|
||||||
})()
|
})()
|
||||||
|
|
||||||
// getTags({});
|
|
||||||
var dialog = null;
|
var dialog = null;
|
||||||
var forbidTransition = false;
|
|
||||||
var addBookmarkId = -1;
|
var addBookmarkId = -1;
|
||||||
$scope.hoverBookmark = null;
|
$scope.hoverBookmark = null;
|
||||||
$scope.showType = "createdAt";
|
$scope.showType = "createdAt";
|
||||||
$scope.loadBookmarks = false;
|
$scope.loading = false;
|
||||||
$scope.loadTags = false;
|
$scope.loadTags = false;
|
||||||
$scope.tags = []; // 书签数据
|
$scope.tags = []; // 书签数据
|
||||||
$scope.tagsIndex = []; // 书签索引
|
$scope.tagsIndex = []; // 书签索引
|
||||||
$scope.bookmarkClicked = false;
|
|
||||||
$scope.bookmarksByTag = [];
|
|
||||||
$scope.bookmarks = [];
|
$scope.bookmarks = [];
|
||||||
$scope.bookmarkCount = 0;
|
|
||||||
$scope.totalPages = 0;
|
$scope.totalPages = 0;
|
||||||
$scope.currentPage = 1;
|
$scope.currentPage = 1;
|
||||||
$scope.inputPage = '';
|
$scope.inputPage = '';
|
||||||
|
|
@ -32,21 +27,7 @@ app.controller('tagsCtr', ['$scope', '$filter', '$state', '$window', '$statePara
|
||||||
$scope.newTag = '';
|
$scope.newTag = '';
|
||||||
$scope.waitDelTag = {};
|
$scope.waitDelTag = {};
|
||||||
$scope.waitDelBookmark = {};
|
$scope.waitDelBookmark = {};
|
||||||
$scope.bookmarkData = {};
|
|
||||||
$scope.bookmarkNormalHover = false;
|
$scope.bookmarkNormalHover = false;
|
||||||
$scope.costomTag = {
|
|
||||||
id: -1,
|
|
||||||
bookmarkCount: 50,
|
|
||||||
bookmarkClicked: false,
|
|
||||||
name: '个人定制',
|
|
||||||
}
|
|
||||||
$scope.costomAllUsersTag = {
|
|
||||||
id: -1,
|
|
||||||
bookmarkCount: 50,
|
|
||||||
bookmarkClicked: false,
|
|
||||||
name: '全站定制',
|
|
||||||
}
|
|
||||||
|
|
||||||
var timeagoInstance = timeago();
|
var timeagoInstance = timeago();
|
||||||
|
|
||||||
pubSubService.subscribe('MenuCtr.tags', $scope, function (event, data) {
|
pubSubService.subscribe('MenuCtr.tags', $scope, function (event, data) {
|
||||||
|
|
@ -57,27 +38,17 @@ app.controller('tagsCtr', ['$scope', '$filter', '$state', '$window', '$statePara
|
||||||
$scope.getBookmarks = async function (tagId, page, showType) {
|
$scope.getBookmarks = async function (tagId, page, showType) {
|
||||||
console.log(tagId, page, showType);
|
console.log(tagId, page, showType);
|
||||||
|
|
||||||
$scope.bookmarkClicked = true;
|
$scope.bookmarks = [];
|
||||||
|
|
||||||
tagId && ($scope.currentTagId = tagId);
|
tagId && ($scope.currentTagId = tagId);
|
||||||
page && ($scope.currentPage = page);
|
page && ($scope.currentPage = page);
|
||||||
showType && ($scope.showType = showType);
|
showType && ($scope.showType = showType);
|
||||||
|
$scope.loading = true;
|
||||||
if (!forbidTransition) {
|
|
||||||
$scope.loadBookmarks = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
$scope.costomTag.bookmarkClicked = false;
|
|
||||||
$scope.costomAllUsersTag.bookmarkClicked = false;
|
|
||||||
|
|
||||||
let pageSize = ($scope.showMode == 'item') ? 50 : 20;
|
let pageSize = ($scope.showMode == 'item') ? 50 : 20;
|
||||||
|
|
||||||
$scope.tags.forEach(function (tag) {
|
for (let tag of $scope.tags) {
|
||||||
tag.bookmarkClicked = false;
|
tag.bookmarkClicked = (tag.id == $scope.currentTagId);
|
||||||
if (tag.id == $scope.currentTagId) {
|
}
|
||||||
tag.bookmarkClicked = true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
var params = {
|
var params = {
|
||||||
tagId: $scope.currentTagId,
|
tagId: $scope.currentTagId,
|
||||||
|
|
@ -85,24 +56,23 @@ app.controller('tagsCtr', ['$scope', '$filter', '$state', '$window', '$statePara
|
||||||
pageSize,
|
pageSize,
|
||||||
showType: $scope.showType
|
showType: $scope.showType
|
||||||
};
|
};
|
||||||
if (!forbidTransition) {
|
|
||||||
$($scope.showMode == 'item' ? '.js-tag-costomTag' : '.js-tags-table').transition('hide');
|
|
||||||
}
|
|
||||||
|
|
||||||
let reply = await get('getBookmarksByTag', params);
|
let reply = await get('getBookmarksByTag', params);
|
||||||
$scope.bookmarks = reply.data;
|
$scope.bookmarks = reply.data;
|
||||||
$scope.totalPages = reply.totalPages;
|
$scope.totalPages = reply.totalPages;
|
||||||
$scope.inputPage = '';
|
$scope.inputPage = '';
|
||||||
$scope.loadBookmarks = false;
|
$scope.loading = false;
|
||||||
$scope.bookmarkCount = reply.count;
|
|
||||||
|
for (let tag of $scope.tags) {
|
||||||
|
if (tag.id == $scope.currentTagId) {
|
||||||
|
tag.bookmarkCount = reply.count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pubSubService.publish('Common.menuActive', {
|
pubSubService.publish('Common.menuActive', {
|
||||||
login: true,
|
login: true,
|
||||||
index: dataService.LoginIndexTags
|
index: dataService.LoginIndexTags
|
||||||
});
|
});
|
||||||
if (!forbidTransition) {
|
|
||||||
dataService.transition($scope.showMode == 'item' ? '.js-tag-costomTag' : '.js-tags-table');
|
|
||||||
}
|
|
||||||
|
|
||||||
$timeout(function () {
|
$timeout(function () {
|
||||||
dataService.transition('#' + addBookmarkId, {
|
dataService.transition('#' + addBookmarkId, {
|
||||||
|
|
@ -110,7 +80,6 @@ app.controller('tagsCtr', ['$scope', '$filter', '$state', '$window', '$statePara
|
||||||
});
|
});
|
||||||
addBookmarkId = -1;
|
addBookmarkId = -1;
|
||||||
}, 1000);
|
}, 1000);
|
||||||
forbidTransition = false;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
$scope.changeCurrentPage = function (currentPage) {
|
$scope.changeCurrentPage = function (currentPage) {
|
||||||
|
|
@ -128,7 +97,7 @@ app.controller('tagsCtr', ['$scope', '$filter', '$state', '$window', '$statePara
|
||||||
bookmarkService.clickBookmark({
|
bookmarkService.clickBookmark({
|
||||||
id: id
|
id: id
|
||||||
});
|
});
|
||||||
$scope.bookmarkData.bookmarks.forEach(function (bookmark, index) {
|
$scope.bookmarks.forEach(function (bookmark, index) {
|
||||||
if (bookmark.id == id) {
|
if (bookmark.id == id) {
|
||||||
bookmark.click_count += 1;
|
bookmark.click_count += 1;
|
||||||
bookmark.last_click = $filter("date")(new Date(), "yyyy-MM-dd HH:mm:ss");
|
bookmark.last_click = $filter("date")(new Date(), "yyyy-MM-dd HH:mm:ss");
|
||||||
|
|
@ -485,7 +454,7 @@ app.controller('tagsCtr', ['$scope', '$filter', '$state', '$window', '$statePara
|
||||||
var menusScope = $('div[ng-controller="menuCtr"]').scope();
|
var menusScope = $('div[ng-controller="menuCtr"]').scope();
|
||||||
if (menusScope.login && menusScope.selectLoginIndex == 1) {
|
if (menusScope.login && menusScope.selectLoginIndex == 1) {
|
||||||
var find = false;
|
var find = false;
|
||||||
$scope.bookmarkData.bookmarks.forEach((bookmark) => {
|
$scope.bookmarks.forEach((bookmark) => {
|
||||||
if (bookmark.id == data.id) {
|
if (bookmark.id == data.id) {
|
||||||
bookmark.title = data.title;
|
bookmark.title = data.title;
|
||||||
bookmark.url = data.url;
|
bookmark.url = data.url;
|
||||||
|
|
@ -502,7 +471,6 @@ app.controller('tagsCtr', ['$scope', '$filter', '$state', '$window', '$statePara
|
||||||
if (!find) {
|
if (!find) {
|
||||||
if (data.tags.map((tag) => tag.id).indexOf($scope.currentTagId) >= 0) {
|
if (data.tags.map((tag) => tag.id).indexOf($scope.currentTagId) >= 0) {
|
||||||
if (!$scope.editMode) {
|
if (!$scope.editMode) {
|
||||||
forbidTransition = true;
|
|
||||||
$scope.getBookmarks(null, null, null);
|
$scope.getBookmarks(null, null, null);
|
||||||
}
|
}
|
||||||
addBookmarkId = data.id;
|
addBookmarkId = data.id;
|
||||||
|
|
|
||||||
|
|
@ -1,46 +1,30 @@
|
||||||
<div class="ui segment js-segment-advice">
|
<div class="ui segment js-segment-advice">
|
||||||
<div class="ui form">
|
<div class="ui form">
|
||||||
<div class="required field">
|
<div class="required field">
|
||||||
<label>留言分类</label>
|
<label>留言内容</label>
|
||||||
<div class="ui selection dropdown js-categorys">
|
<textarea rows="4" placeholder="" ng-model="comment"></textarea>
|
||||||
<input name="gender" type="hidden" value="0" />
|
</div>
|
||||||
<i class="dropdown icon"></i>
|
<div class="field">
|
||||||
<div class="text">功能</div>
|
<div class="actions">
|
||||||
<div class="menu">
|
<div class="ui green button" ng-click="ok()">提交</div>
|
||||||
<div class="item" data-value="0">功能</div>
|
</div>
|
||||||
<div class="item" data-value="1">BUG</div>
|
</div>
|
||||||
<div class="item" data-value="2">其他</div>
|
</div>
|
||||||
</div>
|
<div class="ui divider"></div>
|
||||||
</div>
|
<div class="ui comments" style="max-width:100%;">
|
||||||
</div>
|
<h3 class="ui header">最新100条留言</h3>
|
||||||
<div class="required field">
|
<div class="comment" ng-repeat="advice in advices">
|
||||||
<label>留言内容</label>
|
<a class="avatar">
|
||||||
<textarea rows="4" placeholder="" ng-model="comment"></textarea>
|
<img ng-if="advice.username == 'lcq'" src="./images/admin.jpg" />
|
||||||
</div>
|
<img ng-if="advice.username != 'lcq'" ng-src="data:image/png;base64,{{advice.imgData}}" />
|
||||||
<div class="field">
|
</a>
|
||||||
<div class="actions">
|
<div class="content">
|
||||||
<div class="ui green button" ng-click="ok()">提交</div>
|
<a class="author">{{ advice.username }}</a>
|
||||||
</div>
|
<div class="metadata">
|
||||||
</div>
|
<span class="date">{{ advice.created_at }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="ui divider"></div>
|
<div class="text">{{ advice.comment }}</div>
|
||||||
<div class="ui comments" style="max-width:100%;">
|
</div>
|
||||||
<h3 class="ui header">最新100条留言</h3>
|
</div>
|
||||||
<div class="comment" ng-repeat="advice in advices">
|
</div>
|
||||||
<a class="avatar">
|
</div>
|
||||||
<img ng-if="advice.username == 'lcq'" src="./images/admin.jpg" />
|
|
||||||
<img ng-if="advice.username != 'lcq'" ng-src="data:image/png;base64,{{advice.imgData}}" />
|
|
||||||
</a>
|
|
||||||
<div class="content">
|
|
||||||
<a class="author">{{ advice.username }}</a>
|
|
||||||
<div class="metadata">
|
|
||||||
<span class="date">{{ advice.created_at }}</span>
|
|
||||||
</div>
|
|
||||||
<div class="metadata">
|
|
||||||
<span class="category">{{ category[advice.category] }}</span>
|
|
||||||
</div>
|
|
||||||
<div class="text">{{ advice.comment }}</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
|
||||||
|
|
@ -50,10 +50,10 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="ui huge text centered inline loader" ng-class="{active:loadBookmarks, disabled: !loadBookmarks}">
|
<div class="ui huge text centered inline loader" ng-class="{active:loading, disabled: !loading}">
|
||||||
正在加载中...
|
正在加载中...
|
||||||
</div>
|
</div>
|
||||||
<table class="ui selectable sortable celled table js-tags-table" ng-if="bookmarkCount > 0 && showMode=='table'" style="margin-top:-15px;" ng-show="!loadBookmarks && !editMode">
|
<table class="ui selectable sortable celled table js-tags-table" ng-if="showMode=='table'" style="margin-top:-15px;" ng-show="!loading && !editMode">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th class="forbid_sorted">标题</th>
|
<th class="forbid_sorted">标题</th>
|
||||||
|
|
@ -103,7 +103,7 @@
|
||||||
</tr>
|
</tr>
|
||||||
</tfoot>
|
</tfoot>
|
||||||
</table>
|
</table>
|
||||||
<div class="ui segment js-tag-costomTag" ng-if="bookmarkCount > 0 && showMode=='item'" style="margin-top:-15px;" ng-show="!loadBookmarks && !editMode">
|
<div class="ui segment js-tag-costomTag" ng-if="showMode=='item'" style="margin-top:-15px;" ng-show="!loading && !editMode">
|
||||||
<div class="ui five column grid">
|
<div class="ui five column grid">
|
||||||
<div ng-repeat="bookmark in bookmarks" class="column js-costomTag-item" ng-class="{bookmarkNormalHover:bookmarkNormalHover, bookmark:(!bookmarkNormalHover)}" ng-mouseover="bookmarkNormalHover=true; setHoverBookmark(bookmark)" ng-mouseleave="bookmarkNormalHover=false; setHoverBookmark(null)" ng-click="jumpToUrl(bookmark.url, bookmark.id)" title="{{ bookmark.title }}" id="{{bookmark.id}}">
|
<div ng-repeat="bookmark in bookmarks" class="column js-costomTag-item" ng-class="{bookmarkNormalHover:bookmarkNormalHover, bookmark:(!bookmarkNormalHover)}" ng-mouseover="bookmarkNormalHover=true; setHoverBookmark(bookmark)" ng-mouseleave="bookmarkNormalHover=false; setHoverBookmark(null)" ng-click="jumpToUrl(bookmark.url, bookmark.id)" title="{{ bookmark.title }}" id="{{bookmark.id}}">
|
||||||
<img class="ui ui middle aligned tiny image bookmarkInfo" ng-src="http://favicon.luchenqun.com/?url={{bookmark.url}}" err-src="./images/default.ico" style="width:16px;height:16px;" ng-click="detailBookmark(bookmark);$event.stopPropagation()" />
|
<img class="ui ui middle aligned tiny image bookmarkInfo" ng-src="http://favicon.luchenqun.com/?url={{bookmark.url}}" err-src="./images/default.ico" style="width:16px;height:16px;" ng-click="detailBookmark(bookmark);$event.stopPropagation()" />
|
||||||
|
|
@ -129,7 +129,7 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="eleven wide column">
|
<div class="eleven wide column">
|
||||||
<pagination ng-show="!costomTag.bookmarkClicked && !costomAllUsersTag.bookmarkClicked"></pagination>
|
<pagination></pagination>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue