新大宝股票管理后台
1
jhzh
2025-07-09 5345d78885467ad07c42cfc3a57fc60059854703
1
9 files modified
1 files added
309 ■■■■■ changed files
.env 2 ●●● patch | view | raw | blame | history
.env.development 2 ●●● patch | view | raw | blame | history
.env.preview 2 ●●● patch | view | raw | blame | history
.gitignore 1 ●●●● patch | view | raw | blame | history
src/api/managesettings.js 34 ●●●●● patch | view | raw | blame | history
src/config/router.config.js 11 ●●●●● patch | view | raw | blame | history
src/views/account/settings/Index.vue 5 ●●●●● patch | view | raw | blame | history
src/views/account/settings/googleAuthCode.vue 233 ●●●●● patch | view | raw | blame | history
src/views/user/Login.vue 15 ●●●●● patch | view | raw | blame | history
src/views/userlist/components/editCapitaluserdialog.vue 4 ●●● patch | view | raw | blame | history
.env
@@ -1,6 +1,6 @@
NODE_ENV=production
VUE_APP_PREVIEW=true
VUE_APP_API_BASE_URL= https://stockapi.yanshiz.com/
VUE_APP_API_BASE_URL= https://rgapi.yanshiz.com/
# VUE_APP_API_BASE_URL=http://www.jqydl.com:8091/
# VUE_APP_API_BASE_URL= https://api.dfddgj346.xyz/
# VUE_APP_API_BASE_URL=https://www.rksv.store:8091/
.env.development
@@ -5,7 +5,7 @@
# VUE_APP_API_BASE_URL=https://api.marwadi.online/
# VUE_APP_API_BASE_URL=https://www.rksv.store:8091/
# VUE_APP_API_BASE_URL=https://api.dfddgj346.xyz/
VUE_APP_API_BASE_URL=http://stockapi.yanshiz.com/
VUE_APP_API_BASE_URL=https://rgapi.yanshiz.com/
# VUE_APP_API_BASE_URL=https://api.durocaspitall.com/
# VUE_APP_API_BASE_URL=https://api.fidelityio.com/
# VUE_APP_API_BASE_URL= https://www.prudentcapitals.net/
.env.preview
@@ -2,6 +2,6 @@
VUE_APP_PREVIEW=true
VUE_APP_API_BASE_URL=https://stockapi.yanshiz.com/
VUE_APP_API_BASE_URL=https://rgapi.yanshiz.com/
# VUE_APP_API_BASE_URL=http://192.168.10.4:8091/
.gitignore
@@ -20,3 +20,4 @@
*.sln
*.sw*
package-lock.json
*.rar
src/api/managesettings.js
@@ -4,7 +4,11 @@
    adminlist: '/admin/list.do', // 管理列表
    adminupdateLock: '/admin/updateLock.do', // 管理锁定 解锁
    adminadd: '/admin/add.do', // 添加管理员
    adminupdate: '/admin/update.do' // 修改管理员密码
    adminupdate: '/admin/update.do' ,// 修改管理员密码
    getAdmin: '/api/admin/getAdmin',//获取当前管理用户信息
    getLoginGoogleAuthSecret: '/api/admin/getLoginGoogleAuthSecret',//生成秘钥二维码
    bindGoogleAuth: '/api/admin/bindGoogleAuth',//获取当前管理验证码
    unbindingGoogleAuth:'/api/admin/unbindingGoogleAuth',//解绑
}
/**
@@ -18,6 +22,34 @@
 * @param parameter
 * @returns {*}
 */
