zory 3 týždňov pred
rodič
commit
8430a47b92
100 zmenil súbory, kde vykonal 749 pridanie a 9308 odobranie
  1. 1 1
      .env.development
  2. 1 1
      package.json
  3. BIN
      public/favicon.ico
  4. BIN
      public/img/favicon.ico
  5. BIN
      public/img/logo.png
  6. 0 1
      public/index.html
  7. BIN
      public/logo.png
  8. 50 35
      src/locales/lang/zh-cn.js
  9. 20 10
      src/router/systemRouter.js
  10. 0 48
      src/views/home/index.vue
  11. 0 27
      src/views/home/widgets/components/about.vue
  12. 0 98
      src/views/home/widgets/components/echarts.vue
  13. 0 12
      src/views/home/widgets/components/index.js
  14. 0 32
      src/views/home/widgets/components/progress.vue
  15. 0 40
      src/views/home/widgets/components/time.vue
  16. 0 41
      src/views/home/widgets/components/ver.vue
  17. 0 59
      src/views/home/widgets/components/welcome.vue
  18. 0 256
      src/views/home/widgets/index.vue
  19. 0 131
      src/views/home/work/components/myapp.vue
  20. 0 37
      src/views/home/work/index.vue
  21. 0 35
      src/views/login/components/commonPage.vue
  22. 207 0
      src/views/login/components/mobile.vue
  23. 161 0
      src/views/login/components/passwd.vue
  24. 0 127
      src/views/login/components/passwordForm.vue
  25. 0 74
      src/views/login/components/phoneForm.vue
  26. 5 0
      src/views/login/forget.vue
  27. 304 184
      src/views/login/index.vue
  28. 0 124
      src/views/login/resetPassword.vue
  29. 0 171
      src/views/login/userRegister.vue
  30. 0 52
      src/views/other/about.vue
  31. 0 58
      src/views/other/directive.vue
  32. 0 32
      src/views/other/fullpage.vue
  33. 0 60
      src/views/other/loadJS.vue
  34. 0 139
      src/views/other/verificate.vue
  35. 0 82
      src/views/other/viewTags.vue
  36. 0 124
      src/views/setting/client/index.vue
  37. 0 109
      src/views/setting/client/save.vue
  38. 0 153
      src/views/setting/dept/index.vue
  39. 0 116
      src/views/setting/dept/save.vue
  40. 0 103
      src/views/setting/dic/dic.vue
  41. 0 333
      src/views/setting/dic/index.vue
  42. 0 111
      src/views/setting/dic/list.vue
  43. 0 142
      src/views/setting/log/index.vue
  44. 0 54
      src/views/setting/log/info.vue
  45. 0 165
      src/views/setting/menu/index.vue
  46. 0 194
      src/views/setting/menu/save.vue
  47. 0 177
      src/views/setting/role/index.vue
  48. 0 190
      src/views/setting/role/permission.vue
  49. 0 107
      src/views/setting/role/save.vue
  50. 0 173
      src/views/setting/system/index.vue
  51. 0 120
      src/views/setting/table/index.vue
  52. 0 182
      src/views/setting/table/save.vue
  53. 0 175
      src/views/setting/task/index.vue
  54. 0 108
      src/views/setting/task/logs.vue
  55. 0 113
      src/views/setting/task/save.vue
  56. 0 193
      src/views/setting/user/index.vue
  57. 0 166
      src/views/setting/user/save.vue
  58. 0 17
      src/views/template/layout/blank.vue
  59. 0 39
      src/views/template/layout/layoutLCR.vue
  60. 0 23
      src/views/template/layout/layoutTCB.vue
  61. 0 42
      src/views/template/list/crud/detail.vue
  62. 0 158
      src/views/template/list/crud/index.vue
  63. 0 33
      src/views/template/list/crud/info.vue
  64. 0 114
      src/views/template/list/crud/save.vue
  65. 0 74
      src/views/template/list/son.vue
  66. 0 167
      src/views/template/list/tab.vue
  67. 0 128
      src/views/template/list/tree.vue
  68. 0 66
      src/views/template/list/width.vue
  69. 0 150
      src/views/template/other/stepform.vue
  70. 0 67
      src/views/test/autocode/index.vue
  71. 0 220
      src/views/test/autocode/list.vue
  72. 0 96
      src/views/test/codebug/index.vue
  73. 0 134
      src/views/userCenter/index.vue
  74. 0 46
      src/views/userCenter/user/account.vue
  75. 0 40
      src/views/userCenter/user/logs.vue
  76. 0 80
      src/views/userCenter/user/password.vue
  77. 0 30
      src/views/userCenter/user/pushSettings.vue
  78. 0 100
      src/views/userCenter/user/seting.vue
  79. 0 55
      src/views/userCenter/user/space.vue
  80. 0 18
      src/views/userCenter/user/upToEnterprise.vue
  81. 0 232
      src/views/vab/chart.vue
  82. 0 88
      src/views/vab/codeeditor.vue
  83. 0 120
      src/views/vab/contextmenu.vue
  84. 0 46
      src/views/vab/cron.vue
  85. 0 98
      src/views/vab/cropper.vue
  86. 0 28
      src/views/vab/dialog/dialog1.vue
  87. 0 28
      src/views/vab/dialog/dialog2.vue
  88. 0 101
      src/views/vab/dialog/index.vue
  89. 0 117
      src/views/vab/drag.vue
  90. 0 52
      src/views/vab/editor.vue
  91. 0 55
      src/views/vab/fileselect.vue
  92. 0 185
      src/views/vab/filterBar.vue
  93. 0 410
      src/views/vab/form.vue
  94. 0 131
      src/views/vab/formtable.vue
  95. 0 42
      src/views/vab/iconfont.vue
  96. 0 71
      src/views/vab/iconselect.vue
  97. 0 169
      src/views/vab/importexport.vue
  98. 0 67
      src/views/vab/mini.vue
  99. 0 49
      src/views/vab/print.vue
  100. 0 47
      src/views/vab/qrcode.vue

+ 1 - 1
.env.development

@@ -5,7 +5,7 @@ NODE_ENV = development
 VUE_APP_TITLE = 涤斐先生
 
 # 接口地址
-VUE_APP_API_BASEURL = https://mock.apifox.com/m1/4021385-0-default/api
+VUE_APP_API_BASEURL = http://127.0.0.1:8790/api
 
 # 本地端口
 VUE_APP_PORT = 2801

+ 1 - 1
package.json

@@ -1,5 +1,5 @@
 {
-	"name": "scui",
+	"name": "wash",
 	"version": "1.6.9",
 	"private": true,
 	"scripts": {

BIN
public/favicon.ico


BIN
public/img/favicon.ico


BIN
public/img/logo.png


+ 0 - 1
public/index.html

@@ -21,7 +21,6 @@
 		<div id="app" class="aminui">
 			<div class="app-loading">
 				<div class="app-loading__loader"></div>
-				<div class="app-loading__title"><%= VUE_APP_TITLE %></div>
 			</div>
 			<style>
 				.app-loading {position: absolute;top:0px;left:0px;right:0px;bottom:0px;display: flex;justify-content: center;align-items: center;flex-direction: column;background: #fff;}

BIN
public/logo.png


+ 50 - 35
src/locales/lang/zh-cn.js

@@ -1,39 +1,54 @@
 export default {
+	valide:{},
+	store:{
+		dashboard:{
+			orderTitle:"订单营业数据",
+			yestoday:"昨日:"
+		}
+	},
+	merchant:{},
 	login: {
-		slogan: '高性能 / 精致 / 优雅',
-		describe: '基于Vue3 + Element-Plus 的中后台前端解决方案。',
-		signInTitle: '用户登录',
-		accountLogin: '账号登录',
-		mobileLogin: '手机号登录',
-		rememberMe: '24小时免登录',
-		forgetPassword: '忘记密码',
-		signIn: '登录',
-		signInOther: '其他登录方式',
-		userPlaceholder: '用户名 / 手机 / 邮箱',
-		userError: '请输入用户名',
-		PWPlaceholder: '请输入密码',
-		PWError: '请输入密码',
-		admin: '管理员',
-		user: '用户',
-		mobilePlaceholder: '手机号码',
-		mobileError: '请输入手机号码',
-		smsPlaceholder: '短信验证码',
-		smsError: '请输入短信验证码',
-		smsGet: '获取验证码',
-		smsSent: '已发送短信至手机号码',
-		noAccount: '还没有账号?',
-		createAccount: '创建新账号',
-		wechatLoginTitle: '二维码登录',
-		wechatLoginMsg: '请使用微信扫一扫登录 | 模拟3秒后自动扫描',
-		wechatLoginResult: '已扫描 | 请在设备中点击授权登录'
+		slogan: "高性能 / 精致 / 优雅",
+		describe: "江苏水獭洗涤科技有限公司",
+		signInTitle: "用户登录",
+		accountLogin: "密码登录",
+		mobileLogin: "验证码登录",
+		rememberMe: "记住密码",
+		forgetPassword: "忘记密码",
+		signIn: "登录",
+		signUp: "免费创建账户",
+		signInFs: "前往飞书授权",
+		signInOther: "其他登录方式",
+		userName: "用户名",
+		PWName: "登录密码",
+		userPlaceholder: "请输入用户名",
+		userError: "请输入用户名",
+		PWPlaceholder: "请输入密码",
+		PWError: "请输入密码",
+		admin: "管理员",
+		user: "用户",
+		mobilePlaceholder: "手机号码",
+		mobileError: "请输入手机号码",
+		smsPlaceholder: "短信验证码",
+		smsError: "请输入短信验证码",
+		smsGet: "获取验证码",
+		smsSent: "已发送短信至手机号码",
+		noAccount: "还没有账号?",
+		yesAccount: "已有账号?",
+		loginAccount: "去登陆",
+		createAccount: "创建新账号",
+		wechatLoginTitle: "二维码登录",
+		wechatLoginMsg: "请使用微信扫一扫登录 | 模拟3秒后自动扫描",
+		wechatLoginResult: "已扫描 | 请在设备中点击授权登录",
+		privacy: "请先阅读《隐私协议》",
 	},
 	user: {
-		dynamic: '近期动态',
-		info: '个人信息',
-		settings: '设置',
-		nightmode: '黑夜模式',
-		nightmode_msg: '适合光线较弱的环境,当前黑暗模式为beta版本',
-		language: '语言',
-		language_msg: '翻译进行中,暂翻译了本视图的文本',
-	}
-}
+		dynamic: "近期动态",
+		info: "个人信息",
+		settings: "设置",
+		nightmode: "黑夜模式",
+		nightmode_msg: "适合光线较弱的环境,当前黑暗模式为beta版本",
+		language: "语言",
+		language_msg: "翻译进行中,暂翻译了本视图的文本",
+	},
+};

+ 20 - 10
src/router/systemRouter.js

@@ -1,4 +1,21 @@
 import config from "@/config"
+import tool from "@/utils/tool";
+
+
+var dashboard = "/";
+var userType = tool.data.get("USER_TYPE");
+if (!userType) {
+	dashboard = "/dashboard";
+}
+if (userType == 1) {
+	dashboard = "/manage/dashboard";
+} else if (userType == 2) {
+	dashboard = "/merchant/dashboard";
+} else if (userType == 3) {
+	dashboard = "/store/dashboard";
+} else if (userType == 4) {
+	dashboard = "/factory/dashboard";
+}
 
 //系统路由
 const routes = [
@@ -6,7 +23,7 @@ const routes = [
 		name: "layout",
 		path: "/",
 		component: () => import(/* webpackChunkName: "layout" */ '@/layout'),
-		redirect: config.DASHBOARD_URL || '/dashboard',
+		redirect: config.DASHBOARD_URL || dashboard,
 		children: []
 	},
 	{
@@ -17,15 +34,8 @@ const routes = [
 		}
 	},
 	{
-		path: "/user_register",
-		component: () => import(/* webpackChunkName: "userRegister" */ '@/views/login/userRegister'),
-		meta: {
-			title: "注册"
-		}
-	},
-	{
-		path: "/reset_password",
-		component: () => import(/* webpackChunkName: "resetPassword" */ '@/views/login/resetPassword'),
+		path: "/forget",
+		component: () => import(/* webpackChunkName: "resetPassword" */ '@/views/login/forget'),
 		meta: {
 			title: "重置密码"
 		}

+ 0 - 48
src/views/home/index.vue

@@ -1,48 +0,0 @@
-<template>
-	<div v-if="pageLoading">
-		<el-main>
-			<el-card shadow="never">
-				<el-skeleton :rows="1"></el-skeleton>
-			</el-card>
-			<el-card shadow="never" style="margin-top: 15px;">
-				<el-skeleton></el-skeleton>
-			</el-card>
-		</el-main>
-	</div>
-	<work v-if="dashboard=='1'" @on-mounted="onMounted"></work>
-	<widgets v-else @on-mounted="onMounted"></widgets>
-</template>
-
-<script>
-	import { defineAsyncComponent } from 'vue';
-	const work = defineAsyncComponent(() => import('./work'));
-	const widgets = defineAsyncComponent(() => import('./widgets'));
-
-	export default {
-		name: "dashboard",
-		components: {
-			work,
-			widgets
-		},
-		data(){
-			return {
-				pageLoading: true,
-				dashboard: '0'
-			}
-		},
-		created(){
-			this.dashboard = this.$TOOL.data.get("USER_INFO").dashboard || '0';
-		},
-		mounted(){
-
-		},
-		methods: {
-			onMounted(){
-				this.pageLoading = false
-			}
-		}
-	}
-</script>
-
-<style>
-</style>

+ 0 - 27
src/views/home/widgets/components/about.vue

@@ -1,27 +0,0 @@
-<template>
-	<el-card shadow="hover" header="关于项目" class="item-background">
-		<p>高性能 / 精致 / 优雅。基于Vue3 + Element-Plus 的中后台前端解决方案,如果喜欢就点个星星支持一下。</p>
-		<p>
-			<a href='https://gitee.com/lolicode/scui' target="_blank">
-				<img src='https://gitee.com/lolicode/scui/badge/star.svg?theme=dark' alt='star' style="vertical-align: middle">
-			</a>
-		</p>
-	</el-card>
-</template>
-
-<script>
-	export default {
-		title: "关于项目",
-		icon: "el-icon-setting",
-		description: "点个星星支持一下",
-		data() {
-			return {
-				
-			}
-		}
-	}
-</script>
-
-<style scoped>
-	.item-background p {color: #999;margin-top:10px;line-height: 1.8;}
-</style>

+ 0 - 98
src/views/home/widgets/components/echarts.vue

@@ -1,98 +0,0 @@
-<template>
-	<el-card shadow="hover" header="实时收入" v-loading="loading">
-		<scEcharts ref="c1" height="300px" :option="option"></scEcharts>
-	</el-card>
-</template>
-
-<script>
-	import scEcharts from '@/components/scEcharts';
-
-	export default {
-		title: "实时收入",
-		icon: "el-icon-data-line",
-		description: "Echarts组件演示",
-		components: {
-			scEcharts
-		},
-		data() {
-			return {
-				loading: true,
-				option: {}
-			}
-		},
-		created() {
-			var _this = this;
-			setTimeout(function() {
-				_this.loading = false
-			}, 500);
-
-			var option = {
-				tooltip: {
-					trigger: 'axis'
-				},
-				xAxis: {
-					boundaryGap: false,
-					type: 'category',
-					data: (function (){
-						var now = new Date();
-						var res = [];
-						var len = 30;
-						while (len--) {
-							res.unshift(now.toLocaleTimeString().replace(/^\D*/,''));
-							now = new Date(now - 2000);
-						}
-						return res;
-					})()
-				},
-				yAxis: [{
-					type: 'value',
-					name: '价格',
-					"splitLine": {
-						"show": false
-					}
-				}],
-				series: [
-					{
-						name: '收入',
-						type: 'line',
-						symbol: 'none',
-						lineStyle: {
-							width: 1,
-							color: '#409EFF'
-						},
-						areaStyle: {
-							opacity: 0.1,
-							color: '#79bbff'
-						},
-						data: (function (){
-							var res = [];
-							var len = 30;
-							while (len--) {
-								res.push(Math.round(Math.random() * 0));
-							}
-							return res;
-						})()
-					},
-				],
-			};
-			this.option = option;
-
-		},
-		mounted(){
-			 var _this = this;
-			setInterval(function (){
-				var o = _this.option;
-
-				o.series[0].data.shift()
-				o.series[0].data.push(Math.round(Math.random() * 100));
-
-				o.xAxis.data.shift();
-				o.xAxis.data.push((new Date()).toLocaleTimeString().replace(/^\D*/, ''));
-
-
-				//_this.$refs.c1.myChart.setOption(o)
-			},2100)
-
-		},
-	}
-</script>

+ 0 - 12
src/views/home/widgets/components/index.js

@@ -1,12 +0,0 @@
-import {markRaw} from 'vue';
-const resultComps = {}
-let requireComponent = require.context(
-	'./', // 在当前目录下查找
-	false, // 不遍历子文件夹
-	/\.vue$/ // 正则匹配 以 .vue结尾的文件
-)
-requireComponent.keys().forEach(fileName => {
-	let comp = requireComponent(fileName)
-	resultComps[fileName.replace(/^\.\/(.*)\.\w+$/, '$1')] = comp.default
-})
-export default markRaw(resultComps)

+ 0 - 32
src/views/home/widgets/components/progress.vue

@@ -1,32 +0,0 @@
-<template>
-	<el-card shadow="hover" header="进度环">
-		<div class="progress">
-			<el-progress type="dashboard" :percentage="85.5" :width="160">
-				<template #default="{ percentage }">
-				    <div class="percentage-value">{{ percentage }}%</div>
-				    <div class="percentage-label">当前进度</div>
-				  </template>
-			</el-progress>
-		</div>
-
-	</el-card>
-</template>
-
-<script>
-	export default {
-		title: "进度环",
-		icon: "el-icon-odometer",
-		description: "进度环原子组件演示",
-		data() {
-			return {
-
-			}
-		}
-	}
-</script>
-
-<style scoped>
-	.progress {text-align: center;}
-	.progress .percentage-value {font-size: 28px;}
-	.progress .percentage-label {font-size: 12px;margin-top: 10px;}
-</style>

+ 0 - 40
src/views/home/widgets/components/time.vue

@@ -1,40 +0,0 @@
-<template>
-	<el-card shadow="hover" header="时钟" class="item-background">
-		<div class="time">
-			<h2>{{ time }}</h2>
-			<p>{{ day }}</p>
-		</div>
-	</el-card>
-</template>
-
-<script>
-	export default {
-		title: "时钟",
-		icon: "el-icon-clock",
-		description: "演示部件效果",
-		data() {
-			return {
-				time: '',
-				day: ''
-			}
-		},
-		mounted() {
-			this.showTime()
-			setInterval(()=>{
-				this.showTime()
-			},1000)
-		},
-		methods: {
-			showTime(){
-				this.time = this.$TOOL.dateFormat(new Date(), 'hh:mm:ss')
-				this.day = this.$TOOL.dateFormat(new Date(), 'yyyy年MM月dd日')
-			}
-		}
-	}
-</script>
-
-<style scoped>
-	.item-background {background: linear-gradient(to right, #8E54E9, #4776E6);color: #fff;}
-	.time h2 {font-size: 40px;}
-	.time p {font-size: 14px;margin-top: 13px;opacity: 0.7;}
-</style>

+ 0 - 41
src/views/home/widgets/components/ver.vue

@@ -1,41 +0,0 @@
-<template>
-	<el-card shadow="hover" header="版本信息">
-		<div style="height: 210px;text-align: center;">
-			<img src="img/ver.svg" style="height:140px"/>
-			<h2 style="margin-top: 15px;">SCUI {{$CONFIG.CORE_VER}}</h2>
-			<p style="margin-top: 5px;">最新版本 {{ver}}</p>
-		</div>
-		<div style="margin-top: 20px;">
-			<el-button type="primary" plain round @click="golog">更新日志</el-button>
-			<el-button type="primary" plain round @click="gogit">gitee</el-button>
-		</div>
-	</el-card>
-</template>
-
-<script>
-	export default {
-		title: "版本信息",
-		icon: "el-icon-monitor",
-		description: "当前项目版本信息",
-		data() {
-			return {
-				ver: 'loading...'
-			}
-		},
-		mounted() {
-			this.getVer()
-		},
-		methods: {
-			async getVer(){
-				const ver = await this.$API.demo.ver.get()
-				this.ver = ver.data
-			},
-			golog(){
-				window.open("https://gitee.com/lolicode/scui/releases")
-			},
-			gogit(){
-				window.open("https://gitee.com/lolicode/scui")
-			}
-		}
-	}
-</script>

+ 0 - 59
src/views/home/widgets/components/welcome.vue

@@ -1,59 +0,0 @@
-<template>
-	<el-card shadow="hover" header="欢迎">
-		<div class="welcome">
-			<div class="logo">
-				<img src="img/logo.png">
-				<h2>欢迎体验 SCUI</h2>
-			</div>
-			<div class="tips">
-				<div class="tips-item">
-					<div class="tips-item-icon"><el-icon><el-icon-menu/></el-icon></div>
-					<div class="tips-item-message">这里是项目控制台,你可以点击右上方的“自定义”按钮来添加移除或者移动部件。</div>
-				</div>
-				<div class="tips-item">
-					<div class="tips-item-icon"><el-icon><el-icon-promotion/></el-icon></div>
-					<div class="tips-item-message">在提高前端算力、减少带宽请求和代码执行力上多次优化,并且持续着。</div>
-				</div>
-				<div class="tips-item">
-					<div class="tips-item-icon"><el-icon><el-icon-milk-tea/></el-icon></div>
-					<div class="tips-item-message">项目目的:让前端工作更快乐</div>
-				</div>
-			</div>
-			<div class="actions">
-				<el-button type="primary" icon="el-icon-check" size="large" @click="godoc">文档</el-button>
-			</div>
-		</div>
-	</el-card>
-</template>
-
-<script>
-	export default {
-		title: "欢迎",
-		icon: "el-icon-present",
-		description: "项目特色以及文档链接",
-		data() {
-			return {
-
-			}
-		},
-		methods: {
-			godoc(){
-				window.open("https://lolicode.gitee.io/scui-doc/")
-			}
-		}
-	}
-</script>
-
-<style scoped>
-	.welcome {}
-	.welcome .logo {text-align: center;}
-	.welcome .logo img {vertical-align: bottom;width: 100px;height: 100px;margin-bottom: 20px;}
-	.welcome .logo h2 {font-size: 30px;font-weight: normal;display: flex;align-items: center;justify-content: center;}
-
-	.tips {margin-top: 20px;padding:0 40px;}
-	.tips-item {display: flex;align-items: center;justify-content: center;padding:7.5px 0;}
-	.tips-item-icon {width: 40px;height:40px;display: flex;align-items: center;justify-content: center;border-radius: 50%;font-size: 18px;margin-right: 20px;color: var(--el-color-primary);background: rgba(180,180,180,0.1);}
-	.tips-item-message {flex: 1;font-size: 14px;}
-
-	.actions {text-align: center;margin: 40px 0 20px 0;}
-</style>

+ 0 - 256
src/views/home/widgets/index.vue

@@ -1,256 +0,0 @@
-<template>
-	<div :class="['widgets-home', customizing?'customizing':'']" ref="main">
-		<div class="widgets-content">
-			<div class="widgets-top">
-				<div class="widgets-top-title">
-					控制台
-				</div>
-				<div class="widgets-top-actions">
-					<el-button v-if="customizing" type="primary" icon="el-icon-check" round @click="save">完成</el-button>
-					<el-button v-else type="primary" icon="el-icon-edit" round @click="custom">自定义</el-button>
-				</div>
-			</div>
-			<div class="widgets" ref="widgets">
-				<div class="widgets-wrapper">
-					<div v-if="nowCompsList.length<=0" class="no-widgets">
-						<el-empty image="img/no-widgets.svg" description="没有部件啦" :image-size="280"></el-empty>
-					</div>
-					<el-row :gutter="15">
-						<el-col v-for="(item, index) in grid.layout" v-bind:key="index" :md="item" :xs="24">
-							<draggable v-model="grid.copmsList[index]" animation="200" handle=".customize-overlay" group="people" item-key="com" dragClass="aaaaa" force-fallback fallbackOnBody class="draggable-box">
-								<template #item="{ element }">
-									<div class="widgets-item">
-										<component :is="allComps[element]"></component>
-										<div v-if="customizing" class="customize-overlay">
-											<el-button class="close" type="danger" plain icon="el-icon-close" size="small" @click="remove(element)"></el-button>
-											<label><el-icon><component :is="allComps[element].icon" /></el-icon>{{ allComps[element].title }}</label>
-										</div>
-									</div>
-								</template>
-							</draggable>
-						</el-col>
-					</el-row>
-				</div>
-			</div>
-		</div>
-		<div v-if="customizing" class="widgets-aside">
-			<el-container>
-				<el-header>
-					<div class="widgets-aside-title"><el-icon><el-icon-circle-plus-filled/></el-icon>添加部件</div>
-					<div class="widgets-aside-close" @click="close()"><el-icon><el-icon-close /></el-icon></div>
-				</el-header>
-				<el-header style="height:auto">
-					<div class="selectLayout">
-						<div class="selectLayout-item item01" :class="{active:grid.layout.join(',')=='12,6,6'}" @click="setLayout([12,6,6])">
-							<el-row :gutter="2">
-								<el-col :span="12"><span></span></el-col>
-								<el-col :span="6"><span></span></el-col>
-								<el-col :span="6"><span></span></el-col>
-							</el-row>
-						</div>
-						<div class="selectLayout-item item02" :class="{active:grid.layout.join(',')=='24,16,8'}" @click="setLayout([24,16,8])">
-							<el-row :gutter="2">
-								<el-col :span="24"><span></span></el-col>
-								<el-col :span="16"><span></span></el-col>
-								<el-col :span="8"><span></span></el-col>
-							</el-row>
-						</div>
-						<div class="selectLayout-item item03" :class="{active:grid.layout.join(',')=='24'}" @click="setLayout([24])">
-							<el-row :gutter="2">
-								<el-col :span="24"><span></span></el-col>
-								<el-col :span="24"><span></span></el-col>
-								<el-col :span="24"><span></span></el-col>
-							</el-row>
-						</div>
-					</div>
-				</el-header>
-				<el-main class="nopadding">
-					<div class="widgets-list">
-						<div v-if="myCompsList.length<=0" class="widgets-list-nodata">
-							<el-empty description="没有部件啦" :image-size="60"></el-empty>
-						</div>
-						<div v-for="item in myCompsList" :key="item.title" class="widgets-list-item">
-							<div class="item-logo"><el-icon><component :is="item.icon" /></el-icon></div>
-							<div class="item-info">
-								<h2>{{ item.title }}</h2>
-								<p>{{ item.description }}</p>
-							</div>
-							<div class="item-actions">
-								<el-button type="primary" icon="el-icon-plus" size="small" @click="push(item)"></el-button>
-							</div>
-						</div>
-					</div>
-				</el-main>
-				<el-footer style="height:51px;">
-					<el-button size="small" @click="backDefaul()">恢复默认</el-button>
-				</el-footer>
-			</el-container>
-		</div>
-	</div>
-</template>
-
-<script>
-	import draggable from 'vuedraggable'
-	import allComps from './components'
-
-	export default {
-		components: {
-			draggable
-		},
-		data() {
-			return {
-				customizing: false,
-				allComps: allComps,
-				selectLayout: [],
-				defaultGrid: this.$CONFIG.DEFAULT_GRID,
-				grid: []
-			}
-		},
-		created(){
-			this.grid = this.$TOOL.data.get("grid") || JSON.parse(JSON.stringify(this.defaultGrid))
-		},
-		mounted() {
-			this.$emit('on-mounted')
-		},
-		computed: {
-			allCompsList(){
-				var allCompsList = []
-				for(var key in this.allComps){
-					allCompsList.push({
-						key: key,
-						title: allComps[key].title,
-						icon: allComps[key].icon,
-						description: allComps[key].description
-					})
-				}
-				var myCopmsList = this.grid.copmsList.reduce(function(a, b){return a.concat(b)})
-				for(let comp of allCompsList){
-					const _item = myCopmsList.find((item)=>{return item === comp.key})
-					if(_item){
-						comp.disabled = true
-					}
-				}
-				return allCompsList
-			},
-			myCompsList(){
-				var myGrid = this.$TOOL.data.get("DASHBOARDGRID")
-				return this.allCompsList.filter(item => !item.disabled && myGrid.includes(item.key))
-			},
-			nowCompsList(){
-				return this.grid.copmsList.reduce(function(a, b){return a.concat(b)})
-			}
-		},
-		methods: {
-			//开启自定义
-			custom(){
-				this.customizing = true
-				const oldWidth = this.$refs.widgets.offsetWidth
-				this.$nextTick(() => {
-					const scale =  this.$refs.widgets.offsetWidth / oldWidth
-					this.$refs.widgets.style.setProperty('transform', `scale(${scale})`)
-				})
-			},
-			//设置布局
-			setLayout(layout){
-				this.grid.layout = layout
-				if(layout.join(',')=='24'){
-					this.grid.copmsList[0] = [...this.grid.copmsList[0],...this.grid.copmsList[1],...this.grid.copmsList[2]]
-					this.grid.copmsList[1] = []
-					this.grid.copmsList[2] = []
-				}
-			},
-			//追加
-			push(item){
-				let target = this.grid.copmsList[0]
-				target.push(item.key)
-			},
-			//隐藏组件
-			remove(item){
-				var newCopmsList = this.grid.copmsList
-				newCopmsList.forEach((obj, index) => {
-					var newObj = obj.filter(o=>o!=item)
-					newCopmsList[index] = newObj;
-				})
-			},
-			//保存
-			save(){
-				this.customizing = false
-				this.$refs.widgets.style.removeProperty('transform')
-				this.$TOOL.data.set("grid", this.grid)
-			},
-			//恢复默认
-			backDefaul(){
-				this.customizing = false
-				this.$refs.widgets.style.removeProperty('transform')
-				this.grid =  JSON.parse(JSON.stringify(this.defaultGrid))
-				this.$TOOL.data.remove("grid")
-			},
-			//关闭
-			close(){
-				this.customizing = false
-				this.$refs.widgets.style.removeProperty('transform')
-			}
-		}
-	}
-</script>
-
-<style scoped lang="scss">
-	.widgets-home {display: flex;flex-direction: row;flex: 1;height: 100%;}
-	.widgets-content {flex: 1;overflow: auto;overflow-x:hidden;padding:15px;}
-	.widgets-aside {width: 360px;background: #fff;box-shadow: 0 0 10px rgba(0,0,0,.1);position: relative;overflow: auto;}
-	.widgets-aside-title {font-size: 14px;display: flex;align-items: center;justify-content: center;}
-	.widgets-aside-title i {margin-right: 10px;font-size: 18px;}
-	.widgets-aside-close {font-size: 18px;width:30px;height: 30px;display: flex;align-items: center;justify-content: center;border-radius: 3px;cursor: pointer;}
-	.widgets-aside-close:hover {background: rgba(180,180,180,0.1);}
-
-	.widgets-top {margin-bottom: 15px;display: flex;justify-content: space-between;align-items: center;}
-	.widgets-top-title {font-size: 18px;font-weight: bold;}
-
-	.widgets {transform-origin: top left;transition: transform .15s;}
-
-	.draggable-box {height: 100%;}
-
-	.customizing .widgets-wrapper {margin-right:-360px}
-	.customizing .widgets-wrapper .el-col {padding-bottom:15px;}
-	.customizing .widgets-wrapper .draggable-box {border: 1px dashed var(--el-color-primary);padding:15px;}
-	.customizing .widgets-wrapper .no-widgets {display: none;}
-	.customizing .widgets-item {position: relative;margin-bottom: 15px;}
-	.customize-overlay {position: absolute;top:0;right:0;bottom:0;left:0;z-index: 1;display: flex;flex-direction: column;align-items: center;justify-content: center;background: rgba(255,255,255,0.9);cursor: move;}
-	.customize-overlay label {background: var(--el-color-primary);color: #fff;height:40px;padding:0 30px;border-radius: 40px;font-size: 18px;display: flex;align-items: center;justify-content: center;cursor: move;}
-	.customize-overlay label i {margin-right: 15px;font-size: 24px;}
-	.customize-overlay .close {position: absolute;top:15px;right:15px;}
-	.customize-overlay .close:focus, .customize-overlay .close:hover {background: var(--el-button-hover-color);}
-
-	.widgets-list {}
-	.widgets-list-item {display: flex;flex-direction: row;padding:15px;align-items: center;}
-	.widgets-list-item .item-logo {width: 40px;height: 40px;border-radius: 50%;background: rgba(180,180,180,0.1);display: flex;align-items: center;justify-content: center;font-size: 18px;margin-right: 15px;color: #6a8bad;}
-	.widgets-list-item .item-info {flex: 1;}
-	.widgets-list-item .item-info h2 {font-size: 16px;font-weight: normal;cursor: default;}
-	.widgets-list-item .item-info p {font-size: 12px;color: #999;cursor: default;}
-	.widgets-list-item:hover {background: rgba(180,180,180,0.1);}
-
-	.widgets-wrapper .sortable-ghost {opacity: 0.5;}
-
-	.selectLayout {width: 100%;display: flex;}
-	.selectLayout-item {width:60px;height:60px;border: 2px solid var(--el-border-color-light);padding:5px;cursor: pointer;margin-right: 15px;}
-	.selectLayout-item span {display: block;background: var(--el-border-color-light);height:46px;}
-	.selectLayout-item.item02 span {height:30px;}
-	.selectLayout-item.item02 .el-col:nth-child(1) span {height:14px;margin-bottom: 2px;}
-	.selectLayout-item.item03 span {height:14px;margin-bottom: 2px;}
-	.selectLayout-item:hover {border-color: var(--el-color-primary);}
-	.selectLayout-item.active {border-color: var(--el-color-primary);}
-	.selectLayout-item.active span {background: var(--el-color-primary);}
-
-
-	.dark {
-		.widgets-aside {background: #2b2b2b;}
-		.customize-overlay {background: rgba(43,43,43,0.9);}
-	}
-
-	@media (max-width: 992px){
-		.customizing .widgets {transform: scale(1) !important;}
-		.customizing .widgets-aside {width: 100%;position: absolute;top:50%;right:0;bottom:0;}
-		.customizing .widgets-wrapper {margin-right:0;}
-	}
-
-</style>

+ 0 - 131
src/views/home/work/components/myapp.vue

@@ -1,131 +0,0 @@
-<template>
-	<div>
-		<ul class="myMods">
-			<li v-for="mod in myMods" :key="mod.path" :style="{background:mod.meta.color||'#909399'}">
-				<a v-if="mod.meta.type=='link'" :href="mod.path" target="_blank">
-					<el-icon><component :is="mod.meta.icon||el-icon-menu" /></el-icon>
-					<p>{{ mod.meta.title }}</p>
-				</a>
-				<router-link v-else :to="{ path: mod.path }">
-					<el-icon><component :is="mod.meta.icon||el-icon-menu" /></el-icon>
-					<p>{{ mod.meta.title }}</p>
-				</router-link>
-			</li>
-			<li class="modItem-add" @click="addMods">
-				<a href="javascript:void(0)">
-					<el-icon><el-icon-plus /></el-icon>
-				</a>
-			</li>
-		</ul>
-
-		<el-drawer title="添加应用" v-model="modsDrawer" :size="570" destroy-on-close>
-			<div class="setMods">
-				<h4>我的常用 ( {{myMods.length}} )</h4>
-				<draggable tag="ul" v-model="myMods" animation="200" item-key="path" group="people">
-					<template #item="{ element }">
-						<li :style="{background:element.meta.color||'#909399'}">
-							<el-icon><component :is="element.meta.icon||el-icon-menu" /></el-icon>
-							<p>{{element.meta.title}}</p>
-						</li>
-					</template>
-				</draggable>
-			</div>
-			<div class="setMods">
-				<h4>全部应用 ( {{filterMods.length}} )</h4>
-				<draggable tag="ul" v-model="filterMods" animation="200" item-key="path" :sort="false" group="people">
-					<template #item="{ element }">
-						<li :style="{background:element.meta.color||'#909399'}">
-							<el-icon><component :is="element.meta.icon||el-icon-menu" /></el-icon>
-							<p>{{element.meta.title}}</p>
-						</li>
-					</template>
-				</draggable>
-			</div>
-			<template #footer>
-				<el-button @click="modsDrawer=false">取消</el-button>
-				<el-button type="primary" @click="saveMods">保存</el-button>
-			</template>
-		</el-drawer>
-	</div>
-</template>
-
-<script>
-	import draggable from 'vuedraggable'
-
-	export default {
-		components: {
-			draggable
-		},
-		data() {
-			return {
-				mods: [],
-				myMods: [],
-				myModsName: [],
-				filterMods: [],
-				modsDrawer: false
-			}
-		},
-		mounted(){
-			this.getMods()
-		},
-		methods: {
-			addMods(){
-				this.modsDrawer = true
-			},
-			getMods(){
-				//这里可用改为读取远程数据
-				this.myModsName = this.$TOOL.data.get("my-mods") || []
-				var menuTree = this.$TOOL.data.get("MENU")
-				this.filterMenu(menuTree)
-				this.myMods = this.mods.filter(item => {
-					return this.myModsName.includes(item.name)
-				})
-				this.filterMods =  this.mods.filter(item => {
-					return !this.myModsName.includes(item.name)
-				})
-			},
-			filterMenu(map){
-				map.forEach(item => {
-					if(item.meta.hidden || item.meta.type=="button"){
-						return false
-					}
-					if(item.meta.type=='iframe'){
-						item.path = `/i/${item.name}`
-					}
-					if(item.children&&item.children.length > 0){
-						this.filterMenu(item.children)
-					}else{
-						this.mods.push(item)
-					}
-				})
-			},
-			saveMods(){
-				const myModsName = this.myMods.map(v => v.name)
-				this.$TOOL.data.set("my-mods", myModsName)
-				this.$message.success("设置常用成功")
-				this.modsDrawer = false
-			}
-		}
-	}
-</script>
-
-<style scoped>
-	.myMods {list-style:none;margin:-10px;}
-	.myMods li {display: inline-block;width: 100px;height:100px;vertical-align: top;transition:all 0.3s ease;margin:10px;border-radius:5px;}
-	.myMods li:hover {opacity: 0.8;}
-	.myMods li a {width: 100%;height: 100%;padding:10px;display: flex;flex-direction: column;align-items: center;justify-content: center;text-align: center;color: #fff;}
-	.myMods li i {font-size: 26px;color: #fff;}
-	.myMods li p {font-size: 12px;color: #fff;margin-top: 10px;width: 100%;white-space:nowrap;text-overflow:ellipsis;overflow: hidden;}
-
-	.modItem-add {border: 1px dashed #ddd;cursor: pointer;}
-	.modItem-add i {font-size: 30px;color: #999!important;}
-	.modItem-add:hover,.modItem-add:hover i {border-color: #409EFF;color: #409EFF!important;}
-
-	.setMods {padding:0 20px;}
-	.setMods h4 {font-size: 14px;font-weight: normal;}
-	.setMods ul {margin:20px -5px;min-height: 90px;}
-	.setMods li {display: inline-block;width: 80px;height:80px;text-align: center;margin:5px;color: #fff;vertical-align: top;padding:4px;padding-top:15px;cursor: move;border-radius: 3px;}
-	.setMods li i {font-size: 20px;}
-	.setMods li p {font-size: 12px;margin-top: 10px;}
-	.setMods li.sortable-ghost {opacity: 0.3;}
-</style>

+ 0 - 37
src/views/home/work/index.vue

@@ -1,37 +0,0 @@
-<template>
-	<el-main>
-		<el-alert title="根据角色配置,可让不同角色访问不同的控制台视图,参数值在登录成功后返回 dashboard:{type}" type="success" style="margin-bottom:20px;"></el-alert>
-		<el-row :gutter="15">
-			<el-col :lg="24">
-				<el-card shadow="never" header="我的常用">
-					<myapp></myapp>
-				</el-card>
-			</el-col>
-		</el-row>
-	</el-main>
-</template>
-
-<script>
-	import myapp from './components/myapp';
-
-	export default {
-		components: {
-			myapp
-		},
-		data() {
-			return {
-
-			}
-		},
-		mounted(){
-			this.$emit('on-mounted')
-		},
-		methods: {
-
-		}
-	}
-</script>
-
-<style scoped>
-
-</style>

+ 0 - 35
src/views/login/components/commonPage.vue

@@ -1,35 +0,0 @@
-<template>
-	<el-container>
-		<el-header style="height:50px;">
-			<div class="common-header-left">
-				<div class="common-header-logo">
-					<img :alt="$CONFIG.APP_NAME" src="img/logo.png">
-					<label>{{$CONFIG.APP_NAME}}</label>
-				</div>
-				<div class="common-header-title">{{title}}</div>
-			</div>
-			<div class="common-header-right">
-				<router-link to="/login">返回登录</router-link>
-			</div>
-		</el-header>
-		<el-main>
-			<div class="common-container">
-				<h2 class="common-title">{{title}}</h2>
-				<div class="common-main el-card">
-					<slot></slot>
-				</div>
-			</div>
-		</el-main>
-	</el-container>
-</template>
-
-<script>
-	export default {
-		props: {
-			title: { type: String, default: "" }
-		}
-	}
-</script>
-
-<style>
-</style>

+ 207 - 0
src/views/login/components/mobile.vue

@@ -0,0 +1,207 @@
+<template>
+    <el-form ref="loginForm" :model="form" :rules="rules" label-width="0" label-position="top" size="large" @keyup.enter="login">
+		<el-form-item prop="phone" :label="$t('login.mobilePlaceholder')">
+			<el-input v-model="form.phone" prefix-icon="el-icon-iphone" clearable :placeholder="$t('login.mobilePlaceholder')">
+				<template #prepend>+86</template>
+			</el-input>
+		</el-form-item>
+		<el-form-item prop="yzm" :label="$t('login.smsPlaceholder')">
+			<div class="login-msg-yzm">
+				<el-input v-model="form.yzm" prefix-icon="el-icon-unlock" clearable :placeholder="$t('login.smsPlaceholder')"></el-input>
+				<el-button @click="getYzm" :disabled="disabled">{{this.$t('login.smsGet')}}<span v-if="disabled"> ({{time}})</span></el-button>
+			</div>
+		</el-form-item>
+        <el-form-item prop="privacy">
+            <el-checkbox :label="$t('login.rememberMe')" v-model="form.privacy">
+                <template #default>
+                    <div class="privacy">我已阅读并同意<span @click="showPrivacy">《隐私协议》</span></div>
+                </template>
+            </el-checkbox>
+        </el-form-item>
+		<el-form-item>
+            <el-button type="primary" size="large" style="width: 100%;" :loading="islogin" @click="login">{{ $t('login.signIn') }}</el-button>
+		</el-form-item>
+	</el-form>
+	<el-dialog title="隐私协议" v-model="visible" :width="680" destroy-on-close :close-on-click-modal="false" :show-close="false">
+		<div class="showPrivacy">
+			<div v-html="baseData.privacy"></div>
+		</div>
+		<template #footer>
+			<el-button type="primary" @click="showPrivacyState">我已阅读并同意</el-button>
+		</template>
+	</el-dialog>
+</template>
+
+<script>
+export default {
+	props: ['baseData'],
+	data() {
+		return {
+			form: {
+				phone: "",
+				yzm: "",
+			},
+			rules: {
+				phone: [
+					{ required: true, message: this.$t('login.mobileError'), trigger: 'blur' },
+					{
+						validator: (rule, value, callback) => {
+							const phoneReg = /^1[3-9]\d{9}$/ // 手机号正则
+							const landlineReg = /^(?:(?:\d{3}-)?\d{8}|^(?:\d{4}-)?\d{7,8})(?:-\d+)?$/
+							if (!value) {
+								callback(new Error('请输入联系方式'))
+							} else if (!phoneReg.test(value) && !landlineReg.test(value)) {
+								callback(new Error('请输入有效的手机号码号码'))
+							} else {
+								callback()
+							}
+						},
+						trigger: 'blur'
+					}
+				],
+				yzm: [
+					{required: true, message: this.$t('login.smsError')}
+				],
+				privacy: [
+					{ required: true, message: this.$t('login.privacy'), trigger: 'change' }
+				]
+			},
+			disabled: false,
+			time: 0,
+			islogin: false,
+			visible:false,
+			isShow:false
+		}
+	},
+	mounted() {
+
+	},
+	methods: {
+		showPrivacy(){
+			this.visible = true;
+		},
+		showPrivacyState(){
+			if (this.form.privacy == false) {
+				this.form.privacy = true;
+			}
+			this.visible = false;
+		},
+		onClose() {
+			this.isShow = false;
+		},
+		async onSuccess(){
+			this.isShow = false;
+			var resp = await this.$API.login.sms.post({"mobile":this.form.phone,"scene":"login"});
+			if (resp.code == 0) {
+				return this.$message.error(resp.msg);
+			}
+			this.$message.success(resp.msg)
+			this.disabled = true
+			this.time = 60
+			var t = setInterval(() => {
+				this.time -= 1
+				if(this.time < 1){
+					clearInterval(t)
+					this.disabled = false
+					this.time = 0
+				}
+			},1000)
+		},
+		async getYzm(){
+			var validate = await this.$refs.loginForm.validateField("phone").catch(()=>{})
+			if(!validate){ return false }
+			this.isShow = true;
+		},
+		async login(){
+			var validate = await this.$refs.loginForm.validate().catch(()=>{})
+			if(!validate){ return false }
+			this.isShow = false;
+			this.islogin = true
+			var data = {
+				mobile: this.form.phone,
+				code: this.form.yzm,
+				scene: "login",
+			}
+			//获取token
+			var user = await this.$API.auth.mobile.post(data)
+			if (user.code == 1) {
+				this.$TOOL.cookie.set("TOKEN", user.data.access_token, {
+					expires: user.data.expires_in
+				})
+			} else {
+				this.islogin = false
+				this.$message.error(user.msg)
+				return false
+			}
+			//获取菜单
+			var menu = await this.$API.auth.menu.get()
+			if (menu.code == 1) {
+				if (menu.data.menu.length == 0) {
+					this.islogin = false
+					this.$alert("当前用户无任何菜单权限,请联系系统管理员", "无权限访问", {
+						type: 'error',
+						center: true
+					})
+					return false
+				}
+				var userData = await this.$API.auth.user.get()
+				if (userData.code == 0) {
+					this.islogin = false
+					this.$alert("当前用户无任何菜单权限,请联系系统管理员", "无权限访问", {
+						type: 'error',
+						center: true
+					})
+					return false
+				}
+				if (userData.data.is_mch == 2) {
+					this.$store.commit("SET_layout", "header")
+				} else {
+					this.$store.commit("TOGGLE_layoutTags")
+				}
+				this.$TOOL.data.set("USER_TYPE", userData.data.type)
+				this.$TOOL.data.set("USER_INFO", userData.data)
+				this.$TOOL.data.set("MENU", menu.data.menu)
+				this.$TOOL.data.set("PERMISSIONS", menu.data.permissions)
+				this.$TOOL.data.set("DASHBOARDGRID", menu.data.dashboardGrid)
+			} else {
+				this.islogin = false
+				this.$message.warning(menu.message)
+				return false
+			}
+			var userType = userData.data.type;
+			var dashboard = "/dashboard";
+			if (userType == 1) {
+				dashboard = "/manage/dashboard";
+			} else if (userType == 2) {
+				dashboard = "/merchant/dashboard";
+			} else if (userType == 3) {
+				dashboard = "/store/dashboard";
+			} else if (userType == 4) {
+				dashboard = "/factory/dashboard";
+			}
+			this.$emit("success");
+			this.$message.success(user.msg)
+			this.islogin = false;
+			this.$router.replace({
+				path: dashboard
+			})
+		}
+	}
+}
+</script>
+
+<style>
+
+.privacy {
+	color: #333;
+}
+.privacy span {
+	color: #f00;
+}
+.showPrivacy {
+	max-height: 500px;
+	overflow: hidden;
+	overflow-y: scroll;
+	line-height: 1.5;
+}
+</style>

+ 161 - 0
src/views/login/components/passwd.vue

@@ -0,0 +1,161 @@
+<template>
+    <el-form ref="loginForm" :model="form" :rules="rules" label-width="0" label-position="top" size="large" @keyup.enter="login_code">
+        <el-form-item prop="user" :label="$t('login.userName')">
+            <el-input v-model="form.user" clearable :placeholder="$t('login.userPlaceholder')"></el-input>
+        </el-form-item>
+        <el-form-item prop="password" :label="$t('login.PWName')">
+            <el-input v-model="form.password" clearable show-password :placeholder="$t('login.PWPlaceholder')"></el-input>
+        </el-form-item>
+        <el-form-item style="margin-bottom: 0;">
+            <el-col :span="12">
+                <el-checkbox :label="$t('login.rememberMe')" v-model="form.autologin"></el-checkbox>
+            </el-col>
+            <el-col :span="12" class="login-forgot">
+                <router-link to="/forget">{{ $t('login.forgetPassword') }}?</router-link>
+            </el-col>
+        </el-form-item>
+        <el-form-item prop="privacy">
+            <el-checkbox :label="$t('login.rememberMe')" v-model="form.privacy">
+                <template #default>
+                    <div class="privacy">我已阅读并同意<span @click="showPrivacy">《隐私协议》</span></div>
+                </template>
+            </el-checkbox>
+        </el-form-item>
+        <el-form-item>
+            <el-button type="primary" size="large" style="width: 100%;" :loading="islogin" @click="login_code">{{ $t('login.signIn') }}</el-button>
+        </el-form-item>
+    </el-form>
+	<el-dialog title="隐私协议" v-model="visible" :width="680" destroy-on-close :close-on-click-modal="false" :show-close="false">
+		<div class="showPrivacy">
+			<div v-html="baseData.privacy"></div>
+		</div>
+		<template #footer>
+			<el-button type="primary" @click="showPrivacyState">我已阅读并同意</el-button>
+		</template>
+	</el-dialog>
+</template>
+<script>
+export default {
+    props: ['baseData'],
+    data(){
+        return {
+			visible:false,
+			isShow:false,
+            form: {},
+			islogin:false,
+			rules: {
+				user: [
+					{ required: true, message: this.$t('login.userError'), trigger: 'blur' }
+				],
+				password: [
+					{ required: true, message: this.$t('login.PWError'), trigger: 'blur' }
+				],
+				privacy: [
+					{ required: true, message: this.$t('login.privacy'), trigger: 'change' }
+				]
+			},
+        }
+    },
+    methods: {
+		showPrivacy(){
+			this.visible = true;
+		},
+		showPrivacyState(){
+			if (this.form.privacy == false) {
+				this.form.privacy = true;
+			}
+			this.visible = false;
+		},
+		async onSuccess() {
+			this.isShow = false;
+			this.islogin = true
+			var data = {
+				username: this.form.user,
+				password: this.$TOOL.crypto.MD5(this.form.password)
+			}
+			//获取token
+			var user = await this.$API.auth.login.post(data)
+			if (user.code == 1) {
+				this.$TOOL.cookie.set("TOKEN", user.data.access_token, {
+					expires: user.data.expires_in
+				})
+			} else {
+				this.islogin = false
+				this.$message.error(user.msg)
+				return false
+			}
+			//获取菜单
+			var menu = await this.$API.auth.menu.get()
+			if (menu.code == 1) {
+				if (menu.data.menu.length == 0) {
+					this.islogin = false
+					this.$alert("当前用户无任何菜单权限,请联系系统管理员", "无权限访问", {
+						type: 'error',
+						center: true
+					})
+					return false
+				}
+				var userData = await this.$API.auth.user.get()
+				if (userData.code == 0) {
+					this.islogin = false
+					this.$alert("当前用户无任何菜单权限,请联系系统管理员", "无权限访问", {
+						type: 'error',
+						center: true
+					})
+					return false
+				}
+				this.$TOOL.data.set("USER_TYPE", userData.data.type)
+				this.$TOOL.data.set("USER_INFO", userData.data)
+				this.$TOOL.data.set("MENU", menu.data.menu)
+				this.$TOOL.data.set("PERMISSIONS", menu.data.permissions)
+				this.$TOOL.data.set("DASHBOARDGRID", menu.data.dashboardGrid)
+			} else {
+				this.islogin = false
+				this.$message.warning(menu.message)
+				return false
+			}
+			var userType = userData.data.type;
+			var dashboard = "/dashboard";
+			if (userType == 1) {
+				dashboard = "/manage/dashboard";
+			} else if (userType == 2) {
+				dashboard = "/merchant/dashboard";
+			} else if (userType == 3) {
+				dashboard = "/store/dashboard";
+			} else if (userType == 4) {
+				dashboard = "/factory/dashboard";
+			}
+			this.$emit("success");
+			this.$message.success(user.msg)
+			this.islogin = false;
+			this.$router.replace({
+				path: dashboard
+			})
+		},
+		onClose() {
+			this.isShow = false;
+		},
+		async login_code() {
+			var validate = await this.$refs.loginForm.validate().catch(() => { })
+			if (!validate) { return false }
+			this.isShow = true;
+		}
+    }
+}
+</script>
+
+<style>
+.login-forgot{text-align: right;}
+.privacy {
+	color: #333;
+}
+.privacy span {
+	color: #f00;
+}
+.showPrivacy {
+	max-height: 500px;
+	overflow: hidden;
+	overflow-y: scroll;
+	line-height: 1.5;
+}
+</style>

+ 0 - 127
src/views/login/components/passwordForm.vue

@@ -1,127 +0,0 @@
-<template>
-	<el-form ref="loginForm" :model="form" :rules="rules" label-width="0" size="large" @keyup.enter="login">
-		<el-form-item prop="user">
-			<el-input v-model="form.user" prefix-icon="el-icon-user" clearable :placeholder="$t('login.userPlaceholder')">
-				<template #append>
-					<el-select v-model="userType" style="width: 130px;">
-						<el-option :label="$t('login.admin')" value="admin"></el-option>
-						<el-option :label="$t('login.user')" value="user"></el-option>
-					</el-select>
-				</template>
-			</el-input>
-		</el-form-item>
-		<el-form-item prop="password">
-			<el-input v-model="form.password" prefix-icon="el-icon-lock" clearable show-password :placeholder="$t('login.PWPlaceholder')"></el-input>
-		</el-form-item>
-		<el-form-item style="margin-bottom: 10px;">
-				<el-col :span="12">
-					<el-checkbox :label="$t('login.rememberMe')" v-model="form.autologin"></el-checkbox>
-				</el-col>
-				<el-col :span="12" class="login-forgot">
-					<router-link to="/reset_password">{{ $t('login.forgetPassword') }}?</router-link>
-				</el-col>
-		</el-form-item>
-		<el-form-item>
-			<el-button type="primary" style="width: 100%;" :loading="islogin" round @click="login">{{ $t('login.signIn') }}</el-button>
-		</el-form-item>
-		<div class="login-reg">
-			{{$t('login.noAccount')}} <router-link to="/user_register">{{$t('login.createAccount')}}</router-link>
-		</div>
-	</el-form>
-</template>
-
-<script>
-	export default {
-		data() {
-			return {
-				userType: 'admin',
-				form: {
-					user: "admin",
-					password: "admin",
-					autologin: false
-				},
-				rules: {
-					user: [
-						{required: true, message: this.$t('login.userError'), trigger: 'blur'}
-					],
-					password: [
-						{required: true, message: this.$t('login.PWError'), trigger: 'blur'}
-					]
-				},
-				islogin: false,
-			}
-		},
-		watch:{
-			userType(val){
-				if(val == 'admin'){
-					this.form.user = 'admin'
-					this.form.password = 'admin'
-				}else if(val == 'user'){
-					this.form.user = 'user'
-					this.form.password = 'user'
-				}
-			}
-		},
-		mounted() {
-
-		},
-		methods: {
-			async login(){
-
-				var validate = await this.$refs.loginForm.validate().catch(()=>{})
-				if(!validate){ return false }
-
-				this.islogin = true
-				var data = {
-					username: this.form.user,
-					password: this.$TOOL.crypto.MD5(this.form.password)
-				}
-				//获取token
-				var user = await this.$API.auth.token.post(data)
-				if(user.code == 200){
-					this.$TOOL.cookie.set("TOKEN", user.data.token, {
-						expires: this.form.autologin? 24*60*60 : 0
-					})
-					this.$TOOL.data.set("USER_INFO", user.data.userInfo)
-				}else{
-					this.islogin = false
-					this.$message.warning(user.message)
-					return false
-				}
-				//获取菜单
-				var menu = null
-				if(this.form.user == 'admin'){
-					menu = await this.$API.system.menu.myMenus.get()
-				}else{
-					menu = await this.$API.demo.menu.get()
-				}
-				if(menu.code == 200){
-					if(menu.data.menu.length==0){
-						this.islogin = false
-						this.$alert("当前用户无任何菜单权限,请联系系统管理员", "无权限访问", {
-							type: 'error',
-							center: true
-						})
-						return false
-					}
-					this.$TOOL.data.set("MENU", menu.data.menu)
-					this.$TOOL.data.set("PERMISSIONS", menu.data.permissions)
-					this.$TOOL.data.set("DASHBOARDGRID", menu.data.dashboardGrid)
-				}else{
-					this.islogin = false
-					this.$message.warning(menu.message)
-					return false
-				}
-
-				this.$router.replace({
-					path: '/'
-				})
-				this.$message.success("Login Success 登录成功")
-				this.islogin = false
-			},
-		}
-	}
-</script>
-
-<style>
-</style>

+ 0 - 74
src/views/login/components/phoneForm.vue

@@ -1,74 +0,0 @@
-<template>
-	<el-form ref="loginForm" :model="form" :rules="rules" label-width="0" size="large" @keyup.enter="login">
-		<el-form-item prop="phone">
-			<el-input v-model="form.phone" prefix-icon="el-icon-iphone" clearable :placeholder="$t('login.mobilePlaceholder')">
-				<template #prepend>+86</template>
-			</el-input>
-		</el-form-item>
-		<el-form-item prop="yzm"  style="margin-bottom: 35px;">
-			<div class="login-msg-yzm">
-				<el-input v-model="form.yzm" prefix-icon="el-icon-unlock" clearable :placeholder="$t('login.smsPlaceholder')"></el-input>
-				<el-button @click="getYzm" :disabled="disabled">{{this.$t('login.smsGet')}}<span v-if="disabled"> ({{time}})</span></el-button>
-			</div>
-		</el-form-item>
-		<el-form-item>
-			<el-button type="primary" style="width: 100%;" :loading="islogin" round @click="login">{{ $t('login.signIn') }}</el-button>
-		</el-form-item>
-		<div class="login-reg">
-			{{$t('login.noAccount')}} <router-link to="/user_register">{{$t('login.createAccount')}}</router-link>
-		</div>
-	</el-form>
-</template>
-
-<script>
-	export default {
-		data() {
-			return {
-				form: {
-					phone: "",
-					yzm: "",
-				},
-				rules: {
-					phone: [
-						{required: true, message: this.$t('login.mobileError')}
-					],
-					yzm: [
-						{required: true, message: this.$t('login.smsError')}
-					]
-				},
-				disabled: false,
-				time: 0,
-				islogin: false,
-			}
-		},
-		mounted() {
-
-		},
-		methods: {
-			async getYzm(){
-				var validate = await this.$refs.loginForm.validateField("phone").catch(()=>{})
-				if(!validate){ return false }
-
-				this.$message.success(this.$t('login.smsSent'))
-				this.disabled = true
-				this.time = 60
-				var t = setInterval(() => {
-					this.time -= 1
-					if(this.time < 1){
-						clearInterval(t)
-						this.disabled = false
-						this.time = 0
-					}
-				},1000)
-			},
-			async login(){
-				var validate = await this.$refs.loginForm.validate().catch(()=>{})
-				if(!validate){ return false }
-			}
-		}
-	}
-</script>
-
-<style>
-
-</style>

+ 5 - 0
src/views/login/forget.vue

@@ -0,0 +1,5 @@
+<template>
+    <div>
+        
+    </div>
+</template>

+ 304 - 184
src/views/login/index.vue

@@ -1,203 +1,323 @@
 <template>
 	<div class="login_bg">
-		<div class="login_adv" style="background-image: url(img/auth_banner.jpg);">
-			<div class="login_adv__title">
-				<h2>SCUI</h2>
-				<h4>{{ $t('login.slogan') }}</h4>
-				<p>{{ $t('login.describe') }}</p>
-				<div>
-					<span>
-						<el-icon><sc-icon-vue /></el-icon>
-					</span>
-					<span>
-						<el-icon class="add"><el-icon-plus /></el-icon>
-					</span>
-					<span>
-						<el-icon><el-icon-eleme-filled /></el-icon>
-					</span>
-				</div>
-			</div>
-			<div class="login_adv__mask"></div>
-			<div class="login_adv__bottom">
-				© {{$CONFIG.APP_NAME}} {{$CONFIG.APP_VER}}
-			</div>
-		</div>
-		<div class="login_main">
-			<div class="login_config">
-				<el-button :icon="config.dark?'el-icon-sunny':'el-icon-moon'" circle type="info" @click="configDark"></el-button>
-				<el-dropdown trigger="click" placement="bottom-end" @command="configLang">
-					<el-button circle>
-						<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 512 512"><path d="M478.33 433.6l-90-218a22 22 0 0 0-40.67 0l-90 218a22 22 0 1 0 40.67 16.79L316.66 406h102.67l18.33 44.39A22 22 0 0 0 458 464a22 22 0 0 0 20.32-30.4zM334.83 362L368 281.65L401.17 362z" fill="currentColor"></path><path d="M267.84 342.92a22 22 0 0 0-4.89-30.7c-.2-.15-15-11.13-36.49-34.73c39.65-53.68 62.11-114.75 71.27-143.49H330a22 22 0 0 0 0-44H214V70a22 22 0 0 0-44 0v20H54a22 22 0 0 0 0 44h197.25c-9.52 26.95-27.05 69.5-53.79 108.36c-31.41-41.68-43.08-68.65-43.17-68.87a22 22 0 0 0-40.58 17c.58 1.38 14.55 34.23 52.86 83.93c.92 1.19 1.83 2.35 2.74 3.51c-39.24 44.35-77.74 71.86-93.85 80.74a22 22 0 1 0 21.07 38.63c2.16-1.18 48.6-26.89 101.63-85.59c22.52 24.08 38 35.44 38.93 36.1a22 22 0 0 0 30.75-4.9z" fill="currentColor"></path></svg>
-					</el-button>
-					<template #dropdown>
-						<el-dropdown-menu>
-							<el-dropdown-item v-for="item in lang" :key="item.value" :command="item" :class="{'selected':config.lang==item.value}">{{item.name}}</el-dropdown-item>
-						</el-dropdown-menu>
-					</template>
-				</el-dropdown>
-			</div>
-			<div class="login-form">
-				<div class="login-header">
-					<div class="logo">
-						<img :alt="$CONFIG.APP_NAME" src="img/logo.png">
-						<label>{{$CONFIG.APP_NAME}}</label>
+		<main class="login-main">
+			<section class="login-form">
+				<div class="form-container">
+					<div class="login-for">
+						<div class="tab-menu">
+							<div :class="tabMenu==1?'tab-item active':'tab-item'" @click="menuType(1)">{{ $t('login.accountLogin') }}</div>
+							<div class="line"></div>
+							<div :class="tabMenu==2?'tab-item active':'tab-item'" @click="menuType(2)">{{ $t('login.mobileLogin') }}</div>
+						</div>
+						<phoneForm :baseData="baseData" @success="handleSuccess" v-if="tabMenu==2"></phoneForm>
+						<passwordForm :baseData="baseData" @success="handleSuccess" v-if="tabMenu==1"></passwordForm>
 					</div>
 				</div>
-				<el-tabs>
-					<el-tab-pane :label="$t('login.accountLogin')" lazy>
-						<password-form></password-form>
-					</el-tab-pane>
-					<el-tab-pane :label="$t('login.mobileLogin')" lazy>
-						<phone-form></phone-form>
-					</el-tab-pane>
-				</el-tabs>
-				<template v-if="$CONFIG.MY_SHOW_LOGIN_OAUTH">
-					<el-divider>{{ $t('login.signInOther') }}</el-divider>
-					<div class="login-oauth">
-						<el-button type="success" icon="sc-icon-wechat" circle @click="wechatLogin"></el-button>
-					</div>
-				</template>
-			</div>
-		</div>
+			</section>
+		</main>
+		<footer class="login-footer">
+			{{ baseData.copyright }} <span v-html="baseData.miitbeian"></span> <span v-html="baseData.beian"></span>
+		</footer>
 	</div>
-	<el-dialog v-model="showWechatLogin" :title="$t('login.wechatLoginTitle')" :width="400" destroy-on-close>
-		<div class="qrCodeLogin">
-			<sc-qr-code class="qrCode" :text="WechatLoginCode" :size="200"></sc-qr-code>
-			<p class="msg">{{$tc('login.wechatLoginMsg', 1)}}<br/>{{$tc('login.wechatLoginMsg', 2)}}</p>
-			<div class="qrCodeLogin-result" v-if="isWechatLoginResult">
-				<el-result icon="success" :title="$tc('login.wechatLoginResult', 1)" :sub-title="$tc('login.wechatLoginResult', 2)"></el-result>
-			</div>
-		</div>
-	</el-dialog>
 </template>
 
 <script>
-	import passwordForm from './components/passwordForm'
-	import phoneForm from './components/phoneForm'
-
-	export default {
-		components: {
-			passwordForm,
-			phoneForm
-		},
-		data() {
-			return {
-				config: {
-					lang: this.$TOOL.data.get('APP_LANG') || this.$CONFIG.LANG,
-					dark: this.$TOOL.data.get('APP_DARK') || false
-				},
-				lang: [
-					{
-						name: '简体中文',
-						value: 'zh-cn',
-					},
-					{
-						name: 'English',
-						value: 'en',
-					}
-				],
-				WechatLoginCode: "",
-				showWechatLogin: false,
-				isWechatLoginResult: false
-			}
+import passwordForm from './components/passwd'
+import phoneForm from './components/mobile'
+export default {
+	components: {
+		passwordForm,
+		phoneForm
+	},
+	data() {
+		return {
+			form: {},
+			islogin: false,
+			isShow: false,
+			code: null,
+			baseData: {},
+			loginType:"zh",
+			tabMenu:1
+		}
+	},
+	created: function () {
+		this.$TOOL.cookie.remove("AGENT_TOKEN")
+		this.$TOOL.data.remove("AGENT_USER_INFO")
+		this.$TOOL.data.remove("AGENT_MENU")
+		this.$TOOL.data.remove("AGENT_PERMISSIONS")
+		this.$TOOL.data.remove("AGENT_DASHBOARDGRID")
+		this.$TOOL.data.remove("AGENT_grid")
+		this.$store.commit("clearViewTags")
+		this.$store.commit("clearKeepLive")
+		this.$store.commit("clearIframeList")
+		// this.getService();
+	},
+	methods: {
+		menuType(type){
+			this.tabMenu = type;
 		},
-		watch:{
-			'config.dark'(val){
-				if(val){
-					document.documentElement.classList.add("dark")
-					this.$TOOL.data.set("APP_DARK", val)
-				}else{
-					document.documentElement.classList.remove("dark")
-					this.$TOOL.data.remove("APP_DARK")
-				}
-			},
-			'config.lang'(val){
-				this.$i18n.locale = val
-				this.$TOOL.data.set("APP_LANG", val)
+		loginChange(){
+			if (this.loginType == 'fs')
+			{
+				this.loginType = 'zh';
+			} else {
+				this.loginType = 'fs';
 			}
 		},
-		created: function() {
-			this.$TOOL.cookie.remove("TOKEN")
-			this.$TOOL.data.remove("USER_INFO")
-			this.$TOOL.data.remove("MENU")
-			this.$TOOL.data.remove("PERMISSIONS")
-			this.$TOOL.data.remove("DASHBOARDGRID")
-			this.$TOOL.data.remove("grid")
-			this.$store.commit("clearViewTags")
-			this.$store.commit("clearKeepLive")
-			this.$store.commit("clearIframeList")
-			console.log('%c SCUI %c Gitee: https://gitee.com/lolicode/scui', 'background:#666;color:#fff;border-radius:3px;', '')
+		handleSuccess(){
+			this.islogin = true;
 		},
-		methods: {
-			configDark(){
-				this.config.dark = this.config.dark ? false : true
-			},
-			configLang(command){
-				this.config.lang = command.value
-			},
-			wechatLogin(){
-				this.showWechatLogin = true
-				this.WechatLoginCode = "SCUI-823677237287236-" + new Date().getTime()
-				this.isWechatLoginResult = false
-				setTimeout(()=>{
-					this.isWechatLoginResult = true
-				},3000)
+		async getService() {
+			var resp = await this.$API.auth.service.get();
+			if (resp.code == 0) {
+				return this.$message.warning(resp.msg)
 			}
-		}
+			this.$TOOL.data.set("AGENT_SERVICE", resp.data)
+			this.baseData = resp.data;
+		},
 	}
+}
 </script>
 
 <style scoped>
-	.login_bg {width: 100%;height: 100%;background: #fff;display: flex;}
-	.login_adv {width: 33.33333%;background-color: #555;background-size: cover;background-position: center center;background-repeat: no-repeat;position: relative;}
-	.login_adv__title {color: #fff;padding: 40px;position: absolute;top:0px;left:0px;right: 0px;z-index: 2;}
-	.login_adv__title h2 {font-size: 40px;}
-	.login_adv__title h4 {font-size: 18px;margin-top: 10px;font-weight: normal;}
-	.login_adv__title p {font-size: 14px;margin-top:10px;line-height: 1.8;color: rgba(255,255,255,0.6);}
-	.login_adv__title div {margin-top: 10px;display: flex;align-items: center;}
-	.login_adv__title div span {margin-right: 15px;}
-	.login_adv__title div i {font-size: 40px;}
-	.login_adv__title div i.add {font-size: 20px;color: rgba(255,255,255,0.6);}
-	.login_adv__bottom {position: absolute;left:0px;right: 0px;bottom: 0px;color: #fff;padding: 40px;background-image:linear-gradient(transparent, #000);z-index: 3;}
-	.login_adv__mask {position: absolute;top:0px;left:0px;right: 0px;bottom: 0px;background: rgba(0,0,0,0.5);z-index: 1;}
-
-	.login_main {flex: 1;overflow: auto;display:flex;}
-	.login-form {width: 400px;margin: auto;padding:20px 0;}
-	.login-header {margin-bottom: 40px;}
-	.login-header .logo {display: flex;align-items: center;}
-	.login-header .logo img {width: 40px;height: 40px;vertical-align: bottom;margin-right: 10px;}
-	.login-header .logo label {font-size: 26px;font-weight: bold;}
-	.login-oauth {display: flex;justify-content:space-around;}
-	.login-form .el-divider {margin-top:40px;}
-
-	.login-form {}
-	.login-form:deep(.el-tabs) .el-tabs__header {margin-bottom: 25px;}
-	.login-form:deep(.el-tabs) .el-tabs__header .el-tabs__item {font-size: 14px;}
-
-	.login-form:deep(.login-forgot) {text-align: right;}
-	.login-form:deep(.login-forgot) a {color: var(--el-color-primary);}
-	.login-form:deep(.login-forgot) a:hover {color: var(--el-color-primary-light-3);}
-	.login-form:deep(.login-reg) {font-size: 14px;color: var(--el-text-color-primary);}
-	.login-form:deep(.login-reg) a {color: var(--el-color-primary);}
-	.login-form:deep(.login-reg) a:hover {color: var(--el-color-primary-light-3);}
-
-	.login_config {position: absolute;top:20px;right: 20px;}
-
-	.login-form:deep(.login-msg-yzm) {display: flex;width: 100%;}
-	.login-form:deep(.login-msg-yzm) .el-button {margin-left: 10px;--el-button-size:42px;}
-
-	.qrCodeLogin {text-align: center;position: relative;padding: 20px 0;}
-	.qrCodeLogin img.qrCode {background: #fff;padding:20px;border-radius:10px;}
-	.qrCodeLogin p.msg {margin-top: 15px;}
-	.qrCodeLogin .qrCodeLogin-result {position: absolute;top:0;left:0;right: 0;bottom: 0;text-align: center;background: var(--el-mask-color);}
-
-	@media (max-width: 1200px){
-		.login-form {width: 340px;}
-	}
-	@media (max-width: 1000px){
-		.login_main {display: block;}
-		.login_main .login_config {position: static;padding:20px 20px 0 20px;text-align: right;}
-		.login-form {width:100%;padding:20px 40px;}
-		.login_adv {display: none;}
+.privacy {
+	color: #333;
+}
+.tab-menu{
+	display: flex;
+	align-items: center;
+	font-size: 20px;
+	font-weight: 400;
+	color: #b6babf;
+	margin-bottom: 30px;
+}
+.tab-menu .line{width: 1px;background-color: #b6babf;margin: 0 15px;height: 20px;}
+.tab-menu .tab-item {cursor: pointer;}
+.tab-menu .tab-item.active{color: #000;font-weight: bold;}
+.showPrivacy {
+	max-height: 500px;
+	overflow: hidden;
+	overflow-y: scroll;
+	line-height: 1.5;
+}
+.privacy span {
+	color: #f00;
+}
+
+.right-tips {
+	width: 143px;
+	height: 37px;
+	position: absolute;
+	top: -42px;
+	right: 0;
+	background-repeat: no-repeat;
+	font-size: 14px;
+	font-weight: 400;
+	color: #2475FC;
+	line-height: 30px;
+	padding-left: 14px;
+}
+
+.right-tips img {
+	vertical-align: middle;
+	margin-right: 5px;
+	width: 20px;
+}
+
+.login-header-tips {
+	margin-bottom: 30px;
+	font-family: var(--font-family);
+}
+
+.login-header-tips h3 {
+	font-size: 28px;
+	color: #333;
+}
+
+.login-header-tips p {
+	font-size: 14px;
+	color: #959595;
+	line-height: 32px;
+}
+
+.loading-box {
+	display: flex;
+	height: 230px;
+}
+
+.login-forgot {
+	text-align: right;
+}
+
+.oauth-logo {
+	width: 100px;
+	height: 100px;
+	text-align: center;
+	border: 1px solid var(--el-color-primary-light-2);
+	border-radius: 100%;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	margin: 0 auto;
+}
+
+.oauth-text {
+	margin: 20px auto;
+	text-align: center;
+	font-size: 14px;
+	color: var(--el-color-primary-light-3);
+}
+
+.el-button--large {
+	--el-button-size: 50px;
+	font-size: 16px;
+	font-weight: 600;
+}
+
+.login-footer {
+	text-align: center;
+	color: #9598a6;
+	font-size: 12px;
+	line-height: 60px;
+}
+
+.right-qrcode-bg {
+	position: absolute;
+	right: -1px;
+	top: -1px;
+	width: 90px;
+	height: 90px;
+	border-radius: 0 10px 0 0;
+	border-color: #f2f7ff #f2f7ff #fff #fff;
+	border-style: solid;
+	border-width: 50px;
+	-webkit-box-sizing: border-box;
+	box-sizing: border-box;
+}
+
+.right-qrcode-user:hover {
+	background-image: url(https://blue-order.oss-cn-guangzhou.aliyuncs.com/account_hover2.png);
+}
+
+.right-qrcode-user {
+	position: absolute;
+	top: 0;
+	right: 0;
+	width: 101px;
+	height: 101px;
+	display: block;
+	background: url(https://blue-order.oss-cn-guangzhou.aliyuncs.com/account_2.png) no-repeat 50%;
+	background-size: 90px;
+	cursor: pointer;
+	z-index: 9;
+}
+
+.right-qrcode:hover {
+	background-image: url(https://blue-order.oss-cn-guangzhou.aliyuncs.com/qrcode_hover2.png);
+}
+
+.right-qrcode {
+	position: absolute;
+	top: 0;
+	right: 0;
+	width: 101px;
+	height: 101px;
+	display: block;
+	background: url(https://blue-order.oss-cn-guangzhou.aliyuncs.com/qrcode2.png) no-repeat 50%;
+	background-size: 90px;
+	cursor: pointer;
+	z-index: 9;
+}
+
+.el-form-item__label {
+	color: #1e2226 !important;
+	font-weight: 600 !important;
+}
+
+.login-main {
+	flex: 1;
+	height: 100%;
+	display: flex;
+	justify-content: center;
+	align-items: center;
+}
+
+.login-form {
+	display: flex;
+	position: relative;
+	justify-content: center;
+	flex: 1;
+	flex-direction: column;
+	align-items: center;
+}
+.login-form .logo {
+	align-items: center;
+	display: flex;
+	font-family: var(--font-family);
+	margin-bottom: 20px;
+}
+
+.login-form .logo img {
+	height: 60px;
+	margin: 0 20px;
+}
+
+.login-form .logo label {
+	font-size: 26px;
+	color: #333;
+}
+
+.login-form h3 {
+	line-height: 28px;
+	margin-top: 12px;
+	font-size: 20px;
+	color: #1e2226;
+	cursor: pointer;
+	font-weight: 600;
+}
+
+.login-form .form-container {
+	width: 420px;
+	box-shadow: 0 20px 30px 0 rgb(63 63 65 / 6%);
+	border-radius: 10px;
+	border: 1px solid #fff;
+	box-sizing: border-box;
+	padding: 40px 40px 30px;
+	background: #fff;
+	position: relative;
+}
+
+.login_bg {
+	background: url(https://blue-order.oss-cn-guangzhou.aliyuncs.com/bg.png) 0 0 no-repeat;
+	background-size: cover;
+	min-height: 680px;
+	height: 100vh;
+	display: flex;
+	flex-direction: column;
+}
+
+.login-header {
+	background: hsla(0, 0%, 100%, .3);
+	box-shadow: 0 2px 20px 0 rgba(140, 147, 161, .07);
+	height: 50px;
+	align-items: center;
+	display: flex;
+}
+
+.login-header img {
+	height: 28px;
+	margin: 0 20px;
+}
+
+.login-header label {
+	font-size: 16px;
+	color: #333;
+}
+.login-form:deep(.login-msg-yzm) {display: flex;width: 100%;}
+.login-form:deep(.login-msg-yzm) .el-button {margin-left: 10px;--el-button-size:42px;}
+@media only screen and (max-width: 800px) {
+	.form-container {
+		width: 100% !important;
 	}
+}
 </style>

+ 0 - 124
src/views/login/resetPassword.vue

@@ -1,124 +0,0 @@
-<template>
-	<common-page title="重置密码">
-		<el-steps :active="stepActive" simple finish-status="success">
-		    <el-step title="填写新密码" />
-		    <el-step title="完成重置" />
-		</el-steps>
-		<el-form v-if="stepActive==0" ref="form" :model="form" :rules="rules" :label-width="120">
-			<el-form-item label="登录账号" prop="user">
-				<el-input v-model="form.user" placeholder="请输入登录账号"></el-input>
-				<div class="el-form-item-msg">请输入注册时填写的登录账号</div>
-			</el-form-item>
-			<el-form-item label="手机号码" prop="phone">
-				<el-input v-model="form.phone" placeholder="请输入手机号码"></el-input>
-			</el-form-item>
-			<el-form-item label="短信验证码" prop="yzm">
-				<div class="yzm">
-					<el-input v-model="form.yzm" placeholder="请输入6位短信验证码"></el-input>
-					<el-button @click="getYzm" :disabled="disabled">获取验证码<span v-if="disabled"> ({{time}})</span></el-button>
-				</div>
-			</el-form-item>
-			<el-form-item label="新密码" prop="newpw">
-				<el-input v-model="form.newpw" show-password placeholder="请输入新密码"></el-input>
-				<div class="el-form-item-msg">请输入包含英文、数字的8位以上密码</div>
-			</el-form-item>
-			<el-form-item label="确认新密码" prop="newpw2">
-				<el-input v-model="form.newpw2" show-password placeholder="请再一次输入新密码"></el-input>
-			</el-form-item>
-
-			<el-form-item>
-				<el-button type="primary" @click="save">提交</el-button>
-			</el-form-item>
-		</el-form>
-		<el-result v-if="stepActive==1" icon="success" title="密码重置成功" sub-title="请牢记自己的新密码,返回登录后使用新密码登录">
-			<template #extra>
-				<el-button type="primary" @click="backLogin">返回登录</el-button>
-			</template>
-		</el-result>
-	</common-page>
-</template>
-
-<script>
-	import commonPage from './components/commonPage'
-
-	export default {
-		components: {
-			commonPage
-		},
-		data() {
-			return {
-				stepActive: 0,
-				form: {
-					user: "",
-					phone: "",
-					yzm: "",
-					newpw: "",
-					newpw2: ""
-				},
-				rules: {
-					user: [
-						{ required: true, message: '请输入登录账号'}
-					],
-					phone: [
-						{ required: true, message: '请输入手机号'}
-					],
-					yzm: [
-						{ required: true, message: '请输入短信验证码'}
-					],
-					newpw: [
-						{ required: true, message: '请输入新的密码'}
-					],
-					newpw2: [
-						{ required: true, message: '请再次输入新的密码'},
-						{validator: (rule, value, callback) => {
-							if (value !== this.form.newpw) {
-								callback(new Error('两次输入密码不一致'));
-							}else{
-								callback();
-							}
-						}}
-					],
-				},
-				disabled: false,
-				time: 0
-			}
-		},
-		mounted() {
-
-		},
-		methods: {
-			async getYzm(){
-				var validate = await this.$refs.form.validateField("phone").catch(()=>{})
-				if(!validate){ return false }
-
-				this.$message.success("已发送短信至手机号码")
-				this.disabled = true
-				this.time = 60
-				var t = setInterval(() => {
-					this.time -= 1
-					if(this.time < 1){
-						clearInterval(t)
-						this.disabled = false
-						this.time = 0
-					}
-				},1000)
-			},
-			async save(){
-				var validate = await this.$refs.form.validate().catch(()=>{})
-				if(!validate){ return false }
-
-				this.stepActive = 1
-			},
-			backLogin(){
-				this.$router.push({
-					path: '/login'
-				})
-			}
-		}
-	}
-</script>
-
-<style scoped>
-
-
-</style>

+ 0 - 171
src/views/login/userRegister.vue

@@ -1,171 +0,0 @@
-<template>
-	<common-page title="注册新账号">
-		<el-steps :active="stepActive" simple finish-status="success">
-		    <el-step title="基础信息" />
-			<el-step title="详细信息" />
-		    <el-step title="完成注册" />
-		</el-steps>
-		<el-form v-if="stepActive==0" ref="stepForm_0" :model="form" :rules="rules" :label-width="120">
-			<el-form-item label="登录账号" prop="user">
-				<el-input v-model="form.user" placeholder="请输入登录账号"></el-input>
-				<div class="el-form-item-msg">登录账号将作为登录时的唯一凭证</div>
-			</el-form-item>
-			<el-form-item label="登录密码" prop="password">
-				<el-input v-model="form.password" type="password" show-password placeholder="请输入登录密码"></el-input>
-				<sc-password-strength v-model="form.password"></sc-password-strength>
-				<div class="el-form-item-msg">请输入包含英文、数字的8位以上密码</div>
-			</el-form-item>
-			<el-form-item label="确认密码" prop="password2">
-				<el-input v-model="form.password2" type="password" show-password placeholder="请再一次输入登录密码"></el-input>
-			</el-form-item>
-			<el-form-item label="" prop="agree">
-				<el-checkbox v-model="form.agree" label="">已阅读并同意</el-checkbox><span class="link" @click="showAgree=true">《平台服务协议》</span>
-			</el-form-item>
-		</el-form>
-		<el-form v-if="stepActive==1" ref="stepForm_1" :model="form" :rules="rules" :label-width="120">
-			<el-form-item label="真实姓名" prop="userName">
-				<el-input v-model="form.userName" placeholder="请输入真实姓名"></el-input>
-			</el-form-item>
-			<el-form-item label="邮箱" prop="email">
-				<el-input v-model="form.email" placeholder="请输入邮箱地址"></el-input>
-			</el-form-item>
-			<el-form-item label="账号类型" prop="userType">
-				<el-radio-group v-model="form.userType">
-					<el-radio-button label="1">企业开发者</el-radio-button>
-					<el-radio-button label="2">企业开发者</el-radio-button>
-				</el-radio-group>
-			</el-form-item>
-			<el-form-item label="开通类别" prop="open">
-				<el-checkbox-group v-model="form.open">
-					<el-checkbox label="1">云存储API</el-checkbox>
-					<el-checkbox label="2">云检索API</el-checkbox>
-					<el-checkbox label="3">Javescript API</el-checkbox>
-				</el-checkbox-group>
-			</el-form-item>
-		</el-form>
-		<div v-if="stepActive==2">
-			<el-result icon="success" title="注册成功" sub-title="可以使用登录账号以及手机号登录系统">
-				<template #extra>
-					<el-button type="primary" @click="goLogin">前去登录</el-button>
-				</template>
-			</el-result>
-		</div>
-		<el-form style="text-align: center;">
-			<el-button v-if="stepActive>0 && stepActive<2" @click="pre">上一步</el-button>
-			<el-button v-if="stepActive<1" type="primary" @click="next">下一步</el-button>
-			<el-button v-if="stepActive==1" type="primary" @click="save">提交</el-button>
-		</el-form>
-		<el-dialog v-model="showAgree" title="平台服务协议" :width="800" destroy-on-close>
-			平台服务协议
-			<template #footer>
-				<el-button @click="showAgree=false">取消</el-button>
-				<el-button type="primary" @click="showAgree=false;form.agree=true;">我已阅读并同意</el-button>
-			</template>
-		</el-dialog>
-	</common-page>
-</template>
-
-<script>
-	import scPasswordStrength from '@/components/scPasswordStrength';
-	import commonPage from './components/commonPage'
-
-	export default {
-		components: {
-			commonPage,
-			scPasswordStrength
-		},
-		data() {
-			return {
-				stepActive: 0,
-				showAgree: false,
-				form: {
-					user: "",
-					password: "",
-					password2: "",
-					agree: false,
-					userName: "",
-					email: "",
-					userType: "1",
-					open: []
-				},
-				rules: {
-					user: [
-						{ required: true, message: '请输入账号名'}
-					],
-					password: [
-						{ required: true, message: '请输入密码'}
-					],
-					password2: [
-						{ required: true, message: '请再次输入密码'},
-						{validator: (rule, value, callback) => {
-							if (value !== this.form.password) {
-								callback(new Error('两次输入密码不一致'));
-							}else{
-								callback();
-							}
-						}}
-					],
-					agree: [
-						{validator: (rule, value, callback) => {
-							if (!value) {
-								callback(new Error('请阅读并同意协议'));
-							}else{
-								callback();
-							}
-						}}
-					],
-					userName: [
-						{ required: true, message: '请输入真实姓名'}
-					],
-					email: [
-						{ required: true, message: '请输入邮箱地址'}
-					],
-					userType: [
-						{ required: true, message: '请选择账户类型'}
-					],
-					open: [
-						{ required: true, message: '请选择开通类别'}
-					]
-				}
-			}
-		},
-		mounted() {
-
-		},
-		methods: {
-			pre(){
-				this.stepActive -= 1
-			},
-			next(){
-				const formName = `stepForm_${this.stepActive}`
-				this.$refs[formName].validate((valid) => {
-					if (valid) {
-						this.stepActive += 1
-					}else{
-						return false
-					}
-				})
-			},
-			save(){
-				const formName = `stepForm_${this.stepActive}`
-				this.$refs[formName].validate((valid) => {
-					if (valid) {
-						this.stepActive += 1
-					}else{
-						return false
-					}
-				})
-			},
-			goLogin(){
-				this.$router.push({
-					path: '/login'
-				})
-			}
-		}
-	}
-</script>
-
-<style scoped>
-
-
-</style>

+ 0 - 52
src/views/other/about.vue

@@ -1,52 +0,0 @@
-<template>
-	<el-main>
-		<el-row :gutter="15">
-			<el-col :lg="24">
-				<el-card shadow="never" class="aboutTop">
-					<div class="aboutTop-info">
-						<img src="img/logo.png">
-						<h2>{{data.name}}</h2>
-						<p>{{data.version}}</p>
-					</div>
-				</el-card>
-				<el-card shadow="never" header="dependencies">
-					<el-descriptions border :column="3">
-						<el-descriptions-item v-for="(value, key) in data.dependencies" :key="key" :label="key">{{value}}</el-descriptions-item>
-					</el-descriptions>
-				</el-card>
-				<el-card shadow="never" header="devDependencies">
-					<el-descriptions border :column="3">
-						<el-descriptions-item v-for="(value, key) in data.devDependencies" :key="key" :label="key">{{value}}</el-descriptions-item>
-					</el-descriptions>
-				</el-card>
-			</el-col>
-		</el-row>
-	</el-main>
-</template>
-
-<script>
-	import packageJson from '../../../package.json'
-
-	export default {
-		name: 'about',
-		data() {
-			return {
-				data: packageJson
-			}
-		},
-		mounted() {
-
-		},
-		methods: {
-
-		}
-	}
-</script>
-
-<style scoped>
-	.aboutTop {border:0;background: linear-gradient(to right, #8E54E9, #4776E6);color: #fff;}
-	.aboutTop-info {text-align: center}
-	.aboutTop-info img {width: 100px;}
-	.aboutTop-info h2 {font-size: 26px;margin-top: 15px;}
-	.aboutTop-info p {font-size: 16px;margin-top: 10px;}
-</style>

+ 0 - 58
src/views/other/directive.vue

@@ -1,58 +0,0 @@
-<template>
-	<el-main>
-		<el-card shadow="never" header="v-auth 高精度权限控制">
-			<el-button v-auth="'user.add'" type="primary">v-auth="'user.add'"</el-button>
-			<el-button v-auths="['user.no','user.add']" type="primary">v-auths="['user.no','user.add']"</el-button>
-			<el-button v-auths-all="['list.add','user.add']" type="primary">v-auths-all="['list.add','user.add']"</el-button>
-
-			<el-alert title="v-auth指令 是$AUTH的语法糖, 原先需要使用v-if来判断是否有权限, 判断单项权限,如果满足就判断有权限" style="margin-top: 20px;"></el-alert>
-			<el-alert title="v-auths指令 传入数组,有一项满足就判断有权限" style="margin-top: 20px;"></el-alert>
-			<el-alert title="v-auths-all指令 传入数组,必须全满足才有权限,比如user.no没有这个权限,加到这里的话就表示不全部满足" style="margin-top: 20px;"></el-alert>
-		</el-card>
-		<el-card shadow="never" header="v-role 角色权限控制" style="margin-top: 15px;">
-			<el-button v-role="'admin'" type="primary">v-role="'admin'"</el-button>
-			<el-button v-role="['SA','admin']" type="primary">v-role="['SA','admin']"</el-button>
-			<el-alert title="v-role指令 是$ROLE的语法糖, 原理是判断是否含有用户所在的角色别名" style="margin-top: 20px;"></el-alert>
-		</el-card>
-		<el-card shadow="never" header="v-time 时间转换" style="margin-top: 15px;">
-			<p>
-				<el-tag v-time="1630117968295" format="yyyy-MM-dd hh:mm:ss"></el-tag>
-			</p>
-			<p style="margin-top: 15px;">
-				<el-tag v-time.tip="time1"></el-tag>
-			</p>
-			<p style="margin-top: 15px;">
-				<el-tag v-time.tip="time2"></el-tag>
-			</p>
-			<p style="margin-top: 15px;">
-				<el-tag v-time.tip="time3"></el-tag>
-			</p>
-			<el-alert title="指令方式日期时间转换,如设置'tip'修饰符将会转换成相对时间,并且每60秒自动更新" style="margin-top: 20px;"></el-alert>
-		</el-card>
-		<el-card shadow="never" header="v-copy 一键复制" style="margin-top: 15px;">
-			<el-input type="textarea" :rows="2" placeholder="请输入内容" v-model="copyText"></el-input>
-			<el-button v-copy="copyText" type="primary" style="margin-top: 15px;">复制</el-button>
-			<el-alert title="点击复制按钮会将文本框绑定的值复制到剪切板, 试着粘贴到其他地方看看效果" style="margin-top: 20px;"></el-alert>
-		</el-card>
-	</el-main>
-</template>
-
-<script>
-export default {
-	name: 'directive',
-	data() {
-		return {
-			time1: new Date(),
-			time2: new Date().setMinutes(new Date().getMinutes()-1),
-			time3: new Date().setMinutes(new Date().getMinutes()-120),
-			copyText: '测试复制内容'
-		}
-	},
-	created() {
-
-	}
-}
-</script>
-
-<style>
-</style>

+ 0 - 32
src/views/other/fullpage.vue

@@ -1,32 +0,0 @@
-<template>
-	<el-container>
-		<el-header>
-			<el-page-header content="FullPage" @back="goBack" />
-		</el-header>
-		<el-main>
-			<el-empty description="FullPageMain"></el-empty>
-		</el-main>
-	</el-container>
-</template>
-
-<script>
-	export default {
-		name: 'fullpage',
-		data() {
-			return {
-
-			}
-		},
-		mounted() {
-
-		},
-		methods: {
-			goBack(){
-				this.$router.go(-1)
-			}
-		}
-	}
-</script>
-
-<style>
-</style>

+ 0 - 60
src/views/other/loadJS.vue

@@ -1,60 +0,0 @@
-<template>
-	<el-container>
-		<el-aside style="padding:15px;width: 400px;">
-			<el-card shadow="never" header="异步加载JS">
-				<div style="line-height: 1.5;font-size: 13px;">
-					<p>演示了使用 @/utils/load 加载百度地图的JSAPI和它的GL库BMapGLLib</p>
-					<p>当然也可以像传统网页一样加载任何JS和CSS,甚至可以是JQ。</p>
-					<br/>
-					<el-alert title="这是一项试验工具, 具有不稳定性" type="warning" show-icon :closable="false"/>
-				</div>
-			</el-card>
-		</el-aside>
-		<el-main class="nopadding">
-			<div style="width: 100%;height: 100%;" id="container"></div>
-		</el-main>
-	</el-container>
-</template>
-
-<script>
-	import { loadJS } from '@/utils/load'
-
-	export default {
-		name: 'loadJS',
-		data() {
-			return {
-
-			}
-		},
-		mounted() {
-			this.init()
-		},
-		methods: {
-			async init(){
-				var ak = "vxSbZuydZ42ktZCvXvy5xCai28OEVqUq"
-				//loadJS (src, keyName, callbackName)
-				//src 			必填,需要加载的URL路径
-				//keyName 		必填,有2个作用,作为唯一KEY防止N次插入DOM;作为JS返回对象的key名,类似百度地图的BMapGL,如果没有则返回null
-				//callbackName 	非必填,如果远程JS有callback,填写callback方法名称。
-				//loadJS返回Promise,如果全局对象eslint发出警告 需要//eslint-disable-next-line,暂时关闭警告行
-				//																							╭───这两个字符串要一致───╮
-				var BMapGL = await loadJS(`//api.map.baidu.com/api?type=webgl&v=1.0&ak=${ak}&callback=BMapGLinit`, "BMapGL", "BMapGLinit")
-				//像BMapGLLib就没有callback,无需第3个参数
-				//var BMapGLLib = await loadJS("//api.map.baidu.com/library/LuShu/gl/src/LuShu_min.js", "BMapGLLib")
-
-
-				var map = new BMapGL.Map('container')
-				map.centerAndZoom(new BMapGL.Point(116.297611, 40.047363), 20);
-				map.enableScrollWheelZoom()
-				map.setTilt(55)
-				map.setDisplayOptions({
-					poiText: false,
-					poiIcon: false
-				})
-			}
-		}
-	}
-</script>
-
-<style>
-</style>

+ 0 - 139
src/views/other/verificate.vue

@@ -1,139 +0,0 @@
-<template>
-	<el-main>
-		<el-card shadow="never" header="async-validator内置">
-			<el-form ref="form" :model="form" :rules="rules" label-width="100px" status-icon>
-				<el-form-item label="必填" prop="required">
-					<el-input v-model="form.required"></el-input>
-				</el-form-item>
-				<el-form-item label="长度" prop="length">
-					<el-input v-model="form.length" placeholder="长度需为3位"></el-input>
-				</el-form-item>
-				<el-form-item label="类型" prop="type">
-					<el-input v-model="form.type" placeholder="类型可为string number boolean array date url email等"></el-input>
-				</el-form-item>
-				<el-form-item label="范围" prop="range">
-					<el-input v-model="form.range" placeholder="请填写范围在3至5位"></el-input>
-				</el-form-item>
-				<el-form-item label="枚举" prop="enum">
-					<el-input v-model="form.enum" placeholder="请填写admin,user,guest其一"></el-input>
-				</el-form-item>
-				<el-form-item label="自定义" prop="custom">
-					<el-input v-model="form.custom" placeholder="请填写数字1"></el-input>
-				</el-form-item>
-				<el-form-item label="异步验证" prop="async">
-					<el-input v-model="form.async" placeholder="请输入SCUI最新版本号,form开启status-icon后 可以查看右侧状态"></el-input>
-				</el-form-item>
-				<el-form-item>
-					<el-button type="primary" @click="submit">验证所有字段</el-button>
-					<el-button @click="resetForm('form')">Reset</el-button>
-				</el-form-item>
-			</el-form>
-		</el-card>
-		<el-card shadow="never" header="自定义" style="margin-top: 15px;">
-			<el-form ref="form2" :model="form2" :rules="rules2" label-width="100px" status-icon>
-				<el-form-item label="手机号码" prop="phone">
-					<el-input v-model="form2.phone"></el-input>
-				</el-form-item>
-				<el-form-item label="车牌号码" prop="cars">
-					<el-input v-model="form2.cars"></el-input>
-				</el-form-item>
-				<el-form-item>
-					<el-button type="primary" @click="submit2">验证所有字段</el-button>
-					<el-button @click="resetForm('form2')">Reset</el-button>
-				</el-form-item>
-			</el-form>
-			<el-alert title="自定义验证可在 @/utils/verificate.js 中不断扩展业务需要的验证. 记得要 import 进来" type="success" />
-		</el-card>
-	</el-main>
-</template>
-
-<script>
-	import { verifyPhone, verifyCars } from '@/utils/verificate'
-
-	export default {
-		name: 'verificate',
-		data() {
-			return {
-				form: {
-
-				},
-				rules: {
-					required: [
-						{ required: true, message: '请填写' }
-					],
-					length: [
-						{ required: true, len: 3, message: '长度需为3位' }
-					],
-					type: [
-						{ required: true, type: 'email', message: '类型需为email' }
-					],
-					range: [
-						{ required: true, min: 3, max: 5, message: '范围在3至5位' }
-					],
-					enum: [
-						{ required: true, type: 'enum', enum: ['admin', 'user', 'guest'], message: '请填写admin,user,guest其一' }
-					],
-					custom: [
-						{ required: true, validator: (rule, value)=>{return value === '1'}, message: '请填写数字1' , trigger:'blur'}
-					],
-					async: [
-						{
-							required: true,
-							validator: (rule, value, callback)=>{
-								this.$API.demo.ver.get({value: value}).then(res => {
-									if(res.data != value){
-										return callback(new Error('请输入SCUI最新版本号:'+res.data))
-									}
-									callback()
-								})
-							},
-							trigger:'blur'
-						}
-					]
-				},
-				form2: {
-
-				},
-				rules2: {
-					phone: [
-						{ required: true, message: '请输入姓名' },
-						{ validator: verifyPhone, trigger:'blur' }
-					],
-					cars: [
-						{ required: true, validator: verifyCars, trigger:'blur' }
-					]
-				}
-			}
-		},
-		mounted() {
-
-		},
-		methods: {
-			submit(){
-				this.$refs.form.validate(async (valid) => {
-					if (valid) {
-						this.$message.success("全部验证通过")
-					}else{
-						return false;
-					}
-				})
-			},
-			submit2(){
-				this.$refs.form2.validate(async (valid) => {
-					if (valid) {
-						this.$message.success("全部验证通过")
-					}else{
-						return false;
-					}
-				})
-			},
-			resetForm(ref){
-				this.$refs[ref].resetFields()
-			}
-		}
-	}
-</script>
-
-<style>
-
-</style>

+ 0 - 82
src/views/other/viewTags.vue

@@ -1,82 +0,0 @@
-<template>
-	<el-main>
-		<el-card shadow="never" header="打开">
-			<el-button type="primary" plain @click="open1">打开个人信息</el-button>
-			<el-button type="primary" plain @click="open2">打开后执行</el-button>
-			<el-alert title="打开后执行原理: 路由push时,在当前路由对象中插入一个特殊标识, 在目标视图中beforeRouteEnter获取判断是否需要执行特殊方法" style="margin-top: 20px;"></el-alert>
-		</el-card>
-		<el-card shadow="never" header="刷新" style="margin-top: 15px;">
-			<el-button type="primary" plain @click="refresh1">刷新当前</el-button>
-		</el-card>
-		<el-card shadow="never" header="关闭" style="margin-top: 15px;">
-			<el-button type="primary" plain @click="close1">关闭当前</el-button>
-			<el-button type="primary" plain @click="close2">关闭其他</el-button>
-			<el-button type="primary" plain @click="close3">关闭后执行</el-button>
-		</el-card>
-		<el-card shadow="never" header="设置" style="margin-top: 15px;">
-			<el-form :inline="true">
-				<el-form-item>
-					<el-input v-model="input" placeholder="请输入内容"></el-input>
-				</el-form-item>
-				<el-form-item>
-					<el-button type="primary" plain @click="set1">设置标题</el-button>
-				</el-form-item>
-			</el-form>
-		</el-card>
-		<el-card shadow="never" header="整页路由" style="margin-top: 15px;">
-			<el-button type="primary" plain @click="fullpage">fullpage</el-button>
-			<el-alert title="变更路由的层级关系,向上推至顶级达到在layout视图中显示. 只需要在路由中设置 meta.fullpage 即可" style="margin-top: 20px;"></el-alert>
-		</el-card>
-	</el-main>
-</template>
-
-<script>
-	import useTabs from '@/utils/useTabs'
-
-	export default {
-		name: 'viewTags',
-		data() {
-			return {
-				input: "newTabName"
-			}
-		},
-		mounted() {
-
-		},
-		methods: {
-			open1(){
-				this.$router.push('/usercenter')
-			},
-			open2(){
-				this.$router.push('/usercenter')
-				this.$route.is = true
-			},
-			refresh1(){
-				useTabs.refresh()
-			},
-			close1(){
-				useTabs.close()
-			},
-			close2(){
-				useTabs.closeOther()
-			},
-			close3(){
-				useTabs.closeNext((tags)=>{
-					//回调返回所有标签的数组,这里其实是需要判断是否含有'/usercenter',含有再操作的,这里为了演示就直接打开了。
-					console.log(tags)
-					this.$router.push('/usercenter')
-					this.$route.is = true
-				})
-			},
-			set1(){
-				useTabs.setTitle(this.input)
-			},
-			fullpage(){
-				this.$router.push('/other/fullpage')
-			}
-		}
-	}
-</script>
-
-<style>
-</style>

+ 0 - 124
src/views/setting/client/index.vue

@@ -1,124 +0,0 @@
-<template>
-	<el-container>
-		<el-header>
-			<div class="left-panel">
-				<el-button type="primary" icon="el-icon-plus" @click="add"></el-button>
-				<el-button type="danger" plain icon="el-icon-delete" :disabled="selection.length==0" @click="batch_del"></el-button>
-			</div>
-		</el-header>
-		<el-main class="nopadding">
-			<scTable ref="table" :apiObj="apiObj" row-key="id" @selection-change="selectionChange" stripe>
-				<el-table-column type="selection" width="50"></el-table-column>
-				<el-table-column label="应用ID" prop="appId" width="150"></el-table-column>
-				<el-table-column label="应用名称" prop="appName" width="250"></el-table-column>
-				<el-table-column label="状态" width="50">
-					<template #default>
-						<el-icon style="color: #67C23A;"><el-icon-circle-check-filled /></el-icon>
-					</template>
-				</el-table-column>
-				<el-table-column label="秘钥" prop="secret" show-overflow-tooltip width="150"></el-table-column>
-				<el-table-column label="授权到期" prop="exp" width="150"></el-table-column>
-				<el-table-column label="操作" fixed="right" align="right" width="120">
-					<template #default="scope">
-						<el-button-group>
-							<el-button text type="primary" size="small" @click="table_edit(scope.row, scope.$index)">编辑</el-button>
-							<el-popconfirm title="确定删除吗?" @confirm="table_del(scope.row, scope.$index)">
-								<template #reference>
-									<el-button text type="primary" size="small">删除</el-button>
-								</template>
-							</el-popconfirm>
-						</el-button-group>
-					</template>
-				</el-table-column>
-			</scTable>
-		</el-main>
-	</el-container>
-
-	<save-dialog v-if="dialog.save" ref="saveDialog" @success="handleSuccess" @closed="dialog.save=false"></save-dialog>
-
-</template>
-
-<script>
-	import saveDialog from './save'
-
-	export default {
-		name: "client",
-		components: {
-			saveDialog
-		},
-		data(){
-			return {
-				dialog: {
-					save: false
-				},
-				apiObj: this.$API.system.app.list,
-				selection: []
-			}
-		},
-		methods: {
-			//增加
-			add(){
-				this.dialog.save = true
-				this.$nextTick(() => {
-					this.$refs.saveDialog.open()
-				})
-			},
-			//编辑
-			table_edit(row){
-				this.dialog.save = true
-				this.$nextTick(() => {
-					this.$refs.saveDialog.open('edit').setData(row)
-				})
-			},
-			//删除
-			async table_del(row, index){
-				var reqData = {id: row.id}
-				var res = await this.$API.user.del.post(reqData);
-				if(res.code == 200){
-					//这里选择刷新整个表格 OR 插入/编辑现有表格数据
-					this.$refs.table.tableData.splice(index, 1);
-					this.$message.success("删除成功")
-				}else{
-					this.$alert(res.message, "提示", {type: 'error'})
-				}
-			},
-			//批量删除
-			async batch_del(){
-				this.$confirm(`确定删除选中的 ${this.selection.length} 项吗?`, '提示', {
-					type: 'warning'
-				}).then(() => {
-					const loading = this.$loading();
-					this.selection.forEach(item => {
-						this.$refs.table.tableData.forEach((itemI, indexI) => {
-							if (item.id === itemI.id) {
-								this.$refs.table.tableData.splice(indexI, 1)
-							}
-						})
-					})
-					loading.close();
-					this.$message.success("操作成功")
-				}).catch(() => {
-
-				})
-			},
-			//表格选择后回调事件
-			selectionChange(selection){
-				this.selection = selection;
-			},
-			//本地更新数据
-			handleSuccess(data, mode){
-				if(mode=='add'){
-					data.id = new Date().getTime()
-					this.$refs.table.tableData.unshift(data)
-				}else if(mode=='edit'){
-					this.$refs.table.tableData.filter(item => item.id===data.id ).forEach(item => {
-						Object.assign(item, data)
-					})
-				}
-			}
-		}
-	}
-</script>
-
-<style>
-</style>

+ 0 - 109
src/views/setting/client/save.vue

@@ -1,109 +0,0 @@
-<template>
-	<el-dialog :title="titleMap[mode]" v-model="visible" :width="500" destroy-on-close @closed="$emit('closed')">
-		<el-form :model="form" :rules="rules" ref="dialogForm" label-width="100px" label-position="left">
-			<el-form-item label="应用标识" prop="appId">
-				<el-input v-model="form.appId" clearable></el-input>
-			</el-form-item>
-			<el-form-item label="应用名称" prop="appName">
-				<el-input v-model="form.appName" clearable></el-input>
-			</el-form-item>
-			<el-form-item label="秘钥" prop="secret">
-				<el-input v-model="form.secret" clearable></el-input>
-			</el-form-item>
-			<el-form-item label="类型范围" prop="type">
-				<el-checkbox-group v-model="form.type">
-					<el-checkbox-button label="ALL"></el-checkbox-button>
-					<el-checkbox-button label="UPDATA"></el-checkbox-button>
-					<el-checkbox-button label="QUERY"></el-checkbox-button>
-					<el-checkbox-button label="INSERT"></el-checkbox-button>
-				</el-checkbox-group>
-			</el-form-item>
-			<el-form-item label="授权至" prop="exp">
-				<el-date-picker v-model="form.exp" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择日期时间"></el-date-picker>
-			</el-form-item>
-		</el-form>
-		<template #footer>
-			<el-button @click="visible=false" >取 消</el-button>
-			<el-button type="primary" :loading="isSaveing" @click="submit()">保 存</el-button>
-		</template>
-	</el-dialog>
-</template>
-
-<script>
-	export default {
-		emits: ['success', 'closed'],
-		data() {
-			return {
-				mode: "add",
-				titleMap: {
-					add: '新增APP',
-					edit: '编辑APP'
-				},
-				form: {
-					id:"",
-					appId: "",
-					appName: "",
-					secret: "",
-					type: [],
-					exp: ""
-				},
-				rules: {
-					appId:[
-						{required: true, message: '请输入应用标识'}
-					],
-					appName:[
-						{required: true, message: '请输入应用名称'}
-					],
-					secret:[
-						{required: true, message: '请输入秘钥'}
-					],
-					type:[
-						{required: true, message: '请选择类型范围', trigger: 'change'}
-					],
-					exp:[
-						{required: true, message: '请选择授权到期日期', trigger: 'change'}
-					]
-				},
-				visible: false,
-				isSaveing: false
-			}
-		},
-		methods: {
-			//显示
-			open(mode='add'){
-				this.mode = mode;
-				this.visible = true;
-				return this;
-			},
-			//表单提交方法
-			submit(){
-				this.$refs.dialogForm.validate(async (valid) => {
-					if (valid) {
-						this.isSaveing = true;
-						var res = await this.$API.demo.post.post(this.form);
-						this.isSaveing = false;
-						if(res.code == 200){
-							this.$emit('success', this.form, this.mode)
-							this.visible = false;
-							this.$message.success("操作成功")
-						}else{
-							this.$alert(res.message, "提示", {type: 'error'})
-						}
-					}
-				})
-			},
-			//表单注入数据
-			setData(data){
-				this.form.id = data.id
-				this.form.appId = data.appId
-				this.form.appName = data.appName
-				this.form.secret = data.secret
-				this.form.type = data.type
-				this.form.exp = data.exp
-			}
-		}
-	}
-</script>
-
-<style>
-</style>

+ 0 - 153
src/views/setting/dept/index.vue

@@ -1,153 +0,0 @@
-<template>
-	<el-container>
-		<el-header>
-			<div class="left-panel">
-				<el-button type="primary" icon="el-icon-plus" @click="add"></el-button>
-				<el-button type="danger" plain icon="el-icon-delete" :disabled="selection.length==0" @click="batch_del"></el-button>
-			</div>
-			<div class="right-panel">
-				<div class="right-panel-search">
-					<el-input v-model="search.keyword" placeholder="部门名称" clearable></el-input>
-					<el-button type="primary" icon="el-icon-search" @click="upsearch"></el-button>
-				</div>
-			</div>
-		</el-header>
-		<el-main class="nopadding">
-			<scTable ref="table" :apiObj="apiObj" row-key="id" @selection-change="selectionChange" hidePagination>
-				<el-table-column type="selection" width="50"></el-table-column>
-				<el-table-column label="部门名称" prop="label" width="250"></el-table-column>
-				<el-table-column label="排序" prop="sort" width="150"></el-table-column>
-				<el-table-column label="状态" prop="status" width="150">
-					<template #default="scope">
-						<el-tag v-if="scope.row.status==1" type="success">启用</el-tag>
-						<el-tag v-if="scope.row.status==0" type="danger">停用</el-tag>
-					</template>
-				</el-table-column>
-				<el-table-column label="创建时间" prop="date" width="180"></el-table-column>
-				<el-table-column label="备注" prop="remark" min-width="300"></el-table-column>
-				<el-table-column label="操作" fixed="right" align="right" width="170">
-					<template #default="scope">
-						<el-button-group>
-							<el-button text type="primary" size="small" @click="table_show(scope.row, scope.$index)">查看</el-button>
-							<el-button text type="primary" size="small" @click="table_edit(scope.row, scope.$index)">编辑</el-button>
-							<el-popconfirm title="确定删除吗?" @confirm="table_del(scope.row, scope.$index)">
-								<template #reference>
-									<el-button text type="primary" size="small">删除</el-button>
-								</template>
-							</el-popconfirm>
-						</el-button-group>
-					</template>
-				</el-table-column>
-
-			</scTable>
-		</el-main>
-	</el-container>
-
-	<save-dialog v-if="dialog.save" ref="saveDialog" @success="handleSaveSuccess" @closed="dialog.save=false"></save-dialog>
-
-</template>
-
-<script>
-	import saveDialog from './save'
-
-	export default {
-		name: 'dept',
-		components: {
-			saveDialog
-		},
-		data() {
-			return {
-				dialog: {
-					save: false
-				},
-				apiObj: this.$API.system.dept.list,
-				selection: [],
-				search: {
-					keyword: null
-				}
-			}
-		},
-		methods: {
-			//添加
-			add(){
-				this.dialog.save = true
-				this.$nextTick(() => {
-					this.$refs.saveDialog.open()
-				})
-			},
-			//编辑
-			table_edit(row){
-				this.dialog.save = true
-				this.$nextTick(() => {
-					this.$refs.saveDialog.open('edit').setData(row)
-				})
-			},
-			//查看
-			table_show(row){
-				this.dialog.save = true
-				this.$nextTick(() => {
-					this.$refs.saveDialog.open('show').setData(row)
-				})
-			},
-			//删除
-			async table_del(row){
-				var reqData = {id: row.id}
-				var res = await this.$API.demo.post.post(reqData);
-				if(res.code == 200){
-					this.$refs.table.refresh()
-					this.$message.success("删除成功")
-				}else{
-					this.$alert(res.message, "提示", {type: 'error'})
-				}
-			},
-			//批量删除
-			async batch_del(){
-				this.$confirm(`确定删除选中的 ${this.selection.length} 项吗?如果删除项中含有子集将会被一并删除`, '提示', {
-					type: 'warning'
-				}).then(() => {
-					const loading = this.$loading();
-					this.$refs.table.refresh()
-					loading.close();
-					this.$message.success("操作成功")
-				}).catch(() => {
-
-				})
-			},
-			//表格选择后回调事件
-			selectionChange(selection){
-				this.selection = selection;
-			},
-			//搜索
-			upsearch(){
-
-			},
-			//根据ID获取树结构
-			filterTree(id){
-				var target = null;
-				function filter(tree){
-					tree.forEach(item => {
-						if(item.id == id){
-							target = item
-						}
-						if(item.children){
-							filter(item.children)
-						}
-					})
-				}
-				filter(this.$refs.table.tableData)
-				return target
-			},
-			//本地更新数据
-			handleSaveSuccess(data, mode){
-				if(mode=='add'){
-					this.$refs.table.refresh()
-				}else if(mode=='edit'){
-					this.$refs.table.refresh()
-				}
-			}
-		}
-	}
-</script>
-
-<style>
-</style>

+ 0 - 116
src/views/setting/dept/save.vue

@@ -1,116 +0,0 @@
-<template>
-	<el-dialog :title="titleMap[mode]" v-model="visible" :width="500" destroy-on-close @closed="$emit('closed')">
-		<el-form :model="form" :rules="rules" :disabled="mode=='show'" ref="dialogForm" label-width="100px">
-			<el-form-item label="上级部门" prop="parentId">
-				<el-cascader v-model="form.parentId" :options="groups" :props="groupsProps" :show-all-levels="false" clearable style="width: 100%;"></el-cascader>
-			</el-form-item>
-			<el-form-item label="部门名称" prop="label">
-				<el-input v-model="form.label" placeholder="请输入部门名称" clearable></el-input>
-			</el-form-item>
-			<el-form-item label="排序" prop="sort">
-				<el-input-number v-model="form.sort" controls-position="right" :min="1" style="width: 100%;"></el-input-number>
-			</el-form-item>
-			<el-form-item label="是否有效" prop="status">
-				<el-switch v-model="form.status" :active-value="1" :inactive-value="0"></el-switch>
-			</el-form-item>
-			<el-form-item label="备注" prop="remark">
-				<el-input v-model="form.remark" clearable type="textarea"></el-input>
-			</el-form-item>
-		</el-form>
-		<template #footer>
-			<el-button @click="visible=false" >取 消</el-button>
-			<el-button v-if="mode!='show'" type="primary" :loading="isSaveing" @click="submit()">保 存</el-button>
-		</template>
-	</el-dialog>
-</template>
-
-<script>
-	export default {
-		emits: ['success', 'closed'],
-		data() {
-			return {
-				mode: "add",
-				titleMap: {
-					add: '新增',
-					edit: '编辑',
-					show: '查看'
-				},
-				visible: false,
-				isSaveing: false,
-				//表单数据
-				form: {
-					id:"",
-					parentId: "",
-					label: "",
-					sort: 1,
-					status: "1",
-					remark: ""
-				},
-				//验证规则
-				rules: {
-					sort: [
-						{required: true, message: '请输入排序', trigger: 'change'}
-					],
-					label: [
-						{required: true, message: '请输入部门名称'}
-					]
-				},
-				//所需数据选项
-				groups: [],
-				groupsProps: {
-					value: "id",
-					emitPath: false,
-					checkStrictly: true
-				}
-			}
-		},
-		mounted() {
-			this.getGroup()
-		},
-		methods: {
-			//显示
-			open(mode='add'){
-				this.mode = mode;
-				this.visible = true;
-				return this
-			},
-			//加载树数据
-			async getGroup(){
-				var res = await this.$API.system.dept.list.get();
-				this.groups = res.data;
-			},
-			//表单提交方法
-			submit(){
-				this.$refs.dialogForm.validate(async (valid) => {
-					if (valid) {
-						this.isSaveing = true;
-						var res = await this.$API.demo.post.post(this.form);
-						this.isSaveing = false;
-						if(res.code == 200){
-							this.$emit('success', this.form, this.mode)
-							this.visible = false;
-							this.$message.success("操作成功")
-						}else{
-							this.$alert(res.message, "提示", {type: 'error'})
-						}
-					}
-				})
-			},
-			//表单注入数据
-			setData(data){
-				this.form.id = data.id
-				this.form.label = data.label
-				this.form.status = data.status
-				this.form.sort = data.sort
-				this.form.parentId = data.parentId
-				this.form.remark = data.remark
-
-				//可以和上面一样单个注入,也可以像下面一样直接合并进去
-				//Object.assign(this.form, data)
-			}
-		}
-	}
-</script>
-
-<style>
-</style>

+ 0 - 103
src/views/setting/dic/dic.vue

@@ -1,103 +0,0 @@
-<template>
-	<el-dialog :title="titleMap[mode]" v-model="visible" :width="330" destroy-on-close @closed="$emit('closed')">
-		<el-form :model="form" :rules="rules" ref="dialogForm" label-width="80px" label-position="left">
-			<el-form-item label="编码" prop="code">
-				<el-input v-model="form.code" clearable placeholder="字典编码"></el-input>
-			</el-form-item>
-			<el-form-item label="字典名称" prop="name">
-				<el-input v-model="form.name" clearable placeholder="字典显示名称"></el-input>
-			</el-form-item>
-			<el-form-item label="父路径" prop="parentId">
-				<el-cascader v-model="form.parentId" :options="dic" :props="dicProps" :show-all-levels="false" clearable></el-cascader>
-			</el-form-item>
-		</el-form>
-		<template #footer>
-			<el-button @click="visible=false" >取 消</el-button>
-			<el-button type="primary" :loading="isSaveing" @click="submit()">保 存</el-button>
-		</template>
-	</el-dialog>
-</template>
-
-<script>
-	export default {
-		emits: ['success', 'closed'],
-		data() {
-			return {
-				mode: "add",
-				titleMap: {
-					add: '新增字典',
-					edit: '编辑字典'
-				},
-				visible: false,
-				isSaveing: false,
-				form: {
-					id:"",
-					name: "",
-					code: "",
-					parentId: ""
-				},
-				rules: {
-					code: [
-						{required: true, message: '请输入编码'}
-					],
-					name: [
-						{required: true, message: '请输入字典名称'}
-					]
-				},
-				dic: [],
-				dicProps: {
-					value: "id",
-					label: "name",
-					emitPath: false,
-					checkStrictly: true
-				}
-			}
-		},
-		mounted() {
-			this.getDic()
-		},
-		methods: {
-			//显示
-			open(mode='add'){
-				this.mode = mode;
-				this.visible = true;
-				return this;
-			},
-			//获取字典列表
-			async getDic(){
-				var res = await this.$API.system.dic.tree.get();
-				this.dic = res.data;
-			},
-			//表单提交方法
-			submit(){
-				this.$refs.dialogForm.validate(async (valid) => {
-					if (valid) {
-						this.isSaveing = true;
-						var res = await this.$API.demo.post.post(this.form);
-						this.isSaveing = false;
-						if(res.code == 200){
-							this.$emit('success', this.form, this.mode)
-							this.visible = false;
-							this.$message.success("操作成功")
-						}else{
-							this.$alert(res.message, "提示", {type: 'error'})
-						}
-					}
-				})
-			},
-			//表单注入数据
-			setData(data){
-				this.form.id = data.id
-				this.form.name = data.name
-				this.form.code = data.code
-				this.form.parentId = data.parentId
-
-				//可以和上面一样单个注入,也可以像下面一样直接合并进去
-				//Object.assign(this.form, data)
-			}
-		}
-	}
-</script>
-
-<style>
-</style>

+ 0 - 333
src/views/setting/dic/index.vue

@@ -1,333 +0,0 @@
-<template>
-	<el-container>
-		<el-aside width="300px" v-loading="showDicloading">
-			<el-container>
-				<el-header>
-					<el-input placeholder="输入关键字进行过滤" v-model="dicFilterText" clearable></el-input>
-				</el-header>
-				<el-main class="nopadding">
-					<el-tree ref="dic" class="menu" node-key="id" :data="dicList" :props="dicProps" :highlight-current="true" :expand-on-click-node="false" :filter-node-method="dicFilterNode" @node-click="dicClick">
-						<template #default="{node, data}">
-							<span class="custom-tree-node">
-								<span class="label">{{ node.label }}</span>
-								<span class="code">{{ data.code }}</span>
-								<span class="do">
-									<el-button-group>
-										<el-button icon="el-icon-edit" size="small" @click.stop="dicEdit(data)"></el-button>
-										<el-button icon="el-icon-delete" size="small" @click.stop="dicDel(node, data)"></el-button>
-									</el-button-group>
-								</span>
-							</span>
-						</template>
-					</el-tree>
-				</el-main>
-				<el-footer style="height:51px;">
-					<el-button type="primary" size="small" icon="el-icon-plus" style="width: 100%;" @click="addDic">字典分类</el-button>
-				</el-footer>
-			</el-container>
-		</el-aside>
-		<el-container class="is-vertical">
-			<el-header>
-				<div class="left-panel">
-					<el-button type="primary" icon="el-icon-plus" @click="addInfo"></el-button>
-					<el-button type="danger" plain icon="el-icon-delete" :disabled="selection.length==0" @click="batch_del"></el-button>
-				</div>
-			</el-header>
-			<el-main class="nopadding">
-				<scTable ref="table" :apiObj="listApi" row-key="id" :params="listApiParams" @selection-change="selectionChange" stripe :paginationLayout="'prev, pager, next'">
-					<el-table-column type="selection" width="50"></el-table-column>
-					<el-table-column label="" width="60">
-						<template #default>
-							<el-tag class="move" style="cursor: move;"><el-icon-d-caret style="width: 1em; height: 1em;"/></el-tag>
-						</template>
-					</el-table-column>
-					<el-table-column label="名称" prop="name" width="150"></el-table-column>
-					<el-table-column label="键值" prop="key" width="150"></el-table-column>
-					<el-table-column label="是否有效" prop="yx" width="100">
-						<template #default="scope">
-							<el-switch v-model="scope.row.yx" @change="changeSwitch($event, scope.row)" :loading="scope.row.$switch_yx" active-value="1" inactive-value="0"></el-switch>
-						</template>
-					</el-table-column>
-					<el-table-column label="操作" fixed="right" align="right" width="120">
-						<template #default="scope">
-							<el-button-group>
-								<el-button text type="primary" size="small" @click="table_edit(scope.row, scope.$index)">编辑</el-button>
-								<el-popconfirm title="确定删除吗?" @confirm="table_del(scope.row, scope.$index)">
-									<template #reference>
-										<el-button text type="primary" size="small">删除</el-button>
-									</template>
-								</el-popconfirm>
-							</el-button-group>
-						</template>
-					</el-table-column>
-				</scTable>
-			</el-main>
-		</el-container>
-	</el-container>
-
-	<dic-dialog v-if="dialog.dic" ref="dicDialog" @success="handleDicSuccess" @closed="dialog.dic=false"></dic-dialog>
-
-	<list-dialog v-if="dialog.list" ref="listDialog" @success="handleListSuccess" @closed="dialog.list=false"></list-dialog>
-
-</template>
-
-<script>
-	import dicDialog from './dic'
-	import listDialog from './list'
-	import Sortable from 'sortablejs'
-
-	export default {
-		name: 'dic',
-		components: {
-			dicDialog,
-			listDialog
-		},
-		data() {
-			return {
-				dialog: {
-					dic: false,
-					info: false
-				},
-				showDicloading: true,
-				dicList: [],
-				dicFilterText: '',
-				dicProps: {
-					label: 'name'
-				},
-				listApi: null,
-				listApiParams: {},
-				selection: []
-			}
-		},
-		watch: {
-			dicFilterText(val) {
-				this.$refs.dic.filter(val);
-			}
-		},
-		mounted() {
-			this.getDic()
-			this.rowDrop()
-		},
-		methods: {
-			//加载树数据
-			async getDic(){
-				var res = await this.$API.system.dic.tree.get();
-				this.showDicloading = false;
-				this.dicList = res.data;
-				//获取第一个节点,设置选中 & 加载明细列表
-				var firstNode = this.dicList[0];
-				if(firstNode){
-					this.$nextTick(() => {
-						this.$refs.dic.setCurrentKey(firstNode.id)
-					})
-					this.listApiParams = {
-						code: firstNode.code
-					}
-					this.listApi = this.$API.system.dic.list;
-				}
-			},
-			//树过滤
-			dicFilterNode(value, data){
-				if (!value) return true;
-				var targetText = data.name + data.code;
-				return targetText.indexOf(value) !== -1;
-			},
-			//树增加
-			addDic(){
-				this.dialog.dic = true
-				this.$nextTick(() => {
-					this.$refs.dicDialog.open()
-				})
-			},
-			//编辑树
-			dicEdit(data){
-				this.dialog.dic = true
-				this.$nextTick(() => {
-					var editNode = this.$refs.dic.getNode(data.id);
-					var editNodeParentId =  editNode.level==1?undefined:editNode.parent.data.id
-					data.parentId = editNodeParentId
-					this.$refs.dicDialog.open('edit').setData(data)
-				})
-			},
-			//树点击事件
-			dicClick(data){
-				this.$refs.table.reload({
-					code: data.code
-				})
-			},
-			//删除树
-			dicDel(node, data){
-				this.$confirm(`确定删除 ${data.name} 项吗?`, '提示', {
-					type: 'warning'
-				}).then(() => {
-					this.showDicloading = true;
-
-					//删除节点是否为高亮当前 是的话 设置第一个节点高亮
-					var dicCurrentKey = this.$refs.dic.getCurrentKey();
-					this.$refs.dic.remove(data.id)
-					if(dicCurrentKey == data.id){
-						var firstNode = this.dicList[0];
-						if(firstNode){
-							this.$refs.dic.setCurrentKey(firstNode.id);
-							this.$refs.table.upData({
-								code: firstNode.code
-							})
-						}else{
-							this.listApi = null;
-							this.$refs.table.tableData = []
-						}
-					}
-
-					this.showDicloading = false;
-					this.$message.success("操作成功")
-				}).catch(() => {
-
-				})
-			},
-			//行拖拽
-			rowDrop(){
-				const _this = this
-				const tbody = this.$refs.table.$el.querySelector('.el-table__body-wrapper tbody')
-				Sortable.create(tbody, {
-					handle: ".move",
-					animation: 300,
-					ghostClass: "ghost",
-					onEnd({ newIndex, oldIndex }) {
-						const tableData = _this.$refs.table.tableData
-						const currRow = tableData.splice(oldIndex, 1)[0]
-						tableData.splice(newIndex, 0, currRow)
-						_this.$message.success("排序成功")
-					}
-				})
-			},
-			//添加明细
-			addInfo(){
-				this.dialog.list = true
-				this.$nextTick(() => {
-					var dicCurrentKey = this.$refs.dic.getCurrentKey();
-					const data = {
-						dic: dicCurrentKey
-					}
-					this.$refs.listDialog.open().setData(data)
-				})
-			},
-			//编辑明细
-			table_edit(row){
-				this.dialog.list = true
-				this.$nextTick(() => {
-					this.$refs.listDialog.open('edit').setData(row)
-				})
-			},
-			//删除明细
-			async table_del(row, index){
-				var reqData = {id: row.id}
-				var res = await this.$API.demo.post.post(reqData);
-				if(res.code == 200){
-					this.$refs.table.tableData.splice(index, 1);
-					this.$message.success("删除成功")
-				}else{
-					this.$alert(res.message, "提示", {type: 'error'})
-				}
-			},
-			//批量删除
-			async batch_del(){
-				this.$confirm(`确定删除选中的 ${this.selection.length} 项吗?`, '提示', {
-					type: 'warning'
-				}).then(() => {
-					const loading = this.$loading();
-					this.selection.forEach(item => {
-						this.$refs.table.tableData.forEach((itemI, indexI) => {
-							if (item.id === itemI.id) {
-								this.$refs.table.tableData.splice(indexI, 1)
-							}
-						})
-					})
-					loading.close();
-					this.$message.success("操作成功")
-				}).catch(() => {
-
-				})
-			},
-			//提交明细
-			saveList(){
-				this.$refs.listDialog.submit(async (formData) => {
-					this.isListSaveing = true;
-					var res = await this.$API.demo.post.post(formData);
-					this.isListSaveing = false;
-					if(res.code == 200){
-						//这里选择刷新整个表格 OR 插入/编辑现有表格数据
-						this.listDialogVisible = false;
-						this.$message.success("操作成功")
-					}else{
-						this.$alert(res.message, "提示", {type: 'error'})
-					}
-				})
-			},
-			//表格选择后回调事件
-			selectionChange(selection){
-				this.selection = selection;
-			},
-			//表格内开关事件
-			changeSwitch(val, row){
-				//1.还原数据
-				row.yx = row.yx == '1'?'0':'1'
-				//2.执行加载
-				row.$switch_yx = true;
-				//3.等待接口返回后改变值
-				setTimeout(()=>{
-					delete row.$switch_yx;
-					row.yx = val;
-					this.$message.success(`操作成功id:${row.id} val:${val}`)
-				}, 500)
-			},
-			//本地更新数据
-			handleDicSuccess(data, mode){
-				if(mode=='add'){
-					data.id = new Date().getTime()
-					if(this.dicList.length > 0){
-						this.$refs.table.upData({
-							code: data.code
-						})
-					}else{
-						this.listApiParams = {
-							code: data.code
-						}
-						this.listApi = this.$API.dic.info;
-					}
-					this.$refs.dic.append(data, data.parentId[0])
-					this.$refs.dic.setCurrentKey(data.id)
-				}else if(mode=='edit'){
-					var editNode = this.$refs.dic.getNode(data.id);
-					//判断是否移动?
-					var editNodeParentId =  editNode.level==1?undefined:editNode.parent.data.id
-					if(editNodeParentId != data.parentId){
-						var obj = editNode.data;
-						this.$refs.dic.remove(data.id)
-						this.$refs.dic.append(obj, data.parentId[0])
-					}
-					Object.assign(editNode.data, data)
-				}
-			},
-			//本地更新数据
-			handleListSuccess(data, mode){
-				if(mode=='add'){
-					data.id = new Date().getTime()
-					this.$refs.table.tableData.push(data)
-				}else if(mode=='edit'){
-					this.$refs.table.tableData.filter(item => item.id===data.id ).forEach(item => {
-						Object.assign(item, data)
-					})
-				}
-			}
-		}
-	}
-</script>
-
-<style scoped>
-	.menu:deep(.el-tree-node__label) {display: flex;flex: 1;height:100%;}
-	.custom-tree-node {display: flex;flex: 1;align-items: center;justify-content: space-between;font-size: 14px;padding-right: 24px;height:100%;}
-	.custom-tree-node .code {font-size: 12px;color: #999;}
-	.custom-tree-node .do {display: none;}
-	.custom-tree-node:hover .code {display: none;}
-	.custom-tree-node:hover .do {display: inline-block;}
-</style>

+ 0 - 111
src/views/setting/dic/list.vue

@@ -1,111 +0,0 @@
-<template>
-	<el-dialog :title="titleMap[mode]" v-model="visible" :width="400" destroy-on-close @closed="$emit('closed')">
-		<el-form :model="form" :rules="rules" ref="dialogForm" label-width="100px" label-position="left">
-			<el-form-item label="所属字典" prop="dic">
-				<el-cascader v-model="form.dic" :options="dic" :props="dicProps" :show-all-levels="false" clearable></el-cascader>
-			</el-form-item>
-			<el-form-item label="项名称" prop="name">
-				<el-input v-model="form.name" clearable></el-input>
-			</el-form-item>
-			<el-form-item label="键值" prop="key">
-				<el-input v-model="form.key" clearable></el-input>
-			</el-form-item>
-			<el-form-item label="是否有效" prop="yx">
-				<el-switch v-model="form.yx" active-value="1" inactive-value="0"></el-switch>
-			</el-form-item>
-		</el-form>
-		<template #footer>
-			<el-button @click="visible=false" >取 消</el-button>
-			<el-button type="primary" :loading="isSaveing" @click="submit()">保 存</el-button>
-		</template>
-	</el-dialog>
-</template>
-
-<script>
-	export default {
-		emits: ['success', 'closed'],
-		data() {
-			return {
-				mode: "add",
-				titleMap: {
-					add: '新增项',
-					edit: '编辑项'
-				},
-				visible: false,
-				isSaveing: false,
-				form: {
-					id: "",
-					dic: "",
-					name: "",
-					key: "",
-					yx: "1"
-				},
-				rules: {
-					dic: [
-						{required: true, message: '请选择所属字典'}
-					],
-					name: [
-						{required: true, message: '请输入项名称'}
-					],
-					key: [
-						{required: true, message: '请输入键值'}
-					]
-				},
-				dic: [],
-				dicProps: {
-					value: "id",
-					label: "name",
-					emitPath: false,
-					checkStrictly: true
-				}
-			}
-		},
-		mounted() {
-			if(this.params){
-				this.form.dic = this.params.code
-			}
-			this.getDic()
-		},
-		methods: {
-			//显示
-			open(mode='add'){
-				this.mode = mode;
-				this.visible = true;
-				return this;
-			},
-			//获取字典列表
-			async getDic(){
-				var res = await this.$API.system.dic.tree.get();
-				this.dic = res.data;
-			},
-			//表单提交方法
-			submit(){
-				this.$refs.dialogForm.validate(async (valid) => {
-					if (valid) {
-						this.isSaveing = true;
-						var res = await this.$API.demo.post.post(this.form);
-						this.isSaveing = false;
-						if(res.code == 200){
-							this.$emit('success', this.form, this.mode)
-							this.visible = false;
-							this.$message.success("操作成功")
-						}else{
-							this.$alert(res.message, "提示", {type: 'error'})
-						}
-					}
-				})
-			},
-			//表单注入数据
-			setData(data){
-				this.form.id = data.id
-				this.form.name = data.name
-				this.form.key = data.key
-				this.form.yx = data.yx
-				this.form.dic = data.dic
-			}
-		}
-	}
-</script>
-
-<style>
-</style>

+ 0 - 142
src/views/setting/log/index.vue

@@ -1,142 +0,0 @@
-<template>
-	<el-container>
-		<el-aside width="220px">
-			<el-tree ref="category" class="menu" node-key="label" :data="category" :default-expanded-keys="['系统日志']" current-node-key="系统日志" :highlight-current="true" :expand-on-click-node="false">
-			</el-tree>
-		</el-aside>
-		<el-container>
-			<el-main class="nopadding">
-				<el-container>
-					<el-header>
-						<div class="left-panel">
-							<el-date-picker v-model="date" type="datetimerange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
-						</div>
-						<div class="right-panel">
-
-						</div>
-					</el-header>
-					<el-header style="height:150px;">
-						<scEcharts height="100%" :option="logsChartOption"></scEcharts>
-					</el-header>
-					<el-main class="nopadding">
-						<scTable ref="table" :apiObj="apiObj" stripe highlightCurrentRow @row-click="rowClick">
-							<el-table-column label="级别" prop="level" width="60">
-								<template #default="scope">
-									<el-icon v-if="scope.row.level=='error'" style="color: #F56C6C;"><el-icon-circle-close-filled /></el-icon>
-									<el-icon v-if="scope.row.level=='warn'" style="color: #E6A23C;"><el-icon-warning-filled /></el-icon>
-									<el-icon v-if="scope.row.level=='info'" style="color: #409EFF;"><el-icon-info-filled /></el-icon>
-								</template>
-							</el-table-column>
-							<el-table-column label="ID" prop="id" width="180"></el-table-column>
-							<el-table-column label="日志名" prop="name" width="150"></el-table-column>
-							<el-table-column label="请求接口" prop="url" width="150"></el-table-column>
-							<el-table-column label="请求方法" prop="type" width="150"></el-table-column>
-							<el-table-column label="用户" prop="user" width="150"></el-table-column>
-							<el-table-column label="客户端IP" prop="cip" width="150"></el-table-column>
-							<el-table-column label="日志时间" prop="time" width="170"></el-table-column>
-						</scTable>
-					</el-main>
-				</el-container>
-			</el-main>
-		</el-container>
-	</el-container>
-
-	<el-drawer v-model="infoDrawer" title="日志详情" :size="600" destroy-on-close>
-		<info ref="info"></info>
-	</el-drawer>
-</template>
-
-<script>
-	import info from './info'
-	import scEcharts from '@/components/scEcharts'
-
-	export default {
-		name: 'log',
-		components: {
-			info,
-			scEcharts
-		},
-		data() {
-			return {
-				infoDrawer: false,
-				logsChartOption: {
-					color: ['#409eff','#e6a23c','#f56c6c'],
-					grid: {
-						top: '0px',
-						left: '10px',
-						right: '10px',
-						bottom: '0px'
-					},
-					tooltip: {
-						trigger: 'axis'
-					},
-					xAxis: {
-						type: 'category',
-						boundaryGap: false,
-						data: ['2021-07-01', '2021-07-02', '2021-07-03', '2021-07-04', '2021-07-05', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-10', '2021-07-11', '2021-07-12', '2021-07-13', '2021-07-14', '2021-07-15']
-					},
-					yAxis: {
-						show: false,
-						type: 'value'
-					},
-					series: [{
-						data: [120, 200, 150, 80, 70, 110, 130, 120, 200, 150, 80, 70, 110, 130, 70, 110],
-						type: 'bar',
-						stack: 'log',
-						barWidth: '15px'
-					},
-					{
-						data: [15, 26, 7, 12, 13, 9, 21, 15, 26, 7, 12, 13, 9, 21, 12, 3],
-						type: 'bar',
-						stack: 'log',
-						barWidth: '15px'
-					},
-					{
-						data: [0, 0, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
-						type: 'bar',
-						stack: 'log',
-						barWidth: '15px'
-					}]
-				},
-				category: [
-					{
-						label: '系统日志',
-						children: [
-							{label: 'debug'},
-							{label: 'info'},
-							{label: 'warn'},
-							{label: 'error'},
-							{label: 'fatal'}
-						]
-					},
-					{
-						label: '应用日志',
-						children: [
-							{label: 'selfHelp'},
-							{label: 'WechatApp'}
-						]
-					}
-				],
-				date: [],
-				apiObj: this.$API.system.log.list,
-				search: {
-					keyword: ""
-				}
-			}
-		},
-		methods: {
-			upsearch(){
-
-			},
-			rowClick(row){
-				this.infoDrawer = true
-				this.$nextTick(() => {
-					this.$refs.info.setData(row)
-				})
-			}
-		}
-	}
-</script>
-
-<style>
-</style>

+ 0 - 54
src/views/setting/log/info.vue

@@ -1,54 +0,0 @@
-<template>
-
-	<el-main style="padding:0 20px;">
-		<el-descriptions :column="1" border size="small">
-			<el-descriptions-item label="请求接口">{{data.url}}</el-descriptions-item>
-			<el-descriptions-item label="请求方法">{{data.type}}</el-descriptions-item>
-			<el-descriptions-item label="状态代码">{{data.code}}</el-descriptions-item>
-			<el-descriptions-item label="日志名">{{data.name}}</el-descriptions-item>
-			<el-descriptions-item label="日志时间">{{data.time}}</el-descriptions-item>
-		</el-descriptions>
-		<el-collapse v-model="activeNames" style="margin-top: 20px;">
-			<el-collapse-item title="常规" name="1">
-				<el-alert title="在没有配置的 DNS 服务器响应之后,名称 update-khd.2345.cc 的名称解析超时。" :type="typeMap[data.level]" :closable="false"></el-alert>
-			</el-collapse-item>
-			<el-collapse-item title="详细" name="2">
-				<div class="code">
-					Request: {
-						User-Agent: "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"
-					},
-					Response: {
-						Content-Type: "application/json; charset=utf-8",
-						Date: "Fri, 25 Jun 2021 03:02:14 GMT",
-						Server: "nginx/1.17.8"
-					}
-				</div>
-			</el-collapse-item>
-		</el-collapse>
-	</el-main>
-</template>
-
-<script>
-	export default {
-		data() {
-			return {
-				data: {},
-				activeNames: ['1'],
-				typeMap: {
-					'info': "info",
-					'warn': "warning",
-					'error': "error"
-				}
-			}
-		},
-		methods: {
-			setData(data){
-				this.data = data
-			}
-		}
-	}
-</script>
-
-<style scoped>
-	.code {background: #848484;padding:15px;color: #fff;font-size: 12px;border-radius: 4px;}
-</style>

+ 0 - 165
src/views/setting/menu/index.vue

@@ -1,165 +0,0 @@
-<template>
-	<el-container>
-		<el-aside width="300px" v-loading="menuloading">
-			<el-container>
-				<el-header>
-					<el-input placeholder="输入关键字进行过滤" v-model="menuFilterText" clearable></el-input>
-				</el-header>
-				<el-main class="nopadding">
-					<el-tree ref="menu" class="menu" node-key="id" :data="menuList" :props="menuProps" draggable highlight-current :expand-on-click-node="false" check-strictly show-checkbox :filter-node-method="menuFilterNode" @node-click="menuClick" @node-drop="nodeDrop">
-
-						<template #default="{node, data}">
-							<span class="custom-tree-node">
-								<span class="label">
-									{{ node.label }}
-								</span>
-								<span class="do">
-									<el-button icon="el-icon-plus" size="small" @click.stop="add(node, data)"></el-button>
-								</span>
-							</span>
-						</template>
-
-					</el-tree>
-				</el-main>
-				<el-footer style="height:51px;">
-					<el-button type="primary" size="small" icon="el-icon-plus" @click="add()"></el-button>
-					<el-button type="danger" size="small" plain icon="el-icon-delete" @click="delMenu"></el-button>
-				</el-footer>
-			</el-container>
-		</el-aside>
-		<el-container>
-			<el-main class="nopadding" style="padding:20px;" ref="main">
-				<save ref="save" :menu="menuList"></save>
-			</el-main>
-		</el-container>
-	</el-container>
-</template>
-
-<script>
-	let newMenuIndex = 1;
-	import save from './save'
-
-	export default {
-		name: "settingMenu",
-		components: {
-			save
-		},
-		data(){
-			return {
-				menuloading: false,
-				menuList: [],
-				menuProps: {
-					label: (data)=>{
-						return data.meta.title
-					}
-				},
-				menuFilterText: ""
-			}
-		},
-		watch: {
-			menuFilterText(val){
-				this.$refs.menu.filter(val);
-			}
-		},
-		mounted() {
-			this.getMenu();
-		},
-		methods: {
-			//加载树数据
-			async getMenu(){
-				this.menuloading = true
-				var res = await this.$API.system.menu.list.get();
-				this.menuloading = false
-				this.menuList = res.data;
-			},
-			//树点击
-			menuClick(data, node){
-				var pid = node.level==1?undefined:node.parent.data.id;
-				this.$refs.save.setData(data, pid)
-				this.$refs.main.$el.scrollTop = 0
-			},
-			//树过滤
-			menuFilterNode(value, data){
-				if (!value) return true;
-				var targetText = data.meta.title;
-				return targetText.indexOf(value) !== -1;
-			},
-			//树拖拽
-			nodeDrop(draggingNode, dropNode, dropType){
-				this.$refs.save.setData({})
-				this.$message(`拖拽对象:${draggingNode.data.meta.title}, 释放对象:${dropNode.data.meta.title}, 释放对象的位置:${dropType}`)
-			},
-			//增加
-			async add(node, data){
-				var newMenuName = "未命名" + newMenuIndex++;
-				var newMenuData = {
-					parentId: data ? data.id : "",
-					name: newMenuName,
-					path: "",
-					component: "",
-					meta:{
-						title: newMenuName,
-						type: "menu"
-					}
-				}
-				this.menuloading = true
-				var res = await this.$API.demo.post.post(newMenuData)
-				this.menuloading = false
-				newMenuData.id = res.data
-
-				this.$refs.menu.append(newMenuData, node)
-				this.$refs.menu.setCurrentKey(newMenuData.id)
-				var pid = node ? node.data.id : ""
-				this.$refs.save.setData(newMenuData, pid)
-			},
-			//删除菜单
-			async delMenu(){
-				var CheckedNodes = this.$refs.menu.getCheckedNodes()
-				if(CheckedNodes.length == 0){
-					this.$message.warning("请选择需要删除的项")
-					return false;
-				}
-
-				var confirm = await this.$confirm('确认删除已选择的菜单吗?','提示', {
-					type: 'warning',
-					confirmButtonText: '删除',
-					confirmButtonClass: 'el-button--danger'
-				}).catch(() => {})
-				if(confirm != 'confirm'){
-					return false
-				}
-
-				this.menuloading = true
-				var reqData = {
-					ids: CheckedNodes.map(item => item.id)
-				}
-				var res = await this.$API.demo.post.post(reqData)
-				this.menuloading = false
-
-				if(res.code == 200){
-					CheckedNodes.forEach(item => {
-						var node = this.$refs.menu.getNode(item)
-						if(node.isCurrent){
-							this.$refs.save.setData({})
-						}
-						this.$refs.menu.remove(item)
-					})
-				}else{
-					this.$message.warning(res.message)
-				}
-			}
-		}
-	}
-</script>
-
-<style scoped>
-	.menu:deep(.el-tree-node__label) {display: flex;flex: 1;height:100%;}
-	.custom-tree-node {display: flex;flex: 1;align-items: center;justify-content: space-between;font-size: 14px;height:100%;padding-right:24px;}
-	.custom-tree-node .label {display: flex;align-items: center;;height: 100%;}
-	.custom-tree-node .label .el-tag {margin-left: 5px;}
-	.custom-tree-node .do {display: none;}
-	.custom-tree-node .do i {margin-left:5px;color: #999;}
-	.custom-tree-node .do i:hover {color: #333;}
-
-	.custom-tree-node:hover .do {display: inline-block;}
-</style>

+ 0 - 194
src/views/setting/menu/save.vue

@@ -1,194 +0,0 @@
-<template>
-	<el-row :gutter="40">
-		<el-col v-if="!form.id">
-			<el-empty description="请选择左侧菜单后操作" :image-size="100"></el-empty>
-		</el-col>
-		<template v-else>
-			<el-col :lg="12">
-				<h2>{{form.meta.title || "新增菜单"}}</h2>
-				<el-form :model="form" :rules="rules" ref="dialogForm" label-width="80px" label-position="left">
-					<el-form-item label="显示名称" prop="meta.title">
-						<el-input v-model="form.meta.title" clearable placeholder="菜单显示名字"></el-input>
-					</el-form-item>
-					<el-form-item label="上级菜单" prop="parentId">
-						<el-cascader v-model="form.parentId" :options="menuOptions" :props="menuProps" :show-all-levels="false" placeholder="顶级菜单" clearable disabled></el-cascader>
-					</el-form-item>
-					<el-form-item label="类型" prop="meta.type">
-						<el-radio-group v-model="form.meta.type">
-							<el-radio-button label="menu">菜单</el-radio-button>
-							<el-radio-button label="iframe">Iframe</el-radio-button>
-							<el-radio-button label="link">外链</el-radio-button>
-							<el-radio-button label="button">按钮</el-radio-button>
-						</el-radio-group>
-					</el-form-item>
-					<el-form-item label="别名" prop="name">
-						<el-input v-model="form.name" clearable placeholder="菜单别名"></el-input>
-						<div class="el-form-item-msg">系统唯一且与内置组件名一致,否则导致缓存失效。如类型为Iframe的菜单,别名将代替源地址显示在地址栏</div>
-					</el-form-item>
-					<el-form-item label="菜单图标" prop="meta.icon">
-						<sc-icon-select v-model="form.meta.icon" clearable></sc-icon-select>
-					</el-form-item>
-					<el-form-item label="路由地址" prop="path">
-						<el-input v-model="form.path" clearable placeholder=""></el-input>
-					</el-form-item>
-					<el-form-item label="重定向" prop="redirect">
-						<el-input v-model="form.redirect" clearable placeholder=""></el-input>
-					</el-form-item>
-					<el-form-item label="菜单高亮" prop="active">
-						<el-input v-model="form.active" clearable placeholder=""></el-input>
-						<div class="el-form-item-msg">子节点或详情页需要高亮的上级菜单路由地址</div>
-					</el-form-item>
-					<el-form-item label="视图" prop="component">
-						<el-input v-model="form.component" clearable placeholder="">
-							<template #prepend>views/</template>
-						</el-input>
-						<div class="el-form-item-msg">如父节点、链接或Iframe等没有视图的菜单不需要填写</div>
-					</el-form-item>
-					<el-form-item label="颜色" prop="color">
-						<el-color-picker v-model="form.meta.color" :predefine="predefineColors"></el-color-picker>
-
-					</el-form-item>
-					<el-form-item label="是否隐藏" prop="meta.hidden">
-						<el-checkbox v-model="form.meta.hidden">隐藏菜单</el-checkbox>
-						<el-checkbox v-model="form.meta.hiddenBreadcrumb">隐藏面包屑</el-checkbox>
-						<div class="el-form-item-msg">菜单不显示在导航中,但用户依然可以访问,例如详情页</div>
-					</el-form-item>
-					<el-form-item label="整页路由" prop="fullpage">
-						<el-switch v-model="form.meta.fullpage" />
-					</el-form-item>
-					<el-form-item label="标签" prop="tag">
-						<el-input v-model="form.meta.tag" clearable placeholder=""></el-input>
-					</el-form-item>
-					<el-form-item>
-						<el-button type="primary" @click="save" :loading="loading">保 存</el-button>
-					</el-form-item>
-				</el-form>
-
-			</el-col>
-			<el-col :lg="12" class="apilist">
-				<h2>接口权限</h2>
-				<sc-form-table v-model="form.apiList" :addTemplate="apiListAddTemplate" placeholder="暂无匹配接口权限">
-					<el-table-column prop="code" label="标识" width="150">
-						<template #default="scope">
-							<el-input v-model="scope.row.code" placeholder="请输入内容"></el-input>
-						</template>
-					</el-table-column>
-					<el-table-column prop="url" label="Api url">
-						<template #default="scope">
-							<el-input v-model="scope.row.url" placeholder="请输入内容"></el-input>
-						</template>
-					</el-table-column>
-				</sc-form-table>
-			</el-col>
-		</template>
-	</el-row>
-
-</template>
-
-<script>
-	import scIconSelect from '@/components/scIconSelect'
-
-	export default {
-		components: {
-			scIconSelect
-		},
-		props: {
-			menu: { type: Object, default: () => {} },
-		},
-		data(){
-			return {
-				form: {
-					id: "",
-					parentId: "",
-					name: "",
-					path: "",
-					component: "",
-					redirect: "",
-					meta:{
-						title: "",
-						icon: "",
-						active: "",
-						color: "",
-						type: "menu",
-						fullpage: false,
-						tag: "",
-					},
-					apiList: []
-				},
-				menuOptions: [],
-				menuProps: {
-					value: 'id',
-					label: 'title',
-					checkStrictly: true
-				},
-				predefineColors: [
-					'#ff4500',
-					'#ff8c00',
-					'#ffd700',
-					'#67C23A',
-					'#00ced1',
-					'#409EFF',
-					'#c71585'
-				],
-				rules: [],
-				apiListAddTemplate: {
-					code: "",
-					url: ""
-				},
-				loading: false
-			}
-		},
-		watch: {
-			menu: {
-				handler(){
-					this.menuOptions = this.treeToMap(this.menu)
-				},
-				deep: true
-			}
-		},
-		mounted() {
-
-		},
-		methods: {
-			//简单化菜单
-			treeToMap(tree){
-				const map = []
-				tree.forEach(item => {
-					var obj = {
-						id: item.id,
-						parentId: item.parentId,
-						title: item.meta.title,
-						children: item.children&&item.children.length>0 ? this.treeToMap(item.children) : null
-					}
-					map.push(obj)
-				})
-				return map
-			},
-			//保存
-			async save(){
-				this.loading = true
-				var res = await this.$API.demo.post.post(this.form)
-				this.loading = false
-				if(res.code == 200){
-					this.$message.success("保存成功")
-				}else{
-					this.$message.warning(res.message)
-				}
-			},
-			//表单注入数据
-			setData(data, pid){
-				this.form = data
-				this.form.apiList = data.apiList || []
-				this.form.parentId = pid
-			}
-		}
-	}
-</script>
-
-<style scoped>
-	h2 {font-size: 17px;color: #3c4a54;padding:0 0 30px 0;}
-	.apilist {border-left: 1px solid #eee;}
-
-	[data-theme="dark"] h2 {color: #fff;}
-	[data-theme="dark"] .apilist {border-color: #434343;}
-</style>

+ 0 - 177
src/views/setting/role/index.vue

@@ -1,177 +0,0 @@
-<template>
-	<el-container>
-		<el-header>
-			<div class="left-panel">
-				<el-button type="primary" icon="el-icon-plus" @click="add"></el-button>
-				<el-button type="danger" plain icon="el-icon-delete" :disabled="selection.length==0" @click="batch_del"></el-button>
-				<el-button type="primary" plain :disabled="selection.length!=1" @click="permission">权限设置</el-button>
-			</div>
-			<div class="right-panel">
-				<div class="right-panel-search">
-					<el-input v-model="search.keyword" placeholder="角色名称" clearable></el-input>
-					<el-button type="primary" icon="el-icon-search" @click="upsearch"></el-button>
-				</div>
-			</div>
-		</el-header>
-		<el-main class="nopadding">
-			<scTable ref="table" :apiObj="apiObj" row-key="id" @selection-change="selectionChange" stripe>
-				<el-table-column type="selection" width="50"></el-table-column>
-				<el-table-column label="#" type="index" width="50"></el-table-column>
-				<el-table-column label="角色名称" prop="label" width="150"></el-table-column>
-				<el-table-column label="别名" prop="alias" width="200"></el-table-column>
-				<el-table-column label="排序" prop="sort" width="80"></el-table-column>
-				<el-table-column label="状态" prop="status" width="80">
-					<template #default="scope">
-						<el-switch v-model="scope.row.status" @change="changeSwitch($event, scope.row)" :loading="scope.row.$switch_status" active-value="1" inactive-value="0"></el-switch>
-					</template>
-				</el-table-column>
-				<el-table-column label="创建时间" prop="date" width="180"></el-table-column>
-				<el-table-column label="备注" prop="remark" min-width="150"></el-table-column>
-				<el-table-column label="操作" fixed="right" align="right" width="170">
-					<template #default="scope">
-						<el-button-group>
-							<el-button text type="primary" size="small" @click="table_show(scope.row, scope.$index)">查看</el-button>
-							<el-button text type="primary" size="small" @click="table_edit(scope.row, scope.$index)">编辑</el-button>
-							<el-popconfirm title="确定删除吗?" @confirm="table_del(scope.row, scope.$index)">
-								<template #reference>
-									<el-button text type="primary" size="small">删除</el-button>
-								</template>
-							</el-popconfirm>
-						</el-button-group>
-					</template>
-				</el-table-column>
-
-			</scTable>
-		</el-main>
-	</el-container>
-
-	<save-dialog v-if="dialog.save" ref="saveDialog" @success="handleSaveSuccess" @closed="dialog.save=false"></save-dialog>
-
-	<permission-dialog v-if="dialog.permission" ref="permissionDialog" @closed="dialog.permission=false"></permission-dialog>
-
-</template>
-
-<script>
-	import saveDialog from './save'
-	import permissionDialog from './permission'
-
-	export default {
-		name: 'role',
-		components: {
-			saveDialog,
-			permissionDialog
-		},
-		data() {
-			return {
-				dialog: {
-					save: false,
-					permission: false
-				},
-				apiObj: this.$API.system.role.list,
-				selection: [],
-				search: {
-					keyword: null
-				}
-			}
-		},
-		methods: {
-			//添加
-			add(){
-				this.dialog.save = true
-				this.$nextTick(() => {
-					this.$refs.saveDialog.open()
-				})
-			},
-			//编辑
-			table_edit(row){
-				this.dialog.save = true
-				this.$nextTick(() => {
-					this.$refs.saveDialog.open('edit').setData(row)
-				})
-			},
-			//查看
-			table_show(row){
-				this.dialog.save = true
-				this.$nextTick(() => {
-					this.$refs.saveDialog.open('show').setData(row)
-				})
-			},
-			//权限设置
-			permission(){
-				this.dialog.permission = true
-				this.$nextTick(() => {
-					this.$refs.permissionDialog.open()
-				})
-			},
-			//删除
-			async table_del(row){
-				var reqData = {id: row.id}
-				var res = await this.$API.demo.post.post(reqData);
-				if(res.code == 200){
-					this.$refs.table.refresh()
-					this.$message.success("删除成功")
-				}else{
-					this.$alert(res.message, "提示", {type: 'error'})
-				}
-			},
-			//批量删除
-			async batch_del(){
-				this.$confirm(`确定删除选中的 ${this.selection.length} 项吗?如果删除项中含有子集将会被一并删除`, '提示', {
-					type: 'warning'
-				}).then(() => {
-					const loading = this.$loading();
-					this.$refs.table.refresh()
-					loading.close();
-					this.$message.success("操作成功")
-				}).catch(() => {
-
-				})
-			},
-			//表格选择后回调事件
-			selectionChange(selection){
-				this.selection = selection;
-			},
-			//表格内开关
-			changeSwitch(val, row){
-				row.status = row.status == '1'?'0':'1'
-				row.$switch_status = true;
-				setTimeout(()=>{
-					delete row.$switch_status;
-					row.status = val;
-					this.$message.success("操作成功")
-				}, 500)
-			},
-			//搜索
-			upsearch(){
-
-			},
-			//根据ID获取树结构
-			filterTree(id){
-				var target = null;
-				function filter(tree){
-					tree.forEach(item => {
-						if(item.id == id){
-							target = item
-						}
-						if(item.children){
-							filter(item.children)
-						}
-					})
-				}
-				filter(this.$refs.table.tableData)
-				return target
-			},
-			//本地更新数据
-			handleSaveSuccess(data, mode){
-				if(mode=='add'){
-					this.$refs.table.refresh()
-				}else if(mode=='edit'){
-					this.$refs.table.refresh()
-				}
-			}
-		}
-	}
-</script>
-
-<style>
-</style>

+ 0 - 190
src/views/setting/role/permission.vue

@@ -1,190 +0,0 @@
-<template>
-	<el-dialog title="角色权限设置" v-model="visible" :width="500" destroy-on-close @closed="$emit('closed')">
-		<el-tabs tab-position="top">
-			<el-tab-pane label="菜单权限">
-				<div class="treeMain">
-					<el-tree ref="menu" node-key="name" :data="menu.list" :props="menu.props" show-checkbox></el-tree>
-				</div>
-			</el-tab-pane>
-			<el-tab-pane label="数据权限">
-				<el-form label-width="100px" label-position="left">
-					<el-form-item label="规则类型">
-						<el-select v-model="data.dataType" placeholder="请选择">
-							<el-option label="全部可见" value="1"></el-option>
-							<el-option label="本人可见" value="2"></el-option>
-							<el-option label="所在部门可见" value="3"></el-option>
-							<el-option label="所在部门及子级可见" value="4"></el-option>
-							<el-option label="选择的部门可见" value="5"></el-option>
-							<el-option label="自定义" value="6"></el-option>
-						</el-select>
-					</el-form-item>
-					<el-form-item label="选择部门" v-show="data.dataType=='5'">
-						<div class="treeMain" style="width: 100%;">
-							<el-tree ref="dept" node-key="id" :data="data.list" :props="data.props" show-checkbox></el-tree>
-						</div>
-					</el-form-item>
-					<el-form-item label="规则值" v-show="data.dataType=='6'">
-						<el-input v-model="data.rule" clearable type="textarea" :rows="6" placeholder="请输入自定义规则代码"></el-input>
-					</el-form-item>
-				</el-form>
-			</el-tab-pane>
-			<el-tab-pane label="控制台模块">
-				<div class="treeMain">
-					<el-tree ref="grid" node-key="key" :data="grid.list" :props="grid.props" :default-checked-keys="grid.checked" show-checkbox></el-tree>
-				</div>
-			</el-tab-pane>
-			<el-tab-pane label="控制台">
-				<el-form label-width="100px" label-position="left">
-					<el-form-item label="控制台视图">
-						<el-select v-model="dashboard" placeholder="请选择">
-							<el-option v-for="item in dashboardOptions" :key="item.value" :label="item.label" :value="item.value">
-								<span style="float: left">{{ item.label }}</span>
-								<span style="float: right; color: #8492a6; font-size: 12px">{{ item.views }}</span>
-							</el-option>
-						</el-select>
-						<div class="el-form-item-msg">用于控制角色登录后控制台的视图</div>
-					</el-form-item>
-				</el-form>
-			</el-tab-pane>
-		</el-tabs>
-		<template #footer>
-			<el-button @click="visible=false" >取 消</el-button>
-			<el-button type="primary" :loading="isSaveing" @click="submit()">保 存</el-button>
-		</template>
-	</el-dialog>
-</template>
-
-<script>
-	export default {
-		emits: ['success', 'closed'],
-		data() {
-			return {
-				visible: false,
-				isSaveing: false,
-				menu: {
-					list: [],
-					checked: [],
-					props: {
-						label: (data)=>{
-							return data.meta.title
-						}
-					}
-				},
-				grid: {
-					list: [],
-					checked: ["welcome", "ver", "time", "progress", "echarts", "about"],
-					props: {
-						label: (data)=>{
-							return data.title
-						},
-						disabled: (data)=>{
-							return data.isFixed
-						}
-					}
-				},
-				data: {
-					dataType :"1",
-					list: [],
-					checked: [],
-					props: {},
-					rule: ""
-				},
-				dashboard: "0",
-				dashboardOptions: [
-					{
-						value: '0',
-						label: '数据统计',
-						views: 'stats'
-
-					},
-					{
-						value: '1',
-						label: '工作台',
-						views: 'work'
-					},
-				]
-			}
-		},
-		mounted() {
-			this.getMenu()
-			this.getDept()
-			this.getGrid()
-		},
-		methods: {
-			open(){
-				this.visible = true;
-			},
-			submit(){
-				this.isSaveing = true;
-
-				//选中的和半选的合并后传值接口
-				var checkedKeys = this.$refs.menu.getCheckedKeys().concat(this.$refs.menu.getHalfCheckedKeys())
-				console.log(checkedKeys)
-
-				var checkedKeys_dept = this.$refs.dept.getCheckedKeys().concat(this.$refs.dept.getHalfCheckedKeys())
-				console.log(checkedKeys_dept)
-
-				setTimeout(()=>{
-					this.isSaveing = false;
-					this.visible = false;
-					this.$message.success("操作成功")
-					this.$emit('success')
-				},1000)
-			},
-			async getMenu(){
-				var res = await this.$API.system.menu.list.get()
-				this.menu.list = res.data
-
-				//获取接口返回的之前选中的和半选的合并,处理过滤掉有叶子节点的key
-				this.menu.checked = ["system", "user", "user.add", "user.edit", "user.del", "directive.edit", "other", "directive"]
-				this.$nextTick(() => {
-					let filterKeys = this.menu.checked.filter(key => this.$refs.menu.getNode(key).isLeaf)
-					this.$refs.menu.setCheckedKeys(filterKeys, true)
-				})
-			},
-			async getDept(){
-				var res = await this.$API.system.dept.list.get();
-				this.data.list = res.data
-				this.data.checked = ["12", "2", "21", "22", "1"]
-				this.$nextTick(() => {
-					let filterKeys = this.data.checked.filter(key => this.$refs.dept.getNode(key).isLeaf)
-					this.$refs.dept.setCheckedKeys(filterKeys, true)
-				})
-			},
-			getGrid(){
-				this.grid.list = [
-					{
-						key: "welcome",
-						title: "欢迎",
-						isFixed: true
-					},
-					{
-						key: "ver",
-						title: "版本信息",
-						isFixed: true
-					},
-					{
-						key: "time",
-						title: "时钟"
-					},
-					{
-						key: "progress",
-						title: "进度环"
-					},
-					{
-						key: "echarts",
-						title: "实时收入"
-					},
-					{
-						key: "about",
-						title: "关于项目"
-					}
-				]
-			}
-		}
-	}
-</script>
-
-<style scoped>
-	.treeMain {height:280px;overflow: auto;border: 1px solid #dcdfe6;margin-bottom: 10px;}
-</style>

+ 0 - 107
src/views/setting/role/save.vue

@@ -1,107 +0,0 @@
-<template>
-	<el-dialog :title="titleMap[mode]" v-model="visible" :width="500" destroy-on-close @closed="$emit('closed')">
-		<el-form :model="form" :rules="rules" :disabled="mode=='show'" ref="dialogForm" label-width="100px" label-position="left">
-			<el-form-item label="角色名称" prop="label">
-				<el-input v-model="form.label" clearable></el-input>
-			</el-form-item>
-			<el-form-item label="角色别名" prop="alias">
-				<el-input v-model="form.alias" clearable></el-input>
-			</el-form-item>
-			<el-form-item label="排序" prop="sort">
-				<el-input-number v-model="form.sort" controls-position="right" :min="1" style="width: 100%;"></el-input-number>
-			</el-form-item>
-			<el-form-item label="是否有效" prop="status">
-				<el-switch v-model="form.status" active-value="1" inactive-value="0"></el-switch>
-			</el-form-item>
-			<el-form-item label="备注" prop="remark">
-				<el-input v-model="form.remark" clearable type="textarea"></el-input>
-			</el-form-item>
-		</el-form>
-		<template #footer>
-			<el-button @click="visible=false" >取 消</el-button>
-			<el-button v-if="mode!='show'" type="primary" :loading="isSaveing" @click="submit()">保 存</el-button>
-		</template>
-	</el-dialog>
-</template>
-
-<script>
-	export default {
-		emits: ['success', 'closed'],
-		data() {
-			return {
-				mode: "add",
-				titleMap: {
-					add: '新增',
-					edit: '编辑',
-					show: '查看'
-				},
-				visible: false,
-				isSaveing: false,
-				//表单数据
-				form: {
-					id:"",
-					label: "",
-					alias: "",
-					sort: 1,
-					status: 1,
-					remark: ""
-				},
-				//验证规则
-				rules: {
-					sort: [
-						{required: true, message: '请输入排序', trigger: 'change'}
-					],
-					label: [
-						{required: true, message: '请输入角色名称'}
-					],
-					alias: [
-						{required: true, message: '请输入角色别名'}
-					]
-				}
-			}
-		},
-		mounted() {
-
-		},
-		methods: {
-			//显示
-			open(mode='add'){
-				this.mode = mode;
-				this.visible = true;
-				return this
-			},
-			//表单提交方法
-			submit(){
-				this.$refs.dialogForm.validate(async (valid) => {
-					if (valid) {
-						this.isSaveing = true;
-						var res = await this.$API.demo.post.post(this.form);
-						this.isSaveing = false;
-						if(res.code == 200){
-							this.$emit('success', this.form, this.mode)
-							this.visible = false;
-							this.$message.success("操作成功")
-						}else{
-							this.$alert(res.message, "提示", {type: 'error'})
-						}
-					}
-				})
-			},
-			//表单注入数据
-			setData(data){
-				this.form.id = data.id
-				this.form.label = data.label
-				this.form.alias = data.alias
-				this.form.sort = data.sort
-				this.form.status = data.status
-				this.form.remark = data.remark
-
-				//可以和上面一样单个注入,也可以像下面一样直接合并进去
-				//Object.assign(this.form, data)
-			}
-		}
-	}
-</script>
-
-<style>
-</style>

+ 0 - 173
src/views/setting/system/index.vue

@@ -1,173 +0,0 @@
-<template>
-	<el-main>
-		<el-card shadow="never">
-			<el-tabs tab-position="top">
-
-				<el-tab-pane label="系统设置">
-					<el-form ref="form" :model="sys" label-width="100px" style="margin-top: 20px;">
-						<el-form-item label="系统名称">
-							<el-input v-model="sys.name"></el-input>
-						</el-form-item>
-						<el-form-item label="LogoUrl">
-							<el-input v-model="sys.logoUrl"></el-input>
-						</el-form-item>
-						<el-form-item label="登录开关">
-							<el-switch v-model="sys.login"></el-switch>
-							<div class="el-form-item-msg" data-v-b33b3cf8="">关闭后普通用户无法登录,仅允许管理员角色登录</div>
-						</el-form-item>
-						<el-form-item label="密码验证规则">
-							<el-input v-model="sys.passwordRules"></el-input>
-						</el-form-item>
-						<el-form-item label="版权信息">
-							<el-input type="textarea" :autosize="{minRows: 4}" v-model="sys.copyright"></el-input>
-						</el-form-item>
-						<el-form-item>
-							<el-button type="primary">保存</el-button>
-						</el-form-item>
-					</el-form>
-				</el-tab-pane>
-
-				<el-tab-pane label="短信配置">
-					<el-form ref="form" :model="msg" label-width="100px" style="margin-top: 20px;">
-						<el-form-item label="短信开关">
-							<el-switch v-model="msg.open"></el-switch>
-							<div class="el-form-item-msg" data-v-b33b3cf8="">关闭后用户无法收到短信,但日志中将记录</div>
-						</el-form-item>
-						<el-form-item label="appKey">
-							<el-input v-model="msg.appKey"></el-input>
-						</el-form-item>
-						<el-form-item label="secretKey">
-							<el-input v-model="msg.secretKey"></el-input>
-						</el-form-item>
-						<el-form-item>
-							<el-button type="primary">保存</el-button>
-						</el-form-item>
-					</el-form>
-				</el-tab-pane>
-
-				<el-tab-pane label="扩展配置">
-					<el-alert title="扩展配置为系统业务所有的配置,应该由系统管理员操作,如需用户配置应另起业务配置页面。" type="warning" style="margin-bottom: 15px;"></el-alert>
-
-					<el-table :data="setting" stripe>
-						<el-table-column label="#" type="index" width="50"></el-table-column>
-						<el-table-column label="KEY" prop="key" width="150">
-							<template #default="scope">
-								<el-input v-if="scope.row.isSet" v-model="scope.row.key" placeholder="请输入内容"></el-input>
-								<span v-else>{{scope.row.key}}</span>
-							</template>
-						</el-table-column>
-						<el-table-column label="VALUE" prop="value" width="350">
-							<template #default="scope">
-								<template v-if="scope.row.isSet">
-									<el-switch v-if="typeof scope.row.value==='boolean'" v-model="scope.row.value"></el-switch>
-									<el-input v-else v-model="scope.row.value" placeholder="请输入内容"></el-input>
-								</template>
-								<span v-else>{{scope.row.value}}</span>
-							</template>
-						</el-table-column>
-						<el-table-column label="CATEGORY" prop="category" width="150">
-							<template #default="scope">
-								<el-input v-if="scope.row.isSet" v-model="scope.row.category" placeholder="请输入内容"></el-input>
-								<span v-else>{{scope.row.category}}</span>
-							</template>
-						</el-table-column>
-						<el-table-column label="TITLE" prop="title" width="350">
-							<template #default="scope">
-								<el-input v-if="scope.row.isSet" v-model="scope.row.title" placeholder="请输入内容"></el-input>
-								<span v-else>{{scope.row.title}}</span>
-							</template>
-						</el-table-column>
-						<el-table-column min-width="1"></el-table-column>
-						<el-table-column label="操作" fixed="right" width="120">
-							<template #default="scope">
-								<el-button-group>
-									<el-button @click="table_edit(scope.row, scope.$index)" text type="primary" size="small">{{scope.row.isSet?'保存':"修改"}}</el-button>
-									<el-button v-if="scope.row.isSet" @click="scope.row.isSet=false" text type="primary" size="small">取消</el-button>
-									<el-popconfirm v-if="!scope.row.isSet" title="确定删除吗?" @confirm="table_del(scope.row, scope.$index)">
-										<template #reference>
-											<el-button text type="primary" size="small">删除</el-button>
-										</template>
-									</el-popconfirm>
-								</el-button-group>
-							</template>
-						</el-table-column>
-					</el-table>
-					<el-button type="primary" icon="el-icon-plus" @click="table_add" style="margin-top: 20px;"></el-button>
-				</el-tab-pane>
-
-			</el-tabs>
-		</el-card>
-	</el-main>
-</template>
-
-<script>
-	export default {
-		name: 'system',
-		data() {
-			return {
-				sys: {
-					name: "SCUI",
-					logoUrl: "",
-					login: true,
-					passwordRules: "^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,20}$",
-					copyright: "@SCUI"
-				},
-				msg: {
-					open: true,
-					appKey: "",
-					secretKey: ""
-				},
-				setting: [
-					{
-						key: "file_serve",
-						value: "https://file.scui.com",
-						category: "url",
-						title: "文件服务器地址"
-					},
-					{
-						key: "cloud_url",
-						value: "-",
-						category: "url",
-						title: "客户端地址"
-					},
-					{
-						key: "crm_url",
-						value: "-",
-						category: "url",
-						title: "CRM地址"
-					},
-					{
-						key: "autoSwitch",
-						value: true,
-						category: "user",
-						title: "自动判断boolean类型"
-					}
-				]
-			}
-		},
-		methods: {
-			table_add(){
-				var newRow = {
-					key: "",
-					value: "",
-					title: "",
-					isSet: true
-				}
-				this.setting.push(newRow)
-			},
-			table_edit(row){
-				if(row.isSet){
-					row.isSet = false
-				}else{
-					row.isSet = true
-				}
-			},
-			table_del(row, index){
-				this.setting.splice(index, 1)
-			},
-		}
-	}
-</script>
-
-<style>
-</style>

+ 0 - 120
src/views/setting/table/index.vue

@@ -1,120 +0,0 @@
-<template>
-	<el-container>
-		<el-header>
-			<div class="left-panel">
-				<el-button type="primary" icon="el-icon-plus" @click="add"></el-button>
-			</div>
-		</el-header>
-		<el-main class="nopadding">
-			<scTable ref="table" :apiObj="apiObj" row-key="id" @selection-change="selectionChange" stripe>
-				<el-table-column type="selection" width="50"></el-table-column>
-				<el-table-column label="标识" prop="code" width="150"></el-table-column>
-				<el-table-column label="表格名称" prop="name" width="250"></el-table-column>
-
-				<el-table-column label="操作" fixed="right" align="right" width="120">
-					<template #default="scope">
-						<el-button-group>
-							<el-button text type="primary" size="small" @click="table_edit(scope.row, scope.$index)">编辑</el-button>
-							<el-popconfirm title="确定删除吗?" @confirm="table_del(scope.row, scope.$index)">
-								<template #reference>
-									<el-button text type="primary" size="small">删除</el-button>
-								</template>
-							</el-popconfirm>
-						</el-button-group>
-					</template>
-				</el-table-column>
-			</scTable>
-		</el-main>
-	</el-container>
-	
-	<save-dialog v-if="dialog.save" ref="saveDialog" @success="handleSuccess" @closed="dialog.save=false"></save-dialog>
-	
-</template>
-
-<script>
-	import saveDialog from './save'
-	
-	export default {
-		name: 'tableSetting',
-		components: {
-			saveDialog
-		},
-		data() {
-			return {
-				dialog: {
-					save: false
-				},
-				apiObj: this.$API.system.table.list,
-				selection: []
-			}
-		},
-		mounted() {
-
-		},
-		methods: {
-			//增加
-			add(){
-				this.dialog.save = true
-				this.$nextTick(() => {
-					this.$refs.saveDialog.open()
-				})
-			},
-			//编辑
-			table_edit(row){
-				this.dialog.save = true
-				this.$nextTick(() => {
-					this.$refs.saveDialog.open('edit').setData(row)
-				})
-			},
-			//删除
-			async table_del(row, index){
-				var reqData = {id: row.id}
-				var res = await this.$API.demo.post.post(reqData);
-				if(res.code == 200){
-					//这里选择刷新整个表格 OR 插入/编辑现有表格数据
-					this.$refs.table.tableData.splice(index, 1);
-					this.$message.success("删除成功")
-				}else{
-					this.$alert(res.message, "提示", {type: 'error'})
-				}
-			},
-			//批量删除
-			async batch_del(){
-				this.$confirm(`确定删除选中的 ${this.selection.length} 项吗?`, '提示', {
-					type: 'warning'
-				}).then(() => {
-					const loading = this.$loading();
-					this.selection.forEach(item => {
-						this.$refs.table.tableData.forEach((itemI, indexI) => {
-							if (item.id === itemI.id) {
-								this.$refs.table.tableData.splice(indexI, 1)
-							}
-						})
-					})
-					loading.close();
-					this.$message.success("操作成功")
-				}).catch(() => {
-
-				})
-			},
-			//表格选择后回调事件
-			selectionChange(selection){
-				this.selection = selection;
-			},
-			//本地更新数据
-			handleSuccess(data, mode){
-				if(mode=='add'){
-					data.id = new Date().getTime()
-					this.$refs.table.tableData.unshift(data)
-				}else if(mode=='edit'){
-					this.$refs.table.tableData.filter(item => item.id===data.id ).forEach(item => {
-						Object.assign(item, data)
-					})
-				}
-			}
-		}
-	}
-</script>
-
-<style>
-</style>

+ 0 - 182
src/views/setting/table/save.vue

@@ -1,182 +0,0 @@
-<template>
-	<el-drawer :title="titleMap[mode]" v-model="visible" :size="1000" destroy-on-close @closed="$emit('closed')">
-		<el-container v-loading="loading">
-			<el-main style="padding:0 20px 20px 20px">
-
-				<el-form ref="dialogForm" :model="form" :rules="rules" label-width="100px" label-position="top">
-					<sc-title title="基础"></sc-title>
-					<el-row :gutter="20">
-						<el-col :span="16">
-							<el-form-item label="表格名称" prop="name">
-								<el-input v-model="form.name" placeholder="请输入中文描述标题"></el-input>
-							</el-form-item>
-						</el-col>
-						<el-col :span="8">
-							<el-form-item label="标识" prop="code">
-								<el-input v-model="form.code" placeholder="请输入唯一标识"></el-input>
-							</el-form-item>
-						</el-col>
-					</el-row>
-					<el-form-item>
-						<el-checkbox v-model="form.remoteSort" label="远程排序"></el-checkbox>
-						<el-checkbox v-model="form.remoteFilter" label="远程过滤"></el-checkbox>
-					</el-form-item>
-					<sc-title title="表格列"></sc-title>
-					<el-form-item prop="column">
-						<sc-form-table v-model="form.column" :addTemplate="addTemplate" drag-sort placeholder="暂无数据">
-							<el-table-column prop="label" label="名称">
-								<template #default="scope">
-									<el-input v-model="scope.row.label" placeholder="请输入名称"></el-input>
-								</template>
-							</el-table-column>
-							<el-table-column prop="prop" label="字段" width="150">
-								<template #default="scope">
-									<el-input v-model="scope.row.prop" placeholder="请输入字段"></el-input>
-								</template>
-							</el-table-column>
-							<el-table-column prop="width" label="宽度" width="100">
-								<template #default="scope">
-									<el-input v-model="scope.row.width" placeholder="请输入宽度"></el-input>
-								</template>
-							</el-table-column>
-							<el-table-column prop="hide" label="隐藏" width="80" align="center">
-								<template #default="scope">
-									<el-checkbox v-model="scope.row.hide"></el-checkbox>
-								</template>
-							</el-table-column>
-							<el-table-column prop="sortable" label="排序" width="80" align="center">
-								<template #default="scope">
-									<el-checkbox v-model="scope.row.sortable"></el-checkbox>
-								</template>
-							</el-table-column>
-							<el-table-column prop="filters" label="过滤项" width="90" align="center">
-								<template #default="scope">
-									<el-button text size="small" :type="scope.row.filters.length==0?'':'primary'" @click="setFilters(scope.row.filters)">过滤项</el-button>
-								</template>
-							</el-table-column>
-							<el-table-column prop="fixed" label="固定" width="80" align="center">
-								<template #default="scope">
-									<el-checkbox v-model="scope.row.fixed"></el-checkbox>
-								</template>
-							</el-table-column>
-						</sc-form-table>
-					</el-form-item>
-				</el-form>
-			</el-main>
-			<el-footer>
-				<el-button type="primary" :loading="isSaveing" @click="submit">保存</el-button>
-				<el-button @click="visible=false">取消</el-button>
-			</el-footer>
-		</el-container>
-
-		<el-drawer title="过滤项配置" v-model="setFiltersVisible" :size="500" destroy-on-close>
-			<el-main style="padding:0 20px 20px 20px">
-				<sc-form-table v-model="selectionFilters" :addTemplate="filtersAddTemplate" drag-sort placeholder="暂无数据">
-					<el-table-column prop="text" label="名称">
-						<template #default="scope">
-							<el-input v-model="scope.row.text" placeholder="请输入名称"></el-input>
-						</template>
-					</el-table-column>
-					<el-table-column prop="value" label="值" width="150">
-						<template #default="scope">
-							<el-input v-model="scope.row.value" placeholder="请输入值"></el-input>
-						</template>
-					</el-table-column>
-				</sc-form-table>
-			</el-main>
-		</el-drawer>
-
-
-	</el-drawer>
-</template>
-
-<script>
-	export default {
-		emits: ['success', 'closed'],
-		data() {
-			return {
-				loading: false,
-				mode: "add",
-				titleMap: {
-					add: '新增',
-					edit: '编辑'
-				},
-				form: {},
-				rules: {
-					name: [
-						{required: true, message: '请输入表格名称', trigger: 'blur'}
-					],
-					code: [
-						{required: true, message: '请输入唯一标识', trigger: 'blur'}
-					]
-				},
-				addTemplate: {
-					label: '',
-					prop: '',
-					width: '100',
-					hide: false,
-					sortable: false,
-					fixed: false,
-					filters: []
-				},
-				visible: false,
-				isSaveing: false,
-				selectionFilters: [],
-				filtersAddTemplate: {
-					text: '',
-					value: ''
-				},
-				setFiltersVisible: false
-			}
-		},
-		mounted() {
-
-		},
-		methods: {
-			//显示
-			open(mode='add'){
-				this.mode = mode;
-				this.visible = true;
-				return this;
-			},
-			//表单提交方法
-			submit(){
-				this.$refs.dialogForm.validate(async (valid) => {
-					if (valid) {
-						this.isSaveing = true;
-						var res = await this.$API.demo.post.post(this.form);
-						this.isSaveing = false;
-						if(res.code == 200){
-							this.$emit('success', this.form, this.mode)
-							this.visible = false;
-							this.$message.success("操作成功")
-						}else{
-							this.$alert(res.message, "提示", {type: 'error'})
-						}
-					}
-				})
-			},
-			//表单注入数据
-			setData(data){
-				this.loading = true
-				const params = {
-					id: data.id
-				}
-				setTimeout(async ()=>{
-					var res = await this.$API.system.table.info.get(params)
-					this.loading = false
-					this.form = res.data
-				},400)
-
-			},
-			//设置过滤项
-			setFilters(filters){
-				this.selectionFilters = filters
-				this.setFiltersVisible = true
-			}
-		}
-	}
-</script>
-
-<style>
-</style>

+ 0 - 175
src/views/setting/task/index.vue

@@ -1,175 +0,0 @@
-<!--
- * @Descripttion: 系统计划任务配置
- * @version: 1.2
- * @Author: sakuya
- * @Date: 2021年7月7日09:28:32
- * @LastEditors: sakuya
- * @LastEditTime: 2021年7月10日20:56:47
--->
-
-<template>
-	<el-main>
-		<el-row :gutter="15">
-			<el-col :xl="6" :lg="6" :md="8" :sm="12" :xs="24" v-for="item in list" :key="item.id">
-				<el-card class="task task-item" shadow="hover">
-					<h2>{{item.title}}</h2>
-					<ul>
-						<li>
-							<h4>执行类</h4>
-							<p>{{item.handler}}</p>
-						</li>
-						<li>
-							<h4>定时规则</h4>
-							<p>{{item.cron}}</p>
-						</li>
-					</ul>
-					<div class="bottom">
-						<div class="state">
-							<el-tag v-if="item.state=='1'" size="small">准备就绪</el-tag>
-							<el-tag v-if="item.state=='-1'" size="small" type="info">停用</el-tag>
-						</div>
-						<div class="handler">
-							<el-popconfirm title="确定立即执行吗?" @confirm="run(item)">
-								<template #reference>
-									<el-button type="primary" icon="el-icon-caret-right" circle></el-button>
-								</template>
-							</el-popconfirm>
-							<el-dropdown trigger="click">
-								<el-button type="primary" icon="el-icon-more" circle plain></el-button>
-								<template #dropdown>
-									<el-dropdown-menu>
-										<el-dropdown-item @click="edit(item)">编辑</el-dropdown-item>
-										<el-dropdown-item @click="logs(item)">日志</el-dropdown-item>
-										<el-dropdown-item @click="del(item)" divided>删除</el-dropdown-item>
-									</el-dropdown-menu>
-								</template>
-							</el-dropdown>
-						</div>
-					</div>
-				</el-card>
-			</el-col>
-			<el-col :xl="6" :lg="6" :md="8" :sm="12" :xs="24">
-				<el-card class="task task-add" shadow="never" @click="add">
-					<el-icon><el-icon-plus /></el-icon>
-					<p>添加计划任务</p>
-				</el-card>
-			</el-col>
-		</el-row>
-	</el-main>
-
-	<save-dialog v-if="dialog.save" ref="saveDialog" @success="handleSuccess" @closed="dialog.save=false"></save-dialog>
-
-	<el-drawer title="计划任务日志" v-model="dialog.logsVisible" :size="600" direction="rtl" destroy-on-close>
-		<logs></logs>
-	</el-drawer>
-</template>
-
-<script>
-	import saveDialog from './save'
-	import logs from './logs'
-
-	export default {
-		name: 'task',
-		components: {
-			saveDialog,
-			logs
-		},
-		provide() {
-			return {
-				list: this.list
-			}
-		},
-		data() {
-			return {
-				dialog: {
-					save: false,
-					logsVisible: false
-				},
-				list: [
-					{
-						id: "1",
-						title: "清理服务器缓存",
-						handler: "cleanUpCacheHandler",
-						cron: "59 59 23 * * ? *",
-						state: "1"
-					},
-					{
-						id: "2",
-						title: "自动审核",
-						handler: "automaticAuditHandler",
-						cron: "0 0 * * * ? *",
-						state: "1"
-					},
-					{
-						id: "3",
-						title: "清理未实名用户",
-						handler: "deleteUserHandler",
-						cron: "0 0 0 * * ? *",
-						state: "-1"
-					}
-				]
-			}
-		},
-		mounted() {
-
-		},
-		methods: {
-			add(){
-				this.dialog.save = true
-				this.$nextTick(() => {
-					this.$refs.saveDialog.open()
-				})
-			},
-			edit(task){
-				this.dialog.save = true
-				this.$nextTick(() => {
-					this.$refs.saveDialog.open('edit').setData(task)
-				})
-			},
-			del(task){
-				this.$confirm(`确认删除 ${task.title} 计划任务吗?`,'提示', {
-					type: 'warning',
-					confirmButtonText: '删除',
-					confirmButtonClass: 'el-button--danger'
-				}).then(() => {
-					this.list.splice(this.list.findIndex(item => item.id === task.id), 1)
-				}).catch(() => {
-					//取消
-				})
-			},
-			logs(){
-				this.dialog.logsVisible = true
-			},
-			run(task){
-				this.$message.success(`已成功执行计划任务:${task.title}`)
-			},
-			//本地更新数据
-			handleSuccess(data, mode){
-				if(mode=='add'){
-					data.id = new Date().getTime()
-					this.list.push(data)
-				}else if(mode=='edit'){
-					this.list.filter(item => item.id===data.id ).forEach(item => {
-						Object.assign(item, data)
-					})
-				}
-			}
-		}
-	}
-</script>
-
-<style scoped>
-	.task {height: 210px;}
-	.task-item h2 {font-size: 15px;color: #3c4a54;padding-bottom:15px;}
-	.task-item li {list-style-type:none;margin-bottom: 10px;}
-	.task-item li h4 {font-size: 12px;font-weight: normal;color: #999;}
-	.task-item li p {margin-top: 5px;}
-	.task-item .bottom {border-top: 1px solid #EBEEF5;text-align: right;padding-top:10px;display: flex;justify-content: space-between;align-items: center;}
-
-	.task-add {display: flex;flex-direction: column;align-items: center;justify-content: center;text-align: center;cursor: pointer;color: #999;}
-	.task-add:hover {color: #409EFF;}
-	.task-add i {font-size: 30px;}
-	.task-add p {font-size: 12px;margin-top: 20px;}
-	
-	.dark .task-item .bottom {border-color: var(--el-border-color-light);}
-</style>

+ 0 - 108
src/views/setting/task/logs.vue

@@ -1,108 +0,0 @@
-<!--
- * @Descripttion: 系统计划任务配置
- * @version: 1.0
- * @Author: sakuya
- * @Date: 2021年7月7日09:28:32
- * @LastEditors:
- * @LastEditTime:
--->
-
-<template>
-	<el-container>
-		<el-main  style="padding:0 20px;">
-			<scTable ref="table" :data="data" stripe>
-				<el-table-column label="执行时间" prop="time" width="200"></el-table-column>
-				<el-table-column label="执行结果" prop="state" width="100">
-					<template #default="scope">
-						<span v-if="scope.row.state==200" style="color: #67C23A;"><el-icon><el-icon-success-filled /></el-icon></span>
-						<span v-else style="color: #F56C6C;"><el-icon><el-icon-circle-close-filled /></el-icon></span>
-					</template>
-				</el-table-column>
-				<el-table-column label="执行日志" prop="logs" width="100" fixed="right">
-					<template #default="scope">
-						<el-button size="small" @click="show(scope.row)" type="text">日志</el-button>
-					</template>
-				</el-table-column>
-			</scTable>
-		</el-main>
-	</el-container>
-
-	<el-drawer title="日志" v-model="logsVisible" :size="500" direction="rtl" destroy-on-close>
-		<el-main  style="padding:0 20px 20px 20px;">
-			<pre style="font-size: 12px;color: #999;padding:20px;background: #333;font-family: consolas;line-height: 1.5;overflow: auto;">{{demoLog}}</pre>
-		</el-main>
-	</el-drawer>
-</template>
-
-<script>
-	export default {
-		data() {
-			return {
-				logsVisible: false,
-				demoLog: `2021-07-07 12:35:00 [com.xxl.job.core.thread.JobThread#run]-[124]-[Thread-308]
------------ xxl-job job execute start -----------
------------ Param:
-2021-07-07 12:35:00 [com.heronshn.reservation.jobhandler.AqshMasterDataSendHandler#execute]-[31]-[Thread-308] aqshMasterDataSendHandler start
-2021-07-07 12:35:00 [com.heronshn.reservation.data.service.impl.AqshVehicleServiceImpl#send]-[42]-[Thread-308] send 45
-2021-07-07 12:35:00 [com.heronshn.reservation.data.service.impl.AqshVehicleServiceImpl#send]-[45]-[Thread-308] webapi http://127.0.0.1:48080
-2021-07-07 12:35:00 [com.heronshn.reservation.jobhandler.AqshMasterDataSendHandler#execute]-[33]-[Thread-308] aqshMasterDataSendHandler vehicle end
-2021-07-07 12:35:00 [com.heronshn.reservation.jobhandler.AqshMasterDataSendHandler#execute]-[35]-[Thread-308] aqshMasterDataSendHandler stop
-2021-07-07 12:35:00 [com.xxl.job.core.thread.JobThread#run]-[158]-[Thread-308]
------------ xxl-job job execute end(finish) -----------
------------ ReturnT:ReturnT [code=200, msg=null, content=null]
-2021-07-07 12:35:00 [com.xxl.job.core.thread.TriggerCallbackThread#callbackLog]-[176]-[Thread-10]
------------ xxl-job job callback finish.
-
-[Load Log Finish]`,
-				data: [
-					{
-						time: "2021-07-07 00:00:00",
-						state: "500",
-						logs: ""
-					},
-					{
-						time: "2021-07-06 00:00:00",
-						state: "200",
-						logs: ""
-					},
-					{
-						time: "2021-07-05 00:00:00",
-						state: "200",
-						logs: ""
-					},
-					{
-						time: "2021-07-04 00:00:00",
-						state: "200",
-						logs: ""
-					},
-					{
-						time: "2021-07-03 00:00:00",
-						state: "200",
-						logs: ""
-					},
-					{
-						time: "2021-07-02 00:00:00",
-						state: "200",
-						logs: ""
-					},
-					{
-						time: "2021-07-01 00:00:00",
-						state: "200",
-						logs: ""
-					}
-				]
-			}
-		},
-		mounted() {
-
-		},
-		methods: {
-			show(){
-				this.logsVisible = true;
-			}
-		}
-	}
-</script>
-
-<style>
-</style>

+ 0 - 113
src/views/setting/task/save.vue

@@ -1,113 +0,0 @@
-<!--
- * @Descripttion: 系统计划任务配置
- * @version: 1.2
- * @Author: sakuya
- * @Date: 2021年7月7日09:28:32
- * @LastEditors: sakuya
- * @LastEditTime: 2021年7月10日20:56:47
--->
-
-<template>
-	<el-dialog :title="titleMap[mode]" v-model="visible" :width="400" destroy-on-close @closed="$emit('closed')">
-		<el-form :model="form" :rules="rules" ref="dialogForm" label-width="100px" label-position="left">
-			<el-form-item label="描述" prop="title">
-				<el-input v-model="form.title" placeholder="计划任务标题" clearable></el-input>
-			</el-form-item>
-			<el-form-item label="执行类" prop="handler">
-				<el-input v-model="form.handler" placeholder="计划任务执行类名称" clearable></el-input>
-			</el-form-item>
-			<el-form-item label="定时规则" prop="cron">
-				<sc-cron v-model="form.cron" placeholder="请输入Cron定时规则" clearable :shortcuts="shortcuts"></sc-cron>
-			</el-form-item>
-			<el-form-item label="是否启用" prop="state">
-				<el-switch v-model="form.state" active-value="1" inactive-value="-1"></el-switch>
-			</el-form-item>
-		</el-form>
-		<template #footer>
-			<el-button @click="visible=false" >取 消</el-button>
-			<el-button type="primary" :loading="isSaveing" @click="submit()">保 存</el-button>
-		</template>
-	</el-dialog>
-</template>
-
-<script>
-	import scCron from '@/components/scCron';
-	
-	export default {
-		components: {
-			scCron
-		},
-		emits: ['success', 'closed'],
-		data() {
-			return {
-				mode: "add",
-				titleMap: {
-					add: '新增计划任务',
-					edit: '编辑计划任务'
-				},
-				form: {
-					id:"",
-					title: "",
-					handler: "",
-					cron: "",
-					state: "1"
-				},
-				rules: {
-					title:[
-						{required: true, message: '请填写标题'}
-					],
-					handler:[
-						{required: true, message: '请填写执行类'}
-					],
-					cron:[
-						{required: true, message: '请填写定时规则'}
-					]
-				},
-				visible: false,
-				isSaveing: false,
-				shortcuts: [
-					{
-						text: "每天8点和12点 (自定义追加)",
-						value: "0 0 8,12 * * ?"
-					}
-				]
-			}
-		},
-		mounted() {
-
-		},
-		methods: {
-			//显示
-			open(mode='add'){
-				this.mode = mode;
-				this.visible = true;
-				return this;
-			},
-			//表单提交方法
-			submit(){
-				this.$refs.dialogForm.validate((valid) => {
-					if (valid) {
-						this.isSaveing = true;
-						setTimeout(()=>{
-							this.isSaveing = false;
-							this.visible = false;
-							this.$message.success("操作成功")
-							this.$emit('success', this.form, this.mode)
-						},1000)
-					}
-				})
-			},
-			//表单注入数据
-			setData(data){
-				this.form.id = data.id
-				this.form.title = data.title
-				this.form.handler = data.handler
-				this.form.cron = data.cron
-				this.form.state = data.state
-			}
-		}
-	}
-</script>
-
-<style>
-</style>

+ 0 - 193
src/views/setting/user/index.vue

@@ -1,193 +0,0 @@
-<template>
-	<el-container>
-		<el-aside width="200px" v-loading="showGrouploading">
-			<el-container>
-				<el-header>
-					<el-input placeholder="输入关键字进行过滤" v-model="groupFilterText" clearable></el-input>
-				</el-header>
-				<el-main class="nopadding">
-					<el-tree ref="group" class="menu" node-key="id" :data="group" :current-node-key="''" :highlight-current="true" :expand-on-click-node="false" :filter-node-method="groupFilterNode" @node-click="groupClick"></el-tree>
-				</el-main>
-			</el-container>
-		</el-aside>
-		<el-container>
-				<el-header>
-					<div class="left-panel">
-						<el-button type="primary" icon="el-icon-plus" @click="add"></el-button>
-						<el-button type="danger" plain icon="el-icon-delete" :disabled="selection.length==0" @click="batch_del"></el-button>
-						<el-button type="primary" plain :disabled="selection.length==0">分配角色</el-button>
-						<el-button type="primary" plain :disabled="selection.length==0">密码重置</el-button>
-					</div>
-					<div class="right-panel">
-						<div class="right-panel-search">
-							<el-input v-model="search.name" placeholder="登录账号 / 姓名" clearable></el-input>
-							<el-button type="primary" icon="el-icon-search" @click="upsearch"></el-button>
-						</div>
-					</div>
-				</el-header>
-				<el-main class="nopadding">
-					<scTable ref="table" :apiObj="apiObj" @selection-change="selectionChange" stripe remoteSort remoteFilter>
-						<el-table-column type="selection" width="50"></el-table-column>
-						<el-table-column label="ID" prop="id" width="80" sortable='custom'></el-table-column>
-						<el-table-column label="头像" width="80" column-key="filterAvatar" :filters="[{text: '已上传', value: '1'}, {text: '未上传', value: '0'}]">
-							<template #default="scope">
-								<el-avatar :src="scope.row.avatar" size="small"></el-avatar>
-							</template>
-						</el-table-column>
-						<el-table-column label="登录账号" prop="userName" width="150" sortable='custom' column-key="filterUserName" :filters="[{text: '系统账号', value: '1'}, {text: '普通账号', value: '0'}]"></el-table-column>
-						<el-table-column label="姓名" prop="name" width="150" sortable='custom'></el-table-column>
-						<el-table-column label="所属角色" prop="groupName" width="200" sortable='custom'></el-table-column>
-						<el-table-column label="加入时间" prop="date" width="170" sortable='custom'></el-table-column>
-						<el-table-column label="操作" fixed="right" align="right" width="160">
-							<template #default="scope">
-								<el-button-group>
-									<el-button text type="primary" size="small" @click="table_show(scope.row, scope.$index)">查看</el-button>
-									<el-button text type="primary" size="small" @click="table_edit(scope.row, scope.$index)">编辑</el-button>
-									<el-popconfirm title="确定删除吗?" @confirm="table_del(scope.row, scope.$index)">
-										<template #reference>
-											<el-button text type="primary" size="small">删除</el-button>
-										</template>
-									</el-popconfirm>
-								</el-button-group>
-							</template>
-						</el-table-column>
-
-					</scTable>
-				</el-main>
-		</el-container>
-	</el-container>
-
-	<save-dialog v-if="dialog.save" ref="saveDialog" @success="handleSuccess" @closed="dialog.save=false"></save-dialog>
-
-</template>
-
-<script>
-	import saveDialog from './save'
-
-	export default {
-		name: 'user',
-		components: {
-			saveDialog
-		},
-		data() {
-			return {
-				dialog: {
-					save: false
-				},
-				showGrouploading: false,
-				groupFilterText: '',
-				group: [],
-				apiObj: this.$API.system.user.list,
-				selection: [],
-				search: {
-					name: null
-				}
-			}
-		},
-		watch: {
-			groupFilterText(val) {
-				this.$refs.group.filter(val);
-			}
-		},
-		mounted() {
-			this.getGroup()
-		},
-		methods: {
-			//添加
-			add(){
-				this.dialog.save = true
-				this.$nextTick(() => {
-					this.$refs.saveDialog.open()
-				})
-			},
-			//编辑
-			table_edit(row){
-				this.dialog.save = true
-				this.$nextTick(() => {
-					this.$refs.saveDialog.open('edit').setData(row)
-				})
-			},
-			//查看
-			table_show(row){
-				this.dialog.save = true
-				this.$nextTick(() => {
-					this.$refs.saveDialog.open('show').setData(row)
-				})
-			},
-			//删除
-			async table_del(row, index){
-				var reqData = {id: row.id}
-				var res = await this.$API.demo.post.post(reqData);
-				if(res.code == 200){
-					//这里选择刷新整个表格 OR 插入/编辑现有表格数据
-					this.$refs.table.tableData.splice(index, 1);
-					this.$message.success("删除成功")
-				}else{
-					this.$alert(res.message, "提示", {type: 'error'})
-				}
-			},
-			//批量删除
-			async batch_del(){
-				this.$confirm(`确定删除选中的 ${this.selection.length} 项吗?`, '提示', {
-					type: 'warning'
-				}).then(() => {
-					const loading = this.$loading();
-					this.selection.forEach(item => {
-						this.$refs.table.tableData.forEach((itemI, indexI) => {
-							if (item.id === itemI.id) {
-								this.$refs.table.tableData.splice(indexI, 1)
-							}
-						})
-					})
-					loading.close();
-					this.$message.success("操作成功")
-				}).catch(() => {
-
-				})
-			},
-			//表格选择后回调事件
-			selectionChange(selection){
-				this.selection = selection;
-			},
-			//加载树数据
-			async getGroup(){
-				this.showGrouploading = true;
-				var res = await this.$API.system.dept.list.get();
-				this.showGrouploading = false;
-				var allNode ={id: '', label: '所有'}
-				res.data.unshift(allNode);
-				this.group = res.data;
-			},
-			//树过滤
-			groupFilterNode(value, data){
-				if (!value) return true;
-				return data.label.indexOf(value) !== -1;
-			},
-			//树点击事件
-			groupClick(data){
-				var params = {
-					groupId: data.id
-				}
-				this.$refs.table.reload(params)
-			},
-			//搜索
-			upsearch(){
-				this.$refs.table.upData(this.search)
-			},
-			//本地更新数据
-			handleSuccess(data, mode){
-				if(mode=='add'){
-					data.id = new Date().getTime()
-					this.$refs.table.tableData.unshift(data)
-				}else if(mode=='edit'){
-					this.$refs.table.tableData.filter(item => item.id===data.id ).forEach(item => {
-						Object.assign(item, data)
-					})
-				}
-			}
-		}
-	}
-</script>
-
-<style>
-</style>

+ 0 - 166
src/views/setting/user/save.vue

@@ -1,166 +0,0 @@
-<template>
-	<el-dialog :title="titleMap[mode]" v-model="visible" :width="500" destroy-on-close @closed="$emit('closed')">
-		<el-form :model="form" :rules="rules" :disabled="mode=='show'" ref="dialogForm" label-width="100px" label-position="left">
-			<el-form-item label="头像" prop="avatar">
-				<sc-upload v-model="form.avatar" title="上传头像"></sc-upload>
-			</el-form-item>
-			<el-form-item label="登录账号" prop="userName">
-				<el-input v-model="form.userName" placeholder="用于登录系统" clearable></el-input>
-			</el-form-item>
-			<el-form-item label="姓名" prop="name">
-				<el-input v-model="form.name" placeholder="请输入完整的真实姓名" clearable></el-input>
-			</el-form-item>
-			<template v-if="mode=='add'">
-				<el-form-item label="登录密码" prop="password">
-					<el-input type="password" v-model="form.password" clearable show-password></el-input>
-				</el-form-item>
-				<el-form-item label="确认密码" prop="password2">
-					<el-input type="password" v-model="form.password2" clearable show-password></el-input>
-				</el-form-item>
-			</template>
-			<el-form-item label="所属部门" prop="dept">
-				<el-cascader v-model="form.dept" :options="depts" :props="deptsProps" clearable style="width: 100%;"></el-cascader>
-			</el-form-item>
-			<el-form-item label="所属角色" prop="group">
-				<el-select v-model="form.group" multiple filterable style="width: 100%">
-					<el-option v-for="item in groups" :key="item.id" :label="item.label" :value="item.id"/>
-				</el-select>
-			</el-form-item>
-		</el-form>
-		<template #footer>
-			<el-button @click="visible=false" >取 消</el-button>
-			<el-button v-if="mode!='show'" type="primary" :loading="isSaveing" @click="submit()">保 存</el-button>
-		</template>
-	</el-dialog>
-</template>
-
-<script>
-	export default {
-		emits: ['success', 'closed'],
-		data() {
-			return {
-				mode: "add",
-				titleMap: {
-					add: '新增用户',
-					edit: '编辑用户',
-					show: '查看'
-				},
-				visible: false,
-				isSaveing: false,
-				//表单数据
-				form: {
-					id:"",
-					userName: "",
-					avatar: "",
-					name: "",
-					dept: "",
-					group: []
-				},
-				//验证规则
-				rules: {
-					avatar:[
-						{required: true, message: '请上传头像'}
-					],
-					userName: [
-						{required: true, message: '请输入登录账号'}
-					],
-					name: [
-						{required: true, message: '请输入真实姓名'}
-					],
-					password: [
-						{required: true, message: '请输入登录密码'},
-						{validator: (rule, value, callback) => {
-							if (this.form.password2 !== '') {
-								this.$refs.dialogForm.validateField('password2');
-							}
-							callback();
-						}}
-					],
-					password2: [
-						{required: true, message: '请再次输入密码'},
-						{validator: (rule, value, callback) => {
-							if (value !== this.form.password) {
-								callback(new Error('两次输入密码不一致!'));
-							}else{
-								callback();
-							}
-						}}
-					],
-					dept: [
-						{required: true, message: '请选择所属部门'}
-					],
-					group: [
-						{required: true, message: '请选择所属角色', trigger: 'change'}
-					]
-				},
-				//所需数据选项
-				groups: [],
-				groupsProps: {
-					value: "id",
-					multiple: true,
-					checkStrictly: true
-				},
-				depts: [],
-				deptsProps: {
-					value: "id",
-					checkStrictly: true
-				}
-			}
-		},
-		mounted() {
-			this.getGroup()
-			this.getDept()
-		},
-		methods: {
-			//显示
-			open(mode='add'){
-				this.mode = mode;
-				this.visible = true;
-				return this
-			},
-			//加载树数据
-			async getGroup(){
-				var res = await this.$API.system.role.list.get();
-				this.groups = res.data.rows;
-			},
-			async getDept(){
-				var res = await this.$API.system.dept.list.get();
-				this.depts = res.data;
-			},
-			//表单提交方法
-			submit(){
-				this.$refs.dialogForm.validate(async (valid) => {
-					if (valid) {
-						this.isSaveing = true;
-						var res = await this.$API.demo.post.post(this.form);
-						this.isSaveing = false;
-						if(res.code == 200){
-							this.$emit('success', this.form, this.mode)
-							this.visible = false;
-							this.$message.success("操作成功")
-						}else{
-							this.$alert(res.message, "提示", {type: 'error'})
-						}
-					}else{
-						return false;
-					}
-				})
-			},
-			//表单注入数据
-			setData(data){
-				this.form.id = data.id
-				this.form.userName = data.userName
-				this.form.avatar = data.avatar
-				this.form.name = data.name
-				this.form.group = data.group
-				this.form.dept = data.dept
-
-				//可以和上面一样单个注入,也可以像下面一样直接合并进去
-				//Object.assign(this.form, data)
-			}
-		}
-	}
-</script>
-
-<style>
-</style>

+ 0 - 17
src/views/template/layout/blank.vue

@@ -1,17 +0,0 @@
-<template>
-	<el-empty :image-size="200" :description="title"></el-empty>
-</template>
-
-<script>
-	export default {
-		name: 'blank',
-		data() {
-			return {
-				title: "BLANK PAGE :)"
-			}
-		}
-	}
-</script>
-
-<style>
-</style>

+ 0 - 39
src/views/template/layout/layoutLCR.vue

@@ -1,39 +0,0 @@
-<template>
-	<el-container>
-		<el-aside>
-			<el-container>
-				<el-header>Left Header</el-header>
-				<el-main>Left Main</el-main>
-				<el-footer>Left Footer</el-footer>
-			</el-container>
-		</el-aside>
-		<el-container>
-			<el-header>Header</el-header>
-			<el-main class="nopadding">
-				<el-result icon="info" title="Tip" sub-title="可根据 <el-container> <el-header> <el-aside> <el-main> <el-footer> 灵活运用达到各种布局"></el-result>
-			</el-main>
-			<el-footer>Footer</el-footer>
-		</el-container>
-		<el-aside>
-			<el-container>
-				<el-header>Right Header</el-header>
-				<el-main>Right Main</el-main>
-				<el-footer>Right Footer</el-footer>
-			</el-container>
-		</el-aside>
-	</el-container>
-</template>
-
-<script>
-	export default {
-		name: 'layoutLCR',
-		data() {
-			return {
-
-			}
-		}
-	}
-</script>
-
-<style>
-</style>

+ 0 - 23
src/views/template/layout/layoutTCB.vue

@@ -1,23 +0,0 @@
-<template>
-	<el-container>
-		<el-header>Header</el-header>
-		<el-main class="nopadding">
-			<el-result icon="info" title="Tip" sub-title="可根据 <el-container> <el-header> <el-aside> <el-main> <el-footer> 灵活运用达到各种布局"></el-result>
-		</el-main>
-		<el-footer>Footer</el-footer>
-	</el-container>
-</template>
-
-<script>
-	export default {
-		name: 'layoutTCB',
-		data() {
-			return {
-
-			}
-		}
-	}
-</script>
-
-<style>
-</style>

+ 0 - 42
src/views/template/list/crud/detail.vue

@@ -1,42 +0,0 @@
-<template>
-	<sc-page-header :title="id?'编辑':'新增'" description="可用于非常复杂的表单提交,如一些较为简单的表单提交应使用dialog或者drawer更合适" icon="el-icon-burger"></sc-page-header>
-
-	<el-main>
-		<el-alert title="注意: 因为keep-alive只接受组件name,导致多路由共用组件时,关闭或刷新一个标签导致其他同一组件的页面缓存失效,后续还在寻找完美的解决方案.建议在列表页使用dialog或者drawer形式" type="error" style="margin-bottom: 15px;"></el-alert>
-		<el-card shadow="never">
-			<el-form ref="form" label-width="100px">
-				<el-form-item label="id">
-					<el-input v-model="id"></el-input>
-				</el-form-item>
-				<el-form-item>
-					<el-button type="primary">保存</el-button>
-				</el-form-item>
-			</el-form>
-		</el-card>
-	</el-main>
-</template>
-
-<script>
-	export default {
-		name: 'listCrud-detail',
-		data() {
-			return {
-				id: this.$route.query.id,
-				input: ""
-			}
-		},
-		created() {
-
-		},
-		mounted() {
-			//修改tab名称
-			this.$store.commit("updateViewTagsTitle", this.id?`CURD编辑ID:${this.id}`:"CURD新增")
-		},
-		methods: {
-
-		}
-	}
-</script>
-
-<style>
-</style>

+ 0 - 158
src/views/template/list/crud/index.vue

@@ -1,158 +0,0 @@
-<template>
-	<el-container>
-		<el-header>
-			<div class="left-panel">
-				<el-button type="primary" icon="el-icon-plus" @click="add"></el-button>
-				<el-button type="primary" icon="el-icon-plus" @click="addPage">页面新增</el-button>
-				<el-button type="danger" plain icon="el-icon-delete" :disabled="selection.length==0" @click="batch_del"></el-button>
-			</div>
-		</el-header>
-		<el-main class="nopadding">
-			<scTable ref="table" :apiObj="list.apiObj" row-key="id" @selection-change="selectionChange" stripe>
-				<el-table-column type="selection" width="50"></el-table-column>
-				<el-table-column label="姓名" prop="name" width="180"></el-table-column>
-				<el-table-column label="性别" prop="sex" width="150"></el-table-column>
-				<el-table-column label="邮箱" prop="email" width="250"></el-table-column>
-				<el-table-column label="状态" prop="boolean" width="60">
-					<template #default="scope">
-						<sc-status-indicator v-if="scope.row.boolean" type="success"></sc-status-indicator>
-						<sc-status-indicator v-if="!scope.row.boolean" pulse type="danger"></sc-status-indicator>
-					</template>
-				</el-table-column>
-				<el-table-column label="评分" prop="num" width="150"></el-table-column>
-				<el-table-column label="操作" fixed="right" align="right" width="300">
-					<template #default="scope">
-						<el-button plain size="small" @click="table_show(scope.row)">查看</el-button>
-						<el-button type="primary" plain size="small" @click="table_edit(scope.row)">编辑</el-button>
-						<el-button type="primary" plain size="small" @click="table_edit_page(scope.row)">页面编辑</el-button>
-						<el-popconfirm title="确定删除吗?" @confirm="table_del(scope.row, scope.$index)">
-							<template #reference>
-								<el-button plain type="danger" size="small">删除</el-button>
-							</template>
-						</el-popconfirm>
-					</template>
-				</el-table-column>
-			</scTable>
-		</el-main>
-	</el-container>
-
-	<save-dialog v-if="dialog.save" ref="saveDialog" @success="handleSaveSuccess" @closed="dialog.save=false"></save-dialog>
-
-	<el-drawer v-model="dialog.info" :size="800" title="详细" direction="rtl" destroy-on-close>
-		<info ref="infoDialog"></info>
-	</el-drawer>
-
-</template>
-
-<script>
-	import saveDialog from './save'
-	import info from './info'
-
-	export default {
-		name: 'listCrud',
-		components: {
-			saveDialog,
-			info
-		},
-		data() {
-			return {
-				dialog:{
-					save: false,
-					info: false
-				},
-				list: {
-					apiObj: this.$API.demo.list
-				},
-				selection: []
-			}
-		},
-		mounted() {
-
-		},
-		methods: {
-			//窗口新增
-			add(){
-				this.dialog.save = true
-				this.$nextTick(() => {
-					this.$refs.saveDialog.open()
-				})
-			},
-			//窗口编辑
-			table_edit(row){
-				this.dialog.save = true
-				this.$nextTick(() => {
-					this.$refs.saveDialog.open('edit').setData(row)
-				})
-			},
-			//页面新增
-			addPage(){
-				this.$router.push({
-					path: '/template/list/crud/detail',
-				})
-			},
-			//页面编辑
-			table_edit_page(row){
-				this.$router.push({
-					path: '/template/list/crud/detail',
-					query: {
-						id: row.id
-					}
-				})
-			},
-			//查看
-			table_show(row){
-				this.dialog.info = true
-				this.$nextTick(() => {
-					this.$refs.infoDialog.setData(row)
-				})
-			},
-			//删除明细
-			async table_del(row, index){
-				var reqData = {id: row.id}
-				var res = await this.$API.demo.post.post(reqData);
-				if(res.code == 200){
-					this.$refs.table.removeIndex(index)
-					this.$message.success("删除成功")
-				}else{
-					this.$alert(res.message, "提示", {type: 'error'})
-				}
-			},
-			//批量删除
-			async batch_del(){
-				var confirmRes = await this.$confirm(`确定删除选中的 ${this.selection.length} 项吗?`, '提示', {
-					type: 'warning',
-					confirmButtonText: '删除',
-					confirmButtonClass: 'el-button--danger'
-				}).catch(() => {})
-
-				if(!confirmRes){
-					return false
-				}
-
-				var ids = this.selection.map(v => v.id)
-				this.$refs.table.removeKeys(ids)
-				this.$message.success("操作成功")
-
-			},
-			//表格选择后回调事件
-			selectionChange(selection){
-				this.selection = selection
-			},
-			//本地更新数据
-			handleSaveSuccess(data, mode){
-				//为了减少网络请求,直接变更表格内存数据
-				if(mode=='add'){
-					this.$refs.table.unshiftRow(data)
-				}else if(mode=='edit'){
-					this.$refs.table.updateKey(data)
-				}
-
-				//当然也可以暴力的直接刷新表格
-				// this.$refs.table.refresh()
-			}
-		}
-	}
-</script>
-
-<style>
-</style>

+ 0 - 33
src/views/template/list/crud/info.vue

@@ -1,33 +0,0 @@
-<template>
-	<el-main style="padding:0 20px;">
-		<el-card shadow="never">
-			<el-descriptions title="Table row data" :column="2" border>
-				<el-descriptions-item v-for=" (val, key) in data" :key="key" :label="key" width="150px">{{val}}</el-descriptions-item>
-			</el-descriptions>
-		</el-card>
-	</el-main>
-</template>
-
-<script>
-	export default {
-		data() {
-			return {
-				data: {
-					id: ""
-				}
-			}
-		},
-		mounted() {
-
-		},
-		methods: {
-			//注入数据
-			setData(data){
-				this.data = data
-			}
-		}
-	}
-</script>
-
-<style>
-</style>

+ 0 - 114
src/views/template/list/crud/save.vue

@@ -1,114 +0,0 @@
-<template>
-	<el-dialog :title="titleMap[mode]" v-model="visible" :width="500" destroy-on-close @closed="$emit('closed')">
-		<el-form :model="form" :rules="rules" :disabled="mode=='show'" ref="dialogForm" label-width="100px">
-			<el-form-item label="姓名" prop="name">
-				<el-input v-model="form.name" placeholder="请输入姓名" clearable></el-input>
-			</el-form-item>
-			<el-form-item label="性别" prop="sex">
-				<el-radio-group v-model="form.sex">
-					<el-radio label="男">男</el-radio>
-					<el-radio label="女">女</el-radio>
-				</el-radio-group>
-			</el-form-item>
-			<el-form-item label="邮箱" prop="email">
-				<el-input v-model="form.email" placeholder="请输入邮箱" clearable></el-input>
-			</el-form-item>
-			<el-form-item label="评分" prop="num">
-				<el-input-number v-model="form.num" :min="0" style="width: 100%;"></el-input-number>
-			</el-form-item>
-			<el-form-item label="状态" prop="boolean">
-				<el-switch v-model="form.boolean"></el-switch>
-			</el-form-item>
-		</el-form>
-		<template #footer>
-			<el-button @click="visible=false" >取 消</el-button>
-			<el-button v-if="mode!='show'" type="primary" :loading="isSaveing" @click="submit()">保 存</el-button>
-		</template>
-	</el-dialog>
-</template>
-
-<script>
-	export default {
-		emits: ['success', 'closed'],
-		data() {
-			return {
-				mode: "add",
-				titleMap: {
-					add: '新增',
-					edit: '编辑',
-					show: '查看'
-				},
-				visible: false,
-				isSaveing: false,
-				//表单数据
-				form: {
-					id:"",
-					name: "",
-					sex: "男",
-					email: "",
-					num: 0,
-					boolean: true
-				},
-				//验证规则
-				rules: {
-					name: [
-						{required: true, message: '请输入姓名'}
-					]
-				},
-				//所需数据选项
-				groups: [],
-				groupsProps: {
-					value: "id",
-					emitPath: false,
-					checkStrictly: true
-				}
-			}
-		},
-		mounted() {
-
-		},
-		methods: {
-			//显示
-			open(mode='add'){
-				this.mode = mode;
-				this.visible = true;
-				return this
-			},
-			//表单提交方法
-			async submit(){
-				var valid = await this.$refs.dialogForm.validate().catch(() => {})
-				if(!valid){
-					return false
-				}
-				this.isSaveing = true;
-				var res = await this.$API.demo.post.post(this.form);
-				this.isSaveing = false;
-				if(res.code == 200){
-					if(this.mode=='add'){
-						this.form.id = res.data
-					}
-					this.$emit('success', this.form, this.mode)
-					this.visible = false;
-					this.$message.success("操作成功")
-				}else{
-					this.$alert(res.message, "提示", {type: 'error'})
-				}
-			},
-			//表单注入数据
-			setData(data){
-				this.form.id = data.id
-				this.form.name = data.name
-				this.form.sex = data.sex
-				this.form.email = data.email
-				this.form.num = data.num
-				this.form.boolean = data.boolean
-
-				//可以和上面一样单个注入,也可以像下面一样直接合并进去
-				//Object.assign(this.form, data)
-			}
-		}
-	}
-</script>
-
-<style>
-</style>

+ 0 - 74
src/views/template/list/son.vue

@@ -1,74 +0,0 @@
-<template>
-	<el-container>
-		<el-aside width="40%">
-			<el-container>
-				<el-header>
-					<div class="left-panel">
-						<el-button type="primary" icon="el-icon-plus"></el-button>
-						<el-button type="danger" plain icon="el-icon-delete"></el-button>
-					</div>
-				</el-header>
-				<el-main class="nopadding">
-					<scTable ref="table" :apiObj="list.apiObj" row-key="id" stripe highlightCurrentRow @row-click="rowClick">
-						<el-table-column type="selection" width="50"></el-table-column>
-						<el-table-column label="ID" prop="id" width="200"></el-table-column>
-						<el-table-column label="评分" prop="num" width="80"></el-table-column>
-						<el-table-column label="进度" prop="progress" width="250" sortable>
-							<template #default="scope">
-								<el-progress :percentage="scope.row.progress" />
-							</template>
-						</el-table-column>
-						<el-table-column label="创建日期" prop="datetime" width="150" sortable></el-table-column>
-					</scTable>
-				</el-main>
-			</el-container>
-		</el-aside>
-		<el-container>
-			<el-header>
-				<div class="left-panel">
-					<el-button type="primary" icon="el-icon-plus"></el-button>
-					<el-button type="danger" plain icon="el-icon-delete"></el-button>
-				</div>
-			</el-header>
-			<el-main class="nopadding">
-				<scTable ref="sontable" :apiObj="list.apiObj" row-key="id" stripe>
-					<el-table-column type="selection" width="50"></el-table-column>
-					<el-table-column label="姓名" prop="name" width="180"></el-table-column>
-					<el-table-column label="状态" prop="type" width="60">
-						<template #default="scope">
-							<sc-status-indicator v-if="scope.row.type==0" type="success"></sc-status-indicator>
-							<sc-status-indicator v-if="scope.row.type==1" pulse type="danger"></sc-status-indicator>
-						</template>
-					</el-table-column>
-					<el-table-column label="邮箱" prop="email" width="250"></el-table-column>
-					<el-table-column label="评分" prop="num" width="150"></el-table-column>
-					<el-table-column label="注册时间" prop="datetime" width="150" sortable></el-table-column>
-				</scTable>
-			</el-main>
-		</el-container>
-	</el-container>
-</template>
-
-<script>
-	export default {
-		name: 'listSon',
-		data() {
-			return {
-				list: {
-					apiObj: this.$API.demo.list
-				},
-			}
-		},
-		methods: {
-			rowClick(row){
-				var params = {
-					groupId: row.id
-				}
-				this.$refs.sontable.reload(params)
-			}
-		}
-	}
-</script>
-
-<style>
-</style>

+ 0 - 167
src/views/template/list/tab.vue

@@ -1,167 +0,0 @@
-<template>
-	<el-container>
-		<el-header class="header-tabs">
-			<el-tabs type="card" v-model="groupId" @tab-change="tabChange">
-				<el-tab-pane label="所有" name="0"></el-tab-pane>
-				<el-tab-pane label="未完成" name="1"></el-tab-pane>
-				<el-tab-pane label="已退回" name="2"></el-tab-pane>
-				<el-tab-pane label="已关闭" name="3"></el-tab-pane>
-				<el-tab-pane label="已完成" name="4"></el-tab-pane>
-			</el-tabs>
-		</el-header>
-		<el-header style="height: auto;">
-			<sc-select-filter :data="filterData" :label-width="80" @on-change="filterChange"></sc-select-filter>
-		</el-header>
-		<el-header>
-			<div class="left-panel">
-				<el-button type="primary" icon="el-icon-plus"></el-button>
-				<el-button type="danger" plain icon="el-icon-delete"></el-button>
-			</div>
-			<div class="right-panel">
-				<div class="right-panel-search">
-					<el-input v-model="search.keyword" placeholder="关键词" clearable></el-input>
-					<el-button type="primary" icon="el-icon-search" @click="upsearch"></el-button>
-				</div>
-			</div>
-		</el-header>
-		<el-main class="nopadding">
-			<scTable ref="table" :apiObj="list.apiObj" row-key="id" stripe>
-				<el-table-column type="selection" width="50"></el-table-column>
-				<el-table-column label="姓名" prop="name" width="150"></el-table-column>
-				<el-table-column label="性别" prop="sex" width="150"></el-table-column>
-				<el-table-column label="邮箱" prop="email" width="250"></el-table-column>
-				<el-table-column label="评分" prop="num" width="150"></el-table-column>
-				<el-table-column label="注册时间" prop="datetime" width="150" sortable></el-table-column>
-				<el-table-column label="操作" fixed="right" align="right" width="160">
-					<template #default>
-						<el-button-group>
-							<el-button text type="primary" size="small">查看</el-button>
-							<el-button text type="primary" size="small">编辑</el-button>
-							<el-button text type="primary" size="small">删除</el-button>
-						</el-button-group>
-					</template>
-				</el-table-column>
-			</scTable>
-		</el-main>
-	</el-container>
-</template>
-
-<script>
-	import scSelectFilter from '@/components/scSelectFilter'
-
-	export default {
-		name: 'listTab',
-		components: {
-			scSelectFilter
-		},
-		data() {
-			return {
-				groupId: "0",
-				filterData: [
-					{
-						title: "所属行业",
-						key: "type",
-						multiple: true,
-						options: [
-							{
-								label: "全部",
-								value: ""
-							},
-							{
-								label: "汽车",
-								value: "1"
-							},
-							{
-								label: "大健康",
-								value: "2"
-							},
-							{
-								label: "节能环保",
-								value: "3"
-							},
-							{
-								label: "智能信息",
-								value: "4"
-							},
-							{
-								label: "文化旅游",
-								value: "5"
-							},
-							{
-								label: "新材料",
-								value: "6"
-							},
-							{
-								label: "高端装备",
-								value: "7"
-							},
-							{
-								label: "其他行业",
-								value: "99"
-							}
-						]
-					},
-					{
-						title: "所属区域",
-						key: "area",
-						options: [
-							{
-								label: "全部",
-								value: ""
-							},
-							{
-								label: "华东",
-								value: "HD"
-							},
-							{
-								label: "华北",
-								value: "HB"
-							},
-							{
-								label: "华南",
-								value: "HN"
-							},
-							{
-								label: "华中",
-								value: "HZ"
-							},
-							{
-								label: "华西南",
-								value: "HXN"
-							},
-							{
-								label: "东北",
-								value: "DB"
-							}
-						]
-					}
-				],
-				list: {
-					apiObj: this.$API.demo.list
-				},
-				search: {
-					keyword: ""
-				}
-			}
-		},
-		methods: {
-			//搜索
-			upsearch(){
-				this.$refs.table.upData(this.search)
-			},
-			//标签切换
-			tabChange(name){
-				var params = {
-					groupId: name
-				}
-				this.$refs.table.reload(params)
-			},
-			filterChange(data){
-				this.$refs.table.upData(data)
-			}
-		}
-	}
-</script>
-
-<style>
-</style>

+ 0 - 128
src/views/template/list/tree.vue

@@ -1,128 +0,0 @@
-<template>
-	<el-container>
-		<el-aside width="200px">
-			<el-container>
-				<el-header>
-					<el-input placeholder="输入关键字进行过滤" v-model="groupFilterText" clearable></el-input>
-				</el-header>
-				<el-main class="nopadding">
-					<el-tree ref="group" class="menu" node-key="id" :data="groupData" :current-node-key="''" :highlight-current="true" :expand-on-click-node="false" :filter-node-method="groupFilterNode" @node-click="groupClick"></el-tree>
-				</el-main>
-			</el-container>
-		</el-aside>
-		<el-container>
-			<el-header>
-				<div class="left-panel">
-					<el-button type="primary" icon="el-icon-plus"></el-button>
-					<el-button type="danger" plain icon="el-icon-delete"></el-button>
-				</div>
-				<div class="right-panel">
-					<div class="right-panel-search">
-						<el-input v-model="search.keyword" placeholder="关键词" clearable></el-input>
-						<el-button type="primary" icon="el-icon-search" @click="upsearch"></el-button>
-					</div>
-				</div>
-			</el-header>
-			<el-main class="nopadding">
-				<scTable ref="table" :apiObj="list.apiObj" row-key="id" stripe>
-					<el-table-column type="selection" width="50"></el-table-column>
-					<el-table-column label="姓名" prop="name" width="150"></el-table-column>
-					<el-table-column label="性别" prop="sex" width="150"></el-table-column>
-					<el-table-column label="邮箱" prop="email" width="250"></el-table-column>
-					<el-table-column label="评分" prop="num" width="150"></el-table-column>
-					<el-table-column label="注册时间" prop="datetime" width="150" sortable></el-table-column>
-					<el-table-column label="操作" fixed="right" align="right" width="160">
-						<template #default>
-							<el-button-group>
-								<el-button text type="primary" size="small">查看</el-button>
-								<el-button text type="primary" size="small">编辑</el-button>
-								<el-button text type="primary" size="small">删除</el-button>
-							</el-button-group>
-						</template>
-					</el-table-column>
-				</scTable>
-			</el-main>
-		</el-container>
-	</el-container>
-</template>
-
-<script>
-	export default {
-		name: 'listTree',
-		data() {
-			return {
-				groupFilterText: "",
-				groupData: [
-					{
-						id: "",
-						label: "所有"
-					},
-					{
-						id: "1",
-						label: "华东总部",
-						children: [
-							{
-								id: "11",
-								label: "售前客服部"
-							},
-							{
-								id: "12",
-								label: "技术研发部"
-							},
-							{
-								id: "13",
-								label: "行政人事部"
-							}
-						]
-					},
-					{
-						id: "2",
-						label: "华难总部",
-						children: [
-							{
-								id: "21",
-								label: "售前客服部"
-							},
-							{
-								id: "22",
-								label: "技术研发部"
-							}
-						]
-					}
-				],
-				list: {
-					apiObj: this.$API.demo.list
-				},
-				search: {
-					keyword: ""
-				}
-			}
-		},
-		watch: {
-			groupFilterText(val) {
-				this.$refs.group.filter(val);
-			}
-		},
-		methods: {
-			//树过滤
-			groupFilterNode(value, data){
-				if (!value) return true;
-				return data.label.indexOf(value) !== -1;
-			},
-			//树点击事件
-			groupClick(data){
-				var params = {
-					groupId: data.id
-				}
-				this.$refs.table.reload(params)
-			},
-			//搜索
-			upsearch(){
-				this.$refs.table.upData(this.search)
-			},
-		}
-	}
-</script>
-
-<style>
-</style>

+ 0 - 66
src/views/template/list/width.vue

@@ -1,66 +0,0 @@
-<template>
-	<el-main class="sc-page">
-		<el-page-header content="定宽页面" />
-		<el-alert class="page-msg" description="<el-main>添加定宽样式 .sc-page  即可定宽, 固定1200px宽度, 适用于一些无法自适应的页面, 类似报表等需要固定宽度的页面. 其实定宽页面更受C端用户接受和习惯" type="warning" show-icon :closable="false" />
-		<el-card shadow="never" header="所有主机">
-			<div class="page-buttons">
-				<el-button type="primary" style="width: 180px;">创建云主机</el-button>
-				<el-button type="primary" text>管理秘钥</el-button>
-				<el-button type="primary" text>黑名单</el-button>
-			</div>
-			<scTable ref="table" :data="data" height="auto" paginationLayout="total, prev, pager, next" hideDo>
-				<el-table-column label="主机名称" prop="name" min-width="240"></el-table-column>
-				<el-table-column label="外网ip" prop="ip" width="200"></el-table-column>
-				<el-table-column label="系统盘" prop="c" width="150"></el-table-column>
-				<el-table-column label="数据盘" prop="d" width="150"></el-table-column>
-				<el-table-column label="业务状态" prop="zt" width="150">
-					<el-tag type="success">运行中</el-tag>
-				</el-table-column>
-				<el-table-column label="操作" width="70">
-					<el-dropdown>
-						<el-button icon="el-icon-more" size="small"></el-button>
-						<template #dropdown>
-							<el-dropdown-menu>
-								<el-dropdown-item>配额</el-dropdown-item>
-								<el-dropdown-item divided>重启</el-dropdown-item>
-								<el-dropdown-item >停机</el-dropdown-item>
-								<el-dropdown-item divided>释放主机</el-dropdown-item>
-							</el-dropdown-menu>
-						</template>
-					</el-dropdown>
-				</el-table-column>
-			</scTable>
-		</el-card>
-	</el-main>
-</template>
-
-<script>
-	export default {
-		name: 'widthlist',
-		data(){
-			return {
-				data: [
-					{
-						name: "WIN-server-202256324",
-						ip: "211.187.11.18",
-						c: "80G",
-						d: "2048G",
-						out: "1"
-					},
-					{
-						name: "WIN-server-20210312081254",
-						ip: "211.187.41.56",
-						c: "80G",
-						d: "2048G",
-						out: "1"
-					}
-				]
-			}
-		}
-	}
-</script>
-
-<style scoped>
-	.page-msg {margin: 15px 0;}
-	.page-buttons {margin-bottom: 20px;}
-</style>

+ 0 - 150
src/views/template/other/stepform.vue

@@ -1,150 +0,0 @@
-<template>
-	<el-main>
-		<el-card shadow="never" header="分步表单">
-			<el-steps :active="active" align-center style="margin-bottom: 20px;">
-				<el-step title="填写转账信息"></el-step>
-				<el-step title="确认转账信息"></el-step>
-				<el-step title="完成"></el-step>
-			</el-steps>
-			<el-row>
-				<el-col :lg="{span: 8, offset: 8}">
-					<el-form v-if="active==0" ref="stepForm_0" :model="form" :rules="rules" label-position="top">
-						<el-form-item label="付款账户" prop="paymentAccount">
-							<el-select v-model="form.paymentAccount" clearable>
-								<el-option label="sakuya@scui.com" value="sakuya@scui.com"></el-option>
-								<el-option label="lolicode@scui.com" value="lolicode@scui.com"></el-option>
-							</el-select>
-						</el-form-item>
-						<el-form-item label="收款账户" prop="collectionAccount">
-							<el-input v-model="form.collectionAccount" clearable></el-input>
-						</el-form-item>
-						<el-form-item label="收款人姓名" prop="collectionName">
-							<el-input v-model="form.collectionName" clearable></el-input>
-						</el-form-item>
-						<el-form-item label="转账金额" prop="amount">
-							<el-input v-model="form.amount"></el-input>
-						</el-form-item>
-					</el-form>
-					<el-form v-if="active==1" ref="stepForm_1" :model="form" :rules="rules" label-position="top">
-						<el-alert title="确认转账后,资金将直接打入对方账户,无法退回。" type="warning" show-icon style="margin-bottom: 15px;"/>
-						<el-descriptions :column="1" border>
-							<el-descriptions-item label="付款账户">{{form.paymentAccount}}</el-descriptions-item>
-							<el-descriptions-item label="收款账户">{{form.collectionAccount}}</el-descriptions-item>
-							<el-descriptions-item label="收款人姓名">{{form.collectionName}}</el-descriptions-item>
-							<el-descriptions-item label="转账金额">{{form.amount}} 元</el-descriptions-item>
-						</el-descriptions>
-						<el-divider></el-divider>
-						<el-form-item label="支付密码" prop="payPassword">
-							<el-input v-model="form.payPassword" show-password placeholder="请输入"></el-input>
-						</el-form-item>
-					</el-form>
-					<div v-if="active==2">
-						<el-result icon="success" title="操作成功" sub-title="预计两小时内到账">
-							<template #extra>
-								<el-button type="primary" @click="again">再转一笔</el-button>
-								<el-button>查看账单</el-button>
-							</template>
-						</el-result>
-					</div>
-					<el-button v-if="active>0 && active<2" @click="pre" :disabled="submitLoading">上一步</el-button>
-					<el-button v-if="active<1" type="primary" @click="next">下一步</el-button>
-					<el-button v-if="active==1" type="primary" @click="submit" :loading="submitLoading">提交</el-button>
-				</el-col>
-			</el-row>
-		</el-card>
-	</el-main>
-</template>
-
-<script>
-	export default {
-		name: 'stepform',
-		data() {
-			return {
-				active: 0,
-				submitLoading: false,
-				form: {
-					paymentAccount: 'lolicode@scui.com',
-					collectionAccount: 'test@example.com',
-					collectionName: 'Lolowan',
-					amount: '100',
-					payPassword: ''
-				},
-				rules: {
-					paymentAccount: [
-						{
-							required: true,
-							message: '请选择付款账户',
-						}
-					],
-					collectionAccount: [
-						{
-							required: true,
-							message: '请输入收款账户',
-						}
-					],
-					collectionName: [
-						{
-							required: true,
-							message: '请输入收款人姓名',
-						}
-					],
-					amount: [
-						{
-							required: true,
-							message: '请输入转账金额',
-						}
-					],
-					payPassword: [
-						{
-							required: true,
-							message: '需要支付密码才能进行支付',
-						}
-					]
-				}
-			}
-		},
-		mounted() {
-
-		},
-		methods: {
-			//下一步
-			next(){
-				const formName = `stepForm_${this.active}`
-				this.$refs[formName].validate((valid) => {
-					if (valid) {
-						this.active += 1
-					}else{
-						return false
-					}
-				})
-			},
-			//上一步
-			pre(){
-				this.active -= 1
-			},
-			//提交
-			submit(){
-				const formName = `stepForm_${this.active}`
-				this.$refs[formName].validate((valid) => {
-					if (valid) {
-						this.submitLoading = true
-						setTimeout(()=>{
-							this.submitLoading = false
-							this.active += 1
-						},1000)
-					}else{
-						return false
-					}
-				})
-			},
-			//再来一次
-			again(){
-				this.active = 0
-			}
-		}
-	}
-</script>
-
-<style scoped>
-	.el-steps:deep(.is-finish) .el-step__line {background: var(--el-color-primary);}
-</style>

+ 0 - 67
src/views/test/autocode/index.vue

@@ -1,67 +0,0 @@
-<template>
-	<router-view></router-view>
-	<el-main>
-		<el-row :gutter="15">
-			<el-col :xl="6" :lg="6" :md="8" :sm="12" :xs="24" v-for="item in list" :key="item.title">
-				<el-card shadow="hover" :body-style="{ padding: '0px' }" @click="click(item.url)">
-					<div class="code-item">
-						<div class="img" :style="{background: item.color}">
-							<el-icon :style="`background-image: -webkit-linear-gradient(top left, #fff, ${item.color} 100px)`"><component :is="item.icon" /></el-icon>
-						</div>
-						<div class="title">
-							<h2>{{item.title}}</h2>
-							<h4>{{item.des}}</h4>
-							<p><el-tag>{{item.ver}}</el-tag></p>
-						</div>
-					</div>
-				</el-card>
-			</el-col>
-		</el-row>
-	</el-main>
-</template>
-
-<script>
-	export default {
-		name: 'autocode',
-		data() {
-			return {
-				list: [
-					{
-						title: "CRUD v2",
-						des: "配置型生成经典的增删改查列表",
-						icon: "el-icon-finished",
-						color: "#ccc",
-						ver: "开发中",
-						url: "/test/autocode/list_n"
-					},
-					{
-						title: "FormDesigner",
-						des: "表单设计器",
-						icon: "el-icon-list",
-						color: "#ccc",
-						ver: "开发中",
-						url: "/test/autocode/form"
-					}
-				]
-			}
-		},
-		methods: {
-			click(url){
-				this.$router.push({
-					path: url
-				});
-			}
-		}
-	}
-</script>
-
-<style scoped>
-	.el-card {margin-bottom: 15px;}
-	.code-item {cursor: pointer;}
-	.code-item .img {width: 100%;height: 150px;background: #09f;display:flex;align-items: center;justify-content: center;}
-	.code-item .img i {font-size: 100px;color: #fff;background-image: -webkit-linear-gradient(top left, #fff, #09f 100px);-webkit-background-clip: text;-webkit-text-fill-color: transparent;}
-	.code-item .title {padding:15px;}
-	.code-item .title h2 {font-size: 16px;}
-	.code-item .title h4 {font-size: 12px;color: #999;font-weight: normal;margin-top: 5px;}
-	.code-item .title p {margin-top: 15px;}
-</style>

+ 0 - 220
src/views/test/autocode/list.vue

@@ -1,220 +0,0 @@
-<template>
-	<el-container>
-		<el-main>
-			<el-card shadow="never">
-				<el-tabs tab-position="top" >
-				    <el-tab-pane label="列配置">
-						<sc-form-table v-model="column" :addTemplate="addTemplate" placeholder="请添加列数据">
-							<el-table-column prop="label" label="显示名称" width="180">
-								<template #default="scope">
-									<el-input v-model="scope.row.label" placeholder="请输入内容"></el-input>
-								</template>
-							</el-table-column>
-							<el-table-column prop="prop" label="字段名" width="180">
-								<template #default="scope">
-									<el-input v-model="scope.row.prop" placeholder="请输入内容"></el-input>
-								</template>
-							</el-table-column>
-							<el-table-column prop="width" label="宽度" width="180">
-								<template #default="scope">
-									<el-input v-model="scope.row.width" placeholder="请输入内容"></el-input>
-								</template>
-							</el-table-column>
-							<el-table-column prop="isEdit" label="加入编辑" width="80" align="center">
-								<template #default="scope">
-									<el-checkbox v-model="scope.row.isEdit"></el-checkbox>
-								</template>
-							</el-table-column>
-							<el-table-column prop="isSearch" label="加入搜索" width="80" align="center">
-								<template #default="scope">
-									<el-checkbox v-model="scope.row.isSearch"></el-checkbox>
-								</template>
-							</el-table-column>
-						</sc-form-table>
-					</el-tab-pane>
-				    <el-tab-pane label="基础配置">
-						<el-row>
-							<el-col :xl="12" :lg="8">
-								<el-form :model="base" label-width="80px">
-									<el-form-item label="name">
-										<el-input v-model="base.name"></el-input>
-										<div class="el-form-item-msg">系统唯一且与路由别名一致,否则导致缓存失效。</div>
-									</el-form-item>
-									<el-form-item label="rowKey">
-										<el-input v-model="base.rowKey"></el-input>
-										<div class="el-form-item-msg">表格唯一标识,编辑保存和删除将传递rowKey</div>
-									</el-form-item>
-								</el-form>
-							</el-col>
-						</el-row>
-					</el-tab-pane>
-				    <el-tab-pane label="API路径配置">
-						<el-alert title="$API 映射文件: @/api/index.js 统一接口管理器, 所以需提前配置好API对象." type="warning" style="margin:0 0 20px 0;"></el-alert>
-						<el-row>
-							<el-col :xl="12" :lg="8">
-								<el-form :model="api" label-width="80px">
-									<el-form-item label="获取列表">
-										<el-input v-model="api.list">
-											<template #prepend>$API.</template>
-										</el-input>
-									</el-form-item>
-									<el-form-item label="新增">
-										<el-input v-model="api.add">
-											<template #prepend>$API.</template>
-										</el-input>
-									</el-form-item>
-									<el-form-item label="保存">
-										<el-input v-model="api.save">
-											<template #prepend>$API.</template>
-										</el-input>
-									</el-form-item>
-									<el-form-item label="查询详细">
-										<el-input v-model="api.show">
-											<template #prepend>$API.</template>
-										</el-input>
-									</el-form-item>
-									<el-form-item label="删除">
-										<el-input v-model="api.del">
-											<template #prepend>$API.</template>
-										</el-input>
-									</el-form-item>
-								</el-form>
-							</el-col>
-						</el-row>
-					</el-tab-pane>
-				</el-tabs>
-			</el-card>
-			<pre style="margin-top: 50px;display: none;">{{ code }}</pre>
-		</el-main>
-		<el-footer>
-			<el-dropdown style="margin-right: 15px;">
-				<el-button type="primary" icon="el-icon-download" :loading="downloadcodeLoading">下载VUE文件</el-button>
-				<template #dropdown>
-					<el-dropdown-menu>
-						<el-dropdown-item @click="downloadListCode">下载 index.vue</el-dropdown-item>
-						<el-dropdown-item @click="downloadSaveCode">下载 save.vue</el-dropdown-item>
-					</el-dropdown-menu>
-				</template>
-			</el-dropdown>
-			<el-dropdown>
-				<el-button type="primary" plain icon="el-icon-top-right" :loading="showcodeLoading">预览代码</el-button>
-				<template #dropdown>
-					<el-dropdown-menu>
-						<el-dropdown-item @click="showListCode">预览 index.vue</el-dropdown-item>
-						<el-dropdown-item @click="showSaveCode">预览 save.vue</el-dropdown-item>
-					</el-dropdown-menu>
-				</template>
-			</el-dropdown>
-		</el-footer>
-	</el-container>
-
-
-	<el-dialog title="代码预览" v-model="codeVisible" width="60%" append-to-body destroy-on-close>
-		<el-alert title="需将VUE文件放置views文件夹,路由匹配组件的路径下,如文件名为index.vue可不需要写文件名" type="success" show-icon style="margin-bottom: 20px;"></el-alert>
-		<pre contenteditable class="code">{{ code }}</pre>
-		<template #footer>
-			<el-button type="primary" @click="codeVisible = false">确 定</el-button>
-		</template>
-	</el-dialog>
-
-</template>
-
-<script>
-	import template from '@/utils/template.js'
-
-	export default {
-		name: 'autocode-list',
-		data() {
-			return {
-				codeVisible: false,
-				showcodeLoading: false,
-				downloadcodeLoading: false,
-				code: '',
-				base: {
-					name: "",
-					rowKey: "id"
-				},
-				api: {
-					list: '',
-					add: '',
-					save: '',
-					show: '',
-					del: ''
-				},
-				column: [],
-				addTemplate: {
-					label: "",
-					prop: "",
-					width: "100",
-					isSearch: false,
-					isEdit: false
-				}
-			}
-		},
-		mounted(){
-
-		},
-		methods: {
-			//列表预览
-			async showListCode(){
-				this.showcodeLoading = true;
-				await this.getListTpl()
-				this.showcodeLoading = false;
-				this.codeVisible=true;
-			},
-			//获取列表模板文件
-			async getListTpl(){
-				var data = {
-					createDate:new Date().toLocaleString(),
-					base: this.base,
-					column: this.column,
-					api: this.api
-				}
-				var tpl = await this.$HTTP.get('code/list/index.vue')
-				this.code = template(tpl, data)
-			},
-			//详细预览
-			async showSaveCode(){
-				this.showcodeLoading = true;
-				await this.getSaveTpl()
-				this.showcodeLoading = false;
-				this.codeVisible=true;
-			},
-			//获取详细模板文件
-			async getSaveTpl(){
-				var data = {
-					createDate:new Date().toLocaleString(),
-					base: this.base,
-					column: this.column.filter(item => item.isEdit===true),
-					api: this.api
-				}
-				var tpl = await this.$HTTP.get('code/list/save.vue')
-				this.code = template(tpl, data)
-			},
-			async downloadListCode(){
-				this.downloadcodeLoading = true;
-				await this.getListTpl()
-				this.downloadcodeLoading = false;
-				this.createFile(this.code, 'index.vue')
-			},
-			async downloadSaveCode(){
-				this.downloadcodeLoading = true;
-				await this.getSaveTpl()
-				this.downloadcodeLoading = false;
-				this.createFile(this.code, 'save.vue')
-			},
-			//创建文件并下载
-			createFile(row, name){
-				const element = document.createElement('a')
-				element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(row))
-				element.setAttribute('download', name)
-				element.style.display = 'none'
-				element.click()
-			}
-		}
-	}
-</script>
-
-<style scoped>
-	.code {height:400px;overflow: auto;background: #333;color: #999;padding:20px;font-size: 14px;font-family: "consolas";line-height: 1.5;}
-</style>

+ 0 - 96
src/views/test/codebug/index.vue

@@ -1,96 +0,0 @@
-<!--
- * @Descripttion: 模拟触发错误
- * @version: 1.0
- * @Author: sakuya
- * @Date: 2021年6月25日08:53:13
- * @LastEditors:
- * @LastEditTime:
--->
-
-<template>
-	<el-main>
-		<el-alert title="通过VUE开放的errorHandler可以很方便的捕捉到处理异常, SCUI收集后可上报日志收集系统, 相关代码:@/utils/errorHandler.js" type="success" style="margin-bottom:20px;"></el-alert>
-		<el-row :gutter="15">
-			<el-col :lg="8">
-				<el-card shadow="never" header="ReferenceError">
-					<el-button type="danger" @click="ReferenceError">模拟触发</el-button>
-				</el-card>
-			</el-col>
-			<el-col :lg="8">
-				<el-card shadow="never" header="TypeError">
-					<el-button type="danger" @click="TypeError">模拟触发</el-button>
-				</el-card>
-			</el-col>
-			<el-col :lg="8">
-				<el-card shadow="never" header="RangeError">
-					<el-button type="danger" @click="RangeError">模拟触发</el-button>
-				</el-card>
-			</el-col>
-			<el-col :lg="8">
-				<el-card shadow="never" header="API 401">
-					<el-button type="danger" @click="api401">模拟触发</el-button>
-				</el-card>
-			</el-col>
-			<el-col :lg="8">
-				<el-card shadow="never" header="API 404">
-					<el-button type="danger" @click="api404">模拟触发</el-button>
-				</el-card>
-			</el-col>
-			<el-col :lg="8">
-				<el-card shadow="never" header="API 500">
-					<el-button type="danger" @click="api500">模拟触发</el-button>
-				</el-card>
-			</el-col>
-			<el-col :lg="8">
-				<el-card shadow="never" header="Router 404">
-					<el-button type="danger" @click="router404">模拟触发</el-button>
-				</el-card>
-			</el-col>
-		</el-row>
-		<el-alert title=":) 尝试模拟SyntaxError语法错误时,发现VUE编译失败,所以这不作模拟了" type="info" style="margin-top:20px;"></el-alert>
-	</el-main>
-</template>
-
-<script>
-	/* eslint-disable */
-	//为了演示异常,跳过eslint
-	export default {
-		name: 'codebug',
-		data() {
-			return {
-
-			}
-		},
-		mounted() {
-
-		},
-		methods: {
-			ReferenceError(){
-				console.log(obj);
-			},
-			TypeError(){
-				const obj = null
-				console.log(obj.a);
-			},
-			RangeError(){
-				const n = 1
-				n.toFixed(101)
-			},
-			async api401(){
-				var data = await this.$API.demo.status.get(401)
-			},
-			async api404(){
-				var data = await this.$API.demo.status.get(404)
-			},
-			async api500(){
-				var data = await this.$API.demo.status.get(500)
-			},
-			router404(){
-				this.$router.push('/page/404')
-			}
-		}
-	}
-</script>
-
-<style>
-</style>

+ 0 - 134
src/views/userCenter/index.vue

@@ -1,134 +0,0 @@
-<template>
-	<el-container class="page-user">
-		<el-aside style="width: 240px;">
-			<el-container>
-				<el-header style="height: auto;display: block;">
-					<div class="user-info-top">
-						<el-avatar :size="70" src="img/avatar.jpg"></el-avatar>
-						<h2>{{ user.userName }}</h2>
-						<p><el-tag effect="dark" round size="large" disable-transitions>{{ user.role }}</el-tag></p>
-					</div>
-				</el-header>
-				<el-main class="nopadding">
-					<el-menu class="menu" :default-active="page">
-						<el-menu-item-group v-for="group in menu" :key="group.groupName" :title="group.groupName">
-							<el-menu-item v-for="item in group.list" :key="item.component" :index="item.component" @click="openPage">
-								<el-icon v-if="item.icon"><component :is="item.icon"/></el-icon>
-								<template #title>
-									<span>{{item.title}}</span>
-								</template>
-							</el-menu-item>
-						</el-menu-item-group>
-					</el-menu>
-				</el-main>
-			</el-container>
-		</el-aside>
-		<el-main>
-			<Suspense>
-				<template #default>
-					<component :is="page"/>
-				</template>
-				<template #fallback>
-					<el-skeleton :rows="3" />
-				</template>
-			</Suspense>
-		</el-main>
-	</el-container>
-</template>
-
-<script>
-	import { defineAsyncComponent } from 'vue'
-
-	export default {
-		name: 'userCenter',
-		components: {
-			account: defineAsyncComponent(() => import('./user/account')),
-			seting: defineAsyncComponent(() => import('./user/seting')),
-			pushSettings: defineAsyncComponent(() => import('./user/pushSettings')),
-			password: defineAsyncComponent(() => import('./user/password')),
-			space: defineAsyncComponent(() => import('./user/space')),
-			logs: defineAsyncComponent(() => import('./user/logs')),
-			upToEnterprise: defineAsyncComponent(() => import('./user/upToEnterprise'))
-		},
-		data() {
-			return {
-				menu: [
-					{
-						groupName: "基本设置",
-						list: [
-							{
-								icon: "el-icon-postcard",
-								title: "账号信息",
-								component: "account"
-							},
-							{
-								icon: "el-icon-operation",
-								title: "个人设置",
-								component: "seting"
-							},
-							{
-								icon: "el-icon-lock",
-								title: "密码",
-								component: "password"
-							},
-							{
-								icon: "el-icon-bell",
-								title: "通知设置",
-								component: "pushSettings"
-							}
-						]
-					},
-					{
-						groupName: "数据管理",
-						list: [
-							{
-								icon: "el-icon-coin",
-								title: "存储空间信息",
-								component: "space"
-							},
-							{
-								icon: "el-icon-clock",
-								title: "操作日志",
-								component: "logs"
-							}
-						]
-					},
-					{
-						groupName: "账号升级",
-						list: [
-							{
-								icon: "el-icon-office-building",
-								title: "升级为企业账号",
-								component: "upToEnterprise"
-							}
-						]
-					}
-				],
-				user: {
-					userName: "Sakuya",
-					role: "超级管理员",
-				},
-				page: "account"
-			}
-		},
-		//路由跳转进来 判断from是否有特殊标识做特殊处理
-		beforeRouteEnter (to, from, next){
-			next((vm)=>{
-				if(from.is){
-					//删除特殊标识,防止标签刷新重复执行
-					delete from.is
-					//执行特殊方法
-					vm.$alert('路由跳转过来后含有特殊标识,做特殊处理', '提示', {
-						type: 'success',
-						center: true
-					}).then(() => {}).catch(() => {})
-				}
-			})
-		},
-		methods: {
-			openPage(item){
-				this.page = item.index
-			}
-		}
-	}
-</script>

+ 0 - 46
src/views/userCenter/user/account.vue

@@ -1,46 +0,0 @@
-<template>
-	<el-alert title="异步组件动态加载使用了正处于试验阶段的<Suspense>组件, 其API和使用方式可能会改变. <Suspense> is an experimental feature and its API will likely change." type="warning" show-icon style="margin-bottom: 15px;"/>
-
-	<el-card shadow="never" header="个人信息">
-		<el-form ref="form" :model="form" label-width="120px" style="margin-top:20px;">
-			<el-form-item label="账号">
-				<el-input v-model="form.user" disabled></el-input>
-				<div class="el-form-item-msg">账号信息用于登录,系统不允许修改</div>
-			</el-form-item>
-			<el-form-item label="姓名">
-				<el-input v-model="form.name"></el-input>
-			</el-form-item>
-			<el-form-item label="性别">
-				<el-select v-model="form.sex" placeholder="请选择">
-					<el-option label="保密" value="0"></el-option>
-					<el-option label="男" value="1"></el-option>
-					<el-option label="女" value="2"></el-option>
-				</el-select>
-			</el-form-item>
-			<el-form-item label="个性签名">
-				<el-input v-model="form.about" type="textarea"></el-input>
-			</el-form-item>
-			<el-form-item>
-				<el-button type="primary">保存</el-button>
-			</el-form-item>
-		</el-form>
-	</el-card>
-</template>
-
-<script>
-	export default {
-		data() {
-			return {
-				form: {
-					user: "administrator@scuiadmin.com",
-					name: "Sakuya",
-					sex: "0",
-					about: "正所谓富贵险中求"
-				}
-			}
-		}
-	}
-</script>
-
-<style>
-</style>

+ 0 - 40
src/views/userCenter/user/logs.vue

@@ -1,40 +0,0 @@
-<template>
-	<el-card shadow="never" header="近7天操作记录">
-		<scTable ref="table" :data="data" height="auto" paginationLayout="total, prev, pager, next" hideDo>
-			<sc-table-column label="序号" type="index"></sc-table-column>
-			<sc-table-column label="业务名称" prop="title" min-width="240"></sc-table-column>
-			<sc-table-column label="IP" prop="ip" width="150"></sc-table-column>
-			<sc-table-column label="结果" prop="code" width="150">
-				<el-tag type="success">成功</el-tag>
-			</sc-table-column>
-			<sc-table-column label="操作时间" prop="time" width="150"></sc-table-column>
-
-		</scTable>
-	</el-card>
-</template>
-
-<script>
-	export default {
-		data() {
-			return {
-				data: [
-					{
-						title: "修改用户 lolowan",
-						ip: "211.187.11.18",
-						code: "成功",
-						time: "2022-10-10 08:41:17"
-					},
-					{
-						title: "用户登录",
-						ip: "211.187.11.18",
-						code: "成功",
-						time: "2022-10-10 08:21:51"
-					}
-				]
-			}
-		}
-	}
-</script>
-
-<style>
-</style>

+ 0 - 80
src/views/userCenter/user/password.vue

@@ -1,80 +0,0 @@
-<template>
-	<el-card shadow="never" header="修改密码">
-		<el-alert title="密码更新成功后,您将被重定向到登录页面,您可以使用新密码重新登录。" type="info" show-icon style="margin-bottom: 15px;"/>
-		<el-form ref="form" :model="form" :rules="rules" label-width="120px" style="margin-top:20px;">
-			<el-form-item label="当前密码" prop="userPassword">
-				<el-input v-model="form.userPassword" type="password" show-password placeholder="请输入当前密码"></el-input>
-				<div class="el-form-item-msg">必须提供当前登录用户密码才能进行更改</div>
-			</el-form-item>
-			<el-form-item label="新密码" prop="newPassword">
-				<el-input v-model="form.newPassword" type="password" show-password placeholder="请输入新密码"></el-input>
-				<sc-password-strength v-model="form.newPassword"></sc-password-strength>
-				<div class="el-form-item-msg">请输入包含英文、数字的8位以上密码</div>
-			</el-form-item>
-			<el-form-item label="确认新密码" prop="confirmNewPassword">
-				<el-input v-model="form.confirmNewPassword" type="password" show-password placeholder="请再次输入新密码"></el-input>
-			</el-form-item>
-			<el-form-item>
-				<el-button type="primary" @click="save">保存密码</el-button>
-			</el-form-item>
-		</el-form>
-	</el-card>
-</template>
-
-<script>
-	import scPasswordStrength from '@/components/scPasswordStrength'
-
-	export default {
-		components: {
-			scPasswordStrength
-		},
-		data() {
-			return {
-				form: {
-					userPassword: "",
-					newPassword: "",
-					confirmNewPassword: ""
-				},
-				rules: {
-					userPassword: [
-						{ required: true, message: '请输入当前密码'}
-					],
-					newPassword: [
-						{ required: true, message: '请输入新密码'}
-					],
-					confirmNewPassword: [
-						{ required: true, message: '请再次输入新密码'},
-						{validator: (rule, value, callback) => {
-							if (value !== this.form.newPassword) {
-								callback(new Error('两次输入密码不一致'));
-							}else{
-								callback();
-							}
-						}}
-					]
-				}
-			}
-		},
-		methods: {
-			save(){
-				this.$refs.form.validate(valid => {
-					if (valid) {
-						this.$alert("密码修改成功,是否跳转至登录页使用新密码登录", "修改成功", {
-							type: 'success',
-							center: true
-						}).then(() => {
-							this.$router.replace({
-								path: '/login'
-							})
-						}).catch(() => {})
-					}else{
-						return false
-					}
-				})
-			}
-		}
-	}
-</script>
-
-<style>
-</style>

+ 0 - 30
src/views/userCenter/user/pushSettings.vue

@@ -1,30 +0,0 @@
-<template>
-	<el-card shadow="never" header="事务待办">
-		<el-form ref="form" label-width="180px" label-position="left" style="margin-top:20px;">
-			<el-form-item label="有新的待办">
-				<el-checkbox v-model="form.new">短信推送</el-checkbox>
-				<el-checkbox v-model="form.new_wx">微信推送</el-checkbox>
-			</el-form-item>
-			<el-form-item label="待办有效时剩24小时">
-				<el-checkbox v-model="form.timeout">短信推送</el-checkbox>
-				<el-checkbox v-model="form.timeout_wx">微信推送</el-checkbox>
-			</el-form-item>
-		</el-form>
-	</el-card>
-</template>
-
-<script>
-	export default {
-		data() {
-			return {
-				form: {
-					new: true,
-					timeout: true
-				}
-			}
-		}
-	}
-</script>
-
-<style>
-</style>

+ 0 - 100
src/views/userCenter/user/seting.vue

@@ -1,100 +0,0 @@
-<template>
-	<el-card shadow="never" header="语言主题">
-		<el-form ref="form" label-width="120px" style="margin-top:20px;">
-			<el-form-item :label="$t('user.nightmode')">
-				<el-switch v-model="config.dark" inline-prompt active-icon="el-icon-moon" inactive-icon="el-icon-sunny"></el-switch>
-				<div class="el-form-item-msg">{{ $t('user.nightmode_msg') }}</div>
-			</el-form-item>
-			<el-form-item label="主题颜色">
-				<el-color-picker v-model="config.colorPrimary" :predefine="colorList">></el-color-picker>
-			</el-form-item>
-			<el-form-item :label="$t('user.language')">
-				<el-select v-model="config.lang">
-					<el-option label="简体中文" value="zh-cn"></el-option>
-					<el-option label="English" value="en"></el-option>
-				</el-select>
-				<div class="el-form-item-msg">{{ $t('user.language_msg') }}</div>
-			</el-form-item>
-		</el-form>
-	</el-card>
-	<el-card shadow="never" header="个人设置" style="margin-top:20px;">
-		<el-form ref="form" label-width="120px" style="margin-top:20px;">
-			<el-form-item label="自动登出">
-				<el-select v-model="config.autoExit">
-					<el-option label="从不" :value="0"></el-option>
-					<el-option label="1分钟" :value="1"></el-option>
-					<el-option label="5分钟" :value="5"></el-option>
-					<el-option label="10分钟" :value="10"></el-option>
-					<el-option label="15分钟" :value="15"></el-option>
-					<el-option label="20分钟" :value="20"></el-option>
-					<el-option label="25分钟" :value="25"></el-option>
-					<el-option label="30分钟" :value="30"></el-option>
-					<el-option label="35分钟" :value="35"></el-option>
-					<el-option label="40分钟" :value="40"></el-option>
-					<el-option label="45分钟" :value="45"></el-option>
-					<el-option label="50分钟" :value="50"></el-option>
-					<el-option label="55分钟" :value="55"></el-option>
-					<el-option label="60分钟" :value="60"></el-option>
-				</el-select>
-				<div class="el-form-item-msg">自动登出设置将在下次登录时生效</div>
-			</el-form-item>
-		</el-form>
-	</el-card>
-</template>
-
-<script>
-	import colorTool from '@/utils/color'
-
-	export default {
-		data() {
-			return {
-				colorList: ['#409EFF', '#009688', '#536dfe', '#ff5c93', '#c62f2f', '#fd726d'],
-				config: {
-					lang: this.$TOOL.data.get('APP_LANG') || this.$CONFIG.LANG,
-					dark: this.$TOOL.data.get('APP_DARK') || false,
-					colorPrimary: this.$TOOL.data.get('APP_COLOR') || this.$CONFIG.COLOR || '#409EFF',
-					autoExit: this.$TOOL.data.get('AUTO_EXIT') || 0,
-				}
-			}
-		},
-		watch:{
-			'config.dark'(val){
-				if(val){
-					document.documentElement.classList.add("dark")
-					this.$TOOL.data.set("APP_DARK", val)
-				}else{
-					document.documentElement.classList.remove("dark")
-					this.$TOOL.data.remove("APP_DARK")
-				}
-			},
-			'config.lang'(val){
-				this.$i18n.locale = val
-				this.$TOOL.data.set("APP_LANG", val);
-			},
-			'config.colorPrimary'(val){
-				if(!val){
-					val = '#409EFF'
-					this.config.colorPrimary = '#409EFF'
-				}
-				document.documentElement.style.setProperty('--el-color-primary', val);
-				for (let i = 1; i <= 9; i++) {
-					document.documentElement.style.setProperty(`--el-color-primary-light-${i}`, colorTool.lighten(val,i/10));
-				}
-				for (let i = 1; i <= 9; i++) {
-					document.documentElement.style.setProperty(`--el-color-primary-dark-${i}`, colorTool.darken(val,i/10));
-				}
-				this.$TOOL.data.set("APP_COLOR", val);
-			},
-			'config.autoExit'(val){
-				if(val == 0){
-					this.$TOOL.data.remove("AUTO_EXIT")
-				}else{
-					this.$TOOL.data.set("AUTO_EXIT", val)
-				}
-			},
-		},
-	}
-</script>
-
-<style>
-</style>

+ 0 - 55
src/views/userCenter/user/space.vue

@@ -1,55 +0,0 @@
-<template>
-	<el-card shadow="never" header="当前已用量">
-		<el-progress :text-inside="true" :stroke-width="20" :color="color" :percentage="value" :format="format"/>
-		<el-row :gutter="15" style="margin-top: 20px;">
-			<el-col :lg="6">
-				<el-card shadow="never">
-					<sc-statistic title="文档" value="7.41" suffix="GB" groupSeparator></sc-statistic>
-				</el-card>
-			</el-col>
-			<el-col :lg="6">
-				<el-card shadow="never">
-					<sc-statistic title="图片" value="12.90" suffix="GB" groupSeparator></sc-statistic>
-				</el-card>
-			</el-col>
-			<el-col :lg="6">
-				<el-card shadow="never">
-					<sc-statistic title="视音频" value="68.79" suffix="MB" groupSeparator></sc-statistic>
-				</el-card>
-			</el-col>
-			<el-col :lg="6">
-				<el-card shadow="never">
-					<sc-statistic title="其他" value="17.58" suffix="GB" groupSeparator></sc-statistic>
-				</el-card>
-			</el-col>
-		</el-row>
-	</el-card>
-</template>
-
-<script>
-	import scStatistic from '@/components/scStatistic';
-
-	export default {
-		components: {
-			scStatistic
-		},
-		data() {
-			return {
-				value: 39.58,
-				color: [
-					{ color: '#67C23A', percentage: 40 },
-					{ color: '#E6A23C', percentage: 60 },
-					{ color: '#F56C6C', percentage: 80 },
-				]
-			}
-		},
-		methods: {
-			format(percentage){
-				return percentage + "G"
-			}
-		}
-	}
-</script>
-
-<style>
-</style>

+ 0 - 18
src/views/userCenter/user/upToEnterprise.vue

@@ -1,18 +0,0 @@
-<template>
-	<el-empty image="img/404.png" :image-size="280" description="当前账号未满足开通企业账号权限">
-		<el-button type="primary" size="large" round disabled>立即升级为企业账号</el-button>
-	</el-empty>
-</template>
-
-<script>
-	export default {
-		data() {
-			return {
-
-			}
-		}
-	}
-</script>
-
-<style>
-</style>

+ 0 - 232
src/views/vab/chart.vue

@@ -1,232 +0,0 @@
-<template>
-	<el-main>
-		<el-alert title="感谢百度Echarts组件, SCUI经过封装后在VUE里使用更方便而且暴露Echarts所有方法,具体请查看本文件" type="success" style="margin-bottom:20px;"></el-alert>
-		<el-row :gutter="15">
-			<el-col :lg="8">
-				<el-card shadow="never">
-					<scEcharts height="300px" :option="option"></scEcharts>
-				</el-card>
-			</el-col>
-			<el-col :lg="8">
-				<el-card shadow="never">
-					<scEcharts height="300px" :option="option2"></scEcharts>
-				</el-card>
-			</el-col>
-			<el-col :lg="8">
-				<el-card shadow="never">
-					<scEcharts height="300px" :option="option3"></scEcharts>
-				</el-card>
-			</el-col>
-			<el-col :lg="8">
-				<el-card shadow="never">
-					<scEcharts height="300px" :option="option4"></scEcharts>
-				</el-card>
-			</el-col>
-			<el-col :lg="8">
-				<el-card shadow="never">
-					<scEcharts height="300px" :option="option5"></scEcharts>
-				</el-card>
-			</el-col>
-			<el-col :lg="8">
-				<el-card shadow="never">
-					<scEcharts height="300px" :option="option6"></scEcharts>
-				</el-card>
-			</el-col>
-		</el-row>
-	</el-main>
-</template>
-
-<script>
-	import scEcharts from '@/components/scEcharts';
-
-	/**
-	 * 引入组件 @/components/scEcharts
-	 * 组件内部会自动加载主题 @/components/scEcharts/echarts-theme-T.js
-	 * 支持props包括 height,width,option
-	 * 组件export百度Echarts所有方法,使用方式: new scEcharts[fun]
-	 */
-
-	export default {
-		name: 'chart',
-		components: {
-			scEcharts
-		},
-		data() {
-			return {
-				option: {
-					title: {
-						text: 'Bar Demo',
-						subtext: '基础柱状图',
-					},
-					grid: {
-						top: '80px'
-					},
-					tooltip: {
-						trigger: 'axis'
-					},
-					xAxis: {
-						type: 'category',
-						data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
-					},
-					yAxis: {
-						type: 'value'
-					},
-					series: [{
-						data: [120, 200, 150, 80, 70, 110, 130],
-						type: 'bar',
-						barWidth: '15px',
-					},
-					{
-						data: [110, 180, 120, 120, 60, 90, 110],
-						type: 'bar',
-						barWidth: '15px',
-					}]
-				},
-				option2: {
-					title: {
-						text: 'Line Demo',
-						subtext: '基础折线图',
-					},
-					grid: {
-						top: '80px'
-					},
-					tooltip: {
-						trigger: 'axis'
-					},
-					xAxis: {
-						type: 'category',
-						data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
-					},
-					yAxis: {
-						type: 'value'
-					},
-					series: [{
-						data: [120, 200, 150, 80, 70, 110, 130],
-						type: 'line',
-					},
-					{
-						data: [110, 180, 120, 120, 60, 90, 110],
-						type: 'line',
-					}]
-				},
-				option3: {
-					title: {
-						text: 'Pie Demo',
-						subtext: '基础饼图',
-					},
-					tooltip: {
-						trigger: 'item'
-					},
-					series: [
-						{
-							name: '访问来源',
-							type: 'pie',
-							radius: ['40%', '70%'],
-							center: ['50%', '60%'],
-							label: false,
-							data: [
-								{value: 1048, name: '搜索引擎'},
-								{value: 735, name: '直接访问'},
-								{value: 580, name: '邮件营销'},
-								{value: 484, name: '联盟广告'},
-								{value: 300, name: '视频广告'}
-							]
-						}
-					]
-				},
-				option4: {
-					title: {
-						text: 'Radar Demo',
-						subtext: '基础雷达(属性)图',
-					},
-					tooltip: {
-						trigger: 'item'
-					},
-					radar: {
-						radius: 100,
-						center: ['50%', '55%'],
-						indicator: [
-							{ name: '销售', max: 100},
-							{ name: '管理', max: 100},
-							{ name: '信息技术', max: 100},
-							{ name: '客服', max: 100},
-							{ name: '研发', max: 100},
-							{ name: '市场', max: 100}
-						]
-					},
-					series: [{
-						name: "SCUI",
-						type: 'radar',
-						areaStyle: {},
-						data: [
-							{
-								value: [74, 90, 95, 65, 80, 31],
-							}
-						]
-					}]
-				},
-				option5: {
-					title: {
-						text: 'Kline Demo',
-						subtext: '基础K线图',
-					},
-					grid: {
-						top: '80px'
-					},
-					tooltip: {
-						trigger: 'axis',
-						axisPointer: {
-							type: 'cross'
-						}
-					},
-					xAxis: {
-						data: ['2017-10-23', '2017-10-24', '2017-10-25', '2017-10-26', '2017-10-27', '2017-10-28', '2017-10-29', '2017-10-30'],
-					},
-					yAxis: {
-						scale: true,
-					},
-					series: [{
-						type: 'k',
-						data: [
-							[2213.19,2199.31,2191.85,2224.63],
-							[2203.89,2177.91,2173.86,2210.58],
-							[2170.78,2174.12,2161.14,2179.65],
-							[2179.05,2205.5,2179.05,2222.81],
-							[2212.5,2231.17,2212.5,2236.07],
-							[2227.86,2235.57,2219.44,2240.26],
-							[2242.39,2246.3,2235.42,2255.21],
-							[2246.96,2232.97,2221.38,2247.86]
-						]
-					}]
-				},
-				option6: {
-					title: {
-						text: 'Gauge Demo',
-						subtext: '基础仪表盘',
-					},
-					series: [{
-						center: ['50%', '60%'],
-						type: 'gauge',
-						anchor: {
-							show: true,
-							showAbove: true,
-							size: 20,
-							itemStyle: {
-								borderWidth: 5
-							}
-						},
-						progress: {
-							show: true
-						},
-						data: [{
-							value: 70
-						}]
-					}]
-				}
-			}
-		}
-	}
-</script>
-
-<style>
-</style>

+ 0 - 88
src/views/vab/codeeditor.vue

@@ -1,88 +0,0 @@
-<template>
-	<el-main>
-		<el-alert title="感谢codeMirror组件" type="success" style="margin-bottom:20px;"></el-alert>
-		<el-row :gutter="15">
-			<el-col :lg="24">
-				<el-card shadow="never" header="JSON">
-					<sc-code-editor ref="editor" v-model="json" mode="javascript" :height="200"></sc-code-editor>
-					<div style="margin-top: 15px;">
-						<el-button type="primary" @click="getCode">获取v-model</el-button>
-						<el-button type="primary" @click="getValue">getValue()</el-button>
-						<el-button type="primary" @click="setValue">setValue()</el-button>
-					</div>
-				</el-card>
-			</el-col>
-			<el-col :lg="12">
-				<el-card shadow="never" header="javascript Darcula主题">
-					<sc-code-editor v-model="js" mode="javascript" theme="darcula"></sc-code-editor>
-				</el-card>
-			</el-col>
-
-			<el-col :lg="12">
-				<el-card shadow="never" header="SQL">
-					<sc-code-editor v-model="sql" mode="sql"></sc-code-editor>
-				</el-card>
-			</el-col>
-		</el-row>
-	</el-main>
-</template>
-
-<script>
-	import { defineAsyncComponent } from 'vue';
-	const scCodeEditor = defineAsyncComponent(() => import('@/components/scCodeEditor'));
-
-	export default {
-		name: "codeeditor",
-		components: {
-			scCodeEditor
-		},
-		data(){
-			return {
-				json:
-`{
-	"name": "SCUI",
-	"menu": [
-		{
-			"title": "VUE 3",
-			"type": true,
-			"link": "https://v3.cn.vuejs.org"
-		},
-		{
-			"title": "elementplus",
-			"type": false,
-			"link": "https://element-plus.gitee.io"
-		}
-	]
-}`,
-				js:
-`// Demo code (the actual new parser character stream implementation)
-function StringStream(string) {
-	this.pos = 0;
-	this.string = string;
-}`,
-				sql:
-`SELECT \`author\`, \`title\` FROM \`posts\`
-WHERE \`status\` = 'draft' AND \`author\` IN('author1','author2')
-ORDER BY \`created_at\` DESC, \`id\` DESC LIMIT 0, 10;`
-			}
-		},
-		methods: {
-			getCode(){
-				this.$message("请查看控制台")
-				console.log(this.json)
-			},
-			getValue(){
-				this.$message("请查看控制台")
-				var v = this.$refs.editor.coder.getValue()
-				console.log(v)
-			},
-			setValue(){
-				var v = `{"key":"newValue"}`
-				this.$refs.editor.coder.setValue(v)
-			}
-		}
-	}
-</script>
-
-<style>
-</style>

+ 0 - 120
src/views/vab/contextmenu.vue

@@ -1,120 +0,0 @@
-<!--
- * @Descripttion: 右键简单组件演示文件
- * @version: 1.0
- * @Author: sakuya
- * @Date: 2021年7月22日16:31:14
- * @LastEditors:
- * @LastEditTime:
--->
-
-<template>
-	<el-main>
-		<el-row :gutter="15">
-			<el-col :lg="12">
-				<el-card shadow="never">
-					<el-alert title="试试右键表格行看看. 支持多级菜单, 动态菜单等等等..." type="success" style="margin-bottom:20px;"></el-alert>
-					<el-table ref="table" :data="tableData" highlight-current-row @row-contextmenu="rowContextmenu">
-						<el-table-column type="expand">
-							<template #default="props">
-								<el-empty :description="props.row.id + ' 自定义扩展行'" :image-size="60"></el-empty>
-							</template>
-						</el-table-column>
-						<el-table-column prop="id" label="ID" width="50"></el-table-column>
-						<el-table-column prop="name" label="NAME" width="220"></el-table-column>
-						<el-table-column prop="date" label="DATE"></el-table-column>
-						<el-table-column prop="state" label="STATE"></el-table-column>
-					</el-table>
-				</el-card>
-			</el-col>
-			<el-col :lg="12">
-				<el-card shadow="never" @contextmenu.prevent="openMenu">
-					<div style="height:500px;display: flex;flex-direction: column;align-items: center;justify-content: center;color: #999;">
-						试试看在上下左右四个角落右键,看看边缘位置修正效果
-					</div>
-				</el-card>
-			</el-col>
-		</el-row>
-	</el-main>
-
-	<sc-contextmenu ref="contextmenu" @command="handleCommand" @visible-change="visibleChange">
-		<sc-contextmenu-item command="a" title="返回(B)" suffix="Alt+←"></sc-contextmenu-item>
-		<sc-contextmenu-item command="b" title="重新加载(R)" suffix="Ctrl+R" icon="el-icon-refresh"></sc-contextmenu-item>
-		<sc-contextmenu-item title="切换兼容性模式" divided>
-			<sc-contextmenu-item command="c1" title="二级菜单1"></sc-contextmenu-item>
-			<sc-contextmenu-item title="二级菜单2">
-				<sc-contextmenu-item command="c2-1" title="三级菜单1"></sc-contextmenu-item>
-				<sc-contextmenu-item command="c2-2" title="三级菜单2"></sc-contextmenu-item>
-				<sc-contextmenu-item command="c2-3" title="三级菜单3"></sc-contextmenu-item>
-			</sc-contextmenu-item>
-			<sc-contextmenu-item command="c3" title="二级菜单3"></sc-contextmenu-item>
-		</sc-contextmenu-item>
-		<sc-contextmenu-item  command="d" title="属性(P)" divided :disabled="row&&row.state==0"></sc-contextmenu-item>
-		<sc-contextmenu-item  command="e" title="设置state=1" v-if="row&&row.state==0"></sc-contextmenu-item>
-	</sc-contextmenu>
-
-</template>
-
-<script>
-	import scContextmenu from '@/components/scContextmenu'
-	import scContextmenuItem from '@/components/scContextmenu/item'
-	export default {
-		name: 'contextmenu',
-		components: {
-			scContextmenu,
-			scContextmenuItem
-		},
-		data() {
-			return {
-				row: null,
-				tableData: [
-					{
-						id: '1',
-						name: 'Sakuya',
-						date: '2021-10-10',
-						state: 1
-					},
-					{
-						id: '2',
-						name: 'Lolowan(此行右键属性禁用)',
-						date: '2021-10-09',
-						state: 0
-					},
-					{
-						id: '3',
-						name: 'Ali',
-						date: '2021-10-08',
-						state: 1
-					}
-				]
-			}
-		},
-		mounted() {
-
-		},
-		methods: {
-			rowContextmenu(row, column, event){
-				this.row = row
-				this.$refs.table.setCurrentRow(row);
-				this.$refs.contextmenu.openMenu(event)
-			},
-			openMenu(e){
-				this.row = null
-				this.$refs.contextmenu.openMenu(e)
-			},
-			handleCommand(command){
-				this.$message('click on item ' + command)
-				if(command == 'e'){
-					this.row.state = 1
-				}
-			},
-			visibleChange(visible){
-				if(!visible){
-					this.$refs.table.setCurrentRow();
-				}
-			}
-		}
-	}
-</script>
-
-<style scoped>
-</style>

+ 0 - 46
src/views/vab/cron.vue

@@ -1,46 +0,0 @@
-<template>
-	<el-main>
-		<el-alert title="SCUI独创, 区别于市面上的规则生成器, 对不是很理解Cron的操作员也可以选择设置的快捷录入" type="success" style="margin-bottom:20px;"></el-alert>
-		<el-row :gutter="15">
-			<el-col :lg="12">
-				<el-card shadow="never" header="默认">
-					<sc-cron v-model="v1" placeholder="请输入Cron定时规则" clearable></sc-cron>
-				</el-card>
-			</el-col>
-			<el-col :lg="12">
-				<el-card shadow="never" header="快捷扩展">
-					<sc-cron v-model="v2" placeholder="请输入Cron定时规则" clearable :shortcuts="shortcuts"></sc-cron>
-				</el-card>
-			</el-col>
-		</el-row>
-	</el-main>
-</template>
-
-<script>
-	import scCron from '@/components/scCron'
-
-	export default {
-		name: 'cron',
-		components: {
-			scCron
-		},
-		data() {
-			return {
-				v1: "",
-				v2: "",
-				shortcuts: [
-					{
-						text: "每天8点和12点 (自定义追加)",
-						value: "0 0 8,12 * * ?"
-					}
-				]
-			}
-		},
-		mounted() {
-
-		},
-		methods: {
-
-		}
-	}
-</script>

+ 0 - 98
src/views/vab/cropper.vue

@@ -1,98 +0,0 @@
-<!--
- * @Descripttion: 图像剪裁组件演示文件
- * @version: 1.0
- * @Author: sakuya
- * @Date: 2021年7月24日20:58:51
- * @LastEditors:
- * @LastEditTime:
--->
-
-<template>
-	<el-main>
-		<el-row :gutter="15">
-			<el-col :lg="14">
-				<el-card shadow="never">
-					<sc-cropper :src="cropperImg" :compress="compress" :aspectRatio="aspectRatio" ref="cropper"></sc-cropper>
-				</el-card>
-				<el-card shadow="never" header="参数和方法">
-					<el-form label-width="100px">
-						<el-form-item label="aspectRatio">
-						    <el-select v-model="aspectRatio" placeholder="请选择">
-								<el-option label="自由" :value="0"></el-option>
-								<el-option label="1:1" :value="1/1"></el-option>
-								<el-option label="4:3" :value="4/3"></el-option>
-								<el-option label="16:9" :value="16/9"></el-option>
-							</el-select>
-							<div class="el-form-item-msg">固定选区或者不固定</div>
-						</el-form-item>
-						<el-form-item label="compress">
-						    <el-select v-model="compress" placeholder="请选择">
-								<el-option label="0.1" :value="0.1"></el-option>
-								<el-option label="0.5" :value="0.5"></el-option>
-								<el-option label="1" :value="1"></el-option>
-							</el-select>
-							<div class="el-form-item-msg">图像压缩率,值为:0.1-1</div>
-						</el-form-item>
-					</el-form>
-					<el-button type="primary" plain @click="getBase64">Base64</el-button>
-					<el-button type="primary" plain @click="getBlob">Blob</el-button>
-					<el-button type="primary" plain @click="getFile">File</el-button>
-				</el-card>
-				<el-card shadow="never" header="方法结果">
-					<img :src="imgData" />
-				</el-card>
-			</el-col>
-			<el-col :lg="10">
-				<el-card shadow="never" header="已内置剪裁的上传组件">
-					<el-alert title="设置cropper就可以开启上传前剪裁, 并已封装compress和aspectRatio, 打开F12查看网络请求" type="success" style="margin-bottom:20px;"></el-alert>
-					<sc-upload v-model="uploadImg" title="开启剪裁" :cropper="true" :compress="1" :aspectRatio="1/1"></sc-upload>
-				</el-card>
-			</el-col>
-		</el-row>
-	</el-main>
-
-
-</template>
-
-<script>
-	import scCropper from '@/components/scCropper'
-
-	export default {
-		name: 'cropper',
-		components: {
-			scCropper
-		},
-		data() {
-			return {
-				cropperImg: 'img/avatar.jpg',
-				compress: 0.5,
-				aspectRatio: 0,
-				uploadImg: '',
-				imgData: ''
-			}
-		},
-		methods: {
-			getBase64(){
-				this.$refs.cropper.getCropData(data=>{
-					this.imgData = data
-				})
-			},
-			getBlob(){
-				this.$refs.cropper.getCropBlob(blob=>{
-					this.imgData = URL.createObjectURL(blob)
-				})
-			},
-			getFile(){
-				this.$refs.cropper.getCropFile(file=>{
-					let aTag = document.createElement('a')
-					aTag.download = file.name;
-					aTag.href = URL.createObjectURL(file)
-					aTag.click()
-				}, 'fileName.jpg', 'image/jpeg')
-			}
-		}
-	}
-</script>
-
-<style>
-</style>

+ 0 - 28
src/views/vab/dialog/dialog1.vue

@@ -1,28 +0,0 @@
-<template>
-	<sc-dialog v-model="visible" title="提示" @closed="$emit('closed')">
-		内容1
-		<template #footer>
-			<el-button @click="visible = false">取 消</el-button>
-			<el-button type="primary" @click="visible = false">确 定</el-button>
-		</template>
-	</sc-dialog>
-</template>
-
-<script>
-	export default {
-		data() {
-			return {
-				visible: true
-			}
-		},
-		mounted() {
-			console.log("加载./dialog1组件完成")
-		},
-		methods: {
-
-		}
-	}
-</script>
-
-<style>
-</style>

+ 0 - 28
src/views/vab/dialog/dialog2.vue

@@ -1,28 +0,0 @@
-<template>
-	<sc-dialog v-model="visible" title="提示" @closed="$emit('closed')">
-		内容2
-		<template #footer>
-			<el-button @click="visible = false">取 消</el-button>
-			<el-button type="primary" @click="visible = false">确 定</el-button>
-		</template>
-	</sc-dialog>
-</template>
-
-<script>
-	export default {
-		data() {
-			return {
-				visible: true
-			}
-		},
-		mounted() {
-			console.log("加载./dialog2组件完成")
-		},
-		methods: {
-
-		}
-	}
-</script>
-
-<style>
-</style>

+ 0 - 101
src/views/vab/dialog/index.vue

@@ -1,101 +0,0 @@
-<!--
- * @Descripttion: scDialog 弹窗扩展演示文件
- * @version: 1.0
- * @Author: sakuya
- * @Date: 2021年8月27日08:56:30
- * @LastEditors:
- * @LastEditTime:
--->
-
-<template>
-	<el-main>
-		<el-alert title="二次封装el-dialog,加入加载中/最大化." type="success" style="margin:0 0 20px 0;"></el-alert>
-		<el-card shadow="never" header="内置">
-			<el-button type="primary" @click="open1">默认</el-button>
-			<el-button type="primary" @click="open2">加载</el-button>
-			<el-button type="primary" @click="open3">禁止拖拽最大化和关闭</el-button>
-		</el-card>
-		<el-card shadow="never" header="异步" style="margin-top: 15px;">
-			<el-button type="primary" @click="asyn1">异步加载1</el-button>
-			<el-button type="primary" @click="asyn2">异步加载2</el-button>
-			<el-alert title="适用于页面有很多弹窗操作,利用异步组件按需加载,加快首屏的加载速度和打包体积" style="margin-top: 20px;"></el-alert>
-		</el-card>
-	</el-main>
-
-	<sc-dialog v-model="dialog1" draggable title="提示">
-		内容
-		<template #footer>
-			<el-button @click="dialog1 = false">取 消</el-button>
-			<el-button type="primary" @click="dialog1 = false">确 定</el-button>
-		</template>
-	</sc-dialog>
-
-	<sc-dialog v-model="dialog2" draggable title="模拟加载" :width="400" :loading="dialog2Loading">
-		<el-empty description="NO Data" :image-size="80"></el-empty>
-		<template #footer>
-			<el-button @click="dialog2 = false">取 消</el-button>
-			<el-button type="primary" @click="dialog2 = false" :loading="dialog2Loading">确 定</el-button>
-		</template>
-	</sc-dialog>
-
-	<sc-dialog v-model="dialog3" title="禁用拖拽" :show-fullscreen="false" :show-close="false">
-		内容
-		<template #footer>
-			<el-button @click="dialog3 = false">取 消</el-button>
-			<el-button type="primary" @click="dialog3 = false">确 定</el-button>
-		</template>
-	</sc-dialog>
-
-	<dialog1 v-if="asynDialog1" draggable @closed="asynDialog1 = false"></dialog1>
-	<dialog2 v-if="asynDialog2" draggable @closed="asynDialog2 = false"></dialog2>
-
-</template>
-
-<script>
-	import { defineAsyncComponent } from 'vue'
-
-	export default {
-		name: 'dialogExtend',
-		components: {
-			dialog1: defineAsyncComponent(() => import("./dialog1")),
-			dialog2: defineAsyncComponent(() => import("./dialog2"))
-		},
-		data() {
-			return {
-				dialog1: false,
-				dialog2: false,
-				dialog3: false,
-				dialog2Loading: false,
-				asynDialog1: false,
-				asynDialog2: false,
-			}
-		},
-		mounted() {
-
-		},
-		methods: {
-			open1(){
-				this.dialog1 = true
-			},
-			open2(){
-				this.dialog2 = true
-				this.dialog2Loading = true
-				setTimeout(()=>{
-					this.dialog2Loading = false
-				}, 1000)
-			},
-			open3(){
-				this.dialog3 = true
-			},
-			asyn1(){
-				this.asynDialog1 = true
-			},
-			asyn2(){
-				this.asynDialog2 = true
-			}
-		}
-	}
-</script>
-
-<style>
-</style>

+ 0 - 117
src/views/vab/drag.vue

@@ -1,117 +0,0 @@
-<template>
-	<el-main>
-		<el-alert title="感谢Vue3.0版本的vue.draggable.next拖拽组件 https://github.com/SortableJS/vue.draggable.next" type="success" style="margin-bottom:20px;"></el-alert>
-		<div class="dragList">
-			<draggable v-model="listA" animation="200" item-key="id" group="people">
-				<template #item="{ element }">
-					<div class="item">{{element.text}}</div>
-				</template>
-			</draggable>
-		</div>
-		<div class="dragList">
-			<draggable v-model="listB" animation="200" item-key="id" group="people">
-				<template #item="{ element }">
-					<div class="item">{{element.text}}</div>
-				</template>
-			</draggable>
-		</div>
-	</el-main>
-</template>
-
-<script>
-	import draggable from 'vuedraggable'
-	export default {
-		name: 'drag',
-		components: {
-			draggable
-		},
-		data() {
-			return {
-				listA: [
-					{
-						id: 1,
-						text: 'A1'
-					},
-					{
-						id: 2,
-						text: 'A2'
-					},
-					{
-						id: 3,
-						text: 'A3'
-					},
-					{
-						id: 4,
-						text: 'A4'
-					},
-					{
-						id: 5,
-						text: 'A5'
-					},
-					{
-						id: 6,
-						text: 'A6'
-					},
-					{
-						id: 7,
-						text: 'A7'
-					},
-					{
-						id: 8,
-						text: 'A8'
-					},
-					{
-						id: 9,
-						text: 'A9'
-					}
-				],
-				listB: [
-					{
-						id: 1,
-						text: 'B1'
-					},
-					{
-						id: 2,
-						text: 'B2'
-					},
-					{
-						id: 3,
-						text: 'B3'
-					},
-					{
-						id: 4,
-						text: 'B4'
-					},
-					{
-						id: 5,
-						text: 'B5'
-					},
-					{
-						id: 6,
-						text: 'B6'
-					},
-					{
-						id: 7,
-						text: 'B7'
-					},
-					{
-						id: 8,
-						text: 'B8'
-					},
-					{
-						id: 9,
-						text: 'B9'
-					}
-				]
-			}
-		}
-	}
-</script>
-
-<style scoped>
-	.dragList {overflow: auto;}
-	.item {cursor: move;float: left;background: #fff;width:100px;height: 100px;line-height: 100px;text-align: center;margin:0 15px 15px 0;border: 1px solid #e6e6e6;}
-	.dragList .sortable-ghost {
-		opacity: 0.5;
-	}
-</style>

+ 0 - 52
src/views/vab/editor.vue

@@ -1,52 +0,0 @@
-<template>
-	<el-main>
-		<el-card shadow="never">
-			<sc-editor v-model="html" placeholder="请输入" :templates="templates" :height="400"></sc-editor>
-		</el-card>
-		<el-card shadow="never" header="配置" style="margin-top: 20px;">
-			<el-descriptions border :column="1">
-				<el-descriptions-item label="v-model">绑定的内容</el-descriptions-item>
-				<el-descriptions-item label="placeholder">占位符</el-descriptions-item>
-				<el-descriptions-item label="height">编辑器高度,默认300</el-descriptions-item>
-				<el-descriptions-item label="disabled">禁用编辑器 Boolean</el-descriptions-item>
-				<el-descriptions-item label="templates">插入自定义模板 Array</el-descriptions-item>
-				<el-descriptions-item label="toolbar">自定义工具栏,使用"|"竖杠分割,使用"\"斜杠分组,默认:'undo redo |  forecolor backcolor bold italic underline strikethrough link | blocks fontfamily fontsize | \
-					alignleft aligncenter alignright alignjustify | outdent indent | numlist bullist | pagebreak | \
-					image media table template preview | code selectall'</el-descriptions-item>
-				<el-descriptions-item label="options">支持tinymce的其他配置项</el-descriptions-item>
-			</el-descriptions>
-		</el-card>
-	</el-main>
-</template>
-
-<script>
-	import { defineAsyncComponent } from 'vue';
-	const scEditor = defineAsyncComponent(() => import('@/components/scEditor'));
-
-	export default {
-		name: "editor",
-		components: {
-			scEditor
-		},
-		data(){
-			return {
-				html: '',
-				templates: [
-					{
-						title: '自定义HTML模板',
-						description: '',
-						content: '<strong>演示模板</strong>'
-					},
-					{
-						title: '列表',
-						description: '',
-						content: '<ol><li>演示列表1</li><li>演示列表2</li></ol>'
-					}
-				]
-			}
-		}
-	}
-</script>
-
-<style>
-</style>

+ 0 - 55
src/views/vab/fileselect.vue

@@ -1,55 +0,0 @@
-<template>
-	<el-main>
-		<el-row :gutter="15">
-			<el-col :lg="18">
-				<el-card shadow="never">
-					<el-alert title="资源库选择器即将弃用,将不会维护更新,与1.7版本之后将移除此组件" type="error" style="margin-bottom:20px;"></el-alert>
-					<sc-file-select v-model="file" :multiple="multiple" :hideUpload="hideUpload" :max="99" @submit="submit">
-						<template #do>
-							<el-button>自定义插槽</el-button>
-						</template>
-					</sc-file-select>
-				</el-card>
-			</el-col>
-			<el-col :lg="6">
-				<el-card shadow="never" header="参数和方法">
-					<el-button type="primary" @click="multiple = !multiple">切换multiple</el-button>
-					<el-button type="primary" @click="hideUpload = !hideUpload">切换hideUpload</el-button>
-				</el-card>
-			</el-col>
-		</el-row>
-	</el-main>
-</template>
-
-<script>
-	import scFileSelect from '@/components/scFileSelect'
-
-	export default {
-		name: 'fileselect',
-		components: {
-			scFileSelect
-		},
-		data() {
-			return {
-				file: '',
-				multiple: false,
-				hideUpload: false,
-				upload: '',
-				upload2: ''
-			}
-		},
-		mounted() {
-
-		},
-		methods: {
-			submit(value){
-				console.log(value)
-				this.$message("返回值请查看F12控制台console.log()")
-			}
-		}
-	}
-</script>
-
-<style scoped>
-
-</style>

+ 0 - 185
src/views/vab/filterBar.vue

@@ -1,185 +0,0 @@
-<template>
-	<el-main>
-		<el-card shadow="never" header="过滤器">
-			<scFilterBar filterName="filterName" :options="options" @filterChange="change">
-				<template #default="{filterLength, openFilter}">
-					<el-badge :value="filterLength" type="danger" :hidden="filterLength<=0">
-						<el-button icon="el-icon-filter" @click="openFilter"></el-button>
-					</el-badge>
-				</template>
-			</scFilterBar>
-		</el-card>
-		<el-alert title="SCUI 独创的过滤条Filterbar,可配置不同类型的过滤字段,以及异步获取数据,在@/config/filterBar.js中可以更改运算符以及其他配置,操作上方过滤条查看下方change事件的回调,在表格查询的场景下非常合适" type="success" style="margin:20px 0;"></el-alert>
-		<el-card shadow="never" header="返回值">
-			<pre>{{ filterData }}</pre>
-		</el-card>
-	</el-main>
-</template>
-
-<script>
-	import scFilterBar from '@/components/scFilterBar';
-
-	export default {
-		name: 'filterBar',
-		components: {
-			scFilterBar
-		},
-		data() {
-			return {
-				filterData : {},
-				defaultFilter : [],
-				options: [
-					{
-						label: '订单号',
-						value: 'id',
-						type: 'text',
-						selected: true,
-						placeholder: '请输入订单号'
-					},
-					{
-						label: '类型',
-						value: 'type',
-						type: 'select',
-						operator: '=',
-						selected: true,
-						placeholder: '请选择类型',
-						extend: {
-							data:[
-								{
-									label: "选项1",
-									value: "1"
-								},
-								{
-									label: "选项2",
-									value: "2"
-								}
-							]
-						}
-					},
-					{
-						label: '类型(多选)',
-						value: 'type2',
-						type: 'select',
-						operator: '=',
-						placeholder: '请选择类型',
-						extend: {
-							multiple: true,
-							data:[
-								{
-									label: "选项1",
-									value: "1"
-								},
-								{
-									label: "选项2",
-									value: "2"
-								}
-							]
-						}
-					},
-					{
-						label: '通知(异步)',
-						value: 'noticeType',
-						type: 'select',
-						operator: '=',
-						placeholder: '请选择通知类型',
-						extend: {
-							request: async () => {
-								var list = await this.$API.system.dic.get.get()
-								return list.data.map(item => {
-									return {
-										label: item.label,
-										value: item.value
-									}
-								})
-							}
-						}
-					},
-					{
-						label: '通知(远程搜索)',
-						value: 'noticeType2',
-						type: 'select',
-						operator: '=',
-						placeholder: '请输入关键词后检索',
-						extend: {
-							remote: true,
-							request: async (query) => {
-								var data = {
-									keyword: query,
-								}
-								var list = await this.$API.system.dic.get.get(data)
-								return list.data.map(item => {
-									return {
-										label: item.label,
-										value: item.value
-									}
-								})
-							}
-						}
-					},
-					{
-						label: '关键词(标签)',
-						value: 'tags',
-						type: 'tags',
-						operator: 'include',
-						operators: [
-							{
-								label: '包含',
-								value: 'include',
-							},
-							{
-								label: '不包含',
-								value: 'notinclude',
-							}
-						]
-					},
-					{
-						label: '开关(可重复)',
-						value: 'switch',
-						type: 'switch',
-						repeat: true,
-						operator: '='
-					},
-					{
-						label: '日期单选',
-						value: 'date',
-						type: 'date',
-						operator: '=',
-						operators: [
-							{
-								label: '等于',
-								value: '=',
-							},
-							{
-								label: '不等于',
-								value: '!=',
-							}
-						]
-					},
-					{
-						label: '日期范围',
-						value: 'date2',
-						type: 'daterange'
-					},
-					{
-						label: '自定义日期',
-						value: 'date3',
-						type: 'customDate',
-						placeholder: '请选择月份',
-						extend: {
-							dateType: 'month',
-							valueFormat: 'YYYY-MM'
-						}
-					}
-				]
-			}
-		},
-		methods: {
-			change(data){
-				this.filterData = data;
-			}
-		}
-	}
-</script>
-
-<style>
-</style>

+ 0 - 410
src/views/vab/form.vue

@@ -1,410 +0,0 @@
-<template>
-	<el-main>
-		<el-row :gutter="15">
-			<el-col :lg="6">
-				<el-card shadow="never" header="处理逻辑说明">
-					<el-timeline>
-						<el-timeline-item timestamp="两者数据并无顺序要求,只是获取表单值时需要自行设置loading">1.远程获取表单配置参数和表单的值</el-timeline-item>
-						<el-timeline-item timestamp="构建form对象, 循环渲染对应组件, 获取远程选项数据. 完成前组件将由骨架代替">2.根据配置构建表单组件</el-timeline-item>
-						<el-timeline-item timestamp="合并form对象和表单值">3.给表单赋值</el-timeline-item>
-					</el-timeline>
-					<el-alert title="当前版本为预览版本,并未在正式项目中实施,请谨慎使用. 更多配置以及图形化编辑器正在路上." type="warning" show-icon></el-alert>
-				</el-card>
-				<el-card shadow="never" header="双向绑定">
-					<el-button type="primary" @click="setName">改变输入框的值</el-button>
-					<el-button type="primary" @click="setConfig">改变指定栅格配置</el-button>
-				</el-card>
-			</el-col>
-			<el-col :lg="12">
-				<el-card shadow="never" header="动态表单渲染器">
-					<sc-form ref="formref" :config="config" v-model="form" :loading="loading">
-						<el-button type="primary" @click="save">保 存</el-button>
-						<el-button @click="reset">重 置</el-button>
-					</sc-form>
-				</el-card>
-			</el-col>
-			<el-col :lg="6">
-				<el-card shadow="never" header="表单输出">
-					<pre>{{form}}</pre>
-				</el-card>
-			</el-col>
-		</el-row>
-	</el-main>
-</template>
-
-<script>
-	export default {
-		name: 'formRender',
-		data() {
-			return {
-				loading: false,
-				config: {},
-				form: {}
-			}
-		},
-		mounted() {
-			//模拟请求延迟, 配置参数和form值并无顺序要求,可同时请求
-			const config = {
-				labelWidth: '130px',
-				labelPosition: 'right',
-				size: 'medium',
-				formItems: [
-					{
-						label: "ElementPlus",
-						component: "title",
-					},
-					{
-						label: "输入框",
-						name: "name",
-						value: "",
-						component: "input",
-						options: {
-							maxlength: "20",
-							placeholder: "Activity name",
-						},
-						rules: [
-							{required: true, message: "Please input Activity name", trigger: "blur"}
-						],
-						requiredHandle: "$.required==true",
-					},
-					{
-						label: "栅格(12/24)",
-						name: "name2",
-						value: "",
-						component: "input",
-						span: 12,
-						options: {
-							placeholder: "span: 12",
-						}
-					},
-					{
-						label: "栅格(12/24)",
-						name: "name3",
-						value: "",
-						component: "input",
-						span: 12,
-						options: {
-							placeholder: "span: 12",
-						}
-					},
-					{
-						label: "选择器(多选)",
-						name: "select",
-						value: "",
-						component: "select",
-						span: 24,
-						options: {
-							remote: {
-								api: `${this.$CONFIG.API_URL}/system/dic/get`,
-								data: {name: 'a'}
-							},
-							multiple: true,
-							items:[
-								{
-									label: "选项1",
-									value: "1"
-								},
-								{
-									label: "选项2",
-									value: "2"
-								}
-							]
-						},
-						rules: [
-							{required: true, message: "Please input Activity name", trigger: "change"}
-						],
-						requiredHandle: "$.required==true",
-					},
-					{
-						label: "选择器(单选)",
-						name: "select2",
-						value: "",
-						component: "select",
-						span: 24,
-						options: {
-							remote: {
-								api: `${this.$CONFIG.API_URL}/system/dic/get`,
-								data: {name: 'b'}
-							},
-							items:[
-								{
-									label: "选项1",
-									value: "1"
-								},
-								{
-									label: "选项2",
-									value: "2"
-								}
-							]
-						}
-					},
-					{
-						label: "级联选择器",
-						name: "cascader",
-						value: "",
-						component: "cascader",
-						span: 24,
-						options: {
-							items:[
-								{
-									label: "Guide",
-									value: "guide",
-									children: [
-										{
-											label: "Disciplines",
-											value: "disciplines"
-										},
-										{
-											label: "Consistency",
-											value: "consistency"
-										},
-									]
-								},
-								{
-									label: "Resource",
-									value: "resource",
-									children: [
-										{
-											label: "Axure Components",
-											value: "axure"
-										},
-										{
-											label: "Sketch Templates",
-											value: "sketch"
-										},
-										{
-											label: "Design Documentation",
-											value: "docs"
-										}
-									]
-								},
-								{
-									label: "Component",
-									value: "component"
-								},
-							]
-						}
-					},
-					{
-						label: "多选框",
-						name: "checkbox",
-						component: "checkbox",
-						span: 24,
-						tips: "多选框配置加上 name 表示拥有嵌套关系。否则将值“平铺”在form对象",
-						options: {
-							items:[
-								{
-									label: "选项1",
-									name: "option1",
-									value: false
-								},
-								{
-									label: "选项2",
-									name: "option2",
-									value: false
-								}
-							]
-						},
-						hideHandle: "$.required==true"
-					},
-					{
-						label: "多选框组",
-						name: "checkboxGroup",
-						value: [],
-						component: "checkboxGroup",
-						span: 24,
-						options: {
-							items:[
-								{
-									label: "选项1",
-									value: "option1"
-								},
-								{
-									label: "选项2",
-									value: "option2"
-								}
-							]
-						},
-						hideHandle: "$.required==true"
-					},
-					{
-						label: "单选",
-						name: "radio",
-						value: "1",
-						component: "radio",
-						options: {
-							items:[
-								{
-									label: "选项1",
-									value: "1"
-								},
-								{
-									label: "选项2",
-									value: "2"
-								}
-							]
-						},
-						hideHandle: "$.required==true"
-					},
-					{
-						label: "开关",
-						name: "required",
-						message: "演示如何使用表达式动态显隐和必填,试试打开和关闭开关",
-						value: false,
-						component: "switch",
-					},
-					{
-						label: "日期/时间",
-						name: "date",
-						value: "",
-						component: "date",
-						options: {
-							type: "datetime",
-							valueFormat: "YYYY-MM-DD HH:mm:ss",
-						},
-						rules: [
-							{required: true, message: "Please input Data", trigger: "change"}
-						],
-					},
-					{
-						label: "滑块",
-						name: "slider",
-						value: 0,
-						component: "slider",
-						options: {
-							marks: {
-								0: '0°C',
-								8: '8°C',
-								37: '37°C'
-							}
-						}
-					},
-					{
-						label: "数值",
-						name: "number",
-						value: 0,
-						component: "number",
-					},
-					{
-						label: "颜色",
-						name: "color",
-						value: "",
-						component: "color",
-					},
-					{
-						label: "评分",
-						name: "rate",
-						value: 0,
-						component: "rate",
-					},
-					{
-						label: "SCUI扩展",
-						component: "title",
-					},
-					{
-						label: "表格选择器",
-						name: "tableselect",
-						value: {},
-						component: "tableselect",
-						span: 24,
-						options: {
-							apiObj: '$API.demo.page',
-							column: [
-								{
-									label: "ID",
-									prop: "id",
-									width:150
-								},
-								{
-									label: "姓名",
-									prop: "user"
-								}
-							],
-							props: {
-								label: 'user',
-								value: 'id',
-								keyword: "keyword"
-							}
-						}
-					},
-					{
-						label: "上传",
-						component: "upload",
-						options: {
-							items:[
-								{
-									label: "图像1",
-									name: "img1",
-									value: ""
-								},
-								{
-									label: "图像2",
-									name: "img2",
-									value: ""
-								}
-							]
-						}
-					},
-					{
-						label: "富文本",
-						name: "text",
-						value: "",
-						component: "editor",
-					},
-				]
-			}
-
-			const form = {
-				name: "Activity name",
-				checkbox: {
-					option1: true
-				},
-				checkboxGroup: ["option1"],
-				select: ["1"],
-				select2: "1",
-				cascader: ['resource','docs'],
-				tableselect: {
-					user: "何敏",
-					id: "360000197302144442"
-				},
-				text: "<p><span style=\"font-size: 28px;\">Editor</span></p>\n<table style=\"border-collapse: collapse; width: 100%;\" border=\"1\">\n<tbody>\n<tr>\n<td style=\"width: 47.4544%; background-color: #ecf0f1;\">Name</td>\n<td style=\"width: 47.4544%;\">SCUI</td>\n</tr>\n<tr>\n<td style=\"width: 47.4544%; background-color: #ecf0f1;\">Describe</td>\n<td style=\"width: 47.4544%;\">Super color UI Admin</td>\n</tr>\n</tbody>\n</table>"
-			}
-
-			setTimeout(()=>{
-				this.config = config
-			},500)
-
-			this.loading = true
-			setTimeout(()=>{
-				this.form = form
-				this.loading = false
-			},100)
-		},
-		methods: {
-			setName(){
-				this.form.name = "New Title"
-			},
-			setConfig(){
-				this.config.formItems[2].span = this.config.formItems[2].span==24?12:24
-				this.config.formItems[3].span = this.config.formItems[3].span==24?12:24
-			},
-			save(){
-				this.$refs.formref.validate((valid, obj) => {
-					if (valid) {
-						console.log(this.form)
-						alert('submit!')
-					}else{
-						this.$refs.formref.scrollToField(Object.keys(obj)[0])
-						return false
-					}
-				})
-			},
-			reset(){
-				this.$refs.formref.resetFields()
-			}
-		}
-	}
-</script>
-
-<style>
-</style>

+ 0 - 131
src/views/vab/formtable.vue

@@ -1,131 +0,0 @@
-<template>
-	<el-main>
-		<el-alert title="来自AVUE的灵感, 业务会有表单里含有对象数组的可能, 进行封装后进行增删改操作, 并且支持联动form表单的禁用属性" type="success" style="margin-bottom:20px;"></el-alert>
-
-		<el-card shadow="never">
-			<el-form ref="ruleForm" :model="form" :rules="rules" label-width="100px">
-				<el-form-item label="标题" prop="title">
-					<el-input v-model="form.title"></el-input>
-				</el-form-item>
-				<el-form-item label="表格" prop="list">
-					<sc-form-table ref="table" v-model="form.list" :addTemplate="addTemplate" drag-sort placeholder="暂无数据">
-						<el-table-column prop="time" label="时间" width="180">
-							<template #default="scope">
-								<el-time-select v-model="scope.row.time"></el-time-select>
-							</template>
-						</el-table-column>
-						<el-table-column prop="type" label="类型" width="180">
-							<template #default="scope">
-								<el-select v-model="scope.row.type" placeholder="请选择">
-									<el-option v-for="item in typeDic" :key="item.value" :label="item.label" :value="item.value"></el-option>
-								</el-select>
-							</template>
-						</el-table-column>
-						<el-table-column prop="val" label="数量" min-width="180">
-							<template #default="scope">
-								<el-input v-model="scope.row.val" placeholder="请输入内容"></el-input>
-							</template>
-						</el-table-column>
-						<el-table-column prop="open" label="checked" width="85" align="center">
-							<template #default="scope">
-								<el-checkbox v-model="scope.row.checked"></el-checkbox>
-							</template>
-						</el-table-column>
-						<el-table-column prop="open" label="开关" width="80" align="center">
-							<template #default="scope">
-								<el-switch v-model="scope.row.open"></el-switch>
-							</template>
-						</el-table-column>
-					</sc-form-table>
-				</el-form-item>
-				<el-form-item>
-					<el-button type="primary" @click="submitForm">保存</el-button>
-				    <el-button @click="resetForm">重置</el-button>
-				</el-form-item>
-			</el-form>
-		</el-card>
-		<el-card shadow="never" header="方法" style="margin-top: 15px;">
-			<el-button type="primary" @click="pushRow">外部插入行</el-button>
-			<el-button type="primary" @click="deleteRow">外部删除第一行</el-button>
-		</el-card>
-	</el-main>
-</template>
-
-<script>
-	export default {
-		name: 'formtable',
-		data(){
-			return {
-				addTemplate: {
-					time: '',
-					type: '',
-					val: '',
-					open: true,
-					checked: false
-				},
-				form: {
-					title: "标题",
-					list: [
-						{
-							time: '09:00',
-							type: '1',
-							val: '100',
-							open: true,
-							checked: true
-						},
-						{
-							time: '10:00',
-							type: '0',
-							val: '50',
-							open: false,
-							checked: true
-						}
-					]
-				},
-				typeDic: [
-					{
-						label: "全局",
-						value: "0"
-					},
-					{
-						label: "局部",
-						value: "1"
-					}
-				],
-				rules: {
-					title: [
-						{required: true, message: '请上传', trigger: 'blur'}
-					]
-				}
-			}
-		},
-		methods: {
-			submitForm(){
-				this.$refs.ruleForm.validate((valid) => {
-					if (valid) {
-						alert('请看控制台输出');
-						console.log(this.form);
-					}else{
-						return false;
-					}
-				})
-			},
-			resetForm(){
-				this.$refs.ruleForm.resetFields();
-			},
-			pushRow(){
-				const data = {
-					time: '18:00',
-					type: '1',
-					val: '0',
-					open: true,
-					checked: true
-				}
-				this.$refs.table.pushRow(data)
-			},
-			deleteRow(){
-				this.$refs.table.deleteRow(0)
-			}
-		}
-	}
-</script>

+ 0 - 42
src/views/vab/iconfont.vue

@@ -1,42 +0,0 @@
-<template>
-	<el-main>
-		<el-alert title="扩展了Element Plus图标库,可以在@/assets/icons中新增自己的SVG图标组件,记得在@/assets/icons/index.js中引入. 建议前往阿里iconfont复制SVG代码 https://www.iconfont.cn/collections/detail?spm=a313x.7781069.0.da5a778a4&cid=25353" type="success" style="margin-bottom:20px;"></el-alert>
-		<el-row :gutter="0" class="box">
-			<el-col :span="4" v-for="(icon, index) in icons" :key="index" >
-				<div class="icon-box">
-					<el-icon><component :is="icon" /></el-icon>
-					<p>{{ icon }}</p>
-				</div>
-			</el-col>
-		</el-row>
-	</el-main>
-
-</template>
-
-<script>
-	import * as scIcons from '@/assets/icons'
-
-	export default {
-		data() {
-			return {
-				icons: []
-			}
-		},
-		mounted() {
-			for(let icon in scIcons){
-				this.icons.push('sc-icon'+icon.replace(/[A-Z]/g,(match)=>'-'+match.toLowerCase()))
-			}
-		}
-	}
-</script>
-
-<style scoped>
-	.box {border-top: 1px solid #eee;border-left: 1px solid #eee;}
-	.icon-box {height:120px;text-align: center;background: #fff;border-bottom: 1px solid #eee;border-right: 1px solid #eee;color: #666;padding:30px 10px;}
-	.icon-box i {font-size: 26px;transition: color .15s linear;}
-	.icon-box p {color: #999;margin-top: 15px;transition: color .15s linear;}
-	.icon-box:hover i, .icon-box:hover p {color: #5cb6ff;}
-
-	.dark .box {border-color: var(--el-border-color-light);}
-	.dark .icon-box {background: var(--el-bg-color-overlay);border-color: var(--el-border-color-light);}
-</style>

+ 0 - 71
src/views/vab/iconselect.vue

@@ -1,71 +0,0 @@
-<!--
- * @Descripttion: 图标选择器组件演示文件
- * @version: 1.0
- * @Author: sakuya
- * @Date: 2021年7月27日09:33:06
- * @LastEditors:
- * @LastEditTime:
--->
-
-<template>
-	<el-main>
-		<el-alert title="支持扩展的图标选择器,除了默认的图标组还可以在 @/config/iconSelect 中定义更多的图标组" type="success" style="margin-bottom:20px;"></el-alert>
-		<el-card shadow="never">
-			<el-form ref="ruleForm" :model="form" :rules="rules" label-width="100px">
-				<el-form-item label="图标" prop="icon">
-					<sc-icon-select v-model="form.icon" :disabled="disabled"></sc-icon-select>
-				</el-form-item>
-				<el-form-item>
-					<el-button type="primary" @click="submitForm">保存</el-button>
-				    <el-button @click="resetForm">重置</el-button>
-					 <el-button @click="setdisabled">{{disabled?'移除禁用':'设为禁用'}}</el-button>
-				</el-form-item>
-			</el-form>
-		</el-card>
-	</el-main>
-</template>
-
-<script>
-	import scIconSelect from '@/components/scIconSelect'
-
-	export default {
-		name: 'iconSelect',
-		components: {
-			scIconSelect
-		},
-		data() {
-			return {
-				form: {
-					icon: 'el-icon-apple'
-				},
-				rules: {
-					icon: [
-						{required: true, message: '请选择图标', trigger: 'change'}
-					]
-				},
-				disabled: false
-			}
-		},
-		methods: {
-			submitForm(){
-				this.$refs.ruleForm.validate((valid) => {
-					if (valid) {
-						alert('请看控制台输出');
-						console.log(this.form);
-					}else{
-						return false;
-					}
-				})
-			},
-			resetForm(){
-				this.$refs.ruleForm.resetFields();
-			},
-			setdisabled(){
-				this.disabled = !this.disabled
-			}
-		}
-	}
-</script>
-
-<style>
-</style>

+ 0 - 169
src/views/vab/importexport.vue

@@ -1,169 +0,0 @@
-<template>
-	<el-main>
-		<el-row :gutter="15">
-			<el-col :lg="12">
-				<el-card shadow="never" header="导入(使用mock,有50%几率导入失败)">
-					<sc-file-import :apiObj="$API.common.importFile" templateUrl="http://www.scuiadmin/file.xlsx" @success="success"></sc-file-import>
-					<sc-file-import :apiObj="$API.common.importFile" :data="{otherData:'demo'}" templateUrl="http://www.scuiadmin/file.xlsx" accept=".xls, .xlsx" :maxSize="30" tip="请上传小于或等于 30M 的 .xls, .xlsx 格式文件(自定义TIP)" @success="success">
-						<template #default="{open}">
-							<el-button type="primary" icon="sc-icon-upload" @click="open">导入(全配置)</el-button>
-						</template>
-						<template #uploader>
-							<el-icon class="el-icon--upload"><sc-icon-file-excel /></el-icon>
-							<div class="el-upload__text">
-								将文件拖到此处或 <em>点击选择文件上传</em>
-							</div>
-						</template>
-						<template #form="{formData}">
-							<el-form-item label="覆盖已有数据">
-								<el-switch v-model="formData.coverage" />
-							</el-form-item>
-							<el-form-item label="跳过错误数据">
-								<el-switch v-model="formData.skipError" />
-							</el-form-item>
-						</template>
-					</sc-file-import>
-					<el-descriptions :column="1" border size="small" style="margin-top: 15px;">
-						<el-descriptions-item label="apiObj" :width="200">Object 文件上传接口对象</el-descriptions-item>
-						<el-descriptions-item label="data">Object 上传时附带的额外参数</el-descriptions-item>
-						<el-descriptions-item label="accept">String 可选择文件类型,默认为".xls, .xlsx"</el-descriptions-item>
-						<el-descriptions-item label="maxSize">Number 可选择文件大小,单位为M,默认为10</el-descriptions-item>
-						<el-descriptions-item label="tip">String 上传框底下的提示语句,默认为"请上传小于或等于 {maxSize}M 的 {accept} 格式文件"</el-descriptions-item>
-						<el-descriptions-item label="templateUrl">String 模板的下载URL</el-descriptions-item>
-						<el-descriptions-item label="@success">事件 上传接口返回的事件,返回function(res, close),执行close()将关闭窗口</el-descriptions-item>
-						<el-descriptions-item label='#default="{open}"'>插糟 默认触发按钮插糟,返回open()打开窗口函数,可以绑定元素@click事件</el-descriptions-item>
-						<el-descriptions-item label='#uploader'>插糟 自定义上传框插槽</el-descriptions-item>
-						<el-descriptions-item label='#form="{formData}"'>插糟 自定义表单组件,插槽formData都将作为上传时附带的额外参数</el-descriptions-item>
-					</el-descriptions>
-				</el-card>
-			</el-col>
-			<el-col :lg="12">
-				<el-card shadow="never" header="导出">
-					<sc-file-export :apiObj="$API.common.exportFile"></sc-file-export>
-					<sc-file-export :apiObj="$API.common.exportFile" fileName="人员列表(异步)" async>
-						<template #default="{open}">
-							<el-button type="primary" icon="sc-icon-download" @click="open">导出(异步)</el-button>
-						</template>
-					</sc-file-export>
-					<sc-file-export :apiObj="$API.common.exportFile" blob fileName="人员列表" :data="{otherData:'demo'}" showData :column="column" :fileTypes="['xlsx','docx','pdf']">
-						<template #default="{open}">
-							<el-button type="primary" icon="sc-icon-download" @click="open">导出(blob文件流)</el-button>
-						</template>
-						<template #form="{formData}">
-							<el-form-item label="导出条数">
-								<el-select v-model="formData.limit" placeholder="Select">
-									<el-option label="100条" value="100" />
-									<el-option label="500条" value="500" />
-									<el-option label="1000条" value="1000" />
-									<el-option label="5000条" value="5000" />
-									<el-option label="10000条" value="10000" />
-								</el-select>
-							</el-form-item>
-						</template>
-					</sc-file-export>
-					<el-descriptions :column="1" border size="small" style="margin-top: 15px;">
-						<el-descriptions-item label="apiObj" :width="200">Object 文件导出接口对象,通过apiObj.url请求文件</el-descriptions-item>
-						<el-descriptions-item label="data">Object 上传时附带的额外参数(可为数据表格的过滤项)</el-descriptions-item>
-						<el-descriptions-item label="showData">Boolean 是否显示附带的额外参数</el-descriptions-item>
-						<el-descriptions-item label="async">Boolean 是否异步导出文件</el-descriptions-item>
-						<el-descriptions-item label="fileName">String 下载文件名称,默认为当前时间戳</el-descriptions-item>
-						<el-descriptions-item label="fileTypes">Array 可选择文件类型,默认为['xlsx'],组件将数组第一项当做已选项</el-descriptions-item>
-						<el-descriptions-item label="column">Array 列配置,请求文件时将添加column为key的参数,值为prop逗号","分割的字符串</el-descriptions-item>
-						<el-descriptions-item label="blob">Boolean 是否由游览器请求文件返回blob后提供下载</el-descriptions-item>
-						<el-descriptions-item label="progress">Boolean blob开启后是否显示下载文件进度条,当服务器启用Gzip时,建议关闭,因为获取到的文件总数和下载总数不匹配。</el-descriptions-item>
-
-						<el-descriptions-item label='#default="{open}"'>插糟 默认触发按钮插糟,返回open()打开窗口函数,可以绑定元素@click事件</el-descriptions-item>
-						<el-descriptions-item label='#form="{formData}"'>插糟 自定义表单组件,插槽formData都将作为请求时附带的额外参数</el-descriptions-item>
-					</el-descriptions>
-				</el-card>
-			</el-col>
-		</el-row>
-	</el-main>
-
-	<el-dialog v-model="importErrDialogVisible" title="导入失败" :width="680" destroy-on-close @closed="()=>{importErrData={}}">
-		<el-alert :title="`总条目数 ${importErrData.ok} ,其中有 ${importErrData.fail} 条格式不满足导入要求,请修改后再次操作。`" type="error" show-icon :closable="false"/>
-		<div style="margin-top: 15px;">
-			<el-table :data="importErrData.failList" border stripe max-height="270" style="width: 100%">
-				<el-table-column prop="keyName" label="主键名" width="180" />
-				<el-table-column prop="" label="状态" width="100" >
-					<el-tag type="danger"><el-icon><el-icon-circle-close-filled/></el-icon> 失败</el-tag>
-				</el-table-column>
-				<el-table-column prop="reason" label="原因" />
-			</el-table>
-		</div>
-		<template #footer>
-			<el-button type="primary" @click="importErrDialogVisible=false">我知道了</el-button>
-		</template>
-	</el-dialog>
-
-</template>
-
-<script>
-	import scFileImport from '@/components/scFileImport'
-	import scFileExport from '@/components/scFileExport'
-
-	export default {
-		name: 'importexport',
-		components: {
-			scFileImport,
-			scFileExport
-		},
-		data() {
-			return {
-				importErrDialogVisible: false,
-				importErrData: {},
-				column: [
-					{
-						label: "姓名",
-						prop: "name"
-					},
-					{
-						label: "性别",
-						prop: "sex"
-					},
-					{
-						label: "评分",
-						prop: "num"
-					},
-					{
-						label: "邮箱",
-						prop: "email",
-						hide: true
-					},
-					{
-						label: "进度",
-						prop: "progress"
-					},
-					{
-						label: "注册时间",
-						prop: "datetime"
-					}
-				]
-			}
-		},
-		mounted() {
-
-		},
-		methods: {
-			success(res, close){
-				if(res.code==200){
-					this.$alert("导入返回成功后,可后续操作,比如刷新表格等。执行回调函数close()可关闭上传窗口。", "导入成功", {
-						type: "success",
-						showClose: false,
-						center: true
-					})
-					close()
-				}else{
-					//返回失败后的自定义操作,这里演示显示错误的条目
-					this.importErrDialogVisible = true
-					this.importErrData = res.data
-				}
-
-			}
-		}
-	}
-</script>
-
-<style>
-
-</style>

+ 0 - 67
src/views/vab/mini.vue

@@ -1,67 +0,0 @@
-
-<template>
-	<el-main>
-		<el-row :gutter="15">
-			<el-col :lg="8">
-				<el-card shadow="never" header="脉冲圆点">
-					<el-space wrap :size="15">
-						<sc-status-indicator pulse type="primary"></sc-status-indicator>
-						<sc-status-indicator pulse type="success"></sc-status-indicator>
-						<sc-status-indicator pulse type="warning"></sc-status-indicator>
-						<sc-status-indicator pulse type="danger"></sc-status-indicator>
-						<sc-status-indicator type="info"></sc-status-indicator>
-					</el-space>
-				</el-card>
-			</el-col>
-			<el-col :lg="8">
-				<el-card shadow="never" header="趋势">
-					<el-space wrap :size="15">
-						<sc-trend v-model="trendValue" prefix="¥"></sc-trend>
-						<sc-trend v-model="trendValue2"></sc-trend>
-						<sc-trend v-model="trendValue3" suffix="%"></sc-trend>
-					</el-space>
-
-					<p style="margin-top: 15px;color: #999;">设置reverse可反转颜色。</p>
-				</el-card>
-			</el-col>
-			<el-col :lg="8">
-				<el-card shadow="never">
-					<div class="up">
-						<h2>持续更新中...</h2>
-						<p>非常欢迎提交Issue/PR完善和补充更多好玩的原子组件</p>
-						<p>原子组件库位置:@/components/scMini/*</p>
-						<el-button type="primary" text @click="goIssue">提交想法</el-button>
-					</div>
-				</el-card>
-			</el-col>
-		</el-row>
-	</el-main>
-</template>
-
-<script>
-	export default {
-		name: 'minivab',
-		data() {
-			return {
-				trendValue: 4.6,
-				trendValue2: 0,
-				trendValue3: -32
-			}
-		},
-		mounted() {
-
-		},
-		methods: {
-			goIssue(){
-				window.open("https://gitee.com/lolicode/scui/issues")
-			}
-		}
-	}
-</script>
-
-<style scoped>
-	.up {text-align: center;}
-	.up h2 {margin-bottom: 10px;}
-	.up p {color: #999;line-height: 1.5;}
-	.el-card {height:150px;}
-</style>

+ 0 - 49
src/views/vab/print.vue

@@ -1,49 +0,0 @@
-<template>
-	<el-main>
-		<el-card shadow="never">
-			<el-tabs tab-position="top">
-				<el-tab-pane label="普通打印">
-					<el-alert title="打印当前页面已存在的元素,如包含.no-print样式就忽略,分页打印就需要{page-break-after: always}控制" type="success" style="margin-bottom:20px;"></el-alert>
-					<el-button type="primary" @click="print">普通打印</el-button>
-					<div style="height:20px"></div>
-					<div class="printMain" ref="printMain">
-						<div class="item">打印内容1 <el-icon><el-icon-eleme-filled /></el-icon> <p class="no-print">忽略打印</p></div>
-						<div style="page-break-after: always;"></div>
-						<div class="item">打印内容2</div>
-					</div>
-				</el-tab-pane>
-				<el-tab-pane label="动态打印">
-					<el-alert title="打印创建的DOM结构,适用于远程获取模板后打印" type="success" style="margin-bottom:20px;"></el-alert>
-					<el-button type="primary" @click="print2">动态打印</el-button>
-				</el-tab-pane>
-			</el-tabs>
-		</el-card>
-	</el-main>
-</template>
-
-<script>
-	import print from '@/utils/print'
-
-	export default {
-		name: 'print',
-		data() {
-			return {}
-		},
-		methods: {
-			print(){
-				//直接传入REF或者querySelector
-				print(this.$refs.printMain)
-			},
-			print2(){
-				//创建虚拟DOM结构后再传入
-				var dom = "<h2>TITLE</h2><p>后创建的DOM结构</p>"
-				print(dom)
-			}
-		}
-	}
-</script>
-
-<style scoped>
-	.printMain .item{padding:20px;border: 1px solid #409eff;margin-bottom: 20px;background: #ecf5ff;border-radius: 4px;}
-	.printMain p {margin-top: 20px;color: #999;}
-</style>

+ 0 - 47
src/views/vab/qrcode.vue

@@ -1,47 +0,0 @@
-<template>
-	<el-main>
-		<el-row :gutter="15">
-			<el-col :lg="8">
-				<el-card shadow="never" header="常用">
-					<sc-qr-code text="scui"></sc-qr-code>
-				</el-card>
-			</el-col>
-			<el-col :lg="8">
-				<el-card shadow="never" header="带Logo">
-					<sc-qr-code text="scui" logo="img/logo.png"></sc-qr-code>
-				</el-card>
-			</el-col>
-			<el-col :lg="8">
-				<el-card shadow="never" header="自定义颜色大小">
-					<sc-qr-code text="scui" :size="100" colorDark="#088200" colorLight="#fff"></sc-qr-code>
-				</el-card>
-			</el-col>
-			<el-col :lg="8">
-				<el-card shadow="never" header="动态">
-					<sc-qr-code :text="qrcode"></sc-qr-code>
-					<el-input v-model="qrcode" placeholder="Please input"  style="margin-top: 20px;"/>
-				</el-card>
-			</el-col>
-		</el-row>
-	</el-main>
-</template>
-
-<script>
-	export default {
-		name: 'qrcode',
-		data() {
-			return {
-				qrcode: "scui"
-			}
-		},
-		mounted() {
-
-		},
-		methods: {
-
-		}
-	}
-</script>
-
-<style>
-</style>

Niektoré súbory nie sú zobrazené, pretože je v týchto rozdielových dátach zmenené mnoho súborov