ユーザーDB周りの対応
authorOHASHI, Norikazu <katz@neko-mori.sakura.ne.jp>
Sat, 16 Mar 2019 05:40:41 +0000 (14:40 +0900)
committerOHASHI, Norikazu <katz@neko-mori.sakura.ne.jp>
Sat, 16 Mar 2019 05:40:41 +0000 (14:40 +0900)
.markdown-preview.html [new file with mode: 0644]
readme.md
sinatra/app/controllers/web_gui.rb
sinatra/app/models/database.yml [new file with mode: 0644]
sinatra/app/models/users_db.rb [new file with mode: 0644]
sinatra/app/views/layout.haml [new file with mode: 0644]

diff --git a/.markdown-preview.html b/.markdown-preview.html
new file mode 100644 (file)
index 0000000..f0fc0f0
--- /dev/null
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1, minimal-ui">
+    <title>Markdown preview</title>
+    <link rel="stylesheet" type="text/css" href="http://thomasf.github.io/solarized-css/solarized-dark.min.css">
+    <script src="http://code.jquery.com/jquery-1.12.4.min.js"></script>
+    
+    <script>
+     (function($, undefined) {
+         var socket = new WebSocket("ws://localhost:7379");
+         socket.onopen = function() {
+             console.log("Connection established.");
+            socket.send("MDPM-Register-UUID: 3cb46385-5b3d-454f-be06-14c04b2d5607");
+         };
+         socket.onclose = function(event) {
+             if (event.wasClean) {
+                 console.log('Connection closed gracefully.');
+             } else {
+                 console.log('Connection terminated.');
+             }
+             console.log('Code: ' + event.code + ' reason: ' + event.reason);
+         };
+         socket.onmessage = function(event) {
+             $("#markdown-body").html($(event.data).find("#content").html()).trigger('mdContentChange');
+             var scroll = $(document).height() * ($(event.data).find("#position-percentage").html() / 100);
+             $("html, body").animate({ scrollTop: scroll }, 600);
+         };
+         socket.onerror = function(error) {
+             console.log("Error: " + error.message);
+         };
+     })(jQuery);
+    </script>
+  </head>
+  <body>
+    <article id="markdown-body" class="markdown-body">
+      <p>Markdown preview</p>
+    </article>
+  </body>
+</html>
index 0cca57b..d28c8e5 100644 (file)
--- a/readme.md
+++ b/readme.md
@@ -1,5 +1,9 @@
 # 蔵書管理サーバ(book_server)
 
+## 実装機能
+ * ユーザ登録
+ * ISDNによる書籍検索
 ## ファイル構成
 
 ``` text
@@ -28,8 +32,7 @@
         list.erb           # list of books view
         search.erb         # search books view
         detail.erb         # detail of book parameter view
-        find_isbn.erb      # search books parameter with
-                             isbn view
+        find_isbn.erb      # search books parameter with isbn view
         setup.erb          # setup book parameter view
 ```
 
index ce8bc08..c7dbdad 100644 (file)
@@ -1,37 +1,78 @@
 # coding: utf-8
 require 'sinatra/base'
+require 'sinatra'
+require 'sinatra/cookies'
+require 'haml'
+require 'sass'
+require 'digest/sha1'
+
+# ユーザアクセス用モデル
+require '../models/users_db'
 
 class WebGui < Sinatra::Base
   set :root, File.join(File.dirname(__FILE__), '..')
-  set :views, Proc.new {File.join(root, "view")}
+  set :views, Proc.new {File.join(root, "views")}
 
-  #main page 
+  before do
+    set :haml, :format => :html5
+  end
+  
+  # main page 
   get '/' do
-    erb :main
+    haml :main
   end
 
-  #signup page
+  # signup page
   get '/signup' do
-    erb :signup
+    @salt = Digest::SHA1.hexdigest("#{DateTime.now.to_s}")
+    haml :signup
   end
 
+  # signup 
   post '/signup' do
-    # ユーザ登録処理呼び出し
-    erb :user_home
+    name = params[:name]
+    full_name = params[:full_name]
+    email = params[:email]
+    passwd_hash = params[:passwd_hash]
+    passwd_salt = params[:salt]
+
+    id = UserAccount.createAccount(name, full_name, email, passwd_hash, passwd_salt)
+    
+    redirect "/user_home/#{id}"
   end
 
   get '/login' do
-    erb :login
+    haml :login
   end
 
   post '/login' do
