Ich bin neu zu Meanjs, aber ich versuche derzeit, eine einfache App zu erstellen, wo Benutzer miteinander verbinden können.Wie repliziere ich das Admin-Dashboard in Meanjs, um ein Benutzerverzeichnis zu erstellen
Im Moment möchte ich nur eine Funktion implementieren, wo Benutzer einander durch Suche und nichts anderes suchen können, aber ich laufe in einen 403 Fehler. Ich habe versucht, es zu beheben, indem ich die Dokumente repliziere, die die Ansicht "Benutzer verwalten" bilden.
Ich wollte nicht jedem die 'admin' Rolle geben, also habe ich eine neue Richtlinie für Benutzer hinzugefügt, wo sie nur 'get' Berechtigungen bekommen. Ich habe auch eine neue Route, View und Controller für reguläre Benutzer hinzugefügt, die von den Admin-Dateien geändert wurde.
Es hat sehr gut funktioniert, aber ich kann immer noch nicht das System Zugriff auf die neue Benutzerverzeichnis-Sicht zu ermöglichen, wenn in einer Nicht-Administrator-Rolle angemeldet. Ich denke, dass es etwas mit der Datei auth.interceptor.client.service.js und der Datei modules/core/client/app/init.js zu tun hat und dass der $ -Zustand von den neuen Dateien bereitgestellt wird, die ich erstellt habe, aber ich habe versucht ändere sie und es ist immer noch die/verbotene Ansicht im Körper meiner App.
Ich bin ratlos, was ich sonst noch tun kann. Jede Hilfe würde sehr geschätzt werden.
Die App startet mit home.client.view.html Ansicht:
<section ng-controller="HomeController">
</div>
<div class="jumbotron text-center" ng-hide="authentication.user">
<div class="row">
<div class="col-md-6 col-md-offset-3 col-sm-6 col-sm-offset-3 col-xs-12">
<img alt="MEAN.JS" class="img-responsive text-center" src="modules/core/client/img/brand/Logo.png" />
</div>
</div>
<br>
<div class="row">
<p class="lead">
An app
</p>
</div>
<div class="row">
<p>
<!-- <a class="btn btn-primary btn-lg" href="http://meanjs.org" target="_blank">Learn more</a> -->
</p>
</div>
</div>
<div ng-if="authentication.user">
<h2>Congratulations! You are logged in.</h2>
<div ng-include="'/modules/users/client/views/user/user-directory.client.view.html'"></div>
<!-- <div ng-include="'/api/users'"></div> -->
</div>
</section>
hier meiner Meinung nach für die userdirectory ist (modifiziert nach modules/Benutzer/Client/Ansichten/admin/list-users.client.view.html):
<section ng-controller="UserDirectoryController">
<div class="page-header">
<div class="row">
<div class="col-md-4">
<h1>Users</h1>
</div>
<div class="col-md-4" style="margin-top: 2em">
<input class="form-control col-md-4" type="text" ng-model="search" placeholder="Search" ng-change="figureOutItemsToDisplay()" />
</div>
</div>
</div>
<div class="list-group">
<a ng-repeat="user in pagedSearchItems" ui-sref="users.user({userId: user._id})" class="list-group-item">
<h4 class="list-group-item-heading" ng-bind="user.username"></h4>
<p class="list-group-item-text" ng-bind="user.email"></p>
</a>
</div>
<pagination boundary-links="true" max-size="8" items-per-page="itemsPerPage" total-items="filterLength" ng-model="currentPage" ng-change="pageChanged()"></pagination>
</section>
Mein Controller (modifiziert nach modules/Benutzer/Client/controllers/admin/list-users.client.controller.js):
'use strict';
angular.module('users.user').controller('UserDirectoryController', ['$scope', '$filter', 'User',
function ($scope, $filter, User) {
User.query(function (data) {
$scope.users = data;
$scope.buildPager();
});
$scope.buildPager = function() {
$scope.pagedSearchItems = [];
$scope.itemsPerPage = 15;
$scope.currentPage = 1;
$scope.figureOutItemsToDisplay();
};
$scope.figureOutItemsToDisplay = function() {
$scope.filteredItems = $filter('filter')($scope.users, {
$: $scope.search
});
$scope.filterLength = $scope.filteredItems.length;
var begin = (($scope.currentPage - 1) * $scope.itemsPerPage);
var end = begin + $scope.itemsPerPage;
$scope.pagedSearchItems = $scope.filteredItems.slice(begin, end);
};
$scope.pageChanged = function() {
$scope.figureOutItemsToDisplay();
};
}
]);
Mein Service (modifiziert nach modules/Benutzer /client/services/users.client.service.js):
'use strict';
// Users service used for communicating with the users REST endpoint
angular.module('users').factory('User', ['$resource',
function ($resource) {
return $resource('api/userDirectory', {}, {
update: {
method: 'PUT'
}
});
}
]);
//TODO this should be Users service
angular.module('users.user').factory('User', ['$resource',
function ($resource) {
return $resource('api/userDirectory/:userId', {
userId: '@_id'
}, {
update: {
method: 'PUT'
}
});
}
]);
angular.module('users.user').factory('User', ['$resource',
function ($resource) {
return $resource('api/userDirectory/:userId', {
userId: '@_id'
}, {
update: {
method: 'PUT'
}
});
}
]);
Mein neues route.js (modifiziert nach modules/Benutzer/Server/Routen/admin.server.routes.js):
'use strict';
/**
* Module dependencies.
*/
var userPolicy = require('../policies/userDirectory.server.policy'),
userDirectory = require('../controllers/userDirectory.server.controller');
module.exports = function (app) {
// User route registration first. Ref: #713
require('./users.server.routes.js')(app);
// Users collection routes
app.route('/api/userDirectory')
.get(userPolicy.isAllowed, userDirectory.list);
//Single user routes
app.route('/api/userDirectory/:userId')
.get(userPolicy.isAllowed, userDirectory.read);
// Finish by binding the user middleware
app.param('userId', userDirectory.userByID);
};
Und schließlich meine neue Politik für userdirectory (modifizierte von modules/Benutzer/Server/Politik/admin.server.policy.js):
'use strict';
/**
* Module dependencies.
*/
var acl = require('acl');
// Using the memory backend
acl = new acl(new acl.memoryBackend());
/**
* Invoke User Permissions
*/
exports.invokeRolesPolicies = function() {
acl.allow([{
roles: ['user'],
allows: [{
resources: '/api/userDirectory',
permissions: ['post', 'get']
}, {
resources: '/api/userDirectory/:userId',
permissions: ['post', 'get']
}]
}]);
};
/**
* Check If User Policy Allows
*/
exports.isAllowed = function (req, res, next) {
var roles = (req.user) ? req.user.roles : ['guest'];
// Check for user roles
acl.areAnyRolesAllowed(roles, req.route.path, req.method.toLowerCase(), function (err, isAllowed) {
if (err) {
// An authorization error occurred.
return res.status(500).send('Unexpected authorization error');
} else {
if (isAllowed) {
// Access granted! Invoke next middleware
return next();
} else {
return res.status(403).json({
message: 'User is not authorized'
});
}
}
});
};
Vielen Dank für die Antwort Luke. Ich habe gerade meine Frage bearbeitet und meinen Code hinzugefügt. Ich habe das Gefühl, dass ich alles abgedeckt habe, was Sie angesprochen haben, aber meine Benutzer-Verzeichnisansicht geht immer wieder auf die falsche Route zurück. Es geht immer wieder auf die Route 'API/Benutzer' anstatt auf meine neue Route 'api/userDirectory'. Ich denke, es hat mit angularJS Code in der Ansicht zu tun. Aber ich kann mich irren. Wenn Sie die Gelegenheit haben, können Sie über meinen Code schauen und mir sagen, warum Sie denken, dass es nicht funktioniert oder zumindest wo meine Logik fehlt. Nochmals vielen Dank für Ihre Antwort! –
@AaronPennington Ich schaute auf Ihren Code, haben Sie Ihre Sicht und Controller auf die Client-Seite Routen hinzugefügt? In /modules/ihrModule/client/config/yourModule.client.routes.js? Ich werde meine Antwort bearbeiten, um den Code hinzuzufügen. –
Ich glaube, das Problem lag in der Datei client.routes.js. Ich hatte einen Tippfehler im Controller-Namen, behoben und jetzt funktioniert die App gut. Vielen Dank für deine Hilfe! –