Compare commits
23 Commits
Author | SHA1 | Date |
---|---|---|
OpenTiny | 539ff30b4e | |
OpenTiny | 451d48a83f | |
OpenTiny | e4e749f86e | |
OpenTiny | b1027f0312 | |
OpenTiny | d8ca7ba73a | |
OpenTiny | b56a5a4b78 | |
OpenTiny | 015bdd19fe | |
OpenTiny | 1d1032ad08 | |
OpenTiny | 83941980aa | |
OpenTiny | c2bb26d34d | |
OpenTiny | f71a312cef | |
OpenTiny | 16f9f9e070 | |
OpenTiny | 05843de80f | |
OpenTiny | 0702d2f827 | |
OpenTiny | da747cc572 | |
OpenTiny | 568b18a0e1 | |
OpenTiny | c51427e40b | |
OpenTiny | 7cb3fdbe6d | |
OpenTiny | 4aa17e2f29 | |
OpenTiny | 510675e1c3 | |
OpenTiny | f396f871b9 | |
OpenTiny | 08590881a5 | |
OpenTiny | 3f28e32c52 |
|
@ -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"
|
||||
}
|
|
@ -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
|
||||
|
|
|
@ -6,4 +6,4 @@ steps:
|
|||
|
||||
tool_params:
|
||||
secsolar:
|
||||
source_dir: ./
|
||||
source_dir: ./
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
ignores:
|
||||
# Unused dependencies
|
||||
|
||||
# Unused devDependencies
|
||||
|
||||
# Missing dependencies
|
||||
|
||||
|
||||
ignore-patterns:
|
||||
- "node_modules"
|
|
@ -1,2 +1,7 @@
|
|||
dist
|
||||
runtime
|
||||
runtime
|
||||
dist2/
|
||||
dist2.7/
|
||||
dist3/
|
||||
node_modules
|
||||
examples/docs/public/assets/map/js
|
94
.eslintrc
|
@ -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"
|
||||
}
|
||||
}
|
|
@ -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'
|
||||
}
|
||||
}
|
|
@ -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
|
|
@ -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:
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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
|
|
@ -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 }}
|
|
@ -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 }}
|
|
@ -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 }}
|
|
@ -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
|
|
@ -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.
|
||||
# 非必须,自定义机器人翻译的前缀开始内容。
|
|
@ -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
|
|
@ -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
|
|
@ -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 }}
|
|
@ -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
|
|
@ -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
|
|
@ -0,0 +1,16 @@
|
|||
{
|
||||
"extends": [
|
||||
"development"
|
||||
],
|
||||
"hints": {
|
||||
"compat-api/html": [
|
||||
"default",
|
||||
{
|
||||
"ignore": [
|
||||
"script[type=module]"
|
||||
]
|
||||
}
|
||||
],
|
||||
"axe/language": "off"
|
||||
}
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
#!/bin/sh
|
||||
. "$(dirname "$0")/_/husky.sh"
|
||||
|
||||
npx lint-staged
|
||||
npx lint-staged
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
{
|
||||
"*.{js,jsx,ts,tsx,vue}": ["prettier --write", "eslint --fix"],
|
||||
"*.md": ["prettier --write"]
|
||||
}
|
7
.npmrc
|
@ -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
|
|
@ -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
|
||||
|
|
27
.prettierrc
|
@ -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"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
|
@ -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"]
|
||||
}
|
|
@ -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
|
||||
}
|
20
CHANGELOG.md
|
@ -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 组件:解决点击已选中选项无法关闭选择器的问题
|
162
CONTRIBUTING.md
|
@ -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)
|
||||
|
|
|
@ -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]`,将会执行 componentName1,componentName2 的测试用例,当改动的代码会影响组件时,需要声明这个结构。
|
||||
|
||||
- 注:本项目下的 `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)
|
2
LICENSE
|
@ -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
|
@ -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)
|
||||
|
|
|
@ -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)
|
25
build.sh
|
@ -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'
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
{
|
||||
"rules": {
|
||||
"no-empty": "off",
|
||||
"no-console": "off"
|
||||
}
|
||||
}
|
|
@ -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)
|
|
@ -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]`)
|
|
@ -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')))
|
|
@ -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.')
|
||||
}
|
|
@ -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()
|
|
@ -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()
|
||||
]
|
|
@ -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)
|
||||
}
|
|
@ -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.')
|
||||
}
|
|
@ -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
|
||||
}
|
|
@ -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()
|
|
@ -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
|
||||
})
|
||||
}
|
||||
})
|
|
@ -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
|
||||
}
|
|
@ -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.')
|
||||
}
|
309
build/utils.js
|
@ -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
|
||||
}
|
|
@ -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()
|
|
@ -1,6 +0,0 @@
|
|||
{
|
||||
"rules": {
|
||||
"no-console": "off",
|
||||
"no-unused-vars": "off"
|
||||
}
|
||||
}
|
|
@ -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
|
|
@ -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')))
|
|
@ -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.')
|
||||
}
|
|
@ -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()
|
||||
]
|
|
@ -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
|
|
@ -1 +0,0 @@
|
|||
export * from '@opentiny/vue-icon'
|
|
@ -1,5 +0,0 @@
|
|||
export * from '@opentiny/vue'
|
||||
import locale from '@opentiny/vue-locale'
|
||||
|
||||
// 这里需要在运行时导出国际化方法
|
||||
export { locale }
|
|
@ -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>
|
|
@ -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"
|
||||
]
|
||||
}
|
Before Width: | Height: | Size: 6.6 KiB |
|
@ -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>
|
|
@ -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"
|
||||
}
|
||||
]
|
||||
}
|
|
@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
|
@ -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"
|
||||
}
|
||||
]
|
||||
}
|
|
@ -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"
|
||||
}
|
||||
]
|
||||
}
|
|
@ -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"
|
||||
}
|
||||
]
|
||||
}
|
|
@ -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"
|
||||
}
|
||||
]
|
|
@ -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
|
||||
}
|
||||
]
|
|
@ -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
|
||||
}
|
||||
]
|
|
@ -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"
|
||||
}
|
||||
]
|
||||
}
|
|
@ -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应用交付部"
|
||||
}
|
||||
]
|
|
@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
|
@ -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"
|
||||
}
|
||||
]
|
|
@ -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
|
||||
}
|
||||
]
|
|
@ -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"
|
||||
}
|
||||
]
|
|
@ -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"
|
||||
}
|
||||
]
|
|
@ -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"
|
||||
}
|
||||
]
|
||||
}
|
|
@ -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"
|
||||
}
|
||||
]
|
||||
}
|
|
@ -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云"
|
||||
}
|
||||
]
|
|
@ -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
|
||||
}
|
||||
]
|
|
@ -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"
|
||||
}
|
||||
]
|
|
@ -1,10 +0,0 @@
|
|||
[
|
||||
{
|
||||
"id": "ee2dcdfb6dc94b33b997db2fff25a1bf",
|
||||
"module": "hae.saas.i18n",
|
||||
"code": "pmallmng.exception.code.",
|
||||
"type": "1",
|
||||
"value": "sdfeeee",
|
||||
"language": "zhCN"
|
||||
}
|
||||
]
|
|
@ -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": ""
|
||||
}
|
||||
]
|
|
@ -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
|
||||
}
|
||||
]
|
Before Width: | Height: | Size: 716 KiB |
Before Width: | Height: | Size: 635 KiB |
Before Width: | Height: | Size: 702 KiB |
Before Width: | Height: | Size: 564 KiB |
Before Width: | Height: | Size: 391 KiB |
Before Width: | Height: | Size: 515 KiB |
Before Width: | Height: | Size: 430 KiB |
Before Width: | Height: | Size: 529 KiB |
Before Width: | Height: | Size: 550 KiB |
Before Width: | Height: | Size: 795 KiB |