罗广辉
2025-11-06 6b37a109ee12c3e1ae1d701f125d32df5cc1c113
Merge remote-tracking branch 'origin/master'
11 files modified
2 files added
463 ■■■■ changed files
src/manifest.json 10 ●●●●● patch | view | raw | blame | history
src/pages/login/index.vue 376 ●●●● patch | view | raw | blame | history
src/pages/user/index.vue 77 ●●●● patch | view | raw | blame | history
src/static/images/app-logo.png patch | view | raw | blame | history
src/static/images/tabbar/icon_home1.png patch | view | raw | blame | history
src/static/images/tabbar/icon_home2.png patch | view | raw | blame | history
src/static/images/tabbar/icon_home_selected.png patch | view | raw | blame | history
src/static/images/tabbar/icon_list.png patch | view | raw | blame | history
src/static/images/tabbar/icon_list_selected.png patch | view | raw | blame | history
src/static/images/tabbar/icon_me.png patch | view | raw | blame | history
src/static/images/tabbar/icon_me_selected.png patch | view | raw | blame | history
src/static/images/tabbar/icon_order.png patch | view | raw | blame | history
src/static/images/tabbar/icon_order_selected.png patch | view | raw | blame | history
src/manifest.json
@@ -58,7 +58,15 @@
                "dSYMs" : false
            },
            /* SDK配置 */
            "sdkConfigs" : {}
            "sdkConfigs" : {},
            "icons" : {
                "android" : {
                    "hdpi" : "src/static/images/app-logo.png",
                    "xhdpi" : "src/static/images/app-logo.png",
                    "xxhdpi" : "src/static/images/app-logo.png",
                    "xxxhdpi" : "src/static/images/app-logo.png"
                }
            }
        }
    },
    /* 快应用特有相关 */
src/pages/login/index.vue
@@ -1,210 +1,226 @@
<!-- 登录页 -->
<template>
  <view class="login-form-wrap">
    <image class="logo" :src="logoSvg"/>
    <div class="title">掌控智飞</div>
    <div class="user-name">
      <image :src="usernameSvg"/>
      <input
        v-model="loginForm.username"
        placeholder="请输入用户名"
      />
    <view class="login-form-wrap">
        <image class="logo" :src="logoSvg" />
        <div class="title">掌控智飞</div>
        <div class="user-name">
            <image :src="usernameSvg" />
            <input v-model="loginForm.username" placeholder="请输入用户名" />
    </div>
    <div class="pass-word">
      <image :src="passwordSvg"/>
      <input
        v-model="loginForm.password"
        type="password"
        placeholder="请输入密码"
      />
    </div>
        </div>
        <div class="pass-word">
            <image :src="passwordSvg" />
            <input v-model="loginForm.password" type="password" placeholder="请输入密码" />
        </div>
    <button class="login-btn" :style="[inputStyle]" @tap="submit">
      登录
    </button>
        <button class="login-btn" :style="[inputStyle]" @tap="submit">
            登录
        </button>
    <image class="lowerRightCorner" :src="droneSvg"/>
  </view>
        <image class="lowerRightCorner" :src="droneSvg" />
    </view>
</template>
<script setup>
import md5 from "js-md5";
import {loginByUsername} from "@/api/user/index.js";
import {useUserStore} from "@/store/index.js";
import droneSvg from '@/static/images/login/droneSvg.svg'
import usernameSvg from '@/static/images/login/username.svg'
import passwordSvg from '@/static/images/login/password.svg'
import logoSvg from '@/static/images/login/logo.svg'
import {HOME_PATH, LOGIN_PATH, removeQueryString} from "@/router";
    import md5 from "js-md5";
    import {
        loginByUsername
    } from "@/api/user/index.js";
    import {
        useUserStore
    } from "@/store/index.js";
    import droneSvg from '@/static/images/login/droneSvg.svg'
    import usernameSvg from '@/static/images/login/username.svg'
    import passwordSvg from '@/static/images/login/password.svg'
    import logoSvg from '@/static/images/login/logo.svg'
    import {
        HOME_PATH,
        LOGIN_PATH,
        removeQueryString
    } from "@/router";
