宝塔下 php的cli 版本怎么切换,非网站的php版本
rm -rf /usr/bin/php
ln -s /www/server/php/82/bin/php /usr/bin/
rm -rf /usr/bin/php
ln -s /www/server/php/82/bin/php /usr/bin/
mysql
一个表中某个字段的值里面的部分字符串,使用mysql replace
函数:UPDATE prezzie_category SET image = REPLACE (image, 'http://localhost:8727','https://a.liziyu.com') where id > 0;
注意,操作之前请先备份表:
CREATE TABLE prezzie_category_bak AS SELECT * FROM prezzie_category;
server
{
listen 80;
# 您的域名
server_name cms.demo.mallray.com;
# 索引文档,建议将 index.html 放在第一个
index index.html
#禁止访问的文件或目录
location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md|package.json|package-lock.json|\.env) {
return 404;
}
# HTTP反向代理相关配置开始 >>>
location / {
# 端口为3000,自定义后请注意修改
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_connect_timeout 30s;
proxy_read_timeout 86400s;
proxy_send_timeout 30s;
proxy_redirect off;
}
# HTTP反向代理相关配置结束 <<<
# 有可能会存在的默认规则-【请删除它们】,否则很多资源会404 - START
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
error_log /dev/null;
access_log /dev/null;
}
location ~ .*\.(js|css)?$
{
expires 12h;
error_log /dev/null;
access_log /dev/null;
}
# 有可能会存在的默认规则-【请删除它们】,否则很多资源会404 - END
}
Node
项目,并添加 Node
项目web-nuxt
根目录start
3000
SSL
证书等<script src="http://crypto-js.googlecode.com/svn/tags/3.0.2/build/rollups/hmac-sha256.js"></script>
<script src="http://crypto-js.googlecode.com/svn/tags/3.0.2/build/components/enc-base64-min.js"></script>
<script>
var hash = CryptoJS.HmacSHA256("Message", "secret");
var hashInBase64 = CryptoJS.enc.Base64.stringify(hash);
document.write(hashInBase64);
</script>
$s = hash_hmac('sha256', 'Message', 'secret', true);
echo base64_encode($s);
func ComputeHmac256(message string, secret string) string {
key := []byte(secret)
h := hmac.New(sha256.New, key)
h.Write([]byte(message))
return base64.StdEncoding.EncodeToString(h.Sum(nil))
}
func main() {
fmt.Println(ComputeHmac256("Message", "secret"))
}
链接: https://pan.baidu.com/s/1HFi-LUVvfEmJsSiNkX43Bg 提取码: 48y8
const wxuuid = function () {
var s = [];
var hexDigits = "0123456789abcdef";
for (var i = 0; i < 36; i++) {
s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
}
s[14] = "4"; // bits 12-15 of the time_hi_and_version field to 0010
s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1); // bits 6-7 of the clock_seq_hi_and_reserved to 01
s[8] = s[13] = s[18] = s[23] = "-";
var uuid = s.join("");
return uuid
};
// store/index.js
import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
export default new Vuex.Store({
state: {
cart: [] // 购物车数据
},
mutations: {
addToCart(state, product) {
state.cart.push(product);
},
removeFromCart(state, productId) {
state.cart = state.cart.filter(item => item.id !== productId);
},
clearCart(state) {
state.cart = [];
}
},
getters: {
cartItems: state => state.cart,
cartTotal: state => state.cart.reduce((total, item) => total + item.price * item.quantity, 0),
}
});
// 添加商品到购物车
function addToCart(product) {
let cart = uni.getStorageSync('cart') || [];
cart.push(product);
uni.setStorageSync('cart', cart);
}
// 获取购物车数据
function getCart() {
return uni.getStorageSync('cart') || [];
}
// 清空购物车
function clearCart() {
uni.removeStorageSync('cart');
}
<template>
<view>
<text>购物车商品列表:</text>
<view v-for="item in cartItems" :key="item.id">
<text>{{ item.name }} - {{ item.price }} (数量: {{ item.quantity }})</text>
</view>
<text>总价: {{ cartTotal }}</text>
</view>
</template>
<script>
import { mapGetters } from 'vuex';
export default {
computed: {
...mapGetters(['cartItems', 'cartTotal']), // 映射 Vuex getters
},
methods: {
// 其他方法
},
mounted() {
// 这里可以进行其他初始化操作
}
};
</script>
<style scoped>
/* 添加你的样式 */
</style>
小结:mapGetters
这是 Vuex
提供的一个辅助函数,可以让你在组件中方便地映射 Vuex
的 getters
到计算属性。通过这种方式,你可以直接使用 cartItems
和 cartTotal
作为组件的计算属性。
permission.js
文件://@unilts/permission.js
// 白名单
const whiteList = [
'/', // 注意入口页必须直接写 '/'
'/pages/tabbar/classify/classify', //分类
'/pages/tabbar/cart/cart', //购物车
{
pattern: /^\/pages\/common\/*/
} //支持正则表达式
];
export default async function() {
const list = ['navigateTo', 'redirectTo', 'reLaunch', 'switchTab']
// 用遍历的方式分别为,uni.navigateTo,uni.redirectTo,uni.reLaunch,uni.switchTab这4个路由方法添加拦截器
list.forEach(item => {
uni.addInterceptor(item, {
invoke(e) {
// 获取要跳转的页面路径(url去掉"?"和"?"后的参数)
const url = e.url.split('?')[0]
// 判断当前窗口是白名单,如果是则不重定向路由
let pass
if (whiteList) {
pass = whiteList.some((item) => {
if (typeof(item) === 'object' && item.pattern) {
return item.pattern.test(url)
}
return url === item
})
}
// 不是白名单并且没有token
let token = uni.getStorageSync('Authorization');
if (!pass && !token) {
// uni.showToast({
// title: '请先登录',
// icon: 'error'
// })
uni.redirectTo({
url: "/pages/common/login/login"
})
return false
}
return e
},
fail(err) { // 失败回调拦截
console.log(err)
}
})
})
}
1、在App.vue
下使用:
import routingIntercept from '@/util/permission.js'
export default {
onLaunch: function() {
console.warn('当前组件仅支持 uni_modules 目录结构 ,请升级 HBuilderX 到 3.1.0 版本以上!');
console.log('App Launch');
// 对路由进行统一拦截,实现路由导航守卫 router.beforeEach 功能
routingIntercept()
},
2、在main.js
下使用:
import routingIntercept from './utils/permission.js'
//对路由进行统一拦截,实现路由导航守卫router.beforeEach功能
routingIntercept()
注意:以上2种使用方式,任选其一即可。
转自:传送门
onLoad
onShow
onReady
onHide
onUnload
onPullDownRefresh
onReachBottom
onMounted()
onUpdated()
onUnmounted()
onBeforeMount()
onBeforeUpdate()
onBeforeUnmount()
onErrorCaptured()
onRenderTracked()
onRenderTriggered()
onActivated()
onDeactivated()
onServerPrefetch()