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
a6573e9a
Commit
a6573e9a
authored
Apr 11, 2023
by
TTS Kieu Tuan Anh
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'feature/banner' into 'feature/deploy-to-aws'
add banners See merge request
!30
parents
333e6b86
9c9d501d
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
460 additions
and
10 deletions
+460
-10
Navbar.vue
components/Navbar.vue
+5
-3
PageCarousels.vue
components/PageCarousels.vue
+29
-7
index.vue
pages/banners/index.vue
+426
-0
No files found.
components/Navbar.vue
View file @
a6573e9a
...
@@ -107,15 +107,17 @@ export default {
...
@@ -107,15 +107,17 @@ export default {
icon
:
'
mdi-newspaper
'
,
icon
:
'
mdi-newspaper
'
,
title
:
'
Posts
'
,
title
:
'
Posts
'
,
to
:
'
/posts
'
to
:
'
/posts
'
}
,
{
icon
:
'
mdi-image-marker-outline
'
,
title
:
'
Banners
'
,
to
:
'
/banners
'
}
}
],
],
miniVariant
:
false
,
miniVariant
:
false
,
title
:
'
Homepage
'
title
:
'
Homepage
'
}
}
}
,
}
,
mounted
()
{
console
.
log
(
'
123
'
)
}
,
methods
:
{
methods
:
{
async
logout
()
{
async
logout
()
{
try
{
try
{
...
...
components/PageCarousels.vue
View file @
a6573e9a
...
@@ -6,9 +6,9 @@
...
@@ -6,9 +6,9 @@
show-arrows-on-hover
show-arrows-on-hover
>
>
<v-carousel-item
<v-carousel-item
v-for=
"(
slide, i) in slide
s"
v-for=
"(
item, index) in banner
s"
:key=
"i"
:key=
"i
ndex
"
:src=
"i
mg[i]
"
:src=
"i
tem.image
"
>
>
<v-row
<v-row
class=
"fill-height"
class=
"fill-height"
...
@@ -16,7 +16,7 @@
...
@@ -16,7 +16,7 @@
justify=
"center"
justify=
"center"
>
>
<div
class=
"text-h2"
>
<div
class=
"text-h2"
>
{{
slide
}}
Slide
{{
index
+
1
}}
</div>
</div>
</v-row>
</v-row>
</v-carousel-item>
</v-carousel-item>
...
@@ -28,15 +28,37 @@ export default {
...
@@ -28,15 +28,37 @@ export default {
name
:
'
PageCarousels
'
,
name
:
'
PageCarousels
'
,
data
()
{
data
()
{
return
{
return
{
img
:
[
bannerss
:
[
'
https://d-themes.com/html/riode/images/demos/demo1/slides/slide1.jpg
'
,
{
src
:
'
https://d-themes.com/html/riode/images/demos/demo1/slides/slide1.jpg
'
,
ordering
:
0
}
,
'
https://d-themes.com/html/riode/images/demos/demo1/slides/slide2.jpg
'
{
src
:
'
https://d-themes.com/html/riode/images/demos/demo1/slides/slide2.jpg
'
,
ordering
:
1
}
],
],
banners
:
[],
slides
:
[
slides
:
[
'
First
'
,
'
First
'
,
'
Second
'
'
Second
'
]
]
}
}
},
mounted
()
{
this
.
getBanners
()
},
methods
:
{
async
getBanners
()
{
await
this
.
$axios
.
get
(
'
guest/banners/get-active-banners
'
,
{
headers
:
{
Authorization
:
`Bearer
${
this
.
$auth
.
$storage
.
getUniversal
(
'
token
'
)}
`
}
})
.
then
((
response
)
=>
{
this
.
banners
=
response
.
data
.
data
})
.
catch
(
function
(
error
)
{
console
.
log
(
error
)
})
}
}
}
}
}
</
script
>
</
script
>
...
...
pages/banners/index.vue
0 → 100644
View file @
a6573e9a
<
template
>
<v-app>
<div>
<div>
<v-breadcrumbs
:item=
"items"
>
<template
#divider
>
<v-icon>
mdi-chevron-right
</v-icon>
</
template
>
</v-breadcrumbs>
</div>
<v-dialog
v-model=
"dialog"
persistent
max-width=
"600px"
lazy-validation
>
<v-card>
<v-card-title>
<span
class=
"text-h5"
>
EDIT BANNER
</span>
</v-card-title>
<v-card-text>
<v-container>
<v-col
cols=
"12"
>
<v-text-field
v-model=
"eOrdering"
label=
"Ordering"
type=
"number"
:rules=
"requiredRules"
required
/>
</v-col>
<v-row>
<v-col
cols=
"12"
>
<v-file-input
v-model=
"eImage"
label=
"File input"
accept=
"image/*"
small-chips
dense
prepend-icon=
"mdi-camera"
@
change=
"fileSelected"
/>
</v-col>
<v-col
cols=
"12"
class=
"v-image v-responsive theme--dark"
>
<img
v-if=
"file"
contain
style=
"width:100%;height:100%"
:src=
"file"
>
</v-col>
<v-col
cols=
"12"
text-align=
" left"
>
<v-img
v-if=
"typeof eImages === 'string'"
contain
height=
"100px"
width=
"150px"
:src=
"eImages"
/>
</v-col>
</v-row>
</v-container>
</v-card-text>
<v-card-actions>
<v-spacer
/>
<v-btn
color=
"blue darken-1"
text
@
click=
"dialog = false; clearFile()"
>
Close
</v-btn>
<v-btn
color=
"blue darken-1"
text
type=
"submit"
@
click=
"dialog = false; updateBanner()"
>
Save
</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
<v-data-table
:headers=
"headers"
:items=
"banners"
sort-by=
"calories"
class=
"elevation-1 mt-5"
>
<
template
#top
>
<v-toolbar
flat
>
<v-text-field
v-model=
"searchTable"
append-icon=
"mdi-magnify"
label=
"Search"
single-line
hide-details
/>
<v-spacer
/>
<v-toolbar-title
style=
"float: right"
>
<v-dialog
v-model=
"dialog1"
persistent
max-width=
"600px"
lazy-validation
>
<template
#activator
="
{ on, attrs }">
<v-btn
color=
"primary"
dark
v-bind=
"attrs"
v-on=
"on"
>
CREATE NEW
</v-btn>
</
template
>
<v-card>
<v-card-title>
<span
class=
"text-h5"
>
Create Category
</span>
</v-card-title>
<v-card-text>
<v-container>
<v-row>
<v-col
cols=
"12"
>
<v-text-field
v-model=
"ordering"
label=
"Ordering"
type=
"number"
:rules=
"numberRules"
required
/>
</v-col>
<v-col
cols=
"12"
>
<v-file-input
v-model=
"image"
label=
"Image"
prepend-icon=
"mdi-camera"
@
change=
"fileSelected"
/>
</v-col>
<v-col
cols=
"12"
>
<img
v-if=
"file"
:src=
"file"
style=
"width:100%;height:100%"
contain
>
</v-col>
</v-row>
</v-container>
</v-card-text>
<v-card-actions>
<v-spacer
/>
<v-btn
color=
"blue darken-1"
text
@
click=
"
dialog1 = false;
clearFile();
"
>
Close
</v-btn>
<v-btn
color=
"blue darken-1"
text
type=
"submit"
@
click=
"
dialog1 = false;
createBanner();
"
>
Save
</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
</v-toolbar-title>
<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=
"
deleteBanner();
dialogDelete = false
"
>
OK
</v-btn>
<v-spacer
/>
</v-card-actions>
</v-card>
</v-dialog>
</v-toolbar>
</template>
<
template
#
[`
item
.
index
`
]=
"{ index }"
>
{{
index
+
1
}}
</
template
>
<
template
#
[`
item
.
image
`
]=
"{ item }"
>
<v-img
:src=
"item.image"
width=
"200"
/>
</
template
>
<
template
#
[`
item
.
status
`
]=
"{ item }"
>
<v-switch
v-model=
"item.status"
@
click=
"switchStatus(item)"
/>
</
template
>
<
template
#
[`
item
.
actions
`
]=
"{ item }"
>
<v-icon
:id=
"item.id"
small
@
click=
"dialog=true; editBanner(item)"
>
mdi-pencil
</v-icon>
<v-icon
:id=
"item.id"
small
@
click=
"dialogDelete = true; getID(item)"
>
mdi-delete
</v-icon>
</
template
>
<
template
#no-data
>
<v-btn
color=
"primary"
@
click=
"initialize"
>
Reset
</v-btn>
</
template
>
</v-data-table>
</div>
</v-app>
</template>
<
script
>
export
default
{
layout
:
'
admin
'
,
middleware
:
[
'
web
'
],
data
:
()
=>
{
return
{
headers
:
[
{
text
:
'
#
'
,
align
:
'
start
'
,
value
:
'
index
'
},
{
text
:
'
Image
'
,
value
:
'
image
'
,
groupable
:
false
},
{
text
:
'
Ordering
'
,
value
:
'
ordering
'
,
filterable
:
true
},
{
text
:
'
Status
'
,
value
:
'
status
'
},
{
text
:
'
Actions
'
,
value
:
'
actions
'
,
sortable
:
false
}
],
dialogDelete
:
false
,
dialog
:
false
,
dialog1
:
false
,
image
:
null
,
file
:
null
,
ordering
:
''
,
eImage
:
null
,
eOrdering
:
''
,
banners
:
[],
editedIndex
:
''
,
editedItem
:
{
image
:
null
,
ordering
:
''
,
status
:
''
},
numberRules
:
[
v
=>
!!
v
||
'
This field is required
'
,
v
=>
v
>
0
||
'
value must be a positive integer
'
]
}
},
mounted
()
{
this
.
getBanners
()
},
methods
:
{
getBanners
()
{
this
.
$axios
.
get
(
'
/banners/
'
,
{
headers
:
{
Authorization
:
`Bearer
${
this
.
$auth
.
$storage
.
getUniversal
(
'
token
'
)}
`
}
})
.
then
((
response
)
=>
{
this
.
banners
=
response
.
data
.
data
})
.
catch
(
function
(
error
)
{
console
.
log
(
error
)
})
},
createBanner
()
{
const
self
=
this
const
fd
=
new
FormData
()
fd
.
append
(
'
ordering
'
,
this
.
ordering
)
if
(
this
.
image
!=
null
)
{
fd
.
append
(
'
image
'
,
this
.
image
)
}
this
.
$axios
.
post
(
'
/banners/
'
,
fd
,
{
headers
:
{
Authorization
:
`Bearer
${
this
.
$auth
.
$storage
.
getUniversal
(
'
token
'
)}
`
}
})
.
then
((
response
)
=>
{
self
.
$toast
.
success
(
'
banner created successfully!
'
,
{
duration
:
3000
})
this
.
editedItem
=
response
.
data
.
data
this
.
banners
.
push
(
this
.
editedItem
)
})
.
catch
((
errors
)
=>
{
console
.
log
(
errors
.
response
.
data
.
message
)
this
.
message
=
errors
.
response
.
data
.
message
self
.
$toast
.
error
(
this
.
message
,
{
duration
:
3000
})
})
this
.
clearFile
()
this
.
clearData
()
},
editBanner
(
item
)
{
this
.
eID
=
item
.
id
this
.
editedIndex
=
this
.
banners
.
indexOf
(
item
)
this
.
eImage
=
item
.
image
this
.
eOrdering
=
item
.
ordering
},
updateBanner
()
{
const
self
=
this
const
fd
=
new
FormData
()
fd
.
append
(
'
ordering
'
,
this
.
eOrdering
)
if
(
typeof
this
.
eImage
!==
'
string
'
&&
this
.
eImage
!=
null
)
{
fd
.
append
(
'
image
'
,
this
.
eImage
)
}
this
.
$axios
.
post
(
`banners/update/
${
this
?.
eID
}
`, fd, {
headers: {
Authorization: `
Bearer
$
{
this
.
$auth
.
$storage
.
getUniversal
(
'
token
'
)}
`
}
})
.then((response) => {
self.$toast.success('Category updated successfully!', {
duration: 3000
})
this.editedItem = response.data.data
Object.assign(this.banners[this.editedIndex], this.editedItem)
this.clearFile()
}).catch((errors) => {
this.message = errors.response.data.message
self.$toast.error(this.message, {
duration: 3000
})
})
},
switchStatus (item) {
const status = item.status ? 1 : 0
const self = this
const fd = new FormData()
fd.append('status', status)
this.$axios
.post(`
/
banners
/
update
-
status
/
$
{
item
.
id
}
`,
fd, {
headers: {
Authorization: `
Bearer
$
{
this
.
$auth
.
$storage
.
getUniversal
(
'
token
'
)}
`
}
}
)
.then((response) => {
self.$toast.success('Updated status successfully!', {
duration: 3000
})
})
.catch((error) => {
console.log(error)
self.$toast.error('ERR!', {
duration: 3000
})
})
},
fileSelected (event) {
if (event) {
this.file = URL.createObjectURL(event)
console.log(this.file)
} else {
this.file = null
}
},
clearFile () {
this.file = null
},
clearData () {
this.ordering = ''
this.image = null
},
deleteBanner () {
const self = this
try {
this.$axios
.delete(`
/
banners
/
$
{
this
.
eID
}
`, {
headers: {
Authorization: `
Bearer
$
{
this
.
$auth
.
$storage
.
getUniversal
(
'
token
'
)}
`
}
})
.then((response) => {
self.$toast.success('Category deleted successfully!', {
duration: 3000
})
this.getBanners()
})
} catch (error) {
console.log(error)
}
},
closeDelete () {
this.dialogDelete = false
this.$nextTick(() => {
this.editedItem = Object.assign({}, this.defaultItem)
this.editedIndex = -1
})
},
getID (item) {
this.eID = item.id
this.editedIndex = this.banners.indexOf(item)
}
}
}
</
script
>
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