This commit is contained in:
yangzhe 2025-04-15 10:33:07 +08:00
commit 6cea5b7602
9 changed files with 261 additions and 72 deletions

View File

@ -10,6 +10,24 @@
"navigationBarTitleText": "" "navigationBarTitleText": ""
} }
}, },
{
"path": "pages/adminHome/index",
"style": {
"navigationBarTitleText": "首页"
}
},
{
"path": "pages/adminNfc/index",
"style": {
"navigationBarTitleText": "nfc写入"
}
},
{
"path": "pages/adminMy/index",
"style": {
"navigationBarTitleText": "nfc写入"
}
},
{ {
"path": "pages/login/login", "path": "pages/login/login",
"style": { "style": {
@ -229,17 +247,29 @@
"selectedIconPath": "static/tab/home_cur.png", "selectedIconPath": "static/tab/home_cur.png",
"text": "首页" "text": "首页"
}, },
// {
// "pagePath": "pages/my/index",
// "iconPath": "static/tab/my.png",
// "selectedIconPath": "static/tab/my_cur.png",
// "text": "我的"
// },
{ {
"pagePath": "pages/user/index", "pagePath": "pages/user/index",
"iconPath": "static/tab/my.png", "iconPath": "static/tab/my.png",
"selectedIconPath": "static/tab/my_cur.png", "selectedIconPath": "static/tab/my_cur.png",
"text": "设置" "text": "设置"
},
{
"pagePath": "pages/adminHome/index",
"iconPath": "static/tab/my.png",
"selectedIconPath": "static/tab/my_cur.png",
"text": "首页"
},
{
"pagePath": "pages/adminNfc/index",
"iconPath": "static/tab/my.png",
"selectedIconPath": "static/tab/my_cur.png",
"text": "nfc写入"
},
{
"pagePath": "pages/adminMy/index",
"iconPath": "static/tab/my.png",
"selectedIconPath": "static/tab/my_cur.png",
"text": "我的"
} }
] ]
}, },

30
pages/adminHome/index.vue Normal file
View File

@ -0,0 +1,30 @@
<template>
<view class="content">
<view>管理员首页</view>
<u-tabbar :list="vuex_tabbar"></u-tabbar>
</view>
</template>
<script>
import { loginApi } from "@/api/apiList";
export default {
data() {
return {
phone: "13800451500",
pwd: "123456",
};
},
mounted() {
uni.hideLoading(); // Loading
},
onLoad() {},
methods: {},
};
</script>
<style lang="scss" scoped>
.content {
height: 100vh; //
// background-color: skyblue;
overflow: hidden;
padding-bottom: 100rpx;
}
</style>

30
pages/adminMy/index.vue Normal file
View File

@ -0,0 +1,30 @@
<template>
<view class="content">
<view>管理员--我的</view>
<u-tabbar :list="vuex_tabbar"></u-tabbar>
</view>
</template>
<script>
import { loginApi } from "@/api/apiList";
export default {
data() {
return {
phone: "13800451500",
pwd: "123456",
};
},
mounted() {
uni.hideLoading(); // Loading
},
onLoad() {},
methods: {},
};
</script>
<style lang="scss" scoped>
.content {
height: 100vh; //
// background-color: skyblue;
overflow: hidden;
padding-bottom: 100rpx;
}
</style>

30
pages/adminNfc/index.vue Normal file
View File

@ -0,0 +1,30 @@
<template>
<view class="content">
<view>管理员--NFC</view>
<u-tabbar :list="vuex_tabbar"></u-tabbar>
</view>
</template>
<script>
import { loginApi } from "@/api/apiList";
export default {
data() {
return {
phone: "13800451500",
pwd: "123456",
};
},
mounted() {
uni.hideLoading(); // Loading
},
onLoad() {},
methods: {},
};
</script>
<style lang="scss" scoped>
.content {
height: 100vh; //
// background-color: skyblue;
overflow: hidden;
padding-bottom: 100rpx;
}
</style>

View File

@ -104,6 +104,7 @@
</view> </view>
</view> </view>
</view> </view>
<u-tabbar :list="vuex_tabbar"></u-tabbar>
</view> </view>
</template> </template>
<script> <script>

View File

@ -105,6 +105,7 @@
mode="range" mode="range"
@change="changeDate" @change="changeDate"
></u-calendar> ></u-calendar>
<u-tabbar :list="vuex_tabbar"></u-tabbar>
</view> </view>
</template> </template>

View File

