Skip to content

Commit 6069db9

Browse files
committed
Upgrade abp framework to 7.1.0
* fix(user): If the user information request fails, go to the login page. * feat(migrations): Add Backend-Admin、Identity、Webhooks migrations. * fix(elsa): fix endpoints version of the integrated Elsa.Server.Api project. * refactor(openiddict): refactor openiddict extension grant. * feat(saas): Add EntityVersions to Editions and Tenants entity. * fix(text-templating): fixed invalid page lookup for templates. * fix(text-templating): the cache is not refreshed after template changes. * feat(webhooks): added webhooks custom interface. * feat(webhooks): webhooks send job Sets the maximum number of failed retry attempts. * feat(account): add the user extension field. * feat(common): Update common.props file. * feat(build): Update Dicrectory.Build.props file. * feat(ui): implements the template definitions.
1 parent dfe6d2c commit 6069db9

146 files changed

Lines changed: 6536 additions & 337 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/release.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ name: "Tagged Release"
22

33
on:
44
push:
5-
branches: [ rel-7.0.3 ]
5+
branches: [ rel-7.1.0 ]
66

77
jobs:
88
tagged-release:
@@ -14,4 +14,4 @@ jobs:
1414
with:
1515
repo_token: "${{ secrets.GITHUB_TOKEN }}"
1616
prerelease: false
17-
automatic_release_tag: "7.0.3"
17+
automatic_release_tag: "7.1.0"

apps/vue/src/api/sys/user.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@ import { useGlobSetting } from '/@/hooks/setting';
99
import { ContentTypeEnum } from '/@/enums/httpEnum';
1010

1111
import { ErrorMessageMode } from '/#/axios';
12+
import { t } from '/@/hooks/web/useI18n';
13+
import { useMessage } from '/@/hooks/web/useMessage';
14+
import { useUserStoreWithOut } from '/@/store/modules/user';
15+
16+
const { createErrorModal } = useMessage();
1217

1318
enum Api {
1419
Login = '/connect/token',
@@ -87,6 +92,16 @@ export function getUserInfo() {
8792
{
8893
errorMessageMode: 'none',
8994
apiUrl: '/connect',
95+
}).catch(() => {
96+
const userStore = useUserStoreWithOut();
97+
createErrorModal({
98+
title: t('sys.api.errorTip'),
99+
content: t('sys.api.getUserInfoErrorMessage'),
100+
onOk: () => {
101+
userStore.setToken(undefined);
102+
userStore.logout(true);
103+
}
104+
});
90105
});
91106
}
92107

apps/vue/src/api/text-templating/definitions/index.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ export const CreateAsyncByInput = (input: TextTemplateDefinitionCreateDto) => {
1515
controller: controllerName,
1616
action: 'CreateAsync',
1717
uniqueName: 'CreateAsyncByInput',
18-
params: input,
18+
data: input,
1919
});
2020
};
2121

@@ -49,7 +49,9 @@ export const GetListAsyncByInput = (input: TextTemplateDefinitionGetListInput) =
4949
controller: controllerName,
5050
action: 'GetListAsync',
5151
uniqueName: 'GetListAsyncByInput',
52-
params: input,
52+
params: {
53+
input: input,
54+
},
5355
});
5456
};
5557

apps/vue/src/api/text-templating/definitions/model/index.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
export interface TextTemplateDefinitionDto {
22
name: string;
33
displayName: string;
4+
formatedDisplayName?: string;
45
defaultCultureName?: string;
56
isInlineLocalized: boolean;
67
isLayout: boolean;
7-
layout: string;
8+
layout?: string;
9+
layoutName?: string;
810
isStatic: boolean;
911
renderEngine?: string;
1012
}

