вроде работает

This commit is contained in:
Mootfrost777 2023-01-03 19:43:27 +03:00
parent 315b06c309
commit cc306f33ef
6 changed files with 62 additions and 28 deletions

View file

@ -4,7 +4,6 @@ from starlette.middleware.cors import CORSMiddleware
app = FastAPI() app = FastAPI()
app.include_router(router)
app.add_middleware( app.add_middleware(
CORSMiddleware, CORSMiddleware,
allow_origins=['*'], allow_origins=['*'],
@ -12,3 +11,4 @@ app.add_middleware(
allow_methods=['*'], allow_methods=['*'],
allow_headers=['*'], allow_headers=['*'],
) )
app.include_router(router)

View file

@ -16,9 +16,13 @@ async def get_notes(session: AsyncSession = Depends(get_session)):
return result.scalars().all() return result.scalars().all()
class NoteCreate(BaseModel):
title: str
@router.post("/items/create") @router.post("/items/create")
async def create_note(title: str, session: AsyncSession = Depends(get_session)): async def create_note(req: NoteCreate, session: AsyncSession = Depends(get_session)):
note = Note(title=title) note = Note(title=req.title)
session.add(note) session.add(note)
await session.commit() await session.commit()
return { return {
@ -36,26 +40,25 @@ class NoteUpdateReq(BaseModel):
@router.put("/items/update") @router.put("/items/update")
async def update_note(req: NoteUpdateReq, session: AsyncSession = Depends(get_session)): async def update_note(req: NoteUpdateReq, session: AsyncSession = Depends(get_session)):
new_note = Note(
id=req.id,
title=req.title,
checked=req.checked
)
await session.execute( await session.execute(
update(Note).where(Note.id == req.id).values(new_note) update(Note).where(Note.id == req.id).values(req.__dict__)
) )
await session.commit() await session.commit()
return { return {
"id": new_note.id, "id": req.id,
"title": new_note.title, "title": req.title,
"checked": new_note.checked "checked": req.checked
} }
class NoteDeleteReq(BaseModel):
id: int
@router.delete("/items/delete") @router.delete("/items/delete")
async def delete_note(id: int, session: AsyncSession = Depends(get_session)): async def delete_note(req: NoteDeleteReq, session: AsyncSession = Depends(get_session)):
await session.execute( await session.execute(
delete(Note).where(Note.id == id) delete(Note).where(Note.id == req.id)
) )
await session.commit() await session.commit()
return 204 return 204

View file

@ -2,32 +2,50 @@
import {onMounted, ref} from 'vue' import {onMounted, ref} from 'vue'
import Item from "./components/Item.vue"; import Item from "./components/Item.vue";
import Edit from "./components/Edit.vue"; import Edit from "./components/Edit.vue";
import config from "./config";
import axios from 'axios' import axios from 'axios'
let id = 0
const notes = ref<any[]>([{id: id, title: "Hello World", checked: false}])
const currentNote = ref<any>({id: id += 1, title: "", checked: false})
onMounted(async () => { onMounted(async () => {
notes.value = await axios.get('http://localhost:8888/items') const response = await axios.get(`${config.apiEndpoint}/items`)
notes.value = response.data
id = Math.max(...notes.value.map((note: any) => note.id), 0)
currentNote.value.id = id += 1
}) })
function processNote(note: any) {
let id;
const notes = ref<any[]>([])
const currentNote = ref<any>({id: id += 1, title: "", checked: false})
async function processNote(note: any) {
const index = notes.value.findIndex((item) => item.id === note.id) const index = notes.value.findIndex((item) => item.id === note.id)
if (index !== -1) { if (index !== -1) {
notes.value[index] = note await axios.put(`${config.apiEndpoint}/items/update`, note).then((response) => {
notes.value[index] = response.data
})
} }
else { else {
notes.value.push(note) await axios.post(`${config.apiEndpoint}/items/create`, {title: note.title}).then((response) => {
notes.value.push(response.data)
})
} }
currentNote.value = {id: id += 1, title: "", checked: false} currentNote.value = {id: id += 1, title: "", checked: false}
} }
function deleteNote(note: any) {
async function deleteNote(note: any) {
await axios.delete(`${config.apiEndpoint}/items/delete`, {data: {id: note.id}})
notes.value = notes.value.filter((item) => item.id !== note.id) notes.value = notes.value.filter((item) => item.id !== note.id)
} }
async function updateChecked(id: any, checked: boolean) {
const index = notes.value.findIndex((item) => item.id === id)
if (index !== -1) {
notes.value[index].checked = checked
await axios.put(`${config.apiEndpoint}/items/update`, notes.value[index])
}
}
</script> </script>
<template> <template>
@ -37,7 +55,7 @@ function deleteNote(note: any) {
:key="el.id" :key="el.id"
@delete="deleteNote" @delete="deleteNote"
@edit="(note) => currentNote = note" @edit="(note) => currentNote = note"
@updateChecked="(checked) => el.checked = checked" @updateChecked="(checked) => updateChecked(el.id, checked)"
/> />
</div> </div>
<edit <edit

View file

@ -11,13 +11,17 @@
} }
emit('done', note) emit('done', note)
} }
function handleChange(event) {
emit('updateTitle', (event.target as HTMLInputElement).value)
}
</script> </script>
<template> <template>
<div class="container"> <div class="container">
<input type="text" <input type="text"
:value="note.title" :value="note.title"
@input="event => $emit('updateTitle', event.target.value)"> @input="handleChange">
<div class="btn" @click="processNote(note)"> <div class="btn" @click="processNote(note)">
<span><font-awesome-icon icon="fa-solid fa-check" /> Add</span> <span><font-awesome-icon icon="fa-solid fa-check" /> Add</span>

View file

@ -1,15 +1,19 @@
<script setup lang="ts"> <script setup lang="ts">
defineProps<{ note: any }>() defineProps<{ note: any }>()
defineEmits<{ const emit = defineEmits<{
(e: 'delete', note: any): void (e: 'delete', note: any): void
(e: 'edit', note: any): void (e: 'edit', note: any): void
(e: 'updateChecked', checked: boolean): void (e: 'updateChecked', checked: boolean): void
}>() }>()
function handleChecked(event) {
emit('updateChecked', (event.target as HTMLInputElement).checked)
}
</script> </script>
<template> <template>
<div class="container"> <div class="container">
<input type="checkbox" :checked="note.checked" @change="event => $emit('updateChecked', event.target.checked)"> <input type="checkbox" :checked="note.checked" @change="handleChecked">
<span class="title">{{ note.title }}</span> <span class="title">{{ note.title }}</span>
<div class="btn" @click="$emit('edit', note)"><span><font-awesome-icon icon="fa-solid fa-pen-to-square" /> Edit</span></div> <div class="btn" @click="$emit('edit', note)"><span><font-awesome-icon icon="fa-solid fa-pen-to-square" /> Edit</span></div>
<div class="btn" @click="$emit('delete', note)"><span><font-awesome-icon icon="fa-solid fa-trash" /> Delete</span></div> <div class="btn" @click="$emit('delete', note)"><span><font-awesome-icon icon="fa-solid fa-trash" /> Delete</span></div>

5
frontend/src/config.ts Normal file
View file

@ -0,0 +1,5 @@
let config = {
apiEndpoint: 'http://localhost:8888',
}
export default config