Markdwon形式のメモ管理(複数管理 第一回)

データ管理

これまでmarkdownのデータを一つだけ管理していました。

複数のMarkdownデータを管理したいと思います。

ReactでMarkdownのデータを複数管理する方法について検討します。

なお、今回の対応は複数回に分けて検討します。

今回は、複数件のデータを取得して画面に表示するところまで行います。

前回の内容は以下を参照してください。

ReactのMUIをつかって部品を作成する

ReactでMarkdownのデータを複数管理する手順は以下のとおりです。

Markdownテーブル検討

Markdownのテーブルを再検討します。

再検討したテーブルの内容は以下の通りです。

url VARCHAR(500)
title VARCHAR(250)
body TEXT

今回はテーブルを作りなおします。

以下DDL(Data Definition Language:データ定義言語)を記載します。

テーブルを削除します。

    
DROP TABLE test.markdown;
    
  

テーブルを追加します。

    
CREATE TABLE test.markdown (url varchar(500), title varchar(250), body text);
    
  

初期データを追加します。INSERT文を実行したらコミットをしてください。

    
INSERT INTO test.markdown (url, title, body) VALUES ('test/test', 'test', '# TEST');
INSERT INTO test.markdown (url, title, body) VALUES ('test/test2', 'test2', '# TEST2');

commit;
    
  

MariaDBのコンテナに接続します。

  1. docker exec -it db sh

コンテナに接続できたらmysqlにログインします。

  1. mysql --user=test --password=test

上記で作成したDDLを実行します。

ここまでが、Markdownのテーブルを再検討です。

終了は「quit」を入力しmysqlからログアウトします。そのあと、「exit」でコンテナから切断します。

FlaskのAPI改修

Flaskのapp.pyを修正します。

    
import os

from flask import Flask, request, jsonify
from flask_cors import CORS

import pymysql.cursors
import json 

RESULT_CODE_SUCESS = 'sucess'

app = Flask(__name__)
CORS(app) 

@app.route("/", methods=["GET"])
def test():  
    return "Hello World"

RESULT_CODE_SUCESS
@app.route('/mariadb')
def mariadb():
    conn = pymysql.connect(
        host='db',
        port=3306,
        user=os.environ.get('MYSQL_USER'),
        password=os.environ.get('MYSQL_PASSWORD'),
        db=os.environ.get('MYSQL_DATABASE'),
        cursorclass=pymysql.cursors.DictCursor
    )

    with conn.cursor() as cur:
        sql = "SELECT * FROM user"
        cur.execute(sql)
        results = cur.fetchall()

    return results[0]

@app.route('/markdown', methods=["POST"])
def post_markdown():
    conn = pymysql.connect(
        host='db',
        port=3306,
        user=os.environ.get('MYSQL_USER'),
        password=os.environ.get('MYSQL_PASSWORD'),
        db=os.environ.get('MYSQL_DATABASE'),
        cursorclass=pymysql.cursors.DictCursor
    )

    cur = conn.cursor() 

    markdown = request.json["body"] 
    cur.execute(f"INSERT INTO markdown(body) values('{markdown}')")
    conn.commit()

    return RESULT_CODE_SUCESS

@app.route('/markdown', methods=["GET"])
def get_markdown():
    conn = pymysql.connect(
        host='db',
        port=3306,
        user=os.environ.get('MYSQL_USER'),
        password=os.environ.get('MYSQL_PASSWORD'),
        db=os.environ.get('MYSQL_DATABASE'),
        cursorclass=pymysql.cursors.DictCursor
    )

    with conn.cursor() as cur:
        sql = "SELECT * FROM test.markdown"
        cur.execute(sql)
        results = cur.fetchall()

    return jsonify({'markdowns': [results.to_dict() for result in results]})
    
  

get_markdown()の関数を変更しました。

jsonifyを使ってDataBaseから取得した値をJson形式に変換します。

いままで1件返却していましたが、複数のデータを返却できるようにしました。

ReactのHomeTemplate改修

Markdownデータを複数取得してホームページに表示する改修を行います。

内容は以下のとおりです。

  1. import { useState, useEffect } from "react";
  2. import {
  3. AppBar,
  4. Box,
  5. Container,
  6. createTheme,
  7. ThemeProvider,
  8. Toolbar,
  9. } from "@mui/material";
  10. import axios from 'axios';
  11. import HeaderNavigation from "../organisms/HeaderNavigation";
  12. import { Link } from "react-router-dom";
  13. export default function HomeTemplate() {
  14. const darkTheme = createTheme({
  15. palette: {
  16. mode: "dark",
  17. primary: {
  18. main: "#1976d2"
  19. }
  20. }
  21. });
  22. const [text, setText] = useState([]);
  23. useEffect(() => {
  24. axios.get('http://localhost:5000/markdown')
  25. .then(res => setText(res.data))
  26. }, [])
  27. return (
  28. <ThemeProvider theme={darkTheme}>
  29. <Box
  30. sx={{
  31. display: "flex",
  32. flexDirection: "column",
  33. height: "100vh"
  34. }}
  35. >
  36. <AppBar position="relative" >
  37. <HeaderNavigation />
  38. </AppBar>
  39. <Box >
  40. <Toolbar sx={{ backgroundColor: "#1976d2" }}>サブヘッダ</Toolbar>
  41. </Box>
  42. <Box component="main" >
  43. <Container maxWidth="xl" sx={{display: "flex", flexDirection: "column"}}>
  44. {text.map((markdown) => {
  45. return (
  46. <Link to={markdown.url}>
  47. {markdown.title}
  48. </Link>
  49. )
  50. })}
  51. </Container >
  52. </Box>
  53. </Box>
  54. </ThemeProvider>
  55. );
  56. }

axiosを使って前述したAPIからデータを複数件取得します。

複数件取得したデータは、mapタグを使って取り出します。

取り出したデータはLinkタグを使ってurlとタイトルを設定します。

以上がHomeTemplateのコーディングです。

画面確認

docker-compose upを使って各コンテナを起動します。

docker-compose.ymlファイルがある場所で以下のコマンドを実行します。

  1. docker-compose up

起動したら以下のURLをブラウザに入力します。

http://localhost:3000

以下ブラウザの表示です。

ホームページ

markdown-homepage

まとめ

データベースにある全件を取得するようにしました。

次回は取得したデータを選択して選択したMarkdownのデータを表示する対応を行います。

コメント

0 件のコメント:

コメントを投稿

コメントをお待ちしています。