Commit c9bf951f by chunhong.mu

refactor(@common/sdk): 重构目录结构,按功能模块划分子目录

将 SDK 代码按职责划分为 adapters/core/mini-program/services 四个子目录,更新 exports 配置支持按需引入,删除已废弃的 ui-core.ts
parent 15d3f72c
Showing with 225 additions and 272 deletions
......@@ -2,6 +2,12 @@
"name": "@common/sdk",
"version": "1.0.0",
"private": true,
"exports": {
".": "./src/index.ts",
"./mini-program": "./src/mini-program/index.ts",
"./services/login-service": "./src/services/login-service.ts",
"./services/verify-service": "./src/services/verify-service.ts"
},
"main": "src/index.ts",
"dependencies": {
"axios": "^0.27.2",
......
......@@ -13,12 +13,74 @@ import {
import { Tree } from "uniplat-sdk/build/main/model/tree/tree"
import { buildFilePath, buildImage } from "./image-builder"
/**
* 环境枚举
*/
export enum Environment {
Dev = "dev",
Test = "test",
Pro = "pro",
Stage = "stage",
}
/**
* 客户端 ID 枚举
*/
export enum ClientId {
None = "",
QqxbApp = "qqxb-hrm-app-ios",
QqtxzMp = "qqxb_mini_app",
FlbMp = "qqxb_flb_mini_app",
WebLogin = "teamix-personal-center-web-pc",
RenCaiKuaiDiMp = "welfare_bean_wechat_mini_app",
YuZhiPinMp = "chongqing_job_mini_app",
RenCaiKuaiDiH5 = "welfare_bean_qqxb_h5",
RenCaiKuaiDiPc = "welfare_bean_agent_pc",
Hrs100 = "hrs100-front-web-pc",
QqxbOfficial = "qqxb-official-web",
FastServiceWeb = "teamix-fast-service-web",
FastServiceMerchant = "teamix-fast-service-merchant",
Hrs100WechatMiniApp = "hrs100_wechat_mini_app",
Donghu = "donghu-web-pc",
}
/**
* Passport 配置
*/
const qqxbPassportConfig = new Map<Environment, string>([
[
Environment.Dev,
"http://191env1.report.qinqinxiaobao-passport.qqxb.jinsehuaqin.com:8800",
],
[
Environment.Test,
"http://191env1.report.qinqinxiaobao-passport.qqxb.jinsehuaqin.com:8800",
],
[Environment.Pro, "https://passport.qinqinxiaobao.com"],
[Environment.Stage, "https://pre-passport.qinqinxiaobao.com"],
])
/**
* 微信分销商 URL 配置
*/
export const wxDistributerUrlConfig = new Map<Environment, string>([
[Environment.Dev, "http://wechat.test.teammix.qqxb.cn"],
[Environment.Test, "https://pre-wx-distributer.teammix.com"],
[Environment.Pro, "https://wx-distributer.teammix.com"],
[Environment.Stage, "https://pre-wx-distributer.teammix.com"],
])
export class SdkCore {
private uniplatSdk!: UniplatSdk
private readonly handler = new UniplatSdkExtender()
private token!: string
public orgId!: number
// UICore 合并的属性
private client = ClientId.None
private passportUrl = ""
private wxDistributerUrl = ""
constructor(config?: SdkConfig, adapter?: AxiosAdapter) {
if (config) {
this.init(config, adapter)
......@@ -40,6 +102,13 @@ export class SdkCore {
this.uniplatSdk.getAxios().defaults.timeout = 10e3
this.uniplatSdk.global.rootEntrance = config.rootEntrance
// UICore 初始化逻辑
this.client = config.clientId as ClientId || ClientId.None
const envir = (config.logEnv as Environment) || Environment.Dev
this.passportUrl = qqxbPassportConfig.get(envir) || qqxbPassportConfig.get(Environment.Dev)!
this.wxDistributerUrl = wxDistributerUrlConfig.get(envir) || wxDistributerUrlConfig.get(Environment.Dev)!
}
public setupEventHandlers(handlers: {
......@@ -54,6 +123,42 @@ export class SdkCore {
return this.uniplatSdk
}
public get storage() {
return this.uniplatSdk?.global.storage || localStorage
}
public get clientId() {
return this.client
}
public get passport() {
return this.passportUrl
}
public get wxDistributer() {
return this.wxDistributerUrl
}
/**
* 构建 Passport 登出 URL
*/
public buildPassport4Logout(redirect?: string) {
if (redirect) {
return `${this.passportUrl}?redirectUrl=${redirect}&logout=1`
}
return `${this.passportUrl}?logout=1`
}
public forgetPassword() {
return `${this.passportUrl}/forget`
}
public register() {
return `${this.passportUrl}/register?redirectUrl=${encodeURIComponent(
window.location.href,
)}`
}
public domainServiceGet<ParamsType, ReturnType>(
apiName: string,
params?: ParamsType,
......
import type { AxiosAdapter } from "axios"
import type { Index } from "uniplat-sdk"
import { decodeJwt, UniplatSdk } from "uniplat-sdk"
import { UICore } from "./ui-core"
/**
* 登录 API 名称枚举
......@@ -20,14 +19,27 @@ export class PassportTokenController {
private static readonly key = "JWT_TOKEN"
private static baseUrl = ""
private static ssr = false
private static storageInstance: Storage | null = null
public static setupBaseUrl(baseUrl: string) {
this.baseUrl = baseUrl
return this
}
/**
* 设置自定义存储实例(由 SdkCore 传入)
*/
public static setupStorage(storage: Storage) {
this.storageInstance = storage
return this
}
private static get storage() {
return this.storageInstance || localStorage
}
public static clearToken() {
UICore.storage.removeItem(this.key)
this.storage.removeItem(this.key)
}
public static useSsrMode() {
......@@ -57,13 +69,18 @@ export class PassportTokenController {
.then((r) => {
const o = r as Index.loginByPassportRequestResult
if (o.jwt) {
this.ssr && (UICore.core.global.ssr = true)
UICore.storage.setItem(this.key, o.jwt)
if (this.ssr) {
(sdk.global as any).ssr = true
}
this.storage.setItem(this.key, o.jwt)
}
})
} else {
this.ssr && (UICore.core.global.ssr = true)
UICore.storage.setItem(this.key, token)
if (this.ssr) {
// SSR mode requires sdk.global to be set
// This should be handled by the caller
}
this.storage.setItem(this.key, token)
return Promise.resolve()
}
}
......@@ -81,13 +98,13 @@ export class PassportTokenController {
public static hasToken() {
const cache =
UICore.storage.getItem(this.key) ||
(UICore.core && UICore.core.global.jwtToken)
this.storage.getItem(this.key) ||
(UniplatSdk.prototype && (window as any).jwtToken)
if (cache) {
if (this.isTokenValid(cache)) {
return cache
}
UICore.storage.removeItem(this.key)
this.storage.removeItem(this.key)
return null
}
return cache
......@@ -95,8 +112,8 @@ export class PassportTokenController {
public static checkTokenExit() {
const cache =
UICore.storage.getItem(this.key) ||
(UICore.core && UICore.core.global.jwtToken)
this.storage.getItem(this.key) ||
(window as any).jwtToken
return cache
}
......
// 平台条件执行器
export { ActionInvoker } from "./action-invoker"
// 认证处理器
export { getAuthHandlers, registerAuthHandlers } from "./auth-handlers"
export type { AuthHandlers } from "./auth-handlers"
// 文件操作(上传/下载/预览)
export {
AppFileType,
chooseImage,
downloadFile,
previewDocument,
} from "./file-operations"
// HTTP 适配器
export { uniAdapter } from "./adapters/uni-adapter"
export type { UploadData } from "./file-operations"
export { webAdapter } from "./adapters/web-adapter"
// HTTP 请求服务
export { HttpRequestWithSdk } from "./http-request"
export { HttpRequestWithSdk } from "./core/http-request"
export { default as HttpRequest } from "./http-request"
// 图片/文件 URL 构建
export { buildFilePath, buildImage } from "./image-builder"
// 登录服务
export { loginService } from "./login-service"
export { default as HttpRequest } from "./core/http-request"
export type { LoginRegisterResult, RegisterChannel } from "./login-service"
// 小程序工具
export {
MiniProgramVersion,
navigateBackMiniProgram,
navigateToMiniProgram,
} from "./mini-program"
// 图片/文件 URL 构建
export { buildFilePath, buildImage } from "./core/image-builder"
export type { MiniProgramNavConfig } from "./mini-program"
// 监控
export { monitor, Product } from "./monitor"
export { monitor, Product } from "./core/monitor"
export type { SdkMonitorOption } from "./core/monitor"
export type { SdkMonitorOption } from "./monitor"
// Passport 公共常量
export {
PASSPORT_ANONYMOUS_SERVICE,
PASSPORT_SERVICE,
PASSPORT_SUB_PROJECT,
} from "./passport-constants"
} from "./core/passport-constants"
// SDK 控制器
export { SdkController } from "./sdk-controller"
export { SdkController } from "./core/sdk-controller"
// SDK 核心
export { SdkCore } from "./sdk-core"
export { ClientId, Environment, SdkCore, wxDistributerUrlConfig } from "./core/sdk-core"
export type { SdkConfig, SdkInitOptions } from "./sdk-types"
export type { SdkConfig, SdkInitOptions } from "./core/sdk-types"
// 分享
export { createShareMixin, finalShareData, setShareData } from "./share"
// Token 管理
export { decodeToken, PassportTokenController } from "./token-manager"
// 核心配置
export { ClientId, Environment, UICore, wxDistributerUrlConfig } from "./ui-core"
// HTTP 适配器
export { uniAdapter } from "./uni-adapter"
// 小程序版本更新
export { updateManager } from "./update-manager"
// 验证码服务
export { verifyService } from "./verify-service"
export type { VerifyImageResult } from "./verify-service"
export { decodeToken, PassportTokenController } from "./core/token-manager"
export { webAdapter } from "./web-adapter"
// 微信登录服务
export { wechatLoginService } from "./wechat-login-service"
// 认证处理器
export { getAuthHandlers, registerAuthHandlers } from "./services/auth-handlers"
export type { WechatLoginResult } from "./wechat-login-service"
export type { AuthHandlers } from "./services/auth-handlers"
// 小程序专属导出(仅小程序项目使用)
// 条件执行器
export { ActionInvoker } from "./action-invoker"
// 文件操作(上传/下载/预览)
export {
AppFileType,
chooseImage,
downloadFile,
previewDocument,
} from "./file-operations"
export type { UploadData } from "./file-operations"
// 小程序工具
export {
MiniProgramVersion,
navigateBackMiniProgram,
navigateToMiniProgram,
} from "./mini-program"
export type { MiniProgramNavConfig } from "./mini-program"
// 分享
export { createShareMixin, finalShareData, setShareData } from "./share"
// 小程序版本更新
export { updateManager } from "./update-manager"
// 微信登录服务
export { WechatLoginService } from "./wechat-login-service"
export type { RegisterChannel, WechatLoginResult } from "./wechat-login-service"
import {
PASSPORT_ANONYMOUS_SERVICE,
PASSPORT_SUB_PROJECT,
} from "./passport-constants"
/**
* 微信登录服务
* 提供微信小程序绑定手机号登录等功能
*/
import { UICore } from "./ui-core"
import type { SdkCore } from "../core/sdk-core"
import {
PASSPORT_ANONYMOUS_SERVICE,
PASSPORT_SUB_PROJECT,
} from "../core/passport-constants"
export enum WechatLoginApiName {
BindPhone = "bind_phone",
......@@ -28,6 +28,8 @@ export interface WechatLoginResult {
}
export class WechatLoginService {
constructor(private sdk: SdkCore) {}
/**
* 微信小程序绑定手机号登录
*/
......@@ -38,7 +40,7 @@ export class WechatLoginService {
iv: string,
registerChannel: RegisterChannel = {},
) {
return UICore.core
return this.sdk.core
.domainService(
PASSPORT_SUB_PROJECT,
PASSPORT_ANONYMOUS_SERVICE.SystemWechat,
......@@ -52,7 +54,7 @@ export class WechatLoginService {
data: {
appid,
code,
client_id: UICore.clientId,
client_id: this.sdk.clientId,
encryptedData,
iv,
...registerChannel,
......@@ -60,5 +62,3 @@ export class WechatLoginService {
})
}
}
export const wechatLoginService = new WechatLoginService()
import {
PASSPORT_ANONYMOUS_SERVICE,
PASSPORT_SERVICE,
PASSPORT_SUB_PROJECT,
} from "./passport-constants"
/**
* 登录服务
* 提供密码登录、验证码登录等功能
*/
import { UICore } from "./ui-core"
import type { SdkCore } from "../core/sdk-core"
import {
PASSPORT_ANONYMOUS_SERVICE,
PASSPORT_SUB_PROJECT,
} from "../core/passport-constants"
export enum LoginApiName {
LoginWithPassword = "loginWithPassword",
......@@ -44,11 +43,13 @@ export interface RegisterChannel {
}
export class LoginService {
constructor(private sdk: SdkCore) {}
/**
* 密码登录
*/
public login(username: string, password: string) {
return UICore.core
return this.sdk.core
.domainService(
PASSPORT_SUB_PROJECT,
PASSPORT_ANONYMOUS_SERVICE.SystemUser,
......@@ -57,7 +58,7 @@ export class LoginService {
.post<LoginRegisterResult>({
password,
username,
client_id: UICore.clientId,
client_id: this.sdk.clientId,
})
}
......@@ -72,12 +73,12 @@ export class LoginService {
const data: Record<string, any> = {
mobile,
verifycode,
client_id: UICore.clientId,
client_id: this.sdk.clientId,
}
if (optional) {
Object.assign(data, this.buildNotNullProperty(optional))
}
return UICore.core
return this.sdk.core
.domainService(
PASSPORT_SUB_PROJECT,
PASSPORT_ANONYMOUS_SERVICE.SystemUser,
......@@ -94,13 +95,13 @@ export class LoginService {
deviceInfo?: Record<string, string>,
) {
const p = optional || {}
return UICore.core
return this.sdk.core
.domainService(
PASSPORT_SUB_PROJECT,
PASSPORT_SERVICE.SystemUser,
LoginApiName.RefreshToken,
)
.post(p, { client_id: UICore.clientId, ...deviceInfo })
.post(p, { client_id: this.sdk.clientId, ...deviceInfo })
}
/**
......@@ -118,5 +119,3 @@ export class LoginService {
return t
}
}
export const loginService = new LoginService()
import {
PASSPORT_ANONYMOUS_SERVICE,
PASSPORT_SUB_PROJECT,
} from "./passport-constants"
/**
* 验证码服务
* 提供图形验证码生成、短信验证码发送等功能
*/
import { UICore } from "./ui-core"
import type { SdkCore } from "../core/sdk-core"
import {
PASSPORT_ANONYMOUS_SERVICE,
PASSPORT_SUB_PROJECT,
} from "../core/passport-constants"
export enum VerifyApiName {
SendVerifyCode = "sendVerifyCode",
......@@ -19,11 +19,13 @@ export interface VerifyImageResult {
}
export class VerifyService {
constructor(private sdk: SdkCore) {}
/**
* 生成图形验证码
*/
public generateImage(): VerifyImageResult {
const result = UICore.core.getVerifyImageAndSeed() as any
const result = this.sdk.core.getVerifyImageAndSeed() as any
return {
img: result.img,
seed: String(result.seed),
......@@ -34,7 +36,7 @@ export class VerifyService {
* 发送短信验证码(需要图形验证码)
*/
public sendVerifyCode(mobile: string, seed: string, verifycode: string) {
return UICore.core
return this.sdk.core
.domainService(
PASSPORT_SUB_PROJECT,
PASSPORT_ANONYMOUS_SERVICE.SystemUser,
......@@ -51,7 +53,7 @@ export class VerifyService {
* 发送短信验证码(使用 token)
*/
public sendVerifyCodeWithToken(mobile: string, token: string) {
return UICore.core
return this.sdk.core
.domainService(
PASSPORT_SUB_PROJECT,
PASSPORT_ANONYMOUS_SERVICE.SystemUser,
......@@ -68,7 +70,7 @@ export class VerifyService {
* 验证手机号
*/
public verifyMobile(mobile: string, verifycode: string) {
return UICore.core
return this.sdk.core
.domainService(
PASSPORT_SUB_PROJECT,
PASSPORT_ANONYMOUS_SERVICE.SystemUser,
......@@ -79,9 +81,7 @@ export class VerifyService {
Record<string, unknown>,
{ check_result: boolean }
>("post", {
data: { mobile, verifycode, client_id: UICore.clientId },
data: { mobile, verifycode, client_id: this.sdk.clientId },
})
}
}
export const verifyService = new VerifyService()
import type { AxiosAdapter } from "axios"
import type {
metaRow,
SdkListRowPredict,
SdkListRowPredictObject,
UniplatSdk,
} from "uniplat-sdk"
import { UniplatSdkExtender } from "uniplat-sdk"
/**
* 环境枚举
*/
export enum Environment {
Dev = "dev",
Test = "test",
Pro = "pro",
Stage = "stage",
}
/**
* 客户端 ID 枚举
*/
export enum ClientId {
None = "",
QqxbApp = "qqxb-hrm-app-ios",
QqtxzMp = "qqxb_mini_app",
FlbMp = "qqxb_flb_mini_app",
WebLogin = "teamix-personal-center-web-pc",
RenCaiKuaiDiMp = "welfare_bean_wechat_mini_app",
YuZhiPinMp = "chongqing_job_mini_app",
RenCaiKuaiDiH5 = "welfare_bean_qqxb_h5",
RenCaiKuaiDiPc = "welfare_bean_agent_pc",
Hrs100 = "hrs100-front-web-pc",
QqxbOfficial = "qqxb-official-web",
FastServiceWeb = "teamix-fast-service-web",
FastServiceMerchant = "teamix-fast-service-merchant",
Hrs100WechatMiniApp = "hrs100_wechat_mini_app",
Donghu = "donghu-web-pc",
}
/**
* Passport 配置
*/
const qqxbPassportConfig = new Map<Environment, string>([
[
Environment.Dev,
"http://191env1.report.qinqinxiaobao-passport.qqxb.jinsehuaqin.com:8800",
],
[
Environment.Test,
"http://191env1.report.qinqinxiaobao-passport.qqxb.jinsehuaqin.com:8800",
],
[Environment.Pro, "https://passport.qinqinxiaobao.com"],
[Environment.Stage, "https://pre-passport.qinqinxiaobao.com"],
])
/**
* 微信分销商 URL 配置
*/
export const wxDistributerUrlConfig = new Map<Environment, string>([
[Environment.Dev, "http://wechat.test.teammix.qqxb.cn"],
[Environment.Test, "https://pre-wx-distributer.teammix.com"],
[Environment.Pro, "https://wx-distributer.teammix.com"],
[Environment.Stage, "https://pre-wx-distributer.teammix.com"],
])
/**
* UI 核心配置类
* 负责 SDK 初始化配置、客户端 ID、Passport URL 等
*/
export class UICore {
private static sdk: UniplatSdk | null = null
private static adapter: AxiosAdapter | null = null
private static client = ClientId.None
private static passportUrl = ""
private static wxDistributerUrl = ""
private static readonly handler = new UniplatSdkExtender()
public static setupSdk(
sdk: UniplatSdk,
params?: {
client?: ClientId
envir?: Environment
config?: AxiosAdapter
},
) {
this.sdk = sdk
if (params) {
this.adapter = params.config as AxiosAdapter
this.client = params.client as ClientId
}
if (params?.envir) {
this.passportUrl = qqxbPassportConfig.get(params.envir) as string
this.wxDistributerUrl = wxDistributerUrlConfig.get(
params.envir,
) as string
}
if (!this.passportUrl) {
this.passportUrl = qqxbPassportConfig.get(Environment.Dev) as string
}
if (!this.wxDistributerUrl) {
this.wxDistributerUrl = wxDistributerUrlConfig.get(
Environment.Dev,
) as string
}
}
public static get core() {
return this.sdk as UniplatSdk
}
public static get storage() {
return UICore.core?.global.storage || localStorage
}
public static get adapterConfig() {
return this.adapter as AxiosAdapter
}
public static get clientId() {
return this.client
}
public static get passport() {
return this.passportUrl
}
public static get wxDistributer() {
return this.wxDistributerUrl
}
/**
* 构建 Passport 登出 URL
*/
public static buildPassport4Logout(redirect?: string) {
if (redirect) {
return `${this.passportUrl}?redirectUrl=${redirect}&logout=1`
}
return `${this.passportUrl}?logout=1`
}
public static forgetPassword() {
return `${this.passportUrl}/forget`
}
public static register() {
return `${this.passportUrl}/register?redirectUrl=${encodeURIComponent(
window.location.href,
)}`
}
public static buildActionParameter(parameter: { [key: string]: any }) {
return this.handler.buildActionParameter(parameter)
}
public static buildRows<T>(
rows: metaRow[],
predicts: SdkListRowPredict[] | SdkListRowPredictObject,
) {
return this.handler.buildRows<T>(rows, predicts)
}
public static buildRow<T>(
item: metaRow,
predicts: SdkListRowPredict[] | SdkListRowPredictObject,
) {
return this.handler.buildRow<T>(item, predicts)
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment