Compare commits

...

23 Commits
dev ... in.open

Author SHA1 Message Date
OpenTiny 539ff30b4e feat: update charts demos
Match-id-6b779a341cbac05c76e1876a8612a5a998f6b38c
2024-05-11 11:49:37 +08:00
OpenTiny 451d48a83f feat: Adapting to the X-design theme
Match-id-173eb5e5eb2d3ee55469384608e2600d3c101e1d
2024-04-08 15:02:54 +08:00
OpenTiny e4e749f86e fix(select/picker): fix select、picker bugs
Match-id-b9a32a244a8daddd8a51d1e320f356b5e44766a0
2024-03-14 16:14:50 +08:00
OpenTiny b1027f0312 test(e2e): fix e2e error
Match-id-e5c4168bb3a0f3895550eb25c7b6ce83dd6db3f5
2024-03-07 14:11:50 +08:00
OpenTiny d8ca7ba73a fix: fix mobile-first components bugs
Match-id-e964aa33a9e0e4658305d34a846304a96731b904
2024-02-23 16:56:57 +08:00
OpenTiny b56a5a4b78 feat: optimize mobile-first components
Signed-off-by:  <zenglingka@>

Match-id-574c901a3eaebe8fac8f6ae26a0c445026bf354f
2024-02-02 18:07:36 +08:00
OpenTiny 015bdd19fe docs(sites): update docs and apis
Match-id-28f3a81642ef4e150404ee9d16e456e9be50550c
2023-12-08 18:05:23 +08:00
OpenTiny 1d1032ad08 docs(sites): update docs
Match-id-555be0630d8af00f117863e2a2287357bf6dd1ca
2023-11-16 09:21:46 +08:00
OpenTiny 83941980aa feat: update mobile-first and saas
Match-id-ad3ff07f64affa0b4aca1e574a5cc86c9e3fa0a3
2023-10-30 14:29:40 +08:00
OpenTiny c2bb26d34d feat: sync site code
Match-id-c819ec122fe2634a68ec29a498995bc2954f10ae
2023-10-23 09:41:58 +08:00
OpenTiny f71a312cef feat: update pc/mobile/mobile-first docs
Match-id-c02ba937b3f0b39352e180c33959fc4e730fcd7a
2023-10-12 15:52:25 +08:00
OpenTiny 16f9f9e070 feat: support react and add new components: rich-text-editor/color-picker/divider/calendar-view
Signed-off-by:  <zenglingka@>

Match-id-548aa1beff6c51cfa5ae3660c42da4b4ba4b955b
2023-10-11 18:20:44 +08:00
OpenTiny 05843de80f feat: add dialog-select and optimize sites
Signed-off-by:  <zenglingka@>

Match-id-97975ecf614ebd57b15e8fc6c6593cceecbea55b
2023-08-11 14:52:17 +08:00
OpenTiny 0702d2f827 feat(tinyvue): [WI2028] 同步内部代码到外部,添加新特性和修改bug
Match-id-3abc3c5e6ccc2db7057e8ba5a570df4e4215493b
2023-06-29 15:01:58 +08:00
OpenTiny da747cc572 feat(tinyvue): [WI2021] 同步内部代码,修复若干bug
Match-id-7c6119f75fac3576ef734d72964b3968eeb97fc0
2023-06-10 14:54:45 +08:00
OpenTiny 568b18a0e1 fix: 修复 XDesign 规范的几处 bug US2026
Signed-off-by:  <zenglingka@>

Match-id-179787bee5b2a541ccd878c6259550ed4d1e9a67
2023-05-25 11:51:00 +08:00
OpenTiny c51427e40b feat: add XDesign US2026
Signed-off-by:  <zenglingka@>

Match-id-9cb1b5b1819a9d99c7c9ef6fe7152745a04d10c7
2023-05-18 14:55:16 +08:00
OpenTiny 7cb3fdbe6d refactor: refactor css var WI2027
Signed-off-by:  <zenglingka@>

Match-id-921ba7086e8878bc7f8819aac506e5e389e495ce
2023-04-13 18:52:38 +08:00
OpenTiny 4aa17e2f29 merge out-zzc into out
TinyVue工程momorepo和ts改造,统一内外网官网示例

Created-by: zhengzhichao 
Author-id: 10836
MR-id: 480631
Commit-by: 
Merged-by: mochunhui 
E2E-issues: WI2029
Description: fix(tiny-vue): TinyVue工程momorepo改造[WI2029]

See merge request: innersource/TinyStage/opentiny/ui-vue/tiny-vue!5

Match-id-e577069268ac35e10a2942c9acf0607a9d6bf7d6
2023-03-24 17:39:22 +08:00
OpenTiny 510675e1c3 fix(tiny-vue): 修改package.json[WI2029]
Match-id-8e0d6161964178ca68ee111f3bb0c60e27d9f3e0
2023-03-24 17:31:49 +08:00
OpenTiny f396f871b9 fix(tiny-vue): 修改license[WI2029]
Match-id-646d905fcfedf0b9ceb147d9ce288916e3c78c45
2023-03-24 17:27:35 +08:00
OpenTiny 08590881a5 fix(tiny-vue): TinyVue工程momorepo改造[WI2029]
Match-id-a3c037ae0147e6ef27df417b09fff18d548a5fa7
2023-03-24 17:16:17 +08:00
OpenTiny 3f28e32c52 fix(tiny-vue): TinyVue工程momorepo改造[WI2029]
Match-id-2e9669527b4f9d10ba441ea7a204dc1627ab0420
2023-03-24 17:07:29 +08:00
17249 changed files with 752464 additions and 213781 deletions

585
.all-contributorsrc Normal file
View File

@ -0,0 +1,585 @@
{
"files": [
"README.md"
],
"imageSize": 100,
"commit": false,
"commitConvention": "angular",
"contributors": [
{
"login": "kagol",
"name": "Kagol",
"avatar_url": "https://avatars.githubusercontent.com/u/9566362?v=4",
"profile": "https://github.com/kagol",
"contributions": [
"code"
]
},
{
"login": "zzcr",
"name": "ajaxzheng",
"avatar_url": "https://avatars.githubusercontent.com/u/18521562?v=4",
"profile": "https://github.com/zzcr",
"contributions": [
"code"
]
},
{
"login": "TC-twwang",
"name": "TC-twwang",
"avatar_url": "https://avatars.githubusercontent.com/u/42400776?v=4",
"profile": "https://github.com/TC-twwang",
"contributions": [
"code"
]
},
{
"login": "MNZhu",
"name": "jacknan",
"avatar_url": "https://avatars.githubusercontent.com/u/17588953?v=4",
"profile": "https://github.com/MNZhu",
"contributions": [
"code"
]
},
{
"login": "awspi",
"name": "Pithy",
"avatar_url": "https://avatars.githubusercontent.com/u/66438036?v=4",
"profile": "https://github.com/awspi",
"contributions": [
"code"
]
},
{
"login": "heygsc",
"name": "heygsc",
"avatar_url": "https://avatars.githubusercontent.com/u/103993866?v=4",
"profile": "https://github.com/heygsc",
"contributions": [
"code"
]
},
{
"login": "wwttff",
"name": "MangoWu",
"avatar_url": "https://avatars.githubusercontent.com/u/32888622?v=4",
"profile": "https://github.com/wwttff",
"contributions": [
"code"
]
},
{
"login": "ErKeLost",
"name": "ADNY",
"avatar_url": "https://avatars.githubusercontent.com/u/66500121?v=4",
"profile": "https://github.com/ErKeLost",
"contributions": [
"code"
]
},
{
"login": "chenxi-20",
"name": "chenxi-20",
"avatar_url": "https://avatars.githubusercontent.com/u/76168465?v=4",
"profile": "https://github.com/chenxi-20",
"contributions": [
"code"
]
},
{
"login": "rayhaoqin",
"name": "Alaray",
"avatar_url": "https://avatars.githubusercontent.com/u/46983981?v=4",
"profile": "https://github.com/rayhaoqin",
"contributions": [
"code"
]
},
{
"login": "yuanningning",
"name": "ing",
"avatar_url": "https://avatars.githubusercontent.com/u/104059491?v=4",
"profile": "https://github.com/yuanningning",
"contributions": [
"code"
]
},
{
"login": "shenjunjian",
"name": "申君健",
"avatar_url": "https://avatars.githubusercontent.com/u/6848520?v=4",
"profile": "https://github.com/shenjunjian",
"contributions": [
"code"
]
},
{
"login": "MomoPoppy",
"name": "MomoPoppy",
"avatar_url": "https://avatars.githubusercontent.com/u/125256456?v=4",
"profile": "https://github.com/MomoPoppy",
"contributions": [
"code"
]
},
{
"login": "WXC-Spring",
"name": "WXC-Spring",
"avatar_url": "https://avatars.githubusercontent.com/u/131581326?v=4",
"profile": "https://github.com/WXC-Spring",
"contributions": [
"code"
]
},
{
"login": "GaoNeng-wWw",
"name": "GaoNeng",
"avatar_url": "https://avatars.githubusercontent.com/u/31283122?v=4",
"profile": "https://github.com/GaoNeng-wWw",
"contributions": [
"code"
]
},
{
"login": "acyza",
"name": "acyza",
"avatar_url": "https://avatars.githubusercontent.com/u/101238421?v=4",
"profile": "https://acyza.github.io",
"contributions": [
"code"
]
},
{
"login": "ygj6",
"name": "ygj6",
"avatar_url": "https://avatars.githubusercontent.com/u/7699524?v=4",
"profile": "https://github.com/ygj6",
"contributions": [
"code"
]
},
{
"login": "MrWang2016",
"name": "MrWang2016",
"avatar_url": "https://avatars.githubusercontent.com/u/24307164?v=4",
"profile": "https://github.com/MrWang2016",
"contributions": [
"code"
]
},
{
"login": "qinwencheng",
"name": "qinwencheng",
"avatar_url": "https://avatars.githubusercontent.com/u/24841685?v=4",
"profile": "https://github.com/qinwencheng",
"contributions": [
"code"
]
},
{
"login": "Huangyilin19",
"name": "黄怡林",
"avatar_url": "https://avatars.githubusercontent.com/u/48042709?v=4",
"profile": "https://github.com/Huangyilin19",
"contributions": [
"code"
]
},
{
"login": "zuixinwang",
"name": "zuixinwang",
"avatar_url": "https://avatars.githubusercontent.com/u/59717852?v=4",
"profile": "https://github.com/zuixinwang",
"contributions": [
"code"
]
},
{
"login": "LadyChatterleyLover",
"name": "luopei",
"avatar_url": "https://avatars.githubusercontent.com/u/35223515?v=4",
"profile": "https://github.com/LadyChatterleyLover",
"contributions": [
"code"
]
},
{
"login": "brenner8023",
"name": "前端爆冲",
"avatar_url": "https://avatars.githubusercontent.com/u/31237954?v=4",
"profile": "https://juejin.cn/user/1996368846785128",
"contributions": [
"infra"
]
},
{
"login": "xiejay97",
"name": "Xie Jay",
"avatar_url": "https://avatars.githubusercontent.com/u/64340763?v=4",
"profile": "https://github.com/xiejay97",
"contributions": [
"infra"
]
},
{
"login": "linxiang07",
"name": "linxiang",
"avatar_url": "https://avatars.githubusercontent.com/u/40119767?v=4",
"profile": "https://github.com/linxiang07",
"contributions": [
"code"
]
},
{
"login": "coderbaozi",
"name": "程序员包子",
"avatar_url": "https://avatars.githubusercontent.com/u/103836393?v=4",
"profile": "https://bollome.netlify.app/",
"contributions": [
"code"
]
},
{
"login": "pe-3",
"name": "peter G",
"avatar_url": "https://avatars.githubusercontent.com/u/103579791?v=4",
"profile": "https://github.com/pe-3",
"contributions": [
"code",
"doc"
]
},
{
"login": "gimmyhehe",
"name": "gimmyhehe",
"avatar_url": "https://avatars.githubusercontent.com/u/26026184?v=4",
"profile": "https://github.com/gimmyhehe",
"contributions": [
"code"
]
},
{
"login": "KevinAndrewDong",
"name": "dong",
"avatar_url": "https://avatars.githubusercontent.com/u/20911103?v=4",
"profile": "https://github.com/KevinAndrewDong",
"contributions": [
"code"
]
},
{
"login": "CatsAndMice",
"name": "凌览",
"avatar_url": "https://avatars.githubusercontent.com/u/58327088?v=4",
"profile": "http://www.linglan01.cn",
"contributions": [
"code"
]
},
{
"login": "Caesar-ch",
"name": "Caesar-ch",
"avatar_url": "https://avatars.githubusercontent.com/u/74941512?v=4",
"profile": "https://github.com/Caesar-ch",
"contributions": [
"code"
]
},
{
"login": "chenqifeng66",
"name": "chenqifeng66",
"avatar_url": "https://avatars.githubusercontent.com/u/97503755?v=4",
"profile": "https://github.com/chenqifeng66",
"contributions": [
"test"
]
},
{
"login": "Zz-ZzzZ",
"name": "Zz-ZzzZ",
"avatar_url": "https://avatars.githubusercontent.com/u/48228016?v=4",
"profile": "https://zz-zzzz.github.io/",
"contributions": [
"test"
]
},
{
"login": "lyx-jay",
"name": "Lyx",
"avatar_url": "https://avatars.githubusercontent.com/u/39766860?v=4",
"profile": "https://github.com/lyx-jay",
"contributions": [
"code"
]
},
{
"login": "chenguang1994",
"name": "Spark Bill",
"avatar_url": "https://avatars.githubusercontent.com/u/31501915?v=4",
"profile": "https://github.com/chenguang1994",
"contributions": [
"code"
]
},
{
"login": "Zuowendong",
"name": "wendZzoo",
"avatar_url": "https://avatars.githubusercontent.com/u/45628596?v=4",
"profile": "https://github.com/Zuowendong",
"contributions": [
"code"
]
},
{
"login": "gweesin",
"name": "Gweesin Chan",
"avatar_url": "https://avatars.githubusercontent.com/u/42909374?v=4",
"profile": "https://github.com/gweesin",
"contributions": [
"code"
]
},
{
"login": "Binks123",
"name": "Binks_",
"avatar_url": "https://avatars.githubusercontent.com/u/103343025?v=4",
"profile": "https://github.com/Binks123",
"contributions": [
"doc"
]
},
{
"login": "yoyo201626",
"name": "yoyo",
"avatar_url": "https://avatars.githubusercontent.com/u/104079404?v=4",
"profile": "https://github.com/yoyo201626",
"contributions": [
"code"
]
},
{
"login": "wkif",
"name": "Kif",
"avatar_url": "https://avatars.githubusercontent.com/u/62132584?v=4",
"profile": "https://hexo.kifroom.icu/",
"contributions": [
"code"
]
},
{
"login": "jack-zishan",
"name": "jack-zishan",
"avatar_url": "https://avatars.githubusercontent.com/u/67041206?v=4",
"profile": "https://github.com/jack-zishan",
"contributions": [
"code"
]
},
{
"login": "LinboLen",
"name": "LinboLen",
"avatar_url": "https://avatars.githubusercontent.com/u/5467712?v=4",
"profile": "http://gradii.com",
"contributions": [
"code"
]
},
{
"login": "vaebe",
"name": "vaebe",
"avatar_url": "https://avatars.githubusercontent.com/u/52314078?v=4",
"profile": "https://github.com/vaebe",
"contributions": [
"code"
]
},
{
"login": "allenli178",
"name": "YuYan Li",
"avatar_url": "https://avatars.githubusercontent.com/u/53218750?v=4",
"profile": "https://allenli178.top",
"contributions": [
"code"
]
},
{
"login": "shonen7",
"name": "shonen7",
"avatar_url": "https://avatars.githubusercontent.com/u/145949377?v=4",
"profile": "https://github.com/shonen7",
"contributions": [
"code"
]
},
{
"login": "xlearns",
"name": "xlearns",
"avatar_url": "https://avatars.githubusercontent.com/u/62782792?v=4",
"profile": "https://github.com/xlearns",
"contributions": [
"code"
]
},
{
"login": "ianxinnew",
"name": "tianxin",
"avatar_url": "https://avatars.githubusercontent.com/u/146069396?v=4",
"profile": "https://github.com/ianxinnew",
"contributions": [
"code"
]
},
{
"login": "Xppp0217",
"name": "Xppp0217",
"avatar_url": "https://avatars.githubusercontent.com/u/82315158?v=4",
"profile": "https://github.com/Xppp0217",
"contributions": [
"code"
]
},
{
"login": "AcWrong02",
"name": "AcWrong02",
"avatar_url": "https://avatars.githubusercontent.com/u/147061401?v=4",
"profile": "https://github.com/AcWrong02",
"contributions": [
"bug"
]
},
{
"login": "betavs",
"name": "betavs",
"avatar_url": "https://avatars.githubusercontent.com/u/34408516?v=4",
"profile": "https://github.com/betavs",
"contributions": [
"code"
]
},
{
"login": "fanbingbing16",
"name": "fanbingbing16",
"avatar_url": "https://avatars.githubusercontent.com/u/84823288?v=4",
"profile": "https://github.com/fanbingbing16",
"contributions": [
"code"
]
},
{
"login": "dyh333",
"name": "dyh333",
"avatar_url": "https://avatars.githubusercontent.com/u/1221313?v=4",
"profile": "https://github.com/dyh333",
"contributions": [
"doc"
]
},
{
"login": "betterdancing",
"name": "betterdancing",
"avatar_url": "https://avatars.githubusercontent.com/u/25901461?v=4",
"profile": "https://github.com/betterdancing",
"contributions": [
"doc"
]
},
{
"login": "David-TechNomad",
"name": "David",
"avatar_url": "https://avatars.githubusercontent.com/u/23149356?v=4",
"profile": "https://github.com/David-TechNomad",
"contributions": [
"code"
]
},
{
"login": "falcon-jin",
"name": "falcon-jin",
"avatar_url": "https://avatars.githubusercontent.com/u/48880836?v=4",
"profile": "https://github.com/falcon-jin",
"contributions": [
"code"
]
},
{
"login": "wuyiping0628",
"name": "wuyiping0628",
"avatar_url": "https://avatars.githubusercontent.com/u/42107997?v=4",
"profile": "https://github.com/wuyiping0628",
"contributions": [
"test"
]
},
{
"login": "James-9696",
"name": "James",
"avatar_url": "https://avatars.githubusercontent.com/u/72028410?v=4",
"profile": "https://github.com/James-9696",
"contributions": [
"doc"
]
},
{
"login": "ichynul",
"name": "ichynul",
"avatar_url": "https://avatars.githubusercontent.com/u/10061650?v=4",
"profile": "https://gitee.com/ichynul",
"contributions": [
"code"
]
},
{
"login": "Davont",
"name": "Davont",
"avatar_url": "https://avatars.githubusercontent.com/u/28757633?v=4",
"profile": "https://github.com/Davont",
"contributions": [
"code"
]
},
{
"login": "wNing50",
"name": "Nick Wu",
"avatar_url": "https://avatars.githubusercontent.com/u/38874640?v=4",
"profile": "https://github.com/wNing50",
"contributions": [
"code"
]
},
{
"login": "Floyd-bit",
"name": "Floyd",
"avatar_url": "https://avatars.githubusercontent.com/u/59243597?v=4",
"profile": "https://github.com/Floyd-bit",
"contributions": [
"code"
]
},
{
"login": "Jevin0",
"name": "Jevin",
"avatar_url": "https://avatars.githubusercontent.com/u/69580637?v=4",
"profile": "https://github.com/Jevin0",
"contributions": [
"code"
]
},
{
"login": "HAOUEHF",
"name": "星河",
"avatar_url": "https://avatars.githubusercontent.com/u/107133502?v=4",
"profile": "https://github.com/HAOUEHF",
"contributions": [
"code"
]
}
],
"contributorsPerLine": 8,
"skipCi": true,
"repoType": "github",
"repoHost": "https://github.com",
"projectName": "tiny-vue",
"projectOwner": "opentiny",
"commitType": "docs"
}

View File

@ -89,6 +89,7 @@ artifacts:
# - config_path: ./dist/dept/package.json
# - config_path: ./dist/detail-page/package.json
# - config_path: ./dist/dialog-box/package.json
# - config_path: ./dist/dialog-select/package.json
# - config_path: ./dist/drop-roles/package.json
# - config_path: ./dist/drop-times/package.json
# - config_path: ./dist/dropdown/package.json
@ -97,6 +98,7 @@ artifacts:
# - config_path: ./dist/espace/package.json
# - config_path: ./dist/exception/package.json
# - config_path: ./dist/file-upload/package.json
# - config_path: ./dist/filter-panel/package.json
# - config_path: ./dist/floatbar/package.json
# - config_path: ./dist/form/package.json
# - config_path: ./dist/form-item/package.json
@ -108,6 +110,7 @@ artifacts:
# - config_path: ./dist/grid-toolbar/package.json
# - config_path: ./dist/hrapprover/package.json
# - config_path: ./dist/icon/package.json
# - config_path: ./dist/infinite-scroll/package.json
# - config_path: ./dist/image/package.json
# - config_path: ./dist/image-viewer/package.json
# - config_path: ./dist/input/package.json
@ -166,6 +169,7 @@ artifacts:
# - config_path: ./dist/table/package.json
# - config_path: ./dist/tabs/package.json
# - config_path: ./dist/tag/package.json
# - config_path: ./dist/tag-group/package.json
# - config_path: ./dist/text-popup/package.json
# - config_path: ./dist/time/package.json
# - config_path: ./dist/time-line/package.json

View File

@ -6,4 +6,4 @@ steps:
tool_params:
secsolar:
source_dir: ./
source_dir: ./

10
.depcheckrc.yaml Normal file
View File

@ -0,0 +1,10 @@
ignores:
# Unused dependencies
# Unused devDependencies
# Missing dependencies
ignore-patterns:
- "node_modules"

View File

@ -1,2 +1,7 @@
dist
runtime
runtime
dist2/
dist2.7/
dist3/
node_modules
examples/docs/public/assets/map/js

View File

@ -1,94 +0,0 @@
{
"root": true,
"env": {
"es6": true,
"browser": true,
"node": true,
"jest": true
},
"extends": ["eslint:recommended", "plugin:vue/vue3-essential"],
"parserOptions": {
"parser": ["vue-eslint-parser", "@babel/eslint-parser"],
"requireConfigFile": false,
"sourceType": "module",
"ecmaVersion": "latest",
"ecmaFeatures": {
"jsx": true
}
},
"rules": {
"no-debugger": "off",
"no-var": "error",
"no-tabs": "error",
"no-trailing-spaces": "error",
"no-mixed-spaces-and-tabs": "error",
"no-undef": "error",
"no-extra-semi": "error",
"no-empty": "error",
"no-console": "off",
"semi": [2, "never"],
"max-len": [
"warn",
{
"code": 160
}
],
"function-paren-newline": ["off"],
"object-property-newline": [
"warn",
{
"allowAllPropertiesOnSameLine": true
}
],
"newline-per-chained-call": [
"warn",
{
"ignoreChainWithDepth": 4
}
],
"comma-dangle": "off",
"semi-style": ["warn", "last"],
"max-lines": ["error", 2400],
"max-lines-per-function": ["error", 200],
"complexity": ["error", 26],
"max-depth": ["warn", 4],
"max-nested-callbacks": ["error", 4],
"no-multi-assign": "off",
"no-undef-init": "warn",
"no-shadow": "off",
"max-params": ["warn", 5],
"no-param-reassign": "off",
"prefer-rest-params": "off",
"prefer-arrow-callback": "error",
"arrow-body-style": ["warn", "as-needed"],
"no-this-before-super": "error",
"quotes": ["warn", "single"],
"prefer-template": "off",
"no-multi-str": "warn",
"object-shorthand": "warn",
"dot-notation": "error",
"accessor-pairs": "error",
"no-prototype-builtins": "error",
"guard-for-in": "error",
"eqeqeq": "off",
"no-fallthrough": "error",
"no-case-declarations": "error",
"no-unsafe-finally": "error",
"no-eval": "error",
"no-with": "error",
"no-implicit-coercion": [
"error",
{
"allow": ["!!", "~"]
}
],
"vue/multi-word-component-names": "off",
"vue/valid-v-slot": "off",
"vue/no-deprecated-v-on-native-modifier": "off",
"vue/no-reserved-component-names": "off",
"vue/no-deprecated-dollar-listeners-api": "off",
"vue/no-deprecated-slot-attribute": "off",
"vue/no-use-computed-property-like-method": "off",
"vue/no-mutating-props": "off"
}
}

53
.eslintrc.js Normal file
View File

@ -0,0 +1,53 @@
/* eslint-env node */
/** @type {import('eslint').Linter.Config} */
module.exports = {
extends: ['@antfu', 'plugin:prettier/recommended'],
rules: {
'vue/component-tags-order': [
'error',
{
order: [['script', 'template'], 'style']
}
],
'vue/attribute-hyphenation': 'off',
'vue/v-on-event-hyphenation': 'off',
'vue/order-in-components': 'off',
'vue/component-name-in-template-casing': 'off',
'vue/custom-event-name-casing': 'off',
'vue/quote-props': 'off',
'vue/attributes-order': 'off',
'vue/prop-name-casing': 'off',
'vue/html-self-closing': 'off',
'vue/prefer-separate-static-class': 'off',
'vue/comma-dangle': 'off',
'vue/prefer-template': 'off',
'vue/no-unused-refs': 'off',
'vue/require-component-is': 'off',
'vue/singleline-html-element-content-newline': 'off',
'curly': 'off',
'sort-imports': 'off',
'prefer-template': 'off',
'arrow-parens': 'off',
'operator-linebreak': 'off',
'antfu/if-newline': 'off',
'antfu/top-level-function': 'off',
'import/order': 'off',
'import/no-duplicates': 'off',
'quote-props': 'off',
'prefer-const': 'off',
'multiline-ternary': 'off',
'vue/no-deprecated-v-on-native-modifier': 'off',
'@typescript-eslint/comma-dangle': 'off',
'@typescript-eslint/no-unsafe-assignment': 'off',
'@typescript-eslint/no-unsafe-call': 'off',
'@typescript-eslint/no-unsafe-member-access': 'off',
'@typescript-eslint/no-unsafe-argument': 'off',
'@typescript-eslint/no-unsafe-return': 'off',
'@typescript-eslint/brace-style': 'off',
'@typescript-eslint/restrict-plus-operands': 'off',
'@typescript-eslint/no-use-before-define': 'off',
'@typescript-eslint/restrict-template-expressions': 'off',
'@typescript-eslint/no-invalid-this': 'off'
}
}

6
.gitattributes vendored Normal file
View File

@ -0,0 +1,6 @@
* text=auto eol=lf
*.ts linguist-detectable=false
*.css linguist-detectable=false
*.scss linguist-detectable=false
*.js linguist-detectable=true
*.vue linguist-detectable=true

View File

@ -52,6 +52,14 @@ body:
attributes:
label: What is actually happening
placeholder: Please Input
- type: input
id: project-name
attributes:
label: What is your project name
description: We also welcome you to fill in more detailed project information in the following issue [#1485](https://github.com/opentiny/tiny-vue/issues/1485).
placeholder: Please Input
validations:
required: true
- type: textarea
id: additional-comments
attributes:

View File

@ -2,4 +2,4 @@ blank_issues_enabled: true
contact_links:
- name: Questions or need help
url: https://github.com/opentiny/ui-vue/discussions
about: Add this WeChat(opentiny), we will invite you to the WeChat discussion group later.
about: Add this WeChat(opentiny-official), we will invite you to the WeChat discussion group later.

View File

@ -21,3 +21,11 @@ body:
placeholder: Please Input
validations:
required: true
- type: input
id: project-name
attributes:
label: What is your project name
description: We also welcome you to fill in more detailed project information in the following issue [#1485](https://github.com/opentiny/tiny-vue/issues/1485).
placeholder: Please Input
validations:
required: true

View File

@ -4,7 +4,7 @@
Please check if your PR fulfills the following requirements:
- [ ] The commit message follows our [Commit Message Guidelines](https://github.com/opentiny/ui-vue/blob/main/CONTRIBUTING.md)
- [ ] The commit message follows our [Commit Message Guidelines](https://github.com/opentiny/tiny-vue/blob/dev/CONTRIBUTING.md)
- [ ] Tests for the changes have been added (for bug fixes / features)
- [ ] Docs have been added / updated (for bug fixes / features)

26
.github/release.yml vendored Normal file
View File

@ -0,0 +1,26 @@
changelog:
exclude:
labels:
- ignore-for-release
authors:
- allcontributors[bot]
categories:
- title: Breaking Changes 🛠
labels:
- Semver-Major
- breaking-change
- title: Exciting New Features 🎉
labels:
- Semver-Minor
- feature
- enhancement
- title: Bug Fixes 🐛
labels:
- Semver-Patch
- bug
- title: Other Changes
labels:
- documentation
- refactoring
- unit-test
- ci

88
.github/workflows/auto-all-publish.yml vendored Normal file
View File

@ -0,0 +1,88 @@
name: Auto All Publish
on:
push:
tags:
- 'v*'
jobs:
build:
runs-on: windows-latest
outputs:
publishVersion: ${{ steps.parseTag.outputs.publishVersion }}
branchVersion: ${{ steps.parseTag.outputs.branchVersion }}
steps:
- name: Parse Tag
id: parseTag
uses: actions/github-script@v6
with:
script: |
const tag = `${{ github.ref_name }}`
const publishVersion = tag.slice(3)
const branchVersion = tag.slice(1)
core.setOutput('publishVersion', publishVersion)
core.setOutput('branchVersion', branchVersion)
- name: CheckOut Code
uses: actions/checkout@master
with:
ref: release-${{ steps.parseTag.outputs.branchVersion }}
- name: Setup pnpm
uses: pnpm/action-setup@v2
- name: Setup Node
uses: actions/setup-node@v3
with:
node-version: 20.10.0
registry-url: 'https://registry.npmjs.org'
- name: Get pnpm store directory
id: pnpm-cache
run: |
echo "pnpm_cache_dir=$(pnpm store path)" >> $GITHUB_OUTPUT
- uses: actions/cache@v3
name: Setup pnpm cache
with:
path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }}
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-store-
- name: Install dependencies
run: pnpm i --no-frozen-lockfile
- name: Run Build Components
run: pnpm build:ui -t ${{ steps.parseTag.outputs.publishVersion }}
- name: Run Build Sass Common
run: pnpm build:ui saas-common -t ${{ steps.parseTag.outputs.publishVersion }} -d saas
- name: Run Build Runtime
run: pnpm build:runtime
- name: Run Build Theme
run: pnpm build:theme
- name: Run Build Renderless
run: pnpm build:renderless
- name: Run Build ThemeSaas
run: pnpm build:themeSaas
- name: Run Build ThemeMobile
run: pnpm build:themeMobile
- name: Publish Vue3 And Vue2 components
run: pnpm pub:all
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
- name: Release
if: contains(github.ref_name, 'alpha') == false
uses: softprops/action-gh-release@v1
with:
tag_name: ${{ github.ref_name }}
generate_release_notes: true
env:
GITHUB_TOKEN: ${{ secrets.RELEASE_TOKEN }}

View File

@ -0,0 +1,87 @@
name: Dispatch Renderless Theme
run-name: Dispatch Renderless Theme--${{ inputs.components }}
on:
workflow_dispatch:
inputs:
components:
description: |
输入需要打包的模块名称,多个以英文逗号分隔,
例如: `theme,renderless`
required: true
type: string
concurrency:
group: ${{ github.workflow }}-${{ github.sha }}
cancel-in-progress: true
jobs:
build:
runs-on: windows-latest
steps:
- name: Parse Components
id: parseComponents
uses: actions/github-script@v6
with:
script: |
const branchName = `${{ github.ref_name }}`
const moduleName = `${{ inputs.components }}`
if (!moduleName.includes('theme') && !moduleName.includes('renderless')) {
throw new Error('请输入正确的包名称')
}
if (!branchName.includes('release-3.')) {
throw new Error('请使用release-3.xx.xx分支发布正式包')
}
- name: CheckOut Code
uses: actions/checkout@master
with:
ref: ${{ github.ref_name }}
- name: Setup pnpm
uses: pnpm/action-setup@v2
- name: Setup Node
uses: actions/setup-node@v3
with:
node-version: 20.10.0
registry-url: 'https://registry.npmjs.org'
- name: Get pnpm store directory
id: pnpm-cache
run: |
echo "pnpm_cache_dir=$(pnpm store path)" >> $GITHUB_OUTPUT
- uses: actions/cache@v3
name: Setup pnpm cache
with:
path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }}
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-store-
- name: Install dependencies
run: pnpm i --no-frozen-lockfile
- name: Run Build Theme
if: contains(inputs.components, 'theme') == true
run: pnpm build:theme
- name: Run Build Renderless
if: contains(inputs.components, 'renderless') == true
run: pnpm build:renderless
- name: Run Build ThemeSaas
if: contains(inputs.components, 'theme-saas') == true
run: pnpm build:themeSaas
- name: Run Build ThemeMobile
if: contains(inputs.components, 'theme-mobile') == true
run: pnpm build:themeMobile
- name: Publish
run: |
pnpm pub:all
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}

