This commit is contained in:
2026-06-09 15:18:11 +08:00
parent 3c2598715c
commit 21618d6153
11 changed files with 778 additions and 22 deletions
@@ -6,6 +6,7 @@ import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.page.Pagination;
@@ -55,6 +56,28 @@ public class HonorManageController {
}
/**
* 移动端劳模先进展示页入口,用于首页专题卡片跳转。
*/
@At("/h5")
@SaCheckPermission(value = {"honor.manage", "h5.honor.manage"}, mode = SaMode.OR)
@Ok("beetl:/platform/zhghh5/dayofficework/honor/manage/index.html")
public void h5() {
}
/**
* 查询移动端劳模先进展示数据,只返回 H5 页面需要的基础展示字段。
*
* @param pageForm 荣誉筛选和分页参数,H5 默认按当前年份和荣誉类别展示。
* @return 当前年份、当前荣誉类别下的荣誉展示分页数据。
*/
@At
@SaCheckPermission(value = {"honor.manage", "h5.honor.manage"}, mode = SaMode.OR)
public Result h5Data(HonorPageForm pageForm) {
return Result.success(honorViService.listH5ManagePage(pageForm));
}
@At
@SaCheckPermission("honor.manage")
public Result pageData(HonorPageForm pageForm) {
@@ -222,5 +222,10 @@ public class Honor extends BaseModel {
@Comment("附件")
private List<JSONObject> files;
@Column
@ColDefine(type = ColType.MYSQL_JSON)
@Comment("荣誉照片")
private List<JSONObject> photoFiles;
private String loginname;
}
@@ -1,8 +1,10 @@
package com.budwk.app.zhgh.dayofficework.honor.service;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.zhgh.dayofficework.honor.models.Honor;
import com.budwk.app.zhgh.dayofficework.honor.models.HonorBasicSettings;
import com.budwk.app.zhgh.dayofficework.honor.param.HonorPageForm;
import java.util.List;
@@ -15,5 +17,13 @@ import java.util.List;
*/
public interface HonorCommonService extends BaseService<Honor> {
/**
* 查询移动端劳模先进展示数据。
*
* @param pageForm 荣誉筛选和分页参数,未传年份时默认查询当前年份。
* @return 当前筛选条件下的移动端展示分页结果。
*/
Pagination listH5ManagePage(HonorPageForm pageForm);
List<HonorBasicSettings> getHonorBasicSettingsByQueryTypeCode(String queryTypeCode);
}
@@ -1,14 +1,18 @@
package com.budwk.app.zhgh.dayofficework.honor.service.impl;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.zhgh.dayofficework.honor.constant.HonorTypeOrigin;
import com.budwk.app.zhgh.dayofficework.honor.models.Honor;
import com.budwk.app.zhgh.dayofficework.honor.models.HonorBasicSettings;
import com.budwk.app.zhgh.dayofficework.honor.param.HonorPageForm;
import com.budwk.app.zhgh.dayofficework.honor.service.HonorCommonService;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.IocBean;
import java.util.Calendar;
import java.util.List;
/**
@@ -26,6 +30,40 @@ public class HonorCommonServiceImpl extends BaseServiceImpl<Honor> implements Ho
}
/**
* 查询移动端劳模先进展示数据,只返回首页专题页需要的轻量字段。
*
* @param pageForm 荣誉筛选和分页参数,未传年份时默认查询当前年份。
* @return 移动端劳模先进展示分页结果。
*/
@Override
public Pagination listH5ManagePage(HonorPageForm pageForm) {
Sql sql = Sqls.create("""
SELECT
h.id,
h.userName,
h.applyUnionName,
h.unionName,
h.grantDate,
h.photoFiles,
prize.`name` AS prizeName,
type.`name` AS typeName,
type.queryTypeCode AS typeQueryTypeCode
FROM
`honor` h
LEFT JOIN honor_basic_settings prize ON prize.id = h.prize
LEFT JOIN honor_basic_settings type ON type.id = h.honorType
$condition
""");
Cnd cnd = Cnd.NEW();
Integer year = pageForm.getYear() == null ? Calendar.getInstance().get(Calendar.YEAR) : pageForm.getYear();
cnd.andEX("YEAR(h.grantDate)", "=", year);
cnd.andEX("h.honorType", "=", pageForm.getHonorType());
cnd.desc("h.grantDate");
sql.setCondition(cnd);
return listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
}
@Override
public List<HonorBasicSettings> getHonorBasicSettingsByQueryTypeCode(String queryTypeCode) {
HonorBasicSettings basicSettings = dao().fetch(HonorBasicSettings.class, Cnd.where("queryTypeCode", "=", queryTypeCode));
@@ -0,0 +1,2 @@
ALTER TABLE `honor`
ADD COLUMN `photoFiles` JSON NULL COMMENT '荣誉照片' AFTER `files`;
@@ -0,0 +1,51 @@
-- 劳模先进移动端菜单。
-- 手机端接口使用 h5. 前缀权限,便于 H5 角色单独授权。
INSERT INTO sys_menu (id, parentId, path, name, aliasName, type, href, target, icon, showit, disabled, permission, note, location, hasChildren, createdBy, createdAt, updatedBy, updatedAt, delFlag, platform, moduleId, picIcon, initialPinyinName, isRecommendApp, isRecommendService)
SELECT
'c3d7258d2a3540f4a7f0f15a3f6b1001',
'',
LPAD(IFNULL(MAX(CAST(path AS UNSIGNED)), 0) + 1, 4, '0'),
'劳模先进',
'Honor H5',
'menu',
'',
'',
'medal-o',
1,
0,
'h5.honor',
NULL,
992,
1,
'',
UNIX_TIMESTAMP(NOW()) * 1000,
'',
UNIX_TIMESTAMP(NOW()) * 1000,
0,
'H5',
NULL,
'medal-o',
'l',
1,
0
FROM sys_menu
WHERE (parentId = '' OR parentId IS NULL)
AND CHAR_LENGTH(path) = 4
HAVING NOT EXISTS (SELECT 1 FROM (SELECT id FROM sys_menu WHERE permission = 'h5.honor') t);
INSERT INTO sys_menu (id, parentId, path, name, aliasName, type, href, target, icon, showit, disabled, permission, note, location, hasChildren, createdBy, createdAt, updatedBy, updatedAt, delFlag, platform, moduleId, picIcon, initialPinyinName, isRecommendApp, isRecommendService)
SELECT 'c3d7258d2a3540f4a7f0f15a3f6b1002', p.id, CONCAT(p.path, '0001'), '劳模先进', 'Honor Manage H5', 'menu', '/platform/honor/manage/h5', 'data-pjax', '', 1, 0, 'h5.honor.manage', NULL, 1, 0, '', UNIX_TIMESTAMP(NOW()) * 1000, '', UNIX_TIMESTAMP(NOW()) * 1000, 0, 'H5', NULL, 'medal-o', 'l', 1, 0
FROM sys_menu p
WHERE p.permission = 'h5.honor'
AND NOT EXISTS (SELECT 1 FROM (SELECT id FROM sys_menu WHERE permission = 'h5.honor.manage') t);
INSERT INTO sys_role_menu (roleId, menuId)
SELECT r.id, m.id
FROM sys_role r
JOIN sys_menu m ON m.permission IN (
'h5.honor',
'h5.honor.manage'
)
LEFT JOIN sys_role_menu rm ON rm.roleId = r.id AND rm.menuId = m.id
WHERE r.code = 'SYSADMIN'
AND rm.roleId IS NULL;
@@ -120,3 +120,62 @@ JOIN sys_menu m ON m.permission IN (
LEFT JOIN sys_role_menu rm ON rm.roleId = r.id AND rm.menuId = m.id
WHERE r.code = 'SYSADMIN'
AND rm.roleId IS NULL;
-- 普惠疗休养移动端菜单。
-- 手机端接口使用 h5. 前缀权限,保留 PC 权限的同时支持单独分配 H5 角色。
INSERT INTO sys_menu (id, parentId, path, name, aliasName, type, href, target, icon, showit, disabled, permission, note, location, hasChildren, createdBy, createdAt, updatedBy, updatedAt, delFlag, platform, moduleId, picIcon, initialPinyinName, isRecommendApp, isRecommendService)
SELECT
'b7c63f0c73a44a9a8c4f3d3bb1a11001',
'',
LPAD(IFNULL(MAX(CAST(path AS UNSIGNED)), 0) + 1, 4, '0'),
'普惠疗休养',
'Tour H5',
'menu',
'',
'',
'map-marked',
1,
0,
'h5.tour',
NULL,
991,
1,
'',
UNIX_TIMESTAMP(NOW()) * 1000,
'',
UNIX_TIMESTAMP(NOW()) * 1000,
0,
'H5',
NULL,
'map-marked',
'p',
1,
0
FROM sys_menu
WHERE (parentId = '' OR parentId IS NULL)
AND CHAR_LENGTH(path) = 4
HAVING NOT EXISTS (SELECT 1 FROM (SELECT id FROM sys_menu WHERE permission = 'h5.tour') t);
INSERT INTO sys_menu (id, parentId, path, name, aliasName, type, href, target, icon, showit, disabled, permission, note, location, hasChildren, createdBy, createdAt, updatedBy, updatedAt, delFlag, platform, moduleId, picIcon, initialPinyinName, isRecommendApp, isRecommendService)
SELECT 'b7c63f0c73a44a9a8c4f3d3bb1a11002', p.id, CONCAT(p.path, '0001'), '疗休养报名', 'Tour Signup H5', 'menu', '/platform/tour/signup/h5', 'data-pjax', '', 1, 0, 'h5.tour.signup', NULL, 1, 0, '', UNIX_TIMESTAMP(NOW()) * 1000, '', UNIX_TIMESTAMP(NOW()) * 1000, 0, 'H5', NULL, 'guide-o', 'l', 1, 0
FROM sys_menu p
WHERE p.permission = 'h5.tour'
AND NOT EXISTS (SELECT 1 FROM (SELECT id FROM sys_menu WHERE permission = 'h5.tour.signup') t);
INSERT INTO sys_menu (id, parentId, path, name, aliasName, type, href, target, icon, showit, disabled, permission, note, location, hasChildren, createdBy, createdAt, updatedBy, updatedAt, delFlag, platform, moduleId, picIcon, initialPinyinName, isRecommendApp, isRecommendService)
SELECT 'b7c63f0c73a44a9a8c4f3d3bb1a11003', p.id, CONCAT(p.path, '0002'), '我的疗休养', 'My Tour H5', 'menu', '/platform/tour/mysignup/h5', 'data-pjax', '', 1, 0, 'h5.tour.mysignup', NULL, 2, 0, '', UNIX_TIMESTAMP(NOW()) * 1000, '', UNIX_TIMESTAMP(NOW()) * 1000, 0, 'H5', NULL, 'records-o', 'w', 0, 0
FROM sys_menu p
WHERE p.permission = 'h5.tour'
AND NOT EXISTS (SELECT 1 FROM (SELECT id FROM sys_menu WHERE permission = 'h5.tour.mysignup') t);
INSERT INTO sys_role_menu (roleId, menuId)
SELECT r.id, m.id
FROM sys_role r
JOIN sys_menu m ON m.permission IN (
'h5.tour',
'h5.tour.signup',
'h5.tour.mysignup'
)
LEFT JOIN sys_role_menu rm ON rm.roleId = r.id AND rm.menuId = m.id
WHERE r.code = 'SYSADMIN'
AND rm.roleId IS NULL;
@@ -202,12 +202,22 @@ layout("/layouts/platform.html"){
<el-form-item label="获奖材料">{{ viewData.awardMaterialsExcel }}</el-form-item>
</el-col>
</el-row>
<table-tool title="荣誉照片"></table-tool>
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="照片">
<file-preview v-if="viewData.photoFiles&&viewData.photoFiles.length" :files="viewData.photoFiles"
complete_result></file-preview>
<span v-else>暂无</span>
</el-form-item>
</el-col>
</el-row>
<table-tool title="附件"></table-tool>
<el-row :gutter="20">
<el-col :span="24">
<el-form-item prop="user_name" label="附&emsp;&emsp;件">
<file-upload v-if="viewData.files&&viewData.files.length" :files="viewData.files"
:view="true"></file-upload>
<el-form-item prop="user_name" label="附件">
<file-preview v-if="viewData.files&&viewData.files.length" :files="viewData.files"
complete_result></file-preview>
<span v-else>暂无</span>
</el-form-item>
</el-col>
@@ -241,7 +251,7 @@ layout("/layouts/platform.html"){
}
},
components: {
"file-upload": httpVueLoader("/components/plugins/FileUpload.vue")
"file-preview": httpVueLoader("/components/plugins/sysFilePreview/index.vue")
},
methods: {
dropdownCommand(command) {
@@ -255,12 +265,30 @@ layout("/layouts/platform.html"){
}
},
openView(row) {
if (row.files) {
row.files = JSON.parse(row.files)
}
this.viewData = row
const viewRow = Object.assign({}, row)
viewRow.files = this.parseJsonArray(viewRow.files)
viewRow.photoFiles = this.parseJsonArray(viewRow.photoFiles)
this.viewData = viewRow
this.$refs.guava.view()
},
// 荣誉照片和附件可能是 JSON 字符串,详情预览前统一转换为数组。
parseJsonArray(value) {
if (Array.isArray(value)) {
return value
}
if (!value) {
return []
}
if (typeof value === "string") {
try {
const parsed = JSON.parse(value)
return Array.isArray(parsed) ? parsed : []
} catch (e) {
return []
}
}
return []
},
doExport() {
if(!this.pageForm.honorType) {
this.$message.warning("请选择荣誉类型")
@@ -304,7 +332,8 @@ layout("/layouts/platform.html"){
}
},
async getHonorPrize(honorType) {
const res = await this.$axios.post("/platform/honor/basic/settings/getData", {parentId: honorType})
const request = this.$axios.post("/platform/honor/basic/settings/getData", {parentId: honorType})
const res = await request
return res.data
},
getHonorType() {
@@ -267,6 +267,18 @@ layout("/layouts/platform.html"){
</el-form-item>
</el-col>-->
</el-row>
<el-col :span="24">
<el-form-item label="荣誉照片" prop="photoFiles">
<file-upload
:value.sync="formData.photoFiles"
accept=".jpg,.jpeg,.png"
upload_mode="drag"
:upload_number="10"
upload_result_category="array"
complete_result
:upload_size="50 * 1024 * 1024"></file-upload>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="附件" prop="files">
<file-upload card :files.sync="formData.files"
@@ -311,7 +323,8 @@ layout("/layouts/platform.html"){
async userRemoteMethod(query) {
if (query) {
this.userOptions = []
const resp = await this.$axios.post("/platform/honor/registration/listBeComfortedUser", {keyWord: query})
const request = this.$axios.post("/platform/honor/registration/listBeComfortedUser", {keyWord: query})
const resp = await request
this.userOptions = resp.data
}
},
@@ -323,6 +336,7 @@ layout("/layouts/platform.html"){
doSubmit() {
this.formData.awardMaterials = JSON.stringify(this.formData.awardMaterials)
this.formData.files = JSON.stringify(this.formData.files)
this.formData.photoFiles = JSON.stringify(this.formData.photoFiles || [])
this.$axios.post("/platform/honor/registration/doSubmit", this.formData).then((res) => {
if (res.code === 0) {
this.$message.success("操作成功,即将跳转至台账界面")
@@ -354,7 +368,8 @@ layout("/layouts/platform.html"){
this.$set(this.formData, "political", user.political)
},
async getUser(keyWord) {
const resp = await this.$axios.post("/platform/condolence/apply/listBeComfortedUser", {keyWord: keyWord})
const request = this.$axios.post("/platform/condolence/apply/listBeComfortedUser", {keyWord: keyWord})
const resp = await request
return resp.data
},
async honorTypeChange(val) {
@@ -374,23 +389,27 @@ layout("/layouts/platform.html"){
}
},
async getHonorPrize(honorType) {
const res = await this.$axios.post("/platform/honor/basic/settings/getData", {parentId: honorType})
const request = this.$axios.post("/platform/honor/basic/settings/getData", {parentId: honorType})
const res = await request
return res.data
},
async getHonorType() {
const res = await this.$axios.post("/platform/honor/basic/settings/getHonorType")
const request = this.$axios.post("/platform/honor/basic/settings/getHonorType")
const res = await request
if (res.code === 0) {
this.honorTypeList = res.data
}
},
async getHonorLevel() {
const res = await this.$axios.post("/platform/honor/basic/settings/getHonorLevel")
const request = this.$axios.post("/platform/honor/basic/settings/getHonorLevel")
const res = await request
if (res.code === 0) {
this.honorLevelList = res.data
}
},
async getHonorAwardType() {
const res = await this.$axios.post("/platform/honor/basic/settings/getHonorAwardType")
const request = this.$axios.post("/platform/honor/basic/settings/getHonorAwardType")
const res = await request
if (res.code === 0) {
this.honorAwardList = res.data
}
@@ -403,10 +422,32 @@ layout("/layouts/platform.html"){
}
})
},
// 荣誉照片和附件字段可能由后台以 JSON 字符串返回,统一转换为上传组件需要的数组。
normalizeJsonArray(value) {
if (Array.isArray(value)) {
return value
}
if (!value) {
return []
}
if (typeof value === "string") {
try {
const parsed = JSON.parse(value)
return Array.isArray(parsed) ? parsed : []
} catch (e) {
return []
}
}
return []
},
async findData(id) {
const resp = await this.$axios.post(loc() + "/findData", {id: id})
const request = this.$axios.post(loc() + "/findData", {id: id})
const resp = await request
const data1 = resp.data
this.formData = resp.data
this.$set(this.formData, "awardMaterials", this.normalizeJsonArray(this.formData.awardMaterials))
this.$set(this.formData, "files", this.normalizeJsonArray(this.formData.files))
this.$set(this.formData, "photoFiles", this.normalizeJsonArray(this.formData.photoFiles))
if (this.formData.userId && this.formData.userId !== "") {
await this.userRemoteMethod(this.formData.userName)
} else {
@@ -441,7 +482,10 @@ layout("/layouts/platform.html"){
if (this.honorTypeList && this.honorTypeList.length > 0) {
this.formData = {
honorType: this.honorTypeList[0].id,
queryTypeCode: this.honorTypeList[0].queryTypeCode
queryTypeCode: this.honorTypeList[0].queryTypeCode,
awardMaterials: [],
files: [],
photoFiles: []
}
this.honorPrizeList = await this.getHonorPrize(this.formData.honorType)
}
@@ -0,0 +1,495 @@
<!--#
layout("/layouts/platform_h5.html"){
#-->
<div id="app" v-cloak>
<div class="honor-showcase">
<van-nav-bar
title="劳模先进"
left-text="返回"
left-arrow
fixed
placeholder
@click-left="goBack"
></van-nav-bar>
<div class="honor-tabs">
<button
type="button"
class="honor-tab"
:class="{ active: activeTab === 'labor' }"
@click="switchTab('labor')">
劳模风采
</button>
<button
type="button"
class="honor-tab"
:class="{ active: activeTab === 'studio' }"
@click="switchTab('studio')">
创新工作室
</button>
</div>
<section class="honor-intro">
<div class="honor-intro__corner honor-intro__corner--left"></div>
<div class="honor-intro__corner honor-intro__corner--right"></div>
<p>一份坚守,淬炼出奋斗的生命价值;一份专注,迸发不断创新的发展动力。</p>
<p>他们扎根岗位、追求卓越,以实干书写担当,用匠心点亮前行方向。</p>
<p>致敬劳模先进,礼赞奋斗精神。</p>
</section>
<van-loading v-if="loading" class="honor-loading" color="#fff">加载中...</van-loading>
<div v-else class="honor-list">
<article v-for="item in honorList" :key="item.id" class="honor-card">
<div class="honor-card__image-wrap">
<img v-if="item.cover" class="honor-card__image" :src="item.cover" alt="">
<div v-else class="honor-card__placeholder">
<div class="honor-card__placeholder-title">{{ getDisplayName(item) }}</div>
<div class="honor-card__placeholder-sub">劳模先进</div>
</div>
<div class="honor-card__name">{{ getDisplayName(item) }}</div>
</div>
<div class="honor-card__body">
<div class="honor-card__gold-line"></div>
<div class="honor-card__prize">《{{ item.prizeName || '荣誉奖项' }}》</div>
<div class="honor-card__date" v-if="item.grantDate">授予时间:{{ item.grantDate }}</div>
</div>
</article>
<van-empty v-if="honorList.length === 0" image="search" description="暂无当年荣誉"></van-empty>
</div>
</div>
</div>
<script nonce="${cspNonce!}">
new Vue({
el: "#app",
data: function () {
return {
activeTab: "labor",
currentYear: new Date().getFullYear(),
honorTypeList: [],
honorTypeMap: {
labor: null,
studio: null
},
honorList: [],
loading: false
}
},
methods: {
goBack: function () {
this.returnHome()
},
returnHome: function () {
if (window.store && typeof window.store.commit === "function") {
window.store.commit("setActiveTarBar", "home")
}
if (!window.$ || !$.support || !$.support.pjax) {
window.location.replace("/platform/h5/home")
return
}
var fallbackTimer = window.setTimeout(function () {
window.location.replace("/platform/h5/home")
}, 1200)
$(document).one("pjax:complete", function () {
window.clearTimeout(fallbackTimer)
})
$(document).one("pjax:error pjax:timeout", function () {
window.clearTimeout(fallbackTimer)
window.location.replace("/platform/h5/home")
})
$.pjax({
url: "/platform/h5/home",
container: "#container",
fragment: "#container",
push: false,
replace: true,
timeout: 8000
})
},
switchTab: function (tab) {
if (this.activeTab === tab) {
return
}
this.activeTab = tab
this.listHonor()
},
getDisplayName: function (item) {
if (this.activeTab === "studio") {
return item.applyUnionName || item.unionName || item.userName || "创新工作室"
}
return item.userName || item.applyUnionName || item.unionName || "劳模先进"
},
getHonorTypes: function () {
var self = this
return this.$axios.post("/platform/honor/basic/settings/getHonorType").then(function (res) {
if (res.code === 0) {
self.honorTypeList = res.data || []
self.honorTypeMap.labor = self.findHonorType("HONOR_SINGLE", "个人荣誉")
self.honorTypeMap.studio = self.findHonorType("HONOR_LIST", "集体荣誉")
}
})
},
findHonorType: function (queryTypeCode, name) {
var target = this.honorTypeList.find(function (item) {
return item.queryTypeCode === queryTypeCode
})
if (!target) {
target = this.honorTypeList.find(function (item) {
return item.name === name
})
}
return target || null
},
listHonor: function () {
var self = this
var type = this.activeTab === "studio" ? this.honorTypeMap.studio : this.honorTypeMap.labor
if (!type) {
this.honorList = []
return
}
this.loading = true
this.$axios.post("/platform/honor/manage/h5Data", {
year: this.currentYear,
honorType: type.id,
pageNumber: 1,
pageSize: 50
}).then(function (res) {
if (res.code === 0) {
var list = (res.data && res.data.list) || []
self.honorList = list.map(function (item) {
item.cover = ""
item.photoId = self.getFirstPhotoId(item.photoFiles)
return item
})
self.loadPhotoMap()
} else {
self.honorList = []
}
}).finally(function () {
self.loading = false
})
},
getFirstPhotoId: function (photoFiles) {
var files = []
if (Array.isArray(photoFiles)) {
files = photoFiles
} else if (photoFiles) {
try {
files = JSON.parse(photoFiles)
} catch (e) {
files = []
}
}
if (!files.length) {
return ""
}
var first = files[0]
var data = first && first.response ? first.response.data : first
if (!data) {
return ""
}
data = String(data)
return data.indexOf("=") > -1 ? data.substring(data.lastIndexOf("=") + 1) : data
},
loadPhotoMap: function () {
var self = this
var ids = this.honorList.map(function (item) {
return item.photoId
}).filter(function (id) {
return !!id
})
if (!ids.length) {
return
}
this.$axios.post("/platform/sys/file/previewFileData", { ids: JSON.stringify(ids) }).then(function (res) {
if (res.code !== 0) {
return
}
var fileMap = {}
;(res.data || []).forEach(function (file) {
fileMap[file.id] = file.thumbnail || file.downloadPath || ""
})
self.honorList = self.honorList.map(function (item) {
item.cover = fileMap[item.photoId] || ""
return item
})
})
}
},
created: function () {
var self = this
this.getHonorTypes().then(function () {
self.listHonor()
})
}
})
</script>
<style>
body {
background: #c80019;
}
.honor-showcase {
min-height: 100vh;
padding: 0 14px 28px;
box-sizing: border-box;
background:
radial-gradient(circle at 50% 0, rgba(255, 113, 89, .42) 0, rgba(255, 113, 89, 0) 32%),
linear-gradient(180deg, #d6001c 0%, #bd0018 56%, #a90016 100%);
color: #fff;
}
.honor-showcase /deep/ .van-nav-bar {
background: #fff;
}
.honor-showcase /deep/ .van-nav-bar__title {
color: #20242a;
font-weight: 700;
}
.honor-showcase /deep/ .van-nav-bar .van-icon,
.honor-showcase /deep/ .van-nav-bar__text {
color: #1989fa;
}
.honor-showcase /deep/ .van-hairline--bottom::after {
border-color: #eef1f6;
}
.honor-tabs {
display: flex;
justify-content: space-around;
align-items: center;
height: 76px;
}
.honor-tab {
position: relative;
border: 0;
background: transparent;
color: rgba(255, 247, 220, .76);
font-size: 19px;
font-weight: 700;
line-height: 28px;
padding: 0 8px 14px;
outline: none;
}
.honor-tab.active {
color: #fff6d9;
}
.honor-tab.active::after {
content: "";
position: absolute;
left: 50%;
bottom: 4px;
width: 38px;
height: 5px;
border-radius: 999px;
background: #ffe6a3;
transform: translateX(-50%);
box-shadow: 0 2px 8px rgba(255, 230, 163, .38);
}
.honor-intro {
position: relative;
margin-bottom: 18px;
padding: 20px 20px 46px;
border-radius: 8px;
overflow: hidden;
color: #ffe9bd;
background:
linear-gradient(165deg, rgba(255, 255, 255, .12), rgba(255, 255, 255, 0) 46%),
linear-gradient(180deg, #d73535 0%, #c9262f 100%);
box-shadow: 0 10px 22px rgba(90, 0, 8, .22);
}
.honor-intro::before,
.honor-intro::after {
content: "";
position: absolute;
left: -30px;
right: -30px;
height: 58px;
border: 5px solid rgba(255, 223, 151, .86);
border-top: 0;
border-radius: 0 0 50% 50%;
pointer-events: none;
}
.honor-intro::before {
bottom: 14px;
transform: rotate(-2deg);
}
.honor-intro::after {
bottom: -12px;
opacity: .75;
transform: rotate(2deg);
}
.honor-intro p {
position: relative;
z-index: 1;
margin: 0 0 9px;
font-size: 14px;
line-height: 24px;
}
.honor-intro p:last-child {
margin-bottom: 0;
}
.honor-intro__corner {
position: absolute;
top: 14px;
width: 24px;
height: 24px;
border-top: 3px solid rgba(255, 224, 161, .82);
}
.honor-intro__corner--left {
left: 14px;
border-left: 3px solid rgba(255, 224, 161, .82);
}
.honor-intro__corner--right {
right: 14px;
border-right: 3px solid rgba(255, 224, 161, .82);
}
.honor-loading {
margin-top: 36px;
text-align: center;
}
.honor-list {
padding-bottom: 8px;
}
.honor-card {
margin-bottom: 18px;
border-radius: 8px;
overflow: hidden;
background: #be0018;
box-shadow: 0 10px 22px rgba(83, 0, 9, .28);
}
.honor-card__image-wrap {
position: relative;
height: 206px;
overflow: hidden;
background: #e6b06d;
}
.honor-card__image {
display: block;
width: 100%;
height: 100%;
object-fit: cover;
}
.honor-card__placeholder {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
color: #fff5d8;
background:
radial-gradient(circle at 78% 30%, rgba(255, 221, 148, .36), rgba(255, 221, 148, 0) 26%),
linear-gradient(140deg, #d93a31 0%, #b60018 100%);
}
.honor-card__placeholder-title {
font-size: 24px;
font-weight: 700;
}
.honor-card__placeholder-sub {
margin-top: 10px;
font-size: 14px;
letter-spacing: 0;
color: rgba(255, 245, 216, .82);
}
.honor-card__image-wrap::after {
content: "";
position: absolute;
left: 0;
right: 0;
bottom: 0;
height: 58px;
background: linear-gradient(165deg, rgba(177, 0, 24, .86) 0%, rgba(177, 0, 24, .74) 62%, rgba(177, 0, 24, .1) 63%);
}
.honor-card__name {
position: absolute;
left: 20px;
bottom: 16px;
z-index: 1;
color: #fff;
font-size: 22px;
line-height: 28px;
font-weight: 800;
text-shadow: 0 2px 8px rgba(89, 0, 12, .32);
}
.honor-card__body {
position: relative;
min-height: 82px;
padding: 22px 20px 20px;
box-sizing: border-box;
color: #ffe5ad;
background:
radial-gradient(circle at 92% 14%, rgba(255, 230, 168, .4), rgba(255, 230, 168, 0) 16%),
#be0018;
}
.honor-card__body::after {
content: "★";
position: absolute;
right: 18px;
top: -20px;
color: #ffd886;
font-size: 42px;
text-shadow: 0 3px 8px rgba(85, 0, 9, .28);
transform: rotate(-12deg);
}
.honor-card__gold-line {
width: 44px;
height: 3px;
border-radius: 999px;
background: #e7b13c;
margin-bottom: 12px;
}
.honor-card__prize {
font-size: 15px;
line-height: 22px;
font-weight: 700;
color: #ffe5ad;
}
.honor-card__date {
margin-top: 5px;
font-size: 12px;
line-height: 18px;
color: rgba(255, 229, 173, .72);
}
.honor-showcase /deep/ .van-empty__description {
color: rgba(255, 255, 255, .78);
}
</style>
<!--#
}
#-->
@@ -145,14 +145,14 @@ const home = {
desc: "先进风采展示",
icon: "medal-o",
className: "feature-card--model",
href: ""
href: "/platform/honor/manage/h5"
},
{
name: "普惠信息",
desc: "普惠服务信息",
name: "普惠疗休养",
desc: "疗休养报名服务",
icon: "bullhorn-o",
className: "feature-card--inclusive",
href: ""
href: "/platform/tour/signup/h5"
}
],
appLogo: "",