This commit is contained in:
@jyuhsin
2025-12-22 17:05:23 +08:00
parent 5c75104efd
commit 43913ae3a0
9 changed files with 431 additions and 380 deletions
@@ -30,7 +30,7 @@ public class CspProcessor extends AbstractProcessor {
"style-src * 'unsafe-inline' data:; " + "style-src * 'unsafe-inline' data:; " +
"img-src 'self' data: https:; " + "img-src 'self' data: https:; " +
"font-src * data: https:; " + "font-src * data: https:; " +
"connect-src 'self' https:; " + "connect-src 'self' https: webpack:; " +
"frame-ancestors 'self'; " + "frame-ancestors 'self'; " +
"object-src 'self';"; "object-src 'self';";
@@ -37,6 +37,7 @@ import org.nutz.dao.Cnd;
import org.nutz.dao.Dao; import org.nutz.dao.Dao;
import org.nutz.dao.Sqls; import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql; import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.SqlExpressionGroup;
import org.nutz.ioc.aop.Aop; import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.ioc.loader.annotation.IocBean;
@@ -126,11 +127,14 @@ public class ActivityDeclareMineController {
Cnd cnd = Cnd.NEW(); Cnd cnd = Cnd.NEW();
pageParam.buildSearch(cnd, "info."); pageParam.buildSearch(cnd, "info.");
if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_MEMBER_ADMIN.name())) { if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_MEMBER_ADMIN.name())) {
if (AuthUtil.hasRole(RoleConstant.BRANCH_UNION_CHAIRMAN.name())) { SqlExpressionGroup group = new SqlExpressionGroup();
cnd.and("info.unionId", "=", SecurityUtil.getUnionId()); if (AuthUtil.hasRoleOr(RoleConstant.BRANCH_UNION_CHAIRMAN.name(), RoleConstant.BRANCH_UNION_WENTI_SPORTS.name())) {
} else { group.or("info.unionId", "=", SecurityUtil.getUnionId());
cnd.and("info.userId", "=", SecurityUtil.getUserId());
} }
if (AuthUtil.hasRole(RoleConstant.CLUB_PRESIDENT.name(), RoleConstant.CLUB_OPERATOR.name())) {
group.or("info.userId", "=", SecurityUtil.getUserId());
}
cnd.and(group);
} }
if (StrUtil.isAllBlank(pageParam.getPageOrderName(), pageParam.getPageOrderBy())) { if (StrUtil.isAllBlank(pageParam.getPageOrderName(), pageParam.getPageOrderBy())) {
cnd.desc("info.applyTime"); cnd.desc("info.applyTime");
+21 -18
View File
@@ -67,15 +67,15 @@ layout("/layouts/v4/baseLayout.html"){
} }
.apps-header { .apps-header {
padding: 0 0 20px 0; padding: 0 0 10px 0;
border-bottom: 1px solid #eee; border-bottom: 1px solid #eee;
margin-bottom: 20px; margin-bottom: 10px;
} }
.apps-search-container { .apps-search-container {
display: flex; display: flex;
align-items: center; align-items: center;
margin-bottom: 20px; /*margin-bottom: 20px;*/
} }
.apps-search { .apps-search {
@@ -103,13 +103,16 @@ layout("/layouts/v4/baseLayout.html"){
} }
.apps-filter { .apps-filter {
margin-top: 20px; margin-top: 10px;
display: flex;
align-items: flex-end;
} }
.apps-filter-title { .apps-filter-title {
color: #666; color: #666;
font-size: 14px; font-size: 14px;
margin-bottom: 5px; margin-bottom: 5px;
margin-right: 5px;
} }
.apps-filter-tags { .apps-filter-tags {
@@ -356,20 +359,20 @@ layout("/layouts/v4/baseLayout.html"){
</div> </div>
<!-- 字母过滤 --> <!-- 字母过滤 -->
<!-- <div class="apps-filter">--> <div class="apps-filter">
<!-- <div class="apps-filter-title">首字母:</div>--> <div class="apps-filter-title">首字母:</div>
<!-- <div class="apps-filter-tags alphabet-filter">--> <div class="apps-filter-tags alphabet-filter">
<!-- <div :class="['filter-tag', activeAlphabet === '' ? 'active' : '']" @click="changeAlphabet('')">全部</div>--> <div :class="['filter-tag', activeAlphabet === '' ? 'active' : '']" @click="changeAlphabet('')">全部</div>
<!-- <div--> <div
<!-- v-for="letter in alphabets"--> v-for="letter in alphabets"
<!-- :key="letter"--> :key="letter"
<!-- :class="['alphabet-item', activeAlphabet === letter ? 'active' : '']"--> :class="['alphabet-item', activeAlphabet === letter ? 'active' : '']"
<!-- @click="changeAlphabet(letter)"--> @click="changeAlphabet(letter)"
<!-- >--> >
<!-- {{ letter }}--> {{ letter }}
<!-- </div>--> </div>
<!-- </div>--> </div>
<!-- </div>--> </div>
</div> </div>
<!-- 应用网格 --> <!-- 应用网格 -->
@@ -71,7 +71,7 @@
<script src="https://vxeui.com/umd/xe-utils@3.5.30/dist/xe-utils.umd.min.js"></script> <script src="https://vxeui.com/umd/xe-utils@3.5.30/dist/xe-utils.umd.min.js"></script>
<script src="https://vxeui.com/umd/vxe-pc-ui@3.1.25/lib/index.umd.min.js"></script> <script src="https://vxeui.com/umd/vxe-pc-ui@3.1.25/lib/index.umd.min.js"></script>
<script src="https://vxeui.com/umd/vxe-table@3.9.0/lib/index.umd.min.js"></script> <script src="https://vxeui.com/umd/vxe-table@3.9.0/lib/index.umd.min.js"></script>
l
<!-- 引入 form-create 和 designer --> <!-- 引入 form-create 和 designer -->
<script src="${base!}/assets/platform/plugins/form-create/form-create.min.js"></script> <script src="${base!}/assets/platform/plugins/form-create/form-create.min.js"></script>
<script src="${base!}/assets/platform/plugins/form-create/index.umd.js"></script> <script src="${base!}/assets/platform/plugins/form-create/index.umd.js"></script>
@@ -80,7 +80,7 @@
<script src="${base!}/assets/platform/plugins/swiper/swiper-bundle.js"></script> <script src="${base!}/assets/platform/plugins/swiper/swiper-bundle.js"></script>
<link rel="stylesheet" href="${base!}/assets/platform/plugins/swiper/swiper-bundle.min.css"></link> <link rel="stylesheet" href="${base!}/assets/platform/plugins/swiper/swiper-bundle.min.css"></link>
<!-- <script src="${base!}/assets/platform/plugins/snaker/SnakerflowDesigner.umd.min.js"></script>--> <!--<script src="${base!}/assets/platform/plugins/snaker/SnakerflowDesigner.umd.js"></script>-->
<script src="${base!}/components/plugins/sysDict/DictData.js"></script> <script src="${base!}/components/plugins/sysDict/DictData.js"></script>
<script src="${base!}/assets/platform/js/util/commonUtil.js"></script> <script src="${base!}/assets/platform/js/util/commonUtil.js"></script>
@@ -351,6 +351,16 @@
Vue.prototype.$auth = commonUtil.authService() Vue.prototype.$auth = commonUtil.authService()
Vue.prototype.$axios = commonUtil.axiosService() Vue.prototype.$axios = commonUtil.axiosService()
Vue.prototype.$downLoad = commonUtil.downLoadService Vue.prototype.$downLoad = commonUtil.downLoadService
Vue.prototype.$processStatusMap = {
10: {text: "进行中", class: "doing"},
20: {text: "已完成", class: "finished"},
30: {text: "已撤回", class: "withdraw"},
40: {text: "强行终止", class: "interrupt"},
45: {text: "已拒绝", class: "reject"},
50: {text: "挂起", class: "pending"},
99: {text: "已废弃", class: "abandon"}
}
</script> </script>
<!--vue全局组件--> <!--vue全局组件-->
@@ -676,7 +686,7 @@
</a> </a>
</div> </div>
</header> </header>
<div style="height: 45px"></div> <div style="height: 64px"></div>
<main class="v4-content"> <main class="v4-content">
<!-- 页面内容区域 --> <!-- 页面内容区域 -->
+23 -20
View File
@@ -63,15 +63,15 @@ layout("/layouts/v4/baseLayout.html"){
} }
.apps-header { .apps-header {
padding: 0 0 20px 0; padding: 0 0 10px 0;
border-bottom: 1px solid #eee; border-bottom: 1px solid #eee;
margin-bottom: 20px; margin-bottom: 10px;
} }
.apps-search-container { .apps-search-container {
display: flex; display: flex;
align-items: center; align-items: center;
margin-bottom: 20px; /*margin-bottom: 20px;*/
} }
.apps-search { .apps-search {
@@ -99,13 +99,16 @@ layout("/layouts/v4/baseLayout.html"){
} }
.apps-filter { .apps-filter {
margin-top: 20px; margin-top: 10px;
display: flex;
align-items: flex-end;
} }
.apps-filter-title { .apps-filter-title {
color: #666; color: #666;
font-size: 14px; font-size: 14px;
margin-bottom: 5px; margin-bottom: 5px;
margin-right: 5px;
} }
.apps-filter-tags { .apps-filter-tags {
@@ -351,22 +354,22 @@ layout("/layouts/v4/baseLayout.html"){
</div> </div>
<!-- 字母过滤 --> <!-- 字母过滤 -->
<!-- <div class="apps-filter">--> <div class="apps-filter">
<!-- <div class="apps-filter-title">首字母:</div>--> <div class="apps-filter-title">首字母:</div>
<!-- <div class="apps-filter-tags alphabet-filter">--> <div class="apps-filter-tags alphabet-filter">
<!-- <div :class="['filter-tag', activeAlphabet === '' ? 'active' : '']" @click="changeAlphabet('')">--> <div :class="['filter-tag', activeAlphabet === '' ? 'active' : '']" @click="changeAlphabet('')">
<!-- 全部--> 全部
<!-- </div>--> </div>
<!-- <div--> <div
<!-- v-for="letter in alphabets"--> v-for="letter in alphabets"
<!-- :key="letter"--> :key="letter"
<!-- :class="['alphabet-item', activeAlphabet === letter ? 'active' : '']"--> :class="['alphabet-item', activeAlphabet === letter ? 'active' : '']"
<!-- @click="changeAlphabet(letter)"--> @click="changeAlphabet(letter)"
<!-- >--> >
<!-- {{ letter }}--> {{ letter }}
<!-- </div>--> </div>
<!-- </div>--> </div>
<!-- </div>--> </div>
</div> </div>
<!-- 应用网格 --> <!-- 应用网格 -->
@@ -59,6 +59,10 @@
</head> </head>
<body> <body>
<div id="app" v-cloak> <div id="app" v-cloak>
<van-notice-bar
left-icon="volume-o"
text="请选择完文件后,一次性上传。"
></van-notice-bar>
<h1>文件上传</h1> <h1>文件上传</h1>
<van-uploader <van-uploader
v-model="fileList" v-model="fileList"
@@ -1,6 +1,13 @@
<!--# <!--#
layout("/layouts/platform.html"){ layout("/layouts/platform.html"){
#--> #-->
<style>
.write-dialog .el-dialog__body {
padding: 0;
}
</style>
<div id="app" v-cloak> <div id="app" v-cloak>
<guava ref="guava"> <guava ref="guava">
<el-card shadow="never"> <el-card shadow="never">
@@ -219,8 +226,13 @@ layout("/layouts/platform.html"){
<div style="max-height: 75vh;overflow-y: auto"> <div style="max-height: 75vh;overflow-y: auto">
<formal-write ref="formalWriteRef" :is_read="isRead" :user_id="userId" <formal-write ref="formalWriteRef" :is_read="isRead" :user_id="userId"
:session_id="pageForm.sessionId" :session_id="pageForm.sessionId"
:dialog="true"
@refresh="writeDialog=false;doSearch()"></formal-write> @refresh="writeDialog=false;doSearch()"></formal-write>
</div> </div>
<div slot="footer" class="dialog-footer">
<el-button @click="$refs.formalWriteRef.onSave()">保存草稿</el-button>
<el-button type="primary" @click="$refs.formalWriteRef.onSubmit()">提交信息</el-button>
</div>
</el-dialog> </el-dialog>
</div> </div>
@@ -1,6 +1,6 @@
const write = { const write = {
template: /*language=HTML*/ ` template: /*language=HTML*/ `
<div class="container-x1"> <div class="container-x1" style="padding: 0">
<div class="form-container"> <div class="form-container">
<header class="header-x"> <header class="header-x">
@@ -59,27 +59,26 @@ const write = {
> >
<div class="form-section"> <div class="form-section">
<h3 class="section-title">基本信息</h3> <h3 class="section-title">基本信息</h3>
<div class="form-grid"> <div class="form-grid custom-grid">
<el-row :gutter="20"> <div class="grid-item">
<el-col :span="12">
<el-form-item label="姓名" prop="userName"> <el-form-item label="姓名" prop="userName">
<el-input v-model="formData.userName" readonly></el-input> <el-input v-model="formData.userName" readonly></el-input>
</el-form-item> </el-form-item>
</el-col> </div>
<el-col :span="12"> <div class="grid-item">
<el-form-item label="工号" prop="loginName"> <el-form-item label="工号" prop="loginName">
<el-input v-model="formData.loginName" readonly></el-input> <el-input v-model="formData.loginName" readonly></el-input>
</el-form-item> </el-form-item>
</el-col> </div>
<el-col :span="12"> <div class="grid-item">
<el-form-item label="性别" prop="sex"> <el-form-item label="性别" prop="sex">
<el-radio-group v-model="formData.sex" size="small"> <el-radio-group v-model="formData.sex" size="small">
<el-radio border label="男">男</el-radio> <el-radio border label="男">男</el-radio>
<el-radio border label="女">女</el-radio> <el-radio border label="女">女</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
</el-col> </div>
<el-col :span="12"> <div class="grid-item">
<el-form-item label="出生年月" prop="birthday"> <el-form-item label="出生年月" prop="birthday">
<el-date-picker <el-date-picker
v-model="formData.birthday" v-model="formData.birthday"
@@ -89,21 +88,21 @@ const write = {
style="width: 100%" style="width: 100%"
></el-date-picker> ></el-date-picker>
</el-form-item> </el-form-item>
</el-col> </div>
<el-col :span="12"> <div class="grid-item">
<el-form-item label="民族" prop="nation"> <el-form-item label="民族" prop="nation">
<dict-select v-model="formData.nation" style="width: 100%" <dict-select v-model="formData.nation" style="width: 100%"
placeholder="请选择民族" placeholder="请选择民族"
code="USER_NATION"></dict-select> code="USER_NATION"></dict-select>
</el-form-item> </el-form-item>
</el-col> </div>
<el-col :span="12"> <div class="grid-item">
<el-form-item label="政治面貌" prop="political"> <el-form-item label="政治面貌" prop="political">
<el-input maxlength="100" placeholder="政治面貌" <el-input maxlength="100" placeholder="政治面貌"
v-model="formData.political"></el-input> v-model="formData.political"></el-input>
</el-form-item> </el-form-item>
</el-col> </div>
<el-col :span="12"> <div class="grid-item">
<el-form-item label="所属工会"> <el-form-item label="所属工会">
<el-input <el-input
v-model="formData.unionName" v-model="formData.unionName"
@@ -112,8 +111,8 @@ const write = {
clearable clearable
></el-input> ></el-input>
</el-form-item> </el-form-item>
</el-col> </div>
<el-col :span="12"> <div class="grid-item">
<el-form-item label="所属单位"> <el-form-item label="所属单位">
<el-input <el-input
v-model="formData.unitName" v-model="formData.unitName"
@@ -122,77 +121,70 @@ const write = {
clearable clearable
></el-input> ></el-input>
</el-form-item> </el-form-item>
</el-col> </div>
<el-col :span="12"> <div class="grid-item">
<el-form-item label="职称" prop="professionalTitle"> <el-form-item label="职称" prop="professionalTitle">
<dict-select v-model="formData.professionalTitle" style="width: 100%" <dict-select v-model="formData.professionalTitle" style="width: 100%"
placeholder="请选择职称" placeholder="请选择职称"
code="technical_title_level"></dict-select> code="technical_title_level"></dict-select>
</el-form-item> </el-form-item>
</el-col> </div>
<el-col :span="12"> <div class="grid-item">
<el-form-item label="是否聘用制" prop="employ"> <el-form-item label="是否聘用制" prop="employ">
<el-radio-group v-model="formData.employ" size="small"> <el-radio-group v-model="formData.employ" size="small">
<el-radio border :label="true">是</el-radio> <el-radio border :label="true">是</el-radio>
<el-radio border :label="false">否</el-radio> <el-radio border :label="false">否</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
</el-col> </div>
<el-col :span="12"> <div class="grid-item">
<el-form-item label="是否高级职称" prop="seniorTeacher"> <el-form-item label="是否高级职称" prop="seniorTeacher">
<el-radio-group v-model="formData.seniorTeacher" size="small"> <el-radio-group v-model="formData.seniorTeacher" size="small">
<el-radio border :label="true">是</el-radio> <el-radio border :label="true">是</el-radio>
<el-radio border :label="false">否</el-radio> <el-radio border :label="false">否</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
</div>
</el-col> <div class="grid-item">
<el-col :span="12">
<el-form-item label="是否中级职称及以下" prop="intermediateBelow"> <el-form-item label="是否中级职称及以下" prop="intermediateBelow">
<el-radio-group v-model="formData.intermediateBelow" size="small"> <el-radio-group v-model="formData.intermediateBelow" size="small">
<el-radio border :label="true">是</el-radio> <el-radio border :label="true">是</el-radio>
<el-radio border :label="false">否</el-radio> <el-radio border :label="false">否</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
</el-col> </div>
<el-col :span="12"> <div class="grid-item">
<el-form-item label="是否干部" prop="cadre"> <el-form-item label="是否干部" prop="cadre">
<el-radio-group v-model="formData.cadre" size="small"> <el-radio-group v-model="formData.cadre" size="small">
<el-radio border :label="true">是</el-radio> <el-radio border :label="true">是</el-radio>
<el-radio border :label="false">否</el-radio> <el-radio border :label="false">否</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
</el-col> </div>
<el-col :span="12"> <div class="grid-item">
<el-form-item label="是否工人" prop="worker"> <el-form-item label="是否工人" prop="worker">
<el-radio-group v-model="formData.worker" size="small"> <el-radio-group v-model="formData.worker" size="small">
<el-radio border :label="true">是</el-radio> <el-radio border :label="true">是</el-radio>
<el-radio border :label="false">否</el-radio> <el-radio border :label="false">否</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
</el-col> </div>
<div class="grid-item">
<el-col :span="12">
<el-form-item label="校级领导" prop="schoolLeader"> <el-form-item label="校级领导" prop="schoolLeader">
<el-radio-group v-model="formData.schoolLeader" size="small"> <el-radio-group v-model="formData.schoolLeader" size="small">
<el-radio border :label="true">是</el-radio> <el-radio border :label="true">是</el-radio>
<el-radio border :label="false">否</el-radio> <el-radio border :label="false">否</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
</el-col> </div>
<div class="grid-item">
<el-col :span="12">
<el-form-item label="中层领导" prop="middleLevelLeader"> <el-form-item label="中层领导" prop="middleLevelLeader">
<el-radio-group v-model="formData.middleLevelLeader" size="small"> <el-radio-group v-model="formData.middleLevelLeader" size="small">
<el-radio border :label="true">是</el-radio> <el-radio border :label="true">是</el-radio>
<el-radio border :label="false">否</el-radio> <el-radio border :label="false">否</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
</el-col> </div>
</el-row>
</div> </div>
<div class="form-grid"> <div class="form-grid">
@@ -206,7 +198,7 @@ const write = {
</div> </div>
</div> </div>
<div v-if="formData && ['53ff0c2a-ba93-45e9-a9fd-db51cdab3080','97b0846b-22c6-4d34-9002-a6b67d592944'].includes(formData.taskKey)" <div v-if="!dialog && formData && ['53ff0c2a-ba93-45e9-a9fd-db51cdab3080','97b0846b-22c6-4d34-9002-a6b67d592944'].includes(formData.taskKey)"
class="form-actions"> class="form-actions">
<el-button @click="onSave">保存草稿</el-button> <el-button @click="onSave">保存草稿</el-button>
<el-button type="primary" @click="onSubmit">提交信息</el-button> <el-button type="primary" @click="onSubmit">提交信息</el-button>
@@ -270,7 +262,12 @@ const write = {
type: Boolean, type: Boolean,
required: false, required: false,
default: false default: false
} },
dialog: {
type: Boolean,
required: false,
default: null
},
}, },
data() { data() {
return { return {
@@ -628,6 +625,19 @@ const write = {
::v-deep .hidden { ::v-deep .hidden {
display: none !important; display: none !important;
} }
::v-deep .custom-grid {
display: flex;
flex-wrap: wrap;
gap: 16px;
margin: 0 -8px 16px;
}
::v-deep .grid-item {
flex: 1 1 calc(50% - 16px);
min-width: 200px; /* 防止在窄屏过度压缩 */
padding: 0 8px;
}
` `
} }
@@ -142,8 +142,13 @@ layout("/layouts/platform.html"){
<div style="max-height: 75vh;overflow-y: auto"> <div style="max-height: 75vh;overflow-y: auto">
<formal-write ref="formalWriteRef" :is_read="isRead" :user_id="userId" <formal-write ref="formalWriteRef" :is_read="isRead" :user_id="userId"
:session_id="pageForm.sessionId" :session_id="pageForm.sessionId"
:dialog="true"
@refresh="writeDialog=false;doSearch()"></formal-write> @refresh="writeDialog=false;doSearch()"></formal-write>
</div> </div>
<div slot="footer" class="dialog-footer">
<el-button @click="$refs.formalWriteRef.onSave()">保存草稿</el-button>
<el-button type="primary" @click="$refs.formalWriteRef.onSubmit()">提交信息</el-button>
</div>
</el-dialog> </el-dialog>