View File

@ -0,0 +1,69 @@
name: Dispatch Ui Publish
run-name: Dispatch Ui--${{ inputs.components }}
on:
workflow_dispatch:
inputs:
components:
description: |
输入需要打包的组件名称,多个以空格分隔,
例如: `input alert`.
required: true
type: string
concurrency:
group: ${{ github.workflow }}-${{ github.sha }}
cancel-in-progress: true
jobs:
build:
runs-on: windows-latest
steps:
- name: Parse Components
id: parseComponents
uses: actions/github-script@v6
with:
script: |
const branchName = `${{ github.ref_name }}`
if (!branchName.includes('release-3.')) {
throw new Error('请使用release-3.xx.xx分支发布正式包')
}
- name: CheckOut Code
uses: actions/checkout@master
with:
ref: ${{ github.ref_name }}
- name: Setup pnpm
uses: pnpm/action-setup@v2
- name: Setup Node
uses: actions/setup-node@v3
with:
node-version: 20.10.0
registry-url: 'https://registry.npmjs.org'
- name: Get pnpm store directory
id: pnpm-cache
run: |
echo "pnpm_cache_dir=$(pnpm store path)" >> $GITHUB_OUTPUT
- uses: actions/cache@v3
name: Setup pnpm cache
with:
path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }}
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-store-
- name: Install dependencies
run: pnpm i --no-frozen-lockfile
- name: Run Build Components
run: pnpm build:ui ${{ inputs.components }}
- name: Publish
run: |
pnpm pub:all
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}

26
.github/workflows/gpt-ci.yaml vendored Normal file
View File

@ -0,0 +1,26 @@
name: GPT Code Review
permissions:
contents: read
pull-requests: write
on:
pull_request:
types: [opened, reopened, synchronize]
jobs:
Review:
if: ${{ contains(github.event.*.labels.*.name, 'gpt-review') }}
runs-on: ubuntu-latest
steps:
- uses: anc95/ChatGPT-CodeReview@main
env:
GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
OPENAI_API_KEY: ${{secrets.OPENAI_API_KEY}}
LANGUAGE: Chinese
PROMPT: ${{ secrets.PROMPT }}
max_tokens: ${{ secrets.MAX_TOKEN }}
top_p: 1
temperature: 1
MAX_PATCH_LENGTH: ${{ secrets.MAX_PATH_LENGTH }} # 当修改行数超过设定值后, 则不会请求gpt进行code review
MODEL: ${{ secrets.MODEL }} # https://platform.openai.com/docs/models

18
.github/workflows/issue-translator.yml vendored Normal file
View File

@ -0,0 +1,18 @@
name: 'issue-translator'
on:
issue_comment:
types: [created]
issues:
types: [opened]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: usthe/issues-translate-action@v2.7
with:
IS_MODIFY_TITLE: false
# 非必须决定是否需要修改issue标题内容
# 若是true则机器人账户@Issues-translate-bot必须拥有修改此仓库issue权限。可以通过邀请@Issues-translate-bot加入仓库协作者实现。
CUSTOM_BOT_NOTE: Bot detected the issue body's language is not English, translate it automatically.
# 非必须,自定义机器人翻译的前缀开始内容。

89
.github/workflows/test-e2e-all.yml vendored Normal file
View File

@ -0,0 +1,89 @@
name: E2E Test ALL
run-name: E2E Test All
on:
workflow_dispatch:
concurrency:
group: ${{ github.workflow }}-${{ github.sha }}
cancel-in-progress: true
jobs:
dispatch-test-all:
name: Dispatch All Test
timeout-minutes: 60
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
shard: [1/8, 2/8, 3/8, 4/8, 5/8, 6/8, 7/8, 8/8]
steps:
- uses: actions/checkout@v3
- name: Setup pnpm
uses: pnpm/action-setup@v2
- name: Setup node
uses: actions/setup-node@v3
with:
node-version: 16
- name: Get pnpm store directory
id: pnpm-cache
run: |
echo "pnpm_cache_dir=$(pnpm store path)" >> $GITHUB_OUTPUT
- uses: actions/cache@v3
name: Setup pnpm cache
with:
path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }}
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-store-
- name: Install dependencies
run: pnpm i --no-frozen-lockfile
- name: dev start
run: pnpm site & sleep 5
- name: update playwright
run: pnpm recursive update @playwright/test
- name: Install Playwright browsers
run: pnpm install:browser --with-deps chromium
- name: Run Playwright tests
run: pnpm test:e2e3 --shard=${{ matrix.shard }} --reporter=blob
- name: Upload blob report to GitHub Actions Artifacts
if: always()
uses: actions/upload-artifact@v3
with:
name: all-blob-reports
path: examples/vue3/blob-report
retention-days: 0.5
dispatch-test-all-merge-reports:
name: 'Merge Reports After Dispatch All Test'
# Merge reports after playwright-tests, even if some shards have failed
if: always()
needs: [dispatch-test-all]
runs-on: ubuntu-latest
steps:
- uses: actions/setup-node@v3
with:
node-version: 16
- name: Install dependencies
run: |
npm install -g @playwright/test
- name: Download blob reports from GitHub Actions Artifacts
uses: actions/download-artifact@v3
with:
name: all-blob-reports
path: all-blob-reports
- name: Merge into HTML Report
run: playwright merge-reports --reporter html ./all-blob-reports
- name: Upload HTML report
uses: actions/upload-artifact@v3
with:
name: html-report--attempt-${{ github.run_attempt }}
path: playwright-report
retention-days: 7

56
.github/workflows/test-e2e-dispatch.yml vendored Normal file
View File

@ -0,0 +1,56 @@
name: E2E Test Dispatch
run-name: E2E Test Dispatch--${{ inputs.testDemos }}--
on:
workflow_dispatch:
inputs:
testDemos:
description: |
Name of directory from "examples/sites/demos/pc/app",
such as `input, alert`.
required: true
type: string
concurrency:
group: ${{ github.workflow }}-${{ github.sha }}
cancel-in-progress: true
jobs:
dispatch-tests:
name: Dispatch Tests
timeout-minutes: 60
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup pnpm
uses: pnpm/action-setup@v2
- name: Setup node
uses: actions/setup-node@v3
with:
node-version: 16
- name: Get pnpm store directory
id: pnpm-cache
run: |
echo "pnpm_cache_dir=$(pnpm store path)" >> $GITHUB_OUTPUT
- uses: actions/cache@v3
name: Setup pnpm cache
with:
path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }}
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-store-
- name: Install dependencies
run: pnpm i --no-frozen-lockfile
- name: dev start
run: pnpm site & sleep 5
- name: Install Playwright browsers
run: pnpm install:browser --with-deps chromium
- name: Run Playwright tests
run: |
testDemos="${{ inputs.testDemos }}"
components=${testDemos//,/' '}
pnpm test:e2e3 $components --reporter=line

View File

@ -0,0 +1,48 @@
name: test-e2e-pr-comment
on:
workflow_run:
workflows: ['E2E Test PR']
types:
- completed
jobs:
comment:
permissions:
pull-requests: write
name: Comment User Tip
runs-on: ubuntu-latest
steps:
- name: Download Pr Artifact
uses: dawidd6/action-download-artifact@v2
with:
workflow: ${{ github.event.workflow_run.workflow_id }}
name: pr
if_no_artifact_found: success
- name: Save PR Id
id: pr
run: |
if [ -f pr-id.txt ]; then
echo "id=$(cat pr-id.txt)" >> $GITHUB_OUTPUT
fi
- name: Download user-tip.txt
uses: dawidd6/action-download-artifact@v2
with:
workflow: ${{ github.event.workflow_run.workflow_id }}
name: user-tip
if_no_artifact_found: success
- id: txtToOutput
run: |
if [ -f user-tip.txt ]; then
echo 'text<<EOF' >> $GITHUB_OUTPUT
cat user-tip.txt >> $GITHUB_OUTPUT
echo 'EOF' >> $GITHUB_OUTPUT
fi
- uses: thollander/actions-comment-pull-request@v2
with:
message: |
${{ steps.txtToOutput.outputs.text }}
comment_tag: e2e-tip
pr_number: ${{ steps.pr.outputs.id }}

122
.github/workflows/test-e2e-pr.yml vendored Normal file
View File

@ -0,0 +1,122 @@
name: E2E Test PR
run-name: E2E Test PR--${{ github.event.pull_request.title }}
on:
pull_request:
types: [opened, reopened, synchronize, edited]
concurrency:
group: ${{ github.workflow }}-${{ github.event.number || github.sha }}
cancel-in-progress: true
jobs:
parse-components:
name: Parse Affected Components
runs-on: ubuntu-latest
outputs:
testComponents: ${{ steps.parseTitle.outputs.testComponents }}
testclis: ${{ steps.parsetestCli.outputs.testClis }}
steps:
- name: Parse Title
id: parseTitle
uses: actions/github-script@v6
with:
script: |
const prTitle = context.payload.pull_request.title
const regex = /\[(.*?)\]/
const matches = prTitle.match(regex)
if (matches && matches.length > 1 && matches[1]) {
let components = matches[1]
.split(',')
.map((c) => c.trim())
.filter((c) => /^[a-z\-\/]+$/.test(c))
.map((c) => `"\\/${c}\\/"`)
components = [...new Set(components)].slice(0, 3).join(' ')
core.setOutput('testComponents', components)
} else {
const warningString =`**[e2e-test-warn]**
The component to be tested is missing.
The title of the Pull request should look like "fix(vue-renderless): [action-menu, alert] fix xxx bug".
Please make sure you've read our [contributing guide](https://github.com/opentiny/tiny-vue/blob/dev/CONTRIBUTING.md)
`
core.setOutput('tip', warningString)
core.warning(warningString)
}
- name: generate user-tip.txt
if: ${{ steps.parseTitle.outputs.tip }}
run: |
cat << EOF > user-tip.txt
${{ steps.parseTitle.outputs.tip }}
EOF
- name: Upload User Tip
if: ${{ steps.parseTitle.outputs.tip }}
uses: actions/upload-artifact@v4
with:
name: user-tip
path: user-tip.txt
retention-days: 1
- name: Save PR number
if: ${{ steps.parseTitle.outputs.tip }}
run: echo ${{ github.event.number }} > ./pr-id.txt
- name: Upload PR number
if: ${{ steps.parseTitle.outputs.tip }}
uses: actions/upload-artifact@v4
with:
name: pr
path: ./pr-id.txt
- name: Parse Test Cli
id: parsetestCli
uses: actions/github-script@v6
with:
script: |
const testClis = '${{ vars.PLAYWRIGHT_CLIS }}' ? '${{ vars.PLAYWRIGHT_CLIS }}'.split(',') : ['pnpm test:e2e3']
core.setOutput('testclis', JSON.stringify(testClis))
pr-test:
if: ${{ needs.parse-components.outputs.testComponents }}
strategy:
matrix:
testcli: ${{ fromJson(needs.parse-components.outputs.testclis) }}
name: PR E2E Test
needs: parse-components
runs-on: ubuntu-latest
env:
TEST_COMPONENTS: ${{ needs.parse-components.outputs.testComponents }}
steps:
- uses: actions/checkout@v3
- name: Setup pnpm
uses: pnpm/action-setup@v2
- name: Setup node
uses: actions/setup-node@v3
with:
node-version: 16
- name: Cache Playwright Installation
uses: actions/cache@v3
with:
path: ~/.cache/ms-playwright
key: playwright-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }}
- name: Get pnpm store directory
id: pnpm-cache
run: |
echo "pnpm_cache_dir=$(pnpm store path)" >> $GITHUB_OUTPUT
- uses: actions/cache@v3
name: Setup pnpm cache
with:
path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }}
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-store-
- name: Install dependencies
run: pnpm i --no-frozen-lockfile
- name: Install Playwright browsers
run: pnpm install:browser --with-deps chromium
- name: E2E Test
run: ${{ matrix.testcli }} ${{ env.TEST_COMPONENTS }} --retries=1 --workers=2

57
.gitignore vendored
View File

