diff --git a/.gitignore b/.gitignore index ca1015e..a0b9717 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,4 @@ pnpm-debug.log* /os_del.cmd /.vscode/ /.history/ +/svn clear.bat diff --git a/package.json b/package.json index 80d006e..2817516 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "jeecgboot-vue3", - "version": "1.2.0", + "version": "1.3.0", "author": { "name": "jeecg", "email": "jeecgos@163.com", @@ -36,11 +36,12 @@ "dependencies": { "@jeecg/online": "1.0.1", "@iconify/iconify": "^2.0.4", - "@fullcalendar/core": "^5.10.1", - "@fullcalendar/daygrid": "^5.10.1", - "@fullcalendar/interaction": "^5.10.1", - "@fullcalendar/timegrid": "^5.10.1", - "@fullcalendar/vue3": "^5.10.1", + "@fullcalendar/core": "5.10.1", + "@fullcalendar/daygrid": "5.10.1", + "@fullcalendar/interaction": "5.10.1", + "@fullcalendar/resource-timeline": "5.10.1", + "@fullcalendar/timegrid": "5.10.1", + "@fullcalendar/vue3": "5.10.1", "@vueuse/core": "^6.6.2", "@zxcvbn-ts/core": "^1.0.0-beta.0", "ant-design-vue": "2.2.8", @@ -66,6 +67,7 @@ "path-to-regexp": "^6.2.0", "pinia": "2.0.0-rc.14", "print-js": "^1.6.0", + "qiankun": "^2.5.1", "qrcode": "^1.4.4", "qrcodejs2": "0.0.2", "resize-observer-polyfill": "^1.5.1", @@ -81,12 +83,11 @@ "vue-print-nb-jeecg": "^1.0.10", "vue-router": "^4.0.12", "vue-types": "^4.1.1", + "vuedraggable": "^4.1.0", "vxe-table": "4.1.0", "vxe-table-plugin-antd": "^3.0.3", "xe-utils": "^3.3.1", "xlsx": "^0.17.3", - "qiankun": "^2.5.1", - "vuedraggable": "^4.1.0", "vue-json-pretty": "^2.0.4" }, "devDependencies": { @@ -291,6 +292,7 @@ "vue-print-nb-jeecg/src/printarea", "vue-router", "vue-types", + "vuedraggable", "vxe-table", "vxe-table-plugin-antd", "xe-utils", diff --git a/prettier.config.js b/prettier.config.js index 4a88a0c..bd6a55b 100644 --- a/prettier.config.js +++ b/prettier.config.js @@ -8,6 +8,7 @@ module.exports = { quoteProps: 'as-needed', bracketSpacing: true, trailingComma: 'es5', + jsxBracketSameLine: false, jsxSingleQuote: false, arrowParens: 'always', insertPragma: false, diff --git a/src/api/common/api.ts b/src/api/common/api.ts index 5dfebb1..1e90d11 100644 --- a/src/api/common/api.ts +++ b/src/api/common/api.ts @@ -1,4 +1,5 @@ import { defHttp } from '/@/utils/http/axios'; +import { message } from 'ant-design-vue'; import { useGlobSetting } from '/@/hooks/setting'; const globSetting = useGlobSetting(); const baseUploadUrl = globSetting.uploadUrl; @@ -95,3 +96,48 @@ export const loadCategoryData = (params) => { export const uploadFile = (params, success) => { return defHttp.uploadFile({ url: uploadUrl }, params, { success }); }; +/** + * 下载文件 + * @param url 文件路径 + * @param fileName 文件名 + * @param parameter + * @returns {*} + */ +export const downloadFile = (url, fileName?, parameter?) => { + return getFileblob(url, parameter).then((data) => { + if (!data || data.size === 0) { + message.warning('文件下载失败'); + return; + } + if (typeof window.navigator.msSaveBlob !== 'undefined') { + window.navigator.msSaveBlob(new Blob([data]), fileName); + } else { + let url = window.URL.createObjectURL(new Blob([data])); + let link = document.createElement('a'); + link.style.display = 'none'; + link.href = url; + link.setAttribute('download', fileName); + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); //下载完成移除元素 + window.URL.revokeObjectURL(url); //释放掉blob对象 + } + }); +}; + +/** + * 下载文件 用于excel导出 + * @param url + * @param parameter + * @returns {*} + */ +export const getFileblob = (url, parameter) => { + return defHttp.get( + { + url: url, + params: parameter, + responseType: 'blob', + }, + { isTransformResponse: false } + ); +}; diff --git a/src/api/sys/user.ts b/src/api/sys/user.ts index a152f8d..60554d3 100644 --- a/src/api/sys/user.ts +++ b/src/api/sys/user.ts @@ -80,7 +80,7 @@ export function phoneLoginApi(params: LoginParams, mode: ErrorMessageMode = 'mod export function getUserInfo() { return defHttp.get({ url: Api.GetUserInfo }, { errorMessageMode: 'none' }).catch((e) => { // update-begin--author:zyf---date:20220425---for:【VUEN-76】捕获接口超时异常,跳转到登录界面 - if (e && e.message.includes('timeout')) { + if (e && (e.message.includes('timeout') || e.message.includes('401'))) { //接口不通时跳转到登录界面 const userStore = useUserStoreWithOut(); userStore.setToken(''); diff --git a/src/assets/images/panel_cover.png b/src/assets/images/panel_cover.png new file mode 100644 index 0000000..faf0065 Binary files /dev/null and b/src/assets/images/panel_cover.png differ diff --git a/src/components/Button/index.ts b/src/components/Button/index.ts index 677700a..71bd2e4 100644 --- a/src/components/Button/index.ts +++ b/src/components/Button/index.ts @@ -1,11 +1,11 @@ import { withInstall } from '/@/utils'; import type { ExtractPropTypes } from 'vue'; import button from './src/BasicButton.vue'; -import uploadButton from './src/UploadButton.vue'; +import jUploadButton from './src/JUploadButton.vue'; import popConfirmButton from './src/PopConfirmButton.vue'; import { buttonProps } from './src/props'; export const Button = withInstall(button); -export const UploadButton = withInstall(uploadButton); +export const JUploadButton = withInstall(jUploadButton); export const PopConfirmButton = withInstall(popConfirmButton); export declare type ButtonProps = Partial>; diff --git a/src/components/Button/src/JUploadButton.vue b/src/components/Button/src/JUploadButton.vue new file mode 100644 index 0000000..ec0df2c --- /dev/null +++ b/src/components/Button/src/JUploadButton.vue @@ -0,0 +1,41 @@ + + + + diff --git a/src/components/Button/src/props.ts b/src/components/Button/src/props.ts index 8e1b254..b5026d6 100644 --- a/src/components/Button/src/props.ts +++ b/src/components/Button/src/props.ts @@ -13,9 +13,9 @@ export const buttonProps = { type: { type: String }, /** * preIcon and postIcon icon size. - * @default: 14 + * @default: 15 */ - iconSize: { type: Number, default: 14 }, + iconSize: { type: Number, default: 15 }, isUpload: { type: Boolean, default: false }, onClick: { type: Function as PropType<(...args) => any>, default: null }, }; diff --git a/src/components/Cropper/src/CopperModal.vue b/src/components/Cropper/src/CopperModal.vue index 46c34b6..851c68f 100644 --- a/src/components/Cropper/src/CopperModal.vue +++ b/src/components/Cropper/src/CopperModal.vue @@ -129,7 +129,10 @@ try { setModalProps({ confirmLoading: true }); const result = await uploadApi({ name: 'file', file: blob, filename }); - emit('uploadSuccess', { source: previewSource.value, data: result.data || result.message }); + emit('uploadSuccess', { + source: previewSource.value, + data: result.data || result.message, + }); closeModal(); } finally { setModalProps({ confirmLoading: false }); diff --git a/src/components/Form/src/BasicForm.vue b/src/components/Form/src/BasicForm.vue index 94fc13f..0df3c3b 100644 --- a/src/components/Form/src/BasicForm.vue +++ b/src/components/Form/src/BasicForm.vue @@ -233,6 +233,7 @@ updateSchema, resetSchema, setProps, + getProps, removeSchemaByFiled, appendSchemaByField, clearValidate, diff --git a/src/components/Form/src/componentMap.ts b/src/components/Form/src/componentMap.ts index 2ee9616..75a0c36 100644 --- a/src/components/Form/src/componentMap.ts +++ b/src/components/Form/src/componentMap.ts @@ -42,7 +42,6 @@ import JUpload from './jeecg/components/JUpload/JUpload.vue'; import JSearchSelect from './jeecg/components/JSearchSelect.vue'; import JAddInput from './jeecg/components/JAddInput.vue'; import { Time } from '/@/components/Time'; -import JOnlineSelectCascade from './jeecg/components/JOnlineSelectCascade.vue'; import JRangeNumber from './jeecg/components/JRangeNumber.vue'; const componentMap = new Map(); @@ -110,7 +109,6 @@ componentMap.set('JSelectUserByDept', JSelectUserByDept); componentMap.set('JUpload', JUpload); componentMap.set('JSearchSelect', JSearchSelect); componentMap.set('JAddInput', JAddInput); -componentMap.set('JOnlineSelectCascade', JOnlineSelectCascade); componentMap.set('JRangeNumber', JRangeNumber); export function add(compName: ComponentType, component: Component) { diff --git a/src/components/Form/src/components/FormAction.vue b/src/components/Form/src/components/FormAction.vue index 20c7201..4f7e721 100644 --- a/src/components/Form/src/components/FormAction.vue +++ b/src/components/Form/src/components/FormAction.vue @@ -5,13 +5,11 @@ @@ -89,6 +87,7 @@ return Object.assign( { text: t('common.resetText'), + preIcon: 'ic:baseline-restart-alt', }, props.resetButtonOptions ); @@ -96,8 +95,10 @@ const getSubmitBtnOptions = computed(() => { return Object.assign( + {}, { text: t('common.queryText'), + preIcon: 'ant-design:search-outlined', }, props.submitButtonOptions ); diff --git a/src/components/Form/src/hooks/useForm.ts b/src/components/Form/src/hooks/useForm.ts index e76eae3..af6c4bb 100644 --- a/src/components/Form/src/hooks/useForm.ts +++ b/src/components/Form/src/hooks/useForm.ts @@ -110,17 +110,18 @@ export function useForm(props?: Props): UseFormReturnType { */ validate: async (nameList?: NamePath[]): Promise => { const form = await getForm(); + let getProps = props || form.getProps; let values = form.validate(nameList).then((values) => { for (let key in values) { if (values[key] instanceof Array) { - let valueType = getValueType(props, key); + let valueType = getValueType(getProps, key); if (valueType === 'string') { values[key] = values[key].join(','); } } } //--@updateBy-begin----author:liusq---date:20210916------for:处理区域事件字典信息------ - return handleRangeValue(props, values); + return handleRangeValue(getProps, values); //--@updateBy-end----author:liusq---date:20210916------for:处理区域事件字典信息------ }); return values; diff --git a/src/components/Form/src/jeecg/components/JAddInput.vue b/src/components/Form/src/jeecg/components/JAddInput.vue index 5abb7ff..d63b628 100644 --- a/src/components/Form/src/jeecg/components/JAddInput.vue +++ b/src/components/Form/src/jeecg/components/JAddInput.vue @@ -2,7 +2,7 @@
- +
@@ -26,6 +26,10 @@ name: 'JAddInput', props: { value: propTypes.string.def(''), + //update-begin---author:wangshuai ---date:20220516 for:[VUEN-1043]系统编码规则,最后一个输入框不能删除------------ + //自定义删除按钮多少才会显示 + min: propTypes.integer.def(1), + //update-end---author:wangshuai ---date:20220516 for:[VUEN-1043]系统编码规则,最后一个输入框不能删除-------------- }, emits: ['change', 'update:value'], setup(props, { emit }) { diff --git a/src/components/Form/src/jeecg/components/JAreaLinkage.vue b/src/components/Form/src/jeecg/components/JAreaLinkage.vue index 48819f5..49c8e3f 100644 --- a/src/components/Form/src/jeecg/components/JAreaLinkage.vue +++ b/src/components/Form/src/jeecg/components/JAreaLinkage.vue @@ -1,5 +1,5 @@ + + diff --git a/src/components/Form/src/jeecg/components/JImageUpload.vue b/src/components/Form/src/jeecg/components/JImageUpload.vue index c15121b..ae13d9b 100644 --- a/src/components/Form/src/jeecg/components/JImageUpload.vue +++ b/src/components/Form/src/jeecg/components/JImageUpload.vue @@ -18,7 +18,7 @@
{{ text }}
- + {{ text }} diff --git a/src/components/Form/src/jeecg/components/JInputPop.vue b/src/components/Form/src/jeecg/components/JInputPop.vue index 9b81b3c..555303d 100644 --- a/src/components/Form/src/jeecg/components/JInputPop.vue +++ b/src/components/Form/src/jeecg/components/JInputPop.vue @@ -35,7 +35,7 @@ height: propTypes.number.def(150), disabled: propTypes.bool.def(false), // 弹出框挂载的元素ID - popContainer: propTypes.string.def(''), + popContainer: propTypes.oneOfType([propTypes.string, propTypes.func]).def(''), }); const attrs = useAttrs(); const emit = defineEmits(['change', 'update:value']); @@ -75,6 +75,8 @@ function getPopupContainer(node) { if (!props.popContainer) { return node.parentNode; + } else if (typeof props.popContainer === 'function') { + return props.popContainer(node); } else { return document.getElementById(props.popContainer); } diff --git a/src/components/Form/src/jeecg/components/JOnlineSelectCascade.vue b/src/components/Form/src/jeecg/components/JOnlineSelectCascade.vue deleted file mode 100644 index 12f233b..0000000 --- a/src/components/Form/src/jeecg/components/JOnlineSelectCascade.vue +++ /dev/null @@ -1,220 +0,0 @@ - - - - - diff --git a/src/components/Form/src/jeecg/components/JPopup.vue b/src/components/Form/src/jeecg/components/JPopup.vue index 393275e..5e3d268 100644 --- a/src/components/Form/src/jeecg/components/JPopup.vue +++ b/src/components/Form/src/jeecg/components/JPopup.vue @@ -6,9 +6,11 @@ - + + + diff --git a/src/components/Form/src/jeecg/components/JSearchSelect.vue b/src/components/Form/src/jeecg/components/JSearchSelect.vue index 83e0c2b..6433000 100644 --- a/src/components/Form/src/jeecg/components/JSearchSelect.vue +++ b/src/components/Form/src/jeecg/components/JSearchSelect.vue @@ -117,15 +117,20 @@ options.value = []; loading.value = true; // 字典code格式:table,text,code - defHttp.get({ url: `/sys/dict/loadDict/${props.dict}`, params: { keyword: value, pageSize: props.pageSize } }).then((res) => { - loading.value = false; - if (res && res.length > 0) { - if (currentLoad != unref(lastLoad)) { - return; + defHttp + .get({ + url: `/sys/dict/loadDict/${props.dict}`, + params: { keyword: value, pageSize: props.pageSize }, + }) + .then((res) => { + loading.value = false; + if (res && res.length > 0) { + if (currentLoad != unref(lastLoad)) { + return; + } + options.value = res; } - options.value = res; - } - }); + }); } /** * 初始化value @@ -186,12 +191,17 @@ } else { //异步一开始也加载一点数据 loading.value = true; - defHttp.get({ url: `/sys/dict/loadDict/${dict}`, params: { pageSize: pageSize, keyword: '' } }).then((res) => { - loading.value = false; - if (res && res.length > 0) { - options.value = res; - } - }); + defHttp + .get({ + url: `/sys/dict/loadDict/${dict}`, + params: { pageSize: pageSize, keyword: '' }, + }) + .then((res) => { + loading.value = false; + if (res && res.length > 0) { + options.value = res; + } + }); } } } diff --git a/src/components/Form/src/jeecg/components/JSelectDept.vue b/src/components/Form/src/jeecg/components/JSelectDept.vue index 15235a2..960dad8 100644 --- a/src/components/Form/src/jeecg/components/JSelectDept.vue +++ b/src/components/Form/src/jeecg/components/JSelectDept.vue @@ -37,7 +37,7 @@ //下拉框选项值 const selectOptions = ref([]); //下拉框选中值 - let selectValues = reactive({ + let selectValues = reactive({ value: [], }); // 是否正在加载回显数据 @@ -57,14 +57,16 @@ */ watchEffect(() => { props.value && initValue(); - // update-begin-author:taoyan date:20220401 for:调用表单的 resetFields不会清空当前部门信息,界面显示上一次的数据 - if (props.value === '' || props.value === undefined) { - state.value = []; - selectValues.value = []; - } - // update-end-author:taoyan date:20220401 for:调用表单的 resetFields不会清空当前部门信息,界面显示上一次的数据 }); + //update-begin-author:liusq---date:20220609--for: 为了解决弹窗form初始化赋值问题 --- + watch( + () => props.value, + () => { + initValue(); + } + ); + //update-end-author:liusq---date:20220609--for: 为了解决弹窗form初始化赋值问题 --- /** * 监听selectValues变化 */ @@ -100,6 +102,9 @@ if (value && typeof value === 'string') { state.value = value.split(','); selectValues.value = value.split(','); + } else { + // 【VUEN-857】兼容数组(行编辑的用法问题) + selectValues.value = value; } } diff --git a/src/components/Form/src/jeecg/components/JSelectMultiple.vue b/src/components/Form/src/jeecg/components/JSelectMultiple.vue index cbdcbc7..5673ce6 100644 --- a/src/components/Form/src/jeecg/components/JSelectMultiple.vue +++ b/src/components/Form/src/jeecg/components/JSelectMultiple.vue @@ -1,6 +1,6 @@