const userStore = useUserStore();
const loginForm = ref({
  username: "",
  password: "",
});
const inputStyle = computed(() => {
  const style = {};
  if (loginForm.value.username && loginForm.value.password) {
    style.color = "#fff";
    style.backgroundColor = '#1D6FE9';
  }
  return style;
});
let redirect = HOME_PATH;
    const userStore = useUserStore();
    const loginForm = ref({
        username: "",
        password: "",
    });
    const inputStyle = computed(() => {
        const style = {};
        if (loginForm.value.username && loginForm.value.password) {
            style.color = "#fff";
            style.backgroundColor = '#1D6FE9';
        }
        return style;
    });
    let redirect = HOME_PATH;
async function submit() {
  let userInfo = {
    tenantId: "000000",
    deptId: "",
    roleId: "",
    username: loginForm.value.username,
    password: loginForm.value.password,
    type: "account",
    code: "",
    key: "",
  };
  loginByUsername(
    userInfo.tenantId,
    userInfo.deptId,
    userInfo.roleId,
    userInfo.username,
    md5(userInfo.password),
    userInfo.type,
    userInfo.key,
    userInfo.code
  ).then((res) => {
    userStore.setUserInfo(res.data);
    uni.reLaunch({
      url: "/pages/user/index",
    });
  });
}
    async function submit() {
        let userInfo = {
            tenantId: "000000",
            deptId: "",
            roleId: "",
            username: loginForm.value.username,
            password: loginForm.value.password,
            type: "account",
            code: "",
            key: "",
        };
        try {
            const res = await loginByUsername(
                userInfo.tenantId,
                userInfo.deptId,
                userInfo.roleId,
                userInfo.username,
                md5(userInfo.password),
                userInfo.type,
                userInfo.key,
                userInfo.code
            );
            userStore.setUserInfo(res.data);
            uni.reLaunch({
                url: "/pages/user/index",
            });
        } catch (error) {
            const errorMsg =error.data?.error_description !=="Bad credentials" ? error.data?.error_description:  "登录失败,请重试";
            uni.showToast({
                title: errorMsg,
                icon: "none",
                duration: 2000
            });
onLoad((options) => {
  if (options.redirect && removeQueryString(options.redirect) !== LOGIN_PATH) {
    redirect = decodeURIComponent(options.redirect);
  }
});
        }
    }
    onLoad((options) => {
        if (options.redirect && removeQueryString(options.redirect) !== LOGIN_PATH) {
            redirect = decodeURIComponent(options.redirect);
        }
    });