@ -1,16 +1,33 @@
.DS_Store
node_modules
dist/
dist2/
dist2.7/
dist3/
dist-react/
allDist/
packages/**/runtime/
packages/**/runtime
coverage/
test-results
/packages/base.js
/packages/chart.js
/packages/core.js
/packages/index.js
/packages/pc.js
/packages/mobile.js
/packages/vue/index.ts
/packages/vue/pc.ts
/packages/vue/mobile.ts
/packages/vue/mobile-first.ts
/packages/vue/app.ts
/packages/vue-icon-saas/src
/packages/vue-icon-saas/index.ts
/packages/react/index.ts
/packages/react/pc.ts
/packages/react/mobile.ts
/packages/react/app.ts
/packages/react/mobile-first.ts
/examples/**/playwright-report
/examples/**/test-results
vite.config.ts.timestamp*
vitest.config.ts.timestamp*
# local env
.env.local
@ -24,8 +41,6 @@ yarn-error.log*
# Editor directories and files
.idea
.history
.vscode
.cloudbuild
*.suo
*.ntvs*
*.njsproj
@ -34,8 +49,26 @@ yarn-error.log*
*.log
*.stackdump
yarn.lock
package-lock.json
tgzs
*.tgz
packages/theme/scripts/theme.json
packages/theme/scripts/theme-result.txt
packages/theme/scripts/themeExcel.xlsx
packages/theme/src/theme/*-theme/component.js
pnpm-lock.yaml
gulp/bundle.json
# 屏蔽测试用例报告相关文件
allure-report
allure-results
test-results
# 本地构建的saas相关资源文件
examples/sites/public/tiny-vue*.js
examples/sites/public/tiny-vue*.mjs
examples/sites/public/tailwind.css
examples/sites/public/index.css

16
.hintrc Normal file
View File

@ -0,0 +1,16 @@
{
"extends": [
"development"
],
"hints": {
"compat-api/html": [
"default",
{
"ignore": [
"script[type=module]"
]
}
],
"axe/language": "off"
}
}

View File

@ -1,4 +1,4 @@
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
npx lint-staged
npx lint-staged

4
.lintstagedrc.json Normal file
View File

@ -0,0 +1,4 @@
{
"*.{js,jsx,ts,tsx,vue}": ["prettier --write", "eslint --fix"],
"*.md": ["prettier --write"]
}

7
.npmrc
View File

@ -1,3 +1,4 @@
@huawei:registry=https://npm.cloudartifact.dgg.dragon.tools.huawei.com/artifactory/api/npm/npm-cbcbigate/
_auth=Y2JjYmlnYXRlOkh1YXdlaUAxMjM=
registry=https://npm.inhuawei.com/
shell-emulator=true
auto-install-peers=true
strict-peer-dependencies=false
enable-pre-post-scripts=true

View File

@ -1,3 +1,9 @@
# Except myapp folder:
dist/
public/
dist
dist2
dist2.7
dist3
node_modules
internal/template
internal/runtime
examples/docs/public/static
pnpm-lock.yaml

View File

@ -1,4 +1,23 @@
semi: false
singleQuote: true
printWidth: 160
trailingComma: none
{
"semi": false,
"singleQuote": true,
"printWidth": 120,
"trailingComma": "none",
"quoteProps": "preserve",
"endOfLine": "auto",
"bracketSpacing": true,
"jsxBracketSameLine": true,
"jsxSingleQuote": false,
"useTabs": false,
"tabWidth": 2,
"proseWrap": "preserve",
"arrowParens": "always",
"overrides": [
{
"files": ".prettierrc",
"options": {
"parser": "json"
}
}
]
}

11
.vscode/extensions.json vendored Normal file
View File

@ -0,0 +1,11 @@
{
"recommendations": [
"vue.volar",
"bradlc.vscode-tailwindcss",
"davidanson.vscode-markdownlint",
"dbaeumer.vscode-eslint",
"stylelint.vscode-stylelint",
"ms-playwright.playwright"
],
"unwantedRecommendations": ["esbenp.prettier-vscode", "octref.vetur"]
}

86
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,86 @@
{
"explorer.fileNesting.enabled": true,
"explorer.fileNesting.expand": false,
"explorer.fileNesting.patterns": {
"*.js": "$(capture).js.map, $(capture).*.js",
"*.ts": "$(capture).ts.map, $(capture).*.ts",
"*.tsx": "$(capture).tsx.map, $(capture).*.tsx",
".gitignore": ".gitattributes",
".eslintrc.js": ".eslintignore, .prettierignore, .prettierrc, commitlint.config.js",
"README.md": "*.md, LICENSE",
"tsconfig.json": "tsconfig.*.json, jsconfig.json",
"package.json": ".npmrc, pnpm-workspace.yaml, logo.svg, lerna.json"
},
"editor.quickSuggestions": {
"strings": true
},
"markdownlint.config": {
"no-inline-html": false,
"first-line-heading": false
},
"typescript.tsdk": "node_modules/typescript/lib",
"prettier.enable": true,
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"source.fixAll.eslint": "explicit"
},
"stylelint.validate": ["css", "less", "postcss", "scss", "sass"],
"better-comments.highlightPlainText": true,
"better-comments.tags": [
{
"tag": "#v",
"color": "#FF8C00",
"strikethrough": false,
"underline": false,
"backgroundColor": "transparent",
"bold": false,
"italic": false
},
{
"tag": "!",
"color": "#FF2D00",
"strikethrough": false,
"underline": false,
"backgroundColor": "transparent",
"bold": false,
"italic": false
},
{
"tag": "?",
"color": "#3498DB",
"strikethrough": false,
"underline": false,
"backgroundColor": "transparent",
"bold": false,
"italic": false
},
{
"tag": "//",
"color": "#474747",
"strikethrough": true,
"underline": false,
"backgroundColor": "transparent",
"bold": false,
"italic": false
},
{
"tag": "todo",
"color": "#FF8C00",
"strikethrough": false,
"underline": false,
"backgroundColor": "transparent",
"bold": false,
"italic": false
},
{
"tag": "*",
"color": "#98C379",
"strikethrough": false,
"underline": false,
"backgroundColor": "transparent",
"bold": false,
"italic": false
}
],
"vue.codeActions.enabled": false
}

View File

@ -1,20 +0,0 @@
# 更新日志
## v2.0.0/v3.0.0
`2022/09/15`
### 📢破坏性变更
### ✨新特性
- Search 组件:增加 input 事件
- Select 组件:增加 scroll 事件
### 🐞缺陷修复
- Tabs 组件:修复 tab 组件套 tab 组件,内部的 tab 项会显示在外部 tab 上的bug
- PopEditor 组件:解决弹出框里的查询条件不能输入的问题
- Cascader 组件:解决点击已选中选项无法关闭选择器的问题

View File

@ -1,81 +1,137 @@
# 贡献指南
# Contributing
很高兴你有意愿参与 TinyVue 开源项目的贡献,参与贡献的形式有很多种,你可以根据自己的特长和兴趣选择其中的一个或多个:
We are glad that you are willing to contribute to the TinyVue open source project. There are many forms of contribution, and you can choose one or more of them according to your strengths and interests:
- 报告[新缺陷](https://github.com/opentiny/tiny-vue/issues/new?template=bug-report.yml)
- 为[已有缺陷](https://github.com/opentiny/tiny-vue/labels/bug)提供更详细的信息比如补充截图、提供更详细的复现步骤、提供最小可复现demo链接等
- 提交 Pull requests 修复文档中的错别字或让文档更清晰和完善
- 添加官方小助手微信 opentiny-official加入技术交流群参与讨论
- Report [new defect](https://github.com/opentiny/tiny-vue/issues/new?template=bug-report.yml)
- Provide more detailed information for [existing defects](https://github.com/opentiny/tiny-vue/labels/bug), such as supplementary screenshots, more detailed reproduction steps, minimum reproducible demo links, etc.
- Submit Pull requests to fix typos in the document or make the document clearer and better
- Add the official assistant WeChat `opentiny-official` and join the technical exchange group to participate in the discussion.
当你亲自使用 TinyVue 组件库,并参与多次以上形式的贡献,对 TinyVue 逐渐熟悉之后,可以尝试做一些更有挑战的事情,比如:
When you personally use the TinyVue component library and participate in many of the above contributions, as you become familiar with TinyVue, you can try to do something more challenging, such as:
- 修复缺陷,可以先从 [Good-first issue](https://github.com/opentiny/tiny-vue/labels/good%20first%20issue) 开始
- 实现新特性
- 完善单元测试
- 翻译文档
- 参与代码检视
- Fix defects, you can start with [Good-first issue](https://github.com/opentiny/tiny-vue/labels/good%20first%20issue).
- Implement new features.
- Improve unit testing.
- Translate the document.
- Participate in code review.
## 提交 Issue
## Bug Reports
如果你在使用 TinyVue 组件过程中遇到问题,欢迎给我们提交 Issue提交 Issue 之前,请先仔细阅读相关的[官方文档](https://opentiny.design),确认这是一个缺陷还是尚未实现的功能。
If you encounter problems in the process of using TinyVue components, you are welcome to submit Issue to us. Before submitting Issue, please read the relevant [official documentation](https://opentiny.design) carefully to confirm whether this is a defect or an unimplemented function.
如果是一个缺陷,创建新 Issue 时选择 [Bug report](https://github.com/opentiny/tiny-vue/issues/new?template=bug-report.yml) 模板,标题遵循 `[componentName]缺陷简述` 的格式,比如:`[select]选择框内容太长展示不下时希望能支持配置tips提示`。
If it is a defect, select [Bug report](https://github.com/opentiny/tiny-vue/issues/new?template=bug-report.yml) template when creating a new Issue. The title follows the format of `[componentName] defect description`. For example: `[select] filtering function, the selected option cannot be selected again after it has been deleted`.
报告缺陷的 Issue 主要需要填写以下信息:
- tiny-vue 和 vue 的版本号
- 缺陷的表现,可截图辅助说明,如果有报错可贴上报错信息
- 缺陷的复现步骤,最好能提供一个最小可复现 demo 链接
Issue that reports defects mainly needs to fill in the following information:
如果是一个新特性,则选择 [Feature request](https://github.com/opentiny/tiny-vue/issues/new?template=feature-request.yml) 模板,标题遵循 `[componentName]新特性简述` 的格式,比如:`[select]过滤功能中,选中的选项退格删除后,无法再次选中该选项`。
- Version numbers of `@opentiny/vue` and `vue`.
- The performance of the defect can be illustrated by screenshot, and if there is an error, the error message can be posted.
- Defect reproduction step, preferably with a minimum reproducible demo link.
新特性的 Issue 主要需要填写以下信息:
- 该特性主要解决用户的什么问题
- 该特性的 api 是什么样的
If it is a new feature, select [Feature request](https://github.com/opentiny/tiny-vue/issues/new?template=feature-request.yml) template. The title follows the format of `[componentName] new feature description`. For example: `[select] selection box is too long to display, hope to support the configuration of tips prompt`.
## 提交 PR
The following information is required for the Issue of the new feature:
提交 PR 之前,请先确保你提交的内容是符合 TinyVue 整体规划的,一般已经标记为 [bug](https://github.com/opentiny/tiny-vue/labels/bug) 的 Issue 是鼓励提交 PR 的,如果你不是很确定,可以创建一个 [Discussion](https://github.com/opentiny/tiny-vue/discussions) 进行讨论。
- What problems does this feature mainly solve for users?
- What is the api of this feature?
本地启动步骤:
## Pull Requests
- 点击 [TinyVue](https://github.com/opentiny/tiny-vue) 代码仓库右上角的 Fork 按钮,将上游仓库 Fork 到个人仓库
- Clone 个人仓库到本地
- 在 Tiny Vue 根目录下运行 npm i, 安装 node 依赖
- 运行 npm run dev:vue3启动组件库网站
- 打开浏览器访问:[http://127.0.0.1:5173/](http://127.0.0.1:5173/)
Before submitting pull request, please make sure that your submission is in line with the overall plan of TinyVue. Generally, issues that marked as [bug](https://github.com/opentiny/tiny-vue/labels/bug) are encouraged to submit pull requests. If you are not sure, you can create a [Discussion](https://github.com/opentiny/tiny-vue/discussions) for discussion.
### Pull Request Specification
#### Commit Message
The commit message should be in the form of a `type(scope): description of the message`, e.g. `fix(vue-renderless): [scrollbar, action-menu] fix xxx bug`.
1. type: must be one of build, chore, ci, docs, feat, fix, perf, refactor, revert, release, style, test, improvement.
2. scope.
- Package names in the `packages` directory, e.g. `vue-design-aurora, vue-design-saas, react ......`
- Component name under the package name in the `packages` directory, e.g., `vue-design-aurora/alert, vue-design-saas/alert, react/alert ......`
- The name of the folder to use: e.g.: `gulp, internals/playwright-config, sites`
- The name of the component (lowercase, center dot): e.g.: `action-menu, alert ......`
#### Pull Request Title
1. The specification of the title is the same as the commit information, which is entered in the form of `type(scope): description information`.
2. **e2e test** of trigger components: Adding '[componentName1, componentName2]' to the Pull Request title will execute test cases for componentName1, componentName2, and declare this structure when changes to code affect components.
- Note: The `github action` in this project identifies test e2e use cases to be executed by matching the component names declared by `[componentName1, componentName2]` with the path names in the `examples/sites/demos` directory. (Because running the full test case is too time consuming)
- When modifying a sub-component of a component, such as the `col` component, which has no corresponding examples and test cases, the `layout` component should be tested, because the `col` component is a sub-component of the `layout` component. The PR title can be: `fix(col): [layout] xxxxxxxxxxxxxx`
3. Example title:
- Supplement alert component document: `docs(alert): [alert] xxxxxxxxxxxxxxx`, `docs(site): [alert] xxxxxxxxxxxxxxx`
- Supplement alet component test case: `test(alert): [alert] xxxxxxxxxxxxxx`
- Fixed bug in alet component @opentiny/vue-renderless: `fix(vue-renderless/alert): [alert] xxxxxxxxxxxxxx`
#### Pull Request Description
The PR description uses a template, and it is necessary to fill in the relevant information of the PR according to the template, mainly including:
- PR Checklist: Whether the Commit information is compliant with the specifications, whether it supplements the E2E test cases, and whether it supplements the documentation
- PR Type: Bugfix / Feature / Code style update / Refactoring and so on
- Issue Number
- Does this PR introduce a breaking change?
### Local Startup Steps
- Click the Fork button in the upper right corner of the [TinyVue](https://github.com/opentiny/tiny-vue) code repository to Fork the upstream repository to the personal repository.
- Clone personal repository to local.
- Associated with the upstream repository to facilitate the synchronization of the latest code of the upstream repository.
- Run `pnpm i` under the TinyVue root directory to install node dependencies.
- Run `pnpm dev` to launch the component library website.
- Open the browser to visit: [http://127.0.0.1:7130/](http://127.0.0.1:7130/)
```shell
# username 为用户名,执行前请替换
# You need to replace username with your own user name
git clone git@github.com:username/tiny-vue.git
cd tiny-vue
# Associate upstream repository
git remote add upstream git@github.com:opentiny/tiny-vue.git
npm i
# 启动 Vue3 项目
npm run dev:vue3
# Installation
pnpm i
# 启动 Vue2 项目
npm run dev:vue2
# Launch Vue.js 3
pnpm dev
# Launch Vue.js 2
pnpm dev:vue2
```
提交 PR 的步骤:
### Submit a PR
- 请确保你已经完成本地启动中的步骤,并能正常访问:[http://127.0.0.1:5173/](http://127.0.0.1:5173/)
- 创建新分支 `git checkout -b username/feature1`,分支名字建议为 `username/feat-xxx` / `username/fix-xxx`
- 本地编码
- 遵循 [Commit Message Format](https://www.conventionalcommits.org/zh-hans/v1.0.0/) 规范进行提交,不符合提交规范的 PR 将不会被合并
- 提交到远程仓库git push origin branchName
- (可选)同步上游仓库 dev 分支最新代码git pull upstream dev
- 打开 TinyVue 代码仓库的 [Pull requests](https://github.com/opentiny/tiny-vue/pulls) 链接,点击 New pull request 按钮提交 PR
- 项目 Committer 进行 Code Review并提出意见
- PR 作者根据意见调整代码,请注意一个分支发起了 PR 后,后续的 commit 会自动同步,无需重新提交 PR
- 项目管理员合并 PR
- Make sure that you have completed the steps in local startup and can visit [http://127.0.0.1:7130/](http://127.0.0.1:7130/) normally.
- Synchronize upstream repository dev branch latest code: `git pull upstream dev`.
- Create a new branch `git checkout-b username/feature1 upstream/ dev` from the upstream repository dev branch. The name of the branch should be `username/feat- xxx` / `username/fix- xxx`.
- Local coding.
- Submit according to [Commit Message Format](https://www.conventionalcommits.org/zh-hans/v1.0.0/) specification. PR that do not conform to the submission specification will not be merged.
- Submit to remote repository: `git push origin branchName`.
- Open the [Pull requests](https://github.com/opentiny/tiny-vue/pulls) link of the TinyVue code repository and click the New pull request button to submit the PR.
- According to the PR template, please provide the following information: PR self-check items, PR type, related Issue ID, whether it is a destructive change.
- Project Committer conducts Code Review and makes comments.
- The PR author adjusts the code according to the opinion. Please note that when a branch initiates PR, the subsequent commit will be synchronized automatically, and there is no need to resubmit the PR.
- Project administrator merges PR.
贡献流程结束,感谢你的贡献!
The contribution process is over, thank you for your contribution!
## 加入开源社区
## Join OpenTiny Community
如果你对我们的开源项目感兴趣,欢迎通过以下方式加入我们的开源社区。
If you are interested in our open source project, you are welcome to join our open source community in the following ways.
- 添加官方小助手微信opentiny-official加入我们的技术交流群
- 加入邮件列表opentiny@googlegroups.com
- Add official assistant WeChat: opentiny-official to join our technical exchange group.
- Add to the mailing list: <opentiny@googlegroups.com>
If you have submitted Issue or PR to OpenTiny, you can comment on Issue or Pull Request, asking @all-contributors to add a contributor:
```
@all-contributors please add @<username> for <contributions>
```
For detailed rules, please refer to [https://allcontributors.org/docs/en/bot/usage](https://allcontributors.org/docs/en/bot/usage)

137
CONTRIBUTING.zh-CN.md Normal file
View File

@ -0,0 +1,137 @@
# 贡献指南
很高兴你有意愿参与 TinyVue 开源项目的贡献,参与贡献的形式有很多种,你可以根据自己的特长和兴趣选择其中的一个或多个:
- 报告[新缺陷](https://github.com/opentiny/tiny-vue/issues/new?template=bug-report.yml)
- 为[已有缺陷](https://github.com/opentiny/tiny-vue/labels/bug)提供更详细的信息,比如补充截图、提供更详细的复现步骤、提供最小可复现 demo 链接等
- 提交 Pull requests 修复文档中的错别字或让文档更清晰和完善
- 添加官方小助手微信 opentiny-official加入技术交流群参与讨论
当你亲自使用 TinyVue 组件库,并参与多次以上形式的贡献,对 TinyVue 逐渐熟悉之后,可以尝试做一些更有挑战的事情,比如:
- 修复缺陷,可以先从 [Good-first issue](https://github.com/opentiny/tiny-vue/labels/good%20first%20issue) 开始
- 实现新特性
- 完善单元测试
- 翻译文档
- 参与代码检视
## 提交 Issue
如果你在使用 TinyVue 组件过程中遇到问题,欢迎给我们提交 Issue提交 Issue 之前,请先仔细阅读相关的[官方文档](https://opentiny.design),确认这是一个缺陷还是尚未实现的功能。
如果是一个缺陷,创建新 Issue 时选择 [Bug report](https://github.com/opentiny/tiny-vue/issues/new?template=bug-report.yml) 模板,标题遵循 `[componentName]缺陷简述` 的格式,比如:`[select]过滤功能中,选中的选项退格删除后,无法再次选中该选项`。
报告缺陷的 Issue 主要需要填写以下信息:
- tiny-vue 和 vue 的版本号
- 缺陷的表现,可截图辅助说明,如果有报错可贴上报错信息
- 缺陷的复现步骤,最好能提供一个最小可复现 demo 链接
如果是一个新特性,则选择 [Feature request](https://github.com/opentiny/tiny-vue/issues/new?template=feature-request.yml) 模板,标题遵循 `[componentName]新特性简述` 的格式,比如:`[select]选择框内容太长展示不下时希望能支持配置tips提示`。
新特性的 Issue 主要需要填写以下信息:
- 该特性主要解决用户的什么问题
- 该特性的 api 是什么样的
## 提交 PR
提交 PR 之前,请先确保你提交的内容是符合 TinyVue 整体规划的,一般已经标记为 [bug](https://github.com/opentiny/tiny-vue/labels/bug) 的 Issue 是鼓励提交 PR 的,如果你不是很确定,可以创建一个 [Discussion](https://github.com/opentiny/tiny-vue/discussions) 进行讨论。
### Pull Request 规范
#### Commit 信息
commit 信息要以 `type(scope): 描述信息` 的形式填写,例如 `fix(vue-renderless): [scrollbar, action-menu] fix xxx bug`
1. type: 必须是 build, chore, ci, docs, feat, fix, perf, refactor, revert, release, style, test, improvement 其中的一个。
2. scope:
- `packages`目录下的包名,比如:`vue-design-aurora, vue-design-saas, react ......`
- `packages`目录下的包名下的组件名,比如:`vue-design-aurora/alert, vue-design-saas/alert, react/alert ......`
- 用文件夹的名称: 比如: `gulp, internals/playwright-config, sites`
- 组件的名称(小写,中划线): 比如: `action-menu, alert ......`
#### Pull Request 的标题
1. 标题的规范与 commit 信息一样,以`type(scope): 描述信息` 的形式填写。
2. 触发组件的 **e2e 测试**: 在 Pull Request 标题里添加 `[componentName1, componentName2]`,将会执行 componentName1componentName2 的测试用例,当改动的代码会影响组件时,需要声明这个结构。
- 注:本项目下的 `github action` 会用`[componentName1, componentName2]`声明的组件名匹配 `examples/sites/demos` 目录下的路径名称识别要执行的测试e2e用例。因为全量跑测试用例太耗费时间
- 当修改了某个组件的子组件,比如`col`组件,它本身没有对应的示例以及测试用例,这时应该要测试的是`layout`组件,因为`col`组件是`layout`组件的子组件PR 标题可以这样: `fix(col): [layout] xxxxxxxxxxxxxx`
3. 标题示例:
- 补充 alert 组件文档: `docs(alert): [alert] xxxxxxxxxxxxxxx`, `docs(site): [alert] xxxxxxxxxxxxxxx`
- 补充 alet 组件测试用例: `test(alert): [alert] xxxxxxxxxxxxxx`
- 修复 alet 组件 @opentiny/vue-renderless 下的缺陷: `fix(vue-renderless/alert): [alert] xxxxxxxxxxxxxx`
#### Pull Request 的描述
PR 描述使用了模板,需要按照模板填写 PR 相关信息,主要包括:
- PR 自检项Commit 信息是够符合规范、是否补充了 E2E 测试用例、是否补充了文档
- PR 类型:缺陷修复、新特性、代码格式调整、重构等
- 关联的 Issue 编号
- 是否包含破坏性变更
### 本地启动步骤
- 点击 [TinyVue](https://github.com/opentiny/tiny-vue) 代码仓库右上角的 Fork 按钮,将上游仓库 Fork 到个人仓库
- Clone 个人仓库到本地
- 关联上游仓库,方便同步上游仓库最新代码
- 在 Tiny Vue 根目录下运行 `pnpm i`, 安装 node 依赖
- 运行 `pnpm dev`,启动组件库网站
- 打开浏览器访问:[http://127.0.0.1:7130/](http://127.0.0.1:7130/)
```shell
# username 为用户名,执行前请替换
git clone git@github.com:username/tiny-vue.git
cd tiny-vue
# 关联上游仓库
git remote add upstream git@github.com:opentiny/tiny-vue.git
# 安装依赖
pnpm i
# 启动 Vue3 项目
pnpm dev
# 启动 Vue2 项目
pnpm dev:vue2
```
### 提交 PR 的步骤
- 请确保你已经完成本地启动中的步骤,并能正常访问:[http://127.0.0.1:7130/](http://127.0.0.1:7130/)
- 同步上游仓库 dev 分支最新代码git pull upstream dev
- 从上游仓库 dev 分支创建新分支 `git checkout -b username/feature1 upstream/dev`,分支名字建议为 `username/feat-xxx` / `username/fix-xxx`
- 本地编码
- 遵循 [Commit Message Format](https://www.conventionalcommits.org/zh-hans/v1.0.0/) 规范进行提交,不符合提交规范的 PR 将不会被合并
- 提交到远程仓库git push origin branchName
- 打开 TinyVue 代码仓库的 [Pull requests](https://github.com/opentiny/tiny-vue/pulls) 链接,点击 New pull request 按钮提交 PR
- 按照 PR 模板补充相关信息,包括 PR 自检项、PR 类型、关联的 Issue 编号、是否是破坏性变更
- 项目 Committer 进行 Code Review并提出意见
- PR 作者根据意见调整代码,请注意一个分支发起了 PR 后,后续的 commit 会自动同步,无需重新提交 PR
- 项目管理员合并 PR
贡献流程结束,感谢你的贡献!
## 加入开源社区
如果你对我们的开源项目感兴趣,欢迎通过以下方式加入我们的开源社区。
- 添加官方小助手微信opentiny-official加入我们的技术交流群
- 加入邮件列表:<opentiny@googlegroups.com>
如果你给 OpenTiny 提交过 Issue 或 PR请通过以下方式添加自己到贡献者列表里。
```
@all-contributors please add @<username> for <contributions>
```
详细规则可以参考:[https://allcontributors.org/docs/en/bot/usage](https://allcontributors.org/docs/en/bot/usage)

View File

@ -19,4 +19,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
SOFTWARE.

175
README.md
View File

@ -1,43 +1,46 @@
<p align="center">
<a href="https://tinyuidesign.cloudbu.huawei.com/" target="_blank" rel="noopener noreferrer">
<img alt="TinyVue Logo" src="logo.svg" height="100" style="max-width:100%;">
<a href="https://opentiny.design/tiny-vue" target="_blank" rel="noopener noreferrer">
<img alt="OpenTiny Logo" src="logo.svg" height="100" style="max-width:100%;">
</a>
</p>
<p align="center">Tiny Vue 是一个基于 Vue 的 UI 组件库,可以同时支持 Vue 2.0 和 Vue 3.0。</p>
<p align="center">An enterprise-class UI component library, support both Vue.js 2 and Vue.js 3, as well as PC and mobile.</p>
特性:
English | [简体中文](README.zh-CN.md)
- 包含 69 个简洁、易用、功能强大的组件
- 同时支持 Vue2 和 Vue3
- 支持国际化
- 支持主题定制
- 组件内部支持配置式开发,特别适合低代码平台可视化组件配置
- 采用模板、样式、逻辑分离的跨端跨框架架构,保障灵活性和可移植性
🌈 Features:
## 如何使用
- 📦 104 clean, easy-to-use and powerful components.
- 🖖 One code, Support both Vue.js 2 and Vue.js 3.
- 🖥️ One code, Support both PC and Mobile.
- 🌍 Support internationalization.
- 🎨 Support theme customization.
- 📊 Components support configuration development, can support low-code platform.
- 💡 Use a cross-end and cross-framework architecture, flexible and portable.
### 1. 安装
## 🛠️ Usage
执行以下命令,安装 Vue 3.0 版本的 Tiny Vue 组件库:
### 1. Installation
Execute the following command to install the TinyVue component library for Vue.js 3.
```shell
npm i @opentiny/vue
npm i @opentiny/vue@3
```
执行以下命令,安装 Vue 2.0 版本的 Tiny Vue 组件库
Execute the following command to install the TinyVue component library for Vue.js 2.
```shell
npm i @opentiny/vue@2
```
### 2. 引入和使用
### 2. Import component
在`App.vue`文件中使用 Tiny Vue 组件。
Then you can use the TinyVue component(such as `<tiny-button>`) in the `App.vue` file.
```vue
```html
<script lang="ts" setup>
import { Button as TinyButton } from '@opentiny/vue'
import { Button as TinyButton } from '@opentiny/vue'
</script>
<template>
@ -45,31 +48,139 @@ import { Button as TinyButton } from '@opentiny/vue'
</template>
```
## 本地开发
## 🖥️ Development
```shell
git clone git@github.com:opentiny/tiny-vue.git
cd tiny-vue
npm i --legacy-peer-deps
pnpm i
# 启动 Vue3 项目
npm run dev:vue3
# Vue.js 3
pnpm dev
# 启动 Vue2 项目
npm run dev:vue2
# Vue.js 2
pnpm dev2
```
打开浏览器访问:[http://127.0.0.1:5173/](http://127.0.0.1:5173/)
Open your browser and visit: [http://127.0.0.1:7130/](http://127.0.0.1:7130/)
## 参与贡献
## 🤝 Contributing
如果你对我们的开源项目感兴趣,欢迎加入我们!
Welcome to join our OpenTiny community!🎉
参与贡献之前请先阅读[贡献指南](CONTRIBUTING.md)。
If you don't know how to start, please read our [contributing guide](CONTRIBUTING.md).
- 添加官方小助手微信 opentiny加入技术交流群
- 加入邮件列表 opentiny@googlegroups.com
- Add the official assistant WeChat `opentiny-official` and join the technical exchange group.
- Add to the mailing list `opentiny@googlegroups.com`
## 开源协议
## ✨ Contributors
Contributors are community members who have 1 or more PR merged in OpenTiny.
Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
<table>
<tbody>
<tr>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/kagol"><img src="https://avatars.githubusercontent.com/u/9566362?v=4?s=100" width="100px;" alt="Kagol"/><br /><sub><b>Kagol</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=kagol" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/zzcr"><img src="https://avatars.githubusercontent.com/u/18521562?v=4?s=100" width="100px;" alt="ajaxzheng"/><br /><sub><b>ajaxzheng</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=zzcr" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/TC-twwang"><img src="https://avatars.githubusercontent.com/u/42400776?v=4?s=100" width="100px;" alt="TC-twwang"/><br /><sub><b>TC-twwang</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=TC-twwang" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/MNZhu"><img src="https://avatars.githubusercontent.com/u/17588953?v=4?s=100" width="100px;" alt="jacknan"/><br /><sub><b>jacknan</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=MNZhu" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/awspi"><img src="https://avatars.githubusercontent.com/u/66438036?v=4?s=100" width="100px;" alt="Pithy"/><br /><sub><b>Pithy</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=awspi" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/heygsc"><img src="https://avatars.githubusercontent.com/u/103993866?v=4?s=100" width="100px;" alt="heygsc"/><br /><sub><b>heygsc</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=heygsc" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/wwttff"><img src="https://avatars.githubusercontent.com/u/32888622?v=4?s=100" width="100px;" alt="MangoWu"/><br /><sub><b>MangoWu</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=wwttff" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/ErKeLost"><img src="https://avatars.githubusercontent.com/u/66500121?v=4?s=100" width="100px;" alt="ADNY"/><br /><sub><b>ADNY</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=ErKeLost" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/chenxi-20"><img src="https://avatars.githubusercontent.com/u/76168465?v=4?s=100" width="100px;" alt="chenxi-20"/><br /><sub><b>chenxi-20</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=chenxi-20" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/rayhaoqin"><img src="https://avatars.githubusercontent.com/u/46983981?v=4?s=100" width="100px;" alt="Alaray"/><br /><sub><b>Alaray</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=rayhaoqin" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/yuanningning"><img src="https://avatars.githubusercontent.com/u/104059491?v=4?s=100" width="100px;" alt="ing"/><br /><sub><b>ing</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=yuanningning" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/shenjunjian"><img src="https://avatars.githubusercontent.com/u/6848520?v=4?s=100" width="100px;" alt="申君健"/><br /><sub><b>申君健</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=shenjunjian" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/MomoPoppy"><img src="https://avatars.githubusercontent.com/u/125256456?v=4?s=100" width="100px;" alt="MomoPoppy"/><br /><sub><b>MomoPoppy</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=MomoPoppy" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/WXC-Spring"><img src="https://avatars.githubusercontent.com/u/131581326?v=4?s=100" width="100px;" alt="WXC-Spring"/><br /><sub><b>WXC-Spring</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=WXC-Spring" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/GaoNeng-wWw"><img src="https://avatars.githubusercontent.com/u/31283122?v=4?s=100" width="100px;" alt="GaoNeng"/><br /><sub><b>GaoNeng</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=GaoNeng-wWw" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://acyza.github.io"><img src="https://avatars.githubusercontent.com/u/101238421?v=4?s=100" width="100px;" alt="acyza"/><br /><sub><b>acyza</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=acyza" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/ygj6"><img src="https://avatars.githubusercontent.com/u/7699524?v=4?s=100" width="100px;" alt="ygj6"/><br /><sub><b>ygj6</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=ygj6" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/MrWang2016"><img src="https://avatars.githubusercontent.com/u/24307164?v=4?s=100" width="100px;" alt="MrWang2016"/><br /><sub><b>MrWang2016</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=MrWang2016" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/qinwencheng"><img src="https://avatars.githubusercontent.com/u/24841685?v=4?s=100" width="100px;" alt="qinwencheng"/><br /><sub><b>qinwencheng</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=qinwencheng" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Huangyilin19"><img src="https://avatars.githubusercontent.com/u/48042709?v=4?s=100" width="100px;" alt="黄怡林"/><br /><sub><b>黄怡林</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=Huangyilin19" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/zuixinwang"><img src="https://avatars.githubusercontent.com/u/59717852?v=4?s=100" width="100px;" alt="zuixinwang"/><br /><sub><b>zuixinwang</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=zuixinwang" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/LadyChatterleyLover"><img src="https://avatars.githubusercontent.com/u/35223515?v=4?s=100" width="100px;" alt="luopei"/><br /><sub><b>luopei</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=LadyChatterleyLover" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://juejin.cn/user/1996368846785128"><img src="https://avatars.githubusercontent.com/u/31237954?v=4?s=100" width="100px;" alt="前端爆冲"/><br /><sub><b>前端爆冲</b></sub></a><br /><a href="#infra-brenner8023" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/xiejay97"><img src="https://avatars.githubusercontent.com/u/64340763?v=4?s=100" width="100px;" alt="Xie Jay"/><br /><sub><b>Xie Jay</b></sub></a><br /><a href="#infra-xiejay97" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
</tr>
<tr>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/linxiang07"><img src="https://avatars.githubusercontent.com/u/40119767?v=4?s=100" width="100px;" alt="linxiang"/><br /><sub><b>linxiang</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=linxiang07" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://bollome.netlify.app/"><img src="https://avatars.githubusercontent.com/u/103836393?v=4?s=100" width="100px;" alt="程序员包子"/><br /><sub><b>程序员包子</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=coderbaozi" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/pe-3"><img src="https://avatars.githubusercontent.com/u/103579791?v=4?s=100" width="100px;" alt="peter G"/><br /><sub><b>peter G</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=pe-3" title="Code">💻</a> <a href="https://github.com/opentiny/tiny-vue/commits?author=pe-3" title="Documentation">📖</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/gimmyhehe"><img src="https://avatars.githubusercontent.com/u/26026184?v=4?s=100" width="100px;" alt="gimmyhehe"/><br /><sub><b>gimmyhehe</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=gimmyhehe" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/KevinAndrewDong"><img src="https://avatars.githubusercontent.com/u/20911103?v=4?s=100" width="100px;" alt="dong"/><br /><sub><b>dong</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=KevinAndrewDong" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="http://www.linglan01.cn"><img src="https://avatars.githubusercontent.com/u/58327088?v=4?s=100" width="100px;" alt="凌览"/><br /><sub><b>凌览</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=CatsAndMice" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Caesar-ch"><img src="https://avatars.githubusercontent.com/u/74941512?v=4?s=100" width="100px;" alt="Caesar-ch"/><br /><sub><b>Caesar-ch</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=Caesar-ch" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/chenqifeng66"><img src="https://avatars.githubusercontent.com/u/97503755?v=4?s=100" width="100px;" alt="chenqifeng66"/><br /><sub><b>chenqifeng66</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=chenqifeng66" title="Tests">⚠️</a></td>
</tr>
<tr>
<td align="center" valign="top" width="12.5%"><a href="https://zz-zzzz.github.io/"><img src="https://avatars.githubusercontent.com/u/48228016?v=4?s=100" width="100px;" alt="Zz-ZzzZ"/><br /><sub><b>Zz-ZzzZ</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=Zz-ZzzZ" title="Tests">⚠️</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/lyx-jay"><img src="https://avatars.githubusercontent.com/u/39766860?v=4?s=100" width="100px;" alt="Lyx"/><br /><sub><b>Lyx</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=lyx-jay" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/chenguang1994"><img src="https://avatars.githubusercontent.com/u/31501915?v=4?s=100" width="100px;" alt="Spark Bill"/><br /><sub><b>Spark Bill</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=chenguang1994" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Zuowendong"><img src="https://avatars.githubusercontent.com/u/45628596?v=4?s=100" width="100px;" alt="wendZzoo"/><br /><sub><b>wendZzoo</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=Zuowendong" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/gweesin"><img src="https://avatars.githubusercontent.com/u/42909374?v=4?s=100" width="100px;" alt="Gweesin Chan"/><br /><sub><b>Gweesin Chan</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=gweesin" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Binks123"><img src="https://avatars.githubusercontent.com/u/103343025?v=4?s=100" width="100px;" alt="Binks_"/><br /><sub><b>Binks_</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=Binks123" title="Documentation">📖</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/yoyo201626"><img src="https://avatars.githubusercontent.com/u/104079404?v=4?s=100" width="100px;" alt="yoyo"/><br /><sub><b>yoyo</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=yoyo201626" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://hexo.kifroom.icu/"><img src="https://avatars.githubusercontent.com/u/62132584?v=4?s=100" width="100px;" alt="Kif"/><br /><sub><b>Kif</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=wkif" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/jack-zishan"><img src="https://avatars.githubusercontent.com/u/67041206?v=4?s=100" width="100px;" alt="jack-zishan"/><br /><sub><b>jack-zishan</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=jack-zishan" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="http://gradii.com"><img src="https://avatars.githubusercontent.com/u/5467712?v=4?s=100" width="100px;" alt="LinboLen"/><br /><sub><b>LinboLen</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=LinboLen" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/vaebe"><img src="https://avatars.githubusercontent.com/u/52314078?v=4?s=100" width="100px;" alt="vaebe"/><br /><sub><b>vaebe</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=vaebe" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://allenli178.top"><img src="https://avatars.githubusercontent.com/u/53218750?v=4?s=100" width="100px;" alt="YuYan Li"/><br /><sub><b>YuYan Li</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=allenli178" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/shonen7"><img src="https://avatars.githubusercontent.com/u/145949377?v=4?s=100" width="100px;" alt="shonen7"/><br /><sub><b>shonen7</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=shonen7" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/xlearns"><img src="https://avatars.githubusercontent.com/u/62782792?v=4?s=100" width="100px;" alt="xlearns"/><br /><sub><b>xlearns</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=xlearns" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/ianxinnew"><img src="https://avatars.githubusercontent.com/u/146069396?v=4?s=100" width="100px;" alt="tianxin"/><br /><sub><b>tianxin</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=ianxinnew" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Xppp0217"><img src="https://avatars.githubusercontent.com/u/82315158?v=4?s=100" width="100px;" alt="Xppp0217"/><br /><sub><b>Xppp0217</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=Xppp0217" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/AcWrong02"><img src="https://avatars.githubusercontent.com/u/147061401?v=4?s=100" width="100px;" alt="AcWrong02"/><br /><sub><b>AcWrong02</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/issues?q=author%3AAcWrong02" title="Bug reports">🐛</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/betavs"><img src="https://avatars.githubusercontent.com/u/34408516?v=4?s=100" width="100px;" alt="betavs"/><br /><sub><b>betavs</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=betavs" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/fanbingbing16"><img src="https://avatars.githubusercontent.com/u/84823288?v=4?s=100" width="100px;" alt="fanbingbing16"/><br /><sub><b>fanbingbing16</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=fanbingbing16" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/dyh333"><img src="https://avatars.githubusercontent.com/u/1221313?v=4?s=100" width="100px;" alt="dyh333"/><br /><sub><b>dyh333</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=dyh333" title="Documentation">📖</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/betterdancing"><img src="https://avatars.githubusercontent.com/u/25901461?v=4?s=100" width="100px;" alt="betterdancing"/><br /><sub><b>betterdancing</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=betterdancing" title="Documentation">📖</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/David-TechNomad"><img src="https://avatars.githubusercontent.com/u/23149356?v=4?s=100" width="100px;" alt="David"/><br /><sub><b>David</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=David-TechNomad" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/falcon-jin"><img src="https://avatars.githubusercontent.com/u/48880836?v=4?s=100" width="100px;" alt="falcon-jin"/><br /><sub><b>falcon-jin</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=falcon-jin" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/wuyiping0628"><img src="https://avatars.githubusercontent.com/u/42107997?v=4?s=100" width="100px;" alt="wuyiping0628"/><br /><sub><b>wuyiping0628</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=wuyiping0628" title="Tests">⚠️</a></td>
</tr>
<tr>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/James-9696"><img src="https://avatars.githubusercontent.com/u/72028410?v=4?s=100" width="100px;" alt="James"/><br /><sub><b>James</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=James-9696" title="Documentation">📖</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://gitee.com/ichynul"><img src="https://avatars.githubusercontent.com/u/10061650?v=4?s=100" width="100px;" alt="ichynul"/><br /><sub><b>ichynul</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=ichynul" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Davont"><img src="https://avatars.githubusercontent.com/u/28757633?v=4?s=100" width="100px;" alt="Davont"/><br /><sub><b>Davont</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=Davont" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/wNing50"><img src="https://avatars.githubusercontent.com/u/38874640?v=4?s=100" width="100px;" alt="Nick Wu"/><br /><sub><b>Nick Wu</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=wNing50" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Floyd-bit"><img src="https://avatars.githubusercontent.com/u/59243597?v=4?s=100" width="100px;" alt="Floyd"/><br /><sub><b>Floyd</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=Floyd-bit" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Jevin0"><img src="https://avatars.githubusercontent.com/u/69580637?v=4?s=100" width="100px;" alt="Jevin"/><br /><sub><b>Jevin</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=Jevin0" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/HAOUEHF"><img src="https://avatars.githubusercontent.com/u/107133502?v=4?s=100" width="100px;" alt="星河"/><br /><sub><b>星河</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=HAOUEHF" title="Code">💻</a></td>
</tr>
</tbody>
</table>
<!-- markdownlint-restore -->
<!-- prettier-ignore-end -->
<!-- ALL-CONTRIBUTORS-LIST:END -->
## ❤️ Credits
Thanks to:
- The [element](https://github.com/ElemeFE/element) project which is an old component library based on Vue.js. TinyVue draws on Element at the beginning of its design, and is compatible with Element's component API.
- The [floating-ui](https://github.com/floating-ui/floating-ui) project which is a small library that helps you create "floating" elements such as tooltips, popovers, dropdowns, and more. Many components of TinyVue are based on the capabilities provided by Floating UI.
- The [vxe-table](https://github.com/x-extends/vxe-table) project which is a Vue-based table component, supports rich features, TinyVue's Grid component is based on vxe-table.
- The [sortablejs](https://github.com/SortableJS/Sortable) project which is a powerful drag-and-drop library. The drag-and-drop sorting function of TinyVue's Grid / Transfer / Tabs and other components is based on Sortable.
- [@adamwathan](https://github.com/adamwathan)'s article [Renderless Components in Vue.js](https://adamwathan.me/renderless-components-in-vuejs/), which inspired TinyVue's renderless component design architecture and ultimately enabled cross-end and cross-framework capabilities in the TinyVue project.
## License
[MIT](LICENSE)

180
README.zh-CN.md Normal file
View File

@ -0,0 +1,180 @@
<p align="center">
<a href="https://opentiny.design/tiny-vue" target="_blank" rel="noopener noreferrer">
<img alt="OpenTiny Logo" src="logo.svg" height="100" style="max-width:100%;">
</a>
</p>
<p align="center">一套跨端、跨框架的企业级 UI 组件库,支持 Vue 2 和 Vue 3支持 PC 端和移动端。</p>
[English](README.md) | 简体中文
🌈 特性:
- 📦 包含 104 个简洁、易用、功能强大的组件
- 🖖 一套代码同时支持 Vue 2 和 Vue 3
- 🖥️ 一套代码同时支持 PC 端和移动端
- 🌍 支持国际化
- 🎨 支持主题定制
- 📊 组件内部支持配置式开发,可支持低代码平台可视化组件配置
- 💡 采用模板、样式、逻辑分离的跨端、跨框架架构,保障灵活性和可移植性
## 🛠️ 如何使用
### 1. 安装
执行以下命令,安装 Vue 3 版本的 TinyVue 组件库:
```shell
npm i @opentiny/vue@3
```
执行以下命令,安装 Vue 2 版本的 TinyVue 组件库:
```shell
npm i @opentiny/vue@2
```
### 2. 引入和使用
在`App.vue`文件中使用 TinyVue 组件。
```html
<script lang="ts" setup>
import { Button as TinyButton } from '@opentiny/vue'
</script>
<template>
<tiny-button>TinyVue</tiny-button>
</template>
```
## 🖥️ 本地开发
```shell
git clone git@github.com:opentiny/tiny-vue.git
cd tiny-vue
pnpm i
# 启动 Vue3 项目
pnpm dev
# 启动 Vue2 项目
pnpm dev2
```
打开浏览器访问:[http://127.0.0.1:7130/](http://127.0.0.1:7130/)
## 🤝 参与贡献
如果你对我们的开源项目感兴趣,欢迎加入我们!🎉
参与贡献之前请先阅读[贡献指南](CONTRIBUTING.zh-CN.md)。
- 添加官方小助手微信 opentiny-official加入技术交流群
- 加入邮件列表 opentiny@googlegroups.com
## ✨ 贡献者
贡献者是在 OpenTiny 社区中合并了 1 个或多个 PR 的社区成员。
感谢以下 OpenTiny 的贡献者们 ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
<table>
<tbody>
<tr>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/kagol"><img src="https://avatars.githubusercontent.com/u/9566362?v=4?s=100" width="100px;" alt="Kagol"/><br /><sub><b>Kagol</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=kagol" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/zzcr"><img src="https://avatars.githubusercontent.com/u/18521562?v=4?s=100" width="100px;" alt="ajaxzheng"/><br /><sub><b>ajaxzheng</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=zzcr" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/TC-twwang"><img src="https://avatars.githubusercontent.com/u/42400776?v=4?s=100" width="100px;" alt="TC-twwang"/><br /><sub><b>TC-twwang</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=TC-twwang" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/MNZhu"><img src="https://avatars.githubusercontent.com/u/17588953?v=4?s=100" width="100px;" alt="jacknan"/><br /><sub><b>jacknan</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=MNZhu" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/awspi"><img src="https://avatars.githubusercontent.com/u/66438036?v=4?s=100" width="100px;" alt="Pithy"/><br /><sub><b>Pithy</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=awspi" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/heygsc"><img src="https://avatars.githubusercontent.com/u/103993866?v=4?s=100" width="100px;" alt="heygsc"/><br /><sub><b>heygsc</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=heygsc" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/wwttff"><img src="https://avatars.githubusercontent.com/u/32888622?v=4?s=100" width="100px;" alt="MangoWu"/><br /><sub><b>MangoWu</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=wwttff" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/ErKeLost"><img src="https://avatars.githubusercontent.com/u/66500121?v=4?s=100" width="100px;" alt="ADNY"/><br /><sub><b>ADNY</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=ErKeLost" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/chenxi-20"><img src="https://avatars.githubusercontent.com/u/76168465?v=4?s=100" width="100px;" alt="chenxi-20"/><br /><sub><b>chenxi-20</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=chenxi-20" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/rayhaoqin"><img src="https://avatars.githubusercontent.com/u/46983981?v=4?s=100" width="100px;" alt="Alaray"/><br /><sub><b>Alaray</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=rayhaoqin" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/yuanningning"><img src="https://avatars.githubusercontent.com/u/104059491?v=4?s=100" width="100px;" alt="ing"/><br /><sub><b>ing</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=yuanningning" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/shenjunjian"><img src="https://avatars.githubusercontent.com/u/6848520?v=4?s=100" width="100px;" alt="申君健"/><br /><sub><b>申君健</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=shenjunjian" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/MomoPoppy"><img src="https://avatars.githubusercontent.com/u/125256456?v=4?s=100" width="100px;" alt="MomoPoppy"/><br /><sub><b>MomoPoppy</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=MomoPoppy" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/WXC-Spring"><img src="https://avatars.githubusercontent.com/u/131581326?v=4?s=100" width="100px;" alt="WXC-Spring"/><br /><sub><b>WXC-Spring</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=WXC-Spring" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/GaoNeng-wWw"><img src="https://avatars.githubusercontent.com/u/31283122?v=4?s=100" width="100px;" alt="GaoNeng"/><br /><sub><b>GaoNeng</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=GaoNeng-wWw" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://acyza.github.io"><img src="https://avatars.githubusercontent.com/u/101238421?v=4?s=100" width="100px;" alt="acyza"/><br /><sub><b>acyza</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=acyza" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/ygj6"><img src="https://avatars.githubusercontent.com/u/7699524?v=4?s=100" width="100px;" alt="ygj6"/><br /><sub><b>ygj6</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=ygj6" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/MrWang2016"><img src="https://avatars.githubusercontent.com/u/24307164?v=4?s=100" width="100px;" alt="MrWang2016"/><br /><sub><b>MrWang2016</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=MrWang2016" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/qinwencheng"><img src="https://avatars.githubusercontent.com/u/24841685?v=4?s=100" width="100px;" alt="qinwencheng"/><br /><sub><b>qinwencheng</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=qinwencheng" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Huangyilin19"><img src="https://avatars.githubusercontent.com/u/48042709?v=4?s=100" width="100px;" alt="黄怡林"/><br /><sub><b>黄怡林</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=Huangyilin19" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/zuixinwang"><img src="https://avatars.githubusercontent.com/u/59717852?v=4?s=100" width="100px;" alt="zuixinwang"/><br /><sub><b>zuixinwang</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=zuixinwang" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/LadyChatterleyLover"><img src="https://avatars.githubusercontent.com/u/35223515?v=4?s=100" width="100px;" alt="luopei"/><br /><sub><b>luopei</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=LadyChatterleyLover" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://juejin.cn/user/1996368846785128"><img src="https://avatars.githubusercontent.com/u/31237954?v=4?s=100" width="100px;" alt="前端爆冲"/><br /><sub><b>前端爆冲</b></sub></a><br /><a href="#infra-brenner8023" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/xiejay97"><img src="https://avatars.githubusercontent.com/u/64340763?v=4?s=100" width="100px;" alt="Xie Jay"/><br /><sub><b>Xie Jay</b></sub></a><br /><a href="#infra-xiejay97" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
</tr>
<tr>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/linxiang07"><img src="https://avatars.githubusercontent.com/u/40119767?v=4?s=100" width="100px;" alt="linxiang"/><br /><sub><b>linxiang</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=linxiang07" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://bollome.netlify.app/"><img src="https://avatars.githubusercontent.com/u/103836393?v=4?s=100" width="100px;" alt="程序员包子"/><br /><sub><b>程序员包子</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=coderbaozi" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/pe-3"><img src="https://avatars.githubusercontent.com/u/103579791?v=4?s=100" width="100px;" alt="peter G"/><br /><sub><b>peter G</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=pe-3" title="Code">💻</a> <a href="https://github.com/opentiny/tiny-vue/commits?author=pe-3" title="Documentation">📖</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/gimmyhehe"><img src="https://avatars.githubusercontent.com/u/26026184?v=4?s=100" width="100px;" alt="gimmyhehe"/><br /><sub><b>gimmyhehe</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=gimmyhehe" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/KevinAndrewDong"><img src="https://avatars.githubusercontent.com/u/20911103?v=4?s=100" width="100px;" alt="dong"/><br /><sub><b>dong</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=KevinAndrewDong" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="http://www.linglan01.cn"><img src="https://avatars.githubusercontent.com/u/58327088?v=4?s=100" width="100px;" alt="凌览"/><br /><sub><b>凌览</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=CatsAndMice" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Caesar-ch"><img src="https://avatars.githubusercontent.com/u/74941512?v=4?s=100" width="100px;" alt="Caesar-ch"/><br /><sub><b>Caesar-ch</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=Caesar-ch" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/chenqifeng66"><img src="https://avatars.githubusercontent.com/u/97503755?v=4?s=100" width="100px;" alt="chenqifeng66"/><br /><sub><b>chenqifeng66</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=chenqifeng66" title="Tests">⚠️</a></td>
</tr>
<tr>
<td align="center" valign="top" width="12.5%"><a href="https://zz-zzzz.github.io/"><img src="https://avatars.githubusercontent.com/u/48228016?v=4?s=100" width="100px;" alt="Zz-ZzzZ"/><br /><sub><b>Zz-ZzzZ</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=Zz-ZzzZ" title="Tests">⚠️</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/lyx-jay"><img src="https://avatars.githubusercontent.com/u/39766860?v=4?s=100" width="100px;" alt="Lyx"/><br /><sub><b>Lyx</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=lyx-jay" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/chenguang1994"><img src="https://avatars.githubusercontent.com/u/31501915?v=4?s=100" width="100px;" alt="Spark Bill"/><br /><sub><b>Spark Bill</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=chenguang1994" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Zuowendong"><img src="https://avatars.githubusercontent.com/u/45628596?v=4?s=100" width="100px;" alt="wendZzoo"/><br /><sub><b>wendZzoo</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=Zuowendong" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/gweesin"><img src="https://avatars.githubusercontent.com/u/42909374?v=4?s=100" width="100px;" alt="Gweesin Chan"/><br /><sub><b>Gweesin Chan</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=gweesin" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Binks123"><img src="https://avatars.githubusercontent.com/u/103343025?v=4?s=100" width="100px;" alt="Binks_"/><br /><sub><b>Binks_</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=Binks123" title="Documentation">📖</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/yoyo201626"><img src="https://avatars.githubusercontent.com/u/104079404?v=4?s=100" width="100px;" alt="yoyo"/><br /><sub><b>yoyo</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=yoyo201626" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://hexo.kifroom.icu/"><img src="https://avatars.githubusercontent.com/u/62132584?v=4?s=100" width="100px;" alt="Kif"/><br /><sub><b>Kif</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=wkif" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/jack-zishan"><img src="https://avatars.githubusercontent.com/u/67041206?v=4?s=100" width="100px;" alt="jack-zishan"/><br /><sub><b>jack-zishan</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=jack-zishan" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="http://gradii.com"><img src="https://avatars.githubusercontent.com/u/5467712?v=4?s=100" width="100px;" alt="LinboLen"/><br /><sub><b>LinboLen</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=LinboLen" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/vaebe"><img src="https://avatars.githubusercontent.com/u/52314078?v=4?s=100" width="100px;" alt="vaebe"/><br /><sub><b>vaebe</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=vaebe" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://allenli178.top"><img src="https://avatars.githubusercontent.com/u/53218750?v=4?s=100" width="100px;" alt="YuYan Li"/><br /><sub><b>YuYan Li</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=allenli178" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/shonen7"><img src="https://avatars.githubusercontent.com/u/145949377?v=4?s=100" width="100px;" alt="shonen7"/><br /><sub><b>shonen7</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=shonen7" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/xlearns"><img src="https://avatars.githubusercontent.com/u/62782792?v=4?s=100" width="100px;" alt="xlearns"/><br /><sub><b>xlearns</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=xlearns" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/ianxinnew"><img src="https://avatars.githubusercontent.com/u/146069396?v=4?s=100" width="100px;" alt="tianxin"/><br /><sub><b>tianxin</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=ianxinnew" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Xppp0217"><img src="https://avatars.githubusercontent.com/u/82315158?v=4?s=100" width="100px;" alt="Xppp0217"/><br /><sub><b>Xppp0217</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=Xppp0217" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/AcWrong02"><img src="https://avatars.githubusercontent.com/u/147061401?v=4?s=100" width="100px;" alt="AcWrong02"/><br /><sub><b>AcWrong02</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/issues?q=author%3AAcWrong02" title="Bug reports">🐛</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/betavs"><img src="https://avatars.githubusercontent.com/u/34408516?v=4?s=100" width="100px;" alt="betavs"/><br /><sub><b>betavs</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=betavs" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/fanbingbing16"><img src="https://avatars.githubusercontent.com/u/84823288?v=4?s=100" width="100px;" alt="fanbingbing16"/><br /><sub><b>fanbingbing16</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=fanbingbing16" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/dyh333"><img src="https://avatars.githubusercontent.com/u/1221313?v=4?s=100" width="100px;" alt="dyh333"/><br /><sub><b>dyh333</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=dyh333" title="Documentation">📖</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/betterdancing"><img src="https://avatars.githubusercontent.com/u/25901461?v=4?s=100" width="100px;" alt="betterdancing"/><br /><sub><b>betterdancing</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=betterdancing" title="Documentation">📖</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/David-TechNomad"><img src="https://avatars.githubusercontent.com/u/23149356?v=4?s=100" width="100px;" alt="David"/><br /><sub><b>David</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=David-TechNomad" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/falcon-jin"><img src="https://avatars.githubusercontent.com/u/48880836?v=4?s=100" width="100px;" alt="falcon-jin"/><br /><sub><b>falcon-jin</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=falcon-jin" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/wuyiping0628"><img src="https://avatars.githubusercontent.com/u/42107997?v=4?s=100" width="100px;" alt="wuyiping0628"/><br /><sub><b>wuyiping0628</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=wuyiping0628" title="Tests">⚠️</a></td>
</tr>
<tr>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/James-9696"><img src="https://avatars.githubusercontent.com/u/72028410?v=4?s=100" width="100px;" alt="James"/><br /><sub><b>James</b></sub></a><br /><a href="https://github.com/opentiny/tiny-vue/commits?author=James-9696" title="Documentation">📖</a></td>
</tr>
</tbody>
</table>
<!-- markdownlint-restore -->
<!-- prettier-ignore-end -->
<!-- ALL-CONTRIBUTORS-LIST:END -->
## ❤️ Credits
感谢:
- [element](https://github.com/ElemeFE/element) 项目,它是一个老牌的基于 Vue.js 的组件库TinyVue 在设计之初借鉴了 Element并针对 Element 的组件 API 进行兼容。
- [floating-ui](https://github.com/floating-ui/floating-ui) 项目它是一个轻量级、无依赖、高性能的定位库TinyVue 的多个组件都是基于 Floating UI 提供的能力。
- [vxe-table](https://github.com/x-extends/vxe-table) 项目,它是一个基于 Vue 的表格组件支持丰富的功能TinyVue 的 Grid 组件基于 vxe-table。
- [sortablejs](https://github.com/SortableJS/Sortable) 项目它是一个功能强大的拖拽库TinyVue 的 Grid / Transfer / Tabs 等多个组件的拖拽排序功能都基于 Sortable。
- [@adamwathan](https://github.com/adamwathan) 写的文章[《Renderless Components in Vue.js》](https://adamwathan.me/renderless-components-in-vuejs/),这篇文章启发了 TinyVue 的无渲染组件设计架构,并最终在 TinyVue 项目中实现了跨端、跨框架能力。
## 开源协议
[MIT](LICENSE)

View File

@ -1,25 +0,0 @@
#!/bin/bash
if [ ! $version ];
then npm version 0.1.0-`date "+%Y%m%d%H%M%S"`;
else npm version $version;
fi
npm install
if [ ! $componentName ];
then
npm run build:vue$vueVersion
else
npm run buildfuxi:vue$vueVersion
fi
npm run releasefuxi$vueVersion
if [ $? -ne 0 ]
then
echo "[ERROR] build falid!"
exit 1
fi
echo '[INFO] build completed'

View File

@ -1,6 +0,0 @@
{
"rules": {
"no-empty": "off",
"no-console": "off"
}
}

View File

@ -1,54 +0,0 @@
/**
* 生成全量运行时入口文件
*/
const fs = require('fs-extra')
const endOfLine = require('os').EOL
const utils = require('./utils')
const runtimeUtils = require('./runtime-utils')
const version = utils.getTinyVersion()
const outputDir = 'packages'
const IMPORT_TEMPLATE = 'import {{name}} from "@opentiny/vue-{{package}}"'
const MAIN_TEMPLATE = `{{include}}
const version = '${version}'
export {
version,
{{components}}
}
`
const buildFullRuntime = (buildType) => {
const outputPath = utils.pathJoin('..', outputDir, buildType + '.js')
const includeTemplate = []
const componentsTemplate = []
const render = utils.renderTemplate()
let coreLibs = []
coreLibs = runtimeUtils.getFullRuntime(buildType === 'base' ? ['base', 'business'] : buildType)
coreLibs.forEach((name) => {
includeTemplate.push(
render(IMPORT_TEMPLATE, {
name,
package: utils.kebabCase({ str: name })
})
)
componentsTemplate.push(name)
})
const template = render(MAIN_TEMPLATE, {
include: includeTemplate.join(endOfLine),
components: componentsTemplate.join(',' + endOfLine)
})
const output = utils.prettierFormat({
str: template
})
fs.writeFileSync(outputPath, output)
utils.logGreen(`npm run build:entry done. [${outputDir}/${buildType}.js]`)
};
['core', 'base', 'chart'].forEach(buildFullRuntime)

