1
This commit is contained in:
+23
@@ -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);
|
||||
}
|
||||
|
||||
+39
-1
@@ -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="附  件">
|
||||
<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: "",
|
||||
|
||||
Reference in New Issue
Block a user