-    # パスワード認証呼び出し
-    erb :user_home
+    user_name = params[:name]
+    id, salt = UserAccount.gelSalt(user_name);
+    @id = id
+    @salt = salt
+    halm :check_passwd
+  end
+
+  post '/check_passwd/:id' do
+    id = params[:id]
+    passwd_hash = params[:passwd_hash]
+    id = UserAccount.checkPasswd(id, passwd_hash);
+
+    redirect "/user_home/#{id}"
+  end
+
+  get '/user_home/:id' do
+    id = params[:id]
+    user = UserAccount.getUser(id)
+    @id = id
+    @username = user.user_name
+    haml :user_home
   end
 
   get '/logout' do
     # 最終ログイン情報登録
-    erb :logout
-end
+    haml :logout
+  end
 
+end
 
diff --git a/sinatra/app/models/database.yml b/sinatra/app/models/database.yml
new file mode 100644 (file)
index 0000000..5373a94
--- /dev/null
@@ -0,0 +1,8 @@
+development:
+  adapter: mysql2
+  database: 
+  host: 
+  username: 
+  password: 
+  encoding: utf8
+
diff --git a/sinatra/app/models/users_db.rb b/sinatra/app/models/users_db.rb
new file mode 100644 (file)
index 0000000..46b32f0
--- /dev/null
@@ -0,0 +1,83 @@
+# coding: utf-8
+
+require 'active_record'
+require 'mysql2'
+
+# DB設定ファイルの読み込み
+ActiveRecord::Base.cofigurations = YAML.load_file('database.yml')
+ActiveRecord::Base.establish_connection(:development)
+
+class Users < ActiveRecord::Base
+end
+
+
+class UserAccount
+
+  # 認証エラー
+  class AuthenticationError < SecurityError
+  end
+
+  # すでに存在している
+  class AlreadyInstanceError < StandardError
+  end
+
+  # 存在していない
+  class NotfondInstanceError < StandardError
+  end
+
+  # DBアクセス失敗
+  class DbAccessError < StandardError
+  end
+
+  role[:admin] = 1
+  role[:normal] = 8
+  # ユーザアカウントを作成
+  def self.createAccount(name, full_name, email, passwd_hash, passwd_salt)
+    user = Users.new
+    if (User.find_by(:user_name, name) != nil)
+      raise AlreadyInstanceError
+    end
+    user.user_name = name
+    user.full_name = full_name
+    user.email = email
+    user.passwd_hash = passwd_hash
+    user.passwd_salt = passwd_salt
+    user.role = role[:normal]
+    user.create_at = DateTime.now
+    user.update_at = DateTime.now
+    user.save
+    return user.id
+  end
+
+  # パスワード用SALTを取得する
+  def self.getSalt(name)
+    user = Users.find_by(:user_name, name)
+    if (user == nil)
+      raise NotfondInstanceError
+    end
+         
+    return user.user_id, user.passwd_salt
+  end
+
+  #パスワードハッシュをチェックする
+  def self.checkPasswd(id, passwd_hash)
+    user = Users.find_by(:user_id, id)
+    if (user == nil)
+      raise NotfondInstanceError
+    end
+    
+    if (user.passwd_hash != passwd_hash)
+      raise AuthenticationError
+    end
+
+    return id
+  end
+  def self.getUser(id)
+    user = Users.find_by(:user_id, id)
+    if (user == nil)
+      raise NotfondInstanceError
+    end
+    return user
+  end
+
+end
diff --git a/sinatra/app/views/layout.haml b/sinatra/app/views/layout.haml
new file mode 100644 (file)
index 0000000..60ee733
--- /dev/null
@@ -0,0 +1,39 @@
+- # encoding: utf-8
+- if @username != nil
+  - title_name = @username+"書籍"
+  - id = @id
+  - user_name = @username
+- else
+  - title_name = "書籍一覧管理"
+!!!
+%html
+  %head{ :lang => 'ja' }
+    %meta{ :charset => 'utf-8'}
+    %title= #{title_name}
+    %link{ :rel => 'stylesheet', :href => '/style.css'}
+  %body
+      
+    - if @username != nil
+      #title= yield
+    - else
+      #head
+        @username 書籍一覧
+      #center
+        #sidebar
+          %a{ :href => '/user_home/#{id}' }
+            ホーム
+          %a{ :href => '/book_list/#{id}'}
+            書籍一覧
+          %a{ :href => '/user_info/#{id}'}
+            ユーザ情報
+        #main= yield
+      #foot
+        
+          
+          
+
+
+
+  
+
+