View File

@ -1,144 +0,0 @@
/**
* 生成入口文件包括 pc.js / mobile.js / index.js
*/
const fs = require('fs-extra')
const endOfLine = require('os').EOL
const utils = require('./utils')
const moduleUtils = require('./module-utils')
const version = utils.getTinyVersion()
const outputDir = 'packages'
const fileNames = {
all: 'index.js',
pc: 'pc.js',
mobile: 'mobile.js'
}
const getMainTemplate = (mode) => {
const template = `{{include}}
import { $prefix } from '@opentiny/vue-common'
const components = [{{components}}]
export const install = (app, opts = {}) => {
const regex = new RegExp('^' + $prefix)
${
mode === 'all'
? ''
: `
if (typeof app.unmount === 'function') {
app.config.globalProperties.tiny_mode = { value: '${mode}' }
} else {
app.prototype.tiny_mode = { value: '${mode}' }
}
`
}
components.filter(component=> component.name !== 'TinyPicker').forEach((component) => {
let name = component.name
let alias = opts.alias || opts.prefix
if (typeof component.install !== 'function') { return }
if (name && alias) {
app.component(name.replace(regex, alias), component)
} else {
component.install(app)
}
})
}
const version = '${version}'
export {
version,
{{components}}
}
export default {
version,
{{components}},
install
}
`
return template
}
const forEachCompoents = ({ components, componentsTemplate, render, INSTALL_COMPONENT_TEMPLATE, includeTemplate, IMPORT_TEMPLATE }) => {
components.forEach((item) => {
let exportsComponents = ''
const childrenComponents = []
// 增加组件内部抛出子组件,针对父子组件不能拆分的情况
if (Array.isArray(item.exports) && item.exports.length > 0) {
item.exports.indexOf(item.name) === -1 && item.exports.push(item.name)
} else {
item.exports = [item.name]
}
item.exports.forEach((component) => {
if (component !== item.name) {
component = utils.capitalizeKebabCase(component)
childrenComponents.push(component)
}
componentsTemplate.push(
render(INSTALL_COMPONENT_TEMPLATE, {
name: component
})
)
})
if (childrenComponents.length) {
exportsComponents = `,{${childrenComponents.join(',')}}`
}
includeTemplate.push(
render(IMPORT_TEMPLATE, {
name: item.name,
exports: exportsComponents,
package: item.importName
})
)
})
}
const createEntry = (mode) => {
const OUTPUT_PATH = utils.pathJoin('..', outputDir, fileNames[mode])
const IMPORT_TEMPLATE = 'import {{name}} {{exports}} from "{{package}}"'
const INSTALL_COMPONENT_TEMPLATE = ' {{name}}'
const MAIN_TEMPLATE = getMainTemplate(mode)
const includeTemplate = []
const componentsTemplate = []
const render = utils.renderTemplate()
let components
if (mode === 'pc') {
components = moduleUtils.getPcComponents()
} else if (mode === 'mobile') {
components = moduleUtils.getMobileComponents()
} else {
components = moduleUtils.getComponents()
}
forEachCompoents({
components,
componentsTemplate,
render,
INSTALL_COMPONENT_TEMPLATE,
includeTemplate,
IMPORT_TEMPLATE
})
const template = render(MAIN_TEMPLATE, {
include: includeTemplate.join(endOfLine),
components: componentsTemplate.join(`,${endOfLine}`)
})
const output = utils.prettierFormat({
str: template
})
fs.writeFileSync(OUTPUT_PATH, output)
};
['all', 'pc', 'mobile'].forEach(createEntry)
utils.logGreen(`npm run build:entry done. [${outputDir}/index.js,${outputDir}/pc.js,${outputDir}/mobile.js]`)

View File

@ -1,92 +0,0 @@
const vue = require('rollup-plugin-vue')
const { babel } = require('@rollup/plugin-babel')
const commonjs = require('@rollup/plugin-commonjs')
const { nodeResolve } = require('@rollup/plugin-node-resolve')
const { pathJoin, logGreen, logRed } = require('./utils')
const rollup = require('rollup')
const svg = require('rollup-plugin-vue-inline-svg')
const fs = require('fs-extra')
const path = require('path')
const inputOptions = {
plugins: [
vue({
css: true
}),
svg({
svgoConfig: {
plugins: [{ removeDoctype: true }, { removeComments: true }, { removeViewBox: false }],
removeViewBox: false
}
}),
nodeResolve(),
babel({
exclude: /node_modules/,
configFile: false, // 必须为 false 不然会取根文件的 babel.config.js 配置,产生一堆 runtime 代码
babelrc: false,
babelHelpers: 'bundled',
plugins: ['@babel/plugin-proposal-export-default-from', '@babel/plugin-proposal-export-namespace-from'],
presets: ['@babel/preset-env'],
extensions: ['.js', '.vue']
}),
// 如果打包文件中包含 jsx 语法, commonjs 必须放置在 babel 配置下面,否则会报错 PLUGIN_ERROR
commonjs()
],
external: (deps) => /^@huawei[\\/]tiny-vue-common/.test(deps)
}
const outputOptions = {
format: 'es',
exports: 'named'
}
const build = (components) => {
components.forEach((component) => {
const inputs = { ...inputOptions }
inputs.input = pathJoin('..', 'packages', 'icon', component.path)
if (component.path === 'index.js') {
inputs.external = (deps) => !deps.includes('index.js')
} else {
inputs.external = (deps) => /^@huawei[\\/]tiny-vue-common/.test(deps)
}
rollup
.rollup(inputs)
.then((bundle) => {
const outs = { ...outputOptions }
outs.file = pathJoin('..', 'packages', 'icon', component.libPath)
bundle.write(outs)
logGreen(`${component.path} compile icon done`)
})
.catch((e) => {
logRed(e)
})
})
}
function createComponentMap(dir) {
const components = []
fs.readdirSync(dir).forEach((file) => {
if (['dist', 'runtime'].includes(file)) {
return
}
if (fs.statSync(path.join(dir, file)).isDirectory()) {
components.push({
path: `${file}/index.js`,
libPath: `dist/lib/${file}.js`
})
} else {
file.endsWith('.js') &&
components.push({
path: `${file}`,
libPath: `dist/lib/${file}`
})
}
})
return components
}
build(createComponentMap(pathJoin('..', 'packages', 'icon')))

View File

@ -1,115 +0,0 @@
const rollup = require('rollup')
const utils = require('./utils')
const replace = require('@rollup/plugin-replace')
const moduleUtils = require('./module-utils')
const fs = require('fs-extra')
const isSingle = process.env.BUILD_TARGET === 'single'
const config = require('./config')
const outputOptions = {
format: 'es',
globals: config.globals,
exports: 'named'
}
const inputOptions = {
plugins: config.plugins,
external: config.external
}
const replaceConstant = {
'process.env.BUILD_TARGET': JSON.stringify(process.env.BUILD_TARGET),
'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV)
}
if (process.env.TINY_MODE === 'pc') {
outputOptions.format = 'umd'
replaceConstant['process.env.TINY_MODE'] = JSON.stringify(process.env.TINY_MODE)
}
/**
* 编译单个组件
* @param {Object} component 组件 module 信息 modules.json
* @param {Function} 回调函数
*/
const build = ({ component, callback }) => {
inputOptions.input = utils.pathJoin('..', component.path)
inputOptions.plugins.push(replace(replaceConstant))
rollup
.rollup(inputOptions)
.then((bundle) => {
outputOptions.file = utils.pathJoin('..', component.libPath)
if (outputOptions.format === 'umd') {
outputOptions.name = component.global
}
bundle.write(outputOptions).finally(() => {
const filePath = utils.pathJoin('..', component.libPath)
if (filePath.endsWith('index.js')) {
const indexStr = fs.readFileSync(filePath).toString('UTF-8')
const resStr = indexStr.replace('./src/pc', './pc').replace('./src/mobile', './mobile')
fs.writeFileSync(filePath, resStr)
}
callback()
})
})
.catch((e) => {
utils.logRed(e)
callback()
})
}
let components = []
/**
* 递归执行 Rollup 编译
* @param {Number} count 起始索引
*/
const buildAll = (count = 0) => {
let component = components[count++]
if (component) {
if (!isSingle) {
component.libPath = 'dist/' + component.libName.replace('@opentiny/vue/', '')
component.libPath += (component.type === 'component' ? '/index' : '') + '.js'
}
build({
component,
callback() {
buildAll(count)
}
})
} else {
utils.logGreen(`npm run build:ui${isSingle ? '-single' : ''} done.`)
}
}
if (isSingle) {
const inputName = utils.getInputCmd()
if (inputName.length > 0) {
inputName.forEach((input) => {
const activeComponentName = utils.kebabCase({ str: input })
if (activeComponentName) {
components.push(
...moduleUtils.getByName({
name: activeComponentName,
isSort: false
})
)
}
})
} else {
const activeComponentName = utils.getComponentName()
components = moduleUtils.getByName({
name: activeComponentName,
isSort: false
})
}
} else {
components = moduleUtils.getAllModules(false)
}
if (components.length > 0) {
buildAll()
} else {
utils.logYellow('please enter the component name after command.')
}

View File

@ -1,123 +0,0 @@
/**
* 批量更新组件版本号一般用于大版本发布
* npm run build:version ${targetVersion} ${tag} ${single-components}|null[build all pkg]
* example:
* 发布 @opentiny/vue-alert@next @opentiny/vue-button@next 命令:
* npm run build:version '0.1.0' 'next' 'alert button'
* 发布全量包@next:
* npm run build:version '0.1.0' 'next'
*/
const fs = require('fs-extra')
const path = require('path')
const ROOT_PATH = path.join(__dirname, '..')
const TYPE = process.env.TYPE
const isFullVersionUpdate = true
const TAG = process.argv[3] === 'false' ? '' : process.argv[3]
const packages = path.join(ROOT_PATH, 'packages')
const pkgJsonFileName = 'package.json'
const { logGreen } = require('./utils')
const tinyVueReg = /@huawei\//
const targetVersion = process.argv[2] || JSON.parse(fs.readFileSync(path.join(ROOT_PATH, pkgJsonFileName)).toString()).version
const isUpdateDependenciesVersion = true // process.argv[3] === 'true'
const single = process.argv[4]
const targetVersionArr = targetVersion.split('.')
const oldVersion = `${targetVersionArr[0]}.${targetVersionArr[1] - 1}.0`
const targetVersionDependencies = `${targetVersionArr[0]}.${targetVersionArr[1]}.0`
const isTinyVuePkg = (str) => tinyVueReg.test(str || '')
const replaceDependenciesForTag = (obj) => {
for (let key in obj) {
if (isTinyVuePkg(key)) {
obj[key] = TAG
}
}
return obj
}
const replaceDependencies = (obj) => {
for (let key in obj) {
if (isTinyVuePkg(key) && /~/.test(obj[key])) {
obj[key] = obj[key].replace(isUpdateDependenciesVersion ? /[0-9]+\.[0-9]+\.[0-9]+/ : oldVersion, targetVersionDependencies)
}
}
return obj
}
const buidPackages = (dirs) => {
let uiArr
if (single) {
uiArr = single.trim().split(' ')
}
fs.readdirSync(dirs).forEach((name) => {
if (uiArr && !uiArr.includes(name)) {
return
}
const component = path.join(dirs, name)
if (name === 'src' || !fs.statSync(component).isDirectory()) {
return
}
let pkgJsonFile, pkgJson
try {
pkgJsonFile = path.join(component, pkgJsonFileName)
pkgJson = JSON.parse(fs.readFileSync(pkgJsonFile).toString())
} catch (error) {
return
}
if (isTinyVuePkg(pkgJson.name)) {
const arr = ['dependencies', 'devDependencies']
pkgJson.version = single || isFullVersionUpdate ? targetVersion : targetVersionDependencies
arr.forEach((key) => {
if (pkgJson[key]) {
pkgJson[key] = TAG ? replaceDependenciesForTag(pkgJson[key]) : replaceDependencies(pkgJson[key])
}
})
fs.writeFileSync(pkgJsonFile, JSON.stringify(pkgJson, null, 2))
}
if (name === 'chart') {
buidPackages(component)
}
})
}
if (!targetVersion) {
throw new Error('targetVersion is null, cmd example:\n npm run build:version 3.10.0 true "alert grid"')
}
const buildCommon = () => {
const pkgJsonFile = path.join(ROOT_PATH, pkgJsonFileName)
const pkgJson = JSON.parse(fs.readFileSync(pkgJsonFile).toString())
pkgJson.version = targetVersion
pkgJson.uiVersion = isFullVersionUpdate ? targetVersion : targetVersionDependencies
pkgJson.srcVersion = isFullVersionUpdate ? targetVersion : targetVersionDependencies
fs.writeFileSync(pkgJsonFile, JSON.stringify(pkgJson, null, 2))
logGreen('update src version done')
}
const build = () => {
buildCommon()
if (TYPE === 'ui') {
buidPackages(packages)
logGreen('update all component version done')
}
}
build()

View File

@ -1,99 +0,0 @@
const fs = require('fs-extra')
const vue = require('rollup-plugin-vue')
const { babel } = require('@rollup/plugin-babel')
const alias = require('@rollup/plugin-alias')
const commonjs = require('@rollup/plugin-commonjs')
const postcss = require('rollup-plugin-postcss')
const { nodeResolve } = require('@rollup/plugin-node-resolve')
const { pathJoin } = require('./utils')
const { getAllModules } = require('./module-utils')
const external = [
'vue',
'quill',
'./pc',
'echarts',
'echarts-amap',
'./mobile',
'@vue/composition-api',
'echarts-liquidfill',
'echarts-wordcloud',
'@opentiny/vue-common',
'@opentiny/vue-locale',
'@opentiny/vue-renderless'
]
const globals = {
vue: 'Vue',
'echarts-amap': 'echarts.amap',
'echarts-liquidfill': 'echarts-liquidfill',
'echarts-wordcloud': 'echarts-wordcloud',
'@vue/composition-api': 'vueCompositionApi',
'@opentiny/vue-common': 'TinyVueCommon',
'@opentiny/vue-locale': 'TinyVueLocale',
'@opentiny/vue-renderless': 'TinyRenderLess'
}
const aliasList = {}
const components = getAllModules(false)
components.forEach((item) => {
aliasList[item.libName] = pathJoin('../' + item.path)
if (item.private) {
return
}
const isComponent = item.type === 'component'
external.push(item.importName) // @opentiny/vue-todo
external.push(item.libName) // @opentiny/vue/todo
globals[item.libName] = item.global // TinyTodo
if (isComponent) {
if (fs.existsSync(pathJoin('../../tiny-vue-theme'))) {
aliasList[`@opentiny/vue-theme/${item.LowerName}/index.css`] = pathJoin(`../../tiny-vue-theme/src/${item.LowerName}/index.css`)
aliasList[`@opentiny/vue-theme/${item.LowerName}/index.js`] = pathJoin(`../../tiny-vue-theme/src/${item.LowerName}/index.js`)
}
external.push(item.libName + '/index.js')
} else {
external.push(item.libName + '.js')
}
})
exports.aliasList = aliasList
exports.external = (deps) =>
external.includes(deps) || /^@huawei[\\/](tiny-vue-renderless|tiny-vue-theme|tiny-vue-common|tiny-vue-icon)|echarts|cropperjs|quill/.test(deps)
exports.globals = globals
exports.plugins = [
alias({
resolve: ['.js', '.vue', '.css'],
'@opentiny/vue-locale': pathJoin('../packages/locale/index'),
'@opentiny/vue-common': pathJoin('../packages/common/index'),
...aliasList
}),
postcss({
extract: false
}),
vue({
css: true
}),
nodeResolve({
extensions: ['.js', '.jsx', '.vue', '.css']
}),
babel({
exclude: /node_modules/,
babelrc: false,
configFile: false, // 必须为 false 不然会取根文件的 babel.config.js 配置,产生一堆 runtime 代码
babelHelpers: 'bundled',
comments: false,
extensions: ['.js', '.vue', '.jsx'],
presets: ['@babel/preset-env', '@vue/babel-preset-jsx'],
plugins: ['@babel/plugin-syntax-dynamic-import']
}),
// 如果打包文件中包含 jsx 语法, commonjs 必须放置在 babel 配置下面,否则会报错 PLUGIN_ERROR
commonjs()
]

View File

@ -1,68 +0,0 @@
const { sep } = require('path')
const utils = require('./utils')
const { addModule, writeModuleMap, quickSort, readModuleMap } = require('./module-utils')
const isDeepFn = (file, dirs, subPath) =>
// 如果底层文件夹内没有找到 vue 文件,找到 src//index.js 文件也被认可为组件
(file.endsWith('.vue') && (dirs.includes('index.js') || dirs.includes('index.vue'))) || ~subPath.indexOf(['src', 'index.js'].join(sep))
const getTemplateName = (currentPaths) => currentPaths.slice(2).map(utils.capitalize).join('/').split('.')[0].replace('/', '')
/**
* 扫描指定目录下面的组件目录查找非 index.vue 文件模板生成 modules.json 中的对象
*/
const makeModules = () => {
const templates = {}
const oldModules = readModuleMap()
const packagesStr = 'packages'
utils.walkFileTree({
isDeep: true,
dirPath: utils.pathJoin('..', packagesStr),
fileFilter({ file }) {
return !/node_modules|helper|common|assets/.test(file)
},
callback({ file, subPath, dirs }) {
const isDeep = isDeepFn(file, dirs, subPath)
// NEXT: 针对 option 的模板做特殊处理
if (isDeep && ['template.vue'].indexOf(file) === -1) {
const isEntry = file.startsWith('index')
const subPaths = subPath.split(sep)
const currentPaths = subPaths.slice(subPaths.indexOf(packagesStr) + 1)
const templateName = getTemplateName(currentPaths)
const templatePath = currentPaths[currentPaths.length - 1].split('.')[0]
const componentName = []
currentPaths.every((dirName) => {
if (dirName === 'src') {
return false
}
componentName.push(dirName)
return true
})
const globalName = componentName[componentName.length - 1].split('-').map(utils.capitalize).join('')
const moduleName = globalName + (isEntry ? '' : templateName)
const oldModuleItem = oldModules[moduleName] || {}
const oldKeys = Object.keys(oldModuleItem)
const newModuleItem = addModule({
componentName: componentName.join('/'),
templateName: templatePath
})
oldKeys.forEach((key) => {
if (typeof newModuleItem[key] === 'undefined' || key === 'onlyMode') {
newModuleItem[key] = oldModuleItem[key]
}
})
newModuleItem.exclude = oldModuleItem.exclude || false
templates[moduleName] = newModuleItem
}
}
})
writeModuleMap(quickSort({ sortData: templates, returnType: 'object' }))
}
try {
makeModules()
utils.logGreen('npm run create:mapping done.')
} catch (e) {
utils.logRed('npm run create:mapping failed.', e)
}

View File