apps/vue/src/locales/lang/en/sys.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@ export default {
77
apiTimeoutMessage: 'The interface request timed out, please refresh the page and try again!',
88
apiRequestFailed: 'The interface request failed, please try again later!',
99
networkException: 'network anomaly',
10-
networkExceptionMsg:
11-
'Please check if your network connection is normal! The network is abnormal',
10+
networkExceptionMsg: 'Please check if your network connection is normal! The network is abnormal',
11+
getUserInfoErrorMessage: 'Failed to obtain user information. Please log in again!',
1212

13-
errMsg401: 'The user does not have permission (token, user name, password error)!',
13+
errMsg401: 'The request interface requires authentication. You failed authentication or the session timed out. Please log in again!',
1414
errMsg403: 'The user is authorized, but access is forbidden!',
1515
errMsg404: 'Network request error, the resource was not found!',
1616
errMsg405: 'Network request error, request method not allowed!',

apps/vue/src/locales/lang/zh-CN/sys.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@ export default {
88
apiRequestFailed: '请求出错,请稍候重试',
99
networkException: '网络异常',
1010
networkExceptionMsg: '网络异常,请检查您的网络连接是否正常!',
11+
getUserInfoErrorMessage: '获取用户信息失败, 请重新登录!',
1112

12-
errMsg401: '用户没有权限(令牌、用户名、密码错误)!',
13+
errMsg401: '请求接口需要验证身份,您未通过认证或会话已超时, 请重新登录!',
1314
errMsg403: '用户得到授权,但是访问是被禁止的。!',
1415
errMsg404: '网络请求错误,未找到该资源!',
1516
errMsg405: '网络请求错误,请求方法未允许!',

apps/vue/src/utils/http/axios/checkStatus.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ export function checkStatus(
6868
errMessage = t('sys.api.errMsg505');
6969
break;
7070
default:
71+
errMessage = t('sys.api.apiRequestFailed');
72+
break;
7173
}
7274

7375
if (errMessage) {
@@ -80,16 +82,6 @@ export function checkStatus(
8082
}
8183

8284
export function checkResponse(response: any): string | undefined {
83-
if (!response?.data) {
84-
// 都没捕获到则提示默认错误信息
85-
const { t } = useI18n();
86-
const message = t('sys.api.apiRequestFailed');
87-
checkStatus(response.status, message);
88-
return message;
89-
}
90-
91-
let errorJson = response.data.error;
92-
9385
// 会话超时
9486
if (response.status === 401) {
9587
const userStore = useUserStoreWithOut();
@@ -98,6 +90,14 @@ export function checkResponse(response: any): string | undefined {
9890
const { t } = useI18n();
9991
return t('sys.api.errMsg401');
10092
}
93+
94+
if (!response?.data) {
95+
// 都没捕获到则提示默认错误信息
96+
checkStatus(response, '');
97+
return undefined;
98+
}
99+
100+
let errorJson = response.data.error;
101101

102102
// abp框架抛出异常信息
103103
if (response.headers['_abperrorformat'] === 'true') {
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
<template>
2+
<BasicModal
3+
@register="registerModal"
4+
:title="L('TextTemplates')"
5+
:width="800"
6+
:min-height="400"
7+
@ok="handleSubmit"
8+
>
9+
<BasicForm @register="registerForm" />
10+
</BasicModal>
11+
</template>
12+
13+
<script lang="ts" setup>
14+
import { reactive, nextTick } from 'vue';
15+
import { BasicForm, useForm } from '/@/components/Form';
16+
import { BasicModal, useModalInner } from '/@/components/Modal';
17+
import { useMessage } from '/@/hooks/web/useMessage';
18+
import { useLocalization } from '/@/hooks/abp/useLocalization';
19+
import { GetByNameAsyncByName, CreateAsyncByInput, UpdateAsyncByNameAndInput } from '/@/api/text-templating/definitions';
20+
import { getModalFormSchemas } from '../datas/ModalData';
21+
22+
const emits = defineEmits(['register', 'change']);
23+
24+
const state = reactive({
25+
isEdit: false
26+
});
27+
const { createMessage } = useMessage();
28+
const { L } = useLocalization(['AbpTextTemplating']);
29+
const [registerForm, { resetFields, setFieldsValue, validate, updateSchema }] = useForm({
30+
labelWidth: 150,
31+
showActionButtonGroup: false,
32+
schemas: getModalFormSchemas(),
33+
});
34+
const [registerModal, { changeLoading, changeOkLoading, closeModal }] = useModalInner((data) => {
35+
nextTick(() => {
36+
fetch(data?.name);
37+
});
38+
});
39+
40+
function fetch(name?: string) {
41+
state.isEdit = false;
42+
resetFields();
43+
if (!name) {
44+
updateSchema({
45+
field: 'name',
46+
dynamicDisabled: state.isEdit,
47+
});
48+
return;
49+
}
50+
changeLoading(true);
51+
changeOkLoading(true);
52+
GetByNameAsyncByName(name).then((res) => {
53+
state.isEdit = true;
54+
updateSchema({
55+
field: 'name',
56+
dynamicDisabled: state.isEdit,
57+
});
58+
setFieldsValue(res);
59+
if (res.formatedDisplayName) {
60+
// L:XXX,YYY
61+
const splitChars = res.formatedDisplayName.split(',');
62+
if (splitChars.length >= 2 && splitChars[0].startsWith('L:')) {
63+
const resource = splitChars[0].substring(2);
64+
setFieldsValue({
65+
resource: resource,
66+
text: splitChars[1],
67+
});
68+
}
69+
}
70+
}).finally(() => {
71+
changeLoading(false);
72+
changeOkLoading(false);
73+
});
74+
}
75+
76+
function handleSubmit() {
77+
validate().then((input) => {
78+
input.displayName = `L:${input.resource},${input.text}`;
79+
changeLoading(true);
80+
changeOkLoading(true);
81+
const submitApi = state.isEdit
82+
? UpdateAsyncByNameAndInput(input.name, input)
83+
: CreateAsyncByInput(input);
84+
submitApi.then((res) => {
85+
setFieldsValue(res);
86+
createMessage.success(L('Successful'));
87+
emits('change', res);
88+
closeModal();
89+
}).finally(() => {
90+
changeLoading(false);
91+
changeOkLoading(false);
92+
});
93+
});
94+
}
95+
</script>
96+
97+
<style lang="less" scoped>
98+
99+
</style>

apps/vue/src/views/text-templating/templates/components/TemplateDefinitionTable.vue

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
11
<template>
22
<div>
33
<BasicTable @register="registerTable">
4+
<template #toolbar>
5+
<Button
6+
v-auth="['AbpTextTemplating.TextTemplateDefinitions.Create']"
7+
type="primary"
8+
@click="handleAddNew"
9+
>{{ L('TextTemplates:AddNew') }}
10+
</Button>
11+
</template>
412
<template #bodyCell="{ column, record }">
513
<template v-if="column.key === 'isStatic'">
614
<CheckOutlined v-if="record.isStatic" class="enable" />
@@ -16,12 +24,15 @@
1624
</template>
1725
<template v-else-if="column.key === 'action'">
1826
<TableAction
19-
v-auth="['AbpTextTemplating.TextTemplateDefinitions', 'AbpTextTemplating.TextTemplateDefinitions.Delete']"
27+
v-auth="[
28+
'AbpTextTemplating.TextTemplateDefinitions.Update',
29+
'AbpTextTemplating.TextTemplateDefinitions.Delete',
30+
'AbpTextTemplating.TextTemplateContents.Update']"
2031
:stop-button-propagation="true"
2132
:actions="[
2233
{
2334
auth: 'AbpTextTemplating.TextTemplateDefinitions.Update',
24-
label: L('Update'),
35+
label: L('Edit'),
2536
icon: 'ant-design:edit-outlined',
2637
onClick: handleEdit.bind(null, record),
2738
},
@@ -35,7 +46,7 @@
3546
]"
3647
:dropDownActions="[
3748
{
38-
auth: 'AbpTextTemplating.TextTemplateContent.Update',
49+
auth: 'AbpTextTemplating.TextTemplateContents.Update',
3950
label: L('EditContents'),
4051
icon: 'ant-design:edit-outlined',
4152
onClick: handleEditContent.bind(null, record),
@@ -45,11 +56,13 @@
4556
</template>
4657
</template>
4758
</BasicTable>
48-
<TemplateContentModal @register="registerModal" />
59+
<TemplateContentModal @register="registerContentModal" />
60+
<TemplateDefinitionModal @register="registerEditModal" @change="reload" />
4961
</div>
5062
</template>
5163

5264
<script lang="ts" setup>
65+
import { Button } from 'ant-design-vue';
5366
import { CheckOutlined, CloseOutlined } from '@ant-design/icons-vue';
5467
import { useModal } from '/@/components/Modal';
5568
import { BasicTable, TableAction, useTable } from '/@/components/Table';
@@ -61,10 +74,12 @@
6174
import { TextTemplateDefinitionDto } from '/@/api/text-templating/definitions/model';
6275
import { formatPagedRequest } from '/@/utils/http/abp/helper';
6376
import TemplateContentModal from './TemplateContentModal.vue';
77+
import TemplateDefinitionModal from './TemplateDefinitionModal.vue';
6478
6579
const { L } = useLocalization(['AbpTextTemplating', 'AbpUi']);
6680
const { createConfirm, createMessage } = useMessage();
67-
const [registerModal, { openModal }] = useModal();
81+
const [registerEditModal, { openModal: openEditModal }] = useModal();
82+
const [registerContentModal, { openModal: openContentModal }] = useModal();
6883
const [registerTable, { reload }] = useTable({
6984
rowKey: 'name',
7085
title: L('TextTemplates'),
@@ -87,12 +102,16 @@
87102
},
88103
});
89104
105+
function handleAddNew() {
106+
openEditModal(true, {});
107+
}
108+
90109
function handleEdit(record: TextTemplateDefinitionDto) {
91-
console.log('This method is not implemented', record);
110+
openEditModal(true, record);
92111
}
93112
94113
function handleEditContent(record: TextTemplateDefinitionDto) {
95-
openModal(true, record);
114+
openContentModal(true, record);
96115
}
97116
98117
function handleDelete(record: TextTemplateDefinitionDto) {

0 commit comments

Comments
 (0)