joho2_like

情報システムを作ってみよう

改造のヒント:「いいね」を作る.

サーバ側のadd_chat2, read_chat2,クライアント側 Main2を改造して,書き込みに対して「いいね」ができるようにしてみましょう.

データファイルの仕様

  • user/like.txt に,「いいね」された書き込みを記録します.
    • それぞれの行には「チャットのファイル(user/chat2.txtなど)の何行目がいいねされたか(先頭は0行目)」を記録します.

例:

  • user/chat2.txtがこうなっているとすると,先頭の山田さんの書き込みが0行目,田中さんの書き込みが1行目...となります.
    山田	こんにちは
    田中	こんばんは
    長	ちゃんと書き込めるかな?
  • user/like.txtがこうなっているとすると,0行目,1行目,0行目の順に「いいね」がされたことになり,結果として0行目の書き込みが2いいね,1行目の書き込みが1いいね,となります.
    0
    1
    0

サーバ側

「いいね」の追加(add_like)

行数をあらわす数値を入力し,user/like.txtに追記します.
add_like(Python)

index=input()
f=open("user/like.txt","a")
f.write(index+"\n")
f.close()
print("Like added to",index)

「いいね」の読み出し(read_like)

user/like.txtの内容を表示します.
read_like(Python)

f=open("user/like.txt","r")
for i in f:
    print(i,end="")
f.close()

これらのプログラムは,既存のadd_chat, read_chatと似ているので,演習問題にしてもいいかもしれません.

クライアント(ブラウザ)側

  • Main2をコピーして新しいファイルを作ります.ここではMain_Likeとします.

準備:書き込みの表示を関数にする(Main_Like)

Main2では,read関数の中で名前や内容の表示を行っていますが,今から処理が増えるため,showPostという新しい関数を作ってreadから呼び出します.
Main2(JavaScript)

//ここまでのプログラムは省略 
function read() {
   var r=callServer(readUrl);
   var lines=r.split("\n");
   setText("hist","");
   var i=0;//追加
   for (var line of lines) {
       var data=line.split("\t");
       if (data.length<2) continue;
       var name=data[0];
       var content=data[1];
       showPost(i,name,content);//変更
       i+=1;//追加
   }
}
//追加↓
function showPost(i, name, content) {
   addText("hist",i+"番目の書き込み<br/>");  
   addText("hist","名前: "+name+"<br/>");  
   addText("hist","内容: "+content+"<br/>");  
   addText("hist","<hr/>\n");
}

「いいね」の取得(Main_Like)

Main_Like(JavaScript)

serverTop="https://run.eplang.jp/bitarrow/fs/pub/5d9fc1ce/";
readUrl=serverTop+"read_chat2.html"; 
addUrl=serverTop+"add_chat2.html";
readLikeUrl=serverTop+"read_like.html";  //追加:「いいね」取得プログラムのURL
onClick("write",write);
var likes={};//追加:「いいね」を格納するオブジェクト.
//likesにはキーに行番号,値にいいね数.0行目の書き込みに5いいねなら,like[0]==5
readLike();//追加:サーバから「いいね」を読み込む
read();
function write() {//略
}
function read() {//略
}
function showPost(i, name, content) {
   addText("hist",i+"番目の書き込み<br/>");  
   addText("hist","名前: "+name+"<br/>");  
   addText("hist","内容: "+content+"<br/>");  
   //追加:「いいね」の表示
   if (likes[i]) {
       addText("hist",likes[i]+"いいね<br/>");
   }
   // 追加ここまで
   addText("hist","<hr/>\n");
}
//以下すべて追加:
function readLike() {
   likes={};//いいね数を初期化
   var r=callServer(readLikeUrl);//サーバ側からlike.txtを取得
   var lines=r.split("\n");//行で分割
   for (var line of lines) {//行ごとに実行
       //まだ「いいね」がない書き込みなら1をセット
       if (!likes[line]) likes[line]=1;
       //すでに「いいね」がある書き込みなら1増やす
       else likes[line]++;
   }
}

「いいね」の追加

Main_Like(JavaScript)

//readLikeUrlを初期化している場所のすぐ下に追加.
addLikeUrl=serverTop+"add_like.html"; 
//中略
function showPost(i, name, content) {
   addText("hist",i+"番目の書き込み<br/>");  
   addText("hist","名前: "+name+"<br/>");  
   addText("hist","内容: "+content+"<br/>");  
   if (likes[i]) {
       addText("hist",likes[i]+"いいね<br/>");
   }
   //追加:いいねボタン
   newElement("button",{
       parent:"hist",//ボタンを追加する場所
       onClick: addLike, //クリックされたときに↓のaddLikeを呼ぶ
       index:i,//何番目の書き込みかを識別
   },"いいね!");//ボタンに書く文字
   //---追加ここまで
   addText("hist","<hr/>\n");
}
//以下すべて追加
function addLike(button) {
   var index=getAttr(button, "index");//何番目の書き込みか取得
   setText("result",index+"番目のに書き込みにいいね!");
   callServer(addLikeUrl,index);//サーバ側のadd_likeを呼び出す
   readLike();//いいね数再読み込み
   read();//書き込み再表示
}

使用している命令の詳細→newElement

情報システムを作ってみよう

powered by Quick Homepage Maker 5.1
based on PukiWiki 1.4.7 License is GPL. QHM

RSS  Valid XHTML 1.0 Transitional