diff --git a/server.code-workspace b/server.code-workspace
index 744da05..f9fa505 100644
--- a/server.code-workspace
+++ b/server.code-workspace
@@ -8,6 +8,9 @@
},
{
"path": "docs"
+ },
+ {
+ "path": "x_admin_app"
}
]
}
\ No newline at end of file
diff --git a/server/admin/generator/tpl_utils/templates/uniapp/index.vue.tpl b/server/admin/generator/tpl_utils/templates/uniapp/index.vue.tpl
index 882b59b..a4ee898 100644
--- a/server/admin/generator/tpl_utils/templates/uniapp/index.vue.tpl
+++ b/server/admin/generator/tpl_utils/templates/uniapp/index.vue.tpl
@@ -42,12 +42,14 @@
+
{{{- else if or (eq .HtmlType "select") (eq .HtmlType "radio") }}}
+ {{{- if ne .DictType "" }}}
+ {{{- end }}}
{{{- else if eq .HtmlType "input" }}}
{{{- end }}}
@@ -68,7 +70,7 @@ const { dictData } = useDictData([{{{- range .DictFields }}}'{{{ . }}}'{{{- if n
return toast("请输入查询条件");
}
- toPath("/pages/equipment/equipment", search);
+ toPath("/pages/{{{ .ModuleName }}}/index", search);
}
diff --git a/server/admin/generator/tpl_utils/tpl.go b/server/admin/generator/tpl_utils/tpl.go
index 3cc154a..24799be 100644
--- a/server/admin/generator/tpl_utils/tpl.go
+++ b/server/admin/generator/tpl_utils/tpl.go
@@ -170,6 +170,7 @@ func (tu templateUtil) GetTemplatePaths(genTpl string) []string {
"uniapp/index.vue.tpl",
"uniapp/details.vue.tpl",
"uniapp/search.vue.tpl",
+ "uniapp/pages.json.tpl",
}
if genTpl == GenConstants.TplCrud {
tplPaths = append(tplPaths, "vue/index.vue.tpl")
@@ -223,11 +224,12 @@ func (tu templateUtil) GetFilePaths(tplCodeMap map[string]string, ModuleName str
"vue/index.vue.tpl": strings.Join([]string{"admin/src/views/", ModuleName, "/index.vue"}, ""), // "admin/src/views/%s/index.vue",
"vue/index-tree.vue.tpl": strings.Join([]string{"admin/src/views/", ModuleName, "/index-tree.vue"}, ""), // "admin/src/views/%s/index-tree.vue",
- "uniapp/api.ts.tpl": strings.Join([]string{"uniapp/api/", ModuleName, ".ts"}, ""),
- "uniapp/edit.vue.tpl": strings.Join([]string{"uniapp/pages/", ModuleName, "/edit.vue"}, ""),
- "uniapp/index.vue.tpl": strings.Join([]string{"uniapp/pages/", ModuleName, "/index.vue"}, ""),
- "uniapp/search.vue.tpl": strings.Join([]string{"uniapp/pages/", ModuleName, "/search.vue"}, ""),
- "uniapp/details.vue.tpl": strings.Join([]string{"uniapp/pages/", ModuleName, "/details.vue"}, ""),
+ "uniapp/api.ts.tpl": strings.Join([]string{"x_admin_app/api/", ModuleName, ".ts"}, ""),
+ "uniapp/edit.vue.tpl": strings.Join([]string{"x_admin_app/pages/", ModuleName, "/edit.vue"}, ""),
+ "uniapp/index.vue.tpl": strings.Join([]string{"x_admin_app/pages/", ModuleName, "/index.vue"}, ""),
+ "uniapp/search.vue.tpl": strings.Join([]string{"x_admin_app/pages/", ModuleName, "/search.vue"}, ""),
+ "uniapp/details.vue.tpl": strings.Join([]string{"x_admin_app/pages/", ModuleName, "/details.vue"}, ""),
+ "uniapp/pages.json.tpl": strings.Join([]string{"x_admin_app/pages/", ModuleName, "/pages.json"}, ""),
}
filePath := make(map[string]string)
for tplPath, tplCode := range tplCodeMap {
diff --git a/server/admin/monitor_project/monitor_project_schema.go b/server/admin/monitor_project/monitor_project_schema.go
index 005f227..e0ee8bb 100644
--- a/server/admin/monitor_project/monitor_project_schema.go
+++ b/server/admin/monitor_project/monitor_project_schema.go
@@ -4,9 +4,13 @@ import "x_admin/core"
//MonitorProjectListReq 错误项目列表参数
type MonitorProjectListReq struct {
- ProjectKey string `form:"projectKey"` // 项目uuid
- ProjectName string `form:"projectName"` // 项目名称
- ProjectType string `form:"projectType"` // 项目类型go java web node php 等
+ ProjectKey string `form:"projectKey"` // 项目uuid
+ ProjectName string `form:"projectName"` // 项目名称
+ ProjectType string `form:"projectType"` // 项目类型go java web node php 等
+ CreateTimeStart string `form:"createTimeStart"` // 开始创建时间
+ CreateTimeEnd string `form:"createTimeEnd"` // 结束创建时间
+ UpdateTimeStart string `form:"updateTimeStart"` // 开始更新时间
+ UpdateTimeEnd string `form:"updateTimeEnd"` // 结束更新时间
}
//MonitorProjectDetailReq 错误项目详情参数
diff --git a/server/admin/monitor_project/monitor_project_service.go b/server/admin/monitor_project/monitor_project_service.go
index 11ccccd..2fe4479 100644
--- a/server/admin/monitor_project/monitor_project_service.go
+++ b/server/admin/monitor_project/monitor_project_service.go
@@ -49,6 +49,18 @@ func (service monitorProjectService) List(page request.PageReq, listReq MonitorP
if listReq.ProjectType != "" {
dbModel = dbModel.Where("project_type = ?", listReq.ProjectType)
}
+ if listReq.CreateTimeStart != "" {
+ dbModel = dbModel.Where("create_time >= ?", listReq.CreateTimeStart)
+ }
+ if listReq.CreateTimeEnd != "" {
+ dbModel = dbModel.Where("create_time <= ?", listReq.CreateTimeEnd)
+ }
+ if listReq.UpdateTimeStart != "" {
+ dbModel = dbModel.Where("update_time >= ?", listReq.UpdateTimeStart)
+ }
+ if listReq.UpdateTimeEnd != "" {
+ dbModel = dbModel.Where("update_time <= ?", listReq.UpdateTimeEnd)
+ }
dbModel = dbModel.Where("is_delete = ?", 0)
// 总数
var count int64
diff --git a/x_admin_app/.gitignore b/x_admin_app/.gitignore
new file mode 100644
index 0000000..64bced8
--- /dev/null
+++ b/x_admin_app/.gitignore
@@ -0,0 +1,25 @@
+.DS_Store
+node_modules/
+dist/
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+package-lock.json
+tests/**/coverage/
+pnpm-lock.yaml
+# Editor directories and files
+.idea
+
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+stats.html
+.vscode/*
+!/.vscode/settings.json
+
+release
+dist-electron
+unpackage/*
+!unpackage/res
+HBuilderConfigTemp.json
\ No newline at end of file
diff --git a/x_admin_app/.hbuilderx/launch.json b/x_admin_app/.hbuilderx/launch.json
new file mode 100644
index 0000000..fc87c6d
--- /dev/null
+++ b/x_admin_app/.hbuilderx/launch.json
@@ -0,0 +1,20 @@
+{
+ "version" : "1.0",
+ "configurations" : [
+ {
+ "playground" : "custom",
+ "type" : "uni-app:app-android"
+ },
+ {
+ "app-plus" :
+ {
+ "launchtype" : "local"
+ },
+ "mp-weixin" :
+ {
+ "launchtype" : "local"
+ },
+ "type" : "uniCloud"
+ }
+ ]
+}
diff --git a/x_admin_app/.vscode/settings.json b/x_admin_app/.vscode/settings.json
new file mode 100644
index 0000000..6d1a5b0
--- /dev/null
+++ b/x_admin_app/.vscode/settings.json
@@ -0,0 +1,11 @@
+{
+ "cSpell.words": [
+ "dcloudio",
+ "fota",
+ "IMEI",
+ "loadmore",
+ "nomore",
+ "pinia",
+ "realname"
+ ]
+}
\ No newline at end of file
diff --git a/x_admin_app/App.vue b/x_admin_app/App.vue
new file mode 100644
index 0000000..2c15ce5
--- /dev/null
+++ b/x_admin_app/App.vue
@@ -0,0 +1,62 @@
+
+
+
\ No newline at end of file
diff --git a/x_admin_app/HBuilderConfig.json b/x_admin_app/HBuilderConfig.json
new file mode 100644
index 0000000..e9c91a4
--- /dev/null
+++ b/x_admin_app/HBuilderConfig.json
@@ -0,0 +1,52 @@
+{
+ //项目名字或项目绝对路径
+ "project": "x_admin_app",
+ //打包平台 默认值android 值有"android","ios" 如果要打多个逗号隔开打包平台
+ "platform": "android",
+ //是否使用自定义基座 默认值false true自定义基座 false自定义证书
+ "iscustom": false,
+ //打包方式是否为安心打包默认值false,true安心打包,false传统打包
+ "safemode": true,
+ //android打包参数
+ "android": {
+ //安卓包名
+ "packagename": "uni.UNIFB29F21",
+ //安卓打包类型 默认值0 0 使用自有证书 1 使用公共证书 2 使用老版证书
+ "androidpacktype": "3",
+ //安卓使用自有证书自有打包证书参数
+ //安卓打包证书别名,自有证书打包填写的参数
+ "certalias": "",
+ //安卓打包证书文件路径,自有证书打包填写的参数
+ "certfile": "",
+ //安卓打包证书密码,自有证书打包填写的参数
+ "certpassword": "",
+ //安卓平台要打的渠道包 取值有"google","yyb","360","huawei","xiaomi","oppo","vivo",如果要打多个逗号隔开
+ "channels": ""
+ },
+ //ios打包参数
+ "ios": {
+ //ios appid
+ "bundle": "uni.UNIFB29F21",
+ //ios打包支持的设备类型 默认值iPhone 值有"iPhone","iPad" 如果要打多个逗号隔开打包平台
+ "supporteddevice": "iPhone,iPad",
+ //iOS打包是否打越狱包,只有值为true时打越狱包,false打正式包
+ "isprisonbreak": false,
+
+ //iOS使用自定义证书打包的profile文件路径
+ "profile": "",
+ //iOS使用自定义证书打包的p12文件路径
+ "certfile": "",
+ //iOS使用自定义证书打包的证书密码
+ "certpassword": ""
+ },
+ //是否混淆 true混淆 false关闭
+ "isconfusion": false,
+ //开屏广告 true打开 false关闭
+ "splashads": false,
+ //悬浮红包广告true打开 false关闭
+ "rpads": false,
+ //push广告 true打开 false关闭
+ "pushads": false,
+ //加入换量联盟 true加入 false不加入
+ "exchange": false
+}
\ No newline at end of file
diff --git a/x_admin_app/androidPrivacy.json b/x_admin_app/androidPrivacy.json
new file mode 100644
index 0000000..0d726ca
--- /dev/null
+++ b/x_admin_app/androidPrivacy.json
@@ -0,0 +1,3 @@
+{
+ "prompt" : "template"
+}
diff --git a/x_admin_app/api/monitor_project.ts b/x_admin_app/api/monitor_project.ts
new file mode 100644
index 0000000..c3ce785
--- /dev/null
+++ b/x_admin_app/api/monitor_project.ts
@@ -0,0 +1,57 @@
+import { request } from '@/utils/request'
+
+
+// 监控项目列表
+export function monitor_project_list(params?: Record) {
+ return request({
+ url: '/monitor_project/list',
+ method: 'GET',
+ data: params
+ })
+}
+// 监控项目列表-所有
+export function monitor_project_list_all(params?: Record) {
+ return request({
+ url: '/monitor_project/listAll',
+ method: 'GET',
+ data: params
+ })
+}
+
+// 监控项目详情
+export function monitor_project_detail(id: number | string) {
+ return request({
+ url: '/monitor_project/detail',
+ method: 'GET',
+ data: { id }
+ })
+}
+
+// 监控项目新增
+export function monitor_project_add(data: Record) {
+ return request({
+ url: '/monitor_project/add',
+ method: "POST",
+ data,
+ });
+}
+
+// 监控项目编辑
+export function monitor_project_edit(data: Record) {
+ return request({
+ url: '/monitor_project/edit',
+ method: "POST",
+ data,
+ });
+}
+
+// 监控项目删除
+export function monitor_project_delete(id: number | string) {
+ return request({
+ url: '/monitor_project/del',
+ method: "POST",
+ data:{
+ id
+ },
+ });
+}
\ No newline at end of file
diff --git a/x_admin_app/api/user.js b/x_admin_app/api/user.js
new file mode 100644
index 0000000..569ea13
--- /dev/null
+++ b/x_admin_app/api/user.js
@@ -0,0 +1,29 @@
+import {request} from '@/utils/request';
+
+
+
+export function login(data) {
+ return request({
+ url: '/system/login',
+ method: 'POST',
+ data
+ })
+}
+
+export function getInfo(token) {
+ return request({
+ url: '/system/admin/self',
+ method: 'GET',
+ data: {
+ token
+ }
+ })
+}
+
+export function logout() {
+ return request({
+ url: '/system/logout',
+ method: 'GET'
+ })
+}
+
diff --git a/x_admin_app/components/LoadMore/LoadMore.vue b/x_admin_app/components/LoadMore/LoadMore.vue
new file mode 100644
index 0000000..8486523
--- /dev/null
+++ b/x_admin_app/components/LoadMore/LoadMore.vue
@@ -0,0 +1,39 @@
+
+
+
+
diff --git a/x_admin_app/components/verifition/utils/ase.js b/x_admin_app/components/verifition/utils/ase.js
new file mode 100644
index 0000000..4c1c559
--- /dev/null
+++ b/x_admin_app/components/verifition/utils/ase.js
@@ -0,0 +1,11 @@
+import CryptoJS from 'crypto-js'
+/**
+ * @word 要加密的内容
+ * @keyWord String 服务器随机返回的关键字
+ * */
+export function aesEncrypt(word,keyWord="XwKsGlMcdPMEhR1B"){
+ var key = CryptoJS.enc.Utf8.parse(keyWord);
+ var srcs = CryptoJS.enc.Utf8.parse(word);
+ var encrypted = CryptoJS.AES.encrypt(srcs, key, {mode:CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7});
+ return encrypted.toString();
+}
diff --git a/x_admin_app/components/verifition/utils/request.js b/x_admin_app/components/verifition/utils/request.js
new file mode 100644
index 0000000..9e1a976
--- /dev/null
+++ b/x_admin_app/components/verifition/utils/request.js
@@ -0,0 +1,20 @@
+
+// let baseUrl = "https://captcha.anji-plus.com/captcha-api"
+import env from "@/utils/env";
+let baseUrl =env.baseUrl+'/api/common';
+
+export const myRequest = (option={})=>{
+ return new Promise((reslove,reject)=>{
+ uni.request({
+ url: baseUrl + option.url,
+ data :option.data,
+ method:option.method || "GET",
+ success: (result) => {
+ reslove(result)
+ },
+ fail:(error)=>{
+ reject(error)
+ }
+ })
+ })
+}
diff --git a/x_admin_app/components/verifition/verify.vue b/x_admin_app/components/verifition/verify.vue
new file mode 100644
index 0000000..ceff239
--- /dev/null
+++ b/x_admin_app/components/verifition/verify.vue
@@ -0,0 +1,489 @@
+
+
+
+
+ 请完成安全验证
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/x_admin_app/components/verifition/verifyPoint/verifyPoint.vue b/x_admin_app/components/verifition/verifyPoint/verifyPoint.vue
new file mode 100644
index 0000000..27adfd2
--- /dev/null
+++ b/x_admin_app/components/verifition/verifyPoint/verifyPoint.vue
@@ -0,0 +1,554 @@
+
+
+
+
+
+
+
+
+
+ {{index + 1}}
+
+
+
+
+
+ {{text}}
+
+
+
+
+
+
diff --git a/x_admin_app/components/verifition/verifySlider/verifySlider.vue b/x_admin_app/components/verifition/verifySlider/verifySlider.vue
new file mode 100644
index 0000000..a588642
--- /dev/null
+++ b/x_admin_app/components/verifition/verifySlider/verifySlider.vue
@@ -0,0 +1,671 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{tipWords}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/x_admin_app/components/x-card/x-card.vue b/x_admin_app/components/x-card/x-card.vue
new file mode 100644
index 0000000..5f6deca
--- /dev/null
+++ b/x_admin_app/components/x-card/x-card.vue
@@ -0,0 +1,114 @@
+
+
+
+
+
+
+ {{ title }}
+
+
+
+ {{ content }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/x_admin_app/components/x-date-range/x-date-range.vue b/x_admin_app/components/x-date-range/x-date-range.vue
new file mode 100644
index 0000000..10878e0
--- /dev/null
+++ b/x_admin_app/components/x-date-range/x-date-range.vue
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
diff --git a/x_admin_app/components/x-list/x-list.vue b/x_admin_app/components/x-list/x-list.vue
new file mode 100644
index 0000000..2b91ab4
--- /dev/null
+++ b/x_admin_app/components/x-list/x-list.vue
@@ -0,0 +1,106 @@
+
+
+
+
+
+
+
+
+ {{title}}
+ {{des}}
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/x_admin_app/components/x-picker/x-picker.vue b/x_admin_app/components/x-picker/x-picker.vue
new file mode 100644
index 0000000..426f9aa
--- /dev/null
+++ b/x_admin_app/components/x-picker/x-picker.vue
@@ -0,0 +1,108 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/x_admin_app/hooks/useDictOptions.ts b/x_admin_app/hooks/useDictOptions.ts
new file mode 100644
index 0000000..c5f6d99
--- /dev/null
+++ b/x_admin_app/hooks/useDictOptions.ts
@@ -0,0 +1,55 @@
+import { request } from "@/utils/request";
+import { reactive, toRaw } from "vue";
+
+interface Options {
+ [propName: string]: string
+}
+
+export function useDictOptions(options: Options) {
+ const optionsData: any = reactive({});
+ const optionsKey = Object.keys(options);
+
+ const apiLists = optionsKey.map((key) => {
+ const path = options[key];
+ optionsData[key] = [];
+ return () =>request({
+ url: path,
+ method: "GET",
+ });
+ });
+
+ const refresh = async () => {
+ const res = await Promise.allSettled>(
+ apiLists.map((api) => api())
+ );
+ console.log(res);
+
+ res.forEach((item, index) => {
+ const key = optionsKey[index];
+ if (item.status == "fulfilled") {
+ const data = item.value;
+ optionsData[key] = data.data;
+ }
+ });
+ };
+ refresh();
+ return {
+ optionsData: optionsData as T,
+ refresh,
+ };
+}
+
+export function useDictData(dict: string[]) {
+ const options: Options = {};
+ for (const type of dict) {
+ options[type] = `/setting/dict/data/all?dictType=${type}`
+ }
+ const { optionsData } = useDictOptions(options);
+ console.log('optionsData',optionsData);
+
+ return {
+ dictData: optionsData as T,
+ };
+}
+
+// export function useAllList(options: Options) {}
diff --git a/x_admin_app/hooks/usePaging.ts b/x_admin_app/hooks/usePaging.ts
new file mode 100644
index 0000000..6f6bb06
--- /dev/null
+++ b/x_admin_app/hooks/usePaging.ts
@@ -0,0 +1,106 @@
+import { reactive, toRaw } from "vue";
+import { toast } from "@/utils/utils";
+
+// 分页钩子函数
+interface Options {
+ pageNo?: number;
+ pageSize?: number;
+ loadingText?: string;
+ loadmoreText?: string;
+ nomoreText?: string;
+
+ fetchFun: (_arg: any) => Promise;
+ params?: Record;
+ firstStatus?: string; //loadmore - 加载前,loading - 加载中,nomore - 没有数据
+}
+
+export function usePaging(options: Options) {
+ const {
+ pageNo = 1,
+ pageSize = 30,
+ loadingText = "努力加载中",
+ loadmoreText = "继续加载",
+ nomoreText = "没有数据了",
+ fetchFun,
+ params = {},
+ firstStatus = "loadmore",
+ } = options;
+ // 记录分页初始参数
+ const paramsInit: Record = Object.assign({}, toRaw(params));
+ // 分页数据
+ const pager = reactive({
+ pageNo,
+ pageSize,
+ loadingText,
+ loadmoreText,
+ nomoreText,
+ loading: firstStatus,
+ count: 0,
+ lists: [] as any[],
+ });
+ // 请求分页接口
+ const getLists = () => {
+ pager.loading = "loading";
+ return fetchFun({
+ pageNo: pager.pageNo,
+ pageSize: pager.pageSize,
+ ...params,
+ })
+ .then((res: any) => {
+ uni.stopPullDownRefresh();
+
+ if (res.code == 200) {
+ pager.count = res?.data?.count;
+ var list = res?.data?.lists || [];
+
+ pager.lists.push(...list);
+
+ if (res?.data?.lists?.length < pager.pageSize) {
+ pager.loading = "nomore";
+ } else {
+ pager.loading = "loadmore";
+ }
+ }else{
+ pager.loading = "loadmore";
+ }
+ return Promise.resolve(res);
+ })
+ .catch((err: any) => {
+ uni.stopPullDownRefresh();
+ toast(err.message);
+ pager.loading = "nomore";
+ return Promise.reject(err);
+ });
+ };
+ // 下一页
+ const NextPage = () => {
+ if (pager.loading === "nomore") {
+ toast("没有数据了");
+ return;
+ }
+ pager.pageNo += 1;
+ getLists();
+ };
+
+ // 重置为第一页
+ const resetPage = () => {
+ pager.pageNo = 1;
+ pager.lists = [];
+ getLists();
+ };
+ // 重置参数
+ const resetParams = () => {
+ Object.keys(paramsInit).forEach((item) => {
+ params[item] = paramsInit[item];
+ });
+ pager.lists = [];
+ getLists();
+ };
+ return {
+ pager,
+ getLists,
+ NextPage,
+ resetParams,
+ resetPage,
+ };
+}
diff --git a/x_admin_app/images.d.ts b/x_admin_app/images.d.ts
new file mode 100644
index 0000000..4bc2b76
--- /dev/null
+++ b/x_admin_app/images.d.ts
@@ -0,0 +1,7 @@
+declare module '*.svg'
+declare module '*.png'
+declare module '*.jpg'
+declare module '*.jpeg'
+declare module '*.gif'
+declare module '*.bmp'
+declare module '*.tiff'
\ No newline at end of file
diff --git a/x_admin_app/index.html b/x_admin_app/index.html
new file mode 100644
index 0000000..1af7cef
--- /dev/null
+++ b/x_admin_app/index.html
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/x_admin_app/main.js b/x_admin_app/main.js
new file mode 100644
index 0000000..442bca2
--- /dev/null
+++ b/x_admin_app/main.js
@@ -0,0 +1,19 @@
+import App from "./App";
+import { createSSRApp } from "vue";
+
+import { installMethods } from "@/methods/index";
+import * as Pinia from "pinia";
+
+
+export function createApp() {
+ const app = createSSRApp(App);
+
+ app.use(Pinia.createPinia());
+
+ installMethods(app);
+
+ return {
+ app,
+ Pinia, // 此处必须将 Pinia 返回
+ };
+}
diff --git a/x_admin_app/manifest.json b/x_admin_app/manifest.json
new file mode 100644
index 0000000..c3a901d
--- /dev/null
+++ b/x_admin_app/manifest.json
@@ -0,0 +1,132 @@
+{
+ "name": "x_admin_app",
+ "appid": "__UNI__FB29F21",
+ "description": "",
+ "versionName": "1.0.2",
+ "versionCode": 102,
+ "transformPx": false,
+ "app-plus": {
+ "compatible": {
+ "ignoreVersion": true
+ },
+ "usingComponents": true,
+ "nvueStyleCompiler": "uni-app",
+ "compilerVersion": 3,
+ "splashscreen": {
+ "alwaysShowBeforeRender": true,
+ "waiting": true,
+ "autoclose": true,
+ "delay": 0
+ },
+ "modules": {},
+ "distribute": {
+ "android": {
+ "permissions": [
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ ""
+ ],
+ "minSdkVersion": 26,
+ "schemes": "x_admin",
+ "targetSdkVersion": 30
+ },
+ "ios": {
+ "urltypes": "x_admin",
+ "dSYMs": false
+ },
+ "sdkConfigs": {
+ "ad": {}
+ },
+ "icons": {
+ "android": {
+ "hdpi": "unpackage/res/icons/72x72.png",
+ "xhdpi": "unpackage/res/icons/96x96.png",
+ "xxhdpi": "unpackage/res/icons/144x144.png",
+ "xxxhdpi": "unpackage/res/icons/192x192.png"
+ },
+ "ios": {
+ "appstore": "unpackage/res/icons/1024x1024.png",
+ "ipad": {
+ "app": "unpackage/res/icons/76x76.png",
+ "app@2x": "unpackage/res/icons/152x152.png",
+ "notification": "unpackage/res/icons/20x20.png",
+ "notification@2x": "unpackage/res/icons/40x40.png",
+ "proapp@2x": "unpackage/res/icons/167x167.png",
+ "settings": "unpackage/res/icons/29x29.png",
+ "settings@2x": "unpackage/res/icons/58x58.png",
+ "spotlight": "unpackage/res/icons/40x40.png",
+ "spotlight@2x": "unpackage/res/icons/80x80.png"
+ },
+ "iphone": {
+ "app@2x": "unpackage/res/icons/120x120.png",
+ "app@3x": "unpackage/res/icons/180x180.png",
+ "notification@2x": "unpackage/res/icons/40x40.png",
+ "notification@3x": "unpackage/res/icons/60x60.png",
+ "settings@2x": "unpackage/res/icons/58x58.png",
+ "settings@3x": "unpackage/res/icons/87x87.png",
+ "spotlight@2x": "unpackage/res/icons/80x80.png",
+ "spotlight@3x": "unpackage/res/icons/120x120.png"
+ }
+ }
+ },
+ "splashscreen": {
+ "useOriginalMsgbox": true
+ }
+ },
+ "nvueLaunchMode": "",
+ "nativePlugins": {
+ "usb-serial-for-uniapp": {
+ "__plugin_info__": {
+ "name": "usb-serial-for-uniapp",
+ "description": "uniapp的USB串口通信插件,驱动基于开源项目usb-serial-for-android,无需ROOT,支持OTG USB串口、CP210X、CH34X等",
+ "platforms": "Android",
+ "url": "https://ext.dcloud.net.cn/plugin?id=13935",
+ "android_package_name": "uni.UNIFB29F21",
+ "ios_bundle_id": "",
+ "isCloud": true,
+ "bought": 1,
+ "pid": "13935",
+ "parameters": {}
+ }
+ }
+ }
+ },
+ "quickapp": {},
+ "mp-weixin": {
+ "appid": "",
+ "setting": {
+ "urlCheck": false
+ },
+ "usingComponents": true,
+ "unipush": {
+ "enable": false
+ }
+ },
+ "mp-alipay": {
+ "usingComponents": true
+ },
+ "mp-baidu": {
+ "usingComponents": true
+ },
+ "mp-toutiao": {
+ "usingComponents": true
+ },
+ "uniStatistics": {
+ "enable": false
+ },
+ "vueVersion": "3",
+ "locale": "zh-Hans",
+ "fallbackLocale": "zh-Hans"
+}
\ No newline at end of file
diff --git a/x_admin_app/methods/index.ts b/x_admin_app/methods/index.ts
new file mode 100644
index 0000000..d4b3e4f
--- /dev/null
+++ b/x_admin_app/methods/index.ts
@@ -0,0 +1,27 @@
+import { perms } from "@/utils/perms.js";
+import { toPath } from "@/utils/utils.js";
+import env from "@/utils/env";
+
+/**
+ * @description: 获取文件路径
+ * @param {String} src 文件路径
+ * @return {String} 文件路径
+ */
+export function filePath(src :string) {
+ let path = "";
+ if (src) {
+ if (src.startsWith("http")) {
+ return src;
+ }
+ path = `${env.baseUrl}${src}`;
+ }
+ return path;
+}
+
+
+// 在全局配置对象中添加$perms属性,并将其值设为perms
+export function installMethods(app) {
+ app.config.globalProperties.$perms = perms;
+ app.config.globalProperties.$toPath = toPath;
+ app.config.globalProperties.$filePath = filePath;
+}
diff --git a/x_admin_app/package.json b/x_admin_app/package.json
new file mode 100644
index 0000000..7a63624
--- /dev/null
+++ b/x_admin_app/package.json
@@ -0,0 +1,12 @@
+{
+ "dependencies": {
+ "bignumber.js": "^9.1.2",
+ "crypto-js": "^4.2.0",
+ "dayjs": "^1.11.10",
+ "uuid": "^9.0.1"
+ },
+ "devDependencies": {
+ "@dcloudio/types": "^3.4.8",
+ "@uni-helper/uni-app-types": "^0.5.13"
+ }
+}
diff --git a/x_admin_app/pages.json b/x_admin_app/pages.json
new file mode 100644
index 0000000..d68c1b2
--- /dev/null
+++ b/x_admin_app/pages.json
@@ -0,0 +1,84 @@
+{
+ "pages": [{
+ "path": "pages/index/index",
+ "style": {
+ "navigationBarTitleText": "管理系统"
+ }
+ },
+ {
+ "path": "pages/login/login",
+ "style": {
+ "navigationBarTitleText": "登录"
+ }
+ },
+ {
+ "path": "pages/my/my",
+ "style": {
+ "navigationBarTitleText": "我的"
+ }
+ },
+ {
+ "path": "pages/monitor_project/index",
+ "style": {
+ "navigationBarTitleText": "项目监控",
+ "enablePullDownRefresh": true,
+ "onReachBottomDistance": 100,
+ "navigationStyle": "custom"
+ }
+ },
+
+ {
+ "path": "pages/monitor_project/details",
+ "style": {
+ "navigationBarTitleText": "项目监控详情",
+ "enablePullDownRefresh": true,
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "pages/monitor_project/edit",
+ "style": {
+ "navigationBarTitleText": "编辑项目监控"
+ }
+ },
+ {
+ "path": "pages/monitor_project/search",
+ "style": {
+ "navigationBarTitleText": "搜索项目监控"
+ }
+ }
+
+
+ ],
+ "globalStyle": {
+ "navigationBarTextStyle": "black",
+ "navigationBarTitleText": "x admin",
+ "navigationBarBackgroundColor": "#F8F8F8",
+ "backgroundColor": "#ccc",
+ "pageOrientation": "portrait"
+ },
+
+
+ "tabBar": {
+ "color": "#000000",
+ "selectedColor": "#007aff",
+ "borderStyle": "black",
+ "backgroundColor": "#ffffff",
+ "list": [
+
+ {
+ "pagePath": "pages/index/index",
+ "iconPath": "static/icons/tabs/home.png",
+ "selectedIconPath": "static/icons/tabs/homeActive.png",
+ "text": "首页"
+ },
+
+ {
+ "pagePath": "pages/my/my",
+ "iconPath": "static/icons/tabs/my.png",
+ "selectedIconPath": "static/icons/tabs/myActive.png",
+ "text": "我的"
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/x_admin_app/pages/index/index.vue b/x_admin_app/pages/index/index.vue
new file mode 100644
index 0000000..180a05f
--- /dev/null
+++ b/x_admin_app/pages/index/index.vue
@@ -0,0 +1,121 @@
+
+
+
+
+
+
+
+
+
+ {{ item.title }}
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/x_admin_app/pages/login/login.vue b/x_admin_app/pages/login/login.vue
new file mode 100644
index 0000000..5b3ad87
--- /dev/null
+++ b/x_admin_app/pages/login/login.vue
@@ -0,0 +1,176 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/x_admin_app/pages/monitor_project/details.vue b/x_admin_app/pages/monitor_project/details.vue
new file mode 100644
index 0000000..6b3233a
--- /dev/null
+++ b/x_admin_app/pages/monitor_project/details.vue
@@ -0,0 +1,102 @@
+
+
+
+
+
+
+
+
+
+
+ {{form.projectKey}}
+
+
+ {{form.projectName}}
+
+
+ {{form.projectType}}
+
+
+ {{form.createTime}}
+
+
+ {{form.updateTime}}
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/x_admin_app/pages/monitor_project/edit.vue b/x_admin_app/pages/monitor_project/edit.vue
new file mode 100644
index 0000000..f6e2439
--- /dev/null
+++ b/x_admin_app/pages/monitor_project/edit.vue
@@ -0,0 +1,112 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/x_admin_app/pages/monitor_project/index.vue b/x_admin_app/pages/monitor_project/index.vue
new file mode 100644
index 0000000..ebc2f71
--- /dev/null
+++ b/x_admin_app/pages/monitor_project/index.vue
@@ -0,0 +1,119 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/x_admin_app/pages/monitor_project/search.vue b/x_admin_app/pages/monitor_project/search.vue
new file mode 100644
index 0000000..84bd887
--- /dev/null
+++ b/x_admin_app/pages/monitor_project/search.vue
@@ -0,0 +1,75 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/x_admin_app/pages/my/my.vue b/x_admin_app/pages/my/my.vue
new file mode 100644
index 0000000..abf56ca
--- /dev/null
+++ b/x_admin_app/pages/my/my.vue
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/x_admin_app/static/appicon.png b/x_admin_app/static/appicon.png
new file mode 100644
index 0000000..ed7f1f8
Binary files /dev/null and b/x_admin_app/static/appicon.png differ
diff --git a/x_admin_app/static/default.jpg b/x_admin_app/static/default.jpg
new file mode 100644
index 0000000..aa0237b
Binary files /dev/null and b/x_admin_app/static/default.jpg differ
diff --git a/x_admin_app/static/icons/tabs/home.png b/x_admin_app/static/icons/tabs/home.png
new file mode 100644
index 0000000..2ceb748
Binary files /dev/null and b/x_admin_app/static/icons/tabs/home.png differ
diff --git a/x_admin_app/static/icons/tabs/homeActive.png b/x_admin_app/static/icons/tabs/homeActive.png
new file mode 100644
index 0000000..1f4b171
Binary files /dev/null and b/x_admin_app/static/icons/tabs/homeActive.png differ
diff --git a/x_admin_app/static/icons/tabs/my.png b/x_admin_app/static/icons/tabs/my.png
new file mode 100644
index 0000000..7b3c70a
Binary files /dev/null and b/x_admin_app/static/icons/tabs/my.png differ
diff --git a/x_admin_app/static/icons/tabs/myActive.png b/x_admin_app/static/icons/tabs/myActive.png
new file mode 100644
index 0000000..0962add
Binary files /dev/null and b/x_admin_app/static/icons/tabs/myActive.png differ
diff --git a/x_admin_app/static/index/equipment.png b/x_admin_app/static/index/equipment.png
new file mode 100644
index 0000000..a656391
Binary files /dev/null and b/x_admin_app/static/index/equipment.png differ
diff --git a/x_admin_app/static/index/equipmentLog.png b/x_admin_app/static/index/equipmentLog.png
new file mode 100644
index 0000000..58f177c
Binary files /dev/null and b/x_admin_app/static/index/equipmentLog.png differ
diff --git a/x_admin_app/static/index/group.png b/x_admin_app/static/index/group.png
new file mode 100644
index 0000000..c2429ee
Binary files /dev/null and b/x_admin_app/static/index/group.png differ
diff --git a/x_admin_app/static/index/log.png b/x_admin_app/static/index/log.png
new file mode 100644
index 0000000..5ae2bb1
Binary files /dev/null and b/x_admin_app/static/index/log.png differ
diff --git a/x_admin_app/static/index/product.png b/x_admin_app/static/index/product.png
new file mode 100644
index 0000000..3929a1f
Binary files /dev/null and b/x_admin_app/static/index/product.png differ
diff --git a/x_admin_app/static/index/serial.png b/x_admin_app/static/index/serial.png
new file mode 100644
index 0000000..5bb8aa4
Binary files /dev/null and b/x_admin_app/static/index/serial.png differ
diff --git a/x_admin_app/static/index/sysDown.png b/x_admin_app/static/index/sysDown.png
new file mode 100644
index 0000000..113141e
Binary files /dev/null and b/x_admin_app/static/index/sysDown.png differ
diff --git a/x_admin_app/static/index/sysUp.png b/x_admin_app/static/index/sysUp.png
new file mode 100644
index 0000000..79fe718
Binary files /dev/null and b/x_admin_app/static/index/sysUp.png differ
diff --git a/x_admin_app/static/index/version.png b/x_admin_app/static/index/version.png
new file mode 100644
index 0000000..6540481
Binary files /dev/null and b/x_admin_app/static/index/version.png differ
diff --git a/x_admin_app/stores/user.js b/x_admin_app/stores/user.js
new file mode 100644
index 0000000..d43758b
--- /dev/null
+++ b/x_admin_app/stores/user.js
@@ -0,0 +1,77 @@
+import { defineStore } from "pinia";
+import { logout, getInfo } from "@/api/user";
+
+import { getLocalStorage, removeLocalStorage } from "@/utils/storage.js";
+
+export const useUserStore = defineStore("user", {
+ state: () => {
+ return {
+ nickname: "",
+ username: "",
+ avatar: "",
+ userInfo: {},
+ menu: [],
+ auth: [],
+ };
+ },
+ // 也可以这样定义
+ // state: () => ({ count: 0 })
+ actions: {
+ // get user info
+ getInfo() {
+ return new Promise((resolve, reject) => {
+ let token = getLocalStorage("token");
+ if (!token) {
+ return reject(new Error("需要登录"));
+ }
+ getInfo(token)
+ .then((res) => {
+ if (res.code === 200) {
+ const { data } = res;
+ this.nickname = data.user.nickname;
+ this.username = data.user.username;
+
+ this.avatar = data.user.avatar ||"";
+ // this.menu = data.menu;
+ // this.auth = data.auth;
+ this.userInfo = data.user;
+ resolve(data);
+ } else {
+ reject(new Error(res.message));
+ }
+
+ // addRoutes(result.menu);
+ })
+ .catch((error) => {
+ reject(error);
+ });
+ });
+ },
+
+ // user logout
+ logout() {
+ return new Promise((resolve, reject) => {
+ logout()
+ .then(() => {
+ // resetRouter();
+ this.resetToken();
+ resolve();
+ })
+ .catch((error) => {
+ reject(error);
+ });
+ });
+ },
+
+ // remove token
+ resetToken() {
+ return new Promise((resolve) => {
+ // this.token = "";
+ this.name = "";
+ this.avatar = "";
+ removeLocalStorage("token");
+ resolve();
+ });
+ },
+ },
+});
diff --git a/x_admin_app/tsconfig.json b/x_admin_app/tsconfig.json
new file mode 100644
index 0000000..1767290
--- /dev/null
+++ b/x_admin_app/tsconfig.json
@@ -0,0 +1,29 @@
+{
+ "include": [
+ "global.d.ts",
+ "methods/**/*",
+ "api/**/*.ts",
+ "pages/**/*.vue",
+ "components/**/*.vue",
+ "stores/**/*",
+ "utils/**/*",
+ "typings/**/*.d.ts",
+ "hooks/usePaging.ts"
+ ],
+ "exclude": ["dist", "node_modules", "uni_modules", "unpackage"],
+
+ "compilerOptions": {
+ "target": "esnext",
+ "module": "esnext",
+ "moduleResolution": "Bundler",
+ "allowJs": true,
+ "checkJs": true,
+ "outDir": "./dist",
+ "isolatedModules": true,
+ "baseUrl": ".",
+ "paths": {
+ "@/*": ["./*"]
+ },
+ "types": ["@dcloudio/types", "@uni-helper/uni-app-types"]
+ }
+}
diff --git a/x_admin_app/typings/methods.d.ts b/x_admin_app/typings/methods.d.ts
new file mode 100644
index 0000000..f37910b
--- /dev/null
+++ b/x_admin_app/typings/methods.d.ts
@@ -0,0 +1,7 @@
+declare module 'vue' {
+ interface ComponentCustomProperties {
+ $filePath: (typeof import('@/methods/index'))['filePath']
+ }
+}
+
+export {}
\ No newline at end of file
diff --git a/x_admin_app/typings/uniapp.d.ts b/x_admin_app/typings/uniapp.d.ts
new file mode 100644
index 0000000..cf9a99c
--- /dev/null
+++ b/x_admin_app/typings/uniapp.d.ts
@@ -0,0 +1,32 @@
+///
+///
+///
+///
+
+declare module '@dcloudio/uni-app' {
+export const onShow: (callback: ((options?: App.LaunchShowOption) => void) | (() => void), target?: null) => Function;
+export const onHide: (callback: (() => void) | (() => void), target?: null) => Function;
+export const onLaunch: (callback: (options?: App.LaunchShowOption) => void, target?: null) => Function;
+export const onError: (callback: (error: string) => void, target?: null) => Function;
+export const onPageNotFound: (callback: (options: App.PageNotFoundOption) => void, target?: null) => Function;
+export const onUnhandledRejection: (callback: (options: UniApp.OnUnhandledRejectionCallbackResult) => void, target?: null) => Function;
+export const onThemeChange: (callback: (options: UniApp.OnThemeChangeCallbackResult) => void, target?: null) => Function;
+export const onUniNViewMessage: (callback: (options: AnyObject) => void, target?: null) => Function;
+export const onInit: (callback: (query?: AnyObject) => void, target?: null) => Function;
+export const onLoad: (callback: (query?: AnyObject) => void, target?: null) => Function;
+export const onReady: (callback: () => void, target?: null) => Function;
+export const onUnload: (callback: () => void, target?: null) => Function;
+export const onPullDownRefresh: (callback: () => void, target?: null) => Function;
+export const onReachBottom: (callback: () => void, target?: null) => Function;
+export const onShareAppMessage: (callback: (options: Page.ShareAppMessageOption) => Page.CustomShareContent, target?: null) => Function;
+export const onShareTimeline: (callback: () => Page.ShareTimelineContent, target?: null) => Function;
+export const onAddToFavorites: (callback: (options: Page.AddToFavoritesOption) => Page.CustomFavoritesContent, target?: null) => Function;
+export const onPageScroll: (callback: (options: Page.PageScrollOption) => void, target?: null) => Function;
+export const onResize: (callback: (options: Page.PageScrollOption) => void, target?: null) => Function;
+export const onTabItemTap: (callback: (options: Page.TabItemTapOption) => void, target?: null) => Function;
+export const onNavigationBarButtonTap: (callback: (options: Page.NavigationBarButtonTapOption) => void, target?: null) => Function;
+export const onBackPress: (callback: (options: Page.BackPressOption) => any, target?: null) => Function;
+export const onNavigationBarSearchInputChanged: (callback: (event: Page.NavigationBarSearchInputEvent) => void, target?: null) => Function;
+export const onNavigationBarSearchInputConfirmed: (callback: (event: Page.NavigationBarSearchInputEvent) => void, target?: null) => Function;
+export const onNavigationBarSearchInputClicked: (callback: () => void, target?: null) => Function;
+}
\ No newline at end of file
diff --git a/x_admin_app/uni.promisify.adaptor.js b/x_admin_app/uni.promisify.adaptor.js
new file mode 100644
index 0000000..47fbce1
--- /dev/null
+++ b/x_admin_app/uni.promisify.adaptor.js
@@ -0,0 +1,10 @@
+uni.addInterceptor({
+ returnValue (res) {
+ if (!(!!res && (typeof res === "object" || typeof res === "function") && typeof res.then === "function")) {
+ return res;
+ }
+ return new Promise((resolve, reject) => {
+ res.then((res) => res[0] ? reject(res[0]) : resolve(res[1]));
+ });
+ },
+});
\ No newline at end of file
diff --git a/x_admin_app/uni.scss b/x_admin_app/uni.scss
new file mode 100644
index 0000000..9e42a10
--- /dev/null
+++ b/x_admin_app/uni.scss
@@ -0,0 +1,76 @@
+/**
+ * 这里是uni-app内置的常用样式变量
+ *
+ * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
+ * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
+ *
+ */
+
+/**
+ * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
+ *
+ * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
+ */
+// @import '@/uni_modules/uv-ui-tools/theme.scss';
+/* 颜色变量 */
+
+/* 行为相关颜色 */
+$uni-color-primary: #007aff;
+$uni-color-success: #4cd964;
+$uni-color-warning: #f0ad4e;
+$uni-color-error: #dd524d;
+
+/* 文字基本颜色 */
+$uni-text-color:#333;//基本色
+$uni-text-color-inverse:#fff;//反色
+$uni-text-color-grey:#999;//辅助灰色,如加载更多的提示信息
+$uni-text-color-placeholder: #808080;
+$uni-text-color-disable:#c0c0c0;
+
+/* 背景颜色 */
+$uni-bg-color:#ffffff;
+$uni-bg-color-grey:#f8f8f8;
+$uni-bg-color-hover:#f1f1f1;//点击状态颜色
+$uni-bg-color-mask:rgba(0, 0, 0, 0.4);//遮罩颜色
+
+/* 边框颜色 */
+$uni-border-color:#c8c7cc;
+
+/* 尺寸变量 */
+
+/* 文字尺寸 */
+$uni-font-size-sm:12px;
+$uni-font-size-base:14px;
+$uni-font-size-lg:16px;
+
+/* 图片尺寸 */
+$uni-img-size-sm:20px;
+$uni-img-size-base:26px;
+$uni-img-size-lg:40px;
+
+/* Border Radius */
+$uni-border-radius-sm: 2px;
+$uni-border-radius-base: 3px;
+$uni-border-radius-lg: 6px;
+$uni-border-radius-circle: 50%;
+
+/* 水平间距 */
+$uni-spacing-row-sm: 5px;
+$uni-spacing-row-base: 10px;
+$uni-spacing-row-lg: 15px;
+
+/* 垂直间距 */
+$uni-spacing-col-sm: 4px;
+$uni-spacing-col-base: 8px;
+$uni-spacing-col-lg: 12px;
+
+/* 透明度 */
+$uni-opacity-disabled: 0.3; // 组件禁用态的透明度
+
+/* 文章场景相关 */
+$uni-color-title: #2C405A; // 文章标题颜色
+$uni-font-size-title:20px;
+$uni-color-subtitle: #555555; // 二级标题颜色
+$uni-font-size-subtitle:26px;
+$uni-color-paragraph: #3F536E; // 文章段落颜色
+$uni-font-size-paragraph:15px;
diff --git a/x_admin_app/uni_modules/uv-action-sheet/changelog.md b/x_admin_app/uni_modules/uv-action-sheet/changelog.md
new file mode 100644
index 0000000..ab3545e
--- /dev/null
+++ b/x_admin_app/uni_modules/uv-action-sheet/changelog.md
@@ -0,0 +1,7 @@
+## 1.0.2(2023-07-02)
+uv-action-sheet 由于弹出层uv-popup的修改,打开和关闭方法更改,详情参考文档:https://www.uvui.cn/components/actionSheet.html
+## 1.0.1(2023-05-16)
+1. 优化组件依赖,修改后无需全局引入,组件导入即可使用
+2. 优化部分功能
+## 1.0.0(2023-05-10)
+uv-action-sheet 底部操作菜单
diff --git a/x_admin_app/uni_modules/uv-action-sheet/components/uv-action-sheet/props.js b/x_admin_app/uni_modules/uv-action-sheet/components/uv-action-sheet/props.js
new file mode 100644
index 0000000..8adffee
--- /dev/null
+++ b/x_admin_app/uni_modules/uv-action-sheet/components/uv-action-sheet/props.js
@@ -0,0 +1,50 @@
+export default {
+ props: {
+ // 标题,有值则显示,同时会显示关闭按钮
+ title: {
+ type: String,
+ default: ''
+ },
+ // 选项上方的描述信息
+ description: {
+ type: String,
+ default: ''
+ },
+ // 数据
+ actions: {
+ type: Array,
+ default: () => []
+ },
+ // 取消按钮的文字,不为空时显示按钮
+ cancelText: {
+ type: String,
+ default: ''
+ },
+ // 点击某个菜单项时是否关闭弹窗
+ closeOnClickAction: {
+ type: Boolean,
+ default: true
+ },
+ // 处理底部安全区(默认true)
+ safeAreaInsetBottom: {
+ type: Boolean,
+ default: true
+ },
+ // 小程序的打开方式
+ openType: {
+ type: String,
+ default: ''
+ },
+ // 点击遮罩是否允许关闭 (默认true)
+ closeOnClickOverlay: {
+ type: Boolean,
+ default: true
+ },
+ // 圆角值
+ round: {
+ type: [Boolean, String, Number],
+ default: 0
+ },
+ ...uni.$uv?.props?.actionSheet
+ }
+}
\ No newline at end of file
diff --git a/x_admin_app/uni_modules/uv-action-sheet/components/uv-action-sheet/uv-action-sheet.vue b/x_admin_app/uni_modules/uv-action-sheet/components/uv-action-sheet/uv-action-sheet.vue
new file mode 100644
index 0000000..edca089
--- /dev/null
+++ b/x_admin_app/uni_modules/uv-action-sheet/components/uv-action-sheet/uv-action-sheet.vue
@@ -0,0 +1,280 @@
+
+
+
+
+
+ {{description}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{cancelText}}
+
+
+
+
+
+
+
+
diff --git a/x_admin_app/uni_modules/uv-action-sheet/package.json b/x_admin_app/uni_modules/uv-action-sheet/package.json
new file mode 100644
index 0000000..e7b6173
--- /dev/null
+++ b/x_admin_app/uni_modules/uv-action-sheet/package.json
@@ -0,0 +1,92 @@
+{
+ "id": "uv-action-sheet",
+ "displayName": "uv-action-sheet 底部操作菜单 全面兼容小程序、nvue、vue2、vue3等多端",
+ "version": "1.0.2",
+ "description": "该组件用于从底部弹出一个操作菜单,供用户选择并返回结果。本组件功能类似于uni的uni.showActionSheet API,配置更加灵活,所有平台都表现一致。",
+ "keywords": [
+ "action-sheet",
+ "uvui",
+ "uv-ui",
+ "操作菜单",
+ "菜单选择"
+],
+ "repository": "",
+ "engines": {
+ "HBuilderX": "^3.1.0"
+ },
+ "dcloudext": {
+ "type": "component-vue",
+ "sale": {
+ "regular": {
+ "price": "0.00"
+ },
+ "sourcecode": {
+ "price": "0.00"
+ }
+ },
+ "contact": {
+ "qq": ""
+ },
+ "declaration": {
+ "ads": "无",
+ "data": "插件不采集任何数据",
+ "permissions": "无"
+ },
+ "npmurl": ""
+ },
+ "uni_modules": {
+ "dependencies": [
+ "uv-ui-tools",
+ "uv-popup",
+ "uv-icon",
+ "uv-line",
+ "uv-loading-icon",
+ "uv-gap"
+ ],
+ "encrypt": [],
+ "platforms": {
+ "cloud": {
+ "tcb": "y",
+ "aliyun": "y"
+ },
+ "client": {
+ "Vue": {
+ "vue2": "y",
+ "vue3": "y"
+ },
+ "App": {
+ "app-vue": "y",
+ "app-nvue": "y"
+ },
+ "H5-mobile": {
+ "Safari": "y",
+ "Android Browser": "y",
+ "微信浏览器(Android)": "y",
+ "QQ浏览器(Android)": "y"
+ },
+ "H5-pc": {
+ "Chrome": "y",
+ "IE": "y",
+ "Edge": "y",
+ "Firefox": "y",
+ "Safari": "y"
+ },
+ "小程序": {
+ "微信": "y",
+ "阿里": "y",
+ "百度": "y",
+ "字节跳动": "y",
+ "QQ": "y",
+ "钉钉": "u",
+ "快手": "u",
+ "飞书": "u",
+ "京东": "u"
+ },
+ "快应用": {
+ "华为": "u",
+ "联盟": "u"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/x_admin_app/uni_modules/uv-action-sheet/readme.md b/x_admin_app/uni_modules/uv-action-sheet/readme.md
new file mode 100644
index 0000000..9ea5487
--- /dev/null
+++ b/x_admin_app/uni_modules/uv-action-sheet/readme.md
@@ -0,0 +1,13 @@
+## ActionSheet 操作菜单
+
+> **组件名:uv-action-sheet**
+
+本组件用于从底部弹出一个操作菜单,供用户选择并返回结果。
+
+本组件功能类似于uni的uni.showActionSheet API,配置更加灵活,所有平台都表现一致。
+
+### 查看文档
+
+### [完整示例项目下载 | 关注更多组件](https://ext.dcloud.net.cn/plugin?name=uv-ui)
+
+#### 如使用过程中有任何问题,或者您对uv-ui有一些好的建议,欢迎加入 uv-ui 交流群:uv-ui、官方QQ群
diff --git a/x_admin_app/uni_modules/uv-album/changelog.md b/x_admin_app/uni_modules/uv-album/changelog.md
new file mode 100644
index 0000000..42ab5e2
--- /dev/null
+++ b/x_admin_app/uni_modules/uv-album/changelog.md
@@ -0,0 +1,10 @@
+## 1.0.4(2023-12-06)
+1. 阻止事件冒泡处理
+## 1.0.3(2023-10-23)
+1. 修复报错的BUG
+## 1.0.2(2023-10-23)
+1. 修复设置singleSize、multipleSize、space等值带单位,存在不显示的BUG
+## 1.0.1(2023-09-13)
+1. 添加依赖
+## 1.0.0(2023-08-30)
+1. 新增uv-album相册组件
diff --git a/x_admin_app/uni_modules/uv-album/components/uv-album/uv-album.vue b/x_admin_app/uni_modules/uv-album/components/uv-album/uv-album.vue
new file mode 100644
index 0000000..835d792
--- /dev/null
+++ b/x_admin_app/uni_modules/uv-album/components/uv-album/uv-album.vue
@@ -0,0 +1,312 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/x_admin_app/uni_modules/uv-album/package.json b/x_admin_app/uni_modules/uv-album/package.json
new file mode 100644
index 0000000..700602f
--- /dev/null
+++ b/x_admin_app/uni_modules/uv-album/package.json
@@ -0,0 +1,88 @@
+{
+ "id": "uv-album",
+ "displayName": "uv-album 相册 全面兼容vue3+2、app、h5、小程序等多端",
+ "version": "1.0.4",
+ "description": "本组件提供一个类似相册的功能,让开发者开发起来更加得心应手,功能齐全,灵活配置可以,开箱即用。减少重复的模板代码",
+ "keywords": [
+ "album",
+ "uv-ui",
+ "uvui",
+ "相册",
+ "图片"
+],
+ "repository": "",
+ "engines": {
+ "HBuilderX": "^3.1.0"
+ },
+ "dcloudext": {
+ "type": "component-vue",
+ "sale": {
+ "regular": {
+ "price": "0.00"
+ },
+ "sourcecode": {
+ "price": "0.00"
+ }
+ },
+ "contact": {
+ "qq": ""
+ },
+ "declaration": {
+ "ads": "无",
+ "data": "插件不采集任何数据",
+ "permissions": "无"
+ },
+ "npmurl": ""
+ },
+ "uni_modules": {
+ "dependencies": [
+ "uv-ui-tools",
+ "uv-text"
+ ],
+ "encrypt": [],
+ "platforms": {
+ "cloud": {
+ "tcb": "y",
+ "aliyun": "y"
+ },
+ "client": {
+ "Vue": {
+ "vue2": "y",
+ "vue3": "y"
+ },
+ "App": {
+ "app-vue": "y",
+ "app-nvue": "y"
+ },
+ "H5-mobile": {
+ "Safari": "y",
+ "Android Browser": "y",
+ "微信浏览器(Android)": "y",
+ "QQ浏览器(Android)": "y"
+ },
+ "H5-pc": {
+ "Chrome": "y",
+ "IE": "y",
+ "Edge": "y",
+ "Firefox": "y",
+ "Safari": "y"
+ },
+ "小程序": {
+ "微信": "y",
+ "阿里": "y",
+ "百度": "y",
+ "字节跳动": "y",
+ "QQ": "y",
+ "钉钉": "u",
+ "快手": "u",
+ "飞书": "u",
+ "京东": "u"
+ },
+ "快应用": {
+ "华为": "u",
+ "联盟": "u"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/x_admin_app/uni_modules/uv-album/readme.md b/x_admin_app/uni_modules/uv-album/readme.md
new file mode 100644
index 0000000..edd2f0b
--- /dev/null
+++ b/x_admin_app/uni_modules/uv-album/readme.md
@@ -0,0 +1,21 @@
+# Album 相册
+
+> **组件名:uv-album**
+
+本组件提供一个类似相册的功能,让开发者开发起来更加得心应手。
+
+功能齐全,灵活配置可以,开箱即用。减少重复的模板代码。
+
+# 查看文档
+
+## [下载完整示例项目](https://ext.dcloud.net.cn/plugin?name=uv-ui) (请不要 下载插件ZIP)
+
+### [更多插件,请关注uv-ui组件库](https://ext.dcloud.net.cn/plugin?name=uv-ui)
+
+
+
+
+
+
+
+#### 如使用过程中有任何问题反馈,或者您对uv-ui有一些好的建议,欢迎加入uv-ui官方交流群:官方QQ群
\ No newline at end of file
diff --git a/x_admin_app/uni_modules/uv-alert/changelog.md b/x_admin_app/uni_modules/uv-alert/changelog.md
new file mode 100644
index 0000000..71cca03
--- /dev/null
+++ b/x_admin_app/uni_modules/uv-alert/changelog.md
@@ -0,0 +1,7 @@
+## 1.0.2(2023-06-01)
+1. 修复点击触发两次实践的BUG
+## 1.0.1(2023-05-16)
+1. 优化组件依赖,修改后无需全局引入,组件导入即可使用
+2. 优化部分功能
+## 1.0.0(2023-05-10)
+uv-alert 警告提示组件
diff --git a/x_admin_app/uni_modules/uv-alert/components/uv-alert/props.js b/x_admin_app/uni_modules/uv-alert/components/uv-alert/props.js
new file mode 100644
index 0000000..cc8edc1
--- /dev/null
+++ b/x_admin_app/uni_modules/uv-alert/components/uv-alert/props.js
@@ -0,0 +1,45 @@
+export default {
+ props: {
+ // 显示文字
+ title: {
+ type: String,
+ default: ''
+ },
+ // 主题,success/warning/info/error
+ type: {
+ type: String,
+ default: 'warning'
+ },
+ // 辅助性文字
+ description: {
+ type: String,
+ default: ''
+ },
+ // 是否可关闭
+ closable: {
+ type: Boolean,
+ default: false
+ },
+ // 是否显示图标
+ showIcon: {
+ type: Boolean,
+ default: false
+ },
+ // 浅或深色调,light-浅色,dark-深色
+ effect: {
+ type: String,
+ default: 'light'
+ },
+ // 文字是否居中
+ center: {
+ type: Boolean,
+ default: false
+ },
+ // 字体大小
+ fontSize: {
+ type: [String, Number],
+ default: 14
+ },
+ ...uni.$uv?.props?.alert
+ }
+}
\ No newline at end of file
diff --git a/x_admin_app/uni_modules/uv-alert/components/uv-alert/uv-alert.vue b/x_admin_app/uni_modules/uv-alert/components/uv-alert/uv-alert.vue
new file mode 100644
index 0000000..ba3965e
--- /dev/null
+++ b/x_admin_app/uni_modules/uv-alert/components/uv-alert/uv-alert.vue
@@ -0,0 +1,246 @@
+
+
+
+
+
+
+
+ {{ title }}
+ {{ description }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/x_admin_app/uni_modules/uv-alert/package.json b/x_admin_app/uni_modules/uv-alert/package.json
new file mode 100644
index 0000000..34bec20
--- /dev/null
+++ b/x_admin_app/uni_modules/uv-alert/package.json
@@ -0,0 +1,88 @@
+{
+ "id": "uv-alert",
+ "displayName": "uv-alert 警告提示 全面兼容小程序、nvue、vue2、vue3等多端",
+ "version": "1.0.2",
+ "description": "uv-alert 警告提示,展现需要关注的信息。灵活配置,功能齐全,兼容全端",
+ "keywords": [
+ "alert",
+ "uvui",
+ "uv-ui",
+ "警告提示"
+ ],
+ "repository": "",
+ "engines": {
+ "HBuilderX": "^3.1.0"
+ },
+ "dcloudext": {
+ "type": "component-vue",
+ "sale": {
+ "regular": {
+ "price": "0.00"
+ },
+ "sourcecode": {
+ "price": "0.00"
+ }
+ },
+ "contact": {
+ "qq": ""
+ },
+ "declaration": {
+ "ads": "无",
+ "data": "插件不采集任何数据",
+ "permissions": "无"
+ },
+ "npmurl": ""
+ },
+ "uni_modules": {
+ "dependencies": [
+ "uv-ui-tools",
+ "uv-transition",
+ "uv-icon"
+ ],
+ "encrypt": [],
+ "platforms": {
+ "cloud": {
+ "tcb": "y",
+ "aliyun": "y"
+ },
+ "client": {
+ "Vue": {
+ "vue2": "y",
+ "vue3": "y"
+ },
+ "App": {
+ "app-vue": "y",
+ "app-nvue": "y"
+ },
+ "H5-mobile": {
+ "Safari": "y",
+ "Android Browser": "y",
+ "微信浏览器(Android)": "y",
+ "QQ浏览器(Android)": "y"
+ },
+ "H5-pc": {
+ "Chrome": "y",
+ "IE": "y",
+ "Edge": "y",
+ "Firefox": "y",
+ "Safari": "y"
+ },
+ "小程序": {
+ "微信": "y",
+ "阿里": "y",
+ "百度": "y",
+ "字节跳动": "y",
+ "QQ": "y",
+ "钉钉": "u",
+ "快手": "u",
+ "飞书": "u",
+ "京东": "u"
+ },
+ "快应用": {
+ "华为": "u",
+ "联盟": "u"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/x_admin_app/uni_modules/uv-alert/readme.md b/x_admin_app/uni_modules/uv-alert/readme.md
new file mode 100644
index 0000000..63dda76
--- /dev/null
+++ b/x_admin_app/uni_modules/uv-alert/readme.md
@@ -0,0 +1,15 @@
+## Alert 警告提示
+
+> **组件名:uv-alert**
+
+警告提示,展现需要关注的信息。
+
+当某个页面需要向用户显示警告的信息时。
+
+非浮层的静态展现形式,始终展现,不会自动消失,用户可以点击关闭。
+
+### 查看文档
+
+### [完整示例项目下载 | 关注更多组件](https://ext.dcloud.net.cn/plugin?name=uv-ui)
+
+#### 如使用过程中有任何问题,或者您对uv-ui有一些好的建议,欢迎加入 uv-ui 交流群:uv-ui、官方QQ群
diff --git a/x_admin_app/uni_modules/uv-avatar/changelog.md b/x_admin_app/uni_modules/uv-avatar/changelog.md
new file mode 100644
index 0000000..8631c86
--- /dev/null
+++ b/x_admin_app/uni_modules/uv-avatar/changelog.md
@@ -0,0 +1,13 @@
+## 1.0.5(2023-12-06)
+1. 优化
+## 1.0.4(2023-12-06)
+1. 优化
+## 1.0.3(2023-12-06)
+1. 阻止事件冒泡处理,单个头像模式
+## 1.0.2(2023-12-06)
+1. 阻止事件冒泡处理
+## 1.0.1(2023-05-16)
+1. 优化组件依赖,修改后无需全局引入,组件导入即可使用
+2. 优化部分功能
+## 1.0.0(2023-05-10)
+uv-avatar 头像组件
diff --git a/x_admin_app/uni_modules/uv-avatar/components/uv-avatar-group/props.js b/x_admin_app/uni_modules/uv-avatar/components/uv-avatar-group/props.js
new file mode 100644
index 0000000..a610ab4
--- /dev/null
+++ b/x_admin_app/uni_modules/uv-avatar/components/uv-avatar-group/props.js
@@ -0,0 +1,53 @@
+export default {
+ props: {
+ // 头像图片组
+ urls: {
+ type: Array,
+ default: () => []
+ },
+ // 最多展示的头像数量
+ maxCount: {
+ type: [String, Number],
+ default: 5
+ },
+ // 头像形状
+ shape: {
+ type: String,
+ default: 'circle'
+ },
+ // 图片裁剪模式
+ mode: {
+ type: String,
+ default: 'scaleToFill'
+ },
+ // 超出maxCount时是否显示查看更多的提示
+ showMore: {
+ type: Boolean,
+ default: true
+ },
+ // 头像大小
+ size: {
+ type: [String, Number],
+ default: 40
+ },
+ // 指定从数组的对象元素中读取哪个属性作为图片地址
+ keyName: {
+ type: String,
+ default: ''
+ },
+ // 头像之间的遮挡比例
+ gap: {
+ type: [String, Number],
+ validator(value) {
+ return value >= 0 && value <= 1
+ },
+ default: 0.5
+ },
+ // 需额外显示的值
+ extraValue: {
+ type: [Number, String],
+ default: 0
+ },
+ ...uni.$uv?.props?.avatarGroup
+ }
+}
\ No newline at end of file
diff --git a/x_admin_app/uni_modules/uv-avatar/components/uv-avatar-group/uv-avatar-group.vue b/x_admin_app/uni_modules/uv-avatar/components/uv-avatar-group/uv-avatar-group.vue
new file mode 100644
index 0000000..59481f6
--- /dev/null
+++ b/x_admin_app/uni_modules/uv-avatar/components/uv-avatar-group/uv-avatar-group.vue
@@ -0,0 +1,106 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/x_admin_app/uni_modules/uv-avatar/components/uv-avatar/props.js b/x_admin_app/uni_modules/uv-avatar/components/uv-avatar/props.js
new file mode 100644
index 0000000..6c8d725
--- /dev/null
+++ b/x_admin_app/uni_modules/uv-avatar/components/uv-avatar/props.js
@@ -0,0 +1,80 @@
+import { range } from '@/uni_modules/uv-ui-tools/libs/function/test.js'
+export default {
+ props: {
+ // 头像图片路径(不能为相对路径)
+ src: {
+ type: String,
+ default: ''
+ },
+ // 头像形状,circle-圆形,square-方形
+ shape: {
+ type: String,
+ default: 'circle'
+ },
+ // 头像尺寸
+ size: {
+ type: [String, Number],
+ default: 40
+ },
+ // 裁剪模式
+ mode: {
+ type: String,
+ default: 'scaleToFill'
+ },
+ // 显示的文字
+ text: {
+ type: String,
+ default: ''
+ },
+ // 背景色
+ bgColor: {
+ type: String,
+ default: '#c0c4cc'
+ },
+ // 文字颜色
+ color: {
+ type: String,
+ default: '#fff'
+ },
+ // 文字大小
+ fontSize: {
+ type: [String, Number],
+ default: 18
+ },
+ // 显示的图标
+ icon: {
+ type: String,
+ default: ''
+ },
+ // 显示小程序头像,只对百度,微信,QQ小程序有效
+ mpAvatar: {
+ type: Boolean,
+ default: false
+ },
+ // 是否使用随机背景色
+ randomBgColor: {
+ type: Boolean,
+ default: false
+ },
+ // 加载失败的默认头像(组件有内置默认图片)
+ defaultUrl: {
+ type: String,
+ default: ''
+ },
+ // 如果配置了randomBgColor为true,且配置了此值,则从默认的背景色数组中取出对应索引的颜色值,取值0-19之间
+ colorIndex: {
+ type: [String, Number],
+ // 校验参数规则,索引在0-19之间
+ validator(n) {
+ return range(n, [0, 19]) || n === ''
+ },
+ default: ''
+ },
+ // 组件标识符
+ name: {
+ type: String,
+ default: ''
+ },
+ ...uni.$uv?.props?.avatar
+ }
+}
\ No newline at end of file
diff --git a/x_admin_app/uni_modules/uv-avatar/components/uv-avatar/uv-avatar.vue b/x_admin_app/uni_modules/uv-avatar/components/uv-avatar/uv-avatar.vue
new file mode 100644
index 0000000..0959d6a
--- /dev/null
+++ b/x_admin_app/uni_modules/uv-avatar/components/uv-avatar/uv-avatar.vue
@@ -0,0 +1,175 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/x_admin_app/uni_modules/uv-avatar/package.json b/x_admin_app/uni_modules/uv-avatar/package.json
new file mode 100644
index 0000000..e77ab68
--- /dev/null
+++ b/x_admin_app/uni_modules/uv-avatar/package.json
@@ -0,0 +1,89 @@
+{
+ "id": "uv-avatar",
+ "displayName": "uv-avatar 头像 全面兼容小程序、nvue、vue2、vue3等多端",
+ "version": "1.0.5",
+ "description": "uv-avatar 本组件一般用于展示头像的地方,如个人中心,或者评论列表页的用户头像展示等场所。",
+ "keywords": [
+ "uv-avatar",
+ "uvui",
+ "uv-ui",
+ "avatar",
+ "头像"
+ ],
+ "repository": "",
+ "engines": {
+ "HBuilderX": "^3.1.0"
+ },
+ "dcloudext": {
+ "type": "component-vue",
+ "sale": {
+ "regular": {
+ "price": "0.00"
+ },
+ "sourcecode": {
+ "price": "0.00"
+ }
+ },
+ "contact": {
+ "qq": ""
+ },
+ "declaration": {
+ "ads": "无",
+ "data": "插件不采集任何数据",
+ "permissions": "无"
+ },
+ "npmurl": ""
+ },
+ "uni_modules": {
+ "dependencies": [
+ "uv-ui-tools",
+ "uv-icon",
+ "uv-text"
+ ],
+ "encrypt": [],
+ "platforms": {
+ "cloud": {
+ "tcb": "y",
+ "aliyun": "y"
+ },
+ "client": {
+ "Vue": {
+ "vue2": "y",
+ "vue3": "y"
+ },
+ "App": {
+ "app-vue": "y",
+ "app-nvue": "y"
+ },
+ "H5-mobile": {
+ "Safari": "y",
+ "Android Browser": "y",
+ "微信浏览器(Android)": "y",
+ "QQ浏览器(Android)": "y"
+ },
+ "H5-pc": {
+ "Chrome": "y",
+ "IE": "y",
+ "Edge": "y",
+ "Firefox": "y",
+ "Safari": "y"
+ },
+ "小程序": {
+ "微信": "y",
+ "阿里": "y",
+ "百度": "y",
+ "字节跳动": "y",
+ "QQ": "y",
+ "钉钉": "u",
+ "快手": "u",
+ "飞书": "u",
+ "京东": "u"
+ },
+ "快应用": {
+ "华为": "u",
+ "联盟": "u"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/x_admin_app/uni_modules/uv-avatar/readme.md b/x_admin_app/uni_modules/uv-avatar/readme.md
new file mode 100644
index 0000000..1f068eb
--- /dev/null
+++ b/x_admin_app/uni_modules/uv-avatar/readme.md
@@ -0,0 +1,11 @@
+## Avatar 头像
+
+> **组件名:uv-avatar**
+
+本组件一般用于展示头像的地方,如个人中心,或者评论列表页的用户头像展示等场所。
+
+### 查看文档
+
+### [完整示例项目下载 | 关注更多组件](https://ext.dcloud.net.cn/plugin?name=uv-ui)
+
+#### 如使用过程中有任何问题,或者您对uv-ui有一些好的建议,欢迎加入 uv-ui 交流群:uv-ui、官方QQ群
diff --git a/x_admin_app/uni_modules/uv-back-top/changelog.md b/x_admin_app/uni_modules/uv-back-top/changelog.md
new file mode 100644
index 0000000..9772262
--- /dev/null
+++ b/x_admin_app/uni_modules/uv-back-top/changelog.md
@@ -0,0 +1,8 @@
+## 1.0.2(2023-07-03)
+1. 优化插槽自定义内容部分
+2. 增加backToTop方法说明
+## 1.0.1(2023-05-16)
+1. 优化组件依赖,修改后无需全局引入,组件导入即可使用
+2. 优化部分功能
+## 1.0.0(2023-05-10)
+uv-back-top 返回顶部
diff --git a/x_admin_app/uni_modules/uv-back-top/components/uv-back-top/props.js b/x_admin_app/uni_modules/uv-back-top/components/uv-back-top/props.js
new file mode 100644
index 0000000..74daff4
--- /dev/null
+++ b/x_admin_app/uni_modules/uv-back-top/components/uv-back-top/props.js
@@ -0,0 +1,58 @@
+export default {
+ props: {
+ // 返回顶部的形状,circle-圆形,square-方形
+ mode: {
+ type: String,
+ default: 'circle'
+ },
+ // 自定义图标
+ icon: {
+ type: String,
+ default: 'arrow-upward'
+ },
+ // 提示文字
+ text: {
+ type: String,
+ default: ''
+ },
+ // 返回顶部滚动时间
+ duration: {
+ type: [String, Number],
+ default: 100
+ },
+ // 滚动距离
+ scrollTop: {
+ type: [String, Number],
+ default: 0
+ },
+ // 距离顶部多少距离显示,单位px
+ top: {
+ type: [String, Number],
+ default: 400
+ },
+ // 返回顶部按钮到底部的距离,单位px
+ bottom: {
+ type: [String, Number],
+ default: 100
+ },
+ // 返回顶部按钮到右边的距离,单位px
+ right: {
+ type: [String, Number],
+ default: 20
+ },
+ // 层级
+ zIndex: {
+ type: [String, Number],
+ default: 9
+ },
+ // 图标的样式,对象形式
+ iconStyle: {
+ type: Object,
+ default: () => ({
+ color: '#909399',
+ fontSize: '19px'
+ })
+ },
+ ...uni.$uv?.props?.backtop
+ }
+}
\ No newline at end of file
diff --git a/x_admin_app/uni_modules/uv-back-top/components/uv-back-top/uv-back-top.vue b/x_admin_app/uni_modules/uv-back-top/components/uv-back-top/uv-back-top.vue
new file mode 100644
index 0000000..fad73d4
--- /dev/null
+++ b/x_admin_app/uni_modules/uv-back-top/components/uv-back-top/uv-back-top.vue
@@ -0,0 +1,116 @@
+
+
+
+
+
+ {{text}}
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/x_admin_app/uni_modules/uv-back-top/package.json b/x_admin_app/uni_modules/uv-back-top/package.json
new file mode 100644
index 0000000..a2035a5
--- /dev/null
+++ b/x_admin_app/uni_modules/uv-back-top/package.json
@@ -0,0 +1,89 @@
+{
+ "id": "uv-back-top",
+ "displayName": "uv-back-top 返回顶部 全面兼容小程序、nvue、vue2、vue3等多端",
+ "version": "1.0.2",
+ "description": "返回顶部 组件一个用于长页面,滑动一定距离后,出现返回顶部按钮,方便快速返回顶部的场景。",
+ "keywords": [
+ "uv-back-top",
+ "uvui",
+ "uv-ui",
+ "avatar",
+ "返回顶部"
+ ],
+ "repository": "",
+ "engines": {
+ "HBuilderX": "^3.1.0"
+ },
+ "dcloudext": {
+ "type": "component-vue",
+ "sale": {
+ "regular": {
+ "price": "0.00"
+ },
+ "sourcecode": {
+ "price": "0.00"
+ }
+ },
+ "contact": {
+ "qq": ""
+ },
+ "declaration": {
+ "ads": "无",
+ "data": "插件不采集任何数据",
+ "permissions": "无"
+ },
+ "npmurl": ""
+ },
+ "uni_modules": {
+ "dependencies": [
+ "uv-ui-tools",
+ "uv-icon",
+ "uv-transition"
+ ],
+ "encrypt": [],
+ "platforms": {
+ "cloud": {
+ "tcb": "y",
+ "aliyun": "y"
+ },
+ "client": {
+ "Vue": {
+ "vue2": "y",
+ "vue3": "y"
+ },
+ "App": {
+ "app-vue": "y",
+ "app-nvue": "y"
+ },
+ "H5-mobile": {
+ "Safari": "y",
+ "Android Browser": "y",
+ "微信浏览器(Android)": "y",
+ "QQ浏览器(Android)": "y"
+ },
+ "H5-pc": {
+ "Chrome": "y",
+ "IE": "y",
+ "Edge": "y",
+ "Firefox": "y",
+ "Safari": "y"
+ },
+ "小程序": {
+ "微信": "y",
+ "阿里": "y",
+ "百度": "y",
+ "字节跳动": "y",
+ "QQ": "y",
+ "钉钉": "u",
+ "快手": "u",
+ "飞书": "u",
+ "京东": "u"
+ },
+ "快应用": {
+ "华为": "u",
+ "联盟": "u"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/x_admin_app/uni_modules/uv-back-top/readme.md b/x_admin_app/uni_modules/uv-back-top/readme.md
new file mode 100644
index 0000000..d6a2aec
--- /dev/null
+++ b/x_admin_app/uni_modules/uv-back-top/readme.md
@@ -0,0 +1,11 @@
+## BackTop 返回顶部
+
+> **组件名:uv-back-top**
+
+该组件一个用于长页面,滑动一定距离后,出现返回顶部按钮,方便快速返回顶部的场景。
+
+### 查看文档
+
+### [完整示例项目下载 | 关注更多组件](https://ext.dcloud.net.cn/plugin?name=uv-ui)
+
+#### 如使用过程中有任何问题,或者您对uv-ui有一些好的建议,欢迎加入 uv-ui 交流群:uv-ui、官方QQ群
diff --git a/x_admin_app/uni_modules/uv-badge/changelog.md b/x_admin_app/uni_modules/uv-badge/changelog.md
new file mode 100644
index 0000000..b0ba104
--- /dev/null
+++ b/x_admin_app/uni_modules/uv-badge/changelog.md
@@ -0,0 +1,7 @@
+## 1.0.2(2023-06-04)
+1. 修复type等属性为null的时候不显示徽标的BUG
+## 1.0.1(2023-05-16)
+1. 优化组件依赖,修改后无需全局引入,组件导入即可使用
+2. 优化部分功能
+## 1.0.0(2023-05-10)
+uv-badge 徽标数,数字角标
diff --git a/x_admin_app/uni_modules/uv-badge/components/uv-badge/props.js b/x_admin_app/uni_modules/uv-badge/components/uv-badge/props.js
new file mode 100644
index 0000000..c6369c3
--- /dev/null
+++ b/x_admin_app/uni_modules/uv-badge/components/uv-badge/props.js
@@ -0,0 +1,73 @@
+export default {
+ props: {
+ // 是否显示圆点
+ isDot: {
+ type: Boolean,
+ default: false
+ },
+ // 显示的内容
+ value: {
+ type: [Number, String],
+ default: ''
+ },
+ // 是否显示
+ show: {
+ type: Boolean,
+ default: true
+ },
+ // 最大值,超过最大值会显示 '{max}+'
+ max: {
+ type: [Number, String],
+ default: 999
+ },
+ // 主题类型,error|warning|success|primary
+ type: {
+ type: [String,undefined,null],
+ default: 'error'
+ },
+ // 当数值为 0 时,是否展示 Badge
+ showZero: {
+ type: Boolean,
+ default: false
+ },
+ // 背景颜色,优先级比type高,如设置,type参数会失效
+ bgColor: {
+ type: [String, null],
+ default: null
+ },
+ // 字体颜色
+ color: {
+ type: [String, null],
+ default: null
+ },
+ // 徽标形状,circle-四角均为圆角,horn-左下角为直角
+ shape: {
+ type: [String,undefined,null],
+ default: 'circle'
+ },
+ // 设置数字的显示方式,overflow|ellipsis|limit
+ // overflow会根据max字段判断,超出显示`${max}+`
+ // ellipsis会根据max判断,超出显示`${max}...`
+ // limit会依据1000作为判断条件,超出1000,显示`${value/1000}K`,比如2.2k、3.34w,最多保留2位小数
+ numberType: {
+ type: [String,undefined,null],
+ default: 'overflow'
+ },
+ // 设置badge的位置偏移,格式为 [x, y],也即设置的为top和right的值,absolute为true时有效
+ offset: {
+ type: Array,
+ default: () => []
+ },
+ // 是否反转背景和字体颜色
+ inverted: {
+ type: Boolean,
+ default: false
+ },
+ // 是否绝对定位
+ absolute: {
+ type: Boolean,
+ default: false
+ },
+ ...uni.$uv?.props?.badge
+ }
+}
\ No newline at end of file
diff --git a/x_admin_app/uni_modules/uv-badge/components/uv-badge/uv-badge.vue b/x_admin_app/uni_modules/uv-badge/components/uv-badge/uv-badge.vue
new file mode 100644
index 0000000..f7d3911
--- /dev/null
+++ b/x_admin_app/uni_modules/uv-badge/components/uv-badge/uv-badge.vue
@@ -0,0 +1,176 @@
+
+ {{ isDot ? '' :showValue }}
+
+
+
+
+
diff --git a/x_admin_app/uni_modules/uv-badge/package.json b/x_admin_app/uni_modules/uv-badge/package.json
new file mode 100644
index 0000000..5a81386
--- /dev/null
+++ b/x_admin_app/uni_modules/uv-badge/package.json
@@ -0,0 +1,87 @@
+{
+ "id": "uv-badge",
+ "displayName": "uv-badge 徽标数,数字角标 全面兼容小程序、nvue、vue2、vue3等多端",
+ "version": "1.0.2",
+ "description": "徽标数一般用于图标右上角显示未读的消息数量,提示用户点击,有圆点和圆包含文字两种形式。",
+ "keywords": [
+ "uv-badge",
+ "uvui",
+ "uv-ui",
+ "徽标数",
+ "数字角标"
+ ],
+ "repository": "",
+ "engines": {
+ "HBuilderX": "^3.1.0"
+ },
+ "dcloudext": {
+ "type": "component-vue",
+ "sale": {
+ "regular": {
+ "price": "0.00"
+ },
+ "sourcecode": {
+ "price": "0.00"
+ }
+ },
+ "contact": {
+ "qq": ""
+ },
+ "declaration": {
+ "ads": "无",
+ "data": "插件不采集任何数据",
+ "permissions": "无"
+ },
+ "npmurl": ""
+ },
+ "uni_modules": {
+ "dependencies": [
+ "uv-ui-tools"
+ ],
+ "encrypt": [],
+ "platforms": {
+ "cloud": {
+ "tcb": "y",
+ "aliyun": "y"
+ },
+ "client": {
+ "Vue": {
+ "vue2": "y",
+ "vue3": "y"
+ },
+ "App": {
+ "app-vue": "y",
+ "app-nvue": "y"
+ },
+ "H5-mobile": {
+ "Safari": "y",
+ "Android Browser": "y",
+ "微信浏览器(Android)": "y",
+ "QQ浏览器(Android)": "y"
+ },
+ "H5-pc": {
+ "Chrome": "y",
+ "IE": "y",
+ "Edge": "y",
+ "Firefox": "y",
+ "Safari": "y"
+ },
+ "小程序": {
+ "微信": "y",
+ "阿里": "y",
+ "百度": "y",
+ "字节跳动": "y",
+ "QQ": "y",
+ "钉钉": "u",
+ "快手": "u",
+ "飞书": "u",
+ "京东": "u"
+ },
+ "快应用": {
+ "华为": "u",
+ "联盟": "u"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/x_admin_app/uni_modules/uv-badge/readme.md b/x_admin_app/uni_modules/uv-badge/readme.md
new file mode 100644
index 0000000..cf597eb
--- /dev/null
+++ b/x_admin_app/uni_modules/uv-badge/readme.md
@@ -0,0 +1,11 @@
+## Badge 徽标数
+
+> **组件名:uv-badge**
+
+该组件一般用于图标右上角显示未读的消息数量,提示用户点击,有圆点和圆包含文字两种形式。
+
+### 查看文档
+
+### [完整示例项目下载 | 关注更多组件](https://ext.dcloud.net.cn/plugin?name=uv-ui)
+
+#### 如使用过程中有任何问题,或者您对uv-ui有一些好的建议,欢迎加入 uv-ui 交流群:uv-ui、官方QQ群
diff --git a/x_admin_app/uni_modules/uv-button/changelog.md b/x_admin_app/uni_modules/uv-button/changelog.md
new file mode 100644
index 0000000..11e954e
--- /dev/null
+++ b/x_admin_app/uni_modules/uv-button/changelog.md
@@ -0,0 +1,33 @@
+## 1.0.15(2023-12-20)
+1. 优化
+## 1.0.14(2023-12-06)
+1. 优化
+## 1.0.13(2023-12-06)
+1. 阻止事件冒泡处理
+## 1.0.12(2023-10-19)
+1. 增加后置插槽
+## 1.0.11(2023-09-21)
+1. 修复通过customStyle修改按钮宽度,组件中最外层节点不改变的问题
+## 1.0.10(2023-09-15)
+1. 按钮支持open-type="agreePrivacyAuthorization"
+## 1.0.9(2023-09-11)
+1. 增加参数iconSize,用于控制图标的大小
+## 1.0.8(2023-09-10)
+1. 修复多个按钮在一行宽度不正常的BUG
+## 1.0.7(2023-09-07)
+1. 修复warning颜色对应错误的BUG
+## 1.0.6(2023-07-25)
+1. 增加customTextStyle属性,方便自定义文字样式
+## 1.0.5(2023-07-20)
+1. 解决微信小程序动态设置hover-class点击态不消失的BUG
+## 1.0.4(2023-06-29)
+1. 修改上次更新出现nvue报错异常
+## 1.0.3(2023-06-28)
+ 修复:设置open-type="chooseAvatar"等值不生效的BUG
+## 1.0.2(2023-06-01)
+1. 修复按钮点击触发两次的BUG
+## 1.0.1(2023-05-16)
+1. 优化组件依赖,修改后无需全局引入,组件导入即可使用
+2. 优化部分功能
+## 1.0.0(2023-05-10)
+uv-button 按钮
diff --git a/x_admin_app/uni_modules/uv-button/components/uv-button/nvue.scss b/x_admin_app/uni_modules/uv-button/components/uv-button/nvue.scss
new file mode 100644
index 0000000..be6c16e
--- /dev/null
+++ b/x_admin_app/uni_modules/uv-button/components/uv-button/nvue.scss
@@ -0,0 +1,46 @@
+$uv-button-active-opacity:0.75 !default;
+$uv-button-loading-text-margin-left:4px !default;
+$uv-button-text-color: #FFFFFF !default;
+$uv-button-text-plain-error-color:$uv-error !default;
+$uv-button-text-plain-warning-color:$uv-warning !default;
+$uv-button-text-plain-success-color:$uv-success !default;
+$uv-button-text-plain-info-color:$uv-info !default;
+$uv-button-text-plain-primary-color:$uv-primary !default;
+.uv-button {
+ &--active {
+ opacity: $uv-button-active-opacity;
+ }
+
+ &--active--plain {
+ background-color: rgb(217, 217, 217);
+ }
+
+ &__loading-text {
+ margin-left:$uv-button-loading-text-margin-left;
+ }
+
+ &__text,
+ &__loading-text {
+ color:$uv-button-text-color;
+ }
+
+ &__text--plain--error {
+ color:$uv-button-text-plain-error-color;
+ }
+
+ &__text--plain--warning {
+ color:$uv-button-text-plain-warning-color;
+ }
+
+ &__text--plain--success{
+ color:$uv-button-text-plain-success-color;
+ }
+
+ &__text--plain--info {
+ color:$uv-button-text-plain-info-color;
+ }
+
+ &__text--plain--primary {
+ color:$uv-button-text-plain-primary-color;
+ }
+}
\ No newline at end of file
diff --git a/x_admin_app/uni_modules/uv-button/components/uv-button/props.js b/x_admin_app/uni_modules/uv-button/components/uv-button/props.js
new file mode 100644
index 0000000..6275ad5
--- /dev/null
+++ b/x_admin_app/uni_modules/uv-button/components/uv-button/props.js
@@ -0,0 +1,163 @@
+export default {
+ props: {
+ // 是否细边框
+ hairline: {
+ type: Boolean,
+ default: true
+ },
+ // 按钮的预置样式,info,primary,error,warning,success
+ type: {
+ type: String,
+ default: 'info'
+ },
+ // 按钮尺寸,large,normal,small,mini
+ size: {
+ type: String,
+ default: 'normal'
+ },
+ // 按钮形状,circle(两边为半圆),square(带圆角)
+ shape: {
+ type: String,
+ default: 'square'
+ },
+ // 按钮是否镂空
+ plain: {
+ type: Boolean,
+ default: false
+ },
+ // 是否禁止状态
+ disabled: {
+ type: Boolean,
+ default: false
+ },
+ // 是否加载中
+ loading: {
+ type: Boolean,
+ default: false
+ },
+ // 加载中提示文字
+ loadingText: {
+ type: [String, Number],
+ default: ''
+ },
+ // 加载状态图标类型
+ loadingMode: {
+ type: String,
+ default: 'spinner'
+ },
+ // 加载图标大小
+ loadingSize: {
+ type: [String, Number],
+ default: 14
+ },
+ // 开放能力,具体请看uniapp稳定关于button组件部分说明
+ // https://uniapp.dcloud.io/component/button
+ openType: {
+ type: String,
+ default: ''
+ },
+ // 用于