</script>
<style lang="scss" scoped>
.login-form-wrap {
  position: relative;
  text-align: center;
  height: 100%;
  width: 100%;
    .login-form-wrap {
        position: relative;
        text-align: center;
        height: 100%;
        width: 100%;
  .logo {
    width: 127px;
    height: 51px;
    margin: 0 auto;
    margin-top: 104px;
    margin-bottom: 16px;
  }
        .logo {
            width: 127px;
            height: 51px;
            margin: 0 auto;
            margin-top: 104px;
            margin-bottom: 16px;
        }
  .lowerRightCorner {
    position: absolute;
    right: 0;
    bottom: 0;
    width: 425.61rpx;
    height: 316.46rpx;
  }
        .lowerRightCorner {
            position: absolute;
            right: 0;
            bottom: 0;
            width: 425.61rpx;
            height: 316.46rpx;
        }
  .title {
    font-family: YouSheBiaoTiHei, YouSheBiaoTiHei;
    font-weight: 400;
    font-size: 84rpx;
    line-height: 82rpx;
    letter-spacing: 1px;
    text-shadow: 0px 8px 8px rgba(0, 0, 0, 0.18);
    text-align: center;
    font-style: normal;
    text-transform: none;
    color: #1452D3;
    text-align: center;
    margin-bottom: 168rpx;
  }
  .user-name,.pass-word {
    display: flex;
    //justify-content: center;
    align-items: center;
    margin-left: 62rpx;
    margin-right: 58rpx;
    height: 118rpx;
    border-bottom: 2rpx solid #E3E3E3;
    image {
      width: 40rpx;
      height: 40rpx;
      margin-right: 12rpx;
    }
    :deep(uni-input) {
      height: 40rpx;
      line-height: 40rpx;
      width: 80%;
      margin-top: 20rpx;
    }
    :deep(.uni-input-placeholder) {
      font-size: 32rpx;
      color: #E3E3E3;
      font-weight: 500;
    }
    //:deep(.uni-input-input) {
    //  top: 10px !important;
    //}
  }
  .pass-word {
  }
        .title {
            font-family: YouSheBiaoTiHei, YouSheBiaoTiHei;
            font-weight: 400;
            font-size: 84rpx;
            line-height: 82rpx;
            letter-spacing: 1px;
            text-shadow: 0px 8px 8px rgba(0, 0, 0, 0.18);
            text-align: center;
            font-style: normal;
            text-transform: none;
            color: #1452D3;
            text-align: center;
            margin-bottom: 168rpx;
        }
  input {
    @apply pb-6rpx mb-10rpx text-left;
  }
        .user-name,
        .pass-word {
            display: flex;
            //justify-content: center;
            align-items: center;
            margin-left: 62rpx;
            margin-right: 58rpx;
            height: 118rpx;
            border-bottom: 2rpx solid #E3E3E3;
  .tips {
    @apply mt-8rpx mb-60rpx;
            image {
                width: 40rpx;
                height: 40rpx;
                margin-right: 12rpx;
            }
    color: $u-info;
  }
            :deep(uni-input) {
                height: 40rpx;
                line-height: 40rpx;
                width: 80%;
                margin-top: 20rpx;
            }
  .login-btn {
    z-index: 1;
    @apply flex items-center justify-center py-12rpx px-0 text-30rpx  border-none;
    background: #5a93e6;
    color: white;
    width: 590rpx;
    height: 76rpx;
    border-radius: 40rpx 40rpx 40rpx 40rpx;
    margin-top: 100rpx;
            :deep(.uni-input-placeholder) {
                font-size: 32rpx;
                color: #E3E3E3;
                font-weight: 500;
            }
    &::after {
      @apply border-none;
    }
  }
            //:deep(.uni-input-input) {
            //  top: 10px !important;
            //}
        }
  .alternative {
    @apply flex justify-between mt-30rpx;
        .pass-word {}
    color: $u-tips-color;
  }
}
        input {
            @apply pb-6rpx mb-10rpx text-left;
        }
.login-type-wrap {
  @apply flex justify-between pt-350rpx px-150rpx pb-150rpx;
        .tips {
            @apply mt-8rpx mb-60rpx;
  .item {
    @apply flex items-center flex-col text-28rpx;
            color: $u-info;
        }
    color: $u-content-color;
  }
}
        .login-btn {
            z-index: 1;
            @apply flex items-center justify-center py-12rpx px-0 text-30rpx border-none;
            background: #5a93e6;
            color: white;
            width: 590rpx;
            height: 76rpx;
            border-radius: 40rpx 40rpx 40rpx 40rpx;
            margin-top: 100rpx;
.hint {
  @apply px-40rpx py-20rpx text-24rpx;
            &::after {
                @apply border-none;
            }
        }
  color: $u-tips-color;
        .alternative {
            @apply flex justify-between mt-30rpx;
  .link {
    color: $u-warning;
  }
}
</style>
            color: $u-tips-color;
        }
    }
    .login-type-wrap {
        @apply flex justify-between pt-350rpx px-150rpx pb-150rpx;
        .item {
            @apply flex items-center flex-col text-28rpx;
            color: $u-content-color;
        }
    }
    .hint {
        @apply px-40rpx py-20rpx text-24rpx;
        color: $u-tips-color;
        .link {
            color: $u-warning;
        }
    }
