Skip to content

Commit 396da26

Browse files
committed
Add FeatureWall API and integrate into widget management
1 parent fa5f506 commit 396da26

File tree

11 files changed

+197
-30
lines changed

11 files changed

+197
-30
lines changed

components.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,12 @@ declare module '@vue/runtime-core' {
2323
ElForm: typeof import('element-plus/es')['ElForm']
2424
ElFormItem: typeof import('element-plus/es')['ElFormItem']
2525
ElImage: typeof import('element-plus/es')['ElImage']
26+
ElImageViewer: typeof import('element-plus/es')['ElImageViewer']
2627
ElInput: typeof import('element-plus/es')['ElInput']
2728
ElInputNumber: typeof import('element-plus/es')['ElInputNumber']
2829
ElOption: typeof import('element-plus/es')['ElOption']
2930
ElPopconfirm: typeof import('element-plus/es')['ElPopconfirm']
31+
ElPopover: typeof import('element-plus/es')['ElPopover']
3032
ElRadio: typeof import('element-plus/es')['ElRadio']
3133
ElRadioButton: typeof import('element-plus/es')['ElRadioButton']
3234
ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup']

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
"core-js": "^3.26.1",
3232
"dayjs": "^1.11.6",
3333
"driver.js": "^0.9.8",
34-
"element-plus": "^2.4.3",
34+
"element-plus": "2.9.8",
3535
"localforage": "^1.10.0",
3636
"lodash-es": "^4.17.21",
3737
"lunar-typescript": "^1.7.0",

public/widget.json

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -96,12 +96,12 @@
9696
]
9797
},
9898
{
99-
"name": "cn.widgetjs.widgets.sit_reminder",
99+
"name": "cn.widgetjs.widgets.phone_reminder",
100100
"title": {
101-
"zh-CN": "久坐提醒"
101+
"zh-CN": "来电提醒"
102102
},
103103
"description": {
104-
"zh-CN": "设置间隔,定时提醒,适合长期久坐的人群"
104+
"zh-CN": "用灵动通知加语音,提醒重要事项"
105105
},
106106
"keywords": [
107107
"recommend"
@@ -119,15 +119,15 @@
119119
"movable": true,
120120
"singleton": false,
121121
"resizable": true,
122-
"path": "/widget/sit_reminder",
122+
"path": "/widget/phone_reminder",
123123
"meta": {},
124124
"backgroundThrottling": false,
125-
"previewImage": "/images/preview_sit_reminder.png",
125+
"previewImage": "/images/preview_phone_reminder.png",
126126
"categories": [
127-
"utilities"
127+
"fun"
128128
],
129129
"supportDeployMode": 65536,
130-
"configPagePath": "/widget/config/sit_reminder?frame=true&transparent=false",
130+
"configPagePath": "/widget/config/phone_reminder?frame=true&transparent=false",
131131
"routes": [],
132132
"socialLinks": [
133133
{
@@ -137,12 +137,12 @@
137137
]
138138
},
139139
{
140-
"name": "cn.widgetjs.widgets.phone_reminder",
140+
"name": "cn.widgetjs.widgets.sit_reminder",
141141
"title": {
142-
"zh-CN": "来电提醒"
142+
"zh-CN": "久坐提醒"
143143
},
144144
"description": {
145-
"zh-CN": "用灵动通知加语音,提醒重要事项"
145+
"zh-CN": "设置间隔,定时提醒,适合长期久坐的人群"
146146
},
147147
"keywords": [
148148
"recommend"
@@ -160,15 +160,15 @@
160160
"movable": true,
161161
"singleton": false,
162162
"resizable": true,
163-
"path": "/widget/phone_reminder",
163+
"path": "/widget/sit_reminder",
164164
"meta": {},
165165
"backgroundThrottling": false,
166-
"previewImage": "/images/preview_phone_reminder.png",
166+
"previewImage": "/images/preview_sit_reminder.png",
167167
"categories": [
168-
"fun"
168+
"utilities"
169169
],
170170
"supportDeployMode": 65536,
171-
"configPagePath": "/widget/config/phone_reminder?frame=true&transparent=false",
171+
"configPagePath": "/widget/config/sit_reminder?frame=true&transparent=false",
172172
"routes": [],
173173
"socialLinks": [
174174
{

src/api/FeatureWallApi.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import type { FeatureWall } from '../model/FeatureWall'
2+
import { widgetServerApi } from '@/api/axios'
3+
4+
export class FeatureWallApi {
5+
// 获取所有 FeatureWall
6+
static findAll(): Promise<FeatureWall[]> {
7+
return widgetServerApi.get('/feature/wall')
8+
}
9+
10+
// 点赞 FeatureWall
11+
static like(id: number): Promise<void> {
12+
return widgetServerApi.post(`/feature/wall/${id}/like`)
13+
}
14+
}

src/i18n/default/en.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@
3737
"countdown": "Countdown",
3838
"photo": "Photo",
3939
"debug": "Dev",
40-
"finance": "Finance"
40+
"finance": "Finance",
41+
"wish": "Wish"
4142
},
4243
"manager": {
4344
"remove": "Remove",

src/i18n/default/zh.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@
1919
"countdown": "倒计时",
2020
"finance": "金融",
2121
"photo": "照片",
22-
"debug": "开发组件"
22+
"debug": "开发组件",
23+
"wish": "需求墙"
2324
},
2425
"search": {
2526
"title": "搜索组件",

src/model/FeatureWall.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
export interface FeatureWall {
2+
id: number
3+
title: string
4+
5+
description: string
6+
7+
// 点赞次数
8+
likes: number
9+
10+
// 预览图片
11+
previewImage: string
12+
13+
// 打赏二维码
14+
rewardQRCode: string
15+
16+
createTime: Date
17+
18+
updateTime: Date
19+
}

src/views/add/AddWidgetView.vue

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { useI18n } from 'vue-i18n'
1111
import SearchItem from '@/views/add/SearchItem.vue'
1212
import { WebWidgetApi } from '@/api/WebWidgetApi'
1313
import WidgetTags from '@/views/add/WidgetTags.vue'
14+
import FeatureWallList from '@/views/add/feature/FeatureWallList.vue'
1415
1516
const { t } = useI18n()
1617
const keyword = ref('')
@@ -101,20 +102,26 @@ function goDevPage() {
101102
<WidgetTags v-model="selectedCategory" class="px-4 pt-2" @change="search" />
102103
<el-scrollbar :height="height - 150">
103104
<el-row v-loading="loading" justify="start" class="px-4">
104-
<template v-if="widgets.length == 0 && selectedCategory == 'debug'">
105-
<div class="flex flex-col gap-4 items-center justify-center w-full" style="height: 70vh">
106-
<Code size="48" />
107-
<div>{{ t('search.developerTip') }}</div>
108-
<el-button type="primary" @click="goDevPage">
109-
{{ t('search.devDoc') }}
110-
</el-button>
111-
</div>
105+
<template v-if="selectedCategory == 'wish'">
106+
<FeatureWallList />
112107
</template>
113-
<template v-for="item in widgets" :key="item.name">
114-
<el-col :span="12">
115-
<div class="grid-content ep-bg-purple" />
116-
<SearchItem :key="item.name" :widget="item as WebWidget" />
117-
</el-col>
108+
<template v-else>
109+
<template v-if="widgets.length == 0 && selectedCategory == 'debug'">
110+
<div class="flex flex-col gap-4 items-center justify-center w-full" style="height: 70vh">
111+
<Code size="48" />
112+
<div>{{ t('search.developerTip') }}</div>
113+
<el-button type="primary" @click="goDevPage">
114+
{{ t('search.devDoc') }}
115+
</el-button>
116+
</div>
117+
</template>
118+
119+
<template v-for="item in widgets" :key="item.name">
120+
<el-col :span="12">
121+
<div class="grid-content ep-bg-purple" />
122+
<SearchItem :key="item.name" :widget="item as WebWidget" />
123+
</el-col>
124+
</template>
118125
</template>
119126
</el-row>
120127
</el-scrollbar>

src/views/add/WidgetTags.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ const items = reactive([
1919
{ icon: 'time', labelKey: 'tags.time', value: 'time' },
2020
{ icon: 'finance', labelKey: 'tags.finance', value: 'finance' },
2121
{ icon: 'pic', labelKey: 'tags.photo', value: 'photo' },
22+
{ icon: 'star', labelKey: 'tags.wish', value: 'wish' },
2223
{ icon: 'code', labelKey: 'tags.debug', value: 'debug' },
2324
],
2425
)
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
<script setup lang="ts">
2+
import { onMounted, ref } from 'vue'
3+
import { ElMessage } from 'element-plus'
4+
import { BrowserWindowApi } from '@widget-js/core'
5+
import { FeatureWallApi } from '@/api/FeatureWallApi'
6+
import type { FeatureWall } from '@/model/FeatureWall'
7+
import FeatureWallListItem from '@/views/add/feature/FeatureWallListItem.vue'
8+
9+
const featureWalls = ref<FeatureWall[]>([])
10+
const loading = ref(false)
11+
12+
async function fetchFeatureWalls() {
13+
loading.value = true
14+
try {
15+
featureWalls.value = await FeatureWallApi.findAll()
16+
}
17+
catch (error) {
18+
ElMessage.error('获取数据失败')
19+
}
20+
finally {
21+
loading.value = false
22+
}
23+
}
24+
25+
onMounted(() => {
26+
fetchFeatureWalls()
27+
})
28+
</script>
29+
30+
<template>
31+
<div v-loading="loading" class="flex flex-col gap-4 w-full">
32+
<div class="flex flex-col gap-2 w-full">
33+
<el-card v-for="(item, index) in featureWalls" :key="item.id" shadow="hover">
34+
<FeatureWallListItem v-model="featureWalls[index]" />
35+
</el-card>
36+
</div>
37+
<div class="w-full flex items-center justify-center">
38+
<el-button type="warning" @click="BrowserWindowApi.openUrl('https://faq.widgetjs.cn', { external: true })">
39+
提交你的需求
40+
</el-button>
41+
</div>
42+
</div>
43+
</template>
44+
45+
<style scoped lang="scss">
46+
</style>

0 commit comments

Comments
 (0)