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

データ管理

複数のMarkdownデータを管理の第二回目です。

取得したMarkdownのデータを選択し、詳細画面を表示する対応を行います。

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

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

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

FlaskのAPI改修

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

    
import os

from flask import Flask, request
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 json.dumps(results, indent=2)

@app.route('/markdown/<path:path>', methods=["GET"])
def get_markdown_url(path):
    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 WHERE url = '" + path + "'"
        cur.execute(sql)
        results = cur.fetchall()

    return json.dumps(results[0], indent=2)
    
  

get_markdown_url()の関数を追加しました。

app.routeの<path:path>を引数として受け取ります。

urlのパスと一致するデータを取得するSELECT文を作りました。

取得したデータを1件返却します。

改修内容は以上です。

ReactのMarkdownTemplate改修

ホームページで取得したURLを受け取って、受け取ったURLと一致するデータをAPIを使って取得するように変更します。

URL /markdown + [urlのパス]
メソッド GET

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

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

react-router-domのuseLocationを使います。

useLocationからpathnameを取得します。取得したpathnameをFlaskのAPIに渡します。

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

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

ReactのApp改修

Appを改修します。これまで/page1のURLを使ってpage1pageの呼び出しを行っていましたが、すべてのURLでpage1pageのページ遷移をするように改修します。

  1. import { BrowserRouter, Routes, Route } from "react-router-dom"
  2. import HomePage from "./pages/HomePage";
  3. import Page1Page from "./pages/Page1Page";
  4. import Page2Page from "./pages/Page2Page";
  5. export default function App() {
  6. return (
  7. <BrowserRouter>
  8. <Routes>
  9. <Route path="/" element={<HomePage />} />
  10. <Route path="/page2" element={<Page2Page />} />
  11. <Route path="*" element={<Page1Page />} />
  12. </Routes>
  13. </BrowserRouter>
  14. );
  15. }

上記のようにRoutesの最後でpath="*"としてすべてのURLがPage1Pageに遷移するようになります。

画面確認

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

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

  1. docker-compose up

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

http://localhost:3000

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

ホームページ

markdown-homepage

ページ1(Markdown表示ページ)

markdown-homepage

まとめ

Markdownのデータを選択し、詳細画面を表示する対応を行いました。

次回は表示画面とエディット画面の切り替えを行います。

コメント

0 件のコメント:

コメントを投稿

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