From 8e7cd003414ea4ca8f42fb3171de18f8839ece17 Mon Sep 17 00:00:00 2001 From: yangfeng <wanwan926_4@163.com> Date: 星期一, 10 七月 2023 18:04:27 +0800 Subject: [PATCH] 登录页面和查询分类设置 --- src/components/makepager/TableCommonView.vue | 5 package-lock.json | 2 src/components/makepager/PublicFunctionBtnView.vue | 9 src/views/login/index.vue | 311 +++++++++++++++++++++++++++++- package.json | 2 src/components/layout/components/appHeader/index.vue | 30 +++ src/components/makepager/SearchCommonView.vue | 19 + src/router/custom/index.js | 12 src/views/other/QueryClassSettingDialog.vue | 148 ++++++++++++++ src/router/index.js | 17 + 10 files changed, 526 insertions(+), 29 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8356dbc..ea439c8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,7 +17,7 @@ "svg-sprite-loader": "^6.0.11", "vue": "^2.6.14", "vue-i18n": "^8.26.7", - "vue-router": "^3.6.5", + "vue-router": "^3.0.7", "vuex": "^3.6.2", "web-storage-cache": "^1.1.1" }, diff --git a/package.json b/package.json index 31e0b1b..bcd70b8 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "svg-sprite-loader": "^6.0.11", "vue": "^2.6.14", "vue-i18n": "^8.26.7", - "vue-router": "^3.6.5", + "vue-router": "^3.0.7", "vuex": "^3.6.2", "web-storage-cache": "^1.1.1" }, diff --git a/src/components/layout/components/appHeader/index.vue b/src/components/layout/components/appHeader/index.vue index bafd8cc..88f2037 100644 --- a/src/components/layout/components/appHeader/index.vue +++ b/src/components/layout/components/appHeader/index.vue @@ -1,6 +1,15 @@ <template> <div class="sales-lead"> <div class="header-title">{{ headerTitle }}</div> + <div class="header-user-info"> + <div class="avatar"><el-avatar icon="el-icon-user-solid"></el-avatar></div> + <el-dropdown @command="handleCommand"> + <div class="el-dropdown-link">鐢ㄦ埛鍚�<i class="el-icon-arrow-down el-icon--right"></i></div> + <el-dropdown-menu slot="dropdown"> + <el-dropdown-item command="logout">閫�鍑�</el-dropdown-item> + </el-dropdown-menu> + </el-dropdown> + </div> </div> </template> @@ -9,6 +18,17 @@ name: "SalesLead", props: { headerTitle: String + }, + data() { + return {} + }, + methods: { + handleCommand(command) { + console.log(command) + if (command === "logout") { + this.$router.push({ path: "/login" }) + } + } } } </script> @@ -16,6 +36,7 @@ <!-- Add "scoped" attribute to limit CSS to this component only --> <style lang="scss" scoped> .sales-lead { + display: flex; height: 55px; line-height: 55px; background-color: #fff; @@ -25,5 +46,14 @@ font-size: 16px; color: #475059; } + .header-user-info { + margin-left: auto; + margin-right: 20px; + display: flex; + .avatar { + margin-top: 8px; + margin-right: 10px; + } + } } </style> diff --git a/src/components/makepager/PublicFunctionBtnView.vue b/src/components/makepager/PublicFunctionBtnView.vue index 8626cd8..5531e6e 100644 --- a/src/components/makepager/PublicFunctionBtnView.vue +++ b/src/components/makepager/PublicFunctionBtnView.vue @@ -41,16 +41,16 @@ <i class="el-icon-tickets"></i> </div> <!-- 鍦板浘 --> - <div v-if="mapButton" class="btn-icon" @click="mapBtnClick"> + <div v-if="mapButton" class="btn-icon" title="鍦板浘" @click="mapBtnClick"> <i class="el-icon-location-information"></i> </div> <!-- 缁熻 --> - <div v-if="statistics" class="btn-icon" @click="statisticsBtnClick"> + <div v-if="statistics" class="btn-icon" title="缁熻" @click="statisticsBtnClick"> <i class="el-icon-data-line"></i> </div> <!-- 瀹㈡埛婕忔枟 --> - <div v-if="customFunnel" class="btn-icon" @click="statisticsBtnClick" style="color: #666"> - <i class="el-icon-postcard" title="瀹㈡埛婕忔枟"></i> + <div v-if="customFunnel" class="btn-icon" title="瀹㈡埛婕忔枟" @click="statisticsBtnClick" style="color: #666"> + <i class="el-icon-postcard"></i> </div> </div> </div> @@ -176,6 +176,7 @@ border-radius: 4px; color: rgb(0, 102, 255); background-color: #f2f4fb; + cursor: pointer; } .view-scope { display: flex; diff --git a/src/components/makepager/SearchCommonView.vue b/src/components/makepager/SearchCommonView.vue index 768342a..6eddf4f 100644 --- a/src/components/makepager/SearchCommonView.vue +++ b/src/components/makepager/SearchCommonView.vue @@ -7,7 +7,7 @@ <el-option v-for="item in queryClassOptions" :key="item.value" :label="item.label" :value="item.value"> </el-option> </el-select> - <div class="query-class-btn"> + <div class="query-class-btn" @click="queryClassClick"> <i class="el-icon-setting"></i> </div> </div> @@ -83,12 +83,17 @@ </div> </div> </div> + <!-- 鏌ヨ鍒嗙被寮圭獥 --> + <QueryClassSettingDialog v-if="queryClassSetConfig.visible" :editCommonConfig="queryClassSetConfig" /> </div> </template> <script> +import QueryClassSettingDialog from "@/views/other/QueryClassSettingDialog.vue" + export default { name: "SearchCommonView", + components: { QueryClassSettingDialog }, props: { queryClass: { type: String, @@ -113,6 +118,10 @@ }, data() { return { + queryClassSetConfig: { + visible: false, + infomation: {} + }, queryClassValue: this.queryClass, searchInput: "", searchSelValue: this.searchSel, @@ -144,6 +153,11 @@ } }, methods: { + queryClassClick() { + this.queryClassSetConfig = { + visible: true + } + }, searchClick() { console.log("sssssssssss") }, @@ -195,6 +209,7 @@ font-size: 16px; margin-left: 10px; color: #bebebe; + cursor: pointer; } } .search { @@ -212,6 +227,7 @@ margin-left: 20px; .other-search-high { display: flex; + cursor: pointer; .high-icon { font-size: 18px; } @@ -219,6 +235,7 @@ .other-search-tile, .other-search-label { display: flex; + cursor: pointer; margin-left: 20px; .high-icon { font-size: 18px; diff --git a/src/components/makepager/TableCommonView.vue b/src/components/makepager/TableCommonView.vue index 9db25d6..c799a17 100644 --- a/src/components/makepager/TableCommonView.vue +++ b/src/components/makepager/TableCommonView.vue @@ -21,7 +21,7 @@ :label="item.label" :width="item.width" :min-width="item.min" - show-overflow-tooltip="true" + show-overflow-tooltip sortable > <template slot-scope="scope"> @@ -31,6 +31,9 @@ </template> </el-table-column> <slot name="tableButton" /> + <div slot="empty"> + <el-empty description="鏆傛棤鏁版嵁"></el-empty> + </div> </el-table> </div> </template> diff --git a/src/router/custom/index.js b/src/router/custom/index.js index 19b9909..7657cff 100644 --- a/src/router/custom/index.js +++ b/src/router/custom/index.js @@ -11,7 +11,8 @@ name: "salesLead", component: salesLead, meta: { - title: "閿�鍞嚎绱�" + title: "閿�鍞嚎绱�", + requireAuth: true } }, { @@ -19,7 +20,8 @@ name: "customManage", component: customManage, meta: { - title: "瀹㈡埛绠$悊" + title: "瀹㈡埛绠$悊", + requireAuth: true } }, { @@ -27,7 +29,8 @@ name: "contacts", component: contacts, meta: { - title: "鑱旂郴浜�" + title: "鑱旂郴浜�", + requireAuth: true } }, { @@ -35,7 +38,8 @@ name: "followupRecords", component: followupRecords, meta: { - title: "璺熻繘璁板綍" + title: "璺熻繘璁板綍", + requireAuth: true } } ] diff --git a/src/router/index.js b/src/router/index.js index 6effbfa..ed7b15b 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -83,4 +83,21 @@ const router = createRouter() +// router.beforeEach((to, from, next) => { +// must call `next` +// console.log(to, from) +// if (to.path === "/custom/salesLead") { +// next() +// } else { +// if (to.meta.requireAuth) { +// next({ +// path: "/login", +// query: { redirect: to.fullPath } +// }) +// } else { +// next() +// } +// } +// }) + export default router diff --git a/src/views/login/index.vue b/src/views/login/index.vue index b80b5f9..a4e2b81 100644 --- a/src/views/login/index.vue +++ b/src/views/login/index.vue @@ -1,30 +1,307 @@ <template> - <div class="login"> - <h1>login</h1> + <div class="page-login"> + <div class="page-login--layer"> + <div class="page-login--content" flex="dir:top cross:stretch box:justify"> + <div class="page-login--content-header"> + <p class="page-login--content-header-motto"> + <!-- 鏃堕棿鏄竴鍒囪储瀵屼腑鏈�瀹濊吹鐨勮储瀵� --> + </p> + </div> + <div class="page-login--content-main" flex="dir:top main:center cross:center"> + <!-- logo --> + <!-- <img class="page-login--logo" src="./image/logo@2x.png" /> --> + <!-- form --> + <div class="page-login--form"> + <span style="font-family: PingFangSC-Medium, sans-serif">鐧诲綍</span> + <el-card shadow="never"> + <el-form ref="loginForm" label-position="top" :rules="rules" :model="formLogin" size="default"> + <el-form-item prop="username"> + <el-input type="text" v-model="formLogin.username" placeholder="鐢ㄦ埛鍚�"> </el-input> + </el-form-item> + <el-form-item prop="password"> + <el-input type="password" v-model="formLogin.password" placeholder="瀵嗙爜" show-password id="password"> + </el-input> + <i id="iconfont" class="iconfont icon-biyanjing" @click="clickeye()"></i> + </el-form-item> + <!-- <el-form-item prop="code"> + <el-input type="text" v-model="formLogin.code" placeholder="楠岃瘉鐮�"> + <template slot="append"> + <img class="login-code" :src="captcha" @click="getCaptchaData" /> + </template> + </el-input> + </el-form-item> --> + <el-button size="default" @click="submit" type="primary" class="button-login"> 鐧诲綍 </el-button> + </el-form> + </el-card> + <div class="error" style="font-size: 14px; float: left"> + {{ this.error }} + </div> + <p class="page-login--options"> + <span> 娉ㄥ唽</span> + <span>|</span> + <span>蹇樿瀵嗙爜</span> + </p> + </div> + </div> + </div> + </div> </div> </template> <script> +// import { mapActions } from "vuex" +// import "@/assets/font/iconfont" + export default { - name: "LoginOn", - props: {} + name: "LoginView", + data() { + return { + captcha: "", + // timeInterval: null, + // time: dayjs().format("HH:mm:ss"), + // 蹇�熼�夋嫨鐢ㄦ埛 + dialogVisible: false, + // 琛ㄥ崟 + formLogin: { + username: "admin", + password: "123456", + code: "" + }, + // 琛ㄥ崟鏍¢獙 + rules: { + username: [ + { + required: true, + message: "璇疯緭鍏ョ敤鎴峰悕", + trigger: "blur" + } + ], + password: [ + { + required: true, + message: "璇疯緭鍏ュ瘑鐮�", + trigger: "blur" + } + ], + code: [ + { + required: true, + message: "璇疯緭鍏ラ獙璇佺爜", + trigger: "blur" + } + ] + }, + error: "" + } + }, + mounted() { + this.timeInterval = setInterval(() => { + // this.refreshTime() + }, 1000) + this.getCaptchaData() + }, + beforeDestroy() { + clearInterval(this.timeInterval) + }, + methods: { + getCaptchaData() {}, + + /** + * @description 鎻愪氦琛ㄥ崟 + */ + // 鎻愪氦鐧诲綍淇℃伅 + submit() { + this.$refs.loginForm.validate((valid) => { + if (valid) { + // 鐧诲綍 + // 娉ㄦ剰 杩欓噷鐨勬紨绀烘病鏈変紶楠岃瘉鐮� + // 鍏蜂綋闇�瑕佷紶閫掔殑鏁版嵁璇疯嚜琛屼慨鏀逛唬鐮� + // this.login({ + // username: this.formLogin.username, + // password: this.formLogin.password, + // captcha: this.formLogin.code + // }).then((rsp) => { + // // 閲嶅畾鍚戝璞′笉瀛樺湪鍒欒繑鍥為《灞傝矾寰� + // if (rsp != "") { + // // this.$message.warning(rsp); + // this.error = "濉叆淇℃伅閿欒锛岃妫�鏌ワ紒" + // let _this = this + // setTimeout(function () { + // _this.error = "" + // }, 3000) + // return + // } + this.$router.replace(this.$route.query.redirect || "/").catch((err) => { + console.log(err) + }) + // }) + } else { + // 鐧诲綍琛ㄥ崟鏍¢獙澶辫触 + // this.$message.error("琛ㄥ崟鏍¢獙澶辫触锛岃妫�鏌�"); + this.error = "濉叆淇℃伅閿欒锛岃妫�鏌ワ紒" + var _this = this + setTimeout(function () { + _this.error = "" + }, 3000) + } + }) + }, + //鐐瑰嚮鐪肩潧 + clickeye() { + // let eye = document.getElementById("iconfont") + let pwd = document.getElementById("password") + if (pwd.type == "password") { + // ;(pwd.type = "text"), (eye.className = "iconfont icon-yanjing") + } else { + // ;(pwd.type = "password"), (eye.className = "iconfont icon-biyanjing") + } + } + } } </script> -<!-- Add "scoped" attribute to limit CSS to this component only --> -<style scoped> -h3 { - margin: 40px 0 0; +<style lang="scss"> +.el-icon-view:before { + content: ""; } -ul { - list-style-type: none; - padding: 0; +.iconfont:before { + line-height: 48px; + position: absolute; + right: 19px; + font-size: 18px; + color: rgba(0, 0, 0, 0.4); } -li { - display: inline-block; - margin: 0 10px; -} -a { - color: #42b983; +.page-login { + background-size: 100%; + height: 100%; + position: relative; + .page-login--layer-area { + overflow: hidden; + } + // 鏃堕棿 + .page-login--layer-time { + font-size: 24em; + font-weight: bold; + color: rgba(0, 0, 0, 0.03); + overflow: hidden; + } + // 鐧婚檰椤甸潰鎺т欢鐨勫鍣� + .page-login--content { + height: 100%; + min-height: 500px; + position: relative; + top: 0; + left: 0; + } + // header + .page-login--content-header { + padding: 1em 0; + .page-login--content-header-motto { + margin: 0px; + padding: 0px; + color: beige; + text-align: center; + font-size: 12px; + } + } + // main + .page-login--logo { + width: 240px; + margin-bottom: 2em; + margin-top: -2em; + position: absolute; + top: 7%; + left: 3%; + } + // 鐧诲綍琛ㄥ崟 + .page-login--form { + width: 431px; + height: 400px; + left: 50%; + top: 30%; + transform: translate(-50%, 0%); + position: absolute; + background: #fafbff; + opacity: 0.9; + border-radius: 24px; + padding: 35px 36px; + text-align: center; + font-size: 36px; + line-height: 48px; + color: #181f30; + .el-form { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + .el-form-item { + margin-bottom: 24px; + width: 359px; + height: 48px; + background: #fff; + border: 8px; + .el-input__inner { + font-size: 14px; + height: 48px; + line-height: 20px; + padding-left: 16px; + color: #181f30; + } + } + } + // 鍗$墖 + .el-card { + margin-bottom: 15px; + background: transparent; + border: 0; + } + // 鐧诲綍鎸夐挳 + .button-login { + width: 359px; + height: 48px; + font-size: 16px; + line-height: 20px; + font-family: PingFangSC-Medium, sans-serif; + } + // 杈撳叆妗嗗乏杈圭殑鍥捐〃鍖哄煙缂╃獎 + .el-input-group__prepend { + padding: 0px 14px; + } + .login-code { + height: 40px - 2px; + display: block; + margin: 0px -20px; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + } + // 鐧婚檰閫夐」 + .page-login--options { + font-family: PingFangSC-Medium, sans-serif; + color: #181f30 !important; + margin: 0px; + padding: 0px; + font-size: 14px; + line-height: 20px; + color: #2a78fb; + margin-right: 34px; + margin-bottom: 15px; + font-weight: bold; + float: right; + :nth-child(2) { + margin: 0px 5px; + } + } + .page-login--quick { + width: 100%; + } + } + .error { + float: left; + font-size: 14px; + line-height: 20px; + margin-left: 35px; + color: #f62f2f; + font-family: PingFangSC-Medium, sans-serif; + } } </style> diff --git a/src/views/other/QueryClassSettingDialog.vue b/src/views/other/QueryClassSettingDialog.vue new file mode 100644 index 0000000..b1818c7 --- /dev/null +++ b/src/views/other/QueryClassSettingDialog.vue @@ -0,0 +1,148 @@ +<template> + <div class="query-class-set"> + <el-dialog title="鏌ヨ鍒嗙被璁剧疆" :visible.sync="editConfig.visible" :width="dialogWidth" :before-close="handleClose"> + <el-table :data="tableData" style="width: 100%" :header-cell-style="{ background: '#f4f8fe' }"> + <el-table-column label="鍒嗙被鍚嶇О" prop="className"> </el-table-column> + <el-table-column label="鎿嶄綔" width="200px"> + <template slot-scope="scope"> + <i class="el-icon-edit common-style first" title="缂栬緫" @click="editClick(scope.$index, scope.row)"></i> + <i class="el-icon-document-copy common-style" title="澶嶅埗" @click="copyClick(scope.$index, scope.row)"></i> + <i + v-if="scope.$index !== 0 && scope.$index !== tableData.length - 1" + class="el-icon-bottom common-style" + title="涓嬬Щ" + @click="moveDownClick(scope.$index, scope.row)" + ></i> + <i + v-if="scope.$index !== 0 && scope.$index !== 1" + class="el-icon-top common-style" + title="涓婄Щ" + @click="moveUpClick(scope.$index, scope.row)" + ></i> + <i + v-if="scope.$index !== 0" + class="el-icon-delete common-style" + title="鍒犻櫎" + @click="deleteClick(scope.$index, scope.row)" + ></i> + </template> + </el-table-column> + </el-table> + <div style="padding: 10px"> + <el-button type="primary" size="mini">鏂板缓鍒嗙被</el-button> + </div> + <div slot="footer" class="dialog-footer"> + <el-button type="primary" size="small" @click="editConfig.visible = false">淇濆瓨</el-button> + <el-button size="small" @click="editConfig.visible = false">鍙栨秷</el-button> + </div> + </el-dialog> + </div> +</template> + +<script> +export default { + name: "QueryClassSettingDialog", + props: { + editCommonConfig: { + type: Object, + default: () => { + return { + visible: false, + infomation: {} + } + } + } + }, + components: {}, + computed: {}, + data() { + return { + dialogWidth: "30%", + editConfig: this.editCommonConfig, + tableData: [ + { + className: "鍏ㄩ儴" + }, + { + className: "杩囨湡鏈弧60澶�" + }, + { + className: "杩囨湡鏈弧30澶�" + }, + { + className: "宸茶繃鏈�" + } + ] + } + }, + created() {}, + methods: { + handleClose() { + this.editConfig.visible = false + }, + // 缂栬緫 + editClick(index, row) { + console.log(index, row) + }, + // 澶嶅埗 + copyClick() {}, + // 涓婄Щ + moveUpClick(index) { + var that = this + if (index > 1) { + const upData = that.tableData[index - 1] + that.tableData.splice(index - 1, 1) + that.tableData.splice(index, 0, upData) + } + }, + // 涓嬬Щ + moveDownClick(index) { + var that = this + const downData = that.tableData[index + 1] + that.tableData.splice(index + 1, 1) + that.tableData.splice(index, 0, downData) + }, + // 鍒犻櫎 + deleteClick() {} + } +} +</script> + +<!-- Add "scoped" attribute to limit CSS to this component only --> +<style lang="scss" scoped> +.query-class-set { + .common-style { + font-size: 16px; + margin-left: 10px; + cursor: pointer; + } + .first { + margin-left: 0px; + } + .dialog-footer { + background-color: #f5f5f5; + height: 55px; + line-height: 55px; + } +} +::v-deep { + .el-dialog__header { + padding: 12.5px 10px; + border-bottom: 1px solid #e5e5e5; + .el-dialog__title { + font-size: 15px; + color: #323232; + font-weight: bold; + } + } + .el-dialog__body { + padding: 0px; + } + .el-dialog__footer { + padding: 0px; + text-align: center; + box-sizing: border-box; + border-top: 1px solid #dadee5; + } +} +</style> -- Gitblit v1.8.0