@ -1,229 +0,0 @@
/**
* yarn create:ui 新建组件支持格式如下
* yarn create:ui img-preview
* yarn create:ui img-preview -single 输出纯净模板没有 pc 等模板/单层组件
* yarn create:ui img-preview -mobile 创建纯移动组件
*/
const path = require('path')
const fs = require('fs-extra')
const semver = require('semver')
const utils = require('./utils')
const { createModuleMapping } = require('./module-utils')
const args = utils.getInputCmd()
const getTemplate = (upperComponentName) => `<template>
<div>
<tiny-[[NAME]] _mode="mobile"></tiny-[[NAME]]>
</div>
</template>
<script>
import { [[UNAME]] } from '@opentiny/vue'
export default {
name: '[[UNAME]]',
components: {
Tiny${upperComponentName}:${upperComponentName}
}
}
</script>`
const getDcoTemplate = () => `<div class="demo-header">
<p class="overviewicon">
<span class="wapi-ui-[[NAME]]"/>
</p>
## [[UNAME]]
<mobile-uxlink widget-name="[[UNAME]]"></mobile-uxlink>
</div>
### [[UNAME]]
<mobile-view link="[[NAME]]/base"></mobile-view>`
const getTemp = (componentName) => `const router = [
{
path: '${componentName}',
meta: {
title: 'test',
lang: 'zh-CN',
sign: 'component'
},
component: () =>
import(
/* webpackChunkName: 'v3-${componentName}' */ './docs/mobile/${componentName}/base.md'
)
},`
const doWorkTreeFn = ({ templateDir, componentPath, componetDir, componentName, isSingle, render, version, isMobile }) => {
utils.walkFileTree({
isDeep: true,
dirPath: templateDir,
callback({ file, subPath }) {
let fileName = file
const isSingleTemplate = file === 'single.vue'
const isSrcDir = path.basename(path.dirname(subPath)) === 'src'
componentPath = path.join(componetDir, componentName)
// 单层组件处理逻辑
if (isSrcDir) {
componentPath = path.join(componentPath, 'src')
if (isSingle) {
if (!isSingleTemplate) {
return
}
fileName = 'index.vue'
} else {
if (isSingleTemplate) {
return
}
}
}
if (!fs.existsSync(componentPath)) {
fs.mkdirSync(componentPath)
}
componentPath = path.join(componentPath, fileName)
let fileContent = fs.readFileSync(subPath, { encoding: 'utf8' })
const upperComponentName = utils.capitalizeKebabCase(componentName)
// 编译模板
fileContent = render(fileContent, {
NAME: componentName,
UNAME: upperComponentName,
MINOR: semver.minor(version),
SUFFIX: isSingle ? '.vue' : '',
THEME: isMobile ? 'theme-mobile' : 'theme'
})
fs.writeFileSync(componentPath, fileContent)
}
})
}
const createRouter = (json, componentName, navPath, router) => {
const Navs = JSON.parse(json)
Navs.component.push({
name: 'New Component',
children: [
{
path: `/${componentName}`,
name: `${componentName}`
}
]
})
fs.writeFileSync(path.join(navPath, 'nav.config.comp.mobile.json'), JSON.stringify(Navs, null, 2), { encoding: 'utf-8' })
fs.writeFileSync(path.join(navPath, 'route.config.comp.mobile.js'), router, {
encoding: 'utf8'
})
}
if (args.length > 0) {
const commands = []
const components = []
const render = utils.renderTemplate({ leftChar: '[[', rightChar: ']]' })
const templateDir = utils.pathJoin('..', 'template', 'component')
const componetDir = utils.pathJoin('..', 'packages')
const demoDir = utils.pathJoin('..', 'example', 'src', 'demo', 'mobile')
const docDir = utils.pathJoin('..', 'example', 'src', 'docs', 'mobile')
const { version } = fs.readJSONSync(utils.pathJoin('..', 'package.json'))
const navPath = utils.pathJoin('..', 'example', 'src')
args.forEach((item) => {
if (item.indexOf('-') === 0) {
commands.push(item.replace(/-/g, '').toLowerCase())
} else {
components.push(item)
}
})
const isSingle = commands.includes('single')
const isMobile = commands.includes('mobile')
const createDemo = (filePath, componentName, fileName, template) => {
if (!fs.existsSync(filePath)) {
fs.mkdirSync(filePath)
}
const upperComponentName = utils.capitalizeKebabCase(componentName)
// 生成测试demo
filePath = path.join(filePath, fileName)
const outString = render(template, {
NAME: componentName,
UNAME: upperComponentName
})
const outputDemo = require('prettier').format(outString, {
printWidth: 160,
jsxBracketSameLine: false,
tabWidth: 2,
useTabs: false,
singleQuote: true,
semi: false,
trailingComma: 'none',
bracketSpacing: true,
parser: 'vue'
})
fs.writeFileSync(filePath, outputDemo)
}
components.forEach((componentName) => {
let componentPath = path.join(componetDir, componentName)
let demoPath = path.join(demoDir, componentName)
let docPath = path.join(docDir, componentName)
const upperComponentName = utils.capitalizeKebabCase(componentName)
if (fs.existsSync(componentPath)) {
utils.logYellow(`The component name : ${componentName} is exist , please enter other name.`)
return
}
const json = fs.readFileSync(path.join(navPath, 'nav.config.comp.mobile.json'), { encoding: 'utf8' })
let router = fs.readFileSync(path.join(navPath, 'route.config.comp.mobile.js'), { encoding: 'utf8' })
const templ = getTemp(componentName)
router = router.replace('const router = [', templ)
createRouter(json, componentName, navPath, router)
doWorkTreeFn({
templateDir,
componentPath,
componetDir,
componentName,
isSingle,
render,
version,
isMobile
})
// 生成测试demo
const template = getTemplate(upperComponentName)
createDemo(demoPath, componentName, 'base.vue', template)
// 生成doc
const dcoTemplate = getDcoTemplate()
createDemo(docPath, componentName, 'base.md', dcoTemplate)
componentName && createModuleMapping(componentName, componentPath, isMobile)
})
utils.logYellow('npm run create:ui done.')
} else {
utils.logYellow('please enter the component name after command.')
}

View File

