新增 CLAUDE.md 文件以提供项目指导,添加 .claudeignore 文件以排除不必要的文件,更新 pom.xml 版本至 3.9.2,修复多个路径遍历和 SQL 注入漏洞,优化字典翻译切面逻辑,增强文件上传和下载的安全性,新增音频文件类型支持,改进动态数据源的安全校验。
This commit is contained in:
@@ -1,21 +1,29 @@
|
||||
<template>
|
||||
<PageWrapper title="富文本组件示例">
|
||||
<Tinymce v-model="value" @change="handleChange" width="100%" />
|
||||
</PageWrapper>
|
||||
<div :style="{ height: contentHeight, overflowY: 'scroll' }">
|
||||
<PageWrapper title="富文本组件示例">
|
||||
<Tinymce v-model="value" @change="handleChange" width="100%" />
|
||||
<div style="height: 1000px"></div>
|
||||
</PageWrapper>
|
||||
</div>
|
||||
</template>
|
||||
<script lang="ts">
|
||||
import { defineComponent, ref } from 'vue';
|
||||
import { defineComponent, ref, computed } from 'vue';
|
||||
import { Tinymce } from '/@/components/Tinymce/index';
|
||||
import { PageWrapper } from '/@/components/Page';
|
||||
|
||||
import { useLayoutHeight } from '@/layouts/default/content/useContentViewHeight';
|
||||
export default defineComponent({
|
||||
components: { Tinymce, PageWrapper },
|
||||
setup() {
|
||||
const value = ref('hello world!');
|
||||
const { headerHeightRef } = useLayoutHeight();
|
||||
function handleChange(value: string) {
|
||||
console.log(value);
|
||||
}
|
||||
return { handleChange, value };
|
||||
//【issues/9448】
|
||||
const contentHeight = computed(() => {
|
||||
return `calc(100vh - ${headerHeightRef.value}px)`;
|
||||
});
|
||||
return { handleChange, value, contentHeight };
|
||||
},
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -1,5 +1,25 @@
|
||||
<template>
|
||||
<PageWrapper title="Icon组件示例">
|
||||
<PageWrapper title="图标使用示例">
|
||||
<CollapseContainer title="Icon组件中iconfiy图标使用(不推荐使用,项目中所有图标都构建在一个js且首屏就加载,没有分割到chuck中,不是按需引入)" class="my-5">
|
||||
<div class="flex justify-around flex-wrap">
|
||||
<Icon icon="ion:layers-outline" :size="30" />
|
||||
<Icon icon="ion:bar-chart-outline" :size="30" />
|
||||
<Icon icon="ion:tv-outline" :size="30" />
|
||||
<Icon icon="ion:settings-outline" :size="30" />
|
||||
<Icon icon="ion:language" :size="30" />
|
||||
</div>
|
||||
</CollapseContainer>
|
||||
|
||||
<CollapseContainer title="推荐直接使用iconify原生组件(分割到chunk中,按需引入)" class="my-5">
|
||||
<div class="flex justify-around flex-wrap">
|
||||
<IconifyonLayersOutline class="text-30px" />
|
||||
<IconifyIonBarChartOutline class="text-30px" />
|
||||
<IconifyIonTvOutline class="text-30px" />
|
||||
<IconifyIonSettingsOutline class="text-30px" />
|
||||
<IconIonLanguage class="text-30px" />
|
||||
</div>
|
||||
</CollapseContainer>
|
||||
|
||||
<CollapseContainer title="Antv Icon使用 (直接按需引入相应组件即可)">
|
||||
<div class="flex justify-around">
|
||||
<GithubFilled :style="{ fontSize: '30px' }" />
|
||||
@@ -12,15 +32,6 @@
|
||||
</div>
|
||||
</CollapseContainer>
|
||||
|
||||
<CollapseContainer title="IconIfy 组件使用" class="my-5">
|
||||
<div class="flex justify-around flex-wrap">
|
||||
<Icon icon="ion:layers-outline" :size="30" />
|
||||
<Icon icon="ion:bar-chart-outline" :size="30" />
|
||||
<Icon icon="ion:tv-outline" :size="30" />
|
||||
<Icon icon="ion:settings-outline" :size="30" />
|
||||
</div>
|
||||
</CollapseContainer>
|
||||
|
||||
<CollapseContainer title="svg 雪碧图" class="my-5">
|
||||
<div class="flex justify-around flex-wrap">
|
||||
<SvgIcon name="test" size="32" />
|
||||
@@ -68,7 +79,7 @@
|
||||
|
||||
import { openWindow } from '/@/utils';
|
||||
import { PageWrapper } from '/@/components/Page';
|
||||
|
||||
import IconIonLanguage from '~icons/ion/language'
|
||||
export default defineComponent({
|
||||
components: {
|
||||
PageWrapper,
|
||||
@@ -84,6 +95,7 @@
|
||||
Alert,
|
||||
IconPicker,
|
||||
SvgIcon,
|
||||
IconIonLanguage,
|
||||
},
|
||||
setup() {
|
||||
return {
|
||||
|
||||
@@ -46,6 +46,15 @@
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<template #planTimeRangeSlot="{ row, triggerChange }">
|
||||
<a-range-picker
|
||||
:value="row.planTimeRange"
|
||||
value-format="YYYY-MM-DD"
|
||||
:bordered="false"
|
||||
@change="(dates) => triggerChange(dates)"
|
||||
/>
|
||||
</template>
|
||||
|
||||
<template #myAction="props">
|
||||
<a @click="onLookRow(props)">查看</a>
|
||||
<a-divider type="vertical" />
|
||||
@@ -212,6 +221,36 @@
|
||||
customValue: ['Y', 'N'], // true ,false
|
||||
defaultChecked: false,
|
||||
},
|
||||
{
|
||||
title: '预估开始日期 ~ 预估结束日期',
|
||||
key: 'planTimeRange',
|
||||
type: JVxeTypes.slot,
|
||||
width: 280,
|
||||
slotName: 'planTimeRangeSlot',
|
||||
},
|
||||
{
|
||||
title: '自定义树控件',
|
||||
key: 'sel_tree_demo',
|
||||
type: JVxeTypes.treeSelect,
|
||||
width: 200,
|
||||
// dict 格式:表名,文本字段,存储字段
|
||||
dict: 'sys_category,name,id',
|
||||
pidField: 'pid',
|
||||
pidValue: '0',
|
||||
hasChildField: 'has_child',
|
||||
multiple: true,
|
||||
placeholder: '请选择',
|
||||
},
|
||||
{
|
||||
title: '分类字典树',
|
||||
key: 'cat_tree_demo',
|
||||
type: JVxeTypes.catTreeSelect,
|
||||
width: 200,
|
||||
// pcode: 根分类编码,'0' 表示加载所有根节点
|
||||
pcode: 'B01',
|
||||
multiple: true,
|
||||
placeholder: '请选择',
|
||||
},
|
||||
{
|
||||
title: '操作',
|
||||
key: 'action',
|
||||
@@ -261,6 +300,7 @@
|
||||
select_search: options[random(0, 3)],
|
||||
datetime: randomDatetime(),
|
||||
checkbox: ['Y', 'N'][random(0, 1)],
|
||||
planTimeRange: [dayjs().subtract(random(1, 30), 'day').format('YYYY-MM-DD'), dayjs().add(random(1, 30), 'day').format('YYYY-MM-DD')],
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
<li>2. 使用 sortKey 属性可以自定义排序保存的 key,默认为 orderNum。</li>
|
||||
<li>3. 使用 sortBegin 属性可以自定义排序的起始值,默认为 0。</li>
|
||||
<li>4. sortKey 定义的字段不需要定义在 columns 中也能正常获取到值。</li>
|
||||
<li>5. 当存在 fixed 列时,拖拽排序将会失效,仅能上下排序。</li>
|
||||
</ol>
|
||||
|
||||
<p> 以下示例开启了拖拽排序,排序值保存字段为 sortNum,排序起始值为 3<br /> </p>
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
<JPopup
|
||||
v-model:value="model[field]"
|
||||
:formElRef="formElRef"
|
||||
code="ces_app_rep001"
|
||||
code="withparamreport"
|
||||
:param="{ sex: '1' }"
|
||||
:fieldConfig="[{ source: 'name', target: 'pop2' }]"
|
||||
/>
|
||||
@@ -57,6 +57,9 @@
|
||||
<template #superQuery1="{ model, field }">
|
||||
<super-query :config="superQueryConfig" @search="(value)=>handleSuperQuery(value, model, field)" :isCustomSave="true" :saveSearchData="saveSearchData" :save="handleSuperQuerySave"/>
|
||||
</template>
|
||||
<template #tabsSelectUser="{ model, field }">
|
||||
<JTabsSelectUser v-model:value="model[field]" ></JTabsSelectUser>
|
||||
</template>
|
||||
</BasicForm>
|
||||
</template>
|
||||
<script lang="ts">
|
||||
@@ -68,7 +71,7 @@
|
||||
import { schemas } from './jeecgComponents.data';
|
||||
import { usePermission } from '/@/hooks/web/usePermission';
|
||||
import { BasicDragVerify } from '/@/components/Verify';
|
||||
|
||||
import JTabsSelectUser from '/@/components/jeecg/JTabsSelectUser/index.vue';
|
||||
export default defineComponent({
|
||||
components: {
|
||||
BasicForm,
|
||||
@@ -79,6 +82,7 @@
|
||||
JCheckbox,
|
||||
JInput,
|
||||
JEllipsis,
|
||||
JTabsSelectUser,
|
||||
BasicDragVerify,
|
||||
},
|
||||
name: 'JeecgComponents',
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import { FormSchema, JCronValidator } from '/@/components/Form';
|
||||
import { FormSchema } from '/@/components/Form';
|
||||
import JCronValidator from '/@/components/Form/src/jeecg/components/JEasyCron/validator';
|
||||
import { usePermission } from '/@/hooks/web/usePermission';
|
||||
|
||||
const { isDisabledAuth } = usePermission();
|
||||
@@ -935,7 +936,20 @@ export const schemas: FormSchema[] = [
|
||||
label: '选中值',
|
||||
colProps: { span: 12 },
|
||||
},
|
||||
|
||||
{
|
||||
field: 'tabsSelectUser',
|
||||
component: 'Input',
|
||||
label: '用户选择',
|
||||
helpMessage: ['插槽模式-自己保存查询条件'],
|
||||
slot: 'tabsSelectUser',
|
||||
colProps: { span: 14 },
|
||||
},
|
||||
{
|
||||
field: 'tabsSelectUser',
|
||||
component: 'JEllipsis',
|
||||
label: '选中值',
|
||||
colProps: { span: 10 },
|
||||
},
|
||||
{
|
||||
field: 'orderAuth',
|
||||
component: 'Input',
|
||||
@@ -952,5 +966,4 @@ export const schemas: FormSchema[] = [
|
||||
label: '选中值',
|
||||
colProps: { span: 12 },
|
||||
},
|
||||
|
||||
];
|
||||
|
||||
46
jeecgboot-vue3/src/views/demo/vextable/index3.vue
Normal file
46
jeecgboot-vue3/src/views/demo/vextable/index3.vue
Normal file
@@ -0,0 +1,46 @@
|
||||
<template>
|
||||
<a-card :key="key">
|
||||
<div class="container">
|
||||
<p class="title">vxe-table 原生加载示例</p>
|
||||
<template v-if="isRegistered">
|
||||
<vxe-table :align="allAlign" :data="tableData1">
|
||||
<vxe-table-column type="seq" width="60"></vxe-table-column>
|
||||
<vxe-table-column field="name" title="Name"></vxe-table-column>
|
||||
<vxe-table-column field="sex" title="Sex"></vxe-table-column>
|
||||
<vxe-table-column field="age" title="Age"></vxe-table-column>
|
||||
</vxe-table>
|
||||
</template>
|
||||
</div>
|
||||
</a-card>
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
import { ref } from 'vue';
|
||||
import { useVxeTableRegister } from '/@/components/jeecg/JVxeTable/useVxeTableRegister';
|
||||
const allAlign = ref<string | null>(null);
|
||||
const tableData1 = ref([
|
||||
{ id: 10001, name: 'Test1', role: 'Develop', sex: 'Man', age: 28, address: 'vxe-table 从入门到放弃' },
|
||||
{ id: 10002, name: 'Test2', role: 'Test', sex: 'Women', age: 22, address: 'Guangzhou' },
|
||||
{ id: 10003, name: 'Test3', role: 'PM', sex: 'Man', age: 32, address: 'Shanghai' },
|
||||
{ id: 10004, name: 'Test4', role: 'Designer', sex: 'Women', age: 24, address: 'Shanghai' },
|
||||
]);
|
||||
const key = ref(0);
|
||||
const isRegistered = ref(false);
|
||||
useVxeTableRegister().then(() => {
|
||||
console.log('useVxeTableRegister');
|
||||
isRegistered.value = true;
|
||||
// vxetable放在插槽中需要更新key才能重新渲染
|
||||
key.value++;
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="less" scoped>
|
||||
.container {
|
||||
padding: 5px;
|
||||
background-color: #fff;
|
||||
.title {
|
||||
font-size: 16px;
|
||||
font-weight: bold;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -77,13 +77,12 @@
|
||||
<script lang="ts">
|
||||
import { defineComponent, ref, reactive, computed, unref } from 'vue';
|
||||
import { BasicModal, useModalInner } from '/src/components/Modal';
|
||||
import { JVxeTable } from '/src/components/jeecg/JVxeTable';
|
||||
import { columns, columns1 } from './jvxetable.data';
|
||||
import { orderCustomerList, orderTicketList, saveOrUpdate } from './jvxetable.api';
|
||||
import { useJvxeMethod } from '/@/hooks/system/useJvxeMethods.ts';
|
||||
export default defineComponent({
|
||||
name: 'JVexTableModal',
|
||||
components: { BasicModal, JVxeTable },
|
||||
components: { BasicModal },
|
||||
emits: ['success', 'register'],
|
||||
setup(props, { emit }) {
|
||||
const tableH = ref(300);
|
||||
|
||||
Reference in New Issue
Block a user