@sugarat/easypicker2-client 2.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (145) hide show
  1. package/.env +6 -0
  2. package/.env.production +3 -0
  3. package/.env.test +4 -0
  4. package/.eslintignore +0 -0
  5. package/.eslintrc.json +57 -0
  6. package/.github/workflows/main.yml +61 -0
  7. package/.prettierrc.js +9 -0
  8. package/LICENSE +21 -0
  9. package/README.md +86 -0
  10. package/auto-imports.d.ts +6 -0
  11. package/components.d.ts +56 -0
  12. package/docker/ep_backup/easypicker2.sql +214 -0
  13. package/docker/ep_backup/mongodb/easypicker2/action.bson +0 -0
  14. package/docker/ep_backup/mongodb/easypicker2/action.metadata.json +1 -0
  15. package/docker/ep_backup/mongodb/easypicker2/log.bson +0 -0
  16. package/docker/ep_backup/mongodb/easypicker2/log.metadata.json +1 -0
  17. package/docker/ep_backup/user-config.json +176 -0
  18. package/docs/.env +1 -0
  19. package/docs/.env.production +2 -0
  20. package/docs/.vitepress/config.ts +204 -0
  21. package/docs/.vitepress/theme/bg.png +0 -0
  22. package/docs/.vitepress/theme/index.scss +41 -0
  23. package/docs/.vitepress/theme/index.ts +5 -0
  24. package/docs/author.md +24 -0
  25. package/docs/auto-imports.d.ts +6 -0
  26. package/docs/components.d.ts +17 -0
  27. package/docs/deploy/design/api.md +3 -0
  28. package/docs/deploy/design/db.md +3 -0
  29. package/docs/deploy/design/index.md +3 -0
  30. package/docs/deploy/design/shell.md +9 -0
  31. package/docs/deploy/faq.md +86 -0
  32. package/docs/deploy/index.md +9 -0
  33. package/docs/deploy/local.md +275 -0
  34. package/docs/deploy/online-new.md +610 -0
  35. package/docs/deploy/online.md +683 -0
  36. package/docs/deploy/qiniu.md +183 -0
  37. package/docs/index.md +40 -0
  38. package/docs/introduction/about/code.md +26 -0
  39. package/docs/introduction/about/index.md +33 -0
  40. package/docs/introduction/feature/index.md +3 -0
  41. package/docs/plan/log.md +333 -0
  42. package/docs/plan/todo.md +127 -0
  43. package/docs/plan/wish.md +29 -0
  44. package/docs/praise/index.md +45 -0
  45. package/docs/public/favicon.ico +0 -0
  46. package/docs/public/logo.png +0 -0
  47. package/docs/public/robots.txt +2 -0
  48. package/docs/src/apis/ajax.ts +66 -0
  49. package/docs/src/apis/index.ts +1 -0
  50. package/docs/src/apis/modules/wish.ts +20 -0
  51. package/docs/src/components/Avatar.vue +60 -0
  52. package/docs/src/components/Home.vue +85 -0
  53. package/docs/src/components/Picture.vue +13 -0
  54. package/docs/src/components/Praise.vue +52 -0
  55. package/docs/src/components/WishBtn.vue +98 -0
  56. package/docs/src/components/WishPanel.vue +170 -0
  57. package/docs/src/components/callme/index.vue +72 -0
  58. package/docs/vite.config.ts +42 -0
  59. package/index.html +127 -0
  60. package/package.json +52 -0
  61. package/public/favicon.ico +0 -0
  62. package/public/logo.png +0 -0
  63. package/scripts/deploy/docs.mjs +24 -0
  64. package/scripts/deploy/prod.mjs +24 -0
  65. package/scripts/deploy/test.mjs +26 -0
  66. package/src/@types/ajax.d.ts +5 -0
  67. package/src/@types/api.d.ts +305 -0
  68. package/src/@types/lib.d.ts +26 -0
  69. package/src/@types/page.d.ts +18 -0
  70. package/src/App.vue +36 -0
  71. package/src/apis/ajax.ts +70 -0
  72. package/src/apis/index.ts +20 -0
  73. package/src/apis/modules/action.ts +17 -0
  74. package/src/apis/modules/category.ts +20 -0
  75. package/src/apis/modules/config.ts +19 -0
  76. package/src/apis/modules/file.ts +150 -0
  77. package/src/apis/modules/people.ts +81 -0
  78. package/src/apis/modules/public.ts +49 -0
  79. package/src/apis/modules/super/overview.ts +56 -0
  80. package/src/apis/modules/super/user.ts +62 -0
  81. package/src/apis/modules/task.ts +67 -0
  82. package/src/apis/modules/user.ts +56 -0
  83. package/src/apis/modules/wish.ts +31 -0
  84. package/src/assets/i/EasyPicker.png +0 -0
  85. package/src/assets/logo.png +0 -0
  86. package/src/assets/styles/app.css +69 -0
  87. package/src/components/HomeFooter/index.vue +134 -0
  88. package/src/components/HomeHeader/index.vue +156 -0
  89. package/src/components/InfosForm/index.vue +73 -0
  90. package/src/components/MessageList/index.vue +155 -0
  91. package/src/components/MessagePanel/index.vue +42 -0
  92. package/src/components/Praise/index.vue +102 -0
  93. package/src/components/QrCode.vue +44 -0
  94. package/src/components/linkDialog.vue +104 -0
  95. package/src/components/loginPanel.vue +92 -0
  96. package/src/constants/index.ts +83 -0
  97. package/src/env.d.ts +8 -0
  98. package/src/main.ts +19 -0
  99. package/src/pages/404/index.vue +59 -0
  100. package/src/pages/about/index.vue +152 -0
  101. package/src/pages/callme/index.vue +155 -0
  102. package/src/pages/dashboard/config/index.vue +264 -0
  103. package/src/pages/dashboard/files/index.vue +1152 -0
  104. package/src/pages/dashboard/index.vue +335 -0
  105. package/src/pages/dashboard/manage/config/index.vue +97 -0
  106. package/src/pages/dashboard/manage/index.vue +105 -0
  107. package/src/pages/dashboard/manage/overview/index.vue +488 -0
  108. package/src/pages/dashboard/manage/user/index.vue +679 -0
  109. package/src/pages/dashboard/manage/wish/index.vue +257 -0
  110. package/src/pages/dashboard/tasks/components/CategoryPanel.vue +208 -0
  111. package/src/pages/dashboard/tasks/components/CreateTask.vue +93 -0
  112. package/src/pages/dashboard/tasks/components/TaskInfo.vue +129 -0
  113. package/src/pages/dashboard/tasks/components/infoPanel/ddl.vue +96 -0
  114. package/src/pages/dashboard/tasks/components/infoPanel/file.vue +175 -0
  115. package/src/pages/dashboard/tasks/components/infoPanel/info.vue +477 -0
  116. package/src/pages/dashboard/tasks/components/infoPanel/people.vue +567 -0
  117. package/src/pages/dashboard/tasks/components/infoPanel/template.vue +146 -0
  118. package/src/pages/dashboard/tasks/components/infoPanel/tip.vue +55 -0
  119. package/src/pages/dashboard/tasks/components/infoPanel/tipInfo.vue +196 -0
  120. package/src/pages/dashboard/tasks/index.vue +302 -0
  121. package/src/pages/dashboard/tasks/public.ts +32 -0
  122. package/src/pages/disabled/index.vue +47 -0
  123. package/src/pages/feedback/index.vue +5 -0
  124. package/src/pages/home/index.vue +72 -0
  125. package/src/pages/login/index.vue +270 -0
  126. package/src/pages/register/index.vue +211 -0
  127. package/src/pages/reset/index.vue +186 -0
  128. package/src/pages/task/index.vue +897 -0
  129. package/src/pages/wish/index.vue +152 -0
  130. package/src/router/Interceptor/index.ts +112 -0
  131. package/src/router/index.ts +13 -0
  132. package/src/router/routes/index.ts +197 -0
  133. package/src/shims-vue.d.ts +6 -0
  134. package/src/store/index.ts +17 -0
  135. package/src/store/modules/category.ts +44 -0
  136. package/src/store/modules/public.ts +27 -0
  137. package/src/store/modules/task.ts +55 -0
  138. package/src/store/modules/user.ts +57 -0
  139. package/src/utils/elementUI.ts +8 -0
  140. package/src/utils/networkUtil.ts +236 -0
  141. package/src/utils/other.ts +25 -0
  142. package/src/utils/regExp.ts +11 -0
  143. package/src/utils/stringUtil.ts +242 -0
  144. package/tsconfig.json +24 -0
  145. package/vite.config.ts +55 -0
