| | |
| | | ></safari> |
| | | |
| | | <div class="warn-tag" v-if="showFreeVersion"> |
| | | <span class="text" |
| | | <span v-if="!snExpire" class="text" |
| | | >试用版尚未激活,仅支持部分功能使用,如需使用全部功能,请尽快激活系统。</span |
| | | > |
| | | <span class="go-to" @click="gotoActive">前往激活</span> |
| | | <span class="icon iconfont" @click="showFreeVersion = false" |
| | | ></span |
| | | > |
| | | <span v-else class="text">SmartAIOS 试用期已到期,请您尽快激活系统</span> |
| | | <div> |
| | | <span class="go-to" @click="gotoActive">前往激活</span> |
| | | <span class="icon iconfont" @click="showFreeVersion = false" |
| | | ></span |
| | | > |
| | | </div> |
| | | </div> |
| | | |
| | | <el-dialog |
| | | title="激活SmartAI" |
| | | :visible.sync="dialogVisible" |
| | | :visible.sync="activeDialog" |
| | | width="750px" |
| | | :show-close="false" |
| | | :close-on-click-modal="false" |
| | | :close-on-press-escape="false" |
| | | > |
| | | <div class="ver"><span class="ver-text">版本:</span>{{ version }}</div> |
| | | <el-dialog |
| | | width="30%" |
| | | title="账户激活" |
| | | :visible.sync="innerVisible" |
| | | append-to-body |
| | | class="inner-login-dialog" |
| | | > |
| | | <div class="info"> |
| | | 请输入你在SmartAI商城账户的手机号并完成验证码校验,实现系统激活! |
| | | </div> |
| | | <div class="login-content"> |
| | | <el-form |
| | | :model="phone" |
| | | status-icon |
| | | :rules="phoneCodeRule" |
| | | :validate-on-rule-change="false" |
| | | ref="phoneLogin" |
| | | class="demo-ruleForm" |
| | | > |
| | | <el-form-item prop="phoneNum" style="margin-top: 20px"> |
| | | <el-input |
| | | v-model="phone.phoneNum" |
| | | style="width: 380px" |
| | | placeholder="请输入手机号" |
| | | > |
| | | <i slot="prefix" class="el-icon-mobile-phone"></i> |
| | | </el-input> |
| | | </el-form-item> |
| | | <el-form-item prop="verifyCode"> |
| | | <el-input |
| | | @keyup.enter.native="phoneLogin" |
| | | v-model="phone.verifyCode" |
| | | autocomplete="off" |
| | | style="width: 254px" |
| | | placeholder="请输入验证码" |
| | | > |
| | | <i slot="prefix" class="el-icon-message"></i> |
| | | </el-input> |
| | | <el-button |
| | | class="code-btn" |
| | | style="margin-left: 15px" |
| | | :disabled="codeDisabled" |
| | | @click="getCode" |
| | | >{{ codeMsg }}</el-button |
| | | > |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | <span slot="footer" class="dialog-footer"> |
| | | <el-button @click="cancelLogin">取消</el-button> |
| | | <el-button type="primary" @click="loginShop">确定</el-button> |
| | | </span> |
| | | </el-dialog> |
| | | <div class="ver"> |
| | | <span class="ver-text">版本:</span>{{ versionName }} |
| | | </div> |
| | | <div class="ver"> |
| | | <span class="ver-text">状态:</span>{{ versionState }} |
| | | </div> |
| | | <el-divider></el-divider> |
| | | <div class="info"> |
| | | <div class="info" v-if="versionName == 'SmartAI正式版'"> |
| | | 如果您已连接到Internet并且已购买产品密钥,可以尝试验证SmartAI商城账户激活系统。 |
| | | <div class="margin-top:10px;"> |
| | | <el-button type="primary" @click="innerVisible = true"> |
| | | 账户激活 |
| | | </el-button> |
| | | </div> |
| | | </div> |
| | | <div class="info" v-if="versionName == 'SmartAI正式版'"> |
| | | 如果您未连接Internet或激活失败,可尝试离线激活,使用手机扫码购买产品或验证SmartAI商城账户激活系统。 |
| | | </div> |
| | | <div class="info" v-if="versionName !== 'SmartAI正式版'"> |
| | | 如果还没有产品密钥,你可以使用手机扫码或前往此链接 |
| | | <a href="http://os.smartai.com:7004" target="_blank" |
| | | >http://os.smartai.com:7004</a |
| | | <a href="http://apps.smartai.com" target="_blank" |
| | | >http://apps.smartai.com</a |
| | | > |
| | | 购买。 |
| | | </div> |
| | | <img class="qr-code-img" src="/version/offline/qrcode" /> |
| | | <el-divider></el-divider> |
| | | |
| | | <div class="ask"> |
| | | 如果你具有SmartAI提供的产品密钥,请在此处输入激活SmartAI。 |
| | | </div> |
| | | |
| | | <div class="validate"> |
| | | <form id="myForm"> |
| | | <el-input |
| | |
| | | </div> |
| | | |
| | | <span slot="footer" class="dialog-footer"> |
| | | <el-button @click="dialogVisible = false">继续试用</el-button> |
| | | <el-button |
| | | v-if="!snExpire && versionName != 'SmartAI正式版'" |
| | | @click="activeDialog = false" |
| | | >继续试用</el-button |
| | | > |
| | | <el-button |
| | | v-if="snExpire && versionName != 'SmartAI正式版'" |
| | | @click="$emit('quit')" |
| | | >退出登录</el-button |
| | | > |
| | | <el-button type="primary" @click="activateVersion">激活</el-button> |
| | | </span> |
| | | </el-dialog> |
| | | |
| | | <el-dialog |
| | | title="我的订单" |
| | | :visible.sync="innerDialog" |
| | | width="750px" |
| | | :show-close="false" |
| | | :close-on-click-modal="false" |
| | | :close-on-press-escape="false" |
| | | custom-class="my-order" |
| | | > |
| | | <div class="tip"> |
| | | <i class="el-icon-info"></i> |
| | | <span> 请检查订单信息,确认无误后再激活系统。 </span> |
| | | </div> |
| | | |
| | | <div class="order-list" v-if="orderList.length"> |
| | | <div |
| | | class="wrap" |
| | | style="margin: 0 5px" |
| | | v-for="(item, index) in orderList" |
| | | :key="index" |
| | | > |
| | | <div class="order-card" v-for="(prod, i) in item.products" :key="i"> |
| | | <div class="head"> |
| | | <el-checkbox v-model="checked" @change="choseProd(item, prod)"> |
| | | <span>订单ID:{{ item.id }}</span> |
| | | </el-checkbox> |
| | | |
| | | <span>{{ item.orderMoney }} 元</span> |
| | | </div> |
| | | <div class="desc"> |
| | | <div>系统版本:{{ prod.edition }}</div> |
| | | <div>通道数量:{{ prod.ChCount }}</div> |
| | | <div>摄像机数量:{{ prod.cameraCount }}</div> |
| | | <div>服务时长:{{ prod.serveYear }} 年</div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <!-- <div class="order-card" v-for="(item, index) in orderList" :key="index"> |
| | | <div class="head"> |
| | | <el-checkbox v-model="checked"> |
| | | <span>订单ID:{{ item.id }}</span> |
| | | </el-checkbox> |
| | | |
| | | <span>¥{{ item.orderMoney }} 元</span> |
| | | </div> |
| | | <div class="desc"> |
| | | <div>系统版本:{{ item.products[0]&&item.products[0].productVersion }}</div> |
| | | <div>通道数量:{{ item.products[0]&&item.products[0].ChCount }}</div> |
| | | <div>摄像机数量:{{ item.products[0]&&item.products[0].cameraCount }}</div> |
| | | <div>服务时长:{{ item.products[0]&&item.products[0].serveYear }} 年</div> |
| | | |
| | | </div> |
| | | </div> --> |
| | | </div> |
| | | <div class="no-order-list" v-else>抱歉,没有查询到订单。</div> |
| | | <span slot="footer" class="dialog-footer"> |
| | | <el-button @click="$emit('quit')">退出登录</el-button> |
| | | <el-button type="primary" @click="activeVerByOrd">激活</el-button> |
| | | </span> |
| | | </el-dialog> |
| | | </div> |
| | |
| | | <script> |
| | | import DFrame from "./DFrame"; |
| | | import Safari from "./Safari"; |
| | | import { isPhone } from "../../../../scripts/validate.ts"; |
| | | import { |
| | | getActiveQrCode, |
| | | getSN, |
| | | activateVersion, |
| | | uploadKey, |
| | | getSmsCode, |
| | | loginShopInSmart, |
| | | getShopOrderList, |
| | | activeByOrder, |
| | | } from "@/api/system"; |
| | | export default { |
| | | name: "Desktop", |
| | |
| | | data() { |
| | | return { |
| | | showFreeVersion: false, |
| | | dialogVisible: false, |
| | | version: "SmartAI试用版", |
| | | activeDialog: false, |
| | | countdown: 60, |
| | | innerDialog: false, |
| | | versionName: "", |
| | | codeMsg: "获取验证码", |
| | | versionState: "尚未激活", |
| | | secrectKey: "", |
| | | curOrder: {}, |
| | | curProd: {}, |
| | | codeDisabled: false, |
| | | innerVisible: false, |
| | | snExpire: false, |
| | | timer: null, |
| | | token: "", |
| | | orderList: [], |
| | | phone: { |
| | | phoneNum: "", |
| | | verifyCode: "", |
| | | }, |
| | | phoneCodeRule: { |
| | | phoneNum: [{ validator: isPhone, trigger: "blur" }], |
| | | verifyCode: [ |
| | | { required: true, message: "请输入验证码", trigger: "blur" }, |
| | | ], |
| | | }, |
| | | }; |
| | | }, |
| | | mounted() { |
| | | created() { |
| | | this.validateSn(); |
| | | }, |
| | | methods: { |
| | | activeVerByOrd() { |
| | | activeByOrder({ |
| | | token: this.token, |
| | | activateCode: this.curProd.activateCode, |
| | | productId: this.curProd.productId, |
| | | orderId: this.curOrder.id, |
| | | }).then((res) => { |
| | | if (res.code == 200) { |
| | | this.$notify.success("激活成功"); |
| | | this.innerDialog = false; |
| | | this.versionName = this.getVersionName(res.data.edition); |
| | | } else { |
| | | this.$notify.error("激活失败"); |
| | | } |
| | | }); |
| | | }, |
| | | validateSn() { |
| | | getSN().then((res) => { |
| | | this.showFreeVersion = res.data.sn == ""; |
| | | this.snExpire = res.data.expire; |
| | | this.showFreeVersion = res.data.sn == "" || res.data.expire; |
| | | this.versionName = this.getVersionName(res.data.edition); |
| | | }); |
| | | }, |
| | | getValidStr() { |
| | | if (this.countdown > 0 && this.countdown <= 60) { |
| | | this.countdown--; |
| | | if (this.countdown !== 0) { |
| | | this.codeMsg = "重新发送(" + this.countdown + ")"; |
| | | } else { |
| | | clearInterval(this.timer); |
| | | this.codeMsg = "获取验证码"; |
| | | this.countdown = 60; |
| | | this.timer = null; |
| | | this.codeDisabled = false; |
| | | } |
| | | } |
| | | }, |
| | | choseProd(order, prod) { |
| | | debugger; |
| | | this.curOrder = order; |
| | | this.curProd = prod; |
| | | }, |
| | | getVersionName(s) { |
| | | switch (s) { |
| | | case "alpha": |
| | | return "SmartAI内测版"; |
| | | case "beta": |
| | | return "SmartAI公测版"; |
| | | case "trial": |
| | | return "SmartAI试用版"; |
| | | case "test": |
| | | return "SmartAI测试版"; |
| | | case "official": |
| | | return "SmartAI正式版"; |
| | | default: |
| | | return "SmartAI定制版"; |
| | | break; |
| | | } |
| | | }, |
| | | loginShop() { |
| | | // this.innerDialog = true |
| | | // this.activeDialog=false |
| | | // getShopOrderList({ |
| | | // token: "", |
| | | // }).then((res) => { |
| | | // this.orderList=res.data.list |
| | | // }); |
| | | this.$refs["phoneLogin"].validate((valid) => { |
| | | if (valid) { |
| | | let param = { |
| | | phoneNum: this.phone.phoneNum, |
| | | verifyCode: this.phone.verifyCode, |
| | | }; |
| | | loginShopInSmart(param).then((res) => { |
| | | this.innerDialog = true; |
| | | this.activeDialog = false; |
| | | this.token = res.data.access_token; |
| | | getShopOrderList({ token: this.token }) |
| | | .then((res) => { |
| | | if (res.code == 200) { |
| | | this.orderList = res.data.list; |
| | | } else { |
| | | this.$notify.error("获取订单列表失败"); |
| | | } |
| | | }) |
| | | .catch(() => { |
| | | this.$notify.error("获取订单列表失败"); |
| | | }); |
| | | }); |
| | | } else { |
| | | this.nullRule = {}; |
| | | } |
| | | }); |
| | | }, |
| | | cancelLogin() { |
| | | this.innerVisible = false; |
| | | }, |
| | | getCode() { |
| | | var pattern = /^1[345789]\d{9}$/; |
| | | if (this.phone.phoneNum == "") { |
| | | this.$refs["phoneLogin"].fields[0].validateMessage = "请输入手机号"; |
| | | this.$refs["phoneLogin"].fields[0].validateState = "error"; |
| | | return; |
| | | } |
| | | if (!pattern.test(this.phone.phoneNum)) { |
| | | this.$refs["phoneLogin"].fields[0].validateMessage = "手机号码格式有误"; |
| | | this.$refs["phoneLogin"].fields[0].validateState = "error"; |
| | | return; |
| | | } |
| | | if (!this.timer) { |
| | | this.codeDisabled = true; |
| | | this.getValidStr(); |
| | | this.timer = setInterval(this.getValidStr, 1000); |
| | | getSmsCode({ phoneNum: this.phone.phoneNum }) |
| | | .then((res) => { |
| | | this.gotCode = true; |
| | | }) |
| | | .catch((err) => { |
| | | this.$refs["phoneLogin"].fields[0].validateMessage = err.data.msg; |
| | | this.$refs["phoneLogin"].fields[0].validateState = "error"; |
| | | }); |
| | | } |
| | | }, |
| | | activateVersion() { |
| | | if (this.secrectKey.trim() == "") { |
| | |
| | | } |
| | | activateVersion({ code: this.secrectKey.trim() }) |
| | | .then((res) => { |
| | | debugger; |
| | | if (res.code == 200) { |
| | | this.$notify.success("激活成功"); |
| | | this.validateSn(); |
| | | this.goToSysInfo(); |
| | | this.dialogVisible = false; |
| | | this.activeDialog = false; |
| | | } else { |
| | | this.$notify.error(res.msg); |
| | | } |
| | |
| | | window.parent.postMessage({ msg: `toVindicate?menu=系统信息` }, "*"); |
| | | }, |
| | | gotoActive() { |
| | | this.dialogVisible = true; |
| | | this.activeDialog = true; |
| | | }, |
| | | uploadKey(params) { |
| | | debugger; |
| | | let param = new FormData(); |
| | | param.append("code", params.file); |
| | | uploadKey(param).then( |
| | | (res) => { |
| | | this.$message.success("导入成功"); |
| | | this.secrectKey = res.data; |
| | | if (res.code == 200) { |
| | | this.$message.success("导入成功"); |
| | | this.secrectKey = res.data; |
| | | } else { |
| | | this.$message.error(res.msg); |
| | | } |
| | | }, |
| | | (err) => { |
| | | this.$message.error("导入失败"); |
| | | this.$message.error(err.msg); |
| | | } |
| | | ); |
| | | }, |
| | |
| | | font-size: 15px; |
| | | } |
| | | } |
| | | .inner-login-dialog { |
| | | .info { |
| | | padding: 0 30px; |
| | | } |
| | | .el-dialog__body { |
| | | text-align: left; |
| | | } |
| | | } |
| | | .login-content { |
| | | box-sizing: border-box; |
| | | padding: 0 30px; |
| | | .el-input__inner { |
| | | -webkit-appearance: none; |
| | | background-color: #ffffff; |
| | | background-image: none; |
| | | border-radius: 4px; |
| | | border: 1px solid #dcdfe6; |
| | | box-sizing: border-box; |
| | | color: #606266; |
| | | display: inline-block; |
| | | font-size: 16px; |
| | | border-radius: 5px; |
| | | height: 40px; |
| | | line-height: 40px; |
| | | outline: none; |
| | | padding: 0 15px; |
| | | transition: border-color 0.2s cubic-bezier(0.645, 0.045, 0.355, 1); |
| | | width: 100%; |
| | | } |
| | | } |
| | | .el-dialog.my-order { |
| | | .tip { |
| | | width: auto; |
| | | height: 40px; |
| | | background: rgb(145, 213, 255, 0.2); |
| | | box-sizing: border-box; |
| | | border: 1px rgb(145, 213, 255) solid; |
| | | display: flex; |
| | | padding: 0 10px; |
| | | border-radius: 5px; |
| | | align-items: center; |
| | | i { |
| | | margin-right: 5px; |
| | | font-size: 16px; |
| | | color: rgb(24, 144, 255); |
| | | } |
| | | span { |
| | | font-size: 14px; |
| | | } |
| | | } |
| | | .no-order-list { |
| | | margin-top: 20px; |
| | | font-size: 16px; |
| | | color: red; |
| | | } |
| | | .order-list { |
| | | margin: 20px 0; |
| | | height: 550px; |
| | | overflow-y: auto; |
| | | .order-card { |
| | | height: 150px; |
| | | background: #fff; |
| | | margin-bottom: 15px; |
| | | |
| | | border-radius: 8px; |
| | | box-shadow: 0px 0px 4px rgb(0 0 0 / 25%); |
| | | .head { |
| | | height: 40px; |
| | | line-height: 40px; |
| | | text-align: left; |
| | | box-sizing: border-box; |
| | | padding: 0 20px; |
| | | border-bottom: 1px rgba(242, 242, 242, 1) solid; |
| | | font-size: 14px; |
| | | display: flex; |
| | | justify-content: space-between; |
| | | } |
| | | .desc { |
| | | display: flex; |
| | | flex-direction: column; |
| | | justify-content: space-evenly; |
| | | height: 110px; |
| | | text-align: left; |
| | | box-sizing: border-box; |
| | | padding: 0 20px; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | .warn-tag { |
| | | width: 640px; |
| | | width: 630px; |
| | | text-align: left; |
| | | box-sizing: border-box; |
| | | padding: 0 25px; |
| | |
| | | display: flex; |
| | | justify-content: space-between; |
| | | top: 55px; |
| | | left: calc(50% - 320px); |
| | | left: calc(50% - 315px); |
| | | line-height: 45px; |
| | | border-radius: 5px; |
| | | .go-to { |
| | |
| | | cursor: pointer; |
| | | text-decoration: underline; |
| | | font-weight: 600; |
| | | font-size: 13px; |
| | | font-size: 14px; |
| | | } |
| | | .text { |
| | | font-size: 13px; |
| | | font-size: 14px; |
| | | } |
| | | .icon { |
| | | font-size: 14px; |
| | | cursor: pointer; |
| | | margin-left: 25px; |
| | | } |
| | | } |
| | | </style> |