
Security News
The Code You Didn't Write Is Still Yours to Defend
AI agents are pulling packages into environments no scanner is watching, creating exposure before security teams can see it.
amos-designer
Advanced tools
针对设计器页面,抽离公共组件,以供后期有关设计器类型界面快速开发
notice:
amos-designer 中提供的所有登录页面、主框架页面,仅适配新版平台的数据格式及风格,早期版本的 amos-security 并不能完全兼容,why?
答:主要表现在数据格式部分不匹配,后端接口部分不匹配。
# 设置私服,然后执行以下命令(内网用户)
npm install --save amos-designer
# or
npm install --save amos-designer --registry=http://私服IP地址:端口
.
├── src
├── assets
├── components // 存放公共组件类
├── contianer
. ├── CaveContainer.js
. ├── ...
├── ext
. ├── ImageCropper.js
. ├── ...
└...
├── consts // 默认常量
├── pages // 通用页面
├── bizroot
. ├── index.js
├── common
. ├── EmptyPage.js
. ├── StageContainer.js
. ├── ...
├── layer
. ├── ...
├── login // 独立登录页面
├── mainframe // 系统主框架页面
├── sso // 统一认证登录页面,基础平台登录页面
├── stagebar // 设计器工具栏
├── widgets // 设计器元素列表栏
└...
├── styles // 系统主样式
├── utils
├── api.js // 公共 api
├── assembleRoutes.js // 构建通用routes,生成默认 Provider 和 Router
├── cache.js //
├── generateCode.js // 创建code
├── globalTrigger.js // 全局 global,主要用于标识设计器画布中修改未保存
├── routerValidate.js // 路由校验
├── sso.js // sso 公共工具类
└── index.js
DesignerLayout,
DesignerHeader,
PanelContainer,
CaveContainer,
SettingView,
// 功能是将一系列 form 组合在一起
SubView,
// 同 PanelContainer
ScrollView,
GraphIcon,
SvgIcon,
NonSketch,
ShortCutDescr,
ToolbarGroup,
ToolbarItem,
ControlBtn,
IconButton,
CommonBarItem,
BarGroup,
LineCombox,
IconBtn,
FromItemContent,
InputBox,
formItemLayout,
frmItemStyle,
PublishModal, PublishModalWithPlatform,
PaneHeader, DesignerPane,
// pages
SSOAuth,
OAuth,
connectOAuth,
Login,
MainFrame,
BizRoot,
WidgetsPanel,
LayerMgmt,
SceneBars, ProjectBars,
EmptyPage, StageContainer,
globalTrigger,
generateHtmlCode
提供系统所需的所有菜单类型,包含5中风格菜单。
logoConfigTypes = {
className: PropTypes.string,
logoImg: PropTypes.string,
text: PropTypes.string,
subText: PropTypes.string,
style: PropTypes.object,
onLogoClick: PropTypes.func
}
仅 main、single、fall、vframe、dbscreen、standardFrame 支持 noticeVersion 功能
import ImageCropper from 'amos-designer/lib/components/ext/ImageCropper';
const cropperProps = {
className: 'thumb-mgmt-cropper',
style: { height: 160, width: '100%' },
aspectRatio: 16 / 9,
guides: false,
preview: '.thumb-pane-img-preview'
};
onCropperCreated = (cropper) => {
this.cropper = cropper;
}
const { thumb } = this.state;
<div className="thumb-mgmt-content">
<ImageCropper
{...cropperProps}
src={thumb}
onCreated={this.onCropperCreated}
/>
<div className="thumb-pane-img-preview" />
</div>
// layout
$model-area-width: 260px;
$setting-area-width: 300px;
$designer-header-height: 40px;
$main-bgcolor: white;
$designer-border: 1px solid #eaeaea;
$btnbar-width: 2.5rem; // 30px
$btnbar-height: 2.5rem; // 30px
$btnbar-border-radius: 4px;
$zindex-header: 2;
$zindex-stage: 1;
$zindex-model-setting: 3;
$zindex-drawer: 9;
$actvie-color: #345fa6;
// mixin
/**
* 给指定 scrollbar 的节点,添加自定义滚动条支持
* example:
* @include @include custom-scrollbar('main-container');;
*/
@mixin custom-scrollbar($cls: app);
/**
*定义滚动条样式 圆角和阴影不需要则传入null
* 1、$outColor -- 滚动条颜色
* 2、$innerColor -- 滑块颜色
* 3、$height -- 滚动条宽高、圆角
* 4、$width
* 5、$radius
* 6、$shadow -- 阴影
* example:
* .my { @include scrollbar(5px, 8px); }
*/
@mixin scrollbar($width: 10px, $height: 10px, $outColor: $bgBarColor, $innerColor: $bgThumbColor, $radius: 5px, $shadow: null);
/**
* 使用 dragdesign
* 1、$prefix -- dragdesign 样式前缀
* 2、$size -- 拖拽handle大小
* 3、$useDot -- 是否启用圆角,默认为true,设置为false,则可采用rect方式
* example:
* @include make-drag-resizer(mydrag, 12px, true);
*/
@mixin make-drag-resizer($prefix: $handlePrefix, $size: $handle-size, $useDot: true)
在需要使用免登录认证的系统中,加入以下组件,设置 router ,然后访问相应的路由地址时,即可实现 OAuth 认证。
如果基础平台需要支持 OAuth 认证,则需要添加 OAuthDemo2 组件采用 url 的方式进行认证,并配置 oauth 路由。
import React, { Component } from 'react';
import { OAuth } from 'amos-designer';
function loginAction(data){
return new Promise((resolve, reject) => {
resolve(data);
});
}
// 采用内置校验
export default class OAuthDemo extends Component {
render() {
const props = {
loginAction,
authParams: {
loginId: 'super',
password: 'a1234560'
},
redirectURI: 'http://example.com'
};
return (
<OAuth {...props} useInnerParam />
);
}
}
export class OAuthDemo2 extends Component {
render() {
// 采用 url 方式,`http://xxx/oauth?userId=1&token=asasdzxxzas&redirect_uri=http://sdf/sdf`
// 如果 redirect_uri 传入的是完整 url 路径,则需要采用 encodeUrl 进行转译。
// import { encodeUrl } from 'amos-tool';
// encodeUrl(redirect_uri);
return (
<OAuth useInnerParam={false} />
);
}
}
注意与 OAuth 组件的区别。
在直接访问需要 oauth认证的组件路由,或从其它系统跳转该路由,且在 url 中提供了 token 时,采用该 hoc 组件,使得组件自动跳过 oauth。
还可以给相应的组件添加默认的 loginId 以实现自动授权。
支持的参数有:
{ loginId, password }正在进行授权中,请稍后...import React, { Component } from 'react';
import { connectOAuth } from 'amos-designer';
// 不传任何参数,直接通过url传入token 的方式
// url: http://xxx/xxx?token=safasdfas&userId=super
@connectOAuth()
export default class NeedOAuthDemo extends Component {
render() {
...
}
}
// or
import MyComponent from './Component';
export default connectOAuth()(MyComponent);
// 采用内置用户的方式,实现自动授权
function loginAction(data){
return new Promise((resolve, reject) => {
resolve(data);
});
}
@connectOAuth({
useInnerParam: true,
loginAction,
authParams: {
loginId: 'super',
password: 'a1234560'
}
})
export default class OAuthDemo2 extends Component {
render() {
// 采用 url 方式,`http://xxx/oauth?userId=1&token=asasdzxxzas&redirect_uri=http://sdf/sdf`
// 如果 redirect_uri 传入的是完整 url 路径,则需要采用 encodeUrl 进行转译。
// import { encodeUrl } from 'amos-tool';
// encodeUrl(redirect_uri);
return (
<OAuth useInnerParam={false} />
);
}
}
entry.js
import { Component } from 'react';
import { browserHistory } from 'amos-react-router';
import { syncHistoryWithStore } from 'react-router-redux';
import assembleRoutes, { processDefaultRoute } from 'amos-designer/lib/utils/assembleRoutes';
import rootRoutes from './routes';
import configureStore from './store';
import { menusRoutesActions } from './../services/auth';
const store = configureStore();
const history = syncHistoryWithStore(browserHistory, store);
@assembleRoutes({
loginLink: '/login',
// 默认情况下,登录之后的所有路由,均在 /main 之下,则可无需传入
accessRoutes: ['/main', '/vizmix', '/vizmixpub','/mixuap', '/viz3d', '/viz3dpub', '/vizmorphic'],
store,
history,
routesGenerator: rootRoutes,
// 登录成功之后将会执行
routesAction: menusRoutesActions
})
class App extends Component {
/** 处理权限路由映射完毕之后的跳转 */
handleJump = (perm) => {
const firstMenu = processDefaultRoute(perm).find(e => {
if ((!e.children || e.children.length === 0) && e.path && e.path.startsWith('/')) {
return true;
}
});
if (firstMenu) {
browserHistory.push(firstMenu.path);
} else {
browserHistory.push('/main');
}
}
render(){
return null;
}
}
render(<App />, document.getElementById('app'));
// VIZ_MIX -> vizmix
// VIZ_MIX_CODE -> '118105122109105120'
import { VIZ_MIX, VIZ_MIX_CODE } from 'amos-designer/lib/consts/constants';
import { strToAsciiCode, getPropsValue, createPageName,
createWidgetName, nextPageSort, getSceneValue } from 'amos-designer/lib/utils/tools';
strToAsciiCode('vizmix'); // '118105122109105120'
const scene = { id: '1', uiobject: { children: [1,2,3] }};
getSceneValue(scene, 'uiobject.children'); // [1,2,3]
// 密码加密
import { useDESPolicy, encodePassword } from 'amos-designer/lib/utils/sso';
const pwd = useDESPolicy('原密码', '加密key');
// 传入的对象中,如果包含 password 字段,则进行加密处理
const data = encodePassword({
...
password: '原密码',
...
}, '加密key');
// 密码加密
import { useAESPolicy, decodeAESPolicy, encodeAESPassword } from 'amos-designer/lib/utils/sso';
const pwd = useAESPolicy('原密码', '加密key');
// 解密
const pwd = decodeAESPolicy('密文', '加密key');
// 传入的对象中,如果包含 password、rePassword 字段,则进行加密处理
const data = encodeAESPassword({
...
password: '原密码',
rePassword: '原密码',
...
}, '加密key');
直接在内部的 @assembleRoutes 中使用
@assembleRoutes({
loginLink: '/login',
// 默认情况下,登录之后的所有路由,均在 /main 之下,则可无需传入
accessRoutes,
store,
history,
routesGenerator: rootRoutes,
// 登录成功之后将会执行
routesAction: menusRoutesGroupActions,
onMount() {
// 监听 token
sso.GLOBAL_MONITOR.token(window.UAPConf?.disableInvalidTokenClosePage, (params) => {
const { type, oldValue, newValue } = params || {};
// 'token-clear': 其他页面注销(oldValue 存在,newValue 不存在)
// 'token-new': 直接在某个页面(或新建一个页面)输入登录页地址,重新登录 (平台登录,在登录之前会清空 token 等)
// 其他页面注销(oldValue 存在,newValue 不存在)
if (type === 'token-clear' || type === 'token-new'){
// 防止 在 login 页面 loop
if (location.pathname !== '/login'){
// 直接去登录页面
getHistory().push('/login');
}
}
});
sso.GLOBAL_MONITOR.error();
},
onUnmount() {
sso.GLOBAL_MONITOR.errorCancel();
},
// 自定义清除所有,防止部分缓存数据导致页面混乱
customClearAll(){
// 有其它信息,也需要全部清除,否则会出现数据混乱问题
localStorage.clear();
}
})
class App extends Component {
...
}
import { localForage } from 'amos-designer';
localForage.setItem();
localForage.getItem();
localForage.removeItem();
localForage.clear();
ilex.h
amos-run amoscore 进行打包而改为 amos-run security?采用 amoscore 打包时,未能将 src/assets/** 下的所有文件,同步至 lib 下,该问题在 amos-build@next 版本中已解决。
npm run exp-prod 是干什么的?该命令,将 demo 下的案例,打包成可运行的 site 站点,可供 doc 系统使用。
1.2.5 版本之后,添加了 viz 文档,导致docsite文件过大,此时将不在内置可执行 doc 库。外部系统需要自行添加并且执行打包命令。示例脚本如下:
/**
* webpack 打包配置文件
* @author ilex
*/
const docitConfig = require('amos-build/lib/docitConfig');
const resolveCwd = require('amos-build/lib/tools/resolveCwd');
const __ENV__ = require('amos-build/lib/tools/__ENV__');
const designer = docitConfig({
name: 'amos-designer',
tpl: './tpl.html',
toFile: 'index.html',
port: 3710,
lint: false,
entry: {
app: './node_modules/amos-designer/docsite/entry.js'
},
opened: true,
sourceMap: __ENV__ === 'production' ? false : true
});
// mdx
designer.module.rules.push(
{ test: /\.mdx$/, loader: 'file-rawtxt-loader' }
);
// demo 进行打包发布
if (__ENV__ === 'production'){
designer.output.path = resolveCwd('innerpkg/amos-designer');
designer.output.publicPath = '';
}
// 返回数组是为了可以处理多个这样内置的 doc
module.exports = [
designer
];
since 20211116 之后,将 changelog 单独进行说明。
FAQs
amos designer
The npm package amos-designer receives a total of 56 weekly downloads. As such, amos-designer popularity was classified as not popular.
We found that amos-designer demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
AI agents are pulling packages into environments no scanner is watching, creating exposure before security teams can see it.

Security News
GitHub Actions checkout now blocks risky pull_request_target checkouts by default to help prevent pwn request supply chain attacks.

Product
Socket now supports Custom Roles and Repository Access Permissions so organizations can control who can access specific repositories and actions.