@@ -0,0 +1,81 @@
1
+ import ajax from '../ajax'
2
+
3
+ function importPeople(
4
+ key: string,
5
+ filename: string,
6
+ type: string
7
+ ): PeopleApiTypes.importPeople {
8
+ return ajax.post(`/people/${key}`, {
9
+ filename,
10
+ type
11
+ })
12
+ }
13
+
14
+ function getPeople(key: string, detail = '0'): PeopleApiTypes.getPeople {
15
+ return ajax.get(`/people/${key}`, {
16
+ params: {
17
+ detail
18
+ }
19
+ })
20
+ }
21
+
22
+ function deletePeople(key: string, id: number): PeopleApiTypes.deletePeople {
23
+ return ajax.delete(`/people/${key}`, {
24
+ params: {
25
+ id
26
+ }
27
+ })
28
+ }
29
+
30
+ function updatePeopleStatus(
31
+ key: string,
32
+ filename: string,
33
+ name: string,
34
+ hash: string
35
+ ): PeopleApiTypes.updatePeopleStatus {
36
+ return ajax.put(`/people/${key}`, {
37
+ filename,
38
+ name,
39
+ hash
40
+ })
41
+ }
42
+
43
+ function checkPeopleIsExist(
44
+ key: string,
45
+ name: string
46
+ ): PeopleApiTypes.checkPeopleIsExist {
47
+ return ajax.post(`/people/check/${key}`, {
48
+ name
49
+ })
50
+ }
51
+
52
+ function getUsefulTemplate(key: string): PeopleApiTypes.getUsefulTemplate {
53
+ return ajax.get(`/people/template/${key}`)
54
+ }
55
+
56
+ function importPeopleFromTpl(
57
+ taskKey: string,
58
+ tplKey: string,
59
+ type: string
60
+ ): PeopleApiTypes.importFromTpl {
61
+ return ajax.put(`/people/template/${taskKey}`, {
62
+ key: tplKey,
63
+ type
64
+ })
65
+ }
66
+
67
+ function addPeopleByUser(name: string, key: string) {
68
+ return ajax.post(`/people/add/${key}`, {
69
+ name
70
+ })
71
+ }
72
+ export default {
73
+ importPeopleFromTpl,
74
+ importPeople,
75
+ getPeople,
76
+ deletePeople,
77
+ updatePeopleStatus,
78
+ checkPeopleIsExist,
79
+ getUsefulTemplate,
80
+ addPeopleByUser
81
+ }
@@ -0,0 +1,49 @@
1
+ import ajax from '../ajax'
2
+
3
+ /**
4
+ * 获取验证码
5
+ * @param mobile 手机号
6
+ */
7
+ function getCode(phone: string): PublicApiTypes.getCode {
8
+ return ajax.get('public/code', {
9
+ params: {
10
+ phone
11
+ }
12
+ })
13
+ }
14
+
15
+ function reportPv(path: string): PublicApiTypes.reportPv {
16
+ return ajax.post<any, BaseResponse>('public/report/pv', {
17
+ path
18
+ })
19
+ }
20
+
21
+ function checkPhone(phone: string): PublicApiTypes.checkPhone {
22
+ return ajax.get<any, BaseResponse>('public/check/phone', {
23
+ params: {
24
+ phone
25
+ }
26
+ })
27
+ }
28
+
29
+ function getTipImageUrl(
30
+ key: string,
31
+ data: {
32
+ uid: number
33
+ name: string
34
+ }[]
35
+ ) {
36
+ return ajax.post<any, BaseResponse<{ cover: string; preview: string }[]>>(
37
+ 'public/tip/image',
38
+ {
39
+ key,
40
+ data
41
+ }
42
+ )
43
+ }
44
+ export default {
45
+ getCode,
46
+ reportPv,
47
+ checkPhone,
48
+ getTipImageUrl
49
+ }
@@ -0,0 +1,56 @@
1
+ import ajax from '../../ajax'
2
+
3
+ const baseUrl = '/super/overview'
4
+ function getCount(): OverviewApiTypes.getCount {
5
+ return ajax.get(`${baseUrl}/count`)
6
+ }
7
+
8
+ function getAllLogMsg(): OverviewApiTypes.getAllLogMsg {
9
+ return ajax.get(`${baseUrl}/log`)
10
+ }
11
+
12
+ function getLogMsg(
13
+ pageSize: number,
14
+ pageIndex: number,
15
+ type: string,
16
+ search: string
17
+ ): OverviewApiTypes.getLogMsg {
18
+ return ajax.post(`${baseUrl}/log`, {
19
+ pageSize,
20
+ pageIndex,
21
+ type,
22
+ search
23
+ })
24
+ }
25
+
26
+ function getLogMsgDetail(id: string): any {
27
+ return ajax.get(`${baseUrl}/log/${id}`)
28
+ }
29
+
30
+ function clearExpiredCompressFile() {
31
+ return ajax.delete(`${baseUrl}/compress`)
32
+ }
33
+
34
+ function checkDisabledRoute(route: string): OverviewApiTypes.disabledStatus {
35
+ return ajax.get(`${baseUrl}/route/disabled`, {
36
+ params: {
37
+ route
38
+ }
39
+ })
40
+ }
41
+
42
+ function addDisabledRoute(route: string, status: boolean) {
43
+ return ajax.post(`${baseUrl}/route/disabled`, {
44
+ route,
45
+ status
46
+ })
47
+ }
48
+ export default {
49
+ getCount,
50
+ getAllLogMsg,
51
+ getLogMsg,
52
+ getLogMsgDetail,
53
+ clearExpiredCompressFile,
54
+ checkDisabledRoute,
55
+ addDisabledRoute
56
+ }
@@ -0,0 +1,62 @@
1
+ import ajax from '../../ajax'
2
+
3
+ const baseUrl = '/super/user'
4
+ function getUserList(): SuperUserApiTypes.getUserList {
5
+ return ajax.get(`${baseUrl}/list`)
6
+ }
7
+
8
+ function updateUserStatus(id: number, status: number, openTime: string) {
9
+ return ajax.put(`${baseUrl}/status`, {
10
+ id,
11
+ status,
12
+ openTime
13
+ })
14
+ }
15
+ function resetPassword(id: number, password: string) {
16
+ return ajax.put(`${baseUrl}/password`, {
17
+ id,
18
+ password
19
+ })
20
+ }
21
+
22
+ function resetPhone(id: number, phone: string, code: string) {
23
+ return ajax.put(`${baseUrl}/phone`, {
24
+ id,
25
+ phone,
26
+ code
27
+ })
28
+ }
29
+
30
+ function clearOssFile(id: number, type: string) {
31
+ return ajax.delete(`${baseUrl}/clear/oss`, {
32
+ params: { id, type }
33
+ })
34
+ }
35
+
36
+ function getMessageList(): SuperUserApiTypes.getMessageList {
37
+ return ajax.get(`${baseUrl}/message`)
38
+ }
39
+
40
+ function readMessage(id: string) {
41
+ return ajax.put(`${baseUrl}/message`, {
42
+ id
43
+ })
44
+ }
45
+
46
+ function sendMessage(text: string, type: number, target?: number) {
47
+ return ajax.post(`${baseUrl}/message`, {
48
+ text,
49
+ type,
50
+ target
51
+ })
52
+ }
53
+ export default {
54
+ getUserList,
55
+ updateUserStatus,
56
+ resetPassword,
57
+ resetPhone,
58
+ clearOssFile,
59
+ getMessageList,
60
+ readMessage,
61
+ sendMessage
62
+ }
@@ -0,0 +1,67 @@
1
+ import ajax from '../ajax'
2
+
3
+ function getList(): TaskApiTypes.getList {
4
+ return ajax.get('task')
5
+ }
6
+
7
+ function create(name: string, category: string): TaskApiTypes.create {
8
+ return ajax.post('task/create', {
9
+ name,
10
+ category
11
+ })
12
+ }
13
+
14
+ function deleteOne(key: string): TaskApiTypes.deleteOne {
15
+ return ajax.delete(`task/${key}`)
16
+ }
17
+
18
+ function updateBaseInfo(
19
+ key: string,
20
+ name: string,
21
+ category: string
22
+ ): TaskApiTypes.updateBaseInfo {
23
+ return ajax.put(`task/${key}`, {
24
+ name,
25
+ category
26
+ })
27
+ }
28
+
29
+ function getTaskInfo(key: string): TaskApiTypes.getTaskInfo {
30
+ return ajax.get(`task/${key}`)
31
+ }
32
+
33
+ function getTaskMoreInfo(key: string): TaskApiTypes.getTaskMoreInfo {
34
+ return ajax.get(`task_info/${key}`)
35
+ }
36
+
37
+ function updateTaskMoreInfo(
38
+ key: string,
39
+ options: TaskApiTypes.TaskInfo
40
+ ): TaskApiTypes.updateTaskMoreInfo {
41
+ return ajax.put(`task_info/${key}`, options)
42
+ }
43
+
44
+ function getUsefulTemplate(key: string): TaskApiTypes.getUsefulTemplate {
45
+ return ajax.get(`/task_info/template/${key}`)
46
+ }
47
+
48
+ function delTipImage(key: string, uid: number, name: string) {
49
+ return ajax.delete(`/task_info/tip/image/${key}`, {
50
+ params: {
51
+ uid,
52
+ name
53
+ }
54
+ })
55
+ }
56
+
57
+ export default {
58
+ getList,
59
+ create,
60
+ deleteOne,
61
+ updateBaseInfo,
62
+ getTaskInfo,
63
+ getTaskMoreInfo,
64
+ updateTaskMoreInfo,
65
+ getUsefulTemplate,
66
+ delTipImage
67
+ }
@@ -0,0 +1,56 @@
1
+ import ajax from '../ajax'
2
+
3
+ function register(
4
+ options: UserApiTypes.RegisterOptions
5
+ ): UserApiTypes.register {
6
+ return ajax.post('user/register', {
7
+ ...options
8
+ })
9
+ }
10
+
11
+ function login(account: string, pwd: string): UserApiTypes.login {
12
+ return ajax.post('user/login', {
13
+ account,
14
+ pwd
15
+ })
16
+ }
17
+
18
+ function codeLogin(phone: string, code: string): UserApiTypes.codeLogin {
19
+ return ajax.post('user/login/code', {
20
+ phone,
21
+ code
22
+ })
23
+ }
24
+
25
+ function resetPwd(
26
+ phone: string,
27
+ code: string,
28
+ pwd: string
29
+ ): UserApiTypes.resetPwd {
30
+ return ajax.put('user/password', {
31
+ phone,
32
+ code,
33
+ pwd
34
+ })
35
+ }
36
+
37
+ function checkPower(): UserApiTypes.checkPower {
38
+ return ajax.get('user/power/super')
39
+ }
40
+
41
+ function checkLoginStatus(): UserApiTypes.checkLoginStatus {
42
+ return ajax.get('user/login')
43
+ }
44
+
45
+ function logout(): UserApiTypes.logout {
46
+ return ajax.get('user/logout')
47
+ }
48
+ export default {
49
+ register,
50
+ login,
51
+ codeLogin,
52
+ resetPwd,
53
+ checkPower,
54
+ checkLoginStatus,
55
+ logout
56
+ }
@@ -0,0 +1,31 @@
1
+ import { WishStatus } from '@/constants'
2
+ import ajax from '../ajax'
3
+
4
+ function addWish(wish: Partial<WishApiTypes.Wish>): WishApiTypes.addWish {
5
+ return ajax.post('/wish/add', wish)
6
+ }
7
+
8
+ function findAllWish(): WishApiTypes.allWishData {
9
+ return ajax.get('/wish/all')
10
+ }
11
+
12
+ function updateWishStatus(
13
+ id: string,
14
+ status: WishStatus
15
+ ): WishApiTypes.updateWish {
16
+ return ajax.put('/wish/update', { id, status })
17
+ }
18
+
19
+ function updateWishDes(
20
+ id: string,
21
+ title: string,
22
+ des: string
23
+ ): WishApiTypes.updateWish {
24
+ return ajax.put(`/wish/update/${id}`, { title, des })
25
+ }
26
+ export default {
27
+ addWish,
28
+ findAllWish,
29
+ updateWishStatus,
30
+ updateWishDes
31
+ }
Binary file
Binary file
@@ -0,0 +1,69 @@
1
+ /* element ui 重写 */
2
+ .el-message__content {
3
+ width: 325px;
4
+ word-break: break-all;
5
+ line-height: 1.5;
6
+ }
7
+ .el-progress {
8
+ margin-top: 0 !important;
9
+ position: static !important;
10
+ }
11
+ .el-progress__text {
12
+ top: 8px !important;
13
+ }
14
+
15
+ .el-dialog {
16
+ max-width: 766px;
17
+ }
18
+
19
+ .el-select-dropdown {
20
+ max-width: 200px;
21
+ }
22
+
23
+ .el-card {
24
+ max-width: 400px;
25
+ }
26
+ @media screen and (max-width: 700px) {
27
+ .el-message-box {
28
+ width: auto;
29
+ max-width: 300px;
30
+ }
31
+ .el-pagination {
32
+ flex-wrap: wrap;
33
+ justify-content: center;
34
+ }
35
+ .el-pagination > * {
36
+ margin-bottom: 10px !important;
37
+ }
38
+ }
39
+
40
+ /* 一些高频公共样式 */
41
+ .flex {
42
+ display: flex;
43
+ }
44
+
45
+ .fc {
46
+ justify-content: center;
47
+ }
48
+
49
+ .fac {
50
+ align-items: center;
51
+ }
52
+
53
+ .tc {
54
+ text-align: center;
55
+ }
56
+ .p10 {
57
+ padding: 10px;
58
+ }
59
+
60
+ .ellipsis {
61
+ text-overflow: ellipsis;
62
+ white-space: nowrap;
63
+ overflow: hidden;
64
+ }
65
+ .ellipsis label {
66
+ text-overflow: ellipsis;
67
+ white-space: nowrap;
68
+ overflow: hidden;
69
+ }
@@ -0,0 +1,134 @@
1
+ <template>
2
+ <div class="footer">
3
+ <ul>
4
+ <li v-for="(item, index) in navList" :key="index">
5
+ <a target="_blank" rel="noopener" v-bind:href="item.link">{{
6
+ item.title
7
+ }}</a>
8
+ </li>
9
+ </ul>
10
+ <p>
11
+ <a
12
+ href="https://docs.ep.sugarat.top/plan/log.html"
13
+ target="_blank"
14
+ rel="noopener"
15
+ >v{{ version }}</a
16
+ >
17
+ © 2019 - {{ currentYear }} by
18
+ <a
19
+ target="_blank"
20
+ rel="noopener"
21
+ href="https://docs.ep.sugarat.top/author.html"
22
+ >粥里有勺糖</a
23
+ >
24
+ </p>
25
+ </div>
26
+ </template>
27
+
28
+ <script lang="ts" setup>
29
+ import { computed } from 'vue'
30
+ import { version } from '../../../package.json'
31
+
32
+ const props = defineProps<{
33
+ type?: 'home' | 'dashboard' | 'task'
34
+ }>()
35
+
36
+ const navList = computed(() => {
37
+ const navMap = {
38
+ home: [
39
+ {
40
+ title: '应用介绍',
41
+ link: 'https://docs.ep.sugarat.top/'
42
+ },
43
+ // {
44
+ // title: 'GitHub',
45
+ // link: 'https://github.com/ATQQ/easypicker2-client'
46
+ // },
47
+ {
48
+ title: '问题反馈',
49
+ link: 'https://support.qq.com/product/444158'
50
+ },
51
+ {
52
+ title: '联系作者',
53
+ link: 'https://docs.ep.sugarat.top/author.html'
54
+ },
55
+ {
56
+ title: '请喝奶茶🧋',
57
+ link: 'https://docs.ep.sugarat.top/praise/index.html'
58
+ }
59
+ ],
60
+ dashboard: [
61
+ {
62
+ title: '页面&功能问题反馈,点这里😊',
63
+ link: 'https://support.qq.com/product/444158'
64
+ }
65
+ ],
66
+ task: [
67
+ {
68
+ title: '页面&功能问题反馈,点这里😊',
69
+ link: 'https://support.qq.com/product/444158'
70
+ }
71
+ ]
72
+ }
73
+
74
+ return navMap[props.type || 'home'] || []
75
+ })
76
+
77
+ const currentYear = new Date().getFullYear()
78
+ const fontColor = computed(() => {
79
+ const colors = {
80
+ home: '#fff',
81
+ dashboard: '#7f7f7f',
82
+ task: '#a4a4a4'
83
+ }
84
+ return colors[props.type || 'home']
85
+ })
86
+
87
+ const shadowColor = computed(() => {
88
+ const colors = {
89
+ home: '#ddd',
90
+ dashboard: '#9b9b9b',
91
+ task: '#d5d5d5'
92
+ }
93
+ return colors[props.type || 'home']
94
+ })
95
+ </script>
96
+
97
+ <style lang="scss" scoped>
98
+ .footer {
99
+ ul {
100
+ margin: 10px auto;
101
+ display: flex;
102
+ justify-content: center;
103
+ li {
104
+ min-width: 80px;
105
+ list-style: none;
106
+ text-align: center;
107
+ a {
108
+ text-align: center;
109
+ color: v-bind(fontColor);
110
+ opacity: 0.8;
111
+ font-size: 1rem;
112
+ line-height: 1rem;
113
+ &:hover {
114
+ opacity: 1;
115
+ text-shadow: 0 0 2px v-bind(shadowColor);
116
+ }
117
+ }
118
+ }
119
+ }
120
+
121
+ p {
122
+ margin-top: 28px;
123
+ padding-bottom: 20px;
124
+ color: v-bind(shadowColor);
125
+ a {
126
+ color: v-bind(shadowColor);
127
+ margin-left: 10px;
128
+ }
129
+ }
130
+ p {
131
+ text-align: center;
132
+ }
133
+ }
134
+ </style>