Compare commits
51 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
166f7e1888 | ||
![]() |
22e656daf3 | ||
![]() |
cbe7ea4bb5 | ||
![]() |
ae55451395 | ||
![]() |
ecfe531b3d | ||
![]() |
6dfcfbcf2a | ||
![]() |
61d2ff490d | ||
![]() |
300387d380 | ||
![]() |
bc9bb7304e | ||
![]() |
6882eef000 | ||
![]() |
147055fba2 | ||
![]() |
8472f42126 | ||
![]() |
335c82e08a | ||
![]() |
6bf259427c | ||
![]() |
f19a3025e1 | ||
![]() |
fea9146b1a | ||
![]() |
1dff1f0d93 | ||
![]() |
1ae94cf036 | ||
![]() |
c112e703b6 | ||
![]() |
455b6672d2 | ||
![]() |
616b4c01fb | ||
![]() |
48499d1af7 | ||
![]() |
78230e1d0e | ||
![]() |
1213e7e2c8 | ||
![]() |
a91c7d39f7 | ||
![]() |
30bfbfc308 | ||
![]() |
c669bee385 | ||
![]() |
e7371ddb43 | ||
![]() |
2e84090b7d | ||
![]() |
83791978ed | ||
![]() |
6adeb05d07 | ||
![]() |
908cae7235 | ||
![]() |
c6e48c1c43 | ||
![]() |
052e63d875 | ||
![]() |
6686287991 | ||
![]() |
433a4bfab9 | ||
![]() |
23c3ec8294 | ||
![]() |
ae5787d1df | ||
![]() |
75029d0a2c | ||
![]() |
af1fd634f3 | ||
![]() |
2db96af605 | ||
![]() |
d92041fa37 | ||
![]() |
91bb10a861 | ||
![]() |
5b806bc70d | ||
![]() |
e036565709 | ||
![]() |
d6130b685d | ||
![]() |
013f6c2e81 | ||
![]() |
3ac00df8e5 | ||
![]() |
c968aac7ed | ||
![]() |
8e33da231e | ||
![]() |
43db6d8b2e |
@@ -4,8 +4,8 @@ VOLUME /tmp
|
||||
ENV LANG en_US.UTF-8
|
||||
RUN echo "server { \
|
||||
listen 80; \
|
||||
location /jeecgboot { \
|
||||
proxy_pass http://jeecg-boot-system:8080/jeecg-boot; \
|
||||
location /jeecgboot/ { \
|
||||
proxy_pass http://jeecg-boot-system:8080/jeecg-boot/; \
|
||||
proxy_redirect off; \
|
||||
proxy_set_header Host jeecg-boot-system; \
|
||||
proxy_set_header X-Real-IP \$remote_addr; \
|
||||
@@ -27,4 +27,4 @@ RUN echo "server { \
|
||||
|
||||
ADD dist/ /var/www/html/
|
||||
EXPOSE 80
|
||||
EXPOSE 443
|
||||
EXPOSE 443
|
||||
|
44
README.md
44
README.md
@@ -1,13 +1,11 @@
|
||||
JEECG BOOT 低代码开发平台(Vue3前端)
|
||||
===============
|
||||
当前最新版本: 3.4.2(发布时间:20220922)
|
||||
> 变更大版本号与后台同步 3.3.X,后续单独发布版本会更新小版本号。
|
||||
|
||||
当前最新版本: 3.4.3(发布时间:2022-10-18)
|
||||
|
||||
[](https://github.com/zhangdaiscott/jeecg-boot/blob/master/LICENSE)
|
||||
[](http://www.jeecg.com)
|
||||
[](https://my.oschina.net/jeecg)
|
||||
[](https://github.com/zhangdaiscott/jeecg-boot)
|
||||
[](https://jeecg.blog.csdn.net)
|
||||
[](https://github.com/zhangdaiscott/jeecg-boot)
|
||||
[](https://github.com/zhangdaiscott/jeecg-boot)
|
||||
[](https://github.com/zhangdaiscott/jeecg-boot)
|
||||
|
||||
@@ -19,12 +17,18 @@ JeecgBoot-Vue3采用 Vue3.0、Vite、 Ant-Design-Vue、TypeScript 等新技术
|
||||
|
||||
> 强大的代码生成器让前后端代码一键生成! JeecgBoot引领低代码开发模式(OnlineCoding-> 代码生成-> 手工MERGE), 帮助解决Java项目70%的重复工作,让开发更多关注业务。既能快速提高效率,节省成本,同时又不失灵活性
|
||||
|
||||
## 技术支持
|
||||
|
||||
关闭Gitee的issue通道,使用中遇到问题或者BUG可以在 [Github上提Issues](https://github.com/jeecgboot/jeecgboot-vue3/issues/new)
|
||||
|
||||
官方支持: http://jeecg.com/doc/help
|
||||
|
||||
## 项目源码
|
||||
|
||||
| 仓库 |前端源码Vue3版 | 前端源码Vue2版 | 后端源码 |
|
||||
| 仓库 | 后端源码 |前端 Vue3版 | 前端 Vue2版 |
|
||||
|-|-|-|-|
|
||||
| Github | [jeecgboot-vue3](https://github.com/jeecgboot/jeecgboot-vue3) | [ant-design-vue-jeecg](https://github.com/jeecgboot/ant-design-vue-jeecg) | [jeecg-boot](https://github.com/jeecgboot/jeecg-boot) |
|
||||
| 码云 | [jeecgboot-vue3](https://gitee.com/jeecg/jeecgboot-vue3) | [ant-design-vue-jeecg](https://gitee.com/jeecg/ant-design-vue-jeecg) | [jeecg-boot](https://gitee.com/jeecg/jeecg-boot) |
|
||||
| Github | [jeecg-boot](https://github.com/jeecgboot/jeecg-boot) | [jeecgboot-vue3](https://github.com/jeecgboot/jeecgboot-vue3) | [ant-design-vue-jeecg](https://github.com/jeecgboot/ant-design-vue-jeecg) |
|
||||
| 码云 | [jeecg-boot](https://gitee.com/jeecg/jeecg-boot) | [jeecgboot-vue3](https://gitee.com/jeecg/jeecgboot-vue3) | [ant-design-vue-jeecg](https://gitee.com/jeecg/ant-design-vue-jeecg) |
|
||||
|
||||
|
||||
##### 项目说明
|
||||
@@ -33,19 +37,14 @@ JeecgBoot-Vue3采用 Vue3.0、Vite、 Ant-Design-Vue、TypeScript 等新技术
|
||||
|--------------------|------------------------|
|
||||
| `jeecgboot-vue3` | Vue3版前端代码 |
|
||||
| `jeecg-boot` | JAVA后台(支持微服务) |
|
||||
| `ant-design-vue-jeecg` |Vue2版前端代码 |
|
||||
|
||||
|
||||
|
||||
> 入门必看>>[切换Vue3路由](http://vue3.jeecg.com/2671576)
|
||||
|
||||
|
||||
## 技术文档
|
||||
|
||||
- 开发文档:[http://vue3.jeecg.com](http://vue3.jeecg.com)
|
||||
- 官方文档:[http://vue3.jeecg.com](http://vue3.jeecg.com)
|
||||
- 官方网站: [http://www.jeecg.com](http://www.jeecg.com)
|
||||
- 在线演示:[http://boot3.jeecg.com](http://boot3.jeecg.com)
|
||||
- 快速入门:[入门视频](https://www.bilibili.com/video/BV1V34y187Y9 "入门视频") | [ 代码生成](http://vue3.jeecg.com/2677352)
|
||||
- 快速入门:[常见问题](http://vue3.jeecg.com/2426559) | [入门视频](https://www.bilibili.com/video/BV1V34y187Y9 "入门视频") | [ 代码生成](http://vue3.jeecg.com/2677352)
|
||||
- QQ交流群:683903138
|
||||
|
||||
## 安装与使用
|
||||
@@ -70,8 +69,15 @@ yarn install
|
||||
```
|
||||
|
||||
- 配置后台接口地址
|
||||
>[info] 说明:把`http://localhost:8080/jeecg-boot` 替换成自己地址即可,其他不用改。
|
||||
|
||||
配置文件:.env.development
|
||||
|
||||
```bash
|
||||
.env.development
|
||||
VITE_GLOB_API_URL=/jeecgboot
|
||||
VITE_PROXY = [["/jeecgboot","http://localhost:8080/jeecg-boot"],["/upload",
|
||||
"http://localhost:3300/upload"]]
|
||||
VITE_GLOB_DOMAIN_URL=http://localhost:8080/jeecg-boot
|
||||
```
|
||||
|
||||
- run
|
||||
@@ -92,11 +98,13 @@ yarn build
|
||||
|
||||
- host设置
|
||||
|
||||
>注意: 需要把`127.0.0.1`替换成真实IP 比如`192.`开头,不然后端不通。
|
||||
|
||||
```bash
|
||||
127.0.0.1 jeecg-boot-system
|
||||
127.0.0.1 jeecg-boot-gateway
|
||||
```
|
||||
>注意: 需要把`127.0.0.1`替换成真实IP 比如`192.`开头,不然后端不通。
|
||||
|
||||
|
||||
- 下载项目
|
||||
|
||||
@@ -104,8 +112,8 @@ yarn build
|
||||
git clone https://github.com/jeecgboot/jeecgboot-vue3.git
|
||||
|
||||
cd jeecgboot-vue3
|
||||
|
||||
```
|
||||
|
||||
- 修改后台域名
|
||||
.env.production
|
||||
|
||||
|
@@ -5,9 +5,9 @@
|
||||
import { createStyleImportPlugin } from 'vite-plugin-style-import';
|
||||
|
||||
export function configStyleImportPlugin(_isBuild: boolean) {
|
||||
// if (!isBuild) {
|
||||
// return [];
|
||||
// }
|
||||
if (!_isBuild) {
|
||||
return [];
|
||||
}
|
||||
const styleImportPlugin = createStyleImportPlugin({
|
||||
libs: [
|
||||
{
|
||||
|
3288
package-lock.json
generated
3288
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
15
package.json
15
package.json
@@ -1,25 +1,25 @@
|
||||
{
|
||||
"name": "jeecgboot-vue3",
|
||||
"version": "3.4.2",
|
||||
"version": "3.4.3",
|
||||
"author": {
|
||||
"name": "jeecg",
|
||||
"email": "jeecgos@163.com",
|
||||
"url": "https://github.com/jeecgboot/jeecgboot-vue3"
|
||||
},
|
||||
"scripts": {
|
||||
"bootstrap": "yarn install",
|
||||
"bootstrap": "yarn install --registry https://registry.npm.taobao.org || npm install --ignore-scripts --registry https://registry.npm.taobao.org",
|
||||
"serve": "npm run dev",
|
||||
"dev": "vite",
|
||||
"clean:cache": "rimraf node_modules/.cache/ && rimraf node_modules/.vite",
|
||||
"clean:lib": "rimraf node_modules",
|
||||
"build": "cross-env NODE_ENV=production NODE_OPTIONS=--max-old-space-size=8192 vite build && esno ./build/script/postBuild.ts",
|
||||
"build:test": "cross-env vite build --mode test && esno ./build/script/postBuild.ts",
|
||||
"build:test": "cross-env NODE_OPTIONS=--max-old-space-size=8192 vite build --mode test && esno ./build/script/postBuild.ts",
|
||||
"build:no-cache": "yarn clean:cache && npm run build",
|
||||
"report": "cross-env REPORT=true npm run build",
|
||||
"type:check": "vue-tsc --noEmit --skipLibCheck",
|
||||
"preview": "npm run build && vite preview",
|
||||
"preview:dist": "vite preview",
|
||||
"log": "conventional-changelog -p angular -i CHANGELOG.md -s",
|
||||
"clean:lib": "rimraf node_modules",
|
||||
"lint:eslint": "eslint --cache --max-warnings 0 \"{src,mock}/**/*.{vue,ts,tsx}\" --fix",
|
||||
"lint:prettier": "prettier --write \"src/**/*.{js,json,tsx,css,less,scss,vue,html,md}\"",
|
||||
"lint:stylelint": "stylelint --cache --fix \"**/*.{vue,less,postcss,css,scss}\" --cache --cache-location node_modules/.cache/stylelint/",
|
||||
@@ -34,7 +34,7 @@
|
||||
"gen:icon": "esno ./build/generate/icon/index.ts"
|
||||
},
|
||||
"dependencies": {
|
||||
"@jeecg/online": "1.0.1",
|
||||
"@jeecg/online": "3.4.3-GA",
|
||||
"@iconify/iconify": "^2.2.1",
|
||||
"@ant-design/colors": "^6.0.0",
|
||||
"@ant-design/icons-vue": "^6.1.0",
|
||||
@@ -87,7 +87,7 @@
|
||||
"vue-types": "^4.1.1",
|
||||
"vuedraggable": "^4.1.0",
|
||||
"vxe-table": "4.1.0",
|
||||
"vxe-table-plugin-antd": "^3.0.5",
|
||||
"vxe-table-plugin-antd": "3.0.5",
|
||||
"xe-utils": "^3.3.1",
|
||||
"vue-json-pretty": "^2.0.6",
|
||||
"xss": "^1.0.13"
|
||||
@@ -178,9 +178,8 @@
|
||||
"vue-tsc": "^0.33.9"
|
||||
},
|
||||
"resolutions": {
|
||||
"//": "Used to install imagemin dependencies, because imagemin may not be installed in China. If it is abroad, you can delete it",
|
||||
"bin-wrapper": "npm:bin-wrapper-china",
|
||||
"rollup": "^2.56.3"
|
||||
"rollup": "^2.72.0"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
|
@@ -6,6 +6,9 @@ import { ref, onUnmounted, unref, nextTick, watch } from 'vue';
|
||||
import { isProdMode } from '/@/utils/env';
|
||||
import { error } from '/@/utils/log';
|
||||
import { getDynamicProps, getValueType } from '/@/utils';
|
||||
import { add } from "/@/components/Form/src/componentMap";
|
||||
//集成online专用控件
|
||||
import { OnlineSelectCascade, LinkTableCard, LinkTableSelect } from '@jeecg/online';
|
||||
|
||||
export declare type ValidateFields = (nameList?: NamePath[]) => Promise<Recordable>;
|
||||
|
||||
@@ -15,6 +18,11 @@ export function useForm(props?: Props): UseFormReturnType {
|
||||
const formRef = ref<Nullable<FormActionType>>(null);
|
||||
const loadedRef = ref<Nullable<boolean>>(false);
|
||||
|
||||
//集成online专用控件
|
||||
add("OnlineSelectCascade", OnlineSelectCascade)
|
||||
add("LinkTableCard", LinkTableCard)
|
||||
add("LinkTableSelect", LinkTableSelect)
|
||||
|
||||
async function getForm() {
|
||||
const form = unref(formRef);
|
||||
if (!form) {
|
||||
|
@@ -10,7 +10,7 @@ export function useItemLabelWidth(schemaItemRef: Ref<FormSchema>, propsRef: Ref<
|
||||
const { labelCol = {}, wrapperCol = {} } = schemaItem.itemProps || {};
|
||||
const { labelWidth, disabledLabelWidth } = schemaItem;
|
||||
|
||||
const { labelWidth: globalLabelWidth, labelCol: globalLabelCol, wrapperCol: globWrapperCol } = unref(propsRef);
|
||||
const { labelWidth: globalLabelWidth, labelCol: globalLabelCol, wrapperCol: globWrapperCol,layout } = unref(propsRef);
|
||||
|
||||
// update-begin--author:sunjianlei---date:20211104---for: 禁用全局 labelWidth,不自动设置 textAlign --------
|
||||
if (disabledLabelWidth) {
|
||||
@@ -34,8 +34,11 @@ export function useItemLabelWidth(schemaItemRef: Ref<FormSchema>, propsRef: Ref<
|
||||
}
|
||||
|
||||
return {
|
||||
labelCol: { style: { width }, ...col },
|
||||
wrapperCol: { style: { width: `calc(100% - ${width})` }, ...wrapCol },
|
||||
labelCol: { style: { width: width ? width : '100%' }, ...col },
|
||||
wrapperCol: {
|
||||
style: { width: layout === 'vertical' ? '100%' : `calc(100% - ${width})` },
|
||||
...wrapCol,
|
||||
},
|
||||
};
|
||||
});
|
||||
}
|
||||
|
@@ -197,6 +197,15 @@
|
||||
});
|
||||
|
||||
const getBindValue = Object.assign({}, unref(props), unref(attrs));
|
||||
|
||||
//update-begin-author:taoyan date:2022-10-18 for: VUEN-2480【严重bug】online vue3测试的问题 8、online js增强样式问题
|
||||
function refresh(){
|
||||
if(coder){
|
||||
coder.refresh();
|
||||
}
|
||||
}
|
||||
//update-end-author:taoyan date:2022-10-18 for: VUEN-2480【严重bug】online vue3测试的问题 8、online js增强样式问题
|
||||
|
||||
return {
|
||||
state,
|
||||
textarea,
|
||||
@@ -206,6 +215,7 @@
|
||||
isFullScreen,
|
||||
fullScreenIcon,
|
||||
onToggleFullScreen,
|
||||
refresh
|
||||
};
|
||||
},
|
||||
});
|
||||
@@ -279,5 +289,10 @@
|
||||
height: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
/** VUEN-2344【vue3】这个样式有问题,是不是加个边框 */
|
||||
.CodeMirror{
|
||||
border: 1px solid #ddd;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
@@ -291,6 +291,8 @@
|
||||
fileSize: item.size,
|
||||
};
|
||||
newFileList.push(fileJson);
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
}
|
||||
emitValue(newFileList);
|
||||
|
@@ -42,7 +42,8 @@ export const DictSearchInputCell = defineComponent({
|
||||
// 筛选函数
|
||||
const filterOption = computed(() => {
|
||||
if (isAsync.value) {
|
||||
return null;
|
||||
//【jeecgboot-vue3/issues/I5QRT8】JVxeTypes.selectDictSearch sync问题
|
||||
return ()=>true;
|
||||
}
|
||||
return (input, option) => option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0;
|
||||
});
|
||||
|
@@ -17,7 +17,7 @@
|
||||
</template>
|
||||
|
||||
<!-- update-begin-author:taoyan date:2022-7-18 for: modal弹窗 支持评论 slot -->
|
||||
<a-row v-if="getProps.enableComment" class="jeecg-modal-wrapper">
|
||||
<a-row class="jeecg-modal-wrapper">
|
||||
<a-col :span="24-commentSpan" class="jeecg-modal-content">
|
||||
<ModalWrapper
|
||||
:useWrapper="getProps.useWrapper"
|
||||
@@ -36,31 +36,14 @@
|
||||
<slot></slot>
|
||||
</ModalWrapper>
|
||||
</a-col>
|
||||
|
||||
|
||||
<a-col :span="commentSpan" class="jeecg-comment-outer">
|
||||
<slot name="comment"></slot>
|
||||
</a-col>
|
||||
|
||||
|
||||
</a-row>
|
||||
<ModalWrapper
|
||||
v-else
|
||||
:useWrapper="getProps.useWrapper"
|
||||
:footerOffset="wrapperFooterOffset"
|
||||
:fullScreen="fullScreenRef"
|
||||
ref="modalWrapperRef"
|
||||
:loading="getProps.loading"
|
||||
:loading-tip="getProps.loadingTip"
|
||||
:minHeight="getProps.minHeight"
|
||||
:height="getWrapperHeight"
|
||||
:visible="visibleRef"
|
||||
:modalFooterHeight="footer !== undefined && !footer ? 0 : undefined"
|
||||
v-bind="omit(getProps.wrapperProps, 'visible', 'height', 'modalFooterHeight')"
|
||||
@ext-height="handleExtHeight"
|
||||
@height-change="handleHeightChange">
|
||||
<slot></slot>
|
||||
</ModalWrapper>
|
||||
<!-- update-end-author:taoyan date:2022-7-18 for: modal弹窗 支持评论 slot -->
|
||||
|
||||
|
||||
<template #[item]="data" v-for="item in Object.keys(omit($slots, 'default'))">
|
||||
<slot :name="item" v-bind="data || {}"></slot>
|
||||
</template>
|
||||
@@ -282,4 +265,4 @@
|
||||
.jeecg-modal-content {
|
||||
height: 100%;
|
||||
}
|
||||
</style>
|
||||
</style>
|
@@ -44,7 +44,7 @@
|
||||
</template>
|
||||
<template v-else>
|
||||
<a-date-picker
|
||||
placeholder="1选择开始时间"
|
||||
placeholder="选择开始时间"
|
||||
:show-time="true"
|
||||
valueFormat="YYYY-MM-DD HH:mm:ss"
|
||||
v-model:value="queryParam[item.field + '_begin']"
|
||||
@@ -52,7 +52,7 @@
|
||||
></a-date-picker>
|
||||
<span class="group-query-strig" style="width: auto; padding: 0 4px">~</span>
|
||||
<a-date-picker
|
||||
placeholder="2选择结束时间"
|
||||
placeholder="选择结束时间"
|
||||
:show-time="true"
|
||||
valueFormat="YYYY-MM-DD HH:mm:ss"
|
||||
v-model:value="queryParam[item.field + '_end']"
|
||||
@@ -131,16 +131,8 @@
|
||||
<template #label>
|
||||
<span :title="item.label" class="label-text">{{ item.label }}</span>
|
||||
</template>
|
||||
<JDictSelectTag v-if="item.config === '1'" v-model:value="queryParam[item.field]" :placeholder="'请选择' + item.label" :dict="getDictCode(item)">
|
||||
</JDictSelectTag>
|
||||
<!--TODO 新需要的组件-->
|
||||
<!-- <j-online-search-select
|
||||
v-else
|
||||
:ref="item.field+'_search'"
|
||||
v-model="queryParam[item.field]"
|
||||
:placeholder=" '请选择'+item.label "
|
||||
:sql="getSqlByDictCode(item)">
|
||||
</j-online-search-select>-->
|
||||
<JOnlineSearchSelect v-model:value="queryParam[item.field]" :placeholder="'请选择' + item.label" :sql="item.sql">
|
||||
</JOnlineSearchSelect>
|
||||
</a-form-item>
|
||||
|
||||
<a-form-item v-else-if="item.view === CompTypeEnum.SelUser" :labelCol="labelCol" :class="'jeecg-online-search'">
|
||||
@@ -202,7 +194,10 @@
|
||||
<template #label>
|
||||
<span :title="item.label" class="label-text">{{ item.label }}</span>
|
||||
</template>
|
||||
<template v-if="single_mode === item.mode">
|
||||
<template v-if="single_mode === item.mode && 'string'== item.view">
|
||||
<j-input :placeholder="'请输入' + item.label" v-model:value="queryParam[item.field]"></j-input>
|
||||
</template>
|
||||
<template v-else-if="single_mode === item.mode">
|
||||
<a-input :placeholder="'请输入' + item.label" v-model:value="queryParam[item.field]"></a-input>
|
||||
</template>
|
||||
<template v-else>
|
||||
@@ -218,7 +213,7 @@
|
||||
import { defineComponent, ref } from 'vue';
|
||||
import { DateTypeEnum } from '/@/enums/DateTypeEnum.ts';
|
||||
import { CompTypeEnum } from '/@/enums/CompTypeEnum.ts';
|
||||
import { JDictSelectTag, JTreeSelect, JCategorySelect, JSelectUserByDept, JSelectDept, JPopup, JAreaLinkage } from '/@/components/Form';
|
||||
import { JDictSelectTag, JTreeSelect, JCategorySelect, JSelectUserByDept, JSelectDept, JPopup, JAreaLinkage,JInput,JSearchSelect } from '/@/components/Form';
|
||||
export default defineComponent({
|
||||
name: 'JPopupOnlReport',
|
||||
components: {
|
||||
@@ -230,6 +225,7 @@
|
||||
JSelectDept,
|
||||
JPopup,
|
||||
JAreaLinkage,
|
||||
JInput,
|
||||
},
|
||||
props: {
|
||||
formElRef: {
|
||||
|
@@ -512,6 +512,8 @@ export function usePopBiz(props, tableRef?) {
|
||||
//查询条件加载后再请求数据
|
||||
if (data) {
|
||||
setDataSource(data);
|
||||
//传递路由参数和动态参数,不生效,
|
||||
loadData(1);
|
||||
} else {
|
||||
//没有传递data时查询数据
|
||||
loadData(1);
|
||||
@@ -531,6 +533,7 @@ export function usePopBiz(props, tableRef?) {
|
||||
pagination.current = 1;
|
||||
}
|
||||
let params = getQueryParams(); //查询条件
|
||||
console.log('params', params);
|
||||
loading.value = true;
|
||||
let url = `${configUrl.getData}${unref(cgRpConfigId)}`;
|
||||
//缓存key
|
||||
@@ -597,6 +600,11 @@ export function usePopBiz(props, tableRef?) {
|
||||
}
|
||||
queryParam.value = { ...queryTemp };
|
||||
}
|
||||
// 合并路由参数
|
||||
if (props.routeQuery) {
|
||||
queryParam.value = Object.assign(queryParam.value, props.routeQuery);
|
||||
}
|
||||
|
||||
let dynamicTemp = {};
|
||||
if (props.param) {
|
||||
Object.keys(props.param).map((key) => {
|
||||
|
@@ -75,15 +75,15 @@
|
||||
/**
|
||||
* 评论列表
|
||||
*/
|
||||
import { defineComponent, ref, onMounted, watch, watchEffect } from 'vue';
|
||||
import { defineComponent, ref, onMounted, watch, watchEffect ,inject } from 'vue';
|
||||
import { propTypes } from '/@/utils/propTypes';
|
||||
import dayjs from 'dayjs';
|
||||
import 'dayjs/locale/zh.js';
|
||||
import relativeTime from 'dayjs/plugin/relativeTime';
|
||||
import customParseFormat from 'dayjs/plugin/customParseFormat';
|
||||
dayjs.locale('zh');
|
||||
dayjs.extend(relativeTime);
|
||||
dayjs.extend(customParseFormat);
|
||||
// import dayjs from 'dayjs';
|
||||
// import relativeTime from 'dayjs/plugin/relativeTime';
|
||||
// import customParseFormat from 'dayjs/plugin/customParseFormat';
|
||||
// dayjs.locale('zh');
|
||||
// dayjs.extend(relativeTime);
|
||||
// dayjs.extend(customParseFormat);
|
||||
|
||||
import { MessageOutlined } from '@ant-design/icons-vue';
|
||||
import { Comment, Tooltip } from 'ant-design-vue';
|
||||
import { useUserStore } from '/@/store/modules/user';
|
||||
@@ -113,6 +113,8 @@
|
||||
const { createMessage } = useMessage();
|
||||
const dataList = ref([]);
|
||||
const { userInfo } = useUserStore();
|
||||
const dayjs = inject('$dayjs')
|
||||
|
||||
/**
|
||||
* 获取当前用户名称
|
||||
*/
|
||||
@@ -245,7 +247,8 @@
|
||||
}
|
||||
});
|
||||
|
||||
const { getHtml } = useEmojiHtml();
|
||||
const storageEmojiIndex = inject('$globalEmojiIndex')
|
||||
const { getHtml } = useEmojiHtml(storageEmojiIndex);
|
||||
const bottomCommentRef = ref()
|
||||
function handleClickItem(){
|
||||
bottomCommentRef.value.changeActive()
|
||||
|
@@ -28,16 +28,15 @@
|
||||
<script>
|
||||
import { PlusOutlined, EditOutlined } from '@ant-design/icons-vue';
|
||||
import { getModalHeight, getLogList } from './useComment'
|
||||
import {ref, watchEffect} from 'vue'
|
||||
import {inject, ref, watchEffect} from 'vue'
|
||||
import { propTypes } from '/@/utils/propTypes';
|
||||
import { Tooltip } from 'ant-design-vue';
|
||||
import dayjs from 'dayjs';
|
||||
import 'dayjs/locale/zh.js';
|
||||
import relativeTime from 'dayjs/plugin/relativeTime';
|
||||
import customParseFormat from 'dayjs/plugin/customParseFormat';
|
||||
dayjs.locale('zh');
|
||||
dayjs.extend(relativeTime);
|
||||
dayjs.extend(customParseFormat);
|
||||
// import dayjs from 'dayjs';
|
||||
// import relativeTime from 'dayjs/plugin/relativeTime';
|
||||
// import customParseFormat from 'dayjs/plugin/customParseFormat';
|
||||
// dayjs.locale('zh');
|
||||
// dayjs.extend(relativeTime);
|
||||
// dayjs.extend(customParseFormat);
|
||||
|
||||
export default {
|
||||
name: "DataLogList",
|
||||
@@ -52,6 +51,7 @@
|
||||
datetime: propTypes.number.def(1),
|
||||
},
|
||||
setup(props){
|
||||
const dayjs = inject('$dayjs')
|
||||
const winHeight = getModalHeight();
|
||||
const height = ref(300);
|
||||
height.value = winHeight - 46 - 57 -53 - 30;
|
||||
@@ -174,4 +174,4 @@
|
||||
}
|
||||
|
||||
}
|
||||
</style>
|
||||
</style>
|
||||
|
@@ -45,14 +45,13 @@
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { ref, watch, computed } from 'vue';
|
||||
import {ref, watch, computed, inject} from 'vue';
|
||||
import { propTypes } from '/@/utils/propTypes';
|
||||
import { UserAddOutlined, PaperClipOutlined, SmileOutlined } from '@ant-design/icons-vue';
|
||||
import { Tooltip } from 'ant-design-vue';
|
||||
import UserSelectModal from '/@/components/Form/src/jeecg/components/modal/UserSelectModal.vue';
|
||||
import { useModal } from '/@/components/Modal';
|
||||
import UploadChunk from './UploadChunk.vue';
|
||||
import { Picker } from 'emoji-mart-vue-fast/src';
|
||||
import 'emoji-mart-vue-fast/css/emoji-mart.css';
|
||||
import { useEmojiHtml } from './useComment';
|
||||
|
||||
@@ -79,7 +78,6 @@
|
||||
PaperClipOutlined,
|
||||
UploadChunk,
|
||||
SmileOutlined,
|
||||
Picker,
|
||||
},
|
||||
props: {
|
||||
inner: propTypes.bool.def(false),
|
||||
@@ -221,8 +219,9 @@
|
||||
e.stopPropagation();
|
||||
visibleEmoji.value = !visibleEmoji.value;
|
||||
}
|
||||
|
||||
const { emojiIndex, getHtml } = useEmojiHtml();
|
||||
|
||||
const emojiIndex = inject('$globalEmojiIndex')
|
||||
const { getHtml } = useEmojiHtml(emojiIndex);
|
||||
|
||||
const commentHtml = computed(() => {
|
||||
let temp = myComment.value;
|
||||
|
@@ -13,8 +13,6 @@ import txt from '/@/assets/svg/fileType/txt.svg';
|
||||
import word from '/@/assets/svg/fileType/word.svg';
|
||||
import { getFileAccessHttpUrl } from '/@/utils/common/compUtils';
|
||||
import { createImgPreview } from '/@/components/Preview';
|
||||
import {EmojiIndex} from "emoji-mart-vue-fast/src";
|
||||
import data from "emoji-mart-vue-fast/data/apple.json";
|
||||
|
||||
enum Api {
|
||||
list = '/sys/comment/listByForm',
|
||||
@@ -365,16 +363,9 @@ export function useFileList() {
|
||||
/**
|
||||
* 用于emoji渲染
|
||||
*/
|
||||
export function useEmojiHtml(){
|
||||
export function useEmojiHtml(globalEmojiIndex){
|
||||
const COLONS_REGEX = new RegExp('([^:]+)?(:[a-zA-Z0-9-_+]+:(:skin-tone-[2-6]:)?)','g');
|
||||
let emojisToShowFilter = function() {
|
||||
return true;
|
||||
}
|
||||
let emojiIndex = new EmojiIndex(data, {
|
||||
emojisToShowFilter,
|
||||
exclude:['recent','people','nature','foods','activity','places','objects','symbols','flags']
|
||||
});
|
||||
|
||||
|
||||
function getHtml(text) {
|
||||
if(!text){
|
||||
return ''
|
||||
@@ -384,7 +375,7 @@ export function useEmojiHtml(){
|
||||
if (endsWith(before, 'alt="') || endsWith(before, 'data-text="')) {
|
||||
return match
|
||||
}
|
||||
let emoji = emojiIndex.findEmoji(p2)
|
||||
let emoji = globalEmojiIndex.findEmoji(p2)
|
||||
if (!emoji) {
|
||||
return match
|
||||
}
|
||||
@@ -403,7 +394,7 @@ export function useEmojiHtml(){
|
||||
}
|
||||
|
||||
return {
|
||||
emojiIndex,
|
||||
globalEmojiIndex,
|
||||
getHtml
|
||||
}
|
||||
}
|
||||
|
@@ -17,7 +17,7 @@ export enum CompTypeEnum {
|
||||
//分类字典树
|
||||
CatTree = 'cat_tree',
|
||||
//下拉搜索
|
||||
SelSearch = 'sel_search',
|
||||
SelSearch = 'search',
|
||||
//用户现在框
|
||||
SelUser = 'sel_user',
|
||||
//复选框
|
||||
|
@@ -47,8 +47,15 @@ export const useRedo = (_router?: Router) => {
|
||||
return;
|
||||
}
|
||||
if (name && Object.keys(params).length > 0) {
|
||||
params['_redirect_type'] = 'name';
|
||||
params['path'] = String(name);
|
||||
//update-begin-author:taoyan date:2022-10-19 for: VUEN-2356 【vue3】online表单、表单设计器 功能测试 右键刷新时 404
|
||||
if(isDynamicRoute(params, name)){
|
||||
params['_redirect_type'] = 'path';
|
||||
params['path'] = fullPath;
|
||||
}else{
|
||||
params['_redirect_type'] = 'name';
|
||||
params['path'] = String(name);
|
||||
}
|
||||
//update-end-author:taoyan date:2022-10-19 for: VUEN-2356 【vue3】online表单、表单设计器 功能测试 右键刷新时 404
|
||||
} else {
|
||||
params['_redirect_type'] = 'path';
|
||||
params['path'] = fullPath;
|
||||
@@ -58,3 +65,21 @@ export const useRedo = (_router?: Router) => {
|
||||
}
|
||||
return redo;
|
||||
};
|
||||
|
||||
/**
|
||||
* 判断是不是动态路由的跳转
|
||||
* @param params
|
||||
* @param name
|
||||
*/
|
||||
function isDynamicRoute(params, name){
|
||||
let arr = Object.keys(params);
|
||||
let flag = false;
|
||||
for(let i=0;i<arr.length;i++){
|
||||
let key = '@'+arr[i];
|
||||
if((name as string).indexOf(key)>0){
|
||||
flag = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return flag;
|
||||
}
|
||||
|
@@ -57,7 +57,6 @@
|
||||
}
|
||||
return count;
|
||||
});
|
||||
const chatRef = ref();
|
||||
|
||||
const [registerMessageModal, { openModal: openMessageModal }] = useModal();
|
||||
function clickBadge(){
|
||||
@@ -96,7 +95,6 @@
|
||||
//update-begin-author:taoyan date:2022-8-30 for: 消息数量改变触发chat组件事件
|
||||
let msgCount = anntMsgTotal+sysMsgTotal;
|
||||
//update-begin-author:wangshuai date:2022-09-02 for: 消息未读数为0也需要传递,因为聊天需要计算总数
|
||||
chatRef.value.updateMessageCount(msgCount);
|
||||
messageCount.value = msgCount
|
||||
//update-end-author:wangshuai date:2022-09-02 for: 消息未读数为0也需要传递,因为聊天需要计算总数
|
||||
//update-end-author:taoyan date:2022-8-30 for: 消息数量改变触发chat组件事件
|
||||
@@ -164,12 +162,6 @@
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取消息未读数
|
||||
*/
|
||||
function getSystemUnreadNum() {
|
||||
chatRef.value.updateMessageCount(messageCount.value);
|
||||
}
|
||||
|
||||
return {
|
||||
prefixCls,
|
||||
@@ -184,8 +176,6 @@
|
||||
popoverVisible,
|
||||
registerDetail,
|
||||
dynamicNoticeProps,
|
||||
chatRef,
|
||||
getSystemUnreadNum
|
||||
};
|
||||
},
|
||||
});
|
||||
|
@@ -57,7 +57,7 @@
|
||||
setModalProps({ confirmLoading: true });
|
||||
//提交表单
|
||||
let params = Object.assign({ username: unref(username) }, values);
|
||||
defHttp.put({ url: 'sys/user/updatePassword', params }, { isTransformResponse: false }).then((res) => {
|
||||
defHttp.put({ url: '/sys/user/updatePassword', params }, { isTransformResponse: false }).then((res) => {
|
||||
if (res.success) {
|
||||
$message.createMessage.success(res.message);
|
||||
//关闭弹窗
|
||||
|
@@ -201,3 +201,28 @@ html[data-theme='light'] {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.ant-tabs-dropdown-menu {
|
||||
&-title-content {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
|
||||
.@{prefix-cls} {
|
||||
&-content__info {
|
||||
width: auto;
|
||||
margin-left: 0;
|
||||
line-height: 28px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&-item-remove {
|
||||
margin-left: auto;
|
||||
}
|
||||
}
|
||||
|
||||
.multiple-tabs__dropdown {
|
||||
.ant-dropdown-content {
|
||||
width: 172px;
|
||||
}
|
||||
}
|
||||
|
@@ -8,6 +8,7 @@ import { createRouter, createWebHashHistory } from 'vue-router';
|
||||
import { getTenantId, getToken } from '/@/utils/auth';
|
||||
import { URL_HASH_TAB } from '/@/utils';
|
||||
import { packageViews } from '/@/utils/monorepo/dynamicRouter';
|
||||
import {useI18n} from "/@/hooks/web/useI18n";
|
||||
|
||||
export type LayoutMapKey = 'LAYOUT';
|
||||
const IFRAME = () => import('/@/views/sys/iframe/FrameBlank.vue');
|
||||
@@ -31,6 +32,17 @@ function asyncImportRoute(routes: AppRouteRecordRaw[] | undefined) {
|
||||
}
|
||||
if (!routes) return;
|
||||
routes.forEach((item) => {
|
||||
|
||||
//【jeecg-boot/issues/I5N2PN】左侧动态菜单怎么做国际化处理 2022-10-09
|
||||
//菜单支持国际化翻译
|
||||
if (item?.meta?.title) {
|
||||
const { t } = useI18n();
|
||||
if(item.meta.title.includes('t(\'') && t){
|
||||
item.meta.title = eval(item.meta.title);
|
||||
//console.log('译后: ',item.meta.title)
|
||||
}
|
||||
}
|
||||
|
||||
// update-begin--author:sunjianlei---date:20210918---for:适配旧版路由选项 --------
|
||||
// @ts-ignore 适配隐藏路由
|
||||
if (item?.hidden) {
|
||||
|
@@ -2,9 +2,38 @@ import type { App } from 'vue';
|
||||
import { registerJVxeTable } from '/@/components/jeecg/JVxeTable';
|
||||
import { registerJVxeCustom } from '/@/components/JVxeCustom';
|
||||
|
||||
// 注册全局聊天表情包
|
||||
import { Picker } from 'emoji-mart-vue-fast/src';
|
||||
import { EmojiIndex } from "emoji-mart-vue-fast/src";
|
||||
import data from "emoji-mart-vue-fast/data/apple.json";
|
||||
|
||||
// 注册全局dayjs
|
||||
import dayjs from 'dayjs';
|
||||
import relativeTime from 'dayjs/plugin/relativeTime';
|
||||
import customParseFormat from 'dayjs/plugin/customParseFormat';
|
||||
|
||||
export async function registerThirdComp(app: App) {
|
||||
// 注册 JVxeTable 组件
|
||||
registerJVxeTable(app);
|
||||
// 注册 JVxeTable 自定义组件
|
||||
await registerJVxeCustom();
|
||||
//---------------------------------------------------------------------
|
||||
// 注册全局聊天表情包
|
||||
app.component('Picker', Picker);
|
||||
let myEmojiIndex = new EmojiIndex(data, {
|
||||
function() {
|
||||
return true;
|
||||
},
|
||||
exclude:['recent','people','nature','foods','activity','places','objects','symbols','flags']
|
||||
});
|
||||
app.config.globalProperties.$globalEmojiIndex = myEmojiIndex
|
||||
app.provide('$globalEmojiIndex', myEmojiIndex)
|
||||
//---------------------------------------------------------------------
|
||||
// 注册全局dayjs
|
||||
dayjs.locale('zh');
|
||||
dayjs.extend(relativeTime);
|
||||
dayjs.extend(customParseFormat);
|
||||
app.config.globalProperties.$dayjs = dayjs
|
||||
app.provide('$dayjs', dayjs)
|
||||
//---------------------------------------------------------------------
|
||||
}
|
||||
|
6
src/utils/cache/persistent.ts
vendored
6
src/utils/cache/persistent.ts
vendored
@@ -56,6 +56,12 @@ function initPersistentMemory() {
|
||||
|
||||
export class Persistent {
|
||||
static getLocal<T>(key: LocalKeys) {
|
||||
//update-begin---author:scott ---date:2022-10-27 for:token过期退出重新登录,online菜单还是提示token过期----------
|
||||
const globalCache = ls.get(APP_LOCAL_CACHE_KEY);
|
||||
if(globalCache){
|
||||
localMemory.setCache(globalCache);
|
||||
}
|
||||
//update-end---author:scott ---date::2022-10-27 for:token过期退出重新登录,online菜单还是提示token过期----------
|
||||
return localMemory.get(key)?.value as Nullable<T>;
|
||||
}
|
||||
|
||||
|
@@ -92,6 +92,9 @@
|
||||
field: 'fieldTime',
|
||||
component: 'RangePicker',
|
||||
label: '时间字段',
|
||||
componentProps: {
|
||||
valueType: 'Date',
|
||||
},
|
||||
colProps: {
|
||||
span: 8,
|
||||
},
|
||||
|
@@ -33,6 +33,8 @@
|
||||
baseColProps: {
|
||||
span: 6,
|
||||
},
|
||||
labelWidth: 200,
|
||||
layout: 'vertical',
|
||||
schemas: schemas,
|
||||
showActionButtonGroup: false,
|
||||
});
|
||||
@@ -41,6 +43,8 @@
|
||||
baseColProps: {
|
||||
span: 6,
|
||||
},
|
||||
labelWidth: 200,
|
||||
layout: 'vertical',
|
||||
schemas: taskSchemas,
|
||||
showActionButtonGroup: false,
|
||||
});
|
||||
|
@@ -1,6 +1,6 @@
|
||||
import { BasicColumn } from '/@/components/Table';
|
||||
import dayjs from 'dayjs';
|
||||
import lodash from 'lodash';
|
||||
import _get from 'lodash.get';
|
||||
import { h } from 'vue';
|
||||
import { Tag } from 'ant-design-vue';
|
||||
|
||||
@@ -18,7 +18,7 @@ export const columns: BasicColumn[] = [
|
||||
dataIndex: 'request.method',
|
||||
width: 20,
|
||||
customRender({ record, column }) {
|
||||
let value = lodash.get(record, column.dataIndex!);
|
||||
let value = _get(record, column.dataIndex!);
|
||||
let color = '';
|
||||
if (value === 'GET') {
|
||||
color = '#87d068';
|
||||
@@ -40,7 +40,7 @@ export const columns: BasicColumn[] = [
|
||||
dataIndex: 'request.uri',
|
||||
width: 200,
|
||||
customRender({ record, column }) {
|
||||
return lodash.get(record, column.dataIndex!);
|
||||
return _get(record, column.dataIndex!);
|
||||
},
|
||||
},
|
||||
{
|
||||
@@ -48,7 +48,7 @@ export const columns: BasicColumn[] = [
|
||||
dataIndex: 'response.status',
|
||||
width: 50,
|
||||
customRender({ record, column }) {
|
||||
let value = lodash.get(record, column.dataIndex!);
|
||||
let value = _get(record, column.dataIndex!);
|
||||
let color = '';
|
||||
if (value < 200) {
|
||||
color = 'pink';
|
||||
@@ -69,7 +69,7 @@ export const columns: BasicColumn[] = [
|
||||
dataIndex: 'timeTaken',
|
||||
width: 50,
|
||||
customRender({ record, column }) {
|
||||
let value = lodash.get(record, column.dataIndex!);
|
||||
let value = _get(record, column.dataIndex!);
|
||||
let color = 'red';
|
||||
if (value < 500) {
|
||||
color = 'green';
|
||||
|
@@ -8,6 +8,7 @@ export const columns: BasicColumn[] = [
|
||||
dataIndex: 'name',
|
||||
width: 70,
|
||||
align: 'left',
|
||||
sorter: true
|
||||
},
|
||||
{
|
||||
title: '关键词',
|
||||
@@ -23,6 +24,7 @@ export const columns: BasicColumn[] = [
|
||||
title: '工资',
|
||||
dataIndex: 'salaryMoney',
|
||||
width: 40,
|
||||
sorter: true
|
||||
},
|
||||
{
|
||||
title: '奖金',
|
||||
@@ -32,6 +34,7 @@ export const columns: BasicColumn[] = [
|
||||
{
|
||||
title: '性别',
|
||||
dataIndex: 'sex',
|
||||
sorter: true,
|
||||
customRender: ({ record }) => {
|
||||
return render.renderDict(record.sex, 'sex');
|
||||
// let v = record.sex ? (record.sex == '1' ? '男' : '女') : '';
|
||||
|
@@ -53,7 +53,6 @@
|
||||
<a-button preIcon="ant-design:import-outlined" type="primary">导入</a-button>
|
||||
</a-upload>
|
||||
<a-button preIcon="ant-design:export-outlined" type="primary" @click="handleExportXls('单表示例', getExportUrl,exportParams)">导出</a-button>
|
||||
<a-button preIcon="ant-design:filter" type="primary" @click="">高级查询?</a-button>
|
||||
<a-button preIcon="ant-design:plus-outlined" type="primary" @click="openTab">打开Tab页</a-button>
|
||||
<a-button preIcon="ant-design:retweet-outlined" type="primary" @click="customSearch = !customSearch">{{
|
||||
customSearch ? '表单配置查询' : '自定义查询'
|
||||
@@ -119,6 +118,11 @@
|
||||
style: { textAlign: 'left' },
|
||||
},
|
||||
},
|
||||
//自定义默认排序
|
||||
defSort: {
|
||||
column: 'sex,salaryMoney',
|
||||
order: 'desc',
|
||||
},
|
||||
striped: true,
|
||||
useSearchForm: true,
|
||||
showTableSetting: true,
|
||||
|
@@ -4,13 +4,12 @@
|
||||
<BasicTable @register="registerTable" :rowSelection="rowSelection">
|
||||
<!--插槽:table标题-->
|
||||
<template #tableTitle>
|
||||
<a-button type="primary" preIcon="ant-design:plus-outlined" v-auth="'system:user:add'" @click="handleCreate"> 新增</a-button>
|
||||
<a-button type="primary" preIcon="ant-design:plus-outlined" @click="handleCreate"> 新增</a-button>
|
||||
<a-button type="primary" preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button>
|
||||
<j-upload-button type="primary" preIcon="ant-design:import-outlined" @click="onImportXls">导入</j-upload-button>
|
||||
<a-button type="primary" @click="handleSyncUser" preIcon="ant-design:sync-outlined"> 同步流程</a-button>
|
||||
<a-button type="primary" @click="openModal(true, {})" preIcon="ant-design:hdd-outlined"> 回收站</a-button>
|
||||
<JThirdAppButton biz-type="user" :selected-row-keys="selectedRowKeys" syncToApp syncToLocal @sync-finally="onSyncFinally" />
|
||||
<a-button type="primary" preIcon="ant-design:filter-outlined"> 高级查询?</a-button>
|
||||
<a-dropdown v-if="selectedRowKeys.length > 0">
|
||||
<template #overlay>
|
||||
<a-menu>
|
||||
|
@@ -107,7 +107,6 @@ export default ({ command, mode }: ConfigEnv): UserConfig => {
|
||||
'ant-design-vue/es/locale/zh_CN',
|
||||
'ant-design-vue/es/locale/en_US',
|
||||
],
|
||||
exclude: ['vue-demi'],
|
||||
},
|
||||
};
|
||||
};
|
||||
|
Reference in New Issue
Block a user