Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Sign in
Toggle navigation
K
kiaisoft_tuananh_nuxt
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
1
Issues
1
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
TTS Tran Viet Anh
kiaisoft_tuananh_nuxt
Commits
ac29aa6b
Commit
ac29aa6b
authored
Feb 08, 2023
by
TTS Kieu Tuan Anh
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
add name category + user creen post
parent
51ae5777
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
388 additions
and
465 deletions
+388
-465
auth.js
middleware/auth.js
+3
-3
web.js
middleware/web.js
+1
-1
index.vue
pages/posts/index.vue
+166
-279
index.vue
pages/products/index.vue
+200
-182
index.vue
pages/users/index.vue
+3
-0
formatTime.js
plugins/formatTime.js
+7
-0
index.js
store/index.js
+8
-0
No files found.
middleware/auth.js
View file @
ac29aa6b
export
default
function
(
context
)
{
export
default
function
(
context
)
{
console
.
log
(
'
[LOG]: middleware is running ...
'
)
console
.
log
(
'
[LOG]: middleware is running ...
'
)
}
}
\ No newline at end of file
middleware/web.js
View file @
ac29aa6b
export
default
({
redirect
})
=>
{
export
default
({
redirect
,
store
})
=>
{
if
(
typeof
localStorage
!==
'
undefined
'
&&
!
localStorage
.
getItem
(
'
token
'
))
{
if
(
typeof
localStorage
!==
'
undefined
'
&&
!
localStorage
.
getItem
(
'
token
'
))
{
return
redirect
(
'
/login
'
)
return
redirect
(
'
/login
'
)
}
}
...
...
pages/posts/index.vue
View file @
ac29aa6b
...
@@ -12,106 +12,7 @@
...
@@ -12,106 +12,7 @@
</
template
>
</
template
>
</v-breadcrumbs>
</v-breadcrumbs>
</div>
</div>
<div
style=
"float: right"
>
<div
style=
"float: right"
/>
<v-dialog
v-model=
"dialog1"
persistent
max-width=
"600px"
enctype=
"multipart/form-data"
>
<
template
#activator
="{
on
,
attrs
}"
>
<v-btn
color=
"primary"
dark
v-bind=
"attrs"
v-on=
"on"
>
New Post
</v-btn>
</
template
>
<v-card>
<v-card-title>
<span
class=
"text-h5"
>
CREAT POST
</span>
</v-card-title>
<v-card-text>
<v-container>
<v-row>
<v-col
cols=
"12"
sm=
"6"
md=
"4"
>
<v-text-field
v-model=
"title"
label=
"Title*"
required
/>
</v-col>
<v-col
cols=
"12"
>
<v-select
v-model=
"category_id"
:items=
"categories"
item-text=
"name"
item-value=
"id"
label=
"Category"
/>
</v-col>
<v-col
cols=
"12"
>
<v-text-field
v-model=
"content"
label=
"Content"
required
/>
</v-col>
<v-col
cols=
"12"
>
<v-select
v-model=
"status"
:items=
"statusDefaul"
item-text=
"name"
item-value=
"id"
label=
"Status"
/>
</v-col>
<v-col
cols=
"12"
>
<v-file-input
v-model=
"images"
label=
"File input"
small-chips
dense
accept=
"image/*"
prepend-icon=
"mdi-camera"
@
change=
"fileSelected"
/>
</v-col>
</v-row>
</v-container>
<small>
*indicates required field
</small>
</v-card-text>
<v-card-actions>
<v-spacer
/>
<v-btn
color=
"blue darken-1"
text
@
click=
"dialog1 = false"
>
Close
</v-btn>
<v-btn
color=
"blue darken-1"
text
type=
"submit"
@
click=
"dialog1 = false; createPost()"
>
Save
</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
</div>
<!-- modal-show -->
<!-- modal-show -->
<v-dialog
<v-dialog
v-model=
"dialog2"
v-model=
"dialog2"
...
@@ -283,155 +184,24 @@
...
@@ -283,155 +184,24 @@
</v-card-actions>
</v-card-actions>
</v-card>
</v-card>
</v-dialog>
</v-dialog>
<!-- <div style="float: right">
<!-- modal-delete -->
<b-button class="text-white" v-b-modal.modal-create>New Post</b-button>
<v-dialog
v-model=
"dialogDelete"
max-width=
"500px"
>
</div>
<v-card>
<b-modal id="modal-create" title="create Post" class="modal fade">
<v-card-title
class=
"text-h5"
>
<div class="w-full mt-4 p-10">
Are you sure you want to delete this item?
<form>
</v-card-title>
<label for="input-live">Title :</label>
<v-card-actions>
<b-form-input
<v-spacer
/>
id="input-live"
<v-btn
color=
"blue darken-1"
text
@
click=
"closeDelete"
>
v-model="title"
Cancel
type="text"
</v-btn>
class="form-control mb-2"
<v-btn
color=
"blue darken-1"
text
@
click=
"deletePost(); dialogDelete = false"
>
placeholder="name"
OK
aria-describedby="input-live-help input-live-feedback"
</v-btn>
max="255"
<v-spacer
/>
min="1"
</v-card-actions>
trim
</v-card>
/>
</v-dialog>
<label>Category ID :</label>
<b-form-select v-model="category_id">
<option v-for="item in categories" :value="item.id">
{{ item.name }}
</option>
</b-form-select>
<label>Content :</label>
<input
v-model="content"
type="text"
class="form-control mb-2"
placeholder="Ordering"
size="sm"
required
>
<label>Author :</label>
<input
v-model="user_id"
type="text"
class="form-control mb-2"
placeholder="Description"
size="sm"
required
>
<label>Status :</label>
<b-form-select v-model="status" :options="options" />
<label>Image :</label>
<b-form-file
v-model="images"
multiple
:state="Boolean(images)"
placeholder="Choose a image or drop it here..."
drop-placeholder="Drop file here..."
/>
</form>
</div>
<template #modal-footer>
<button v-b-modal.modal-close_visit class="btn btn-danger btn-sm m-1" @click="$bvModal.hide('modal-create')">
Close
</button>
<button v-b-modal.modal-close_visit class="btn btn-success btn-sm m-1" @click="createPost()">
Submit
</button>
</template>
</b-modal> -->
<!-- modal-show -->
<!-- <b-modal id="modal-show" title="POST" class="modal fade">
<div class="w-full mt-4 p-10">
<form>
<label>Title :</label>
<input v-model="sTitle" type="text" class="form-control mb-2" size="sm" disabled>
<label>Category ID :</label>
<input v-model="sCategoryId" type="text" class="form-control mb-2" size="sm" disabled>
<label>Content :</label>
<input v-model="sContent" type="text" class="form-control mb-2" size="sm" disabled>
<label>Author :</label>
<input
v-model="sUserId"
type="text"
class="form-control mb-2"
placeholder="Description"
size="sm"
disabled
>
<label>Status :</label>
<b-form-select v-model="sStatus" :options="options" disabled />
<label>Image :</label>
<div v-for="(image, index) in sImages" :key="index">
<b-img :src="image" fluid alt="Fluid image" />
</div>
</form>
</div>
<template #modal-footer>
<button v-b-modal.modal-close_visit class="btn btn-danger btn-sm m-1" @click="$bvModal.hide('modal-show')">
Close
</button>
</template>
</b-modal> -->
<!-- modal-edit -->
<!-- <b-modal id="modal-edit" title="Edit Post " class="modal fade">
<div class="w-full mt-4 p-10">
<form>
<label>Title :</label>
<input
v-model="eTitle"
type="text"
class="form-control mb-2"
placeholder="name"
max="255"
min="1"
size="sm"
required
>
<label>Category ID :</label>
<b-form-select v-model="eCategoryId">
<option v-for="item in categories" :value="item.id">
{{ item.name }}
</option>
</b-form-select>
<label>Content :</label>
<input
v-model="eContent"
type="text"
class="form-control mb-2"
placeholder="Ordering"
size="sm"
required
>
<label>Author :</label>
<input v-model="eUserId" type="text" class="form-control mb-2" placeholder="Description" size="sm">
<label>Status :</label>
<b-form-select v-model="eStatus" :options="options" />
<label>Image :</label>
<b-form-file
v-model="eImages"
multiple
:state="Boolean(eImages)"
placeholder="Choose a image or drop it here..."
drop-placeholder="Drop file here..."
/>
</form>
</div>
<template #modal-footer>
<button v-b-modal.modal-close_visit class="btn btn-danger btn-sm m-1" @click="$bvModal.hide('modal-edit')">
Close
</button>
<button v-b-modal.modal-close_visit class="btn btn-success btn-sm m-1" @click="updatePost()">
Submit
</button>
</template>
</b-modal> -->
<!-- table -->
<!-- table -->
<div>
<div>
<v-data-table
:headers=
"headers"
:items=
"posts"
sort-by=
"calories"
class=
"elevation-1"
>
<v-data-table
:headers=
"headers"
:items=
"posts"
sort-by=
"calories"
class=
"elevation-1"
>
...
@@ -440,13 +210,119 @@
...
@@ -440,13 +210,119 @@
<v-toolbar-title>
Post Manage
</v-toolbar-title>
<v-toolbar-title>
Post Manage
</v-toolbar-title>
<v-divider
class=
"mx-4"
inset
vertical
/>
<v-divider
class=
"mx-4"
inset
vertical
/>
<v-spacer
/>
<v-spacer
/>
<v-toolbar-title>
<v-dialog
v-model=
"dialog1"
persistent
max-width=
"600px"
enctype=
"multipart/form-data"
>
<template
#activator
="
{ on, attrs }">
<v-btn
color=
"primary"
dark
v-bind=
"attrs"
v-on=
"on"
>
New Post
</v-btn>
</
template
>
<v-card>
<v-card-title>
<span
class=
"text-h5"
>
CREAT POST
</span>
</v-card-title>
<v-card-text>
<v-container>
<v-row>
<v-col
cols=
"12"
sm=
"6"
md=
"4"
>
<v-text-field
v-model=
"title"
label=
"Title*"
required
/>
</v-col>
<v-col
cols=
"12"
>
<v-select
v-model=
"category_id"
:items=
"categories"
item-text=
"name"
item-value=
"id"
label=
"Category"
/>
</v-col>
<v-col
cols=
"12"
>
<v-text-field
v-model=
"content"
label=
"Content"
required
/>
</v-col>
<v-col
cols=
"12"
>
<v-select
v-model=
"status"
:items=
"statusDefaul"
item-text=
"name"
item-value=
"id"
label=
"Status"
/>
</v-col>
<v-col
cols=
"12"
>
<v-file-input
v-model=
"images"
label=
"File input"
small-chips
dense
accept=
"image/*"
prepend-icon=
"mdi-camera"
@
change=
"fileSelected"
/>
</v-col>
</v-row>
</v-container>
<small>
*indicates required field
</small>
</v-card-text>
<v-card-actions>
<v-spacer
/>
<v-btn
color=
"blue darken-1"
text
@
click=
"dialog1 = false"
>
Close
</v-btn>
<v-btn
color=
"blue darken-1"
text
type=
"submit"
@
click=
"dialog1 = false; createPost()"
>
Save
</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
</v-toolbar-title>
</v-toolbar>
</v-toolbar>
</template>
</template>
<
template
#item.category_id=
"{ item }"
>
{{
categories
.
find
(
x
=>
x
.
id
===
item
.
category_id
)?.
name
}}
</
template
>
<
template
#item.user_id=
"{ item }"
>
{{
users
.
find
(
x
=>
x
.
id
===
item
.
user_id
)?.
name
}}
</
template
>
<
template
#
[`
item
.
actions
`
]=
"{ item }"
>
<
template
#
[`
item
.
actions
`
]=
"{ item }"
>
<v-icon
:id=
"item.id"
small
@
click=
"editPost(item)"
>
<v-icon
:id=
"item.id"
small
@
click=
"editPost(item)"
>
mdi-pencil
mdi-pencil
</v-icon>
</v-icon>
<v-icon
:id=
"item.id"
small
@
click=
"d
eletePost(item.id,
item)"
>
<v-icon
:id=
"item.id"
small
@
click=
"d
ialogDelete = true; getID(
item)"
>
mdi-delete
mdi-delete
</v-icon>
</v-icon>
<v-icon
:id=
"item.id"
small
@
click=
"showPost(item)"
>
<v-icon
:id=
"item.id"
small
@
click=
"showPost(item)"
>
...
@@ -489,8 +365,8 @@ export default {
...
@@ -489,8 +365,8 @@ export default {
sortable
:
false
,
sortable
:
false
,
value
:
'
title
'
value
:
'
title
'
},
},
{
text
:
'
id
'
,
value
:
'
id
'
},
{
text
:
'
Category ID
'
,
value
:
'
category_id
'
},
{
text
:
'
Category ID
'
,
value
:
'
category_id
'
},
{
text
:
'
content
'
,
value
:
'
content
'
,
sortable
:
false
},
{
text
:
'
author
'
,
value
:
'
user_id
'
},
{
text
:
'
author
'
,
value
:
'
user_id
'
},
{
text
:
'
status
'
,
value
:
'
status
'
},
{
text
:
'
status
'
,
value
:
'
status
'
},
{
text
:
'
Actions
'
,
value
:
'
actions
'
,
sortable
:
false
}
{
text
:
'
Actions
'
,
value
:
'
actions
'
,
sortable
:
false
}
...
@@ -524,6 +400,7 @@ export default {
...
@@ -524,6 +400,7 @@ export default {
],
],
posts
:
[],
posts
:
[],
categories
:
[],
categories
:
[],
users
:
[],
sTitle
:
''
,
sTitle
:
''
,
sCategoryId
:
''
,
sCategoryId
:
''
,
sContent
:
''
,
sContent
:
''
,
...
@@ -574,8 +451,9 @@ export default {
...
@@ -574,8 +451,9 @@ export default {
},
},
created
()
{
created
()
{
this
.
initialize
()
this
.
initialize
()
this
.
get
p
osts
()
this
.
get
P
osts
()
this
.
getCategories
()
this
.
getCategories
()
this
.
getUsers
()
},
},
methods
:
{
methods
:
{
initialize
()
{
initialize
()
{
...
@@ -625,6 +503,18 @@ export default {
...
@@ -625,6 +503,18 @@ export default {
}
}
this
.
close
()
this
.
close
()
},
},
getUsers
()
{
this
.
$axios
.
get
(
'
/users/
'
,
{
headers
:
{
Authorization
:
`Bearer
${
this
.
$auth
.
$storage
.
getUniversal
(
'
token
'
)}
`
}
})
.
then
(
response
=>
(
this
.
users
=
response
.
data
.
data
.
data
))
.
catch
(
function
(
error
)
{
console
.
log
(
error
)
})
},
getCategories
()
{
getCategories
()
{
this
.
$axios
this
.
$axios
.
get
(
'
/categories/
'
,
{
.
get
(
'
/categories/
'
,
{
...
@@ -638,7 +528,7 @@ export default {
...
@@ -638,7 +528,7 @@ export default {
console
.
log
(
error
)
console
.
log
(
error
)
})
})
},
},
get
p
osts
()
{
get
P
osts
()
{
this
.
$axios
this
.
$axios
.
get
(
'
/posts/
'
,
{
.
get
(
'
/posts/
'
,
{
headers
:
{
headers
:
{
...
@@ -664,7 +554,6 @@ export default {
...
@@ -664,7 +554,6 @@ export default {
fd
,
fd
,
{
{
headers
:
{
headers
:
{
'
Content-Type
'
:
'
multipart/form-data; application/json
'
,
Authorization
:
`Bearer
${
this
.
$auth
.
$storage
.
getUniversal
(
'
token
'
)}
`
Authorization
:
`Bearer
${
this
.
$auth
.
$storage
.
getUniversal
(
'
token
'
)}
`
}
}
}
}
...
@@ -683,30 +572,31 @@ export default {
...
@@ -683,30 +572,31 @@ export default {
})
})
})
})
},
},
deletePost
(
ID
,
index
)
{
getID
(
item
)
{
this
.
eID
=
item
.
id
this
.
editedIndex
=
this
.
categories
.
indexOf
(
item
)
},
deletePost
()
{
const
self
=
this
const
self
=
this
this
.
editedIndex
=
this
.
posts
.
indexOf
(
index
)
const
currentPostIndex
=
this
.
editedIndex
if
(
confirm
(
'
Do you really want to delete?
'
))
{
this
.
$axios
this
.
$axios
.
delete
(
`/posts/
${
this
.
eID
}
`
,
{
.
delete
(
`/posts/
${
ID
}
`
,
{
headers
:
{
headers
:
{
Authorization
:
`Bearer
${
this
.
$auth
.
$storage
.
getUniversal
(
'
token
'
)}
`
'
Content-Type
'
:
'
application/json
'
,
}
Authorization
:
`Bearer
${
this
.
$auth
.
$storage
.
getUniversal
(
'
token
'
)}
`
})
}
.
then
((
response
)
=>
{
})
this
.
posts
.
splice
(
currentPostIndex
,
1
)
.
then
((
response
)
=>
{
self
.
$toast
.
success
(
'
Post deleted successfully!
'
,
{
this
.
posts
.
splice
(
this
.
editedIndex
,
1
)
duration
:
3000
self
.
$toast
.
success
(
'
Post deleted successfully!
'
,
{
duration
:
3000
})
})
})
.
catch
((
error
)
=>
{
})
console
.
log
(
error
)
.
catch
((
error
)
=>
{
self
.
$toast
.
error
(
'
Error!
'
,
{
console
.
log
(
error
)
duration
:
3000
self
.
$toast
.
error
(
'
Error!
'
,
{
})
duration
:
3000
})
})
}
})
},
},
async
showPost
(
item
)
{
async
showPost
(
item
)
{
const
ID
=
item
.
id
const
ID
=
item
.
id
...
@@ -714,7 +604,6 @@ export default {
...
@@ -714,7 +604,6 @@ export default {
const
resp
=
await
this
.
$axios
.
get
(
`/posts/
${
ID
}
`
,
{
const
resp
=
await
this
.
$axios
.
get
(
`/posts/
${
ID
}
`
,
{
method
:
'
GET
'
,
method
:
'
GET
'
,
headers
:
{
headers
:
{
'
Content-Type
'
:
'
multipart/form-data
'
,
Authorization
:
`Bearer
${
this
.
$auth
.
$storage
.
getUniversal
(
'
token
'
)}
`
Authorization
:
`Bearer
${
this
.
$auth
.
$storage
.
getUniversal
(
'
token
'
)}
`
}
}
})
})
...
@@ -755,9 +644,7 @@ export default {
...
@@ -755,9 +644,7 @@ export default {
fd,
fd,
{
{
headers: {
headers: {
'Content-Type': 'multipart/form-data',
Authorization: `
Bearer
$
{
this
.
$auth
.
$storage
.
getUniversal
(
'
token
'
)}
`
Authorization: `
Bearer
$
{
this
.
$auth
.
$storage
.
getUniversal
(
'
token
'
)}
`,
Accept: 'application/json, text/plain, */*'
}
}
}
}
)
)
...
...
pages/products/index.vue
View file @
ac29aa6b
...
@@ -9,162 +9,7 @@
...
@@ -9,162 +9,7 @@
</
template
>
</
template
>
</v-breadcrumbs>
</v-breadcrumbs>
</div>
</div>
<div
style=
"float: right"
>
<div
style=
"float: right"
/>
<v-dialog
v-model=
"dialog1"
persistent
max-width=
"600px"
>
<
template
#activator
="{
on
,
attrs
}"
>
<v-btn
color=
"primary"
dark
v-bind=
"attrs"
v-on=
"on"
>
New Product
</v-btn>
</
template
>
<v-card>
<v-card-title>
<span
class=
"text-h5"
>
CREAT PRODUCT
</span>
</v-card-title>
<v-card-text>
<v-container>
<v-row>
<v-col
cols=
"12"
sm=
"6"
md=
"4"
>
<v-text-field
v-model=
"name"
label=
"Name*"
required
/>
</v-col>
<v-col
cols=
"12"
>
<v-select
v-model=
"category_id"
:items=
"categories"
item-text=
"name"
item-value=
"id"
label=
"Category"
/>
</v-col>
<v-col
cols=
"12"
>
<v-text-field
v-model=
"price"
label=
"Price*"
required
/>
</v-col>
<v-col
cols=
"12"
>
<v-text-field
v-model=
"description"
label=
"Description"
/>
</v-col>
<v-col
cols=
"12"
>
<v-file-input
v-model=
"images"
label=
"File input"
small-chips
dense
multiple
/>
</v-col>
<v-col
cols=
"12"
>
<v-btn
class=
"mx-2"
fab
dark
small
color=
"indigo"
@
click=
"addMore()"
>
<v-icon
dark
>
mdi-plus
</v-icon>
</v-btn>
</v-col>
<v-row
v-for=
"(variant, index) in variants"
:key=
" 'B' +index"
>
<v-col
cols=
"12"
sm=
"6"
md=
"4"
>
<v-text-field
v-model=
"variant.color"
label=
"Color*"
required
/>
</v-col>
<v-col
cols=
"12"
sm=
"6"
md=
"4"
>
<v-text-field
v-model=
"variant.size"
label=
"Size*"
required
/>
</v-col>
<v-col
cols=
"12"
sm=
"6"
md=
"4"
>
<v-text-field
v-model=
"variant.quantity"
label=
"Quantity*"
required
/>
</v-col>
<v-col>
<v-btn
v-show=
"index != 0"
class=
""
fab
dark
x-small
color=
"red"
@
click=
"remove(index)"
>
<v-icon
dark
>
mdi-minus
</v-icon>
</v-btn>
</v-col>
</v-row>
</v-row>
</v-container>
<small>
*indicates required field
</small>
</v-card-text>
<v-card-actions>
<v-spacer
/>
<v-btn
color=
"blue darken-1"
text
@
click=
"dialog1 = false; seeVariant()"
>
Close
</v-btn>
<v-btn
color=
"blue darken-1"
text
type=
"submit"
@
click=
"dialog1 = false; createProduct();"
>
Save
</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
</div>
<!-- show-modal -->
<!-- show-modal -->
<v-dialog
<v-dialog
v-model=
"dialog2"
v-model=
"dialog2"
...
@@ -327,7 +172,7 @@
...
@@ -327,7 +172,7 @@
multiple
multiple
/>
/>
</v-col>
</v-col>
<
!-- <v-img v-if="typeof eImage === 'string'" :src="eImages" /> --
>
<
v-img
v-if=
"typeof eImage === 'string'"
:src=
"eImages"
/
>
<v-col
cols=
"12"
>
<v-col
cols=
"12"
>
<v-btn
<v-btn
class=
"mx-2"
class=
"mx-2"
...
@@ -384,7 +229,7 @@
...
@@ -384,7 +229,7 @@
dark
dark
x-small
x-small
color=
"red"
color=
"red"
@
click=
"removeVariant(index)"
@
click=
"removeVariant(index
, variant
)"
>
>
<v-icon
dark
>
<v-icon
dark
>
mdi-minus
mdi-minus
...
@@ -416,6 +261,24 @@
...
@@ -416,6 +261,24 @@
</v-card-actions>
</v-card-actions>
</v-card>
</v-card>
</v-dialog>
</v-dialog>
<!-- delete-modal -->
<v-dialog
v-model=
"dialogDelete"
max-width=
"500px"
>
<v-card>
<v-card-title
class=
"text-h5"
>
Are you sure you want to delete this item?
</v-card-title>
<v-card-actions>
<v-spacer
/>
<v-btn
color=
"blue darken-1"
text
@
click=
"closeDelete"
>
Cancel
</v-btn>
<v-btn
color=
"blue darken-1"
text
@
click=
"deleteProduct(); dialogDelete = false"
>
OK
</v-btn>
<v-spacer
/>
</v-card-actions>
</v-card>
</v-dialog>
<!-- table -->
<!-- table -->
<div>
<div>
<v-data-table
<v-data-table
...
@@ -429,13 +292,169 @@
...
@@ -429,13 +292,169 @@
<v-toolbar-title>
Product Manage
</v-toolbar-title>
<v-toolbar-title>
Product Manage
</v-toolbar-title>
<v-divider
class=
"mx-4"
inset
vertical
/>
<v-divider
class=
"mx-4"
inset
vertical
/>
<v-spacer
/>
<v-spacer
/>
<v-toolbar-title>
<v-dialog
v-model=
"dialog1"
persistent
max-width=
"600px"
>
<template
#activator
="
{ on, attrs }">
<v-btn
color=
"primary"
dark
v-bind=
"attrs"
v-on=
"on"
>
New Product
</v-btn>
</
template
>
<v-card>
<v-card-title>
<span
class=
"text-h5"
>
CREAT PRODUCT
</span>
</v-card-title>
<v-card-text>
<v-container>
<v-row>
<v-col
cols=
"12"
sm=
"6"
md=
"4"
>
<v-text-field
v-model=
"name"
label=
"Name*"
required
/>
</v-col>
<v-col
cols=
"12"
>
<v-select
v-model=
"category_id"
:items=
"categories"
item-text=
"name"
item-value=
"id"
label=
"Category"
/>
</v-col>
<v-col
cols=
"12"
>
<v-text-field
v-model=
"price"
label=
"Price*"
required
/>
</v-col>
<v-col
cols=
"12"
>
<v-text-field
v-model=
"description"
label=
"Description"
/>
</v-col>
<v-col
cols=
"12"
>
<v-file-input
v-model=
"images"
label=
"File input"
small-chips
dense
multiple
/>
</v-col>
<v-col
cols=
"12"
>
<v-btn
class=
"mx-2"
fab
dark
small
color=
"indigo"
@
click=
"addMore()"
>
<v-icon
dark
>
mdi-plus
</v-icon>
</v-btn>
</v-col>
<v-row
v-for=
"(variant, index) in variants"
:key=
" 'B' +index"
>
<v-col
cols=
"12"
sm=
"6"
md=
"4"
>
<v-text-field
v-model=
"variant.color"
label=
"Color*"
required
/>
</v-col>
<v-col
cols=
"12"
sm=
"6"
md=
"4"
>
<v-text-field
v-model=
"variant.size"
label=
"Size*"
required
/>
</v-col>
<v-col
cols=
"12"
sm=
"6"
md=
"4"
>
<v-text-field
v-model=
"variant.quantity"
label=
"Quantity*"
required
/>
</v-col>
<v-col>
<v-btn
v-show=
"index != 0"
class=
""
fab
dark
x-small
color=
"red"
@
click=
"remove(index)"
>
<v-icon
dark
>
mdi-minus
</v-icon>
</v-btn>
</v-col>
</v-row>
</v-row>
</v-container>
<small>
*indicates required field
</small>
</v-card-text>
<v-card-actions>
<v-spacer
/>
<v-btn
color=
"blue darken-1"
text
@
click=
"dialog1 = false; seeVariant()"
>
Close
</v-btn>
<v-btn
color=
"blue darken-1"
text
type=
"submit"
@
click=
"dialog1 = false; createProduct();"
>
Save
</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
</v-toolbar-title>
</v-toolbar>
</v-toolbar>
</template>
</template>
<
template
#
[`
item
.
actions
`
]=
"{ item }"
>
<
template
#
[`
item
.
actions
`
]=
"{ item }"
>
<v-icon
:id=
"item.id"
small
@
click=
"editProduct(item)"
>
<v-icon
:id=
"item.id"
small
@
click=
"editProduct(item)"
>
mdi-pencil
mdi-pencil
</v-icon>
</v-icon>
<v-icon
:id=
"item.id"
small
@
click=
"d
eleteProduct(item.id,
item)"
>
<v-icon
:id=
"item.id"
small
@
click=
"d
ialogDelete = true; getID(
item)"
>
mdi-delete
mdi-delete
</v-icon>
</v-icon>
<v-icon
:id=
"item.id"
small
@
click=
"showProduct(item)"
>
<v-icon
:id=
"item.id"
small
@
click=
"showProduct(item)"
>
...
@@ -704,27 +723,29 @@ export default {
...
@@ -704,27 +723,29 @@ export default {
})
})
})
})
},
},
deleteProduct
(
ID
,
index
)
{
getID
(
item
)
{
this
.
eID
=
item
.
id
this
.
editedIndex
=
this
.
products
.
indexOf
(
item
)
},
deleteProduct
()
{
const
self
=
this
const
self
=
this
this
.
editedIndex
=
this
.
products
.
indexOf
(
index
)
const
currentPostIndex
=
this
.
editedIndex
if
(
confirm
(
'
Do you really want to delete?
'
))
{
try
{
try
{
this
.
$axios
this
.
$axios
.
delete
(
`/products/
${
this
.
eID
}
`
,
{
.
delete
(
`/products/
${
ID
}
`
,
{
headers
:
{
headers
:
{
'
Content-Type
'
:
'
application/json
'
,
'
Content-Type
'
:
'
application/json
'
,
Authorization
:
`Bearer
${
this
.
$auth
.
$storage
.
getUniversal
(
'
token
'
)}
`
Authorization
:
`Bearer
${
this
.
$auth
.
$storage
.
getUniversal
(
'
token
'
)}
`
}
}
})
})
.
then
((
response
)
=>
{
.
then
((
response
)
=>
{
this
.
products
.
splice
(
currentPostIndex
,
1
)
this
.
products
.
splice
(
this
.
editedIndex
,
1
)
self
.
$toast
.
success
(
'
Category deleted successfully!
'
,
{
self
.
$toast
.
success
(
'
Category deleted successfully!
'
,
{
duration
:
3000
duration
:
3000
})
})
})
}
catch
(
error
)
{
})
console
.
log
(
error
)
}
catch
(
error
)
{
}
console
.
log
(
error
)
}
}
},
},
async
showProduct
(
item
)
{
async
showProduct
(
item
)
{
...
@@ -819,11 +840,8 @@ export default {
...
@@ -819,11 +840,8 @@ export default {
remove (index) {
remove (index) {
this.variants.splice(index, 1)
this.variants.splice(index, 1)
},
},
removeVariant (index) {
removeVariant (index
, variant
) {
this.eVariants.splice(index, 1)
this.eVariants.splice(index, 1)
},
seeVariant () {
console.log(this.variants)
}
}
}
}
}
}
...
...
pages/users/index.vue
View file @
ac29aa6b
...
@@ -279,6 +279,9 @@ export default {
...
@@ -279,6 +279,9 @@ export default {
this
.
initialize
()
this
.
initialize
()
this
.
getUsers
()
this
.
getUsers
()
},
},
beforeCreate
()
{
// this.keepToken()
},
methods
:
{
methods
:
{
initialize
()
{
initialize
()
{
this
.
users
=
[]
this
.
users
=
[]
...
...
plugins/formatTime.js
View file @
ac29aa6b
import
Vue
from
'
vue
'
import
Vue
from
'
vue
'
import
Vuex
from
'
vuex
'
Vue
.
use
(
Vuex
)
Vue
.
mixin
({
Vue
.
mixin
({
methods
:
{
methods
:
{
...
@@ -12,6 +14,11 @@ Vue.mixin({
...
@@ -12,6 +14,11 @@ Vue.mixin({
if
(
day
.
length
<
2
)
{
day
=
'
0
'
+
day
}
if
(
day
.
length
<
2
)
{
day
=
'
0
'
+
day
}
return
[
year
,
month
,
day
].
join
(
'
-
'
)
return
[
year
,
month
,
day
].
join
(
'
-
'
)
},
keepToken
()
{
const
TOKEN
=
localStorage
.
getItem
(
'
token
'
)
this
.
$auth
.
$storage
.
setUniversal
(
'
token
'
,
TOKEN
)
}
}
}
}
})
})
store/index.js
View file @
ac29aa6b
import
Vue
from
'
vue
'
import
Vuex
from
'
vuex
'
Vue
.
use
(
Vuex
)
export
const
store
=
new
Vuex
.
Store
({
modules
:
{
}
})
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment