调整composeAccessPath方法,出现多域名情况

This commit is contained in:
wkj 2025-06-12 15:04:37 +08:00
parent 246db21ab6
commit 049e1bef32
23 changed files with 136 additions and 96 deletions

View File

@ -551,7 +551,7 @@ export async function verifyPassword(params, context) {
}, {});
}
export async function loginByAccount(params, context) {
const { account, password, env, } = params;
const { account, password, env } = params;
let needUpdatePassword = false;
const loginLogic = async () => {
const systemId = context.getSystemId();
@ -621,6 +621,7 @@ export async function loginByAccount(params, context) {
data: {
id: 1,
password: 1,
passwordSha1: 1,
email$user: {
$entity: 'email',
data: {
@ -678,7 +679,7 @@ export async function loginByAccount(params, context) {
const allowEmail = !!applicationPassports.find((ele) => ele.passport?.type === 'email');
const [userRow] = result;
const { email$user, id: userId, } = userRow;
needUpdatePassword = !userRow.password;
needUpdatePassword = !(userRow.password || userRow.passwordSha1);
if (allowEmail) {
const email = email$user?.find(ele => ele.email.toLowerCase() === account.toLowerCase());
if (email) {
@ -724,6 +725,7 @@ export async function loginByAccount(params, context) {
data: {
id: 1,
password: 1,
passwordSha1: 1,
mobile$user: {
$entity: 'mobile',
data: {
@ -780,7 +782,7 @@ export async function loginByAccount(params, context) {
});
const [userRow] = result;
const { mobile$user, id: userId, } = userRow;
needUpdatePassword = !userRow.password;
needUpdatePassword = !(userRow.password || userRow.passwordSha1);
const allowSms = !!applicationPassports.find((ele) => ele.passport?.type === 'sms');
if (allowSms) {
const mobile = mobile$user?.find(ele => ele.mobile === account);
@ -827,6 +829,7 @@ export async function loginByAccount(params, context) {
data: {
id: 1,
password: 1,
passwordSha1: 1,
loginName$user: {
$entity: 'loginName',
data: {
@ -862,7 +865,7 @@ export async function loginByAccount(params, context) {
}
case 1: {
const [userRow] = result;
needUpdatePassword = !userRow.password;
needUpdatePassword = !(userRow.password || userRow.passwordSha1);
const { loginName$user, id: userId, } = userRow;
const loginName = loginName$user?.find((ele) => ele.name.toLowerCase() === account.toLowerCase());
if (loginName) {
@ -915,8 +918,9 @@ export async function loginByAccount(params, context) {
await context.operate('user', {
id: await generateNewIdAsync(),
action: 'update',
data: password ? {
data: needUpdatePassword ? {
password,
passwordSha1: encryptPasswordSha1(password),
verifyPasswordAt: Date.now(),
} : {
verifyPasswordAt: Date.now(),
@ -2523,8 +2527,8 @@ export async function refreshToken(params, context) {
// 只有server模式去刷新token
// 'development' | 'production' | 'staging'
const intervals = {
development: 7200 * 1000,
staging: 600 * 1000,
development: 7200 * 1000, // 2小时
staging: 600 * 1000, // 十分钟
production: 600 * 1000, // 十分钟
};
let applicationId = token.applicationId;

View File

@ -1,2 +1,2 @@
declare const checkers: (import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "address", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "application", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "applicationPassport", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "token", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "user", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "userEntityGrant", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "wechatQrCode", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "mobile", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "wechatPublicTag", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "message", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "parasite", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "system", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "platform", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>>)[];
declare const checkers: (import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "parasite", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "wechatPublicTag", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "mobile", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "userEntityGrant", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "applicationPassport", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "platform", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "system", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "message", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "user", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "application", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "address", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "token", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "wechatQrCode", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>>)[];
export default checkers;

View File

@ -1,28 +1,5 @@
const SEND_KEY = 'captcha:sendAt';
const SEND_CAPTCHA_LATENCY = process.env.NODE_ENV === 'development' ? 10 : 60;
export default OakComponent({
isList: false,
// entity: 'user',
// projection: {
// id: 1,
// name: 1,
// nickname: 1,
// mobile$user: {
// $entity: 'mobile',
// data: {
// id: 1,
// mobile: 1,
// },
// filter: {
// ableState: 'enabled'
// }
// }
// },
// formData: function ({ data: user, features, props }) {
// return {
// user,
// };
// },
data: {
channels: [],
loading: false,

View File

@ -1,7 +1,7 @@
import { Style } from '../../../../types/Style';
declare const _default: (props: import("oak-frontend-base").ReactComponentProps<import("../../../../oak-app-domain").EntityDict, keyof import("../../../../oak-app-domain").EntityDict, false, {
style: Style;
entity: "platform" | "application" | "system";
entity: "application" | "system" | "platform";
entityId: string;
name: string;
}>) => React.ReactElement;

View File

@ -15,7 +15,7 @@ declare const _default: <ED2 extends EntityDict & BaseEntityDict, T2 extends key
type?: ButtonProps['type'] | AmButtonProps['type'];
executeText?: string | undefined;
buttonProps?: (ButtonProps & {
color?: "default" | "success" | "primary" | "danger" | "warning" | undefined;
color?: "default" | "success" | "primary" | "warning" | "danger" | undefined;
fill?: "none" | "outline" | "solid" | undefined;
size?: "small" | "middle" | "large" | "mini" | undefined;
block?: boolean | undefined;
@ -24,7 +24,7 @@ declare const _default: <ED2 extends EntityDict & BaseEntityDict, T2 extends key
loadingIcon?: import("react").ReactNode;
disabled?: boolean | undefined;
onClick?: ((event: import("react").MouseEvent<HTMLButtonElement, MouseEvent>) => unknown) | undefined;
type?: "submit" | "reset" | "button" | undefined;
type?: "button" | "submit" | "reset" | undefined;
shape?: "default" | "rounded" | "rectangular" | undefined;
children?: import("react").ReactNode;
} & Pick<import("react").ClassAttributes<HTMLButtonElement> & import("react").ButtonHTMLAttributes<HTMLButtonElement>, "id" | "onMouseDown" | "onMouseUp" | "onTouchEnd" | "onTouchStart"> & {

View File

@ -1,3 +1,4 @@
import { encryptPasswordSha1 } from '../../../../utils/password';
export default OakComponent({
entity: 'user',
projection: {
@ -77,7 +78,7 @@ export default OakComponent({
},
async commit() {
const { pwd } = this.state;
this.update({ password: pwd });
this.update({ password: pwd, passwordSha1: encryptPasswordSha1(pwd) });
await this.execute();
this.setState({
successful: true,

View File

@ -1,6 +1,6 @@
import { EntityDict } from '../../../oak-app-domain';
declare const _default: (props: import("oak-frontend-base").ReactComponentProps<EntityDict, keyof EntityDict, false, {
type: "bind" | "login";
type: "login" | "bind";
url: string;
size: undefined;
}>) => React.ReactElement;

View File

@ -35,6 +35,7 @@ export declare abstract class BackendRuntimeContext<ED extends EntityDict & Base
isReallyRoot(): boolean;
sendMessage(data: ED['message']['CreateOperationData']): Promise<import("oak-domain/lib/types").OperationResult<ED>>;
allowUserUpdate(): boolean;
protected sortDomains(domains: ED['domain']['Schema'][]): ED['domain']['Schema'][];
/**
* 访application/system/domain之间的关联
* http://www.xxx.com/oak-api

View File

@ -11,6 +11,7 @@ import { cloneDeep, unset } from 'oak-domain/lib/utils/lodash';
import { composeServerUrl } from '../utils/domain';
import { maskPassword } from '../utils/user';
import { compareVersion } from 'oak-domain/lib/utils/version';
import { isIP } from 'oak-domain/lib/utils/validator';
/**
* general数据结构要求的后台上下文
*/
@ -406,17 +407,39 @@ export class BackendRuntimeContext extends BRC {
}
throw new OakUnloggedInException('您尚未登录');
}
sortDomains(domains) {
return domains.sort((a, b) => {
const getPriority = (domain) => {
if (typeof domain.url !== 'string')
return 3;
const lowerItem = domain.url.toLowerCase();
// 1. 检查是否是localhost
if (lowerItem === 'localhost')
return 2;
// 2. 检查是否是IPv4或IPv6
if (isIP(domain.url))
return 1;
// 3. 其他情况认为是域名
return 0;
};
return getPriority(a) - getPriority(b);
});
}
/**
* 获得当前系统的访问路径根据application/system/domain之间的关联
* http://www.xxx.com/oak-api
*/
composeAccessPath() {
const application = this.getApplication();
const { system } = application;
const { system, domainId, domain } = application;
if (domainId) {
assert(domain);
return composeServerUrl(domain);
}
const { domain$system: domains } = system;
assert(domains && domains.length === 1);
const [domain] = domains;
return composeServerUrl(domain);
assert(domains && domains.length > 0);
const findDomain = this.sortDomains(domains)?.[0];
return composeServerUrl(findDomain);
}
async tryDeduceException(err) {
if (this.application && this.appVersion) {

View File

@ -1,2 +1,2 @@
declare const _default: (import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "message", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "address", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "application", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "article", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "articleMenu", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "extraFile", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "user", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "userEntityGrant", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatQrCode", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "notification", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatLogin", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "parasite", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "sessionMessage", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatMenu", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatPublicTag", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatMpJump", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "system", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "passport", import("..").BRC<import("../oak-app-domain").EntityDict>>)[];
declare const _default: (import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "system", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatMpJump", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatMenu", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "sessionMessage", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatLogin", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "notification", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatQrCode", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "userEntityGrant", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "user", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "articleMenu", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "article", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "application", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "message", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "address", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "extraFile", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "parasite", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatPublicTag", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "passport", import("..").BRC<import("../oak-app-domain").EntityDict>>)[];
export default _default;

View File

@ -106,7 +106,7 @@ async function createSession(params, context) {
origin: 'wechat',
type: 'image',
tag1: 'image',
objectId: await (0, uuid_1.generateNewIdAsync)(),
objectId: await (0, uuid_1.generateNewIdAsync)(), // 这个域用来标识唯一性
sort: 1000,
uploadState: 'success',
extra1: data.MediaId,
@ -131,7 +131,7 @@ async function createSession(params, context) {
origin: 'wechat',
type: 'video',
tag1: 'video',
objectId: await (0, uuid_1.generateNewIdAsync)(),
objectId: await (0, uuid_1.generateNewIdAsync)(), // 这个域用来标识唯一性
sort: 1000,
uploadState: 'success',
extra1: data.MediaId,
@ -153,7 +153,7 @@ async function createSession(params, context) {
origin: 'wechat',
type: 'audio',
tag1: 'audio',
objectId: await (0, uuid_1.generateNewIdAsync)(),
objectId: await (0, uuid_1.generateNewIdAsync)(), // 这个域用来标识唯一性
sort: 1000,
uploadState: 'success',
extra1: data.MediaId,

View File

@ -557,7 +557,7 @@ async function verifyPassword(params, context) {
}
exports.verifyPassword = verifyPassword;
async function loginByAccount(params, context) {
const { account, password, env, } = params;
const { account, password, env } = params;
let needUpdatePassword = false;
const loginLogic = async () => {
const systemId = context.getSystemId();
@ -627,6 +627,7 @@ async function loginByAccount(params, context) {
data: {
id: 1,
password: 1,
passwordSha1: 1,
email$user: {
$entity: 'email',
data: {
@ -684,7 +685,7 @@ async function loginByAccount(params, context) {
const allowEmail = !!applicationPassports.find((ele) => ele.passport?.type === 'email');
const [userRow] = result;
const { email$user, id: userId, } = userRow;
needUpdatePassword = !userRow.password;
needUpdatePassword = !(userRow.password || userRow.passwordSha1);
if (allowEmail) {
const email = email$user?.find(ele => ele.email.toLowerCase() === account.toLowerCase());
if (email) {
@ -730,6 +731,7 @@ async function loginByAccount(params, context) {
data: {
id: 1,
password: 1,
passwordSha1: 1,
mobile$user: {
$entity: 'mobile',
data: {
@ -786,7 +788,7 @@ async function loginByAccount(params, context) {
});
const [userRow] = result;
const { mobile$user, id: userId, } = userRow;
needUpdatePassword = !userRow.password;
needUpdatePassword = !(userRow.password || userRow.passwordSha1);
const allowSms = !!applicationPassports.find((ele) => ele.passport?.type === 'sms');
if (allowSms) {
const mobile = mobile$user?.find(ele => ele.mobile === account);
@ -833,6 +835,7 @@ async function loginByAccount(params, context) {
data: {
id: 1,
password: 1,
passwordSha1: 1,
loginName$user: {
$entity: 'loginName',
data: {
@ -868,7 +871,7 @@ async function loginByAccount(params, context) {
}
case 1: {
const [userRow] = result;
needUpdatePassword = !userRow.password;
needUpdatePassword = !(userRow.password || userRow.passwordSha1);
const { loginName$user, id: userId, } = userRow;
const loginName = loginName$user?.find((ele) => ele.name.toLowerCase() === account.toLowerCase());
if (loginName) {
@ -921,8 +924,9 @@ async function loginByAccount(params, context) {
await context.operate('user', {
id: await (0, uuid_1.generateNewIdAsync)(),
action: 'update',
data: password ? {
data: needUpdatePassword ? {
password,
passwordSha1: (0, password_1.encryptPasswordSha1)(password),
verifyPasswordAt: Date.now(),
} : {
verifyPasswordAt: Date.now(),
@ -2545,8 +2549,8 @@ async function refreshToken(params, context) {
// 只有server模式去刷新token
// 'development' | 'production' | 'staging'
const intervals = {
development: 7200 * 1000,
staging: 600 * 1000,
development: 7200 * 1000, // 2小时
staging: 600 * 1000, // 十分钟
production: 600 * 1000, // 十分钟
};
let applicationId = token.applicationId;

View File

@ -165,7 +165,7 @@ async function createWechatQrCode(options, context) {
permanent,
url,
expired: false,
expiresAt: Date.now() + 2592000 * 1000,
expiresAt: Date.now() + 2592000 * 1000, // wecharQrCode里的过期时间都放到最大由上层关联对象来主动过期by Xc, 20230131)
props,
};
// 直接创建

View File

@ -35,6 +35,7 @@ export declare abstract class BackendRuntimeContext<ED extends EntityDict & Base
isReallyRoot(): boolean;
sendMessage(data: ED['message']['CreateOperationData']): Promise<import("oak-domain/lib/types").OperationResult<ED>>;
allowUserUpdate(): boolean;
protected sortDomains(domains: ED['domain']['Schema'][]): ED['domain']['Schema'][];
/**
* 访application/system/domain之间的关联
* http://www.xxx.com/oak-api

View File

@ -14,6 +14,7 @@ const lodash_1 = require("oak-domain/lib/utils/lodash");
const domain_1 = require("../utils/domain");
const user_1 = require("../utils/user");
const version_1 = require("oak-domain/lib/utils/version");
const validator_1 = require("oak-domain/lib/utils/validator");
/**
* general数据结构要求的后台上下文
*/
@ -409,17 +410,39 @@ class BackendRuntimeContext extends BackendRuntimeContext_1.BackendRuntimeContex
}
throw new Exception_2.OakUnloggedInException('您尚未登录');
}
sortDomains(domains) {
return domains.sort((a, b) => {
const getPriority = (domain) => {
if (typeof domain.url !== 'string')
return 3;
const lowerItem = domain.url.toLowerCase();
// 1. 检查是否是localhost
if (lowerItem === 'localhost')
return 2;
// 2. 检查是否是IPv4或IPv6
if ((0, validator_1.isIP)(domain.url))
return 1;
// 3. 其他情况认为是域名
return 0;
};
return getPriority(a) - getPriority(b);
});
}
/**
* 获得当前系统的访问路径根据application/system/domain之间的关联
* http://www.xxx.com/oak-api
*/
composeAccessPath() {
const application = this.getApplication();
const { system } = application;
const { system, domainId, domain } = application;
if (domainId) {
(0, assert_1.assert)(domain);
return (0, domain_1.composeServerUrl)(domain);
}
const { domain$system: domains } = system;
(0, assert_1.assert)(domains && domains.length === 1);
const [domain] = domains;
return (0, domain_1.composeServerUrl)(domain);
(0, assert_1.assert)(domains && domains.length > 0);
const findDomain = this.sortDomains(domains)?.[0];
return (0, domain_1.composeServerUrl)(findDomain);
}
async tryDeduceException(err) {
if (this.application && this.appVersion) {

View File

@ -1,2 +1,2 @@
declare const _default: (import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "passport", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "system", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatMpJump", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatPublicTag", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatMenu", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "sessionMessage", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "parasite", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatLogin", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "notification", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatQrCode", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "userEntityGrant", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "user", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "extraFile", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "articleMenu", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "article", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "application", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "address", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "message", import("..").BRC<import("../oak-app-domain").EntityDict>>)[];
declare const _default: (import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "message", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "address", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "application", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "article", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "articleMenu", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "extraFile", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "user", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "userEntityGrant", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatQrCode", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "notification", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatLogin", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "parasite", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "sessionMessage", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatMenu", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatPublicTag", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatMpJump", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "system", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "passport", import("..").BRC<import("../oak-app-domain").EntityDict>>)[];
export default _default;

View File

@ -64,7 +64,7 @@ async function sendNotification(notification, context) {
await instance.sendSubscribedMessage({
templateId: templateId,
data: data,
openId: data1.openId,
openId: data1.openId, // 在notification创建时就赋值了
page,
state: StateDict[process.env.NODE_ENV],
});

View File

@ -14,7 +14,7 @@ export declare function createToDo<ED extends EntityDict & BaseEntityDict, T ext
redirectTo: EntityDict['toDo']['OpSchema']['redirectTo'];
entity: any;
entityId: string;
}, userIds?: string[]): Promise<1 | 0>;
}, userIds?: string[]): Promise<0 | 1>;
/**
* todo例程entity对象上进行action操作时filtertodo完成
* entity的action的后trigger中调用

View File

@ -752,7 +752,7 @@ export async function loginByAccount<ED extends EntityDict>(
},
context: BRC<ED>
): Promise<string> {
const { account, password, env, } = params;
const { account, password, env } = params;
let needUpdatePassword = false;
const loginLogic = async () => {
@ -830,6 +830,7 @@ export async function loginByAccount<ED extends EntityDict>(
data: {
id: 1,
password: 1,
passwordSha1: 1,
email$user: {
$entity: 'email',
data: {
@ -893,7 +894,7 @@ export async function loginByAccount<ED extends EntityDict>(
const allowEmail = !!applicationPassports.find((ele) => ele.passport?.type === 'email');
const [userRow] = result;
const { email$user, id: userId, } = userRow;
needUpdatePassword = !userRow.password;
needUpdatePassword = !(userRow.password || userRow.passwordSha1);
if (allowEmail) {
const email = email$user?.find(ele => ele.email.toLowerCase() === account.toLowerCase());
if (email) {
@ -945,6 +946,7 @@ export async function loginByAccount<ED extends EntityDict>(
data: {
id: 1,
password: 1,
passwordSha1: 1,
mobile$user: {
$entity: 'mobile',
data: {
@ -1008,7 +1010,7 @@ export async function loginByAccount<ED extends EntityDict>(
);
const [userRow] = result;
const { mobile$user, id: userId, } = userRow;
needUpdatePassword = !userRow.password;
needUpdatePassword = !(userRow.password || userRow.passwordSha1);
const allowSms = !!applicationPassports.find((ele) => ele.passport?.type === 'sms');
if (allowSms) {
@ -1062,6 +1064,7 @@ export async function loginByAccount<ED extends EntityDict>(
data: {
id: 1,
password: 1,
passwordSha1: 1,
loginName$user: {
$entity: 'loginName',
data: {
@ -1100,7 +1103,7 @@ export async function loginByAccount<ED extends EntityDict>(
}
case 1: {
const [userRow] = result;
needUpdatePassword = !userRow.password;
needUpdatePassword = !(userRow.password || userRow.passwordSha1);
const { loginName$user, id: userId, } = userRow;
const loginName = loginName$user?.find((ele) => ele.name.toLowerCase() === account.toLowerCase());
if (loginName) {
@ -1160,8 +1163,9 @@ export async function loginByAccount<ED extends EntityDict>(
await context.operate('user', {
id: await generateNewIdAsync(),
action: 'update',
data: password ? {
data: needUpdatePassword ? {
password,
passwordSha1: encryptPasswordSha1(password),
verifyPasswordAt: Date.now(),
}: {
verifyPasswordAt: Date.now(),

View File

@ -1,31 +1,6 @@
import { encryptPasswordSha1 } from '../../utils/password';
import dayjs from 'dayjs';
const SEND_KEY = 'captcha:sendAt';
const SEND_CAPTCHA_LATENCY = process.env.NODE_ENV === 'development' ? 10 : 60;
export default OakComponent({
isList: false,
// entity: 'user',
// projection: {
// id: 1,
// name: 1,
// nickname: 1,
// mobile$user: {
// $entity: 'mobile',
// data: {
// id: 1,
// mobile: 1,
// },
// filter: {
// ableState: 'enabled'
// }
// }
// },
// formData: function ({ data: user, features, props }) {
// return {
// user,
// };
// },
data: {
channels: [] as string[],
loading: false,

View File

@ -1,3 +1,5 @@
import { encryptPasswordSha1 } from '../../../../utils/password';
export default OakComponent({
entity: 'user',
projection: {
@ -78,7 +80,7 @@ export default OakComponent({
},
async commit() {
const { pwd } = this.state;
this.update({ password: pwd });
this.update({ password: pwd, passwordSha1: encryptPasswordSha1(pwd!) });
await this.execute();
this.setState({
successful: true,

View File

@ -234,8 +234,7 @@ export default function Render(
setPassword2(strValue);
if (password === strValue) {
update({
passwordSha1:
encryptPasswordSha1(password),
passwordSha1: encryptPasswordSha1(password),
});
}
setPasswordConfirm(

View File

@ -23,6 +23,7 @@ import { cloneDeep, unset } from 'oak-domain/lib/utils/lodash';
import { composeServerUrl } from '../utils/domain';
import { maskPassword } from '../utils/user';
import { compareVersion } from 'oak-domain/lib/utils/version';
import { isIP } from 'oak-domain/lib/utils/validator';
/**
* general数据结构要求的后台上下文
*/
@ -478,18 +479,43 @@ export abstract class BackendRuntimeContext<ED extends EntityDict & BaseEntityDi
throw new OakUnloggedInException('您尚未登录');
}
protected sortDomains(domains: ED['domain']['Schema'][]): ED['domain']['Schema'][] {
return domains.sort((a, b) => {
const getPriority = (domain: EntityDict['domain']['Schema']) => {
if (typeof domain.url !== 'string') return 3;
const lowerItem = domain.url.toLowerCase();
// 1. 检查是否是localhost
if (lowerItem === 'localhost') return 2;
// 2. 检查是否是IPv4或IPv6
if (isIP(domain.url)) return 1;
// 3. 其他情况认为是域名
return 0;
};
return getPriority(a) - getPriority(b);
});
}
/**
* 访application/system/domain之间的关联
* http://www.xxx.com/oak-api
*/
composeAccessPath(): string {
const application = this.getApplication();
const { system } = application!;
const { system, domainId, domain } = application!;
if (domainId) {
assert(domain);
return composeServerUrl(domain as EntityDict['domain']['Schema']);
}
const { domain$system: domains } = system!;
assert(domains && domains.length === 1);
const [ domain ] = domains;
assert(domains && domains.length > 0);
const findDomain = this.sortDomains(domains as EntityDict['domain']['Schema'][])?.[0];
return composeServerUrl(domain as EntityDict['domain']['Schema']);
return composeServerUrl(findDomain as EntityDict['domain']['Schema']);
}
async tryDeduceException(err: Error): Promise<OakException<any> | void> {