export function unbindingGoogleAuth (parameter) {
    return request({
        url: userApi.unbindingGoogleAuth,
        method: 'post',
        data: qs.stringify(parameter)
    })
}
export function getLoginGoogleAuthSecret (parameter) {
    return request({
        url: userApi.getLoginGoogleAuthSecret,
        method: 'get',
        data: qs.stringify(parameter)
    })
}
export function bindGoogleAuth (parameter) {
    return request({
        url: userApi.bindGoogleAuth,
        method: 'post',
        data: qs.stringify(parameter)
    })
}
export function getAdmin (parameter) {
    return request({
        url: userApi.getAdmin,
        method: 'get',
        data: qs.stringify(parameter)
    })
}
export function adminlist (parameter) {
    return request({
        url: userApi.adminlist,
src/config/router.config.js
@@ -579,6 +579,17 @@
                },
              },
              {
                path: '/account/settings/googleAuthCode',
                name: 'GoogleAuthCode',
                component: () => import('@/views/account/settings/googleAuthCode'),
                meta: {
                  title: '绑定谷歌验证器',
                  hidden: true,
                  keepAlive: true,
                  permission: ['user'],
                },
              },
              {
                path: '/account/settings/custom',
                name: 'CustomSettings',
                component: () => import('@/views/account/settings/Custom'),
src/views/account/settings/Index.vue
@@ -19,6 +19,11 @@
                {{ $t('account.settings.menuMap.security') }}
              </router-link>
            </a-menu-item>
            <a-menu-item key="/account/settings/googleAuthCode">
              <router-link :to="{ name: 'GoogleAuthCode' }">
                绑定谷歌验证器
              </router-link>
            </a-menu-item>
            <!-- <a-menu-item key="/account/settings/custom">
              <router-link :to="{ name: 'CustomSettings' }">
                {{ $t('account.settings.menuMap.custom') }}
src/views/account/settings/googleAuthCode.vue
New file
@@ -0,0 +1,233 @@
<template>
  <div class="account-settings-info-view">
    <a-form layout="vertical" :form="addUserform" ref="addUserform" v-if="!googleAuthBind">
      <a-row :gutter="16" type="flex" justify="center">
        <a-col :order="isMobile ? 2 : 1" :md="24" :lg="16">
          <a-form-item label="秘钥">
            <a-input
              placeholder="请点击右侧 生成秘钥和二维码"
              readonly
              @click="handleCopy"
              :addonAfter="addonContent"
              v-decorator="['secret', { rules: [{ required: false, message: '请输入您的昵称' }] }]"
            />
            <img v-if="googleAuthimg" style="width: 100px;margin-top:10px;" :src="googleAuthimg"/>
          </a-form-item>
          <a-form-item label="谷歌验证码">
            <a-input
              placeholder="请输入谷歌验证码"
              v-decorator="['googleAuthCode', { rules: [{ required: true, message: '请输入谷歌验证码' }] }]"
            />
          </a-form-item>
          <!-- <a-form-item label="超级谷歌验证码">
            <a-input
              placeholder="请输入超级谷歌验证码"
              v-decorator="['rootGoogleAuthCode', { rules: [{ required: true, message: '请输入超级谷歌验证码' }] }]"
            />
          </a-form-item> -->
          <a-form-item>
            <a-button type="primary" @click="saveinfo">绑定</a-button>
          </a-form-item>
        </a-col>
      </a-row>
    </a-form>
    <div v-else style="">
      <div style="margin-bottom: 20px;">已绑定</div>
      <a-form-item label="谷歌验证码">
        <a-input
          placeholder="请输入谷歌验证码"
          v-model="ggyzm"
          v-decorator="['googleAuthCode', { rules: [{ required: true, message: '请输入谷歌验证码' }] }]"
        />
      </a-form-item>
      <a-button type="primary" @click="adskille">解绑</a-button>
    </div>
    <avatar-modal ref="modal" @ok="setavatar" />
  </div>
</template>
<script>
import AvatarModal from './AvatarModal'
import { baseMixin } from '@/store/app-mixin'
import { adminlist, adminupdate,bindGoogleAuth,getLoginGoogleAuthSecret,getAdmin,unbindingGoogleAuth } from '@/api/managesettings'
import pick from 'lodash.pick'
export default {
  mixins: [baseMixin],
  components: {
    AvatarModal,
  },
  data() {
    return {
      // cropper
      addonContent: (
              <a
                onClick={this.handleGenerate} // 这里是点击事件
              >
                生成秘钥和二维码
              </a>
      ),
      preview: {},
      googleAuthimg:'',
      ggyzm:'',
      userid:'',
      googleAuthBind:'',
      option: {
        img: '/avatar2.jpg',
        info: true,
        size: 1,
        outputType: 'jpeg',
        canScale: false,
        autoCrop: true,
        // 只有自动截图开启 宽度高度才生效
        autoCropWidth: 180,
        autoCropHeight: 180,
        fixedBox: true,
        // 开启宽度和高度比例
        fixed: true,
        fixedNumber: [1, 1],
      },
      settingdetail: {},
      addUserform: this.$form.createForm(this),
      fields: ['googleAuthCode', 'secret','id'],
    }
  },
  mounted() {
    this.getnowuser()
  },
  methods: {
    adskille(){
          var values ={}
          values.rootGoogleAuthCode = this.ggyzm
          values.id = this.userid
          unbindingGoogleAuth(values).then((res) => {
            if (res.status == 0) {
              this.getnowuser()
              this.$message.success({ content: '解绑成功', duration: 2 });
              form.resetFields();
            } else {
              this.$message.error(res.msg);
            }
          });
    },
    getnowuser() {
      getAdmin().then((res) => {
        if(res.status==0){
          this.userid = res.data.id
          this.googleAuthBind = res.data.googleAuthBind
        }
        console.log(res);
      })
    },
    setavatar(url) {
      this.option.img = url
    },
    handleCopy() {
          // 使用浏览器的 execCommand 来实现复制功能
          const input = document.createElement('input');
          input.value = this.addUserform.getFieldValue('secret');  // 这里用你的秘钥变量
          document.body.appendChild(input);
          input.select();
          document.execCommand('copy');
          document.body.removeChild(input);
          this.$message.success('秘钥已复制');
     },
    handleGenerate() {
      getLoginGoogleAuthSecret().then((res) => {
        if (res.status == 0) {
          // this.$set(this.$refs.addUserform.form, 'secret', res.data.googleAuthSecret);
          this.addUserform.setFieldsValue({
            secret: res.data.googleAuthSecret,
          })
          this.googleAuthimg = res.data.googleAuthImg;
        } else {
          this.$message.error(res.msg);
        }
      });
    },
    saveinfo() {
      const form = this.$refs.addUserform.form;
      form.validateFields((errors, values) => {
        if (!errors) {
          values.id = this.userid
          bindGoogleAuth(values).then((res) => {
            if (res.status == 0) {
              this.getnowuser()
              this.$message.success({ content: '绑定成功', duration: 2 });
              form.resetFields();
              this.getnowuser();
            } else {
              this.$message.error(res.msg);
            }
          });
        }
      });
    }
  },
}
</script>
<style lang="less" scoped>
.avatar-upload-wrapper {
  height: 200px;
  width: 100%;
}
.ant-upload-preview {
  position: relative;
  margin: 0 auto;
  width: 100%;
  max-width: 180px;
  border-radius: 50%;
  box-shadow: 0 0 4px #ccc;
  .upload-icon {
    position: absolute;
    top: 0;
    right: 10px;
    font-size: 1.4rem;
    padding: 0.5rem;
    background: rgba(222, 221, 221, 0.7);
    border-radius: 50%;
    border: 1px solid rgba(0, 0, 0, 0.2);
  }
  .mask {
    opacity: 0;
    position: absolute;
    background: rgba(0, 0, 0, 0.4);
    cursor: pointer;
    transition: opacity 0.4s;
    &:hover {
      opacity: 1;
    }
    i {
      font-size: 2rem;
      position: absolute;
      top: 50%;
      left: 50%;
      margin-left: -1rem;
      margin-top: -1rem;
      color: #d6d6d6;
    }
  }
  img,
  .mask {
    width: 100%;
    max-width: 180px;
    height: 100%;
    border-radius: 50%;
    overflow: hidden;
  }
}
</style>
<style>
</style>
src/views/user/Login.vue
@@ -36,6 +36,18 @@
              <a-icon slot="prefix" type="lock" :style="{ color: 'rgba(0,0,0,.25)' }" />
            </a-input-password>
          </a-form-item>
          <a-form-item>
            <a-input
              size="large"
              type="number"
              placeholder="请输入谷歌验证码"
              v-decorator="[
                'googleAuthCode',
                { rules: [], validateTrigger: 'change' }
              ]">
            </a-input>
          </a-form-item>
        </a-tab-pane>
        <!-- <a-tab-pane key="tab2" :tab="$t('user.login.tab-login-mobile')">
          <a-form-item>
@@ -174,7 +186,7 @@
      state.loginBtn = true
      const validateFieldsKey = customActiveKey === 'tab1' ? ['username', 'password'] : ['mobile', 'captcha']
      const validateFieldsKey = customActiveKey === 'tab1' ? ['username', 'password' ,'googleAuthCode'] : ['mobile', 'captcha']
      validateFields(validateFieldsKey, { force: true }, (err, values) => {
        if (!err) {
@@ -183,6 +195,7 @@
          const loginParams = {}
          loginParams.adminPhone = values.username
          loginParams.adminPwd = values.password
          loginParams.googleAuthCode = values.googleAuthCode
          loginParams.verifyCode = 1234
          Login(loginParams)
            .then((res) => this.loginSuccess(res))
src/views/userlist/components/editCapitaluserdialog.vue
@@ -66,6 +66,8 @@
          return `沙特(${value.symbol} ${value.availableBalance})`
        case 'USDT':
          return `USDT( ${value.availableBalance})`
          case 'JP':
            return `JP( ${value.availableBalance})`
        default:
          break
      }
@@ -109,7 +111,7 @@
  },
  methods: {
    getEditorder(val) {
      val.accectType = 'ST'
      val.accectType = 'JP'
      this.currentDetails = val
      this.editUserdialog = true
      this.fields.forEach((v) => this.editUserform.getFieldDecorator(v))