</style>
src/pages/user/index.vue
@@ -1,48 +1,48 @@
<!-- 我的 -->
<template>
  <view class="page-wrap">
  <view class="userBox">
      <view class="flex items-center pb-30rpx pl-30rpx pr-20rpx">
        <view class="mr-20rpx">
          <u-avatar :src="user.avatar" size="70" />
        </view>
        <view class="flex-1">
          <view class="userName">{{ userStore?.userInfo?.nick_name }}</view>
          <view class="departs">
            <image src="@/static/images/user/mobile.svg" alt="" />
            <span>{{user.deptName}}</span>
          </view>
        </view>
        <view class="rightLogo">
          <image src="@/static/images/user/logo2.png" alt="" />
        </view>
      </view>
      <view class="personalInformation">
        <div class="message">
          <div class="messagebox">个人信息</div>
          <div class="editInfo" @click="handelEdit(1)">点击编辑
            <image src="@/static/images/user/rightBtn.svg" alt="" />
          </div>
        </div>
        <div class="passwordBox">
          <div class="messagebox">修改密码</div>
          <div class="editInfo" @click="handelEdit(2)">点击编辑 <image src="@/static/images/user/rightBtn.svg" alt="" />
          </div>
        </div>
      </view>
    <view class="flex items-center pb-30rpx pl-30rpx pr-20rpx">
      <view class="mr-20rpx">
        <u-avatar :src="user.avatar" size="70" />
      </view>
      <view class="flex-1">
        <view class="userName">{{ userStore?.userInfo?.nick_name }}</view>
        <view class="departs">
          <image src="@/static/images/user/mobile.svg" alt="" />
          <span>{{user.deptName}}</span>
        </view>
      </view>
      <view class="rightLogo">
        <image src="@/static/images/user/logo2.png" alt="" />
      </view>
    </view>
    <view class="personalInformation">
      <div class="message">
        <div class="messagebox">个人信息</div>
        <div class="editInfo" @click="handelEdit(1)">点击编辑
          <image src="@/static/images/user/rightBtn.svg" alt="" />
        </div>
      </div>
      <div class="passwordBox">
        <div class="messagebox">修改密码</div>
        <div class="editInfo" @click="handelEdit(2)">点击编辑 <image src="@/static/images/user/rightBtn.svg" alt="" />
        </div>
      </div>
    </view>
    <view class="mt-20rpx">
      <div class="goOutStyle" @click="logOut">退出登录</div>
    </view>
    <div class="bottomLogo"><image src="@/static/images/user/logo1.png" alt="" /></div>
      <view class="mt-20rpx">
        <div class="goOutStyle" @click="logOut">退出登录</div>
      </view>
      <div class="bottomLogo"><image src="@/static/images/user/logo1.png" alt="" /></div>
  </view>
  </view>
</template>
<script setup>
  import {
    getUserInfo,
    updateInfo,
    updatePassword
  } from '@/api/user/index.js';
  import {
    useClipboard
@@ -78,7 +78,7 @@
  function getDeviceRegion() {
    getDeviceRegionApi().then(res => {
      // console.log(res.data.data, '用户设备')
    })
  }
  const handelEdit = (val) => {
@@ -113,9 +113,10 @@
    width: 100%;
    height: 100%;
    padding-top: 88rpx;
  }
.userBox {
     padding-top: 88rpx;
}
  .userName {
    font-weight: 700;
    font-size: 36rpx;
src/static/images/app-logo.png
src/static/images/tabbar/icon_home1.png

src/static/images/tabbar/icon_home2.png
src/static/images/tabbar/icon_home_selected.png

src/static/images/tabbar/icon_list.png

src/static/images/tabbar/icon_list_selected.png

src/static/images/tabbar/icon_me.png

src/static/images/tabbar/icon_me_selected.png

src/static/images/tabbar/icon_order.png

src/static/images/tabbar/icon_order_selected.png