вроде работает
This commit is contained in:
parent
315b06c309
commit
cc306f33ef
6 changed files with 62 additions and 28 deletions
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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
5
frontend/src/config.ts
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
let config = {
|
||||||
|
apiEndpoint: 'http://localhost:8888',
|
||||||
|
}
|
||||||
|
|
||||||
|
export default config
|
Loading…
Add table
Reference in a new issue