@ -14,10 +14,10 @@
</view> </view>
<u-button type="primary" @click="loginFn" style="margin-top: 50rpx">登陆</u-button> <u-button type="primary" @click="loginFn" style="margin-top: 50rpx">登陆</u-button>
<u-button type="primary" @click="login1Fn" style="margin-top: 50rpx" <u-button type="primary" @click="login1Fn" style="margin-top: 50rpx"
>登陆13800451500</u-button >登陆13800451500管理员</u-button
> >
<u-button type="primary" @click="login2Fn" style="margin-top: 50rpx" <u-button type="primary" @click="login2Fn" style="margin-top: 50rpx"
>登陆18174010562</u-button >登陆18174010562清洁工</u-button
> >
</view> </view>
</template> </template>
@ -40,23 +40,69 @@ export default {
login1Fn() { login1Fn() {
this.phone = "13800451500"; this.phone = "13800451500";
this.pwd = "123456"; this.pwd = "123456";
this.loginFn();
const normalTabBar = [
{
pagePath: "/pages/index/planList",
iconPath: "/static/tab/list.png",
selectedIconPath: "/static/tab/list_cur.png",
text: "计划",
},
{
pagePath: "/pages/index/index",
iconPath: "/static/tab/home.png",
selectedIconPath: "/static/tab/home_cur.png",
text: "首页",
},
{
pagePath: "/pages/user/index",
iconPath: "/static/tab/my.png",
selectedIconPath: "/static/tab/my_cur.png",
text: "设置",
},
];
this.$u.vuex("vuex_tabbar", normalTabBar);
this.loginFn(false);
}, },
login2Fn() { login2Fn() {
this.phone = "18174010562"; this.phone = "18174010562";
this.pwd = "123456"; this.pwd = "123456";
this.loginFn();
const adminTabBar = [
{
pagePath: "/pages/adminHome/index",
iconPath: "/static/tab/list.png",
selectedIconPath: "/static/tab/list_cur.png",
text: "首页",
},
{
pagePath: "/pages/adminNfc/index",
iconPath: "/static/tab/list.png",
selectedIconPath: "/static/tab/list_cur.png",
text: "nfc写入",
},
{
pagePath: "/pages/adminMy/index",
iconPath: "/static/tab/list.png",
selectedIconPath: "/static/tab/list_cur.png",
text: "我的",
},
];
this.$u.vuex("vuex_tabbar", adminTabBar);
this.loginFn(true);
}, },
async loginFn() { //
normalizePath(path) {
return path.startsWith("/") ? path : `/${path}`;
},
async loginFn(type) {
let salt = bcrypt.genSaltSync(12); let salt = bcrypt.genSaltSync(12);
console.log("666");
let req = { let req = {
phone: this.phone, phone: this.phone,
password: bcrypt.hashSync(this.pwd, salt), password: bcrypt.hashSync(this.pwd, salt),
}; };
console.log(req, "req--");
const res = await loginApi(req); const res = await loginApi(req);
console.log(res, "res--");
if (!res.succeed) { if (!res.succeed) {
uni.showToast({ uni.showToast({
title: res.error || "登录失败", title: res.error || "登录失败",
@ -66,16 +112,16 @@ export default {
} }
let token = res.data; let token = res.data;
uni.setStorageSync("token", "Bearer " + token); uni.setStorageSync("token", "Bearer " + token);
uni.switchTab({ let userRole = "admin";
url: "/pages/index/index", if (type) {
success() { uni.switchTab({
console.log("跳转成功"); url: `/pages/index/planList`,
window.initFn = null; // });
}, } else {
fail(err) { uni.switchTab({
console.error("跳转失败", err); url: `/pages/adminHome/index`,
}, });
}); }
}, },
}, },
}; };

View File

@ -59,6 +59,7 @@
</view> </view>
</view> </view>
</view> </view>
<u-tabbar :list="vuex_tabbar"></u-tabbar>
</view> </view>
</template> </template>

View File

@ -4,61 +4,81 @@ Vue.use(Vuex)
let lifeData = {}; let lifeData = {};
try{ try {
// 尝试获取本地是否存在lifeData变量第一次启动APP时是不存在的 // 尝试获取本地是否存在lifeData变量第一次启动APP时是不存在的
lifeData = uni.getStorageSync('lifeData'); lifeData = uni.getStorageSync('lifeData');
}catch(e){ } catch (e) {
} }
// 需要永久存储且下次APP启动需要取出的在state中的变量名 // 需要永久存储且下次APP启动需要取出的在state中的变量名
let saveStateKeys = ['vuex_user', 'vuex_token']; let saveStateKeys = ['vuex_user', 'vuex_token', 'vuex_tabbar'];
// 保存变量到本地存储中 // 保存变量到本地存储中
const saveLifeData = function(key, value){ const saveLifeData = function (key, value) {
// 判断变量名是否在需要存储的数组中 // 判断变量名是否在需要存储的数组中
if(saveStateKeys.indexOf(key) != -1) { if (saveStateKeys.indexOf(key) != -1) {
// 获取本地存储的lifeData对象将变量添加到对象中 // 获取本地存储的lifeData对象将变量添加到对象中
let tmp = uni.getStorageSync('lifeData'); let tmp = uni.getStorageSync('lifeData');
// 第一次打开APP不存在lifeData变量故放一个{}空对象 // 第一次打开APP不存在lifeData变量故放一个{}空对象
tmp = tmp ? tmp : {}; tmp = tmp ? tmp : {};
tmp[key] = value; tmp[key] = value;
// 执行这一步后所有需要存储的变量都挂载在本地的lifeData对象中 // 执行这一步后所有需要存储的变量都挂载在本地的lifeData对象中
uni.setStorageSync('lifeData', tmp); uni.setStorageSync('lifeData', tmp);
} }
} }
const store = new Vuex.Store({ const store = new Vuex.Store({
// 下面这些值仅为示例,使用过程中请删除 // 下面这些值仅为示例,使用过程中请删除
state: { state: {
// 如果上面从本地获取的lifeData对象下有对应的属性就赋值给state中对应的变量 // 如果上面从本地获取的lifeData对象下有对应的属性就赋值给state中对应的变量
// 加上vuex_前缀是防止变量名冲突也让人一目了然 // 加上vuex_前缀是防止变量名冲突也让人一目了然
vuex_user: lifeData.vuex_user ? lifeData.vuex_user : {name: '明月'}, vuex_user: lifeData.vuex_user ? lifeData.vuex_user : { name: '明月' },
vuex_token: lifeData.vuex_token ? lifeData.vuex_token : '', vuex_token: lifeData.vuex_token ? lifeData.vuex_token : '',
// 如果vuex_version无需保存到本地永久存储无需lifeData.vuex_version方式 vuex_tabbar: lifeData.vuex_tabbar ? lifeData.vuex_tabbar : [
vuex_version: '1.0.1', // {
}, // "pagePath": "/pages/adminHome/index",
mutations: { // "iconPath": "/static/tab/my.png",
$uStore(state, payload) { // "selectedIconPath": "/static/tab/my_cur.png",
// 判断是否多层级调用state中为对象存在的情况诸如user.info.score = 1 // "text": "首页"
let nameArr = payload.name.split('.'); // },
let saveKey = ''; // {
let len = nameArr.length; // "pagePath": "/pages/adminNfc/index",
if(nameArr.length >= 2) { // "iconPath": "/static/tab/my.png",
let obj = state[nameArr[0]]; // "selectedIconPath": "/static/tab/my_cur.png",
for(let i = 1; i < len - 1; i ++) { // "text": "nfc写入"
obj = obj[nameArr[i]]; // },
} // {
obj[nameArr[len - 1]] = payload.value; // "pagePath": "/pages/adminMy/index",
saveKey = nameArr[0]; // "iconPath": "/static/tab/my.png",
} else { // "selectedIconPath": "/static/tab/my_cur.png",
// 单层级变量在state就是一个普通变量的情况 // "text": "我的"
state[payload.name] = payload.value; // }
saveKey = payload.name; ],
} // 如果vuex_version无需保存到本地永久存储无需lifeData.vuex_version方式
// 保存变量到本地,见顶部函数定义 vuex_version: '1.0.1',
saveLifeData(saveKey, state[saveKey]) },
} mutations: {
} $uStore(state, payload) {
// 判断是否多层级调用state中为对象存在的情况诸如user.info.score = 1
let nameArr = payload.name.split('.');
let saveKey = '';
let len = nameArr.length;
if (nameArr.length >= 2) {
let obj = state[nameArr[0]];
for (let i = 1; i < len - 1; i++) {
obj = obj[nameArr[i]];
}
obj[nameArr[len - 1]] = payload.value;
saveKey = nameArr[0];
} else {
// 单层级变量在state就是一个普通变量的情况
state[payload.name] = payload.value;
saveKey = payload.name;
}
// 保存变量到本地,见顶部函数定义
saveLifeData(saveKey, state[saveKey])
}
}
}) })
export default store export default store