diff --git a/src/config/adapter.js b/src/config/adapter.js
index c0406e0..b007c52 100644
--- a/src/config/adapter.js
+++ b/src/config/adapter.js
@@ -41,7 +41,7 @@ exports.model = {
encoding: 'utf8',
host: '127.0.0.1',
port: '3306',
- user: 'root',
+ user: 'test',
password: '123456',
dateStrings: true
}
diff --git a/src/controller/api.js b/src/controller/api.js
index d87e8f9..663bb17 100644
--- a/src/controller/api.js
+++ b/src/controller/api.js
@@ -1,20 +1,59 @@
const Base = require('./base.js');
+const crypto = require('crypto');
+
+function md5(str) {
+ return crypto.createHash('md5').update(str).digest('hex');
+};
module.exports = class extends Base {
+ async __before() {
+ const user = await this.session('user');
+ console.log("session user", user);
+
+ //获取用户的 session 信息,如果为空,返回 false 阻止后续的行为继续执行
+ // if (think.isEmpty(user)) {
+ // return false;
+ // }
+ }
+
indexAction() {
return this.display();
}
async registerAction() {
try {
- let data = this.post();
- let res = await this.model("users").add(data);
+ let post = this.post();
+ post.password = md5(post.password); // 进行密码加密
+
+ let res = await this.model("users").add(post);
this.json({ code: 0, data: res, msg: "注册成功" });
} catch (error) {
this.json({ code: 1, data: '', msg: error.toString() });
}
}
+ async loginAction() {
+ try {
+ let post = this.post();
+ post.password = md5(post.password); // 进行密码加密
+
+ let data = await this.model('users').where({ username: post.username, password: post.password }).find();
+ if (think.isEmpty(data)) {
+ this.json({ code: 2, msg: "账号或者密码错误" });
+ } else {
+ this.json({ code: 0, data, msg: "登陆成功" });
+ data.password = "******";
+ await this.session('user', data); // @todo 对session的maxAge进行操作(目前默认永久不过期)
+ }
+ } catch (error) {
+ this.json({ code: 1, data: '', msg: error.toString() });
+ }
+ }
+
+ async userInfoAction() {
+ this.json({ code: 1, data: '', msg: '' });
+ }
+
autoLoginAction() {
this.json({ "succ": true });
}
diff --git a/view/index_index.html b/view/index_index.html
index 97dafc9..9815527 100644
--- a/view/index_index.html
+++ b/view/index_index.html
@@ -68,6 +68,7 @@
+
diff --git a/www/scripts/app-angular.js b/www/scripts/app-angular.js
index 5ec29b1..79c201d 100644
--- a/www/scripts/app-angular.js
+++ b/www/scripts/app-angular.js
@@ -1,5 +1,23 @@
var app = angular.module('bookmarkApp', ['ui.router', 'ngCookies', 'infinite-scroll', 'angular-sortable-view', 'ngDialog']);
+axios.defaults.baseURL = '/api/';
+// 添加响应拦截器
+axios.interceptors.response.use(function (response) {
+ let data = response.data;
+ if (data.code === 0) {
+ if (data.msg) {
+ toastr.success(data.msg, "提示");
+ }
+ return Promise.resolve(data.data);
+ } else {
+ toastr.error(`错误信息:${data.msg}(错误码:${data.code})`, '请求错误');
+ return Promise.reject(data);
+ }
+}, function (error) {
+ toastr.error(`错误信息:${error.toString()}`, '网络错误');
+ return Promise.reject(error);
+});
+
app.config(function ($stateProvider, $urlRouterProvider, $httpProvider) {
$urlRouterProvider.otherwise("/");
diff --git a/www/scripts/controllers/login-controller.js b/www/scripts/controllers/login-controller.js
index 529ae7e..d4ce405 100644
--- a/www/scripts/controllers/login-controller.js
+++ b/www/scripts/controllers/login-controller.js
@@ -1,4 +1,4 @@
-app.controller('loginCtr', ['$scope', '$filter', '$state', '$cookieStore', '$window', 'bookmarkService', 'pubSubService', 'dataService', function ($scope, $filter, $state, $cookieStore, $window, bookmarkService, pubSubService, dataService) {
+app.controller('loginCtr', ['$scope', '$filter', '$state', '$http', '$cookieStore', '$window', 'bookmarkService', 'pubSubService', 'dataService', function ($scope, $filter, $state, $http, $cookieStore, $window, bookmarkService, pubSubService, dataService) {
console.log("Hello loginCtr...", $cookieStore.get("username"));
if (dataService.smallDevice()) {
$window.location = "http://m.mybookmark.cn/#/tags";
@@ -20,51 +20,38 @@ app.controller('loginCtr', ['$scope', '$filter', '$state', '$cookieStore', '$win
$scope.passwordRegister1 = "";
$scope.passwordRegister2 = "";
- $scope.login = function () {
+ $scope.login = async function () {
var autoLogin = $('.ui.checkbox.js-auto-login').checkbox('is checked');
if (!$scope.username || !$scope.password) {
$scope.showErr = true;
$scope.errInfo = '用户名或者密码不能为空!';
- } else {
- $scope.showErr = false;
- $scope.errInfo = '';
- console.log($scope.username, $scope.password, autoLogin);
- var params = {
- username: $scope.username,
- password: $scope.password,
- autoLogin: autoLogin,
- };
- $cookieStore.put("username", $scope.username);
- bookmarkService.login(params)
- .then((data) => {
- console.log(data);
- if (data.logined) {
- pubSubService.publish('loginCtr.login', {
- 'login': data.logined,
- });
- $state.go('bookmarks', {})
- } else {
- console.log('login failed......................')
- toastr.error('账号或者密码错误', "错误");
- }
- })
- .catch((err) => console.log('login err', err));
+ return;
}
+
+ $scope.showErr = false;
+ $scope.errInfo = '';
+ console.log($scope.username, $scope.password, autoLogin);
+ var params = {
+ username: $scope.username,
+ password: $scope.password,
+ maxAge: 7 * 24 * 3600,
+ };
+ $cookieStore.put("username", $scope.username);
+
+ await axios.post('login', params);
+ pubSubService.publish('loginCtr.login', { login: true });
+ $state.go('bookmarks', {})
}
- $scope.showRegister = function () {
- $('.ui.modal.js-register').modal({
- closable: false,
- }).modal('setting', 'transition', dataService.animation()).modal('show');
-
+ $scope.showRegister = async function () {
+ $('.ui.modal.js-register').modal({ closable: false }).modal('setting', 'transition', dataService.animation()).modal('show');
$scope.emailRegister = "";
$scope.usernameRegister = "";
$scope.passwordRegister1 = "";
$scope.passwordRegister2 = "";
-
}
- $scope.register = function () {
+ $scope.register = async function () {
if (!$scope.emailRegister || !$scope.usernameRegister || !$scope.passwordRegister1 || !$scope.passwordRegister2) {
toastr.error('有必填项为空', "错误");
return;
@@ -89,22 +76,11 @@ app.controller('loginCtr', ['$scope', '$filter', '$state', '$cookieStore', '$win
email: $scope.emailRegister,
password: $scope.passwordRegister1,
};
+ await axios.post('register', user);
- bookmarkService.register(user)
- .then((data) => {
- if (data.retCode == 0) {
- toastr.success('注册成功', "提示");
- $('.ui.modal.js-register').modal('hide');
- $scope.username = $scope.usernameRegister;
- $scope.password = "";
- } else {
- toastr.error('注册失败,您的账号或者邮箱可能已经存在了。错误信息:' + data.msg, "错误");
- }
- })
- .catch((err) => {
- console.log('register err', err);
- toastr.error('注册失败:' + JSON.stringify(err), "错误");
- });
+ $('.ui.modal.js-register').modal('hide');
+ $scope.username = $scope.usernameRegister;
+ $scope.password = "";
}
var className = 'js-form-login';
diff --git a/www/scripts/externe/axios.min.js b/www/scripts/externe/axios.min.js
new file mode 100644
index 0000000..b87c0e3
--- /dev/null
+++ b/www/scripts/externe/axios.min.js
@@ -0,0 +1,3 @@
+/* axios v0.19.2 | (c) 2020 by Matt Zabriskie */
+!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.axios=t():e.axios=t()}(this,function(){return function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={exports:{},id:r,loaded:!1};return e[r].call(o.exports,o,o.exports,t),o.loaded=!0,o.exports}var n={};return t.m=e,t.c=n,t.p="",t(0)}([function(e,t,n){e.exports=n(1)},function(e,t,n){"use strict";function r(e){var t=new s(e),n=i(s.prototype.request,t);return o.extend(n,s.prototype,t),o.extend(n,t),n}var o=n(2),i=n(3),s=n(4),a=n(22),u=n(10),c=r(u);c.Axios=s,c.create=function(e){return r(a(c.defaults,e))},c.Cancel=n(23),c.CancelToken=n(24),c.isCancel=n(9),c.all=function(e){return Promise.all(e)},c.spread=n(25),e.exports=c,e.exports.default=c},function(e,t,n){"use strict";function r(e){return"[object Array]"===j.call(e)}function o(e){return"undefined"==typeof e}function i(e){return null!==e&&!o(e)&&null!==e.constructor&&!o(e.constructor)&&"function"==typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)}function s(e){return"[object ArrayBuffer]"===j.call(e)}function a(e){return"undefined"!=typeof FormData&&e instanceof FormData}function u(e){var t;return t="undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&e.buffer instanceof ArrayBuffer}function c(e){return"string"==typeof e}function f(e){return"number"==typeof e}function p(e){return null!==e&&"object"==typeof e}function d(e){return"[object Date]"===j.call(e)}function l(e){return"[object File]"===j.call(e)}function h(e){return"[object Blob]"===j.call(e)}function m(e){return"[object Function]"===j.call(e)}function y(e){return p(e)&&m(e.pipe)}function g(e){return"undefined"!=typeof URLSearchParams&&e instanceof URLSearchParams}function v(e){return e.replace(/^\s*/,"").replace(/\s*$/,"")}function x(){return("undefined"==typeof navigator||"ReactNative"!==navigator.product&&"NativeScript"!==navigator.product&&"NS"!==navigator.product)&&("undefined"!=typeof window&&"undefined"!=typeof document)}function w(e,t){if(null!==e&&"undefined"!=typeof e)if("object"!=typeof e&&(e=[e]),r(e))for(var n=0,o=e.length;n=200&&e<300}};u.headers={common:{Accept:"application/json, text/plain, */*"}},i.forEach(["delete","get","head"],function(e){u.headers[e]={}}),i.forEach(["post","put","patch"],function(e){u.headers[e]=i.merge(a)}),e.exports=u},function(e,t,n){"use strict";var r=n(2);e.exports=function(e,t){r.forEach(e,function(n,r){r!==t&&r.toUpperCase()===t.toUpperCase()&&(e[t]=n,delete e[r])})}},function(e,t,n){"use strict";var r=n(2),o=n(13),i=n(5),s=n(16),a=n(19),u=n(20),c=n(14);e.exports=function(e){return new Promise(function(t,f){var p=e.data,d=e.headers;r.isFormData(p)&&delete d["Content-Type"];var l=new XMLHttpRequest;if(e.auth){var h=e.auth.username||"",m=e.auth.password||"";d.Authorization="Basic "+btoa(h+":"+m)}var y=s(e.baseURL,e.url);if(l.open(e.method.toUpperCase(),i(y,e.params,e.paramsSerializer),!0),l.timeout=e.timeout,l.onreadystatechange=function(){if(l&&4===l.readyState&&(0!==l.status||l.responseURL&&0===l.responseURL.indexOf("file:"))){var n="getAllResponseHeaders"in l?a(l.getAllResponseHeaders()):null,r=e.responseType&&"text"!==e.responseType?l.response:l.responseText,i={data:r,status:l.status,statusText:l.statusText,headers:n,config:e,request:l};o(t,f,i),l=null}},l.onabort=function(){l&&(f(c("Request aborted",e,"ECONNABORTED",l)),l=null)},l.onerror=function(){f(c("Network Error",e,null,l)),l=null},l.ontimeout=function(){var t="timeout of "+e.timeout+"ms exceeded";e.timeoutErrorMessage&&(t=e.timeoutErrorMessage),f(c(t,e,"ECONNABORTED",l)),l=null},r.isStandardBrowserEnv()){var g=n(21),v=(e.withCredentials||u(y))&&e.xsrfCookieName?g.read(e.xsrfCookieName):void 0;v&&(d[e.xsrfHeaderName]=v)}if("setRequestHeader"in l&&r.forEach(d,function(e,t){"undefined"==typeof p&&"content-type"===t.toLowerCase()?delete d[t]:l.setRequestHeader(t,e)}),r.isUndefined(e.withCredentials)||(l.withCredentials=!!e.withCredentials),e.responseType)try{l.responseType=e.responseType}catch(t){if("json"!==e.responseType)throw t}"function"==typeof e.onDownloadProgress&&l.addEventListener("progress",e.onDownloadProgress),"function"==typeof e.onUploadProgress&&l.upload&&l.upload.addEventListener("progress",e.onUploadProgress),e.cancelToken&&e.cancelToken.promise.then(function(e){l&&(l.abort(),f(e),l=null)}),void 0===p&&(p=null),l.send(p)})}},function(e,t,n){"use strict";var r=n(14);e.exports=function(e,t,n){var o=n.config.validateStatus;!o||o(n.status)?e(n):t(r("Request failed with status code "+n.status,n.config,null,n.request,n))}},function(e,t,n){"use strict";var r=n(15);e.exports=function(e,t,n,o,i){var s=new Error(e);return r(s,t,n,o,i)}},function(e,t){"use strict";e.exports=function(e,t,n,r,o){return e.config=t,n&&(e.code=n),e.request=r,e.response=o,e.isAxiosError=!0,e.toJSON=function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:this.config,code:this.code}},e}},function(e,t,n){"use strict";var r=n(17),o=n(18);e.exports=function(e,t){return e&&!r(t)?o(e,t):t}},function(e,t){"use strict";e.exports=function(e){return/^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(e)}},function(e,t){"use strict";e.exports=function(e,t){return t?e.replace(/\/+$/,"")+"/"+t.replace(/^\/+/,""):e}},function(e,t,n){"use strict";var r=n(2),o=["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"];e.exports=function(e){var t,n,i,s={};return e?(r.forEach(e.split("\n"),function(e){if(i=e.indexOf(":"),t=r.trim(e.substr(0,i)).toLowerCase(),n=r.trim(e.substr(i+1)),t){if(s[t]&&o.indexOf(t)>=0)return;"set-cookie"===t?s[t]=(s[t]?s[t]:[]).concat([n]):s[t]=s[t]?s[t]+", "+n:n}}),s):s}},function(e,t,n){"use strict";var r=n(2);e.exports=r.isStandardBrowserEnv()?function(){function e(e){var t=e;return n&&(o.setAttribute("href",t),t=o.href),o.setAttribute("href",t),{href:o.href,protocol:o.protocol?o.protocol.replace(/:$/,""):"",host:o.host,search:o.search?o.search.replace(/^\?/,""):"",hash:o.hash?o.hash.replace(/^#/,""):"",hostname:o.hostname,port:o.port,pathname:"/"===o.pathname.charAt(0)?o.pathname:"/"+o.pathname}}var t,n=/(msie|trident)/i.test(navigator.userAgent),o=document.createElement("a");return t=e(window.location.href),function(n){var o=r.isString(n)?e(n):n;return o.protocol===t.protocol&&o.host===t.host}}():function(){return function(){return!0}}()},function(e,t,n){"use strict";var r=n(2);e.exports=r.isStandardBrowserEnv()?function(){return{write:function(e,t,n,o,i,s){var a=[];a.push(e+"="+encodeURIComponent(t)),r.isNumber(n)&&a.push("expires="+new Date(n).toGMTString()),r.isString(o)&&a.push("path="+o),r.isString(i)&&a.push("domain="+i),s===!0&&a.push("secure"),document.cookie=a.join("; ")},read:function(e){var t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove:function(e){this.write(e,"",Date.now()-864e5)}}}():function(){return{write:function(){},read:function(){return null},remove:function(){}}}()},function(e,t,n){"use strict";var r=n(2);e.exports=function(e,t){t=t||{};var n={},o=["url","method","params","data"],i=["headers","auth","proxy"],s=["baseURL","url","transformRequest","transformResponse","paramsSerializer","timeout","withCredentials","adapter","responseType","xsrfCookieName","xsrfHeaderName","onUploadProgress","onDownloadProgress","maxContentLength","validateStatus","maxRedirects","httpAgent","httpsAgent","cancelToken","socketPath"];r.forEach(o,function(e){"undefined"!=typeof t[e]&&(n[e]=t[e])}),r.forEach(i,function(o){r.isObject(t[o])?n[o]=r.deepMerge(e[o],t[o]):"undefined"!=typeof t[o]?n[o]=t[o]:r.isObject(e[o])?n[o]=r.deepMerge(e[o]):"undefined"!=typeof e[o]&&(n[o]=e[o])}),r.forEach(s,function(r){"undefined"!=typeof t[r]?n[r]=t[r]:"undefined"!=typeof e[r]&&(n[r]=e[r])});var a=o.concat(i).concat(s),u=Object.keys(t).filter(function(e){return a.indexOf(e)===-1});return r.forEach(u,function(r){"undefined"!=typeof t[r]?n[r]=t[r]:"undefined"!=typeof e[r]&&(n[r]=e[r])}),n}},function(e,t){"use strict";function n(e){this.message=e}n.prototype.toString=function(){return"Cancel"+(this.message?": "+this.message:"")},n.prototype.__CANCEL__=!0,e.exports=n},function(e,t,n){"use strict";function r(e){if("function"!=typeof e)throw new TypeError("executor must be a function.");var t;this.promise=new Promise(function(e){t=e});var n=this;e(function(e){n.reason||(n.reason=new o(e),t(n.reason))})}var o=n(23);r.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},r.source=function(){var e,t=new r(function(t){e=t});return{token:t,cancel:e}},e.exports=r},function(e,t){"use strict";e.exports=function(e){return function(t){return e.apply(null,t)}}}])});
+//# sourceMappingURL=axios.min.map
\ No newline at end of file