@ -1,403 +0,0 @@
/**
* 专门用于 modules.json 配置的通用方法
* modules.json 作为单组件的清单列表记录组件类型路径是否排除引用仅支持某种[pc/mobile]模式等
*/
const { writeFileSync } = require('fs')
const moduleMap = require('../modules.json')
const { kebabCase, pathJoin, capitalize, prettierFormat, logGreen, capitalizeKebabCase } = require('./utils')
const realNameMap = {
realValue: '__real_value'
}
/**
* 默认的组件模板
*/
const defaultMode = ['index', 'pc']
/**
* 组件组包名前缀@opentiny/vue-tag | @opentiny/vue/tag
*/
const importName = '@opentiny/vue'
const exampleBase = 'basic-usage.vue'
/**
* 查询没有模板的组件单层组件
*/
const getNoTemplateComponents = () => {
const components = []
const templates = ['Pc', 'Mobile']
Object.keys(moduleMap).forEach((key) => {
if (!key.endsWith(templates[0]) && !key.endsWith(templates[1]) && !key.startsWith('Chart')) {
if (!moduleMap[key + templates[0]] && !moduleMap[key + templates[1]]) {
components.push(moduleMap[key])
}
}
})
return components
}
/**
* 判断是否为 PC 组件
*/
const isPcComponent = (name) => {
const componentName = capitalizeKebabCase(name)
const moduleInfo = moduleMap[componentName]
return moduleInfo && moduleInfo.onlyMode !== 'mobile'
}
/**
* 判断是否为 Mobile 组件
*/
const isMobileComponent = (name) => {
const componentName = capitalizeKebabCase(name)
const moduleInfo = moduleMap[componentName]
return moduleInfo && moduleInfo.onlyMode === 'mobile'
}
const setIndex = (obj, key, maxNumberLength, indexArr) => {
// 一个字母用3位数代替没有达到3位用0填充到前面为了减少差值在前面设置1
const priority =
'1' +
obj[key]
.split('')
.map((chart) => String(chart.charCodeAt()).padStart(3, '0'))
.join('')
.padEnd(maxNumberLength, '0')
.substr(0, maxNumberLength)
// 分段比较 javascript 超过15位比较失效
obj.priority1 = Number(priority.substr(0, 15))
obj.priority2 = Number(priority.substr(15, 30))
obj.priority3 = Number(priority.substr(30, 45))
obj.priority4 = Number(priority.substr(45, maxNumberLength))
obj.priority = priority
indexArr.push(obj)
}
const arrayToObject = (arr, key) => {
const sortObj = {}
for (let i = 0, len = arr.length; i < len; i++) {
if (arr[i][realNameMap.realValue]) {
sortObj[arr[i][key]] = arr[i][realNameMap.realValue]
} else {
delete arr[i].priority
delete arr[i].priority1
delete arr[i].priority2
delete arr[i].priority3
delete arr[i].priority4
sortObj[arr[i][key]] = arr[i]
delete sortObj[arr[i][key]][key]
}
}
return sortObj
}
const sortArray = (arr) => {
if (Array.isArray(arr) && arr.length > 1) {
const middleIndex = Math.floor(arr.length / 2)
const middleValue = arr.splice(middleIndex, 1)[0]
const leftArr = []
const rightArr = []
for (let i = 0, len = arr.length; i < len; i++) {
const left = arr[i].priority1 - middleValue.priority1
const right = arr[i].priority2 - middleValue.priority2
const right2 = arr[i].priority3 - middleValue.priority3
const right3 = arr[i].priority4 - middleValue.priority4
let isLeft = false
if (left === 0 && (right < 0 || (right === 0 && right2 < 0) || (right === 0 && right2 === 0 && right3 < 0))) {
isLeft = true
}
if (left < 0 || isLeft) {
leftArr.push(arr[i])
} else {
rightArr.push(arr[i])
}
}
return sortArray(leftArr).concat([middleValue], sortArray(rightArr))
} else {
return arr
}
}
/**
* 将模块数组按字母的 ASCII 值进行排序目前只支持16位字母排序
* @private
* @param {Array|Object} sortData 模块数组
* @param {String} key 排序字段
* @param {String} returnType 返回类型 Array|Object
* @returns 排序后的数组或对象
*/
const quickSort = ({ sortData, key = 'name', returnType = 'array' }) => {
const maxNumberLength = 59
let indexArr = []
if (sortData instanceof Array) {
sortData.forEach((item) => {
setIndex(item, key, maxNumberLength, indexArr)
})
} else if (typeof sortData === 'object') {
for (const sortKey in sortData) {
if (Object.prototype.hasOwnProperty.call(sortData, sortKey)) {
const dataItem = sortData[sortKey]
let sortItem = {}
if (typeof dataItem === 'object') {
sortItem = {
...sortData[sortKey]
}
} else {
sortItem[realNameMap.realValue] = dataItem
}
sortItem[key] = sortData[key] || sortKey
setIndex(sortItem, key, maxNumberLength, indexArr)
}
}
} else {
return sortData
}
return returnType === 'array' ? sortArray(indexArr) : arrayToObject(sortArray(indexArr), key)
}
/**
* 根据指定条件搜索模块列表并排序与生成必要字段
* @private
* @param {Function} filterIntercept 搜索条件
* @param {Boolean} isSort 是否需要排序
*/
const getSortModules = ({ filterIntercept, isSort = true }) => {
let modules = []
let componentCount = 0
if (typeof filterIntercept === 'function') {
Object.keys(moduleMap).forEach((key) => {
const component = moduleMap[key]
component.name = key
if (filterIntercept(component) === true && component.exclude !== true) {
const dirs = component.path.split('/')
const componentName = dirs.slice(1, dirs.indexOf('src'))
component.UpperName = componentName.pop().split('-').map(capitalize).join('')
component.LowerName = kebabCase({ str: component.UpperName })
// 工程的父文件夹
component.parentDir = componentName
// libPath: 'packages/todo/dist/pc.js' 组件输出路径
component.libPath = component.path.replace('/index.js', '/src/index.js').replace('/src/', '/dist/lib/').replace('.vue', '.js')
// libName: '@huawei/vue/todo/pc'
component.libName = component.libPath
.replace('packages/', '')
.replace('/index', '')
.replace('.js', '')
.replace('/dist/', '/')
.replace(/\/lib$/, '')
// 处理子目录
if (componentName.length) {
component.libName = component.libName.replace(componentName.join('/'), '').replace(/^\//, '')
}
// importName: '@opentiny/vue-tag/pc'
component.importName = importName + '-' + component.libName
// libName: '@opentiny/vue/todo/pc'
component.libName = importName + '/' + component.libName
// tmpName: 'pc'
component.tmpName = component.libPath.replace('.js', '').split('/').slice(-1)[0]
// global: 'TinyTodoPc'
component.global = 'Tiny' + key
modules.push(component)
}
component.type === 'component' && componentCount++
})
logGreen(`[Contain Components]: Total(${componentCount}) `)
} else {
modules = moduleMap
}
return isSort ? quickSort({ sortData: modules }) : modules
}
/**
* 获取所有模块并排序格式化
* @param {Boolean} isSort 是否需要排序
* @returns 模块对象
*/
const getAllModules = (isSort) => getSortModules({ filterIntercept: () => true, isSort })
/**
* 获取所有组件并排序格式化
* @param {Boolean} isSort 是否需要排序
* @returns 组件对象
*/
const getComponents = (isSort) =>
getSortModules({
filterIntercept: (item) => !['template'].includes(item.type),
isSort
})
/**
* @param {String} key 根据模块对象的 Key 获取对应的值
* @returns 模块对象
*/
const getModuleInfo = (key) => moduleMap[key] || {}
/**
* 将输入的 Map 写入到 modules.json 文件中并格式化
* @param {String|Object} moduleMap 模块 Json 对象集合或 Json 字符串
*/
const writeModuleMap = (moduleMap) => {
writeFileSync(
pathJoin('..', 'modules.json'),
prettierFormat({
str: typeof componentMap === 'string' ? moduleMap : JSON.stringify(moduleMap),
options: {
parser: 'json',
printWidth: 10
}
})
)
}
/**
* 读取 modules.json 中的模块信息
* @returns 模块对象
*/
const readModuleMap = () => moduleMap || {}
/**
* 获取模块项的模块
* @param {String} componentName 组件名称大写例如ImgPreview
* @param {String} templateName 模板名称/路径
* @param {Oject} newObj 新增对象
* @returns 模块对象
*/
const addModule = ({ componentName, templateName, newObj = {} }) => {
const isEntry = templateName.endsWith('index')
return {
path: `packages/${componentName}/` + (isEntry ? `${templateName}.js` : `src/${templateName}.vue`),
type: isEntry ? 'component' : 'template',
exclude: false,
...newObj
}
}
/**
* 根据指定条件搜索原始模块列表
* @private
* @param {Function} filterIntercept 搜索条件
*/
const getModules = (filterIntercept) => {
let modules = {}
if (typeof filterIntercept === 'function') {
for (const key in moduleMap) {
if (Object.prototype.hasOwnProperty.call(moduleMap, key)) {
const component = moduleMap[key]
if (filterIntercept(component) === true && component.exclude !== true) {
modules[key] = component
}
}
}
} else {
modules = moduleMap
}
return modules
}
/**
* 根据组件名称查找模块列表
* @private
* @param {String} name 组件名称
* @param {Boolean} inversion 是否取反
* @param {Boolean} isOriginal 是否取原始数据
* @param {Boolean} isSort 是否需要排序
*/
const getByName = ({ name, inversion = false, isOriginal = false, isSort = true }) => {
const callback = (item) => (inversion ? item.path.indexOf(`/${name}/`) === -1 : item.path.indexOf(`/${name}/`) > -1)
return isOriginal ? getModules(callback) : getSortModules({ filterIntercept: callback, isSort })
}
const getMobileComponents = () => {
const modules = getAllModules()
const componentNames = modules.filter((item) => item.tmpName === 'mobile').map((item) => item.UpperName)
const components = modules.filter(
(item) => item.onlyMode === 'mobile' || item.onlyMode === 'all' || (item.type === 'component' && componentNames.includes(item.UpperName))
)
return components
}
const getPcComponents = () => {
const modules = getAllModules()
const components = modules.filter((item) => item.type === 'component' && item.onlyMode !== 'mobile')
return components
}
const getOnlyMobileComponents = () => getAllModules().filter((item) => item.onlyMode === 'mobile')
/**
* 动态创建 modules.json 适配新建组件
* @param {String} componentName 组件名称 驼峰大写img-preview
* @param {Boolean} isMobile 是否为移动组件
*/
const createModuleMapping = (componentName, templateName, isMobile = false) => {
const upperName = capitalizeKebabCase(componentName)
// 生成 modules.json 文件
moduleMap[upperName] = addModule({
isMobile,
templateName,
componentName
})
const moduleJson = quickSort({ sortData: moduleMap, returnType: 'object' })
writeFileSync(
pathJoin('..', 'modules.json'),
prettierFormat({
str: JSON.stringify(moduleJson),
options: {
parser: 'json',
printWidth: 10
}
})
)
}
module.exports = {
quickSort,
getByName,
addModule,
importName,
exampleBase,
defaultMode,
createModuleMapping,
isPcComponent,
getAllModules,
getComponents,
getModuleInfo,
readModuleMap,
writeModuleMap,
getPcComponents,
isMobileComponent,
getMobileComponents,
getOnlyMobileComponents,
getNoTemplateComponents
}

View File

@ -1,202 +0,0 @@
/**
* 用于发布单组件包
*/
const fs = require('fs-extra')
const path = require('path')
const { execSync } = require('child_process')
const utils = require('../build/utils')
const { logGreen } = require('../build/utils')
const sourcePkg = 'packages'
const packages = 'dist'
const tgzs = 'tgzs'
const packageName = 'package.json'
const NPM_TAG = process.env.NPM_TAG || '~0.1.0'
const VERSION_TAG = process.env.VERSION_TAG || '0.1.0'
const NPM_WAREHOUSE = process.env.NPM_WAREHOUSE
const targetVersion = utils.getTinyVersion('themeVersion')
const targetVersionArr = targetVersion.split('.')
const themeVersionDependencies = `~${targetVersionArr[0]}.${targetVersionArr[1]}.0`
const typings = 'typings'
const packPackages = (p, packagePath) => {
execSync('npm pack -q', { cwd: path.join(packages, p) })
fs.readdirSync(path.join(packages, p)).forEach((item) => {
if (item.endsWith('.tgz')) {
const tgzPath = path.join(packages, p, item)
fs.moveSync(tgzPath, path.join(tgzs, item), { overwrite: true })
fs.unlinkSync(packagePath)
}
})
}
// 处理每个组件包的package.json文件
const dealPackage = (p, packageJSON) => {
const packageDeps = packageJSON.dependencies || []
Object.keys(packageDeps).forEach((key) => {
if (key.includes('@opentiny/vue')) {
packageDeps[key] = NPM_TAG
}
})
let dependencies = {
'@opentiny/vue-renderless': themeVersionDependencies,
'@opentiny/vue-common': NPM_TAG,
'@opentiny/vue-icon': NPM_TAG,
'@opentiny/vue-theme': themeVersionDependencies,
'@opentiny/vue-theme-mobile': themeVersionDependencies
}
if (p === 'icon') {
packageJSON.dependencies = Object.assign(packageJSON.dependencies || {}, {
'@opentiny/vue-common': NPM_TAG,
'@opentiny/vue-theme': themeVersionDependencies
})
} else if (p === 'locale') {
dependencies = {
'@opentiny/vue-renderless': themeVersionDependencies
}
} else if (p === 'common') {
dependencies = {
'@opentiny/vue-renderless': themeVersionDependencies,
'@opentiny/vue-theme': themeVersionDependencies
}
if (VERSION_TAG.startsWith('2')) {
dependencies['@vue/composition-api'] = '1.2.2'
}
}
packageJSON.dependencies = Object.assign(packageJSON.dependencies || {}, dependencies)
if (VERSION_TAG.startsWith('3')) {
packageJSON.types = 'index.d.ts'
}
packageJSON.sideEffects = false
packageJSON.version = VERSION_TAG
}
const release = (p) => {
const packagePath = path.join(packages, p, packageName)
const packageJSON = fs.readJSONSync(packagePath)
const componentEntry = path.join(packagePath, '../lib', 'index.js')
dealPackage(p, packageJSON)
fs.writeFileSync(packagePath, JSON.stringify(packageJSON, null, 2))
if (fs.existsSync(componentEntry)) {
let componentEntryContent = fs.readFileSync(componentEntry).toString('UTF-8')
componentEntryContent = componentEntryContent.replace('process.env.COMPONENT_VERSION', `'${VERSION_TAG}'`)
fs.writeFileSync(componentEntry, componentEntryContent)
}
logGreen(`${p} pack done`)
// 测试情况下可以打包成压缩包
if (NPM_WAREHOUSE === 'test') {
packPackages(p, packagePath)
}
}
const dealFile = (componentDir, distDir) => {
if (componentDir.includes('common')) {
// 如果是vue3.0的打包命令下
if (VERSION_TAG.startsWith('3')) {
// 删除 vue2.0文件
fs.removeSync(path.join(distDir, 'adapter/vue2.js'))
// 重写adapter/index.js
fs.copySync(path.join(__dirname, '../', 'template/common/vue3.js'), path.join(distDir, 'adapter/index.js'))
} else {
// 删除 vue3.0文件
fs.removeSync(path.join(distDir, 'adapter/vue3.js'))
// 重写adapter/index.js
fs.copySync(path.join(__dirname, '../', 'template/common/vue2.js'), path.join(distDir, 'adapter/index.js'))
}
} else if (componentDir.includes('locale')) {
// 如果是vue3.0的打包命令下
if (VERSION_TAG.startsWith('3')) {
// 删除 vue2.0文件
fs.removeSync(path.join(distDir, 'vue2.js'))
// 重写index.js
fs.copySync(path.join(__dirname, '../', 'template/locale/vue3.js'), path.join(distDir, 'index.js'))
} else {
// 删除 vue3.0文件
fs.removeSync(path.join(distDir, 'vue3.js'))
// 重写index.js
fs.copySync(path.join(__dirname, '../', 'template/locale/vue2.js'), path.join(distDir, 'index.js'))
}
}
}
// chart文件夹处理
const releaseChart = (componentDir, item) => {
fs.readdirSync(componentDir).forEach((child) => {
const stat = fs.statSync(path.join(componentDir, child))
if (stat.isDirectory()) {
const distPath = path.join(sourcePkg, item, child, packages)
const packageJson = path.join(sourcePkg, item, child, packageName)
const typingsPath = path.join(typings, item, child)
if (fs.existsSync(typingsPath) && VERSION_TAG.startsWith('3')) {
fs.copySync(typingsPath, path.join(packages, item), {
overwrite: true
})
}
if (fs.existsSync(distPath)) {
fs.copySync(distPath, path.join(packages, item, child), {
overwrite: true
})
fs.copySync(packageJson, path.join(packages, item, child, packageName), {
overwrite: true
})
} else {
fs.copySync(componentDir, path.join(packages, item, child), {
overwrite: true
})
}
release(path.join(item, child))
}
})
}
// 读取packages文件夹下的所有组件并执行copy操作
const releaseAll = () => {
fs.readdirSync(path.join(sourcePkg)).forEach((item) => {
const componentDir = path.join(sourcePkg, item)
const stat = fs.statSync(componentDir)
if (stat.isDirectory()) {
const distPath = path.join(sourcePkg, item, packages)
const packageJson = path.join(sourcePkg, item, packageName)
const typingsPath = path.join(typings, item)
if (fs.existsSync(typingsPath) && VERSION_TAG.startsWith('3')) {
fs.copySync(typingsPath, path.join(packages, item), {
overwrite: true
})
}
if (fs.existsSync(distPath)) {
fs.copySync(distPath, path.join(packages, item), {
overwrite: true
})
fs.copySync(packageJson, path.join(packages, item, packageName), {
overwrite: true
})
} else {
// 如果packags包里面没有dist目录则copy整个目录比如common local等适配层
fs.copySync(componentDir, path.join(packages, item), {
overwrite: true
})
// 处理common和locale包分别针对vue2和vue3
dealFile(componentDir, path.join(packages, item))
}
release(item)
if (item === 'chart') {
releaseChart(componentDir, item)
}
}
})
logGreen('-- all release done --')
}
releaseAll()

View File

@ -1,84 +0,0 @@
/**
* 用于发布 @opentiny/vue
*/
const fs = require('fs-extra')
const path = require('path')
const semver = require('semver')
const sourcePkg = 'packages'
const source = 'dist'
const packageName = 'package.json'
const typings = 'typings'
const packagePath = path.join(source, packageName)
const packageJSON = fs.readJSONSync(packageName)
const keys = ['name', 'version', 'description', 'main', 'files', 'sideEffects', 'author', 'license', 'repository', 'dependencies', 'engines', 'browserslist']
const NPM_TAG = process.env.NPM_TAG
// 命令行中指定的版本号
const VERSION_TAG = process.env.VERSION_TAG
for (let key in packageJSON) {
if (Object.prototype.hasOwnProperty.call(packageJSON, key)) {
!~keys.indexOf(key) && delete packageJSON[key]
}
}
// 配置指定的版本号
if (VERSION_TAG) {
packageJSON.version = VERSION_TAG
}
// 根据modules.json生成所有组件列表信息
const genDependencies = () => {
const { getComponents } = require('../build/module-utils')
let dependencies = {}
getComponents(false).forEach((component) => {
const packPath = component.path.replace(/index\.js$/, 'package.json')
if (!fs.existsSync(packPath)) {
return
}
if (NPM_TAG) {
dependencies[component.importName] = NPM_TAG
} else {
let { version } = fs.readJSONSync(packPath)
if (version) {
const major = semver.major(version)
const minor = semver.minor(version)
version = `${major}.${minor}.0`
dependencies[component.importName] = '~' + version
}
}
})
return dependencies
}
if (VERSION_TAG.startsWith('3')) {
packageJSON.types = 'index.d.ts'
}
// 根据组件列表信息重新package.json的dependencies信息
packageJSON.dependencies = Object.assign(packageJSON.dependencies || {}, genDependencies())
fs.writeFileSync(packagePath, JSON.stringify(packageJSON, null, 2))
fs.copySync(packagePath, path.join(source, 'vue', packageName), {
overwrite: true
})
const entrys = ['pc.js', 'mobile.js', 'index.js']
entrys.forEach((name) => {
fs.copySync(path.join(sourcePkg, name), path.join(source, 'vue', name), {
overwrite: true
})
if (VERSION_TAG.startsWith('3')) {
fs.copySync(path.join(typings, name.replace('.js', '.d.ts')), path.join(source, 'vue', name.replace('.js', '.d.ts')), {
overwrite: true
})
}
})

View File

@ -1,304 +0,0 @@
/**
* 打包运行时通用配置
*
* 全量运行时组件分组
* 运行时版本号
* 运行时外部依赖路径
*/
const fs = require('fs-extra')
const { getVersion, pathJoin, logRed } = require('./utils')
const moduleUtils = require('./module-utils')
const runtimeComponents = {
core: [
'Common',
'Icon',
'Locale',
'Alert',
'Col',
'Container',
'DialogBox',
'Layout',
'Loading',
'Popover',
'Row',
'Tooltip',
'Carousel',
'CarouselItem',
'Collapse',
'CollapseItem',
'Split',
'TimeLine',
'Milestone',
'Floatbar',
'Steps',
'TabItem',
'Tabs',
'Breadcrumb',
'BreadcrumbItem',
'FallMenu',
'NavMenu',
'Rate',
'Tag',
'TopBox',
'Notify',
'Image',
'ImageViewer',
'ScrollText',
'Scrollbar',
'UserHead',
'SlideBar',
'Slider',
'Link',
'Progress',
'Crop'
],
base: [
'Autocomplete',
'BulletinBoard',
'Button',
'ButtonGroup',
'Calendar',
'Cascader',
'CascaderMenu',
'CascaderNode',
'CascaderPanel',
'Checkbox',
'CheckboxButton',
'CheckboxGroup',
'DatePanel',
'DatePicker',
'DateRange',
'DateTable',
'DetailPage',
'DropTimes',
'FileUpload',
'Form',
'FormItem',
'Grid',
'GridColumn',
'GridManager',
'GridToolbar',
'Input',
'IpAddress',
'LinkMenu',
'Modal',
'MonthRange',
'MonthTable',
'Numeric',
'Option',
'OptionGroup',
'Pager',
'PagerItem',
'Picker',
'PopUpload',
'Popeditor',
'Radio',
'RadioButton',
'RadioGroup',
'Search',
'Select',
'SelectDropdown',
'Switch',
'Table',
'TextPopup',
'Time',
'TimePanel',
'TimePicker',
'TimeRange',
'TimeSelect',
'TimeSpinner',
'ToggleMenu',
'Transfer',
'TransferPanel',
'Tree',
'TreeMenu',
'Upload',
'UploadDragger',
'UploadList',
'YearTable'
],
business: ['UserContact', 'Wizard'],
chart: [
'BaiduMap',
'ChartBar',
'ChartCandle',
'ChartCore',
'ChartFunnel',
'ChartGauge',
'ChartWaterfall',
'ChartGraph',
'ChartHeatmap',
'ChartHistogram',
'ChartLine',
'ChartMap',
'ChartPie',
'ChartRadar',
'ChartRing',
'ChartSankey',
'ChartScatter',
'ChartSunburst',
'ChartTree',
'Chart',
'ChartBoxplot'
],
external: ['CardTemplate', 'CreditCard', 'CreditCardForm', 'SvgIcon', 'AutonaviMap', 'ChartWordcloud', 'ChartLiquidfill']
}
const echartsVersion = getVersion('echarts')
const auroraVueVersion = getVersion('@opentiny/vue')
const echartsSource = 'lib/echarts.min.js' + echartsVersion
const dependencies = {
vue: 'node_modules/vue/dist/vue.min.js',
'vue-i18n': 'node_modules/vue-i18n/dist/vue-i18n.min.js',
axios: 'node_modules/axios/dist/axios.min.js',
'axios-mock-adapter': 'node_modules/axios-mock-adapter/dist/axios-mock-adapter.min.js',
'@vue/composition-api': 'node_modules/@vue/composition-api/dist/vue-composition-api.prod.js',
'@huawei/core': 'node_modules/@huawei/core/dist/aurora.min.js',
'@huawei/service': 'node_modules/@huawei/service/dist/aurora.service.min.js',
cropperjs: 'node_modules/cropperjs/dist/cropper.min.js',
vue3: 'example/node_modules/vue/dist/vue.global.prod.js',
'vue3-i18n': 'example/node_modules/vue-i18n/dist/vue-i18n.global.js'
}
const runtimeDeps = {
base: {
vue: 'lib/vue.min.js' + getVersion('vue'),
axios: 'lib/axios.min.js' + getVersion('axios'),
'vue-i18n': 'lib/vue-i18n.min.js' + getVersion('vue-i18n'),
'axios-mock-adapter': 'lib/axios-mock-adapter.min.js' + getVersion('axios-mock-adapter')
},
aurora: {
'@huawei/core': 'lib/aurora.min.js' + getVersion('@huawei/core'),
'@huawei/service': 'lib/aurora.service.min.js' + getVersion('@huawei/service')
},
tiny3Lib: {
'@vue/composition-api': 'lib/vue-composition-api.prod.js' + getVersion('@vue/composition-api'),
echarts: echartsSource,
'echarts/lib/echarts': echartsSource,
'echarts/lib/chart/bar': echartsSource,
'echarts/lib/chart/boxplot': echartsSource,
'echarts/lib/chart/candlestick': echartsSource,
'echarts/lib/chart/chord': echartsSource,
'echarts/lib/chart/custom': echartsSource,
'echarts/lib/chart/effectScatter': echartsSource,
'echarts/lib/chart/funnel': echartsSource,
'echarts/lib/chart/gauge': echartsSource,
'echarts/lib/chart/graph': echartsSource,
'echarts/lib/chart/heatmap': echartsSource,
'echarts/lib/chart/line': echartsSource,
'echarts/lib/chart/lines': echartsSource,
'echarts/lib/chart/map': echartsSource,
'echarts/lib/chart/parallel': echartsSource,
'echarts/lib/chart/pictorialBar': echartsSource,
'echarts/lib/chart/pie': echartsSource,
'echarts/lib/chart/radar': echartsSource,
'echarts/lib/chart/sankey': echartsSource,
'echarts/lib/chart/scatter': echartsSource,
'echarts/lib/chart/sunburst': echartsSource,
'echarts/lib/chart/themeRiver': echartsSource,
'echarts/lib/chart/tree': echartsSource,
'echarts/lib/chart/treemap': echartsSource,
'echarts/lib/component/legend': echartsSource,
'echarts/lib/component/tooltip': echartsSource,
'echarts/lib/component/dataZoom': echartsSource,
'echarts/lib/component/visualMap': echartsSource,
cropperjs: 'lib/cropper.min.js' + getVersion('cropperjs'),
'@opentiny/vue-renderless-common': 'tiny/common/renderless.js' + getVersion('@opentiny/vue-renderless')
},
tiny3Component: {
'@opentiny/vue-locale': 'COMPONENT_DIR/locale.js' + auroraVueVersion,
'@opentiny/vue-icon': 'COMPONENT_DIR/icon.js' + auroraVueVersion,
'@opentiny/vue-common': 'COMPONENT_DIR/common.js' + auroraVueVersion
}
}
const getPartDeps = (keys = []) => {
const tempDeps = {}
for (let key in runtimeDeps) {
if (Object.prototype.hasOwnProperty.call(runtimeDeps, key)) {
keys.includes(key) && Object.assign(tempDeps, runtimeDeps[key])
}
}
return tempDeps
}
const getAllDeps = () => getPartDeps(Object.keys(runtimeDeps))
const getAllComponents = () => {
const componentMap = moduleUtils.getPcComponents(true)
const systemMap = {}
for (let i = 0, len = componentMap.length; i < len; i++) {
const libName = componentMap[i].LowerName
const libEntry = componentMap[i].path
let version = auroraVueVersion
try {
version = '?v=' + require('../' + libEntry.replace('index.js', 'package.json')).version.replace(/[\^|~]/g, '')
} catch (e) {
logRed(e)
}
systemMap[componentMap[i].importName] = 'COMPONENT_DIR/' + libName + '.js' + version
}
return systemMap
}
const getFullRuntimeDeps = () => ({ ...getAllDeps(), ...getAllComponents() })
const getComponentRuntimeDeps = () => ({
...getPartDeps(['theme', 'tiny3Lib', 'tiny3Component']),
...getAllComponents()
})
const getFullRuntime = (name) => {
const arr = typeof name === 'string' ? [name] : name || Object.keys(runtimeComponents)
return [].concat(...arr.map((key) => runtimeComponents[key]))
}
/**
* 提取 @opentiny/vue-renderless 中的公共代码打成独立包避免组件运行不正常
*/
const getRenderlessExports = () => {
const RENDERLESS_PATH = pathJoin('..', 'node_modules', '@huawei', 'renderless', 'common', 'runtime.js')
let EXTERNAL_RENDERLESS = []
// 获取需要排除的依赖
if (fs.existsSync(RENDERLESS_PATH)) {
const runtimeExport = fs.readFileSync(RENDERLESS_PATH).toString('UTF-8')
EXTERNAL_RENDERLESS = runtimeExport.match(/import(.*)from(.*)/g) || []
EXTERNAL_RENDERLESS = EXTERNAL_RENDERLESS.map((item) => {
let moduleLine = item.replace(/^import\s+/g, '').split(/\s+from\s+/)
return {
libraryName: moduleLine.pop().replace(/'/g, '').replace(';', ''),
exportName: moduleLine.pop().split(/\s/).pop()
}
})
}
return {
EXTERNAL_RENDERLESS,
RENDERLESS_PATH
}
}
module.exports = {
dependencies,
getAllDeps,
getPartDeps,
getFullRuntime,
getAllComponents,
getFullRuntimeDeps,
getRenderlessExports,
getComponentRuntimeDeps,
getExternalComponents: () => runtimeComponents.external
}

View File

@ -1,88 +0,0 @@
/**
* 初始化/创建 ICON 组件 @opentiny/vue-theme/svgs 中提取 SVG 图标创建对应的 ICON 组件
*/
const path = require('path')
const fs = require('fs-extra')
const utils = require('./utils')
const semver = require('semver')
const { EOL } = require('os')
const svgRE = /\.svg$/
const svgDir = utils.pathJoin('../../', 'vue-theme', 'theme', 'svgs')
const iconDir = utils.pathJoin('..', 'packages', 'icon')
const packageJson = 'package.json'
const templatePath = utils.pathJoin('..', 'template')
const render = utils.renderTemplate({ leftChar: '[[', rightChar: ']]' })
// 检查是否按照依赖包
if (!fs.existsSync(svgDir)) {
utils.logYellow('The @opentiny/vue-theme is not exist , please npm install @opentiny/vue-theme.')
}
// 是否包含 package/icon 目录
if (!fs.existsSync(iconDir)) {
fs.mkdirSync(iconDir)
const version = utils.getTinyVersion()
const iconTemplate = fs.readJSONSync(path.join(templatePath, 'component', packageJson))
// 删除多余的依赖
if (iconTemplate.dependencies) {
delete iconTemplate.dependencies['@opentiny/vue-renderless']
}
const packageContent = render(JSON.stringify(iconTemplate), {
NAME: 'icon',
MINOR: semver.minor(version)
})
fs.writeFileSync(path.join(iconDir, packageJson), packageContent)
}
const exportComponents = []
const exportIcons = []
const componentTemplate = fs.readFileSync(path.join(templatePath, 'icon', 'index.js'), { encoding: 'utf8' })
// 根据 @opentiny/vue-theme/svgs 中的 svg 图片创建对应的 icon 组件
fs.readdirSync(svgDir).forEach((fileName) => {
if (svgRE.test(fileName)) {
const svgName = fileName.replace(svgRE, '')
const iconPath = path.join(iconDir, svgName)
const iconName = utils.capitalizeKebabCase(svgName)
const fullIconName = `Icon${iconName}`
if (!fs.existsSync(iconPath)) {
fs.mkdirSync(iconPath)
const iconEntryContent = render(componentTemplate, {
CNAME: iconName,
SNAME: fileName
})
fs.writeFileSync(path.join(iconPath, 'index.js'), utils.prettierFormat({ str: iconEntryContent }))
}
exportComponents.push(`import ${fullIconName} from './${svgName}'`)
exportIcons.push(fullIconName)
}
})
if (exportComponents.length) {
fs.writeFileSync(
path.join(iconDir, 'index.js'),
utils.prettierFormat({
str: `${exportComponents.join(EOL)}
export {
${exportIcons.join(',' + EOL)}
}
export default {
${exportIcons.join(',' + EOL)}
}
`
})
)
utils.logGreen('npm run create:icon done.')
} else {
utils.logRed('npm run create:icon fail.')
}

View File

@ -1,309 +0,0 @@
const fs = require('fs-extra')
const path = require('path')
const chalk = require('chalk')
const { execSync } = require('child_process')
const log = global.console
const logger = log.log
/**
* 根据运行上下文获取路径运行时打包用
* @returns 文件绝对路径
*/
const resolveCwd = (...args) => path.join(process.cwd(), ...args)
/**
* 获取模板替换路径动态
* @param {String} posixPath 路径
* @returns 文件绝对路径
*/
const assetsPath = (posixPath) => path.posix.join('static', posixPath)
/**
* 根据运行上下文获取当前运行组件的名称
* @returns 当前运行组件目录名称
*/
const getComponentName = () => process.cwd().split(path.sep).pop()
/**
* 获取当前上下文的路径
* @returns 文件绝对路径
*/
const pathJoin = (...args) => path.join(__dirname, ...args)
/**
* 获取用户输入命令参数
* @returns 参数数组
*/
const getInputCmd = () => {
const args = []
const argv = process.argv || []
argv.forEach((item) => {
if (item.indexOf(path.sep) === -1) {
args.push(item)
}
})
return args
}
/**
* 获取当前执行 cli 命令的工具node\npm\yarn
* @returns node\npm\yarn
*/
const getCurrentCliTool = () => {
const npmExecpaths = process.env.npm_execpaths
if (!npmExecpaths) {
return 'node'
}
return npmExecpaths.substring(npmExecpaths.lastIndexOf(path.sep) + 1).replace(/.js|-cli/g, '')
}
/**
* 执行 node 命令
* @param {String} cmdStr 命令字符串
*/
const execCmd = (cmdStr) => {
cmdStr && execSync(cmdStr, { stdio: 'inherit' })
}
/**
* 首字母大写
* @param {String} str 字符串
* @returns 字符串
*/
const capitalize = (str) => (typeof str === 'string' ? str.slice(0, 1).toUpperCase() + str.slice(1) : str)
/**
* 首字母大写
* @param {String} str 字符串
* @returns 字符串
*/
const capitalizeKebabCase = (str, splitChar = '-') => (typeof str === 'string' ? str.split(splitChar).map(capitalize).join('') : str)
/**
* @description 将驼峰字符串转化为以指定字符分割的小写字符串
* @example kebabCase({ str : 'ImgPreviewItem' } )
* @example 输出结果img-preview-item
*
* @param str 字符串
* @param splitChar 分隔符
*/
const kebabCase = ({ str, splitChar = '-' }) => {
if (!str || typeof str !== 'string') {
return str
}
return str
.split('')
.map((char, index) => {
const charCod = char.charCodeAt(0)
if (charCod < 65 || charCod > 122) {
return char
}
return (charCod >= 65 && charCod) <= 90 ? (index === 0 ? '' : splitChar) + char.toLowerCase() : char
})
.join('')
}
/**
* 采用 prettier 美化字符串
* @param {String} str 格式字符
* @param {Object} options 格式字符
*/
const prettierFormat = ({ str, options = {} }) =>
require('prettier').format(str, {
printWidth: 100,
jsxBracketSameLine: false,
tabWidth: 2,
useTabs: false,
singleQuote: true,
semi: false,
trailingComma: 'none',
bracketSpacing: true,
parser: 'babel',
...options
})
/**
* @private
* @param {String} path dotted to indicate levels in an object.
* @param {Object} view for the data.
*/
function extractValue(path, view) {
if (view && view[path]) {
return view[path]
}
const parts = path.split('.')
let part = ''
while (view && (part = parts.shift())) {
view = typeof view === 'object' && part in view ? view[part] : undefined
}
return view
}
/**
* 渲染字符串模板
* @param {String} leftChar 匹配左边字符
* @param {String} rightChar 匹配右边字符
*/
const renderTemplate = ({ leftChar = '{{', rightChar = '}}' } = {}) => {
const specialChar = ['[', ']']
const _leftChar = leftChar.split('').map((item) => (specialChar.includes(item) ? '\\' : '') + item)
const _rightChar = rightChar.split('').map((item) => (specialChar.includes(item) ? '\\' : '') + item)
const REGEX = new RegExp(`${_leftChar.join('')}([a-zA-Z.-_0-9]+)${_rightChar.join('')}`, 'g')
return (input, view) => {
if (input.indexOf(leftChar) === -1) {
return input
}
let result
const replaced = input.replace(REGEX, (original, path) => {
const value = extractValue(path, view)
if (undefined === value || value === null) {
return original
}
if (typeof value === 'object') {
result = value
return
}
return value
})
return undefined === result ? replaced : result
}
}
/**
* 扫描指定目录下面的组件目录
* @param {String} dirPath 绝对路径
* @param {Boolean} isDeep 是否深度遍历
* @param {Function} fileFilter 文件筛选拦截函数
* @param {Function} callback 遍历回调
*/
const walkFileTree = ({ dirPath, isDeep = false, fileFilter, callback }) => {
if (!dirPath || typeof callback !== 'function') {
return
}
const dirs = fs.readdirSync(path.isAbsolute(dirPath) ? dirPath : path.join(__dirname, dirPath))
if (Array.isArray(dirs) && dirs.length > 0) {
dirs.forEach((file) => {
let isFind = true
const subPath = path.join(dirPath, file)
const isDirectory = fs.statSync(subPath).isDirectory()
if (typeof fileFilter === 'function') {
isFind = fileFilter({ file, subPath, dirs, isDirectory }) === true
}
if (isFind && isDirectory) {
if (isDeep) {
walkFileTree({ isDeep, dirPath: subPath, fileFilter, callback })
return
}
}
callback({ file, subPath, dirs, isDirectory })
})
}
}
/**
* 获取根目录 package.json 中的 version
* @param {String} 对象的 Key
*/
const getTinyVersion = (key = 'version') => {
const packageJson = fs.readJsonSync(pathJoin('..', 'package.json'))
return packageJson[key] || packageJson
}
/**
* 获取指定包名的版本号
*
* @param {String} name NPM 包名
* @param {String} context 上下文
* @returns
*/
const getVersion = (name, context = '..') => {
let version
const packageJSON = getTinyVersion('full')
try {
version = fs.readJsonSync(pathJoin(context, 'node_modules', name, 'package.json')).version
} catch (e) {
version = (packageJSON.devDependencies || packageJSON.dependencies || {})[name] || packageJSON.version
}
return '?v=' + version.replace(/[\^|~]/g, '')
}
/**
* 在控制台显示绿色提示
* @param {String} 提示内容
*/
const logGreen = (str) => {
logger(chalk.green('### ' + str))
}
/**
* 在控制台显示黄色提示
* @param {String} 提示内容
*/
const logYellow = (str) => {
logger(chalk.yellow('### ' + str))
}
/**
* 在控制台显示青色提示
* @param {String} 提示内容
*/
const logCyan = (str) => {
logger(chalk.cyan('### ' + str))
}
/**
* 在控制台显示红色提示
* @param {String} 提示内容
*/
const logRed = (str) => {
logger(chalk.red('### ' + str))
}
module.exports = {
logRed,
execCmd,
logCyan,
pathJoin,
logGreen,
logYellow,
kebabCase,
assetsPath,
capitalize,
getVersion,
resolveCwd,
getInputCmd,
walkFileTree,
renderTemplate,
prettierFormat,
getTinyVersion,
getComponentName,
getCurrentCliTool,
capitalizeKebabCase
}

View File

@ -1,33 +0,0 @@
const path = require('path')
const fs = require('fs-extra')
const ROOTPATH = path.join(__dirname, './')
const publish = () => {
const publishDir = path.join(ROOTPATH, 'packages')
fs.readdirSync(publishDir).forEach((item) => {
const childPath = path.join(publishDir, item)
const stat = fs.statSync(childPath)
if (stat.isDirectory()) {
const distPath = path.join(childPath, './dist')
if (fs.existsSync(distPath) && fs.statSync(distPath).isDirectory()) {
fs.removeSync(distPath)
}
if (item.startsWith('chart')) {
fs.readdirSync(childPath).forEach((value) => {
const chartChildPath = path.join(childPath, value)
const chartStat = fs.statSync(chartChildPath)
if (value.includes('-') && chartStat.isDirectory()) {
const distPath = path.join(chartChildPath, './dist')
fs.existsSync(distPath) &&
fs.statSync(distPath).isDirectory() &&
fs.removeSync(distPath)
}
})
}
}
})
}
publish()

View File

@ -1,6 +0,0 @@
{
"rules": {
"no-console": "off",
"no-unused-vars": "off"
}
}

View File

@ -1,12 +0,0 @@
# registry=https://npm.cloudartifact.dgg.dragon.tools.huawei.com/artifactory/api/npm/npm-cbcbigate/
# _auth=Y2JjYmlnYXRlOkh1YXdlaUAxMjM=
#@huawei:registry=https://szg1.artifactory.inhuawei.com/artifactory/api/npm/npm-cbu-common
registry=https://npm.inhuawei.com/
# 装测试包
@huawei:registry=https://npm.cloudartifact.dgg.dragon.tools.huawei.com/artifactory/api/npm/npm-cbcbigate/
_auth=Y2JjYmlnYXRlOkh1YXdlaUAxMjM=
# 安装
@originjs:registry=https://npm.cloudartifact.dgg.dragon.tools.huawei.com/artifactory/api/npm/npm-fed/
@types:registry=https://npm.cloudartifact.dgg.dragon.tools.huawei.com/artifactory/api/npm/sz-npm-public

View File

@ -1,88 +0,0 @@
const commonjs = require('@rollup/plugin-commonjs')
const { nodeResolve } = require('@rollup/plugin-node-resolve')
const vue = require('rollup-plugin-vue')
const { babel } = require('@rollup/plugin-babel')
const { pathJoin, logGreen, logRed } = require('../../build/utils')
const rollup = require('rollup')
const svgVue = require('./rollup-vue3-svg')
const fs = require('fs-extra')
const path = require('path')
const inputOptions = {
plugins: [
vue({
css: true
}),
svgVue({}),
nodeResolve(),
babel({
exclude: /node_modules/,
babelrc: false,
configFile: false, // 必须为 false 不然会取根文件的 babel.config.js 配置,产生一堆 runtime 代码
babelHelpers: 'bundled',
extensions: ['.js', '.vue'],
presets: ['@babel/preset-env'],
plugins: ['@babel/plugin-proposal-export-default-from', '@babel/plugin-proposal-export-namespace-from']
}),
// 如果打包文件中包含 jsx 语法, commonjs 必须放置在 babel 配置下面,否则会报错 PLUGIN_ERROR
commonjs()
]
}
const outputOptions = {
format: 'es',
exports: 'named'
}
const build = (icons) => {
icons.forEach((itconComponent) => {
const inputs3 = { ...inputOptions }
inputs3.input = pathJoin('..', 'packages', 'icon', itconComponent.path)
if (itconComponent.path === 'index.js') {
inputs3.external = (deps) => !deps.includes('index.js')
} else if (itconComponent.path === 'lowercase.js') {
inputs3.external = (deps) => !deps.includes('lowercase.js')
} else {
inputs3.external = (deps) => !/@huawei[\\/]tiny-vue-theme/.test(deps) && !deps.includes('index.js')
}
rollup
.rollup(inputs3)
.then((bundle) => {
const outs = { ...outputOptions }
outs.file = pathJoin('..', 'packages', 'icon', itconComponent.libPath)
bundle.write(outs)
logGreen(`${itconComponent.path} compile icon done`)
})
.catch((e) => {
logRed(e)
})
})
}
function createComponentMap(iconDir) {
const components = []
fs.readdirSync(iconDir).forEach((iconFile) => {
if (['dist', 'runtime'].includes(iconFile)) {
return
}
if (fs.statSync(path.join(iconDir, iconFile)).isDirectory()) {
components.push({
path: `${iconFile}/index.js`,
libPath: `dist/lib/${iconFile}.js`
})
} else {
iconFile.endsWith('.js') &&
components.push({
path: `${iconFile}`,
libPath: `dist/lib/${iconFile}`
})
}
})
return components
}
build(createComponentMap(pathJoin('..', 'packages', 'icon')))

View File

@ -1,107 +0,0 @@
const rollup = require('rollup')
const replace = require('@rollup/plugin-replace')
const { readJSONSync } = require('fs-extra')
const utils = require('../../build/utils')
const config = require('./config')
const moduleUtils = require('../../build/module-utils')
const fs = require('fs-extra')
const isSingle = process.env.BUILD_TARGET === 'single'
const inputOptions = {
plugins: config.plugins,
external: config.external
}
const outputOptions = {
format: 'es',
globals: config.globals,
exports: 'named'
}
const replaceConstant = {
'process.env.BUILD_TARGET': JSON.stringify(process.env.BUILD_TARGET),
'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV)
}
if (process.env.TINY_MODE === 'pc') {
outputOptions.format = 'umd'
replaceConstant['process.env.TINY_MODE'] = JSON.stringify(process.env.TINY_MODE)
}
const build = ({ comp, callbackFn }) => {
inputOptions.input = utils.pathJoin('..', comp.path)
inputOptions.plugins.push(replace(replaceConstant))
rollup
.rollup(inputOptions)
.then((bundle) => {
outputOptions.file = utils.pathJoin('..', comp.libPath)
if (outputOptions.format === 'umd') {
outputOptions.name = comp.global
}
bundle.write(outputOptions).finally(() => {
const filePath = utils.pathJoin('..', comp.libPath)
if (filePath.endsWith('index.js')) {
const indexStr = fs.readFileSync(filePath).toString('UTF-8')
const resStr = indexStr.replace('./src/pc', './pc').replace('./src/mobile', './mobile')
fs.writeFileSync(filePath, resStr)
}
callbackFn()
})
})
.catch((e) => {
utils.logRed(e)
callbackFn()
})
}
let componentsArr = []
const buildAll = (count = 0) => {
let comp = componentsArr[count++]
if (comp) {
if (!isSingle) {
comp.libPath = 'dist/' + comp.libName.replace('@opentiny/vue/', '')
comp.libPath += (comp.type === 'component' ? '/index' : '') + '.js'
}
build({
comp,
callbackFn() {
buildAll(count)
}
})
} else {
utils.logGreen(`npm run build:ui${isSingle ? '-single' : ''} done.`)
}
}
if (isSingle) {
const inputNameArr = utils.getInputCmd()
if (inputNameArr.length > 0) {
inputNameArr.forEach((input) => {
const activeComName = utils.kebabCase({ str: input })
if (activeComName) {
componentsArr.push(
...moduleUtils.getByName({
name: activeComName,
isSort: false
})
)
}
})
} else {
const activeCompName = utils.getComponentName()
componentsArr = moduleUtils.getByName({
name: activeCompName,
isSort: false
})
}
} else {
componentsArr = moduleUtils.getAllModules(false)
}
if (componentsArr.length > 0) {
buildAll()
} else {
utils.logYellow('please enter the component name after command.')
}

View File

@ -1,103 +0,0 @@
const fs = require('fs-extra')
const { babel } = require('@rollup/plugin-babel')
const vue = require('rollup-plugin-vue')
const alias = require('@rollup/plugin-alias')
const commonjs = require('@rollup/plugin-commonjs')
const postcss = require('rollup-plugin-postcss')
const { nodeResolve } = require('@rollup/plugin-node-resolve')
const { pathJoin } = require('../../build/utils')
const { getAllModules } = require('../../build/module-utils')
const external = [
'vue',
'./pc',
'./mobile',
'@opentiny/vue-common',
'echarts',
'echarts-amap',
'@opentiny/vue-locale',
'quill',
'@vue/composition-api',
'@opentiny/vue-renderless'
]
const globals = {
vue: 'Vue',
'@vue/composition-api': 'vueCompositionApi',
'@opentiny/vue-locale': 'TinyVueLocale',
'@opentiny/vue-common': 'TinyVueCommon',
'echarts-amap': 'echarts.amap',
'echarts-liquidfill': 'echarts-liquidfill',
'echarts-wordcloud': 'echarts-wordcloud',
'@opentiny/vue-renderless': 'TinyRenderLess'
}
const aliasList = {}
const components = getAllModules(false)
components.forEach((itemComponent) => {
aliasList[itemComponent.libName] = pathJoin(`../${itemComponent.path}`)
if (itemComponent.private) {
return
}
const isComponent = itemComponent.type === 'component'
external.push(itemComponent.importName) // @opentiny/vue3-todo
external.push(itemComponent.libName) // @opentiny/vue3/todo
globals[itemComponent.libName] = itemComponent.global // TinyTodo
if (isComponent) {
if (fs.existsSync(pathJoin('../../tiny-vue-theme'))) {
aliasList[`@opentiny/vue-theme/${itemComponent.LowerName}/index.css`] = pathJoin(`../../tiny-vue-theme/style/${itemComponent.LowerName}/index.css`)
aliasList[`@opentiny/vue-theme/${itemComponent.LowerName}/index.js`] = pathJoin(`../../tiny-vue-theme/style/${itemComponent.LowerName}/index.js`)
}
external.push(`${itemComponent.libName}/index.js`)
} else {
external.push(`${itemComponent.libName}.js`)
}
})
exports.aliasList = aliasList
exports.external = (deps) =>
external.includes(deps) || /^@huawei[\\/](tiny-vue-renderless|tiny-vue-theme|tiny-vue-common|tiny-vue-icon)|echarts|cropperjs|quill/.test(deps)
exports.globalsMap = globals
const op = {
resolve: ['.js', '.vue', '.css'],
extract: false,
css: true,
extensions: ['.js', '.jsx', '.vue', '.css']
}
exports.plugins = [
alias({
resolve: op.resolve,
'@opentiny/vue-locale': pathJoin('../packages/locale/index'),
'@opentiny/vue-common': pathJoin('../packages/common/index'),
...aliasList
}),
postcss({
extract: op.extract
}),
vue({
css: op.css
}),
nodeResolve({
extensions: op.extensions
}),
babel({
configFile: false,
babelrc: false,
exclude: /node_modules/,
comments: false,
presets: ['@babel/preset-env'],
babelHelpers: 'bundled',
extensions: ['.js', '.vue', '.jsx'],
plugins: ['@babel/plugin-syntax-dynamic-import', '@vue/babel-plugin-jsx']
}),
commonjs()
]

View File

@ -1,25 +0,0 @@
let compilerDom = require('@vue/compiler-dom')
function vue3SvgInline() {
return {
name: 'vue3SvgInline',
transform(source, id) {
if (id.indexOf('vue-theme') === -1) {
return null
}
const parsedSvg = source.match(/<svg([\s\S]*?)<\/svg>/)[0]
const { code } = compilerDom.compile(parsedSvg, {
mode: 'module'
})
return `
${code}
export default {
render
}`
}
}
}
module.exports = vue3SvgInline

View File

@ -1 +0,0 @@
export * from '@opentiny/vue-icon'

View File

@ -1,5 +0,0 @@
export * from '@opentiny/vue'
import locale from '@opentiny/vue-locale'
// 这里需要在运行时导出国际化方法
export { locale }

View File

@ -1,13 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" href="/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Tiny Vue</title>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main3.js"></script>
</body>
</html>

View File

@ -1,48 +0,0 @@
{
"name": "vue-example",
"version": "0.1.0",
"scripts": {
"dev": "vite",
"test": "vitest test",
"build:runtime-pc": "vite build --mode pc",
"build:runtime-icon": "vite build --mode icon",
"build:icon3": "cross-env NODE_ENV=production node build/build-icon.js",
"coverage": "vitest run --coverage"
},
"devDependencies": {
"@vitejs/plugin-vue": "^3.0.3",
"@vitejs/plugin-vue-jsx": "^2.0.0",
"@vue/babel-plugin-jsx": "^1.1.0",
"@vue/test-utils": "^2.0.0",
"esbuild-register": "^3.3.3",
"jsdom": "16.4.0",
"rollup-plugin-postcss": "^2.0.3",
"rollup-plugin-vue": "^6.0.0",
"vite-plugin-markdown-vue": "^0.1.2",
"vitest": "^0.22.1",
"vue": "^3.2.25",
"vue-i18n": "^9.1.7",
"vue-router": "^4.0.11"
},
"eslintConfig": {
"root": true,
"env": {
"node": true
},
"extends": [
"plugin:vue/essential",
"eslint:recommended"
],
"parserOptions": {
"parser": "babel-eslint"
},
"rules": {
"no-debugger": "off"
}
},
"browserslist": [
"> 1%",
"last 2 versions",
"not dead"
]
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.6 KiB

View File

@ -1,21 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width,initial-scale=1.0" />
<link rel="icon" href="./favicon.ico" />
<title>
TinyUI for Vue ( <%= htmlWebpackPlugin.options.vueVersion %> )
</title>
</head>
<body>
<noscript>
<strong>We're sorry but TINY next - Originjs doesn't work properly without
JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<div id="head"></div>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
</html>

File diff suppressed because it is too large Load Diff

View File

@ -1,56 +0,0 @@
{
"area": [
{
"org_id": "3623",
"id_and_type": "3623JCR",
"parent_and_type": null,
"name_cn": "A公司 Marketing与销售服务部",
"date_from": "2005/06/21 00:00:00",
"name_en": "Consumer BG Marketing and Sales Service Dept",
"parent_type": null,
"dept_code": "024206",
"date_to": null,
"parent": null,
"area_label": "JCR"
},
{
"org_id": "650561",
"id_and_type": "650561JCR",
"parent_and_type": null,
"name_cn": "A公司 Marketing与销售服务部东莞",
"date_from": "2012/09/27 00:00:00",
"name_en": "Consumer BG Marketing and Sales Service Dept (Dongguan)",
"parent_type": null,
"dept_code": "036068",
"date_to": null,
"parent": null,
"area_label": "JCR"
},
{
"org_id": "654434",
"id_and_type": "654434JCR",
"parent_and_type": null,
"name_cn": "区域管理部",
"date_from": "2014/06/18 00:00:00",
"name_en": "Regions Mgmt Dept",
"parent_type": null,
"dept_code": "038368",
"date_to": null,
"parent": null,
"area_label": "JCR"
},
{
"org_id": "653159",
"id_and_type": "037852JCR",
"parent_and_type": null,
"name_cn": "A公司业务部",
"date_from": "2014/01/20 00:00:00",
"name_en": "Consumer BG Business Unit",
"parent_type": null,
"dept_code": "037852",
"date_to": null,
"parent": null,
"area_label": "JCR"
}
]
}

View File

@ -1,343 +0,0 @@
{
"JCR": {
"area": [
{
"org_id": "3623",
"id_and_type": "3623JCR",
"parent_and_type": null,
"name_cn": "A公司 Marketing与销售服务部",
"date_from": "2005/06/21 00:00:00",
"name_en": "Consumer BG Marketing and Sales Service Dept",
"parent_type": null,
"dept_code": "024206",
"date_to": null,
"parent": null,
"area_label": "JCR"
},
{
"org_id": "650561",
"id_and_type": "650561JCR",
"parent_and_type": null,
"name_cn": "A公司 Marketing与销售服务部东莞",
"date_from": "2012/09/27 00:00:00",
"name_en": "Consumer BG Marketing and Sales Service Dept (Dongguan)",
"parent_type": null,
"dept_code": "036068",
"date_to": null,
"parent": null,
"area_label": "JCR"
},
{
"org_id": "654434",
"id_and_type": "654434JCR",
"parent_and_type": null,
"name_cn": "区域管理部",
"date_from": "2014/06/18 00:00:00",
"name_en": "Regions Mgmt Dept",
"parent_type": null,
"dept_code": "038368",
"date_to": null,
"parent": null,
"area_label": "JCR"
},
{
"org_id": "653159",
"id_and_type": "037852JCR",
"parent_and_type": null,
"name_cn": "A公司业务部",
"date_from": "2014/01/20 00:00:00",
"name_en": "Consumer BG Business Unit",
"parent_type": null,
"dept_code": "037852",
"date_to": null,
"parent": null,
"area_label": "JCR"
}
]
},
"Region": {
"area": [
{
"org_id": "608076",
"id_and_type": "608076Region",
"parent_and_type": "650561JCR",
"name_cn": "火星终端子公司",
"date_from": "2007/08/06 00:00:00",
"name_en": "SZ Device USA",
"parent_type": "JCR",
"dept_code": "024387",
"date_to": null,
"parent": "650561",
"area_label": "Region"
},
{
"org_id": "606661",
"id_and_type": "606661Region",
"parent_and_type": "654434JCR",
"name_cn": "中东测试数据",
"date_from": "2007/04/06 00:00:00",
"name_en": "Middle East Region",
"parent_type": "JCR",
"dept_code": "026699",
"date_to": null,
"parent": "654434",
"area_label": "Region"
},
{
"org_id": "611900",
"id_and_type": "611900Region",
"parent_and_type": "654434JCR",
"name_cn": "加拿大代表处",
"date_from": "2008/04/09 00:00:00",
"name_en": "Canada Rep Office",
"parent_type": "JCR",
"dept_code": "027339",
"date_to": null,
"parent": "654434",
"area_label": "Region"
},
{
"org_id": "1079",
"id_and_type": "1079Region",
"parent_and_type": "654434JCR",
"name_cn": "中国测试数据",
"date_from": "1980/01/01 00:00:00",
"name_en": "China Region",
"parent_type": "JCR",
"dept_code": "027425",
"date_to": null,
"parent": "654434",
"area_label": "Region"
},
{
"org_id": "4199",
"id_and_type": "4199Region",
"parent_and_type": "3623JCR",
"name_cn": "测试数据",
"date_from": "2005/06/29 00:00:00",
"name_en": "test data China Region",
"parent_type": "JCR",
"dept_code": "024207",
"date_to": null,
"parent": "3623",
"area_label": "Region"
},
{
"org_id": "653596",
"id_and_type": "653596Region",
"parent_and_type": "037852JCR",
"name_cn": "国内销售与服务部",
"date_from": "2014/03/18 00:00:00",
"name_en": "Domestic Sales & Service Dept",
"parent_type": "JCR",
"dept_code": "037985",
"date_to": null,
"parent": "037852",
"area_label": "Region"
},
{
"org_id": "606804",
"id_and_type": "606804Region",
"parent_and_type": "654434JCR",
"name_cn": "西欧测试数据",
"date_from": "2007/04/19 00:00:00",
"name_en": "West European Region",
"parent_type": "JCR",
"dept_code": "024931",
"date_to": null,
"parent": "654434",
"area_label": "Region"
}
]
},
"Rep. Office": {
"area": [
{
"org_id": "1112",
"id_and_type": "1112Rep.Office",
"parent_and_type": "1079Region",
"name_cn": "北京代表处",
"date_from": "1980/ 01 / 01 00:00:00",
"name_en": "Beijing Rep Office, CN",
"parent_type": "Region",
"dept_code": "027848",
"date_to": null,
"parent": "1079",
"area_label": "Rep.Office"
},
{
"org_id": "1114",
"id_and_type": "1114Rep.Office",
"parent_and_type": "1079Region",
"name_cn": "天津代表处",
"date_from": "1980/ 01 / 01 00:00:00",
"name_en": "Tianjin Rep Office, CN",
"parent_type": "Region",
"dept_code": "027862",
"date_to": null,
"parent": "1079",
"area_label": "Rep.Office"
},
{
"org_id": "1115",
"id_and_type": "1115Rep.Office",
"parent_and_type": "1079Region",
"name_cn": "太原代表处",
"date_from": "1980/ 01 / 01 00:00:00",
"name_en": "Taiyuan Rep Office, CN",
"parent_type": "Region",
"dept_code": "027876",
"date_to": null,
"parent": "1079",
"area_label": "Rep.Office"
},
{
"org_id": "649991",
"id_and_type": "649991Rep.Office",
"parent_and_type": "4199Region",
"name_cn": "测试数据广东代表处",
"date_from": "2012/ 07 / 28 00:00:00",
"name_en": "test data China Region Guangdong Rep Office",
"parent_type": "Region",
"dept_code": "035628",
"date_to": null,
"parent": "4199",
"area_label": "Rep.Office"
},
{
"org_id": "100000",
"id_and_type": "100000Rep.Office",
"parent_and_type": "606804Region",
"name_cn": "加勒比海代表处",
"date_from": "2013/ 09 / 29 00:00:00",
"name_en": "Caribbean Rep Office",
"parent_type": "Region",
"dept_code": "037549",
"date_to": null,
"parent": "606804",
"area_label": "Rep.Office"
},
{
"org_id": "1125",
"id_and_type": "1125Rep.Office",
"parent_and_type": "1079Region",
"name_cn": "兰州代表处",
"date_from": "1980/ 01 / 01 00:00:00",
"name_en": "Lanzhou Rep Office, CN",
"parent_type": "Region",
"dept_code": "028017",
"date_to": null,
"parent": "1079",
"area_label": "Rep.Office"
}
]
},
"Office": {
"area": [
{
"org_id": "610453",
"id_and_type": "610453Office",
"parent_and_type": "100000Rep. Office",
"name_cn": "牙买加工作室",
"date_from": "2007/11/26 00:00:00",
"name_en": "Jamaica Office",
"parent_type": "Rep. Office",
"dept_code": "025641",
"date_to": null,
"parent": "100000",
"area_label": "Office"
},
{
"org_id": "615077",
"id_and_type": "615077Office",
"parent_and_type": "100000Rep. Office",
"name_cn": "巴拿马工作室",
"date_from": "2008/07/08 00:00:00",
"name_en": "Panama Office",
"parent_type": "Rep. Office",
"dept_code": "025656",
"date_to": null,
"parent": "100000",
"area_label": "Office"
},
{
"org_id": "620058",
"id_and_type": "620058Office",
"parent_and_type": "100000Rep. Office",
"name_cn": "多米尼加工作室",
"date_from": "2009/05/21 00:00:00",
"name_en": "Dominica Office",
"parent_type": "Rep. Office",
"dept_code": "025659",
"date_to": null,
"parent": "100000",
"area_label": "Office"
},
{
"org_id": "649896",
"id_and_type": "649896Office",
"parent_and_type": "1125Rep. Office",
"name_cn": "西宁工作室",
"date_from": "2012/07/12 00:00:00",
"name_en": "Xining Office, CN",
"parent_type": "Rep. Office",
"dept_code": "035560",
"date_to": null,
"parent": "1125",
"area_label": "Office"
},
{
"org_id": "661414",
"id_and_type": "661414Office",
"parent_and_type": "649991Rep. Office",
"name_cn": "测试数据广州工作室",
"date_from": "2016/03/28 00:00:00",
"name_en": "test data China Region Guangzhou Office",
"parent_type": "Rep. Office",
"dept_code": "041626",
"date_to": null,
"parent": "649991",
"area_label": "Office"
},
{
"org_id": "661415",
"id_and_type": "661415Office",
"parent_and_type": "649991Rep. Office",
"name_cn": "测试数据深圳工作室",
"date_from": "2016/03/28 00:00:00",
"name_en": "test data China Region Shenzhen Office",
"parent_type": "Rep. Office",
"dept_code": "041627",
"date_to": null,
"parent": "649991",
"area_label": "Office"
},
{
"org_id": "661416",
"id_and_type": "661416Office",
"parent_and_type": "649991Rep. Office",
"name_cn": "测试数据东莞工作室",
"date_from": "2016/03/28 00:00:00",
"name_en": "test data China Region Dongguan Office",
"parent_type": "Rep. Office",
"dept_code": "041628",
"date_to": null,
"parent": "649991",
"area_label": "Office"
},
{
"org_id": "661417",
"id_and_type": "661417Office",
"parent_and_type": "649991Rep. Office",
"name_cn": "测试数据佛山工作室",
"date_from": "2016/03/28 00:00:00",
"name_en": "test data China Region Foshan Office",
"parent_type": "Rep. Office",
"dept_code": "041629",
"date_to": null,
"parent": "649991",
"area_label": "Office"
}
]
}
}

View File

@ -1,108 +0,0 @@
{
"area": [
{
"org_id": "610453",
"id_and_type": "610453Office",
"parent_and_type": "652495Rep. Office",
"name_cn": "牙买加办事处",
"date_from": "2007/11/26 00:00:00",
"name_en": "Jamaica Office",
"parent_type": "Rep. Office",
"dept_code": "025641",
"date_to": null,
"parent": "652495",
"area_label": "Office"
},
{
"org_id": "615077",
"id_and_type": "615077Office",
"parent_and_type": "652495Rep. Office",
"name_cn": "巴拿马办事处",
"date_from": "2008/07/08 00:00:00",
"name_en": "Panama Office",
"parent_type": "Rep. Office",
"dept_code": "025656",
"date_to": null,
"parent": "652495",
"area_label": "Office"
},
{
"org_id": "620058",
"id_and_type": "620058Office",
"parent_and_type": "652495Rep. Office",
"name_cn": "多米尼加办事处",
"date_from": "2009/05/21 00:00:00",
"name_en": "Dominica Office",
"parent_type": "Rep. Office",
"dept_code": "025659",
"date_to": null,
"parent": "652495",
"area_label": "Office"
},
{
"org_id": "649896",
"id_and_type": "649896Office",
"parent_and_type": "1125Rep. Office",
"name_cn": "西宁办事处",
"date_from": "2012/07/12 00:00:00",
"name_en": "Xining Office, CN",
"parent_type": "Rep. Office",
"dept_code": "035560",
"date_to": null,
"parent": "1125",
"area_label": "Office"
},
{
"org_id": "661414",
"id_and_type": "661414Office",
"parent_and_type": "649991Rep. Office",
"name_cn": "A公司XX地区部广州办事处",
"date_from": "2016/03/28 00:00:00",
"name_en": "Consumer BG Greater China Region Guangzhou Office",
"parent_type": "Rep. Office",
"dept_code": "041626",
"date_to": null,
"parent": "649991",
"area_label": "Office"
},
{
"org_id": "661415",
"id_and_type": "661415Office",
"parent_and_type": "649991Rep. Office",
"name_cn": "A公司XX地区部深圳办事处",
"date_from": "2016/03/28 00:00:00",
"name_en": "Consumer BG Greater China Region Shenzhen Office",
"parent_type": "Rep. Office",
"dept_code": "041627",
"date_to": null,
"parent": "649991",
"area_label": "Office"
},
{
"org_id": "661416",
"id_and_type": "661416Office",
"parent_and_type": "649991Rep. Office",
"name_cn": "A公司XX地区部东莞办事处",
"date_from": "2016/03/28 00:00:00",
"name_en": "Consumer BG Greater China Region Dongguan Office",
"parent_type": "Rep. Office",
"dept_code": "041628",
"date_to": null,
"parent": "649991",
"area_label": "Office"
},
{
"org_id": "661417",
"id_and_type": "661417Office",
"parent_and_type": "649991Rep. Office",
"name_cn": "A公司XX地区部佛山办事处",
"date_from": "2016/03/28 00:00:00",
"name_en": "Consumer BG Greater China Region Foshan Office",
"parent_type": "Rep. Office",
"dept_code": "041629",
"date_to": null,
"parent": "649991",
"area_label": "Office"
}
]
}

View File

@ -1,95 +0,0 @@
{
"area": [
{
"org_id": "608076",
"id_and_type": "608076Region",
"parent_and_type": "650561JCR",
"name_cn": "火星终端子公司",
"date_from": "2007/08/06 00:00:00",
"name_en": "SZ Device USA",
"parent_type": "JCR",
"dept_code": "024387",
"date_to": null,
"parent": "650561",
"area_label": "Region"
},
{
"org_id": "606661",
"id_and_type": "606661Region",
"parent_and_type": "654434JCR",
"name_cn": "中东地区部",
"date_from": "2007/04/06 00:00:00",
"name_en": "Middle East Region",
"parent_type": "JCR",
"dept_code": "026699",
"date_to": null,
"parent": "654434",
"area_label": "Region"
},
{
"org_id": "611900",
"id_and_type": "611900Region",
"parent_and_type": "654434JCR",
"name_cn": "加拿大代表处",
"date_from": "2008/04/09 00:00:00",
"name_en": "Canada Rep Office",
"parent_type": "JCR",
"dept_code": "027339",
"date_to": null,
"parent": "654434",
"area_label": "Region"
},
{
"org_id": "1079",
"id_and_type": "1079Region",
"parent_and_type": "654434JCR",
"name_cn": "中国地区部",
"date_from": "1980/01/01 00:00:00",
"name_en": "China Region",
"parent_type": "JCR",
"dept_code": "027425",
"date_to": null,
"parent": "654434",
"area_label": "Region"
},
{
"org_id": "4199",
"id_and_type": "4199Region",
"parent_and_type": "3623JCR",
"name_cn": "A公司XX地区部",
"date_from": "2005/06/29 00:00:00",
"name_en": "Consumer BG Greater China Region",
"parent_type": "JCR",
"dept_code": "024207",
"date_to": null,
"parent": "3623",
"area_label": "Region"
},
{
"org_id": "653596",
"id_and_type": "653596Region",
"parent_and_type": "037852JCR",
"name_cn": "国内销售与服务部",
"date_from": "2014/03/18 00:00:00",
"name_en": "Domestic Sales & Service Dept",
"parent_type": "JCR",
"dept_code": "037985",
"date_to": null,
"parent": "037852",
"area_label": "Region"
},
{
"org_id": "606804",
"id_and_type": "606804Region",
"parent_and_type": "654434JCR",
"name_cn": "西欧地区部",
"date_from": "2007/04/19 00:00:00",
"name_en": "West European Region",
"parent_type": "JCR",
"dept_code": "024931",
"date_to": null,
"parent": "654434",
"area_label": "Region"
}
]
}

View File

@ -1,82 +0,0 @@
{
"area": [
{
"org_id": "1112",
"id_and_type": "1112Rep.Office",
"parent_and_type": "1079Region",
"name_cn": "北京代表处",
"date_from": "1980/ 01 / 01 00:00:00",
"name_en": "Beijing Rep Office, CN",
"parent_type": "Region",
"dept_code": "027848",
"date_to": null,
"parent": "1079",
"area_label": "Rep.Office"
},
{
"org_id": "1114",
"id_and_type": "1114Rep.Office",
"parent_and_type": "1079Region",
"name_cn": "天津代表处",
"date_from": "1980/ 01 / 01 00:00:00",
"name_en": "Tianjin Rep Office, CN",
"parent_type": "Region",
"dept_code": "027862",
"date_to": null,
"parent": "1079",
"area_label": "Rep.Office"
},
{
"org_id": "1115",
"id_and_type": "1115Rep.Office",
"parent_and_type": "1079Region",
"name_cn": "太原代表处",
"date_from": "1980/ 01 / 01 00:00:00",
"name_en": "Taiyuan Rep Office, CN",
"parent_type": "Region",
"dept_code": "027876",
"date_to": null,
"parent": "1079",
"area_label": "Rep.Office"
},
{
"org_id": "649991",
"id_and_type": "649991Rep.Office",
"parent_and_type": "4199Region",
"name_cn": "A公司XX地区部广东代表处",
"date_from": "2012/ 07 / 28 00:00:00",
"name_en": "Consumer BG Greater China Region Guangdong Rep Office",
"parent_type": "Region",
"dept_code": "035628",
"date_to": null,
"parent": "4199",
"area_label": "Rep.Office"
},
{
"org_id": "652495",
"id_and_type": "652495Rep.Office",
"parent_and_type": "606804Region",
"name_cn": "加勒比海代表处",
"date_from": "2013/ 09 / 29 00:00:00",
"name_en": "Caribbean Rep Office",
"parent_type": "Region",
"dept_code": "037549",
"date_to": null,
"parent": "606804",
"area_label": "Rep.Office"
},
{
"org_id": "1125",
"id_and_type": "1125Rep.Office",
"parent_and_type": "1079Region",
"name_cn": "兰州代表处",
"date_from": "1980/ 01 / 01 00:00:00",
"name_en": "Lanzhou Rep Office, CN",
"parent_type": "Region",
"dept_code": "028017",
"date_to": null,
"parent": "1079",
"area_label": "Rep.Office"
}
]
}

View File

@ -1,103 +0,0 @@
[
{
"parent_instance_name": null,
"value": 5,
"assigneeColumn": null,
"remark": null,
"task_create_by": "uuid~dGVzdDE=",
"task_id": "E92_test1_467679ee0f424db98e2c2d673c6009df",
"appid": "app_000000040141",
"instance_end_time": "",
"ext": {},
"node_id": "managerId",
"task_admin": [],
"instance_status": "1",
"instance_extend": {},
"_id": "56552e1fa0957029ffcce971",
"hw_hae_paging": {
"startIndex": 1,
"totalRows": 2,
"curPage": 1,
"pageSize": 15,
"endIndex": 15,
"totalPages": 1
},
"process_key": "processMobile",
"instance_starter": "uuid~dGVzdDE=",
"instance_create_time": "2015-11-25 11:42:23",
"instance_id": "E92_test1_d6b728c58fbf428b95dba1457d254bc2",
"task_due_time": "",
"task_candidate": [],
"last_update_time": "2015-11-25 11:42:23",
"attach_id": "A76bd0ebf664b42ab8ae76e4968ba95d6",
"task_reader": [
"uuid~dGVzdDE="
],
"process_name": "手机话费报销申请",
"approver": [],
"task_name": "主管审批",
"modification_num": "1",
"task_status": "1",
"process_version": "9",
"task_assignee": [
"uuid~dGVzdDE="
],
"reader": [
"uuid~dGVzdDE="
],
"business_key": "50f7f96d-9808-431f-99bc-e4593002318f",
"task_end_time": "",
"last_update_by": "uuid~dGVzdDE=",
"parent_instance_id": null,
"node_name": "主管审批",
"task_url": "toApprove",
"engine_name": "E92",
"task_create_time": "2015-11-25 11:42:23.000168"
},
{
"parent_instance_name": null,
"assigneeColumn": null,
"remark": null,
"task_create_by": "uuid~dGVzdDE=",
"task_id": "E4_test2_1616635ea8e8452481545f585dbd5979",
"appid": "app_000000040141",
"instance_end_time": "",
"ext": {},
"node_id": "managerId",
"task_admin": [],
"instance_status": "1",
"instance_extend": {},
"_id": "56551c55a0957029ffcce94d",
"process_key": "processMobile",
"instance_starter": "uuid~dGVzdDE=",
"instance_create_time": "2015-11-25 10:26:28",
"instance_id": "E4_test2_d5ad0716628e48cbad3bb9828d998109",
"task_due_time": "",
"task_candidate": [],
"last_update_time": "2015-11-25 10:26:28",
"attach_id": "A76bd0ebf664b42ab8ae76e4968ba95d6",
"task_reader": [
"uuid~dGVzdDE="
],
"process_name": "手机话费报销申请",
"approver": [],
"task_name": "主管审批",
"modification_num": "1",
"task_status": "1",
"process_version": "9",
"task_assignee": [
"uuid~dGVzdDE="
],
"reader": [
"uuid~dGVzdDE="
],
"business_key": "1a5bf156-6a09-4526-b015-340e6cea7488",
"task_end_time": "",
"last_update_by": "uuid~dGVzdDE=",
"parent_instance_id": null,
"node_name": "主管审批",
"task_url": "toApprove",
"engine_name": "E4",
"task_create_time": "2015-11-25 10:26:28.000966"
}
]

View File

@ -1,86 +0,0 @@
[
{
"programValidity": null,
"employeeNumber": "12345678",
"userType": "HWE",
"currentRole": null,
"currentProgramIds": null,
"validRoles": null,
"defaultRole": "otc:2749;",
"coalitionPermission": false,
"endDate": "2017-11-13T14:26:06.000+0800",
"dept": null,
"userId": 421000103624183,
"userAccount": "test1",
"userCN": "test1",
"email": "test1@test1.com",
"creationDate": "2012-08-17T11:26:18.000+0800",
"lastUpdateDate": "2015-03-30T14:27:34.000+0800",
"rowIdx": -1,
"creationUserCN": null,
"lastUpdateUserCN": null
},
{
"programValidity": null,
"employeeNumber": "12345678",
"userType": "WX",
"currentRole": null,
"currentProgramIds": null,
"validRoles": null,
"defaultRole": null,
"coalitionPermission": false,
"endDate": null,
"dept": null,
"userId": 435259704104388,
"userAccount": "test2",
"userCN": "test2",
"email": "test2@test2.com",
"creationDate": "2017-10-23T11:16:59.000+0800",
"lastUpdateDate": "2017-10-23T11:16:59.000+0800",
"rowIdx": -1,
"creationUserCN": null,
"lastUpdateUserCN": null
},
{
"programValidity": null,
"employeeNumber": "12345678",
"userType": "HWE",
"currentRole": null,
"currentProgramIds": null,
"validRoles": null,
"defaultRole": null,
"coalitionPermission": false,
"endDate": "2017-10-26T11:48:56.000+0800",
"dept": null,
"userId": 441047913162396,
"userAccount": "test3",
"userCN": "test3",
"email": "test3@test3.com",
"creationDate": "2015-01-06T09:38:41.000+0800",
"lastUpdateDate": "2017-10-10T15:13:28.000+0800",
"rowIdx": -1,
"creationUserCN": null,
"lastUpdateUserCN": null
},
{
"programValidity": null,
"employeeNumber": "12345678",
"userType": "WX",
"currentRole": null,
"currentProgramIds": null,
"validRoles": null,
"defaultRole": null,
"coalitionPermission": false,
"endDate": "2017-11-10T08:50:56.000+0800",
"dept": null,
"userId": 655783272594485,
"userAccount": "test4",
"userCN": "test4",
"email": "test4@test4.com",
"creationDate": "2017-10-10T18:22:33.000+0800",
"lastUpdateDate": "2017-10-10T18:22:33.000+0800",
"rowIdx": -1,
"creationUserCN": null,
"lastUpdateUserCN": null
}
]

View File

@ -1,86 +0,0 @@
[
{
"programValidity": null,
"employeeNumber": "test1",
"userType": "HWE",
"currentRole": null,
"currentProgramIds": null,
"validRoles": null,
"defaultRole": "otc:2749;",
"coalitionPermission": false,
"endDate": "2017-11-13T14:26:06.000+0800",
"dept": null,
"userId": 421000103624183,
"userAccount": "test1",
"userCN": "test1",
"email": "",
"creationDate": "2012-08-17T11:26:18.000+0800",
"lastUpdateDate": "2015-03-30T14:27:34.000+0800",
"rowIdx": -1,
"creationUserCN": null,
"lastUpdateUserCN": null
},
{
"programValidity": null,
"employeeNumber": "test10",
"userType": "WX",
"currentRole": null,
"currentProgramIds": null,
"validRoles": null,
"defaultRole": null,
"coalitionPermission": false,
"endDate": null,
"dept": null,
"userId": 435259704104388,
"userAccount": "test10",
"userCN": "test10",
"email": "",
"creationDate": "2017-10-23T11:16:59.000+0800",
"lastUpdateDate": "2017-10-23T11:16:59.000+0800",
"rowIdx": -1,
"creationUserCN": null,
"lastUpdateUserCN": null
},
{
"programValidity": null,
"employeeNumber": "test2",
"userType": "HWE",
"currentRole": null,
"currentProgramIds": null,
"validRoles": null,
"defaultRole": null,
"coalitionPermission": false,
"endDate": "2017-10-26T11:48:56.000+0800",
"dept": null,
"userId": 441047913162396,
"userAccount": "test2",
"userCN": "test2",
"email": "",
"creationDate": "2015-01-06T09:38:41.000+0800",
"lastUpdateDate": "2017-10-10T15:13:28.000+0800",
"rowIdx": -1,
"creationUserCN": null,
"lastUpdateUserCN": null
},
{
"programValidity": null,
"employeeNumber": "test3",
"userType": "WX",
"currentRole": null,
"currentProgramIds": null,
"validRoles": null,
"defaultRole": null,
"coalitionPermission": false,
"endDate": "2017-11-10T08:50:56.000+0800",
"dept": null,
"userId": 655783272594485,
"userAccount": "test3",
"userCN": "test3",
"email": "",
"creationDate": "2017-10-10T18:22:33.000+0800",
"lastUpdateDate": "2017-10-10T18:22:33.000+0800",
"rowIdx": -1,
"creationUserCN": null,
"lastUpdateUserCN": null
}
]

View File

@ -1,52 +0,0 @@
{
"currency": [
{
"symbol": "$",
"currency_code": "MZN"
},
{
"symbol": null,
"currency_code": "CNY"
},
{
"symbol": "*NULL*",
"currency_code": "CHE"
},
{
"symbol": "$",
"currency_code": "USD"
},
{
"symbol": null,
"currency_code": "VND"
},
{
"symbol": null,
"currency_code": "VUV"
},
{
"symbol": null,
"currency_code": "WST"
},
{
"symbol": null,
"currency_code": "XAF"
},
{
"symbol": null,
"currency_code": "IRU"
},
{
"symbol": null,
"currency_code": "IRE"
},
{
"symbol": null,
"currency_code": "BYN"
},
{
"symbol": null,
"currency_code": "HKD"
}
]
}

View File

@ -1,80 +0,0 @@
[
{
"l5_Organization_Id": null,
"errorInfo": null,
"l5_Dept_Code": null,
"l0_Name": "SZ技术",
"l3_Dept_Code": "041963",
"l2_Name": "测试数据XX人力资源部",
"date_From": "2016/04/2900: 00: 00",
"l6_Organization_Id": null,
"name": "BPIT&QM HRBP管理部",
"l1_Organization_Id": "1385",
"upper_Organization_Id": "1389",
"l0_Organization_Id": "1072",
"upper_Name": "测试数据XX人力资源部",
"business_Group_Id": "443",
"l3_Organization_Id": "662093",
"l6_Name": null,
"coa_Combination": "0021.000.0001.041963",
"l4_Name": null,
"l4_Organization_Id": null,
"dept_Code": "041963",
"dept_Level": "3",
"organization_Id": "662093",
"l0_Dept_Code": "022471",
"l2_Dept_Code": "023114",
"upper_Dept_Code": "023114",
"l1_Name": "测试数据XX管理部",
"l4_Dept_Code": null,
"last_Update_Date": "2017/05/2015: 14: 18",
"l2_Organization_Id": "1389",
"l5_Name": null,
"l1_Dept_Code": "023093",
"date_To": null,
"language": "CHN",
"region_Code": "0001",
"l6_Dept_Code": null,
"cost_Allocation_Keyflex_Id": "1563274",
"l3_Name": "BPIT&QM HRBP管理部"
},
{
"l5_Organization_Id": null,
"errorInfo": null,
"l5_Dept_Code": null,
"l0_Name": "SZ技术",
"l3_Dept_Code": "023286",
"l2_Name": "中央XX测试数据部",
"date_From": "2011/03/30 00:00:00",
"l6_Organization_Id": null,
"name": "XX应用实施部",
"l1_Organization_Id": "1404",
"upper_Organization_Id": "627453",
"l0_Organization_Id": "1072",
"upper_Name": "XX应用交付部",
"business_Group_Id": "443",
"l3_Organization_Id": "627453",
"l6_Name": null,
"coa_Combination": "0021.000.0001.022471",
"l4_Name": "XX应用实施部",
"l4_Organization_Id": "627409",
"dept_Code": "022471",
"dept_Level": "4",
"organization_Id": "627409",
"l0_Dept_Code": "022471",
"l2_Dept_Code": "023489",
"upper_Dept_Code": "023286",
"l1_Name": "测试数据室XX",
"l4_Dept_Code": "022471",
"last_Update_Date": "2017/11/14 12:32:32",
"l2_Organization_Id": "3864",
"l5_Name": null,
"l1_Dept_Code": "023338",
"date_To": null,
"language": "CHN",
"region_Code": "0001",
"l6_Dept_Code": null,
"cost_Allocation_Keyflex_Id": "1082225",
"l3_Name": "XX应用交付部"
}
]

View File

@ -1,168 +0,0 @@
[
{
"upperCode": "000001",
"list": [
{
"coa_Combination": null,
"hrCode": "022471",
"dept_Code": null,
"hrName": "SZ技术",
"coaCode": null
},
{
"coa_Combination": null,
"hrCode": "030055",
"dept_Code": null,
"hrName": "SZ海洋网络",
"coaCode": null
},
{
"coa_Combination": null,
"hrCode": "035021",
"dept_Code": null,
"hrName": "天闻数媒",
"coaCode": null
},
{
"coa_Combination": null,
"hrCode": "022279",
"dept_Code": null,
"hrName": "贝托SZ",
"coaCode": null
},
{
"coa_Combination": null,
"hrCode": "030736",
"dept_Code": null,
"hrName": "鼎桥通信",
"coaCode": null
}
]
},
{
"upperCode": "023114",
"list": [
{
"coa_Combination": null,
"hrCode": "041963",
"dept_Code": null,
"hrName": "BPIT&QM HRBP管理部",
"coaCode": "0021.000.0001.041963"
}
]
},
{
"upperCode": "038384",
"list": [
{
"coa_Combination": null,
"hrCode": "038759",
"dept_Code": null,
"hrName": "公共技术平台部",
"coaCode": "0021.000.0001.038759"
}
]
},
{
"upperCode": "022471",
"list": [
{
"coa_Combination": null,
"hrCode": "023338",
"dept_Code": null,
"hrName": "测试数据室XX",
"coaCode": "0021.000.0001.023338"
},
{
"coa_Combination": null,
"hrCode": "027425",
"dept_Code": null,
"hrName": "中国XX测试数据部",
"coaCode": "0021.000.0002.027425"
},
{
"coa_Combination": null,
"hrCode": "023093",
"dept_Code": null,
"hrName": "测试数据XX管理部",
"coaCode": "0021.000.0001.023093"
}
]
},
{
"upperCode": "023093",
"list": [
{
"coa_Combination": null,
"hrCode": "038370",
"dept_Code": null,
"hrName": "业务应用与XX测试数据部",
"coaCode": "0021.000.0001.038370"
},
{
"coa_Combination": null,
"hrCode": "038371",
"dept_Code": null,
"hrName": "企业架构与流程管理部",
"coaCode": "0021.000.0001.038371"
},
{
"coa_Combination": null,
"hrCode": "023114",
"dept_Code": null,
"hrName": "测试数据XX人力资源部",
"coaCode": "0021.000.0001.023114"
},
{
"coa_Combination": null,
"hrCode": "034899",
"dept_Code": null,
"hrName": "测试数据XX财经管理部",
"coaCode": "0021.000.0001.034899"
},
{
"coa_Combination": null,
"hrCode": "023221",
"dept_Code": null,
"hrName": "测试数据XX质量与运营部",
"coaCode": "0021.000.0001.023221"
}
]
},
{
"upperCode": "023338",
"list": [
{
"coa_Combination": null,
"hrCode": "023489",
"dept_Code": null,
"hrName": "中央XX测试数据部",
"coaCode": "0021.000.0001.023489"
}
]
},
{
"upperCode": "023489",
"list": [
{
"coa_Combination": null,
"hrCode": "023286",
"dept_Code": null,
"hrName": "XX应用交付部",
"coaCode": "0021.000.0001.023286"
}
]
},
{
"upperCode": "023286",
"list": [
{
"coa_Combination": null,
"hrCode": "022471",
"dept_Code": null,
"hrName": "XX应用实施部",
"coaCode": "0021.000.0001.022471"
}
]
}
]

View File

@ -1,32 +0,0 @@
[
{
"coaCode": "0021.000.0001.037106",
"hrCode": "037106",
"hrName": "无线网络业务架构与设计部",
"coaStatus": "1-有效-VALID"
},
{
"coaCode": "0021.000.0001.037271",
"hrCode": "037271",
"hrName": "服务架构与技术规划部",
"coaStatus": "1-有效-VALID"
},
{
"coaCode": "0021.000.0001.023475",
"hrCode": "023475",
"hrName": "测试数据室XX质量与运营部",
"coaStatus": "1-有效-VALID"
},
{
"coaCode": "0021.000.0001.023114",
"hrCode": "023114",
"hrName": "测试数据XX人力资源部",
"coaStatus": "1-有效-VALID"
},
{
"coaCode": "0021.000.0001.023093",
"hrCode": "023093",
"hrName": "测试数据XX管理部",
"coaStatus": "1-有效-VALID"
}
]

View File

@ -1,342 +0,0 @@
[
{
"id": "1",
"name": "GFD科技有限公司",
"userId": 421000103624183,
"area": "华东区",
"province": "福建省",
"city": "福州",
"contact": "许生",
"telephone": "13620211175",
"address": "福州",
"introduction": "公司技术和研发实力雄厚是国家863项目的参与者并被政府认定为“高新技术企业”。",
"employees": 800,
"created_date": "2014-04-30 00:56:00",
"boole": false,
"assets": "1000000",
"rate": 0.9
},
{
"id": "2",
"name": "WWW科技有限公司",
"userId": 421000103624183,
"area": "华南区",
"province": "广东省",
"city": "深圳",
"contact": "朱生",
"telephone": "16549849651",
"address": "深圳福田区",
"introduction": "公司技术和研发实力雄厚是国家863项目的参与者并被政府认定为“高新技术企业”。",
"employees": 300,
"created_date": "2016-07-08 12:36:22",
"boole": true,
"assets": "1500000",
"rate": 0.7
},
{
"id": "3",
"name": "RFV有限责任公司",
"userId": 441047913162396,
"area": "华南区",
"province": "广东省",
"city": "中山",
"contact": "秦生",
"telephone": "13145351232",
"address": "中山市",
"introduction": "公司技术和研发实力雄厚是国家863项目的参与者并被政府认定为“高新技术企业”。",
"employees": 1300,
"created_date": "2014-02-14 14:14:14",
"boole": false,
"assets": "1500000",
"rate": 0.6
},
{
"id": "4",
"name": "TGB科技有限公司",
"userId": 655783272594485,
"area": "华东区",
"province": "福建省",
"city": "龙岩",
"contact": "周生",
"telephone": "18920211175",
"address": "龙岩",
"introduction": "公司技术和研发实力雄厚是国家863项目的参与者并被政府认定为“高新技术企业”。",
"employees": 360,
"created_date": "2013-01-13 13:13:13",
"boole": true,
"assets": "1200000",
"rate": 0.5
},
{
"id": "5",
"name": "YHN科技有限公司",
"userId": 655783272594485,
"area": "华南区",
"province": "广东省",
"city": "韶关",
"contact": "郑生",
"telephone": "18920211175",
"address": "韶关",
"introduction": "公司技术和研发实力雄厚是国家863项目的参与者并被政府认定为“高新技术企业”。",
"employees": 810,
"created_date": "2012-12-12 12:12:12",
"boole": true,
"assets": "1500000",
"rate": 0.6
},
{
"id": "6",
"name": "WSX科技有限公司",
"userId": 441047913162396,
"area": "华中区",
"province": "湖北省",
"city": "黄冈",
"contact": "陈生",
"telephone": "13120211175",
"address": "黄冈",
"introduction": "公司技术和研发实力雄厚是国家863项目的参与者并被政府认定为“高新技术企业”。",
"employees": 800,
"created_date": "2011-11-11 11:11:11",
"boole": true,
"assets": "1500000",
"rate": 0.6
},
{
"id": "7",
"name": "KBG物业有限公司",
"userId": 421000103624183,
"area": "华中区",
"province": "湖北省",
"city": "赤壁",
"contact": "王二",
"telephone": "13066932564",
"address": "赤壁",
"introduction": "公司治理结构严格按现代企业制度设计管理机构设置合理制度完善各部门分工明确、协作顺畅。拥有中、高级职称或大学本科以上学历的人员占职工总人数的80%以上,具有雄厚的资金实力和高度专业化的项目开发管理能力,是一支具有强烈的社会责任感和引领房地产业科技创新的地产新军。",
"employees": 400,
"created_date": "2016-04-30 23:56:00",
"boole": false,
"assets": "2000000",
"rate": 0.7
},
{
"id": "8",
"name": "深圳市福德宝网络技术有限公司",
"userId": 421000103624183,
"address": "厦门岛内",
"area": "华东区",
"assets": "2000000",
"boole": true,
"city": "厦门",
"contact": "李四",
"created_date": "2016-06-03 13:53:25",
"employees": 540,
"introduction": "公司技术和研发实力雄厚是国家863项目的参与者并被政府认定为“高新技术企业”。",
"province": "福建省",
"rate": 0.6,
"telephone": "15875599279"
},
{
"id": "9",
"name": "UJM有限责任公司",
"userId": 421000103624183,
"area": "华南区",
"province": "广西省",
"city": "南宁",
"contact": "段生",
"telephone": "15920211175",
"address": "南宁",
"introduction": "公司技术和研发实力雄厚是国家863项目的参与者并被政府认定为“高新技术企业”。",
"employees": 750,
"created_date": "2014-04-21 11:56:00",
"boole": true,
"assets": "1500000",
"rate": 0.6
},
{
"id": "10",
"name": "IKA有限责任公司",
"userId": 421000103624183,
"area": "华南区",
"province": "广西省",
"city": "北海",
"contact": "谭生",
"telephone": "15820211175",
"address": "北海",
"introduction": "公司技术和研发实力雄厚是国家863项目的参与者并被政府认定为“高新技术企业”。",
"employees": 400,
"created_date": "2014-09-30 00:56:00",
"boole": false,
"assets": "110000",
"rate": 0.11
},
{
"id": "11",
"name": "TIG管理有限公司",
"userId": 421000103624183,
"area": "华南区",
"province": "广西省",
"city": "桂林",
"contact": "陈生",
"telephone": "13120211175",
"address": "桂林",
"introduction": "公司技术和研发实力雄厚是国家863项目的参与者并被政府认定为“高新技术企业”。",
"employees": 900,
"created_date": "2014-11-30 00:56:00",
"boole": true,
"assets": "120000",
"rate": 0.13
},
{
"id": "12",
"name": "GGT科技有限公司",
"userId": 441047913162396,
"area": "西南区",
"province": "云南省",
"city": "昆明",
"contact": "周生",
"telephone": "13120211175",
"address": "昆明",
"introduction": "公司技术和研发实力雄厚是国家863项目的参与者并被政府认定为“高新技术企业”。",
"employees": 500,
"created_date": "2014-03-20 02:50:00",
"boole": false,
"assets": "100000",
"rate": 0.1
},
{
"id": "13",
"name": "YYS有限公司",
"userId": 441047913162396,
"area": "西南区",
"province": "云南省",
"city": "西双版纳",
"contact": "廖生",
"telephone": "13120211175",
"address": "西双版纳",
"introduction": "公司技术和研发实力雄厚是国家863项目的参与者并被政府认定为“高新技术企业”。",
"employees": 985,
"created_date": "2015-07-28 11:37:00",
"boole": true,
"assets": "120000",
"rate": 0.12
},
{
"id": "14",
"name": "VBN有限责任公司",
"userId": 421000103624183,
"area": "西南区",
"province": "云南省",
"city": "大理",
"contact": "欧生",
"telephone": "15820211175",
"address": "大理",
"introduction": "公司技术和研发实力雄厚是国家863项目的参与者并被政府认定为“高新技术企业”。",
"employees": 598,
"created_date": "2014-04-30 00:56:00",
"boole": false,
"assets": "220000",
"rate": 0.22
},
{
"id": "15",
"name": "深圳XX科技有限公司",
"userId": 441047913162396,
"area": "华中区",
"province": "湖北省",
"city": "武汉",
"contact": "阮生",
"telephone": "18920211175",
"address": "武汉",
"introduction": "公司技术和研发实力雄厚是国家863项目的参与者并被政府认定为“高新技术企业”。",
"employees": 725,
"created_date": "2014-04-30 00:56:00",
"boole": true,
"assets": "2500000",
"rate": 0.8
},
{
"id": "16",
"name": "深圳XX信息技术有限公司",
"userId": 421000103624183,
"area": "华中区",
"province": "湖北省",
"city": "十堰",
"contact": "邓生",
"telephone": "13120211175",
"address": "十堰",
"introduction": "公司技术和研发实力雄厚是国家863项目的参与者并被政府认定为“高新技术企业”。",
"employees": 632,
"created_date": "2014-07-30 02:44:00",
"boole": true,
"assets": "3000000",
"rate": 0.85
},
{
"id": "17",
"name": "深圳XX餐饮管理有限公司",
"userId": 441047913162396,
"area": "华中区",
"province": "湖北省",
"city": "潜江",
"contact": "罗生",
"telephone": "13520211175",
"address": "潜江",
"introduction": "公司技术和研发实力雄厚是国家863项目的参与者并被政府认定为“高新技术企业”。",
"employees": 246,
"created_date": "2013-04-30 00:56:00",
"boole": false,
"assets": "2000000",
"rate": 0.7
},
{
"id": "18",
"name": "珠海XX科技有限公司",
"userId": 441047913162396,
"area": "华南区",
"province": "广东省",
"city": "珠海",
"contact": "黄生",
"telephone": "13120211175",
"address": "珠海香洲区",
"introduction": "公司技术和研发实力雄厚是国家863项目的参与者并被政府认定为“高新技术企业”。",
"employees": 592,
"created_date": "2014-05-30 01:00:00",
"boole": false,
"assets": "1800000",
"rate": 0.66
},
{
"id": "19",
"name": "珠海XX医疗科技有限公司",
"userId": 441047913162396,
"area": "华南区",
"province": "广东省",
"city": "广州",
"contact": "刘生",
"telephone": "13820211175",
"address": "广州天河区",
"introduction": "公司技术和研发实力雄厚是国家863项目的参与者并被政府认定为“高新技术企业”。",
"employees": 851,
"created_date": "2014-04-29 08:56:00",
"boole": false,
"assets": "100000",
"rate": 0.1
},
{
"id": "20",
"name": "东莞XX礼品有限公司",
"userId": 421000103624183,
"area": "华中区",
"province": "湖北省",
"city": "襄阳",
"contact": "范生",
"telephone": "13120211175",
"address": "襄阳",
"introduction": "公司技术和研发实力雄厚是国家863项目的参与者并被政府认定为“高新技术企业”。",
"employees": 394,
"created_date": "2014-04-28 10:56:00",
"boole": true,
"assets": "400000",
"rate": 0.4
}
]

View File

@ -1,93 +0,0 @@
[
{
"id": "1",
"pid": "0",
"name": "GFD科技有限公司",
"area": "华东区",
"employees": "800"
},
{
"id": "15",
"pid": "1",
"name": "GFD科技股份有限子公司",
"area": "华东区",
"employees": "700"
},
{
"id": "2",
"pid": "0",
"name": "WWWW科技有限公司",
"area": "华南区",
"employees": "500"
},
{
"id": "22",
"pid": "2",
"name": "WWWW科技股份有限子公司",
"area": "华南区",
"employees": "720"
},
{
"id": "3",
"pid": "4",
"name": "RFV有限责任公司",
"area": "华南区",
"employees": "300"
},
{
"id": "4",
"pid": "0",
"name": "TGB有限公司",
"area": "华南区",
"employees": "360"
},
{
"id": "5",
"pid": "4",
"name": "YHN科技有限公司",
"area": "华南区",
"employees": "810"
},
{
"id": "6",
"pid": "5",
"name": "WSX科技有限公司",
"area": "华南区",
"employees": "800"
},
{
"id": "7",
"pid": "0",
"name": "XX物业有限公司",
"area": "华南区",
"employees": "400"
},
{
"id": "8",
"pid": "7",
"name": "深圳市XX网络技术有限公司",
"area": "华南区",
"employees": "540"
},
{
"id": "9",
"pid": "5",
"name": "UJM有限责任公司",
"area": "华南区",
"employees": "750"
},
{
"id": "10",
"pid": "7",
"name": "IK有限责任公司",
"area": "华南区",
"employees": "400"
},
{
"id": "23",
"pid": "10",
"name": "IK有限责任股份有限公司",
"area": "华南区",
"employees": "455"
}
]

View File

@ -1,20 +0,0 @@
[
{
"dept_Code": "022471",
"remarks": null,
"approval_Person": "test1",
"approval_Category": "0303"
},
{
"dept_Code": "041963",
"remarks": "权限申请",
"approval_Person": "test2",
"approval_Category": "0303"
},
{
"dept_Code": "041963",
"remarks": "资产申请",
"approval_Person": "test3",
"approval_Category": "0303"
}
]

View File

@ -1,87 +0,0 @@
{
"more": [
1
],
"company": [
{
"kw_control_status": "Branches/分公司",
"tx_delegate": "test1 95270007/SZ,",
"kw_in_group": "Y",
"tx_type_en": "Domestic",
"tx_corporation": "SZ Technologies Co., Ltd. Guangzhou Branch",
"tx_person": null,
"tx_country_code": "CN",
"tx_corporation_cn": "SZ技术有限公司广州分公司",
"last_modified_date": "2016/05/03 14:04:48",
"kwregion": "China Region",
"txcity": "广州/Guangzhou",
"tx_country": "中国/China",
"tx_entity_type": "in operation",
"tx_corporation_local": "SZ技术有限公司广州分公司",
"tx_type_cn": "国内",
"dtincorporation": "2009-08-24",
"txaddress": "广州市越秀区环市东路",
"tx_coa": "0231"
},
{
"kw_control_status": "Subsidiaries/子公司",
"tx_delegate": "test2 95270008/SZ,",
"kw_in_group": "Y",
"tx_type_en": "Overseas",
"tx_corporation": "SZ Network USA, Inc.",
"tx_person": null,
"tx_country_code": "US",
"tx_corporation_cn": "SZ网络MG有限公司",
"last_modified_date": "2016/10/29 11:18:30",
"kwregion": "America Rep Office",
"txcity": "Dallas, Texas",
"tx_country": "MG/United States",
"tx_entity_type": "closed",
"tx_corporation_local": "SZ Network USA, Inc.",
"tx_type_cn": "海外",
"dtincorporation": "2010-03-12",
"txaddress": "\"350 North St. Paul StreetDallas\"",
"tx_coa": "0741"
},
{
"kw_control_status": "Controlled Entities/合营公司",
"tx_delegate": "张三,",
"kw_in_group": "Y",
"tx_type_en": "Overseas",
"tx_corporation": "H.S. USA,INC.",
"tx_person": "张三,李四,",
"tx_country_code": "US",
"tx_corporation_cn": "MG有限公司美研所",
"last_modified_date": "2016/05/03 14:04:48",
"kwregion": "America Rep Office",
"txcity": "Cupertino",
"tx_country": "MG/United States",
"tx_entity_type": "closed",
"tx_corporation_local": "HS USA.,Inc",
"tx_type_cn": "海外",
"dtincorporation": "2008-09-03",
"txaddress": "1209 Orange Street,City of Wilmington,County of New Castle",
"tx_coa": "7061"
},
{
"kw_control_status": "Subsidiaries/子公司",
"tx_delegate": null,
"kw_in_group": "Y",
"tx_type_en": "Domestic",
"tx_corporation": "shenzhenSZ",
"tx_person": null,
"tx_country_code": "CN",
"tx_corporation_cn": "SZ技术有限公司",
"last_modified_date": "2016/11/15 14:41:24",
"kwregion": "China Region",
"txcity": "深圳市",
"tx_country": "中国/China",
"tx_entity_type": "setting up",
"tx_corporation_local": "深圳坂田SZ",
"tx_type_cn": "国内",
"dtincorporation": "2016-08-01",
"txaddress": "SZ技术有限公司",
"tx_coa": "0021"
}
]
}

View File

@ -1,94 +0,0 @@
{
"country": [
{
"territory_short_name": "China",
"description": "the People's Republic of China",
"language": "US",
"territory_code": "CN"
},
{
"territory_short_name": "France",
"description": "the French Republic",
"language": "US",
"territory_code": "FR"
},
{
"territory_short_name": "Finland",
"description": "the Republic of Finland",
"language": "US",
"territory_code": "FI"
},
{
"territory_short_name": "Kuwait",
"description": "the State of Kuwait",
"language": "US",
"territory_code": "KW"
},
{
"territory_short_name": "Moldova (the Republic of)",
"description": "the Republic of Moldova",
"language": "US",
"territory_code": "MD"
},
{
"territory_short_name": "Mozambique",
"description": "the Republic of Mozambique",
"language": "US",
"territory_code": "MZ"
},
{
"territory_short_name": "Niger",
"description": "the Republic of the Niger",
"language": "US",
"territory_code": "NE"
},
{
"territory_short_name": "Oman",
"description": "the Sultanate of Oman",
"language": "US",
"territory_code": "OM"
},
{
"territory_short_name": "Panama",
"description": "the Republic of Panama",
"language": "US",
"territory_code": "PA"
},
{
"territory_short_name": "Papua New Guinea",
"description": "the Independent State of Papua New Guinea",
"language": "US",
"territory_code": "PG"
},
{
"territory_short_name": "Serbia",
"description": "the Republic of Serbia",
"language": "US",
"territory_code": "RS"
},
{
"territory_short_name": "Senegal",
"description": "the Republic of Senegal",
"language": "US",
"territory_code": "SN"
},
{
"territory_short_name": "Tonga",
"description": "the Kingdom of Tonga",
"language": "US",
"territory_code": "TO"
},
{
"territory_short_name": "Uganda",
"description": "the Republic of Uganda",
"language": "US",
"territory_code": "UG"
},
{
"territory_short_name": "United States",
"description": "the United States of America",
"language": "US",
"territory_code": "US"
}
]
}

View File

@ -1,79 +0,0 @@
[
{
"sex": "M",
"l0_Name": "SZ技术",
"effective_Start_Date": "2011/10/14 00:00:00",
"l3_Dept_Code": "038384",
"person_Notes_Cn": "test1 12345678",
"l2_Name": "信息技术工程部",
"short_Name": "l12345678",
"effective_End_Date": "4712/12/31 00:00:00",
"person_Mail": "",
"name": "公共技术测试数据部门",
"location_second_area": "Shenzhen",
"upper_Name": "IT技术架构与测试数据部",
"coa_Combination": "0021.000.0001.038759",
"l4_Name": "公共技术测试数据部门",
"english_Name": "zhang san",
"dept_Code": "038759",
"employee_Number": "12345678",
"l0_Dept_Code": "022471",
"l2_Dept_Code": "023268",
"upper_Dept_Code": "038384",
"l1_Name": "测试数据部",
"location_country": "China",
"l4_Dept_Code": "038759",
"start_Date": "2011/08/01 00:00:00",
"contract_Location_Code": "010400",
"l1_Dept_Code": "023093",
"contract_Location_Name": "China\\Guangdong-Shenzhen",
"location_first_area": "Guangdong",
"last_Name": "张三",
"language": "CHN",
"l3_Name": "测试与测试数据部"
},
{
"contract_Location_Name": "China\\Guangdong-Shenzhen",
"location_second_area": "Shenzhen",
"effective_End_Date": "4712/12/31 00:00:00",
"l4_Name": "公共技术测试数据部门",
"l0_Dept_Code": "022471",
"l0_Name": "SZ技术",
"coa_Combination": "0021.000.0001.038759",
"last_Name": "李四",
"language": "CHN",
"l1_Name": "测试数据部",
"l3_Dept_Code": "038384",
"l4_Dept_Code": "038759",
"location_first_area": "Guangdong",
"l2_Name": "信息技术工程部",
"start_Date": "2014/04/21 00:00:00",
"l2_Dept_Code": "023268",
"effective_Start_Date": "2014/04/21 00:00:00",
"upper_Dept_Code": "038384",
"employee_Number": "12345678",
"dept_Code": "038759",
"contract_Location_Code": "010400",
"short_Name": "12345678",
"person_Mail": "",
"l3_Name": "IT技术架构与测试数据部",
"sex": "M",
"name": "公共技术测试数据部门",
"person_Notes_Cn": "test2 12345678",
"location_country": "China",
"upper_Name": "IT技术架构与测试数据部",
"l1_Dept_Code": "023093",
"english_Name": "li si"
},
{
"language": "CHN",
"employee_Number": "12345678",
"short_Name": "12345678",
"person_Mail": "",
"person_Notes_Cn": "wangwu 12345678",
"last_Name": "王五",
"english_Name": "wang wu",
"l0_Name": "SZ技术",
"l1_Name": "SZIT云"
}
]

View File

@ -1,18 +0,0 @@
[
{
"id": "b49cf1a5326b4ce797541064e48302d5",
"app_id": "app_common777777",
"code": "zhCN",
"name": "中文",
"i18n$$name": "中文",
"order_number": null
},
{
"id": "bdaedfe15dfd4ad8aa30bc05567de629",
"app_id": "app_common777777",
"code": "enUS",
"name": "English",
"i18n$$name": "English",
"order_number": null
}
]

View File

@ -1,265 +0,0 @@
[
{
"id": "ced3f89e313d4bbea1821a9942196d0d",
"app_id": "app_common666666",
"sub_app_id": null,
"code": "a",
"value": "b",
"language": "enUS",
"module": "hae.manager.catalog",
"memo": null,
"extend": null,
"created_by": "uuid~eldYMjc2MDg0",
"created_date": "2016-03-01 09:59:50.000000",
"last_updated_by": "uuid~eldYMjc2MDg0",
"last_updated_date": "2016-03-01 09:59:50.000000",
"modification_num": 1,
"type": "2",
"hw_hae_paging": {
"startIndex": 1,
"totalRows": 652,
"curPage": 1,
"pageSize": 15,
"endIndex": 15,
"totalPages": 44
}
},
{
"id": "70cdecbd47714568812433ac99895c9e",
"app_id": "app_common666666",
"sub_app_id": null,
"code": "a",
"value": "a",
"language": "zhCN",
"module": "hae.manager.catalog",
"memo": null,
"extend": null,
"created_by": "uuid~eldYMjc2MDg0",
"created_date": "2016-03-01 09:59:50.000000",
"last_updated_by": "uuid~eldYMjc2MDg0",
"last_updated_date": "2016-03-01 09:59:50.000000",
"modification_num": 1,
"type": "2"
},
{
"id": "830cbe73d92f41fdaf11647fd70c7313",
"app_id": "app_common666666",
"sub_app_id": null,
"code": "hae.developer.Guideline.Environment",
"value": "环境及运维手册",
"language": "zhCN",
"module": "hae.manager.catalog",
"memo": null,
"extend": null,
"created_by": "uuid~dGVzdDE=",
"created_date": "2015-05-28 09:41:51.000000",
"last_updated_by": "uuid~dzAwMTk2MTgx",
"last_updated_date": "2015-09-01 10:55:50.000000",
"modification_num": 2,
"type": "2"
},
{
"id": "2c3d8b59b68948caa637fa857cfe2a17",
"app_id": "app_common666666",
"sub_app_id": null,
"code": "hae.developer.Guideline.FrontWebDocuments",
"value": "Web Development Docs",
"language": "enUS",
"module": "hae.manager.catalog",
"memo": null,
"extend": null,
"created_by": "uuid~dGVzdDE=",
"created_date": "2015-05-28 09:40:02.000000",
"last_updated_by": "uuid~dzAwMTk2MTgx",
"last_updated_date": "2015-09-01 10:55:50.000000",
"modification_num": 3,
"type": "2"
},
{
"id": "b1143eb90e224153b27c60bacf027ea8",
"app_id": "app_common666666",
"sub_app_id": null,
"code": "hae.developer.Guideline.FrontWebDocuments",
"value": "Web开发手册",
"language": "zhCN",
"module": "hae.manager.catalog",
"memo": null,
"extend": null,
"created_by": "uuid~dGVzdDE=",
"created_date": "2015-05-28 09:40:02.000000",
"last_updated_by": "uuid~dzAwMTk2MTgx",
"last_updated_date": "2015-09-01 10:55:50.000000",
"modification_num": 2,
"type": "2"
},
{
"id": "1477ebb28ad645d699dac39eae3ff945",
"app_id": "app_common666666",
"sub_app_id": null,
"code": "hae.developer.Guideline.WebDoc",
"value": "Web Document",
"language": "enUS",
"module": "hae.saas.i18n",
"memo": null,
"extend": null,
"created_by": "uuid~eFdYMjMzODM5",
"created_date": "2015-04-10 10:16:29.000000",
"last_updated_by": "uuid~dzAwMTk2MTgx",
"last_updated_date": "2015-09-01 10:55:49.000000",
"modification_num": 1,
"type": "1"
},
{
"id": "721f546b95ac484e9711033cb0613747",
"app_id": "app_common666666",
"sub_app_id": null,
"code": "hae.developer.Guideline.WebDoc",
"value": "前端WEB文档",
"language": "zhCN",
"module": "hae.saas.i18n",
"memo": null,
"extend": null,
"created_by": "uuid~eFdYMjMzODM5",
"created_date": "2015-04-10 10:16:29.000000",
"last_updated_by": "uuid~dzAwMTk2MTgx",
"last_updated_date": "2015-09-01 10:55:49.000000",
"modification_num": 1,
"type": "1"
},
{
"id": "af6c514babec4b33b980b026a516e217",
"app_id": "app_common666666",
"sub_app_id": null,
"code": "hae.developer.Guideline.webDoc",
"value": "WEB Document",
"language": "enUS",
"module": "hae.saas.i18n",
"memo": null,
"extend": null,
"created_by": "uuid~eFdYMjMzODM5",
"created_date": "2015-04-10 10:09:46.000000",
"last_updated_by": "uuid~dzAwMTk2MTgx",
"last_updated_date": "2015-09-01 10:55:49.000000",
"modification_num": 1,
"type": "1"
},
{
"id": "e71ada77514d4417b118e4d8fc9ec708",
"app_id": "app_common666666",
"sub_app_id": null,
"code": "hae.developer.Guideline.webDoc",
"value": "前端WEB文档",
"language": "zhCN",
"module": "hae.saas.i18n",
"memo": null,
"extend": null,
"created_by": "uuid~eFdYMjMzODM5",
"created_date": "2015-04-10 10:09:46.000000",
"last_updated_by": "uuid~dzAwMTk2MTgx",
"last_updated_date": "2015-09-01 10:55:49.000000",
"modification_num": 1,
"type": "1"
},
{
"id": "cf188cfc93e94d05bbbfc25f4d628550",
"app_id": "app_common666666",
"sub_app_id": null,
"code": "hae.developer.HelpTopic",
"value": "Help",
"language": "enUS",
"module": "hae.saas.i18n",
"memo": null,
"extend": null,
"created_by": "uuid~d1dYMjAzNDY3",
"created_date": "2015-04-07 15:56:15.000000",
"last_updated_by": "uuid~dzAwMTk2MTgx",
"last_updated_date": "2015-09-01 10:55:49.000000",
"modification_num": 19,
"type": "1"
},
{
"id": "4472e69546f4489b98772d5f4eaf5abf",
"app_id": "app_common666666",
"sub_app_id": null,
"code": "hae.developer.HelpTopic",
"value": "帮助",
"language": "zhCN",
"module": "hae.saas.i18n",
"memo": null,
"extend": null,
"created_by": "uuid~d1dYMjAzNDY3",
"created_date": "2015-04-07 15:56:15.000000",
"last_updated_by": "uuid~dzAwMTk2MTgx",
"last_updated_date": "2015-09-01 10:55:49.000000",
"modification_num": 1,
"type": "1"
},
{
"id": "a5ad6b57e7954fbfb9a19a295d924ce5",
"app_id": "app_common666666",
"sub_app_id": null,
"code": "hae.developer.HelpTopic.ConfigurePlatform",
"value": "Configuration Platform",
"language": "enUS",
"module": "hae.manager.catalog",
"memo": null,
"extend": null,
"created_by": "uuid~dGVzdDE=",
"created_date": "2015-05-28 10:19:41.000000",
"last_updated_by": "uuid~dzAwMTk2MTgx",
"last_updated_date": "2015-09-01 10:55:50.000000",
"modification_num": 2,
"type": "2"
},
{
"id": "bfb4547487b24321a6991bc65a8c5d8e",
"app_id": "app_common666666",
"sub_app_id": null,
"code": "hae.developer.HelpTopic.ConfigurePlatform",
"value": "配置平台",
"language": "zhCN",
"module": "hae.manager.catalog",
"memo": null,
"extend": null,
"created_by": "uuid~dGVzdDE=",
"created_date": "2015-05-28 10:19:41.000000",
"last_updated_by": "uuid~dzAwMTk2MTgx",
"last_updated_date": "2015-09-01 10:55:50.000000",
"modification_num": 1,
"type": "2"
},
{
"id": "960d6aadbe3b43a8932b5ca95ff18cf8",
"app_id": "app_common666666",
"sub_app_id": null,
"code": "hae.developer.HelpTopic.Expert",
"value": "Online Expert",
"language": "enUS",
"module": "hae.manager.catalog",
"memo": null,
"extend": null,
"created_by": "uuid~eDAwMTkyMDAw",
"created_date": "2015-06-01 14:33:52.000000",
"last_updated_by": "uuid~dzAwMTk2MTgx",
"last_updated_date": "2015-09-01 10:55:49.000000",
"modification_num": 2,
"type": "2"
},
{
"id": "d95f2707549e42e6a9cd75de4d429025",
"app_id": "app_common666666",
"sub_app_id": null,
"code": "hae.developer.HelpTopic.Expert",
"value": "专家在线",
"language": "zhCN",
"module": "hae.manager.catalog",
"memo": null,
"extend": null,
"created_by": "uuid~eDAwMTkyMDAw",
"created_date": "2015-06-01 14:33:52.000000",
"last_updated_by": "uuid~dzAwMTk2MTgx",
"last_updated_date": "2015-09-01 10:55:49.000000",
"modification_num": 1,
"type": "2"
}
]

View File

@ -1,10 +0,0 @@
[
{
"id": "ee2dcdfb6dc94b33b997db2fff25a1bf",
"module": "hae.saas.i18n",
"code": "pmallmng.exception.code.",
"type": "1",
"value": "sdfeeee",
"language": "zhCN"
}
]

View File

@ -1,92 +0,0 @@
[
{
"id": 1,
"pid": -1,
"name": "湖南",
"memo": ""
},
{
"id": 2,
"pid": -1,
"name": "湖北",
"memo": ""
},
{
"id": 3,
"pid": -1,
"name": "广东",
"memo": ""
},
{
"id": 4,
"pid": -1,
"name": "广西",
"memo": ""
},
{
"id": 5,
"pid": -1,
"name": "浙江",
"memo": ""
},
{
"id": 6,
"pid": -1,
"name": "西藏",
"memo": ""
},
{
"id": 7,
"pid": -1,
"name": "四川",
"memo": ""
},
{
"id": 8,
"pid": -1,
"name": "云南",
"memo": ""
},
{
"id": 9,
"pid": 1,
"name": "长沙",
"memo": ""
},
{
"id": 10,
"pid": 2,
"name": "武汉",
"memo": ""
},
{
"id": 11,
"pid": 3,
"name": "广州",
"memo": ""
},
{
"id": 12,
"pid": 3,
"name": "深圳",
"memo": ""
},
{
"id": 13,
"pid": 3,
"name": "东莞",
"memo": ""
},
{
"id": 14,
"pid": 3,
"name": "惠州",
"memo": ""
},
{
"id": 15,
"pid": 1,
"name": "岳阳",
"memo": ""
}
]

View File

@ -1,98 +0,0 @@
[
{
"id": 100,
"pId": 0,
"label": "node1",
"isParent": true
},
{
"id": 1,
"pId": 100,
"label": "node1.1",
"isParent": false
},
{
"id": 2,
"pId": 100,
"label": "node1.2",
"isParent": false
},
{
"id": 3,
"pId": 100,
"label": "node1.3",
"isParent": false
},
{
"id": 4,
"pId": 100,
"label": "node1.4",
"isParent": true
},
{
"id": 41,
"pId": 4,
"label": "node1.4.1",
"isParent": false
},
{
"id": 411,
"pId": 41,
"label": "node1.4.1.1",
"isParent": false
},
{
"id": 42,
"pId": 4,
"label": "node1.4.2",
"isParent": false
},
{
"id": 421,
"pId": 42,
"label": "node1.4.2.1",
"isParent": false
},
{
"id": 5,
"pId": 100,
"label": "node1.5",
"isParent": true
},
{
"id": 51,
"pId": 5,
"label": "node1.5.1",
"isParent": false
},
{
"id": 101,
"pId": 0,
"label": "node2",
"isParent": true
},
{
"id": 1011,
"pId": 101,
"label": "node2.1",
"isParent": false
},
{
"id": 102,
"pId": 0,
"label": "node3",
"isParent": true
},
{
"id": 1021,
"pId": 102,
"label": "node3.1",
"isParent": false
},
{
"id": 103,
"pId": 0,
"label": "node4",
"isParent": false
}
]

Binary file not shown.

Before

Width:  |  Height:  |  Size: 716 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 635 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 702 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 564 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 391 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 515 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 430 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 529 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 550 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 795 KiB

Some files were not shown because too many files have changed in this diff Show More