microsoft applocale怎么用(巫师之昆特牌组牌闪退怎么办解决方法详解)
applocale怎么用文章列表:
- 1、巫师之昆特牌组牌闪退怎么办解决方法详解
- 2、工作中,前端开发要看项目,怎么查看别人的js项目代码
- 3、如何从零开始搭建顾客签到小程序?二---云开发入门教程
- 4、在 Linux 中使用组合键输入隐藏的字形
- 5、Linux标准化设置-系统环境标准化、分区标准化、系统配置标准化等
巫师之昆特牌组牌闪退怎么办解决方法详解
《巫师之昆特牌》组牌界面闪退怎么解决?不少玩家遇到了这个问题,下面6399小编就为大家分享《巫师之昆特牌》组牌闪退解决方法,一起来看看吧。
巫师之昆特牌组牌闪退解决方法:
组牌闪退的是系统区域或者说编码导致的,可以用ntleas或applocale转码工具加载软件,建议设置区域为波兰。
也可以直接下载下面这个闪退补丁使用,补丁为ntleas软件,已整合昆特牌的转码配置。
以上就是6399小编雪风带来的攻略,更多详细内容请持续关注6399游戏~
工作中,前端开发要看项目,怎么查看别人的js项目代码
怎么看别人的项目
进入公司后,不可能一直做新项目,大多数都是从上一个同事的项目手上开始入手,或者说参与到团队中来开发项目;因此读懂一个项目并能快速的实践是重中之重。下面我将对新手入职新公司怎么了解的项目讲一讲我的见解。
项目介绍
常用的项目,有项目介绍,如果优先从项目介绍入手,这是上手项目最快速的方式,比如:
Vue-Admin 是一个基于 Vue3.0、Vite、 Ant-Design-Vue、TypeScript 的后台解决方案,目标是为开发中大型项目提供开箱即用的解决方案。包括二次封装组件、utils、hooks、动态菜单、权限校验、按钮级别权限控制等功能。项目会使用前端较新的技术栈,可以作为项目的启动模版,以帮助你快速搭建企业级中后台产品原型。也可以作为一个示例,用于学习 vue3、vite、ts 等主流技术。该项目会持续跟进最新技术,并将其应用在项目中。
以上没有怎么办:
依赖文件
看 package.json 比如:
{ "name": "name", "version": "3.8.1", "description": "管理系统", "author": "管理系统", "license": "MIT", "scripts": { "dev": "vite", "build:prod": "vite build", "build:stage": "vite build --mode staging", "preview": "vite preview" }, "dependencies": { "@element-plus/icons-vue": "0.2.6", "axios": "0.24.0", "echarts": "5.2.2", "element-plus": "2.0.1", "file-saver": "2.0.5", "fuse.js": "6.4.6", "js-cookie": "3.0.1", "jsencrypt": "3.2.1", "nprogress": "0.2.0", "vue": "3.2.26", "vue-cropper": "1.0.2", "vue-router": "4.0.12", "vuex": "4.0.2" }, "devDependencies": { "@vitejs/plugin-vue": "1.9.4", "@vue/compiler-sfc": "3.2.22", "sass": "1.45.0", "unplugin-auto-import": "0.5.3", "vite": "2.6.14", "vite-plugin-compression": "0.3.6", "vite-plugin-svg-icons": "1.0.5", "vite-plugin-vue-setup-extend": "0.1.0" }}
从上dependencies中可以可以看出,使用了 vue3、axios、icons图标、echarts图表、elementUI、file-saver导出文件、js-cookie、nprogress进度条、路由,数据缓存、复制、加密等等一些功能;
devDependencies中能看到使用的工具,如vite、saas等。
大致用的功能已经知道了,那么就从入口文件开始查看。
配置文件
vite.config.js 或 vue.config.js (React则看React相关的配置文件如craco.configjs等) 配置文件不会做太多事,一般都是解析,编译,优化等,主要看看常用的一些快捷功能,方便后面直接使用;如:
图表:
import svgIcon from 'vite-plugin-svg-icons'import path from 'path'export default function createSvgIcon(isBuild) { return svgIcon({ iconDirs: [path.resolve(process.cwd(), 'src/assets/icons/svg')], symbolId: 'icon-[dir]-[name]', svgoOptions: isBuild })}
全局配置:
// 部署生产环境和开发环境下的URL。 // 默认情况下,Vue CLI 会假设你的应用是被部署在一个域名的根路径上 // 例如 https://www.xxx.xxx/。如果应用被部署在一个子路径上,你就需要用这个选项指定这个子路径。例如,如果你的应用被部署在 https://www.xxx.xxx/admin/,则设置 baseUrl 为 /admin/。 publicPath: process.env.NODE_ENV === "production" ? "/" : "/", // 在npm run build 或 yarn build 时 ,生成文件的目录名称(要和baseUrl的生产环境路径一致)(默认dist) outputDir: 'dist', // 用于放置生成的静态资源 (js、css、img、fonts) 的;(项目打包之后,静态资源会放在这个文件夹下) assetsDir: 'static', // 是否开启eslint保存检测,有效值:ture | false | 'error' lintOnSave: process.env.NODE_ENV === 'development', // 如果你不需要生产环境的 source map,可以将其设置为 false 以加速生产环境构建。 productionSourceMap: false,
别名:
{ alias: { // 设置路径 '~': path.resolve(__dirname, './'), // 设置别名 '@': path.resolve(__dirname, './src') }, extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.vue']},
跨域: 主要处理请求后端接口是:
proxy: { '/dev-api': { target: 'http://localhost:8080', changeOrigin: true, rewrite: (p) => p.replace(/^/dev-api/, '') }}
入口文件
main.js 基本形式就像下面这样,所有的配置都是从这里查找,有的是直接在main.js中可以看,有的是引用,通过引用再去里面看,比如store数据共享,router路由配置都是在里面;
import { createApp } from 'vue'import Cookies from 'js-cookie'import ElementPlus from 'element-plus'import locale from 'element-plus/lib/locale/lang/zh-cn' // 中文语言import '@/assets/styles/index.scss' // global cssimport App from './App'import store from './store'import router from './router'import directive from './directive' // directive// 注册指令import plugins from './plugins' // pluginsimport { download } from '@/utils/request'// svg图标import 'virtual:svg-icons-register'import SvgIcon from '@/components/SvgIcon'import elementIcons from '@/components/SvgIcon/svgicon'/** * permission这个是权限 , 一搬会做一些请求或打开页面前的操作,如身份验证,用户登录有效期等 * */import './permission' // permission controlimport { useDict } from '@/utils/dict'import { parseTime, resetForm, addDateRange, handleTree, selectDictLabel } from '@/utils/ruoyi'// 分页组件import Pagination from '@/components/Pagination'// 自定义表格工具组件import RightToolbar from '@/components/RightToolbar'// 文件上传组件import FileUpload from "@/components/FileUpload"// 图片上传组件import ImageUpload from "@/components/ImageUpload"// 图片预览组件import ImagePreview from "@/components/ImagePreview"// 自定义树选择组件import TreeSelect from '@/components/TreeSelect'// 字典标签组件import DictTag from '@/components/DictTag'const app = createApp(App)// 全局方法挂载app.config.globalProperties.useDict = useDictapp.config.globalProperties.download = downloadapp.config.globalProperties.parseTime = parseTimeapp.config.globalProperties.resetForm = resetFormapp.config.globalProperties.handleTree = handleTreeapp.config.globalProperties.addDateRange = addDateRangeapp.config.globalProperties.selectDictLabel = selectDictLabel// 全局组件挂载app.component('DictTag', DictTag)app.component('Pagination', Pagination)app.component('TreeSelect', TreeSelect)app.component('FileUpload', FileUpload)app.component('ImageUpload', ImageUpload)app.component('ImagePreview', ImagePreview)app.component('RightToolbar', RightToolbar)app.use(router)app.use(store)app.use(plugins)app.use(elementIcons)app.component('svg-icon', SvgIcon)directive(app)// 使用element-plus 并且设置全局的大小app.use(ElementPlus, { locale: locale, // 支持 large、default、small size: Cookies.get('size') || 'default'})app.mount('#app')
权限、路由拦截
一般就是去登录页,或去其它的页面,获取用信息等常用操作
NProgress.configure({ showSpinner: false })// 以下是白名单不需要操作const whiteList = ['/login', '/auth-redirect', '/bind', '/register']router.beforeEach((to, from, next) => { NProgress.start() if (getToken()) { to.meta.title && store.dispatch('settings/setTitle', to.meta.title) /* has token*/ if (to.path === '/login') { next({ path: '/' }) NProgress.done() } else { if (store.getters.roles.length === 0) { // 判断当前用户是否已拉取完user_info信息 store.dispatch('GetInfo').then(() => { store.dispatch('GenerateRoutes').then(accessRoutes => { // 根据roles权限生成可访问的路由表 router.addRoutes(accessRoutes) // 动态添加可访问路由表 next({ ...to, replace: true }) // hack方法 确保addRoutes已完成 }) }).catch(err => { store.dispatch('LogOut').then(() => { Message.error(err) next({ path: '/' }) }) }) } else { next() } } } else { // 没有token if (whiteList.indexOf(to.path) !== -1) { // 在免登录白名单,直接进入 next() } else { next(`/login?redirect=${to.fullPath}`) // 否则全部重定向到登录页 NProgress.done() } }})router.afterEach(() => { NProgress.done()})
目录结构
大多数项目都是这样的结构,命名方式也好阅读
├── vue.config.js/ # webpack 配置文件;├── config/ # 与项目构建相关的常用的配置选项;│ ├── index.js # 主配置文件│ ├── src/ │ ├── main.js # webpack 的入口文件;│ ├── App.vue # APP页面入口│ ├── assets/ # 共用的代码以外的资源,如:图片、图标、视频 等;│ ├── api/ # 网络模块,如:接口;│ ├── router/ # 路由模块│ ├── I18n/ # 国际化模块│ ├── directive/ # 指令│ ├── vuex/ # 组件共享状态│ ├── libs/ # 工具│ ├── components/ # 共用的组件;; 这里的存放的组件应该都是展示组件│ │ ├── base/ # 基本组件,如:共用的弹窗组件,loading加载组件,提示组件。 │ ├── utils/ # 共用的资源,如:常用的图片、图标,共用的组件、模块、样式,常量文件等等; │ │ ├── util/ # 自己封装的一些工具│ │ └── ... │ ├── layout # 公共局页面;│ └── view/ # 存放项目业务代码;│ ├── home # 首页;│ ├── application-service # 应用服务│ ├── image # 镜像│ ├── team # 团队成员│ ├── code-manage # 代码管理├── App.vue # app 的根组件;├── public/ # 纯静态资源,该目录下的文件不会被webpack处理,该目录会被拷贝到输出目录下; ├── .babelrc # babel 的配置文件├── .editorconfig # 编辑器的配置文件;可配置如缩进、空格、制表类似的参数;├── .eslintrc.js # eslint 的配置文件├── .eslintignore # eslint 的忽略规则├── .gitignore # git的忽略配置文件├── jsconfig.json # 别名配置,用于ctrl 鼠标左建查看文件├── package.json # npm包配置文件,里面定义了项目的npm脚本,依赖包等信息└── README.md # 项目信息文档
统一接口请求
一搬做一些常用的请求,报错,权限认证,取消请求等:
配置
超时
请求地址
头部信息
请求前处理
Authorization
重复提交
post、get特殊处理
失败或异常
响应拦截器
状态码
错误信息
二进制数据则直接返回
401
500
非200
错误或异常
全局配置
常用的一些配置,这些配置一定是整个项目中经常出现的部分才会用到;
一搬在main.js中出现如下:
全局指令
hasRole按钮权限等
hasPermission角色权限
全局方法
下载
时间
日期等
全局组件
分页
上传
图片预览
标签等
公共组件
常用的一些公共组件,这些组件常用,或某一些页面中要用到;如下:
表单
table
动画
时间
图片裁剪
编辑器
弹窗
抽屉
详情
验证
二维码
上传
加载
图标
打印
水印
日志
常用工具
常用的一些功能如下:
右键
缓存
权限密码等生成
字典数据
常用报错或提示
表格时间格式化
克隆
合并
截流
防抖
首字母大小
验证等
路由配置
404报错
401没有权限
最外层封装
左侧栏目
导航栏目
标签
重定向
全局匹配
数据配置
数据比较简单就是常有的一些功能如下:
modules 模块部分
app 平台信息
user 用户信息
其它的和官方说明的基本一样。
最后
项目讲到这里就讲完了,基本就是几项操作就能看到别人完整的配置流程,公共代码,这样就能快速上手操作了。
README.md 帮助文档
package.json 配置
main.js 入口
全局组件
全局方法
全局指令
router 路由
store 数据存储
components 公共组件
utils 常用工具
如何从零开始搭建顾客签到小程序?二---云开发入门教程
导语:在如何从零开始搭建顾客签到小程序?(一)中,已经搭建起顾客登陆、获取用户openid、转到教练列表两个微信小程序的页面。在前端页面和后端云服务器之间建立了联系。本文将继续讲解如何把签到信息存至云数据库,以及如何从云数据库中获取信息查询记录的功能实现。
第四步、实现顾客签到页面和功能
一、顾客签到功能的流程图
二、打开微信开发者工具,导入顾客签到小程序项目,左侧文件树中“jiaolian1、jiaolian2"两个目录就是用户签到页面
三、点击”jiaolian1.wxml”文件,内容替换成如下代码:
<!-- 顾客签到 -->
<view class="userinfo">
<view>
<button
bindtap="onAdd">点击签到</button>
</view>
<view > {{ qiandao }} </view>
</view>
<view class="userinfo">
<view>
<button bindtap="sumOnQuery" >顾客签到总数:</button>
</view>
<view>{{ message }}节课 </view>
</view>
<button class="userinfo" bindtap="onQuery" >点击查询记录</button>
四、紧接着点击“jiaolian.js"文件,把内容替换成如下代码:
//index.js
const app = getApp(); //定义变量
const db = wx.cloud.database({}); //调用云数据库
const cont = db.collection('jiaolian1'); //指明要操作的数据集是"jiaolian1"
Page({ //定义页面数据
data: {
},
onLoad: function() { //默认加载获取用户信息
wx.getUserInfo({ //获取用户信息
withCredentials:true, //授权鉴证
success: res => {
var userInfo = res.userInfo
app.globalData.nickName = userInfo.nickName //用户眤称赋值
var gender = userInfo.gender //用户性别赋值
var myDate = new Date() //获取当前时间
app.globalData.mydate = myDate.toDateString() //截止到日期的时间
app.globalData.mytime = myDate.toLocaleString() //截止到毫秒的时间
app.globalData.avatarUrl = userInfo.avatarUrl //头像
if (gender = 1) { app.globalData.gen = "先生" } //对性别符号进行判断,1是先生
else { app.globalData.gen = "女士" } //0是女士
this.setData({
avatarUrl: res.userInfo.avatarUrl,
userInfo: res.userInfo
})
}, //下面是一些”预留退路“的保障代码
fail: function () {
//获取用户信息失败后。请跳转授权页面
wx.showModal({
title: '警告',
content: '尚未进行授权,请点击确定跳转到授权页面进行授权。',
success: function (res) {
if (res.confirm) {
console.log('用户点击确定')
wx.navigateTo({
url: '../tologin/tologin',
})
}
}
})
},
})
if (!wx.cloud) {
wx.redirectTo({
url: '../chooseLib/chooseLib',
})
return
}
// 查询当前用户所有的 counters //为下面防止用户重复签到提供对比记录
db.collection('jiaolian1').count().then(res =>{
console.log(res.total)
this.setData({
message : res.total
})
})
},
onAdd:function() { //点击签到按钮功能函数
const db = wx.cloud.database()
db.collection('jiaolian1').where({_openid:app.globalData.openid}).get({
success:res =>{ //上面用where定义是不同用户的签到
var newdate = app.globalData.mydate //判断两次签到是否同一天
var len = res.data.length //记录的长度
console.log(len)
console.log(newdate)
if(len===0){ //如果当天没有记录,该用户可以新增签到
db.collection('jiaolian1').add({ //在数据库中写入签到信息
data: {
nickname: app.globalData.nickName, //包括了呢称、签到时间等
mytime:app.globalData.mytime,
avatarUrl:app.globalData.avatarUrl,
gen: app.globalData.gen,
mydate: app.globalData.mydate,
biaozhi:1
},
})
console.log('今日第一次签到!')
}
var olddate = res.data[res.data.length-1].mydate
if(len>0 & olddate!=newdate){ //如果该用户签到记录大于0但相隔时间超过一天
db.collection('jiaolian1').add({ //也往数据库里写入新增签到信息
data: {
nickname: app.globalData.nickName, //包括了呢称、签到时间等
mytime:app.globalData.mytime,
avatarUrl:app.globalData.avatarUrl,
gen: app.globalData.gen,
mydate: app.globalData.mydate,
biaozhi:1
},
success: res => {
// 在返回结果中会包含新创建的记录的 _id
this.setData({
counterId: res._id,
count: 1
})
wx.showToast({
title: '签到成功',
})
console.log('[数据库] [新增记录] 成功,记录 _id: ',res._id)
},
fail: err => { //下面是一些”预留退路“的保障代码
wx.showToast({
icon: 'none',
title: '新增记录失败'
})
console.error('[数据库] [新增记录] 失败:', err)
}
})
}
if(len>0 & olddate==newdate){ //如果同一用户在同一天内签到则拒绝写入
console.log('您今日已经签到!')
this.setData({
qiandao:'您今日已经签到!'
})
}
},
fail:err => {
console.log('读数据失败')
},
})
},
onQuery: function() { //该函数对应查询按钮,是查询所有用户的签到记录
//因为已经过滤了同一天同一用户重复签到,所以所有签到记录就是用户的每日上课记录。
db.collection('jiaolian1').get({
success: res => {
this.setData({
book_list : res.data
})
console.log('[数据库] [查询记录] 成功: ', res)
},
fail: err => {
wx.showToast({
icon: 'none',
title: '查询记录失败'
})
console.error('[数据库] [查询记录] 失败:', err)
}
})
},
sumOnQuery: function() { //该函数对应页面中的统计总次数数据
// 查询当前用户所有的 counters
db.collection('jiaolian1').count().then(res =>{
console.log(res.total)
this.setData({
message : res.total //把顾客签到总次数渲染到页面
})
})
}
})
五、紧接着点击“jiaolian.wxml"文件,把内容替换成如下代码:
/* pages/main/main.wxss */
/**index.wxss**/
page {
background: #f6f6f6;
display: flex;
flex-direction: column;
justify-content: flex-start;
}
.uploader-text, .tunnel-text {
width: 100%;
line-height: 52px;
font-size: 34rpx;
color: #007aff;
}
.userinfo, .uploader, .tunnel {
margin-top: 40rpx;
height: 140rpx;
width: 100%;
background: #fff;
border: 1px solid rgba(0, 0, 0, 0.1);
border-left: none;
border-right: none;
display: flex;
flex-direction: row;
align-items: center;
transition: all 300ms ease;
}
六、完成代码编写,按”CTRL S“保存后看看效果
很妙,顾客签到,签到总数以及签到详细记录都显示出来了,功能完整。
七、修改另一个教练"jiaolian2"的文件,把上面代码拷过去,然后把云数据集“jiaolian1”改成“jiaolian2”即可,当然,签到页面中教练的名字也需要改换的。
总结:
1、制订了签到查询功能流程图;
2、编写了查询页面和逻辑功能页面代码函数,实现了签到、查询、统计三项功能;
3、考虑到顾客上课的实际情况,增加了同一个顾客同一天内不能重复签到的判断语句;
这次我们选择了云开发作为小程序开发的方式,只需要编写云函数,大大提高了开发效率。但是云开发只是腾讯云上提供的服务,如果我们想用阿里云服务器的话,还是要设置小程序和服务器之间的系统环境和数据交换。在下一篇文章中,我将讲解如何用python这种全世界最流程的语言,来作为小程序的服务器后端示例。“人生苦短,我用python”。请关注我的头条号,欢迎讨论指正。
如果让你有所思,请多在朋友圈分享本文,让更多人有所获。我是神足自在,编程爱好者,致力于IT工程的实践案例和浅易讲解。
在 Linux 中使用组合键输入隐藏的字形
使用组合键,你不会被键盘所限制住。
典型的键盘只有约 100 个键位。
由于 Shift
键,许多键得以有两个字符(也称之为 字形glyph)。字形常用于键入带有重音和变音符号的字母,生成数学公式或者货币中的符号,或者添加有趣的表情符号。在一些地区,有些键甚至有三个字形。
然而,不论你身处何处,有一些字形不会出现在你的键盘上。幸运的是,Linux 提供了使用 组合键Compose Key 来获取这些字形。
在你的键盘上没有组合键这个键,至少默认情况下没有,但是你可以设定一个你不用的键作为组合键。我在电脑上使用空格键旁边的 Alt
键,而在平板上使用菜单键,来作为组合键。
下载 Linux 组合键速查表
在 GNOME 中设置组合键
在 GNOME 桌面,从软件库中安装 优化Tweaks 应用。你也可以从终端安装(基于 Debian 发行版用 apt
命令,Fedora 用dnf
):
$ sudo dnf install gnome-tweaks
启动优化应用后:
单击左侧栏中的 键盘和鼠标Keyboard & Mouse类别
找到 组合键Compose key 设置并指定一个键
关闭优化应用
在 KDE Plasma 桌面设置组合键
osition of Compose Key" is checked within that menu, and "Right Alt" is checked within that menu." />
在 KDE Plasma 桌面上,打开 系统设置System Settings,找到 输入设备Input Devices 控制界面。然后:
在 输入设备Input Devices 界面,点击 “高级Advanced” 标签
找到 组合键Compose key 列表项并指定一个键
点击右下角 “应用Apply” 按钮,然后关闭 系统设置System Settings
使用组合序列
为了输入隐藏字符,需要按下组合键后松开。这样就可以进入组合模式。处于组合模式,你按下然后松开键,然后再按下一个键来组合字符。
例如:
按下组合键并释放,你会进入组合模式
按下单引号('
)并松开
按下 E
并松开,这是一个有效的组合,所以现在退出了组合模式
你输入了一个字符:é
!
一些组合序列只需要两个键的组合,然而还有一些需要三个键,并且至少有一个特殊字符要按四次键。
变音字符
这是一个很小众的世界,所以你的朋友的名字很有可能使用的字形不是你的键盘原生的字形。你现在可以跳过变音符号并使用适当的修饰符输入名字。
以下是常见变音符号的组合序列示例:
'
=á é í ó ú ? ń y j?? ? ?
`
=à è ì ò ù ? ? ?
~
=? ? ? ? ? ? ?
^
=a ê ? ? ? ? ? ? ? ?
u
=? ? ? ? ?
c c
=?
-
=ā ē ī ō ū ?
,
=? ? ? ? ? ? ? ?
这里仅仅罗列了常见的几个,并不是所有的组合。
货币符号
得益于组合键,国际银行业务也变得容易:
- Y
=¥
- L
=£
= E
=